windmill-labs/windmill · warning
Skipping ${label}: ${err instanceof Error ? err.message : er
Error message
Skipping ${label}: ${err instanceof Error ? err.message : err} What it means
Warning from the `wmill generate-metadata rehash` command. rehashOnly processes script/folder tasks through a small concurrency pool; when the per-task work (generateAppLocksInternal or the script rehash path) throws for a single task, it logs `Skipping <scriptPath|folder>: <message>` and moves on, so one bad item doesn't abort the whole rehash run. Counts are only incremented for tasks that succeed.
Source
Thrown at cli/src/commands/generate-metadata/generate-metadata.ts:391
while (pool.size < parallelism && queue.length > 0) {
const task = queue.shift()!;
const p = (async () => {
try {
if (task.kind === "script") {
await generateScriptMetadataInternal(
task.scriptPath, stubWorkspace, rehashOpts, false, true, {}, codebases, false,
);
counts.scripts++;
} else if (task.kind === "flow") {
await generateFlowLockInternal(task.folder, false, stubWorkspace, rehashOpts, false, true);
counts.flows++;
} else {
await generateAppLocksInternal(task.folder, task.rawApp, false, stubWorkspace, rehashOpts, false, true);
counts.apps++;
}
} catch (err) {
const label = task.kind === "script" ? task.scriptPath : task.folder;
log.warn(`Skipping ${label}: ${err instanceof Error ? err.message : err}`);
}
})();
pool.add(p);
p.then(() => pool.delete(p));
}
if (pool.size > 0) {
await Promise.race(pool);
}
}
} finally {
await flushLockfileBatch();
}
if (counts.scripts + counts.flows + counts.apps > 0 || !rehashFilter?.missingOnly) {
log.info(
`Rehashed ${colors.bold(String(counts.scripts))} script(s), ` +
`${colors.bold(String(counts.flows))} flow(s), ` +
`${colors.bold(String(counts.apps))} app(s) from disk.`,View on GitHub (pinned to e474e8803c)
Solutions
- Read the per-task message in the warning; it names the skipped script path or folder — inspect that item's files directly.
- Fix or regenerate the offending item: for scripts run `wmill script generate-metadata`/rehash on it individually; for apps validate the raw app definition files (JSON/YAML parse, required fields).
- Restore the missing/corrupted files (git checkout/restore) or delete stale metadata files and regenerate them.
- Re-run `wmill generate-metadata rehash` after fixing; verify the summary counts now include the previously skipped items.
Example fix
// before: item skipped during rehash Skipping u/admin/broken_app: SyntaxError: Unexpected token in JSON // after: repair the item, then rehash just it wmill generate-metadata rehash --folder u/admin/broken_app # after fixing the bad JSON in raw app files
Defensive patterns
Strategy: validation
Validate before calling
// pre-validate each app folder before batch rehash
for (const f of folders) {
const cfg = path.join(f, 'raw_app.yaml'); // or the app's config file
if (!existsSync(cfg)) console.warn(`Pre-check: ${f} missing app config; rehash will skip it`);
} Type guard
function isFatalRehashError(err: unknown): boolean {
const msg = err instanceof Error ? err.message : String(err);
return /EACCES|ENOENT|SyntaxError|YAMLException/i.test(msg);
} Try / catch
try {
await generateMetadataForTask(task);
} catch (err) {
const msg = err instanceof Error ? err.message : String(err);
log.warn(`Skipping ${task.folder}: ${msg}`);
failures.push(task.folder); // collect and re-run failed items after fixing
} Prevention
- Run in a complete checkout (not shallow/partial) so all app/script files exist before rehashing.
- Commit generated metadata and avoid hand-editing lock/JSON files that rehash parses.
- Rehash individual failing items first (`wmill generate-metadata` scoped to one folder) to fix them in isolation.
- Review 'Skipping ...' warnings after each run and treat any remaining skips as release blockers.
When it happens
Trigger: Running `wmill generate-metadata rehash` over a set of scripts/folders when one task's rehash or lock regeneration throws: invalid or missing raw app/script file contents, schema/lock file parse errors, permission errors reading the folder, or an API/workspace error during lock generation (stubWorkspace calls).
Common situations: Repo containing a hand-edited or corrupt app with invalid JSON/config that can't be rehashed; a folder whose raw_app.yaml/app files were partially deleted; version drift where lockfile format changed and old metadata can't be parsed; running in CI on a shallow/partial checkout missing files the task expects.
Related errors
- Invalid language: ${language}
- Runnable ${runnableId} content is still an !inline reference
- This command is deprecated. Use "wmill generate-metadata" in
- Warning: ${normalizedPath} depends on something inside "${fo
- No metadata generated yet for ${filePath}. Run 'wmill genera
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/0c9bea67caf83901.
Report an issue: GitHub.