Agent workflows you can watch live, rewind, fork, and replay. Tell your coding agent to do real, multi-step work, then Smithers runs it for minutes or days: watch every step live, gate the risky ones behind human approvals, and rewind, fork, or replay any run.
> /plugin marketplace add smithersai/smithers> /plugin install smithers@smithersai
Repo: smithersai/smithers
What's inside
Agent workflows you can watch live, rewind, fork, and replay.
Tell your coding agent to do real, multi-step work, then Smithers runs it for minutes or days: watch every step live, gate the risky ones behind human approvals, and rewind, fork, or replay any run. The same workflow runs across Claude Code, Codex, Pi, AI SDK models, and remote sandboxes.
Zero config: you never write a workflow by hand. Describe the outcome in plain English and your coding agent builds the workflow for you, from the same primitives the built-in pack uses. Prompting is the authoring step.
Time travel: fork a run from any earlier frame and branch an alternate timeline. Every step is a database row, so live watching, rewind, and replay are built in.
<Memory> and agents recall what earlier runs
learned, pick up remember/recall tools mid-task, and retain a digest afterward.
Works locally out of the box; connect Hindsight
for semantic recall by meaning.| You want to⦠| Smithers? |
|---|---|
| Get one answer from one prompt | No, call the model directly |
| Let a coding agent change a repo across many steps | Yes |
| Pause for a human approval, then resume later | Yes |
| Run several agents that review, retry, and converge | Yes |
| Survive crashes and replay, fork, or rewind a run | Yes |
Smithers is the durable runtime for coding-agent work: when the unit of work is an agent editing a real repository over many steps, and you need that work to be inspectable, approvable, and recoverable.
Claude Code, Codex, and the other harnesses already fan out subagents, and for work that fits in one sitting they are the right tool. The fan-out is ephemeral, though: it lives inside one session, one vendor, and one terminal.
| Built-in subagent fan-out | A Smithers run |
|---|---|
| Dies when the session ends or crashes | Persists and resumes from the last finished step |
| One vendor per session | Claude, Codex, Gemini, and Pi share one workflow |
| An approval blocks the terminal | An approval suspends the run durably, overnight if needed |
| A bad decision means starting over | Rewind, fork, or replay from any step |
| Orchestration is a prompt you retype | A workflow is a file you version, review, and rerun |
When the work has to survive the session, hand the fan-out to Smithers. Your agent still drives everything; the run just stops being disposable. Detailed comparisons: vs. Claude Code Workflows, vs. Temporal, and vs. LangGraph. The longer argument is in the open, durable version of agent workflows.
Smithers is driven by your coding agent, not a GUI you click. Your agent runs Smithers on your behalf: it scaffolds workflows, kicks off runs, watches them, and handles approvals.
One command sets everything up. From inside your project:
bunx smthrs init
init does everything:
smithers skill into the coding agents on your machine (Claude Code,
Pi, and more), so your agent knows how and when to use Smithers. No mkdir, no curl..smithers/ with the focused authoring workflows create-workflow,
create-skill, and docs-driven-development; former recipes remain in
examples/init-pack/.Then just ask:
"orchestrate an agent to add rate limiting and keep iterating until the tests pass."
Your agent picks the right workflow, starts the run, and keeps going through retries and review loops until the work is actually done.
To wire the MCP server into every detected agent too, run bunx smthrs mcp add. See Agent Support for the full per-agent
matrix, and skills/smithers/ for the onboarding skill itself.
| Primitive | Meaning |
|---|---|
<Loop> | Repeat tasks until a condition is met |
A workflow is a JSX tree of tasks. You usually don't write these by hand: you prompt your agent, and it writes them from the same primitives the built-in pack uses. Each example below starts with the prompt that produces it.
This page is the 90-second version. The Tour is the 15-minute version: it builds a real code-review workflow one capability at a time.
"implement this request and keep iterating until a reviewer signs off"
import { createSmithers, Loop, CodexAgent } from "smthrs";
import { z } from "zod";
const { Workflow, Task, smithers, outputs } = createSmithers({
input: z.object({ request: z.string() }),
impl: z.object({ summary: z.string(), filesChanged: z.array(z.string()) }),
review: z.object({ approved: z.boolean(), feedback: z.string() }),
});
const coder = new CodexAgent({
model: "gpt-5.6-luna",
config: { model_reasoning_effort: "medium" },
});
const reviewer = new CodexAgent({
model: "gpt-5.6-sol",
config: { model_reasoning_effort: "xhigh" },
sandbox: "read-only",
});
export default smithers((ctx) => (
<Workflow name="implement-reviewed">
<Loop until={ctx.latest(outputs.review, "validate")?.approved} maxIterations={5}>
<Task id="implement" output={outputs.impl} agent={coder}>
{`Implement: ${ctx.input.request}
Address this reviewer feedback first: ${ctx.latest(outputs.review, "validate")?.feedback ?? "none yet"}`}
</Task>
<Task id="validate" output={outputs.review} agent={reviewer}>
{`Review the working-tree changes for: ${ctx.input.request}.
Approve only when the change is correct and tested.`}
</Task>
</Loop>
</Workflow>
));
This is the loop a one-shot agent call can't give you: implement, review, feed the feedback back in, repeat until approved. Every iteration is persisted, so a crash mid-loop resumes at the current iteration instead of iteration one.
The bigger version of this idea (split a request into tickets, implement them in
parallel worktrees, gate on your approval, land through a merge queue) is
examples/parallel-tickets.jsx: a small engineering
team in one file.
Durability is the differentiator. Runs survive crashes, restarts, and flaky tools because every completed step is persisted to SQLite the moment it finishes. The runtime always knows what's done and what to run next. Approvals, human questions, retries, and replay are first-class.
prompt β render workflow β run task β validate output β persist to SQLite β re-render β resume Β· inspect Β· replay
That loop is the whole model: a task runs, its output is validated against a schema and written down, then the workflow re-renders from persisted state to decide the next task. A crash at any point resumes from the last write, not from the top.
A run killed mid-task, then resumed: the completed task is skipped, the interrupted task re-runs, the run finishes. No recovery code.
bunx smthrs up workflow.tsx --input '{"description":"Fix bug"}'
bunx smthrs up workflow.tsx --run-id abc123 --resume true # resume after a crash
bunx smthrs rewind abc123 --frame 4 # time-travel to an earlier frame
bunx smthrs fork abc123 # branch an alternate timeline
bunx smthrs replay abc123 # replay from a checkpoint
Prefer the CLI? The seeded workflows run directly, and whether your agent started a run or you did, you can see exactly what's happening:
bunx smthrs workflow run create-workflow --prompt "build a small hello workflow"
# plan is archived under examples/init-pack/; copy it into .smithers/workflows/ first
bunx smthrs workflow run plan --prompt "add rate limiting and API key rotation"
bunx smthrs ps # list active, paused, and recently completed runs
bunx smthrs inspect RUN_ID # steps, agents, approvals, and outputs for one run
bunx smthrs logs RUN_ID # tail the event log
bunx smthrs chat RUN_ID # read the agent's chat output
ps shows you what needs attention (a paused approval, a recent failure); inspect drills
into a single run so you can follow each step and agent as it works. Run
bunx smthrs starters to browse plain-English starters.
Prefer a live page over every run? bunx smthrs monitor opens the Smithers
Monitor: the grouped run list, each run's execution tree with per-node status, and the
structured event stream underneath.
Smithers doesn't bet on one lab or one harness. Point a task at whichever agent is best for the job, mix several in one workflow, and switch freely. The workflow doesn't change when the model does, so a frontier model can plan, a fast model can fan out, and a specialized harness can do the edits.
Agents that run tasks
| Agent | How it runs |
|---|---|
| Claude Code | CLI harness |
| Codex | CLI harness |
| Cursor | CLI harness |
| Pi | CLI harness |
| Antigravity | CLI harness |
| Hermes | CLI harness |
| OpenClaw | CLI harness |
| Any AI SDK model | SDK agent, with tools, structured output, and MCP |
The same <Sandbox> primitive runs an agent locally (Bubblewrap, Docker, or
Microsandbox) or through any
backend you implement against SandboxProvider.
Beyond init, bunx smthrs mcp add also wires the MCP
server into Cursor, Copilot, Hermes, OpenClaw, and ~20 more coding agents.
bunx smthrs init installs a focused pack: create-workflow, create-skill,
and docs-driven-development. Former starter workflows are preserved under
examples/init-pack/.
bunx smthrs workflow run create-workflow --prompt "add rate limiting"
See docs/workflows/ for the curated pack and
examples/init-pack/ for the archived, copyable workflow patterns.
The examples/ folder has 100+ runnable workflows, one per orchestration
pattern. Copy one as a starting point:
Review loops, parallel ticket fleets, supervisors, panels, debates, migrations, RAG citation loops, repo janitors, and dozens more, each a runnable starting point.
Smithers is built for agents that modify real repositories, so control is wired into the runtime:
bunx smthrs observability).Full documentation lives at smithers.sh.
MIT
.agents/
plugins/
marketplace.json
skills/
smithers-agents/
SKILL.md
smithers-alerts/
SKILL.md
smithers-approve/
SKILL.md
smithers-ask/
smithers-ask-human/
SKILL.md
SKILL.md
smithers-bug/
SKILL.md
smithers-cancel/
SKILL.md
smithers-chat/
smithers-chat-create/
SKILL.md
SKILL.md
smithers-claude/
SKILL.md
smithers-cron/
SKILL.md
smithers-deny/
SKILL.md
smithers-diff/
SKILL.md
smithers-docs/
smithers-docs-full/
SKILL.md
SKILL.md
smithers-down/
SKILL.md
smithers-eval/
SKILL.md
smithers-events/
SKILL.md
smithers-fork/
SKILL.md
smithers-gateway/
SKILL.md
smithers-graph/
SKILL.md
smithers-gui/
SKILL.md
smithers-hermes/
SKILL.md
smithers-hijack/
SKILL.md
smithers-human/
SKILL.md
smithers-init/
SKILL.md
smithers-inspect/
SKILL.md
smithers-logs/
SKILL.md
smithers-make-workflow/
SKILL.md
smithers-memory/
SKILL.md
smithers-migrate/
SKILL.md
smithers-monitor/
SKILL.md
smithers-node/
SKILL.md
smithers-observability/
SKILL.md
smithers-oneshot/
SKILL.md
smithers-openapi/
SKILL.md
smithers-optimize/
SKILL.md
smithers-output/
SKILL.md
smithers-pause/
SKILL.md
smithers-ps/
SKILL.md
smithers-replay/
SKILL.md
smithers-restore/
SKILL.md
smithers-retry-task/
SKILL.md
smithers-revert/
SKILL.md
smithers-review/
SKILL.md
smithers-rewind/
SKILL.md
smithers-scores/
SKILL.md
smithers-signal/
SKILL.md
smithers-snapshot-hook/
SKILL.md
smithers-snapshots/
SKILL.md
smithers-starters/
SKILL.md
smithers-supervise/
SKILL.md
smithers-timeline/
SKILL.md
smithers-timetravel/
SKILL.md
smithers-token/
SKILL.md
smithers-tree/
SKILL.md
smithers-ui/
SKILL.md
smithers-up/
SKILL.md
smithers-update/
SKILL.md
smithers-upgrade/
SKILL.md
smithers-usage/
SKILL.md
smithers-what/
SKILL.md
smithers-why/
SKILL.md
smithers-workflow/
SKILL.md
.claude-plugin/
marketplace.json
.crush/
skills/
smithers-agents
smithers-alerts
smithers-approve
smithers-ask
smithers-ask-human
smithers-bug
smithers-cancel
smithers-chat
smithers-chat-create
smithers-claude
smithers-cron
smithers-deny
smithers-diff
smithers-docs
smithers-docs-full
smithers-down
smithers-eval
smithers-events
smithers-fork
smithers-gateway
smithers-graph
smithers-gui
smithers-hermes
smithers-hijack
smithers-human
smithers-init
smithers-inspect
smithers-logs
smithers-make-workflow
smithers-memory
smithers-migrate
smithers-monitor
smithers-node
smithers-observability
smithers-openapi
smithers-optimize
smithers-output
smithers-pause
smithers-ps
smithers-replay
smithers-restore
smithers-retry-task
smithers-revert
smithers-review
smithers-rewind
smithers-scores
smithers-signal
smithers-snapshot-hook
smithers-snapshots
smithers-starters
smithers-supervise
smithers-timeline
smithers-timetravel
smithers-token
smithers-tree
smithers-ui
smithers-up
smithers-update
smithers-upgrade
smithers-usage
smithers-what
smithers-why
smithers-workflow
.dockerignore
.editorconfig
.git-blame-ignore-revs
.gitattributes
.github/
workflows/
ci.yml
faults-nightly.yml
faults.yml
pr-review.yml
release-next.yml
sota-research.yml
.gitignore
.gitmodules
.oxfmtrc.json
.smithers/
.gitignore
.oxlintrc.json
agents/
agents.ts
antigravity.ts
claude-code.ts
codex.ts
index.ts
opencode.ts
README.md
audits/
bulletproof-audit.md
bunfig.toml
components/
accounts/
accountAgents.ts
accountPool.ts
RefreshAccountUsage.tsx
CommandProbe.tsx
Estimate.tsx
extract-prompt/
ExtractPrompt.tsx
index.ts
MarkdownPromptCache.ts
MemoryPromptCache.ts
PromptCache.ts
rctfCompletenessScorer.ts
rctfPromptSchema.ts
readLatestScore.ts
SqlitePromptCache.ts
stakesToThreshold.ts
FeatureEnum.tsx
ferric/
BenchTask.tsx
CampaignGate.tsx
Closeout.tsx
ferricAgents.ts
ferricConfig.ts
ferricGates.ts
ferricLedger.ts
ferricSchemas.ts
ferricShell.ts
ferricSmithers.ts
FoundationAndBudget.tsx
FuzzTask.tsx
PhaseGA.tsx
PhaseM0.tsx
PhaseM25.tsx
PhaseM3.tsx
PhaseM4.tsx
PhaseM5M6.tsx
PhaseM7.tsx
PhaseM8.tsx
PhaseM9.tsx
PortCampaign.tsx
PublishPipeline.tsx
QueueParse.tsx
Slice.tsx
SuiteTask.tsx
TrialPhase.tsx
ForEachFeature.tsx
GrillMe.tsx
LoopUntilScored.tsx
PlanPanel.tsx
releaseTrainMachine.ts
Review.tsx
roles.ts
ShipTickets.tsx
TestFortress.tsx
ValidationLoop.tsx
VerifiableGoals.tsx
evals/
authoring-benchmark.jsonl
backpressure-plan-holdout.jsonl
backpressure-plan.jsonl
context-doctor-holdout.jsonl
context-doctor.jsonl
fixtures/
phase1-issue-sweep.tsx
seed-triage-fixtures.ts
triage-fixture.tsx
phase1-authoring.json
release-content.jsonl
route-task-holdout.jsonl
route-task.jsonl
run-sweep.sh
triage-run-holdout.jsonl
triage-run.jsonl
example.tsx
gateway.ts
lib/
apiAbBench/
run-effect-candidate.ts
run-jsx-candidate.ts
solutions/
effect-fanout.ts
effect-pipeline.ts
effect-reuse.ts
jsx-fanout.tsx
jsx-pipeline.tsx
jsx-reuse.tsx
README.md
buildIssueBlitzNodeState.ts
codexAccounts.ts
codexIssueMergeQueue.ts
daily-ceo-intel/
archive.ts
cloudflare.ts
cluster.ts
commit.ts
config.ts
db.ts
dedupe.ts
fetchGuards.ts
filterWindow.ts
finalize.ts
modelProvider.ts
normalize.ts
publish.ts
rank.ts
render.ts
schemas.ts
seen.ts
sources/
bluesky.ts
feedParser.ts
githubReleases.ts
hn.ts
itemFactory.ts
lobsters.ts
reddit.ts
rss.ts
verify.ts
window.ts
ddd/
auditInputs.ts
build.ts
dddRoot.ts
featuresSchema.ts
generateSpecDocs.ts
generateUiModules.ts
triageCandidates.ts
validateFeatures.ts
open-code-review.ts
parse-first-json-value.ts
plue-provider.test.ts
plue-provider.ts
publicIssueAgentPolicy.ts
publishBaseline.ts
release-content/
commitChangelog.ts
files.ts
git.ts
media.ts
quality.ts
schemas.ts
templates.ts
x.ts
risklessGithubIssueSweep.ts
roadmapScorer.ts
stackArtifact.tsx
stackedShip.ts
ticketFleetDisposition.ts
whole-foods-meal-planner-mcp.ts
whole-foods-meal-planner.mcp.json
wholeFoodsMealPlanner.ts
package.json
plans/
feature-surfaces-contract.md
granular-jj-durability-and-session-continue.md
jjhub-parity.md
preload.ts
prompts/
ask-user-instructions.mdx
audit-feature.mdx
audit.mdx
backpressure-plan-extract-criteria.mdx
backpressure-plan-plan-gates.mdx
context-doctor-advise.mdx
context-engineer-backpressure.mdx
context-engineer-classify.mdx
context-engineer-execute.mdx
context-engineer-inventory.mdx
context-engineer-report.mdx
context-engineer-route.mdx
... 1600 moreShowing a partial view of a very large repo.
FAQ
smithers is a Claude Code plugin with 14 hand-picked skills for automation work, indexed on Flowy. Install it with the command on its page. It includes orchestrate, orchestrate, smithers. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.