windmill-labs/windmill · error · Error

${flag} '${tok}' matched no script in f/${f}.

Error message

${flag} '${tok}' matched no script in f/${f}.

What it means

No-match guard in resolveScriptTokenOrThrow: the token given to --upload or --arg resolved to no script node in the workspace graph under folder f (checked both as full id and as basename match). The input at fault is the script token as typed — wrong name, wrong folder, or a script that isn't part of the pipeline graph the command loaded.

Source

Thrown at cli/src/commands/pipeline/pipeline.ts:642

    // endpoint can't emit, so input-only entrypoints are cut here as they are
    // under `--local` (else they'd auto-run empty).
    await enrichDeployedNonAutorunTriggers(workspace.workspaceId, graph);
  }

  // Resolve a `--upload`/`--arg` script token to its graph node, with an
  // actionable error when the short name is ambiguous or matches nothing.
  const resolveScriptTokenOrThrow = (tok: string, flag: string): string => {
    const id = resolveToken(graph, tok);
    if (!id || !id.startsWith("script:")) {
      const matches = graph.runnables.filter(
        (r) => r.usage_kind === "script" && (r.path.split("/").pop() ?? r.path) === tok,
      );
      if (matches.length > 1) {
        throw new Error(
          `${flag} '${tok}' matches multiple scripts (${matches.map((r) => r.path).sort().join(", ")}) — use the full path.`,
        );
      }
      throw new Error(`${flag} '${tok}' matched no script in f/${f}.`);
    }
    return id;
  };

  // `--upload <script>[:<param>]=<file|s3://key>` binds an object to a
  // data_upload/webhook entry point so it becomes a runnable start (and its
  // downstream is no longer cut) — the arg is injected at execution. Repeatable
  // per script (accumulated) so a multi-S3Object entry can bind each param.
  const boundBindingsByPath = new Map<string, UploadBinding[]>();
  const boundNodeIds = new Set<string>();
  for (const spec of opts.upload ?? []) {
    const binding = parseUploadBinding(spec);
    const id = resolveScriptTokenOrThrow(binding.scriptTok, "--upload");
    const p = scriptPathOf(id);
    (boundBindingsByPath.get(p) ?? boundBindingsByPath.set(p, []).get(p)!).push(binding);
    boundNodeIds.add(id);
  }

View on GitHub (pinned to e474e8803c)

Solutions

  1. Check the script's path with wmill flow ls / in the UI and pass the full path
  2. Verify you're targeting the right folder (the graph is scoped to f/{f})
  3. If the script should participate, ensure it's part of the pipeline (e.g. marked // pipeline) so it appears in the graph
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cli/src/commands/pipeline/pipeline.ts:642 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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