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

  1. Read the per-task message in the warning; it names the skipped script path or folder — inspect that item's files directly.
  2. 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).
  3. Restore the missing/corrupted files (git checkout/restore) or delete stale metadata files and regenerate them.
  4. 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

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


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/0c9bea67caf83901. Report an issue: GitHub.