Claude Workflow Mirror
bunx smithers-orchestrator graph can emit a Claude Code dynamic workflow script that mirrors an existing detached Smithers run into Claude Code’s /workflows progress tree.

smithers CLI and creates watcher agents for the nodes it sees.
Generate the script
--out to choose a path:
Mirror model
Claude Code workflow scripts run in a sandbox. They cannot import Node modules, read files, open sockets, or push rows from an external process. The only way to populate Claude Code’s/workflows tree is to call phase() and agent() from inside the running Claude Code session.
For that reason, Smithers generates a script that observes Smithers through the CLI:
- Discovery agents run
bunx smithers-orchestrator inspect RUN_ID --format json. - Frame wait agents run
bunx smithers-orchestrator events RUN_ID --type frame --json --watch. - Node watcher agents run
bunx smithers-orchestrator node NODE_ID --run-id RUN_ID --format json.
Dynamic nodes and phases
Smithers workflows can change shape across frames. A loop or data-dependent fan-out can add node ids after earlier nodes complete. The mirror discovers the current node set after each committed frame and appends watcher rows for newly materialized nodes. Loop and fan-out runtime node ids use the form:@@ and looking up the logical id. This keeps loop iterations grouped under the same phase without guessing.
The mirror uses bunx smithers-orchestrator inspect RUN_ID --format json as its primary node set. If that surface reports collapsed logical ids for a run, those ids are mirrored directly. The same logical-id phase map still applies, and node events can be used to audit the materialized ids seen during the run.
Append-only behavior
Claude Code’s workflow tree is append-only. A row that has been created cannot be removed. If a Smithers node is skipped or disappears from a later frame, the mirror watcher resolves as a completed[skipped] row.
This means the mirror shows what was observed, not a retractable live graph. Smithers remains the authoritative run state.
Scaling flags
By default the mirror shows agent-backed Smithers nodes plus any node discovered at runtime that was not present in the static frame-0 graph, such as data-dependent fan-out tasks and loop iterations. Those runtime nodes are the reason the mirror exists, so they are surfaced even though their kind cannot be known ahead of time. Known compute, static, wait, timer, approval, subflow, and sandbox nodes stay hidden unless you pass--mirror-all-nodes:
parallel() or pipeline() call. The generated mirror keeps a conservative watcher budget and logs when it stops adding watcher rows.
For large runs, use --collapse-phases: