Skip to content
Automation
Skill

/smithers

Drive Smithers durable flows for ordered agent stages, retries, approvals, bounded loops, and crash-safe work. Run existing flows or author TypeScript flows with Flow.make, Action.make, and Effect v4. If SMITHERS_INSIDE_RUN is set, do the assigned step directly; never launch or

BOOST
From plugin
smithers
4281 skill
Install
$ npx -y skills add smithersai/smithers --skill smithers --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/smithers

Context preview

The summary Claude sees to decide when to auto-load this skill.

Drive Smithers durable flows for ordered agent stages, retries, approvals, bounded loops, and crash-safe work. Run existing flows or author TypeScript flows with Flow.make, Action.make, and Effect v4. If SMITHERS_INSIDE_RUN is set, do the assigned step directly; never launch or

SKILL.md

smithers.SKILL.md
name: smithers
description: >
  Drive Smithers durable flows for ordered agent stages, retries, approvals,
  bounded loops, and crash-safe work. Run existing flows or author TypeScript
  flows with Flow.make, Action.make, and Effect v4. If SMITHERS_INSIDE_RUN is
  set, do the assigned step directly; never launch or steer another run.

Smithers

A flow is ordinary TypeScript built from `Flow.make`, `Action.make`, and Effect. Completed actions are recorded; recovery resumes at the frontier. Use Effect `4.0.0-rc.115` and the Smithers 1.0 APIs. Read the owning package's README and docs before authoring. Never use JSX or 0.x APIs.

Rule 0: if you are already inside a run, do not use Smithers

Check `SMITHERS_INSIDE_RUN` before routing. If set, you are a worker executing one step. Do the assigned work with your ordinary tools and finish your turn. Never launch, steer, or poll another run from inside that step. Declare a `HumanTask` in the flow when a person must decide; do not improvise orchestration from inside an agent.

Route first: not every ask needs a flow

1. Clarify missing acceptance criteria before building. 2. Handle one clear goal directly, however large. 3. Use a flow for ordered stages with real gates, durability, approvals, bounded loops, or reusable work. 4. Run an existing flow before writing another.

The mental model

**Flow.** A tagged durable program with payload, success, and error schemas. Its body builds a plan; effects belong in action implementations.

**Action.** A named recorded side effect. Declare it with `Action.make` and attach its implementation with `Declared.toLayer`.

**Node.** The plan-time graph from `@smthrs/plan`. Compose nodes with `Node.map`, `Node.andThen`, `Node.bindPlanned`, `Node.branch`, and `Node.all`.

**Plan.** The compiled graph and approval envelope. Planning executes authoring callbacks; it does not sandbox untrusted JavaScript.

**Step key.** Persisted identity derived from declarations, dependencies, and callback captures. Change meaning deliberately; keep secrets out of payloads and captures.

Sixty seconds to the aha

smthrs flow list
smthrs flow plan hello --data '{"name":"world"}'
smthrs flow start hello --data '{"name":"world"}' --json
smthrs runs show <run-id>
smthrs runs logs <run-id> --follow

Read the run ID from the receipt. Admission is not completion. Check the run's actual result before reporting success. Use `smthrs <command> --help` or `--schema` for the installed command contract.

The flow directory

Put a file flow at `flows/<name>/flow.ts`. Default-export a literal tagged `Flow.make("<name>", { description, capabilities, effects, payload, success, error?, body })` from `@smthrs/flow`. Discovery reads metadata without executing that module. Keep metadata literal; helpers and computed metadata can hide an entry from discovery.

Export action implementations as the optional named `layer`: use `Declared.toLayer`, `AgentAction.layer`, or `Layer.mergeAll`. The local CLI/TUI host composes that layer with FileSystem, Path, ChildProcessSpawner, HttpClient, and agent services (#2923). Export implementations directly; the host owns `Action.Implementations`. Acquire extra dependencies during layer construction so missing services are refused at load.

Authoring checklist (learned from real flows)

  • **Wire system actions explicitly.** `Sleep.action`, `WaitFor.action`, and

`HumanTask.action` carry no compile-time implementation requirement. Merge the corresponding `Sleep.layer`, `WaitFor.layer`, and `HumanTask.layer` into your implementations unless your host already provides them. A missing handler is refused as `unresolved_action`: `Action "system/sleep" has no implementation`.

  • **Export the implementation layer.** A discovered `flow.ts` may

`export const layer = Layer.mergeAll(...)`. Include declared action layers and `AgentAction.layer`; use the host services above rather than rebuilding the host (#2923).

  • **Separate admission from completion.** On the durable engine,

`Flow.start` and `Flow.ensure` return after admission and scheduling; the child runs detached (#2932). Give each logical launch a stable `ensure` key that includes its round or execution component. Reuse it only for retries of the same payload; different payloads raise `ExecutionIdentityConflict`. Fan out with `Effect.forEach(items, launch, { concurrency })`; wrap each launch in `Effect.exit` so one refusal does not fail the batch. Retain exits and execution IDs; inspect completion separately.

  • **Declare the real capability envelope.** Grant only what the flow uses,

for example `["fs:read:**", "fs:write:**", "proc:spawn:*", "net:get:*", "net:post:*", "model:call:*"]`. `smthrs flow start` refuses to auto-approve `["*"]`.

  • **Capture callback meaning.** Wrap bodies, branch predicates,

`Node.bindPlanned` builders, and other persisted callbacks in `Node.capture`. Declare every semantic closed-over value and an explicit version for imported behavior. Bump the version when topology or meaning changes; plan a new run. Captures must be inert data, not service or function objects.

  • **Type recursive handoffs.** Give a flow that hands off to itself through

`.to` an explicit `Flow.Flow<...>` annotation to break recursive inference. For discovery, put the typed loop beside a literal `export default Flow.make(` entry that hands off to it. Keep the entry's description, capabilities, effects, payload, and success literal. Register the loop's interpreter in the exported layer.

  • **Pin subscription seats.** Use `<seat>@<account>`, such as

`claude-code:opus@claude-9` or `sol@codex-3`. Check the selected login; never accidentally send subscription work through a paid API route. Unpinned Claude aliases select the API when an Anthropic key is available; explicit `claude-code:` seats refuse an unavailable subscription rather than falling back to a key.

  • **Treat unavailable observa
Read more
Ships withsmithers

Smithers is an agentic workflow framework for defining workflows in simple TypeScript configuration files and executing them quickly, durably, and reliably

Get the whole plugin
Stats
428
Stars
51
Forks
Active
Maintenance
TypeScript
Language
MIT
License
4m ago
Last commit
9mo ago
Created

Repo: smithersai/smithers