@ai-for-dev/combo
Write pi subagents and compose workflows, simply
Package details
Install @ai-for-dev/combo from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@ai-for-dev/combo- Package
@ai-for-dev/combo- Version
0.4.0- Published
- Oct 8, 2026
- Downloads
- 605/mo · 197/wk
- Author
- gouarin
- License
- MIT
- Types
- extension
- Size
- 1.9 MB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./extension/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
A combo is several moves that land as one. So is a workflow here: subtasks run apart, and come back as a single
Result.
pi is a coding agent that ships an SDK: a session can be started inside your own process rather than driven through a terminal. combo is the layer above it. A Markdown file becomes an agent, an agent becomes a subagent whose lifetime you control, and subagents compose into workflows written in TypeScript.
Reach for it when one agent is not enough: a coder and a reviewer looping until they agree, three scouts reading a codebase in parallel, the same workflow run against four models to see which one is worth its price.
- In-process subagents, isolated and composable in TypeScript. Their tools and their skills are named in their own file, never inherited from yours.
- An explicit lifetime: disposable, or persistent across a workflow. The caller decides, never the library.
- A live view of the work, in herdr if it is running and in pi's TUI otherwise, with no change to the calling code. A herdr split reads like a pi session, and takes the keyboard while its subagent works.
- Everything measured and exportable: time and tokens per subagent, plus a readable HTML and replayable JSONL export of a whole run.
- An answer in the language you asked in. The definitions are English; what comes back follows the question, and the words a workflow reads back stay put.
Getting started
npm install @ai-for-dev/combo # the library
pi install npm:@ai-for-dev/combo # the same package, loaded into pi
It needs pi 1.0 or later. Node 23.6 or later runs TypeScript natively: there is no build step, and the package ships the TypeScript it was written in.
From a clone, npm install then npm test - offline, no network calls.
import { findAgent, loadAgents, run } from "@ai-for-dev/combo";
const agents = loadAgents();
const result = await run(findAgent(agents, "scout"), "Find the authentication code");
result.ok; // a model failure is a Result, never a throw
Everything returns that same Result - { agent, output, messages, usage, ok, error? } - which is the one contract that makes workflows composable.
Quickstart is the guided version: a disposable subagent, one that remembers, a workflow, and the same thing from inside pi.
Workflows
Eight combinators - chain, fanOut, loop, reduce, route,
orchestrate, interview, swarm - all taking the same options and all
returning Results.
const { results, usage } = await fanOut({ agent: scout, tasks, concurrency: 2 });
usage.busyMs / usage.wallMs; // the parallelism actually achieved
const review = await loop({
steps: [coder, reviewer],
input: "Implement the parser",
until: (step) => saysWord(step.output, "LGTM"),
lifetime: "workflow", // the reviewer remembers what it already said
});
review.converged; // did it reach the bar, or just run out of iterations?
A failure does not crash a workflow: it becomes a Result with ok: false.
timeoutMs is a per-turn deadline with no default, and you want one on anything
unattended - pi's agent loop has no step cap.
The model is a knob at every level: model on a spawn or a workflow puts
every subagent on one model, whatever their frontmatter says - which is what
lets the same workflow run against different LLMs with no agent file edited.
The nearest override wins: argument, then the flow file, then the agent's
frontmatter, then pi's own settings. No environment variable, anywhere.
await loop({ steps: [coder, reviewer], input, model: "anthropic/claude-sonnet-5" });
Comparing models
experiment runs the same workflow over M models and N repetitions, each cell in
its own directory with its own measurements, and gives back one table.
const report = await experiment({
models: ["anthropic/claude-sonnet-5", "local/qwen/qwen3-coder-next"],
repetitions: 3,
run: async (cell) => {
const result = await loop({ ...cell.options, steps: [coder, reviewer], input, until: lgtm });
return { ok: result.ok, converged: result.converged };
},
});
Cells run one at a time by default, failed ones stay in the report with their usage, and the flag columns are whatever the callback returned. See Experiments.
The whole flow: request to working tree
/run build add a cache in front of the agent loader
locate a scout maps the code the request touches
plan a planner splits it into subtasks
deliver up to two rounds of:
work a coder and a reviewer per subtask, each pair in a copy of the repository
tests .pi/checks/test.sh, your project's own script; its verdict is final
audit one agent reads the whole change against the request
report a few lines on what was done and what is left
It asks nothing on the way, and it commits nothing at the end: the work stays in
the working tree for you to read, and the report lands in the conversation. An
interrupted run carries on with /run resume, from the first visit that did
not end. /run build-attended interviews you first, asks "Build this?", and
commits on the run's own branch.
What runs is a flow: a task graph in YAML and Markdown, next to your
agents, checked whole before its first spawn and walked by our code. The
package ships build, build-attended, explore, split and interview, so
/run works as soon as the extension is loaded; drop a build.md in
.pi/flows/ and yours replaces the shipped one, with no code to change.
See Deliver a change and Flows.
Using it from pi
pi install npm:@ai-for-dev/combo # the tool, the commands, the agents
pi -e extension # from a clone, this session only
> /run build add a slugify helper with tests
> /run explore where is the condition language implemented?
> use subagent to review src/usage.ts with coder then reviewer, looping until LGTM
> use subagent to run the interview flow on "add a --verbose flag to the driver"
> /swarm --members 3 describe each file under src/reporters/, in two sentences
> /agents # who can be spawned here, and from which directory
> /flows # the flows, what each can cost, and the files refused
> /flows build # one flow's plan, node by node
Every /run gets a run directory, runs/<timestamp>/, with its journal, its
transcripts and what it cost; the plan fills above the prompt as the visits
go. The subagent tool runs a flow by name too, and puts its questions to
you during the model's turn. See Flows, and
From pipelines to flows for a pipeline of your
own.
/swarm puts several copies of one agent on one job, with a board between
them and nobody dividing the work: they take what they will do. It ends on
coverage of what --claim names, or on the members voting the same way with
--until agree. See Swarms.
While the subagents work, a dot per subagent sits above the prompt with its
model, tokens and a clock counting up live; the tool row below holds the record.
That list is also how they are called off: esc stops every one of them,
shift+↑↓ picks one and ctrl+del stops it, and /stop scout#2 names it
outright. What ran up to that point is kept.
Or walk the chain yourself, one command at a time, with this session kept out of it until you say otherwise:
> /step explore how usage is measured
> /step planner three steps at most # handed what the explorer found
> /step coder
> /quote # only now does the session read any of it
See Extension, Walk a chain by hand and Display.
Documentation
- Manual - agents, lifetime, workflows, flows, display, export, experiments.
- Cheatsheet - commands, flags, agent and flow syntax, the API, on one page.
- Tutorials - twelve sittings in front of pi, one problem each, every one run on this repository.
- API reference - every public export, generated from the source and checked by the test suite.
- Examples - one runnable script per shape.
- Design decisions - the decisions, and the ones that were reversed.
NEXT.md- what is left, and the traps already paid for.
The same pages build into a site: make -C docs html, with
docs/README.md for the how and the why. Sphinx is a
documentation dependency only - the library still depends on the pi SDK alone.