@bastani/atomic 0.5.18 → 0.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/.agents/skills/workflow-creator/SKILL.md +110 -1
  2. package/.agents/skills/workflow-creator/references/workflow-inputs.md +10 -0
  3. package/.mcp.json +9 -0
  4. package/.opencode/opencode.json +5 -2
  5. package/README.md +394 -645
  6. package/assets/settings.schema.json +0 -20
  7. package/dist/sdk/components/attached-statusline.d.ts +13 -0
  8. package/dist/sdk/components/attached-statusline.d.ts.map +1 -0
  9. package/dist/sdk/components/header.d.ts.map +1 -1
  10. package/dist/sdk/components/session-graph-panel.d.ts.map +1 -1
  11. package/dist/sdk/components/statusline.d.ts +1 -3
  12. package/dist/sdk/components/statusline.d.ts.map +1 -1
  13. package/dist/sdk/providers/claude.d.ts +16 -5
  14. package/dist/sdk/providers/claude.d.ts.map +1 -1
  15. package/dist/sdk/runtime/executor.d.ts +63 -0
  16. package/dist/sdk/runtime/executor.d.ts.map +1 -1
  17. package/dist/sdk/runtime/tmux.d.ts +0 -9
  18. package/dist/sdk/runtime/tmux.d.ts.map +1 -1
  19. package/dist/services/config/atomic-config.d.ts +1 -7
  20. package/dist/services/config/atomic-config.d.ts.map +1 -1
  21. package/dist/services/config/definitions.d.ts +0 -45
  22. package/dist/services/config/definitions.d.ts.map +1 -1
  23. package/dist/services/config/index.d.ts +1 -1
  24. package/dist/theme/colors.d.ts +33 -0
  25. package/dist/theme/colors.d.ts.map +1 -0
  26. package/package.json +3 -2
  27. package/src/cli.ts +16 -1
  28. package/src/commands/cli/chat/index.ts +1 -1
  29. package/src/commands/cli/footer.tsx +118 -0
  30. package/src/commands/cli/init/index.ts +6 -89
  31. package/src/commands/cli/workflow-command.test.ts +146 -0
  32. package/src/commands/cli/workflow.ts +43 -7
  33. package/src/completions/bash.ts +3 -8
  34. package/src/completions/fish.ts +1 -3
  35. package/src/completions/powershell.ts +1 -17
  36. package/src/completions/zsh.ts +0 -2
  37. package/src/scripts/bundle-configs.ts +0 -12
  38. package/src/sdk/components/attached-statusline.tsx +33 -0
  39. package/src/sdk/components/header.tsx +16 -2
  40. package/src/sdk/components/session-graph-panel.tsx +10 -51
  41. package/src/sdk/components/statusline.tsx +0 -17
  42. package/src/sdk/providers/claude.ts +179 -177
  43. package/src/sdk/runtime/executor-entry.ts +3 -1
  44. package/src/sdk/runtime/executor.test.ts +292 -1
  45. package/src/sdk/runtime/executor.ts +222 -1
  46. package/src/sdk/runtime/tmux.conf +35 -4
  47. package/src/sdk/runtime/tmux.ts +0 -22
  48. package/src/services/config/atomic-config.ts +1 -14
  49. package/src/services/config/definitions.ts +1 -102
  50. package/src/services/config/index.ts +1 -1
  51. package/src/services/config/settings.ts +2 -65
  52. package/src/services/system/skills.ts +2 -19
  53. package/src/commands/cli/init/scm.ts +0 -175
package/README.md CHANGED
@@ -9,249 +9,145 @@
9
9
  [![Bun](https://img.shields.io/badge/Bun-Runtime-f9f1e1?logo=bun&logoColor=black)](./package.json)
10
10
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
11
11
 
12
- Atomic is an open-source **TypeScript SDK** for building **any harness you want** around your coding agent — **Claude Code**, **OpenCode**, or **GitHub Copilot CLI**. Chain sessions into pipelines, add human-in-the-loop approval gates, plug in CI and notifications, dispatch **12 specialized sub-agents**, and tap **55 built-in skills** — then ship it as TypeScript your whole team runs.
12
+ **An open-source TypeScript SDK for building harnesses around your coding agent** — Claude Code, OpenCode, or GitHub Copilot CLI. Chain agent sessions into deterministic pipelines, add human-in-the-loop approval gates, dispatch **12 specialized sub-agents**, and tap **55 built-in skills** — then ship it as TypeScript your whole team runs.
13
13
 
14
14
  > Define how your agent works. Start for yourself, scale to your team.
15
15
 
16
16
  ---
17
17
 
18
- ## Why Atomic
19
-
20
- Coding agents keep getting more capable — better reasoning, larger context windows, more reliable tool use. But a more capable model doesn't reduce the need for structure around it. It **increases** it.
21
-
22
- The bottleneck is shifting from "can my agent write this code?" to "can my agent follow my process?" Every team has a process — how code gets reviewed, what checks run before merging, who approves deployments, how production gets monitored. That process lives in wikis nobody reads, in one senior engineer's head, or nowhere at all. A powerful agent without a defined process is just a faster way to ship unreviewed code.
23
-
24
- **Harnesses are what turn a capable agent into a reliable part of your engineering workflow.** A harness encodes your process — research, then implement, then review, then run CI, then create a PR, then notify the right person, then wait for approval, then merge. Without one, you're prompting manually and copy-pasting between terminal sessions. With one, you run a single command and the process executes itself.
18
+ ## Quick Start
25
19
 
26
- Better models make harnesses **more** important, not less. The more you can trust an agent to execute complex tasks, the more value you get from defining exactly **what** it should execute, in **what order**, with **what checks** along the way. The harness is the durable layer models will keep improving underneath it, but your process stays the same.
20
+ Install, generate context, try Ralph, then write your own workflowfour steps, a few minutes.
27
21
 
28
- Atomic gives you the SDK to build that harness:
22
+ ### Prerequisites
29
23
 
30
- - **Start for yourself.** Automate the repetitive parts of your own workflow — research a codebase, add monitoring, generate specs. One developer, one afternoon, one TypeScript file.
31
- - **Scale to your team.** Encode your team's review process, deployment gates, and quality checks as TypeScript that every team member runs identically. Your process becomes versioned, testable, and reproducible — not tribal knowledge.
32
- - **Work across agents.** Write a harness once, run it on Claude Code, OpenCode, or Copilot CLI with a flag change. The harness is the constant; the agent is swappable.
24
+ - **At least one coding agent** installed and logged in:
25
+ - [Claude Code](https://code.claude.com/docs/en/quickstart) run `claude` and authenticate
26
+ - [OpenCode](https://opencode.ai) run `opencode` and authenticate
27
+ - [GitHub Copilot CLI](https://github.com/features/copilot/cli) — run `copilot` and authenticate
28
+ - **Windows:** PowerShell 7+ ([install guide](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows))
33
29
 
34
- ### What You Can Build
30
+ ### 1. Install
35
31
 
36
- **Add production monitoring to your codebase.** Build a harness that researches your current observability setup, identifies gaps in metrics, health checks, and alerting, implements the missing pieces, and reviews the changes — all in one run.
32
+ The bootstrap script installs [Bun](https://bun.sh/), Atomic, and shell completions in one step:
37
33
 
38
34
  ```bash
39
- atomic workflow -n add-monitoring -a claude "add Prometheus metrics and health checks to all API endpoints"
40
- ```
41
-
42
- **Automate your team's review-to-merge pipeline.** Encode your exact process: review code changes → run security scans and linting in parallel → create a PR → notify the team lead on Slack → wait for human approval → merge. The [human-in-the-loop gate](#workflow-sdk--build-your-own-deterministic-harness) pauses execution until the right person approves. New team members inherit the same pipeline on day one.
35
+ # macOS / Linux
36
+ curl -fsSL https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
43
37
 
44
- ```bash
45
- atomic workflow -n review-to-merge -a claude
38
+ # Windows (PowerShell 7+)
39
+ irm https://raw.githubusercontent.com/flora131/atomic/main/install.ps1 | iex
46
40
  ```
47
41
 
48
- **Run parallel UX testing with 50 personas.** Spin up 50 agents — each with a distinct user persona (first-time user, power user, accessibility-dependent user, non-technical stakeholder) — each using [Playwright](#built-in-skills) to navigate your app and report usability issues from their perspective. Batch in groups, aggregate findings, and get feedback at a scale no manual process can match.
42
+ Upgrade later with `bun update -g @bastani/atomic`.
43
+
44
+ <details>
45
+ <summary><b>Alternative: Already have Bun? Install directly from npm</b></summary>
49
46
 
50
47
  ```bash
51
- atomic workflow -n ux-personas -a claude
48
+ bun install -g @bastani/atomic
52
49
  ```
53
50
 
54
- Each of these is a `.ts` file using Atomic's [Workflow SDK](#workflow-sdk--build-your-own-deterministic-harness). See [Build a Workflow](#4-build-a-workflow) for a working example, or read the full SDK reference below.
51
+ This skips the Bun install step but doesn't set up shell completions run `atomic completions <shell>` separately if you want them (see [Commands Reference](#atomic-completions--shell-completions)).
55
52
 
56
- ---
57
-
58
- ## Table of Contents
53
+ **Prerelease builds:** `bun install -g @bastani/atomic@next` (may contain breaking changes).
59
54
 
60
- - [Atomic](#atomic)
61
- - [Why Atomic](#why-atomic)
62
- - [What You Can Build](#what-you-can-build)
63
- - [Table of Contents](#table-of-contents)
64
- - [Quick Start](#quick-start)
65
- - [Prerequisites](#prerequisites)
66
- - [1. Install](#1-install)
67
- - [2. Generate Context Files](#2-generate-context-files)
68
- - [3. Managing Sessions](#3-managing-sessions)
69
- - [4. Build a Workflow](#4-build-a-workflow)
70
- - [Core Features](#core-features)
71
- - [Multi-Agent Support](#multi-agent-support)
72
- - [Workflow SDK — Build Your Own Deterministic Harness](#workflow-sdk--build-your-own-deterministic-harness)
73
- - [Builder API](#builder-api)
74
- - [WorkflowContext (`ctx`) — top-level orchestrator](#workflowcontext-ctx--top-level-orchestrator)
75
- - [SessionContext (`s`) — inside each session callback](#sessioncontext-s--inside-each-session-callback)
76
- - [Session Options (`SessionRunOptions`)](#session-options-sessionrunoptions)
77
- - [Saving Transcripts](#saving-transcripts)
78
- - [Per-Agent Session APIs](#per-agent-session-apis)
79
- - [Key Rules](#key-rules)
80
- - [Research Codebase](#research-codebase)
81
- - [Autonomous Execution (Ralph)](#autonomous-execution-ralph)
82
- - [Deep Research Codebase](#deep-research-codebase)
83
- - [Containerized Execution](#containerized-execution)
84
- - [Specialized Sub-Agents](#specialized-sub-agents)
85
- - [Built-in Skills](#built-in-skills)
86
- - [Workflow Orchestrator Panel](#workflow-orchestrator-panel)
87
- - [Commands Reference](#commands-reference)
88
- - [CLI Commands](#cli-commands)
89
- - [Global Flags](#global-flags)
90
- - [`atomic session` Subcommands](#atomic-session-subcommands)
91
- - [`atomic chat` Flags](#atomic-chat-flags)
92
- - [`atomic workflow` Flags](#atomic-workflow-flags)
93
- - [`atomic completions` — Shell Completions](#atomic-completions--shell-completions)
94
- - [Atomic-Provided Skills (invokable from any agent chat)](#atomic-provided-skills-invokable-from-any-agent-chat)
95
- - [Configuration](#configuration)
96
- - [`.atomic/settings.json`](#atomicsettingsjson)
97
- - [Agent-Specific Files](#agent-specific-files)
98
- - [Installation Options](#installation-options)
99
- - [Bun (recommended)](#bun-recommended)
100
- - [Devcontainer (recommended for autonomous agents)](#devcontainer-recommended-for-autonomous-agents)
101
- - [Updating \& Uninstalling](#updating--uninstalling)
102
- - [Update](#update)
103
- - [Uninstall](#uninstall)
104
- - [Troubleshooting](#troubleshooting)
105
- - [FAQ](#faq)
106
- - [Contributing](#contributing)
107
- - [License](#license)
108
- - [Credits](#credits)
109
-
110
- ---
111
-
112
- ## Quick Start
113
-
114
- ### Prerequisites
115
-
116
- - **macOS, Linux, or Windows** (PowerShell 7+ required on Windows — [install guide](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows))
117
- - **[Bun](https://bun.sh/)** runtime installed
118
- - **At least one coding agent installed and logged in:**
119
- - [Claude Code](https://code.claude.com/docs/en/quickstart) — run `claude` and complete authentication
120
- - [OpenCode](https://opencode.ai) — run `opencode` and complete authentication
121
- - [GitHub Copilot CLI](https://github.com/features/copilot/cli) — run `copilot` and complete authentication
55
+ </details>
122
56
 
123
- ### 1. Install
57
+ <details>
58
+ <summary><b>Authenticated downloads (CI / enterprise)</b></summary>
124
59
 
125
- Atomic is distributed as a single npm package that exposes both the CLI binary and the Workflow SDK. You have three install paths depending on your environment.
60
+ Set `GITHUB_TOKEN` to avoid GitHub API rate limits when running the bootstrap script in CI:
126
61
 
127
- **Option A — Devcontainer (recommended for safe autonomous execution):**
62
+ ```bash
63
+ # macOS / Linux
64
+ GITHUB_TOKEN=ghp_... curl -fsSL https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
128
65
 
129
- > [!TIP]
130
- > Devcontainers isolate the coding agent from your host system, reducing the risk of destructive actions like unintended file deletions or misapplied shell commands. This is the safest way to run Atomic, especially for multi-hour autonomous sessions with Ralph.
131
- >
132
- > Use the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for VS Code or [DevPod](https://devpod.sh) to spawn and manage your devcontainers.
66
+ # Windows PowerShell
67
+ $env:GITHUB_TOKEN='ghp_...'; irm https://raw.githubusercontent.com/flora131/atomic/main/install.ps1 | iex
68
+ ```
133
69
 
134
- Add a single feature to your `.devcontainer/devcontainer.json` — this installs Atomic, the coding agent, GitHub CLI, and all dependencies automatically.
70
+ </details>
135
71
 
136
- ```
137
- your-project/
138
- ├── .devcontainer/
139
- │ └── devcontainer.json ← add the feature here
140
- ├── src/
141
- └── ...
142
- ```
72
+ <details>
73
+ <summary><b>Alternative: Devcontainer (recommended for autonomous workflows)</b></summary>
143
74
 
144
- On first run, Atomic automatically sets up all required tooling (Node.js, tmux, Playwright CLI, config files, skills, and agent configurations). This happens once and takes about a minute.
75
+ > Devcontainers isolate the agent from your host, limiting the blast radius of destructive actions. This is the safest way to run workflows.
145
76
 
146
- | Feature | Reference | Agent |
147
- | -------------------- | ------------------------------------ | ---------------------------------------------------- |
148
- | Atomic + Claude Code | `ghcr.io/flora131/atomic/claude:1` | [Claude Code](https://claude.ai) |
149
- | Atomic + OpenCode | `ghcr.io/flora131/atomic/opencode:1` | [OpenCode](https://opencode.ai) |
150
- | Atomic + Copilot CLI | `ghcr.io/flora131/atomic/copilot:1` | [Copilot CLI](https://github.com/github/copilot-cli) |
77
+ Add one feature to `.devcontainer/devcontainer.json`:
151
78
 
152
- Each feature installs the Atomic CLI from npm, all shared dependencies (bun, playwright-cli), agent-specific configurations (agents, skills), and the agent CLI itself. Features are versioned in sync with Atomic CLI releases.
79
+ | Feature | Agent |
80
+ | ------------------------------------ | -------------------- |
81
+ | `ghcr.io/flora131/atomic/claude:1` | Atomic + Claude Code |
82
+ | `ghcr.io/flora131/atomic/opencode:1` | Atomic + OpenCode |
83
+ | `ghcr.io/flora131/atomic/copilot:1` | Atomic + Copilot CLI |
153
84
 
154
- **Option B Bun global install (simplest for local use):**
85
+ Full `.devcontainer.json` templates per agent live in [`.devcontainer/`](./.devcontainer/). Each feature installs Atomic, bun, playwright-cli, agent configs, and the agent CLI itself. First run takes ~1 minute to warm up.
155
86
 
156
- If you already have [Bun](https://bun.sh) installed, a single command is enough:
87
+ Minimal example (Claude + Rust):
157
88
 
158
- ```bash
159
- bun install -g @bastani/atomic
89
+ ```jsonc
90
+ {
91
+ "image": "mcr.microsoft.com/devcontainers/rust:latest",
92
+ "features": {
93
+ "ghcr.io/devcontainers/features/common-utils": {},
94
+ "ghcr.io/flora131/atomic/claude:1": {},
95
+ "ghcr.io/devcontainers/features/github-cli:1": {}
96
+ },
97
+ "remoteEnv": {
98
+ "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"
99
+ }
100
+ }
160
101
  ```
161
102
 
162
- This installs the `atomic` binary on your PATH. `bun update -g @bastani/atomic` upgrades to the latest release.
103
+ Use the [Dev Containers VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) or the [Dev Container CLI](https://github.com/devcontainers/cli#dev-container-cli) to start the container.
163
104
 
164
- **Option C — Bootstrap script (installs bun + atomic + shell completions in one step):**
105
+ </details>
165
106
 
166
- For machines without Bun, the bootstrap scripts install Bun, Atomic, and shell completions together:
107
+ <details>
108
+ <summary><b>Migrating from the old standalone binary?</b></summary>
167
109
 
168
- macOS / Linux:
110
+ Atomic used to ship as a standalone binary. It's now an npm package. One-time migration:
169
111
 
170
112
  ```bash
171
- curl -fsSL https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
172
- ```
173
-
174
- Windows PowerShell 7+:
175
-
176
- ```powershell
177
- irm https://raw.githubusercontent.com/flora131/atomic/main/install.ps1 | iex
113
+ atomic uninstall
114
+ bun uninstall -g @bastani/atomic-workflows
115
+ rm -rf ~/.atomic ~/.copilot/skills ~/.opencode/skills
116
+ bun install -g @bastani/atomic
178
117
  ```
179
118
 
119
+ </details>
180
120
 
181
- > [!IMPORTANT]
182
- > **Migrating from the old standalone binary?** The old version of Atomic was a standalone binary. It is now distributed as an npm package. To migrate:
183
- >
184
- > 1. Uninstall the old binary: `atomic uninstall`
185
- > 2. Uninstall the old workflows package: `bun uninstall -g @bastani/atomic-workflows`
186
- > 3. Delete the old config directory: `rm -rf ~/.atomic`
187
- > 4. Remove legacy skill directories: `rm -rf ~/.copilot/skills ~/.opencode/skills`
188
- > 5. Re-install using any of the install options above
189
-
190
- ### 2. Generate Context Files
191
-
192
- Start a chat session and run `/init` to generate `CLAUDE.md` and `AGENTS.md`:
121
+ ### 2. Generate context files
193
122
 
194
123
  ```bash
195
124
  atomic chat -a <claude|opencode|copilot>
196
125
  ```
197
126
 
198
- ```
199
- /init
200
- ```
201
-
202
- This explores your codebase using sub-agents and generates documentation that gives coding agents the context they need.
127
+ Then type `/init`. Atomic explores your codebase with sub-agents and writes `CLAUDE.md` / `AGENTS.md` so every future session starts with the right context.
203
128
 
204
- ### 3. Managing Sessions
129
+ ### 3. Try Ralph (autonomous coding)
205
130
 
206
- Atomic runs every chat and workflow session inside [tmux](https://github.com/tmux/tmux) on a dedicated socket, isolated from any personal tmux sessions you may have running. Use the built-in `session` commands to manage them:
131
+ Ralph plans, implements, reviews, and debugs a task on its own up to 10 iterations, exiting after 2 consecutive clean reviews.
207
132
 
208
133
  ```bash
209
- # List all running sessions
210
- atomic session list
211
-
212
- # List only chat sessions
213
- atomic chat session list
214
-
215
- # List only workflow sessions
216
- atomic workflow session list
217
-
218
- # Connect to a session by name
219
- atomic session connect <session-name>
220
-
221
- # Interactive session picker (fuzzy-search)
222
- atomic session connect
223
-
224
- # Kill a session by name (prompts for confirmation)
225
- atomic session kill <session-name>
226
-
227
- # Kill all sessions in scope (prompts for confirmation)
228
- atomic session kill
134
+ atomic workflow -n ralph -a claude "Build a REST API for user management"
229
135
  ```
230
136
 
231
- Session names follow a predictable pattern:
137
+ > ⚠️ Workflows run with agent permission checks **disabled** so pipelines don't block on prompts. Run them in a [devcontainer](#containerized-execution) or [git worktree](https://git-scm.com/docs/git-worktree), not on your host. See [Security](#security-workflow-permissions-model).
232
138
 
233
- | Session type | Name format | Example |
234
- | ------------ | --------------------------- | -------------------------- |
235
- | Chat | `atomic-chat-<id>` | `atomic-chat-a1b2c3d4` |
236
- | Workflow | `atomic-wf-<workflow>-<id>` | `atomic-wf-ralph-x9y8z7w6` |
139
+ ### 4. Build your own workflow
237
140
 
238
- > **Tip:** If your terminal disconnects or you accidentally close the window, your session is still alive just run `atomic session connect <session-name>` to pick up where you left off.
239
-
240
- ### 4. Build a Workflow
241
-
242
- Every team has a process. Atomic lets you encode it as TypeScript — chain agent sessions together, pass transcripts between them, and run the whole thing from the CLI.
243
-
244
- Create a workflow project, install the SDK, and add your workflow file:
141
+ Every team has a process code review, CI checks, PR creation, approval, merge. Encode it as TypeScript once; everyone runs the same pipeline.
245
142
 
246
143
  ```bash
247
144
  bun init && bun add @bastani/atomic
248
145
  mkdir -p .atomic/workflows/review-to-merge/claude
249
146
  ```
250
147
 
251
- Here's one of the [canonical use cases](#what-you-can-build) — a team pipeline that reviews code, runs checks in parallel, creates a PR, notifies on Slack, waits for human approval, and merges:
148
+ Create `.atomic/workflows/review-to-merge/claude/index.ts`:
252
149
 
253
150
  ```ts
254
- // .atomic/workflows/review-to-merge/claude/index.ts
255
151
  import { defineWorkflow } from "@bastani/atomic/workflows";
256
152
 
257
153
  export default defineWorkflow({
@@ -259,60 +155,38 @@ export default defineWorkflow({
259
155
  description: "Review → CI → PR → Notify → Approve → Merge",
260
156
  }).for<"claude">()
261
157
  .run(async (ctx) => {
262
- // Step 1: Review the changes
263
- const review = await ctx.stage(
264
- { name: "review", description: "Review code changes" },
265
- {}, {},
266
- async (s) => {
267
- await s.session.query(
268
- "Review all uncommitted changes. Flag issues with correctness, security, and style.",
269
- );
270
- s.save(s.sessionId);
271
- },
272
- );
158
+ // 1. Review
159
+ const review = await ctx.stage({ name: "review" }, {}, {}, async (s) => {
160
+ await s.session.query("Review uncommitted changes for correctness, security, style.");
161
+ s.save(s.sessionId);
162
+ });
273
163
 
274
- // Step 2: Run security and CI checks in parallel
164
+ // 2. Run security + CI in parallel
275
165
  await Promise.all([
276
166
  ctx.stage({ name: "security-scan" }, {}, {}, async (s) => {
277
- await s.session.query("Run `bun audit` and scan for leaked secrets or credentials.");
167
+ await s.session.query("Run `bun audit` and scan for leaked secrets.");
278
168
  s.save(s.sessionId);
279
169
  }),
280
170
  ctx.stage({ name: "ci-checks" }, {}, {}, async (s) => {
281
- await s.session.query("Run `bun lint` and `bun test`. Report any failures.");
171
+ await s.session.query("Run `bun lint` and `bun test`. Report failures.");
282
172
  s.save(s.sessionId);
283
173
  }),
284
174
  ]);
285
175
 
286
- // Step 3: Create a PR with the review summary
287
- await ctx.stage({ name: "create-pr" }, {}, {}, async (s) => {
288
- const transcript = await s.transcript(review);
289
- await s.session.query(
290
- `Read the review at ${transcript.path}. Create a pull request summarizing the changes.`,
291
- );
292
- s.save(s.sessionId);
293
- });
294
-
295
- // Step 4: Notify on Slack, then wait for human approval before merging.
296
- // Stage callbacks are plain Bun code — fetch(), Bun.spawn(), and any
297
- // Node API work here alongside agent session queries.
176
+ // 3. Open PR, then notify Slack + wait for human approval
298
177
  await ctx.stage({ name: "notify-and-merge" }, {}, {}, async (s) => {
178
+ const t = await s.transcript(review);
179
+ await s.session.query(`Read ${t.path}. Open a PR summarizing the changes.`);
180
+
299
181
  await fetch("https://slack.com/api/chat.postMessage", {
300
182
  method: "POST",
301
- headers: {
302
- Authorization: `Bearer ${process.env.SLACK_TOKEN}`,
303
- "Content-Type": "application/json",
304
- },
305
- body: JSON.stringify({
306
- channel: "#code-review",
307
- text: "New PR ready for review — please approve in GitHub.",
308
- }),
183
+ headers: { Authorization: `Bearer ${process.env.SLACK_TOKEN}` },
184
+ body: JSON.stringify({ channel: "#code-review", text: "PR ready — please approve." }),
309
185
  });
310
186
 
311
- // Human-in-the-loop: AskUserQuestion pauses the session until the
312
- // user responds. The agent won't merge until approval is given.
187
+ // Human-in-the-loop: pauses until the user responds
313
188
  await s.session.query(
314
- "The team has been notified on Slack. Ask the user to confirm the PR " +
315
- "is approved, then merge it with `gh pr merge --squash`.",
189
+ "Ask the user to confirm approval, then merge with `gh pr merge --squash`.",
316
190
  { allowedTools: ["Bash", "Read", "AskUserQuestion"] },
317
191
  );
318
192
  s.save(s.sessionId);
@@ -327,9 +201,96 @@ Run it:
327
201
  atomic workflow -n review-to-merge -a claude
328
202
  ```
329
203
 
330
- This single file demonstrates multi-step pipelines, parallel stages (`Promise.all`), transcript passing between sessions, external API calls (`fetch`), and human-in-the-loop approval — all in plain TypeScript. Swap `-a claude` for `-a opencode` or `-a copilot` to run the same harness on a different agent. See [Workflow SDK — Build Your Own Harness](#workflow-sdk--build-your-own-deterministic-harness) for the full API and more examples.
204
+ Swap `-a claude` for `-a opencode` or `-a copilot` same harness, different agent. See [Workflow SDK](#workflow-sdk--build-your-own-deterministic-harness) for parallel stages, input schemas, headless stages, and the full API reference.
205
+
206
+ ### Managing sessions
207
+
208
+ Every chat and workflow runs inside an isolated [tmux](https://github.com/tmux/tmux) session on a dedicated socket (your personal tmux is untouched). If your terminal disconnects, your session keeps running — reconnect anytime.
209
+
210
+ ```bash
211
+ atomic session list # all sessions
212
+ atomic session connect # interactive fuzzy picker
213
+ atomic session connect <name> # by name
214
+ atomic session kill <name> # kill one (or all, with confirmation)
215
+ ```
331
216
 
332
- > **Want something that works out of the box?** Atomic ships with `ralph`, a built-in workflow that plans, implements, reviews, and debugs autonomously see [Autonomous Execution (Ralph)](#autonomous-execution-ralph).
217
+ Session names follow `atomic-chat-<id>` or `atomic-wf-<workflow>-<id>`. Scope with `atomic chat session …` or `atomic workflow session …`.
218
+
219
+ Need a workflow to run in the background while you do something else? Pass `-d` / `--detach`:
220
+
221
+ ```bash
222
+ atomic workflow -n ralph -a claude -d "build the auth module" # returns immediately
223
+ atomic workflow session connect atomic-wf-claude-ralph-<id> # attach later
224
+ ```
225
+
226
+ Detached mode is what you want for scripted / CI automation and long-running tasks — the orchestrator keeps running on the atomic tmux socket regardless of your terminal.
227
+
228
+ ---
229
+
230
+ ## Why Atomic
231
+
232
+ Better models make harnesses **more** important, not less. The more you trust an agent to execute complex tasks, the more value you get from defining exactly **what** it should execute, in **what order**, with **what checks** along the way. The harness is the durable layer — models keep improving underneath it, but your process stays the same.
233
+
234
+ - **Start for yourself.** Automate the repetitive parts of your own workflow — research a codebase, add monitoring, generate specs. One TypeScript file, one afternoon.
235
+ - **Scale to your team.** Encode your team's review process, deployment gates, and quality checks as TypeScript every member runs identically — versioned, testable, reproducible.
236
+ - **Work across agents.** Write a harness once, run it on Claude Code, OpenCode, or Copilot CLI with a flag change.
237
+
238
+ ### Example use cases
239
+
240
+ **Add production monitoring.** Research observability gaps, implement missing metrics and health checks, review the changes.
241
+
242
+ ```bash
243
+ atomic workflow -n add-monitoring -a claude "add Prometheus metrics and health checks to all API endpoints"
244
+ ```
245
+
246
+ **Parallel UX testing with 50 personas.** Spin up 50 agents, each with a distinct persona (power user, accessibility-dependent, non-technical stakeholder), each using [Playwright](#built-in-skills) to test your app.
247
+
248
+ ```bash
249
+ atomic workflow -n ux-personas -a claude
250
+ ```
251
+
252
+ **Review-to-merge pipeline.** The workflow from [step 4](#4-build-your-own-workflow) above — reviews code, runs CI in parallel, opens a PR, notifies Slack, waits for approval, merges.
253
+
254
+ ---
255
+
256
+ ## Table of Contents
257
+
258
+ - [Quick Start](#quick-start)
259
+ - [Why Atomic](#why-atomic)
260
+ - [Security: Workflow Permissions Model](#security-workflow-permissions-model)
261
+ - [Core Features](#core-features)
262
+ - [Multi-Agent Support](#multi-agent-support)
263
+ - [Workflow SDK](#workflow-sdk--build-your-own-deterministic-harness)
264
+ - [Research Codebase](#research-codebase)
265
+ - [Autonomous Execution (Ralph)](#autonomous-execution-ralph)
266
+ - [Deep Research Codebase](#deep-research-codebase)
267
+ - [Containerized Execution](#containerized-execution)
268
+ - [Specialized Sub-Agents](#specialized-sub-agents)
269
+ - [Built-in Skills](#built-in-skills)
270
+ - [Workflow Orchestrator Panel](#workflow-orchestrator-panel)
271
+ - [Commands Reference](#commands-reference)
272
+ - [Configuration](#configuration)
273
+ - [Updating & Uninstalling](#updating--uninstalling)
274
+ - [Troubleshooting](#troubleshooting)
275
+ - [FAQ](#faq)
276
+ - [Contributing](#contributing)
277
+ - [License](#license)
278
+ - [Credits](#credits)
279
+
280
+ ---
281
+
282
+ ## Security: Workflow Permissions Model
283
+
284
+ > [!CAUTION]
285
+ > **Atomic workflows run coding agents with all permission checks disabled.** The agent can read, write, and delete files, execute arbitrary shell commands, and make network requests without prompting. This is required for unattended pipelines. **Run workflows in a [devcontainer](#containerized-execution), not on your host machine.**
286
+
287
+ | Agent | How permissions are bypassed | Key flags / settings |
288
+ | ---------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------- |
289
+ | **Claude Code** | CLI flag disables the interactive permission prompt entirely | `--dangerously-skip-permissions` |
290
+ | **GitHub Copilot CLI** | CLI flag enables auto-execution; SDK auto-approves all tool requests | `--yolo`, `COPILOT_ALLOW_ALL=true`, `onPermissionRequest: approveAll` |
291
+ | **OpenCode** | Permissions handled programmatically through the event stream | Permission requests auto-replied via SSE events |
292
+
293
+ Defaults live in `src/services/config/definitions.ts` and `src/sdk/runtime/executor.ts`. Override per-project via `ProviderOverrides` in `.atomic/settings.json` — `chatFlags` replaces defaults entirely; `envVars` are merged.
333
294
 
334
295
  ---
335
296
 
@@ -337,7 +298,7 @@ This single file demonstrates multi-step pipelines, parallel stages (`Promise.al
337
298
 
338
299
  ### Multi-Agent Support
339
300
 
340
- Atomic works across **three production coding agents** — switch between them with a flag and your workflows, skills, and sub-agents carry over.
301
+ Atomic works across **three production coding agents** — switch with a flag and your workflows, skills, and sub-agents carry over.
341
302
 
342
303
  | Agent | Command |
343
304
  | ------------------ | ------------------------- |
@@ -345,23 +306,24 @@ Atomic works across **three production coding agents** — switch between them w
345
306
  | OpenCode | `atomic chat -a opencode` |
346
307
  | GitHub Copilot CLI | `atomic chat -a copilot` |
347
308
 
348
- Each agent gets its own configuration directory (`.claude/`, `.opencode/`, `.github/`), skills, and context files — all managed by Atomic. Write a workflow once, run it on any agent.
309
+ Each agent gets its own configuration directory (`.claude/`, `.opencode/`, `.github/`), skills, and context files — all managed by Atomic.
349
310
 
350
311
  ### Workflow SDK — Build Your Own Deterministic Harness
351
312
 
352
- Every team has a process — triage bugs this way, ship features that way, review PRs with these checks. Most of it lives in a wiki nobody reads or in one senior engineer's head. The **Workflow SDK** (`@bastani/atomic/workflows`) lets you encode that process as TypeScript — spawn agent sessions dynamically with native control flow (`for`, `if`, `Promise.all()`), and watch them appear in a live graph as they execute.
313
+ The Workflow SDK (`@bastani/atomic/workflows`) lets you encode your team's process as TypeScript — spawn agent sessions dynamically with native control flow (`for`, `if`, `Promise.all()`), and watch them appear in a live graph as they execute.
353
314
 
354
- Set up a workflow project (`bun init && bun add @bastani/atomic`), create a `.ts` file in `.atomic/workflows/<name>/<agent>/index.ts`, and run it:
315
+ Set up a workflow project (`bun init && bun add @bastani/atomic`), create `.atomic/workflows/<name>/<agent>/index.ts`, and run it:
355
316
 
356
317
  ```bash
357
318
  atomic workflow -n my-workflow -a claude "describe this project"
358
319
  ```
359
320
 
321
+ See [step 4 of Quick Start](#4-build-your-own-workflow) for a complete review-to-merge example. More examples and the full API reference below.
322
+
360
323
  <details>
361
- <summary>Example: Sequential workflow (describe -> summarize)</summary>
324
+ <summary><b>Example: Sequential workflow (describe summarize)</b></summary>
362
325
 
363
326
  ```ts
364
- // .atomic/workflows/my-workflow/claude/index.ts
365
327
  import { defineWorkflow } from "@bastani/atomic/workflows";
366
328
 
367
329
  export default defineWorkflow({
@@ -386,9 +348,7 @@ export default defineWorkflow({
386
348
  {}, {},
387
349
  async (s) => {
388
350
  const research = await s.transcript(describe);
389
- await s.session.query(
390
- `Read ${research.path} and summarize it in 2-3 bullet points.`,
391
- );
351
+ await s.session.query(`Read ${research.path} and summarize in 2-3 bullets.`);
392
352
  s.save(s.sessionId);
393
353
  },
394
354
  );
@@ -399,7 +359,7 @@ export default defineWorkflow({
399
359
  </details>
400
360
 
401
361
  <details>
402
- <summary>Example: Parallel workflow (describe -> [summarize-a, summarize-b] -> merge)</summary>
362
+ <summary><b>Example: Parallel workflow (describe [summarize-a, summarize-b] merge)</b></summary>
403
363
 
404
364
  ```ts
405
365
  import { defineWorkflow } from "@bastani/atomic/workflows";
@@ -412,23 +372,20 @@ export default defineWorkflow({
412
372
  .run(async (ctx) => {
413
373
  const prompt = ctx.inputs.prompt ?? "";
414
374
 
415
- const describe = await ctx.stage(
416
- { name: "describe" }, {}, {},
417
- async (s) => {
418
- await s.session.query(prompt);
419
- s.save(s.sessionId);
420
- },
421
- );
375
+ const describe = await ctx.stage({ name: "describe" }, {}, {}, async (s) => {
376
+ await s.session.query(prompt);
377
+ s.save(s.sessionId);
378
+ });
422
379
 
423
380
  const [summarizeA, summarizeB] = await Promise.all([
424
381
  ctx.stage({ name: "summarize-a" }, {}, {}, async (s) => {
425
382
  const research = await s.transcript(describe);
426
- await s.session.query(`Read ${research.path} and summarize in 2-3 bullet points.`);
383
+ await s.session.query(`Read ${research.path} and summarize in 2-3 bullets.`);
427
384
  s.save(s.sessionId);
428
385
  }),
429
386
  ctx.stage({ name: "summarize-b" }, {}, {}, async (s) => {
430
387
  const research = await s.transcript(describe);
431
- await s.session.query(`Read ${research.path} and summarize in a single sentence.`);
388
+ await s.session.query(`Read ${research.path} and summarize in one sentence.`);
432
389
  s.save(s.sessionId);
433
390
  }),
434
391
  ]);
@@ -448,12 +405,11 @@ export default defineWorkflow({
448
405
  </details>
449
406
 
450
407
  <details>
451
- <summary>Example: Structured-input workflow (declared schema + CLI flag validation)</summary>
408
+ <summary><b>Example: Structured-input workflow (declared schema + CLI flag validation)</b></summary>
452
409
 
453
- Declare an `inputs` array on `defineWorkflow` and the CLI materialises one `--<field>=<value>` flag per entry. Required fields, enum membership, and unknown-flag rejection are all validated before any tmux session is spawned. The interactive picker (`atomic workflow -a <agent>`) renders the same schema as a form.
410
+ Declare `inputs` on `defineWorkflow` and the CLI materialises one `--<field>=<value>` flag per entry. Required fields, enum membership, and unknown-flag rejection are validated before any tmux session spawns. The interactive picker renders the same schema as a form.
454
411
 
455
412
  ```ts
456
- // .atomic/workflows/gen-spec/claude/index.ts
457
413
  import { defineWorkflow } from "@bastani/atomic/workflows";
458
414
 
459
415
  export default defineWorkflow({
@@ -483,7 +439,6 @@ export default defineWorkflow({
483
439
  ],
484
440
  }).for<"claude">()
485
441
  .run(async (ctx) => {
486
- // Read each declared field by name.
487
442
  const { research_doc, focus } = ctx.inputs;
488
443
  const notes = ctx.inputs.notes ?? "";
489
444
 
@@ -498,7 +453,7 @@ export default defineWorkflow({
498
453
  .compile();
499
454
  ```
500
455
 
501
- Run it either way:
456
+ Run it:
502
457
 
503
458
  ```bash
504
459
  # Named + flags (scriptable; CI-friendly)
@@ -506,16 +461,16 @@ atomic workflow -n gen-spec -a claude \
506
461
  --research_doc=research/docs/2026-04-11-auth.md \
507
462
  --focus=standard
508
463
 
509
- # Picker (fuzzy-search the workflow list, then fill the form)
464
+ # Picker (fuzzy-search workflows, fill the form)
510
465
  atomic workflow -a claude
511
466
  ```
512
467
 
513
468
  </details>
514
469
 
515
470
  <details>
516
- <summary>Example: Background (headless) stages for parallel data gathering</summary>
471
+ <summary><b>Example: Headless (background) stages for parallel data gathering</b></summary>
517
472
 
518
- Stages can run in **headless mode** (`headless: true`) — they execute the provider SDK in-process instead of spawning a tmux window. Headless stages are invisible in the workflow graph but tracked via a background task counter in the statusline. Use them for parallel data-gathering tasks that don't need a visible TUI.
473
+ Stages can run headlessly (`headless: true`) — they execute the provider SDK in-process instead of spawning a tmux window. Headless stages are invisible in the graph but tracked via a background counter in the statusline.
519
474
 
520
475
  ```ts
521
476
  import { defineWorkflow, extractAssistantText } from "@bastani/atomic/workflows";
@@ -528,10 +483,8 @@ export default defineWorkflow({
528
483
  .run(async (ctx) => {
529
484
  const prompt = ctx.inputs.prompt ?? "";
530
485
 
531
- // Visible stage: generate seed data
532
486
  const seed = await ctx.stage(
533
- { name: "seed", description: "Generate overview" },
534
- {}, {},
487
+ { name: "seed", description: "Generate overview" }, {}, {},
535
488
  async (s) => {
536
489
  const result = await s.session.query(prompt);
537
490
  s.save(s.sessionId);
@@ -539,7 +492,6 @@ export default defineWorkflow({
539
492
  },
540
493
  );
541
494
 
542
- // Three parallel headless stages — invisible in graph, tracked by counter
543
495
  const [pros, cons, uses] = await Promise.all([
544
496
  ctx.stage({ name: "pros", headless: true }, {}, {}, async (s) => {
545
497
  const r = await s.session.query(`List 3 pros:\n\n${seed.result}`);
@@ -558,10 +510,8 @@ export default defineWorkflow({
558
510
  }),
559
511
  ]);
560
512
 
561
- // Visible stage: merge background results
562
513
  await ctx.stage(
563
- { name: "merge", description: "Combine results" },
564
- {}, {},
514
+ { name: "merge", description: "Combine results" }, {}, {},
565
515
  async (s) => {
566
516
  await s.session.query(
567
517
  `Combine:\n\n## Pros\n${pros.result}\n\n## Cons\n${cons.result}\n\n## Uses\n${uses.result}`,
@@ -581,38 +531,34 @@ The graph shows `seed → merge` — headless stages are transparent to the topo
581
531
 
582
532
  | Capability | Description |
583
533
  | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
584
- | **Dynamic session spawning** | Call `ctx.stage()` to spawn sessions at runtime — each gets its own tmux window and graph node |
585
- | **Native TypeScript control flow** | Use `for`, `if/else`, `Promise.all()`, `try/catch` — no framework DSL needed |
534
+ | **Dynamic session spawning** | `ctx.stage()` spawns sessions at runtime — each gets its own tmux window and graph node |
535
+ | **Native TypeScript control flow** | Use `for`, `if/else`, `Promise.all()`, `try/catch` — no framework DSL |
586
536
  | **Session return values** | Session callbacks can return data: `const h = await ctx.stage(...); h.result` |
587
- | **Transcript passing** | Access prior session output via handle (`s.transcript(handle)`) or name (`s.transcript("name")`) |
588
- | **Declared input schemas** | Add an `inputs: [...]` array to `defineWorkflow()` and the CLI materialises `--<field>=<value>` flags with built-in validation (required fields, enum membership, unknown flags) |
589
- | **Interactive picker** | `atomic workflow -a <agent>` launches a fuzzy-searchable picker that renders each workflow's input schema as a form — no flag-memorisation required |
590
- | **Nested sub-sessions** | Call `s.stage()` inside a session callback to spawn child sessions — visible as nested nodes in the graph |
591
- | **Auto-inferred graph** | Graph topology auto-inferred from `await`/`Promise.all` patterns — no annotations needed |
592
- | **Provider-agnostic** | Write raw SDK code for Claude, Copilot, or OpenCode inside each session callback |
593
- | **Live graph visualization** | Sessions appear in the TUI graph as they're spawned — loops and conditionals are visible in real time |
594
- | **Background (headless) stages** | Set `headless: true` on `ctx.stage()` to run stages in-process without a tmux window — invisible in graph, tracked by statusline counter, identical callback API |
537
+ | **Transcript passing** | Access prior output via handle (`s.transcript(handle)`) or name (`s.transcript("name")`) |
538
+ | **Declared input schemas** | Add an `inputs: [...]` array and the CLI materialises `--<field>=<value>` flags with built-in validation |
539
+ | **Interactive picker** | `atomic workflow -a <agent>` renders input schemas as forms — no flag memorisation |
540
+ | **Nested sub-sessions** | `s.stage()` inside a callback spawns child sessions — visible as nested graph nodes |
541
+ | **Auto-inferred graph** | Topology derived from `await` / `Promise.all` patterns — no annotations |
542
+ | **Provider-agnostic** | Write raw SDK code for Claude, Copilot, or OpenCode inside each callback |
543
+ | **Live graph visualization** | Sessions appear in the TUI graph as they spawn — loops and conditionals visible in real time |
544
+ | **Background (headless) stages** | `headless: true` runs in-process without a tmux window — invisible in graph, tracked by statusline counter, identical callback API |
595
545
 
596
546
  **Deterministic execution guarantees:**
597
547
 
598
- Workflows are deterministic by design — the same definition always produces the same execution order with the same data flow, regardless of when or where you run it.
548
+ Workflows are deterministic by design — the same definition produces the same execution order with the same data flow, anywhere.
599
549
 
600
- - **Strict step ordering** — Steps execute sequentially. Step 2 never starts until Step 1 finishes. Parallel sessions within a step all complete (or fail fast) before the next step begins.
601
- - **Frozen definitions** — `.compile()` freezes the workflow structure. Once compiled, the step order, session names, and execution graph are immutable.
602
- - **Controlled transcript access** — Sessions can only read transcripts from *completed* upstream sessions. Parallel siblings are blocked from reading each other, eliminating race conditions on shared state.
603
- - **Isolated context windows** — Each session runs in its own tmux pane with a fresh context window. No session inherits stale state from another — data flows only through explicit `ctx.transcript()` and `ctx.getMessages()` calls.
604
- - **Persisted artifacts** — Every session writes its messages, transcript, and metadata to disk. The workflow produces a complete, inspectable execution record you can replay or debug after the fact.
550
+ - **Strict step ordering** — Step 2 never starts until Step 1 finishes. Parallel sessions complete (or fail fast) before the next step begins.
551
+ - **Frozen definitions** — `.compile()` freezes the workflow. Once compiled, step order, session names, and the execution graph are immutable.
552
+ - **Controlled transcript access** — Sessions only read transcripts from *completed* upstream sessions; parallel siblings can't read each other.
553
+ - **Isolated context windows** — Each session runs in its own tmux pane with a fresh context. Data flows only through explicit `ctx.transcript()` / `ctx.getMessages()` calls.
554
+ - **Persisted artifacts** — Every session writes messages, transcript, and metadata to disk a complete, inspectable execution record.
605
555
 
606
- This means you can run the same workflow on different machines, different agents, or at different times and get structurally identical execution — same steps, same data flow, same ordering. The only variance comes from the LLM's responses, not from the harness.
556
+ Variance comes only from the LLM's responses, not from the harness.
607
557
 
608
- Set up a project (`bun init && bun add @bastani/atomic`), drop a `.ts` file in `.atomic/workflows/<name>/<agent>/index.ts`, and run it. You can also ask Atomic to create workflows for you:
609
-
610
- ```
611
- Use your workflow-creator skill to create a workflow that plans, implements, and reviews a feature.
612
- ```
558
+ > Ask Atomic to build workflows for you: `Use your workflow-creator skill to create a workflow that plans, implements, and reviews a feature.`
613
559
 
614
560
  <details>
615
- <summary>Full Workflow SDK Reference</summary>
561
+ <summary><b>Full Workflow SDK Reference</b></summary>
616
562
 
617
563
  #### Builder API
618
564
 
@@ -638,7 +584,7 @@ Use your workflow-creator skill to create a workflow that plans, implements, and
638
584
  | -------------------------------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
639
585
  | `s.client` | `ProviderClient<A>` | Pre-created SDK client (auto-managed by runtime) |
640
586
  | `s.session` | `ProviderSession<A>` | Pre-created provider session (auto-managed by runtime) |
641
- | `s.inputs` | `{ [K in N]?: string }` | Same typed inputs as `ctx.inputs`, forwarded into every stage so session callbacks can read values without closing over the outer `ctx` |
587
+ | `s.inputs` | `{ [K in N]?: string }` | Same typed inputs as `ctx.inputs`, forwarded into every stage so callbacks can read values without closing over the outer `ctx` |
642
588
  | `s.agent` | `AgentType` | Which agent is running |
643
589
  | `s.paneId` | `string` | tmux pane ID for this session |
644
590
  | `s.sessionId` | `string` | Session UUID |
@@ -656,7 +602,7 @@ Use your workflow-creator skill to create a workflow that plans, implements, and
656
602
  | `description` | `string?` | Human-readable description shown in the graph |
657
603
  | `headless` | `boolean?` | When `true`, run in-process without a tmux window — invisible in graph, tracked by background counter |
658
604
 
659
- The runtime auto-infers parent-child edges from execution order: sequential `await` creates a chain, while `Promise.all` creates parallel fan-out/fan-in — no annotations needed.
605
+ The runtime auto-infers parent-child edges from execution order: sequential `await` creates a chain, `Promise.all` creates parallel fan-out/fan-in — no annotations needed.
660
606
 
661
607
  #### Saving Transcripts
662
608
 
@@ -680,73 +626,57 @@ The runtime auto-creates `s.client` and `s.session` — use them directly inside
680
626
 
681
627
  #### Key Rules
682
628
 
683
- 1. Every workflow file must use `export default` with `.run()` and `.compile()`
629
+ 1. Every workflow file must `export default` a builder with `.run()` and `.compile()`
684
630
  2. Session names must be unique within a workflow run
685
631
  3. `transcript()` / `getMessages()` only access completed sessions (callback returned + saves flushed)
686
632
  4. Each session runs in its own tmux window with the chosen agent
687
- 5. Workflows are organized per-workflow: `.atomic/workflows/<name>/<agent>/index.ts`
688
- 6. Set up your workflow project with `bun init && bun add @bastani/atomic` — standard module resolution handles imports
633
+ 5. Workflows are organized as `.atomic/workflows/<name>/<agent>/index.ts`
634
+ 6. Set up your workflow project with `bun init && bun add @bastani/atomic`
689
635
  7. Background (headless) stages use the same callback API — `s.client`, `s.session`, `s.save()`, return values all work identically
690
636
 
691
- For the authoring walkthrough with worked examples, ask Atomic to use the `workflow-creator` skill or read the skill reference at `.agents/skills/workflow-creator/`.
637
+ For the authoring walkthrough ask Atomic to use the `workflow-creator` skill or read `.agents/skills/workflow-creator/`.
692
638
 
693
639
  > [!TIP]
694
- > **Keeping workflows up to date:** When the Workflow SDK is updated (new return types, new options, deprecated patterns), you can ask the `workflow-creator` skill to migrate your existing workflows to the latest best practices. Just open your workflow file and ask: _"Update this workflow to use the latest SDK patterns."_ The skill stays current with the SDK and will apply the right changes automatically.
640
+ > When the Workflow SDK is updated, ask the `workflow-creator` skill to migrate your workflows to the latest patterns: _"Update this workflow to use the latest SDK patterns."_
695
641
 
696
642
  </details>
697
643
 
698
644
  ### Research Codebase
699
645
 
700
- The `/research-codebase` command dispatches **specialized sub-agents in parallel** to analyze your codebase:
701
-
702
- - Understand how authentication flows work in an unfamiliar codebase
703
- - Track down root causes by analyzing code paths across dozens of files
704
- - Search through docs, READMEs, and inline documentation
705
- - Query external documentation via [DeepWiki MCP](https://deepwiki.com) integration
706
- - Get up to speed on a new project in minutes instead of hours
707
-
708
- **Research sub-agents:**
646
+ The `/research-codebase` command dispatches **specialized sub-agents in parallel** to analyze your codebase — understand auth flows, trace root causes, query docs, and hit external sources via [DeepWiki MCP](https://deepwiki.com). Get up to speed on a new project in minutes instead of hours.
709
647
 
710
648
  | Sub-Agent | Model | Purpose |
711
649
  | ---------------------------- | ------ | ----------------------------------------------------------------------------------------- |
712
650
  | `codebase-locator` | Haiku | Locate files, directories, and components relevant to the research topic |
713
- | `codebase-analyzer` | Sonnet | Analyze implementation details, trace data flow, and explain technical workings |
651
+ | `codebase-analyzer` | Sonnet | Analyze implementation details, trace data flow, explain technical workings |
714
652
  | `codebase-pattern-finder` | Haiku | Find similar implementations, usage examples, and existing patterns to model after |
715
- | `codebase-online-researcher` | Sonnet | Fetch up-to-date information from the web and repository-specific knowledge from DeepWiki |
653
+ | `codebase-online-researcher` | Sonnet | Fetch up-to-date information from the web and repository knowledge from DeepWiki |
716
654
  | `codebase-research-locator` | Haiku | Discover relevant documents in `research/` and `specs/` directories |
717
655
  | `codebase-research-analyzer` | Sonnet | Extract high-value insights, decisions, and technical details from research documents |
718
656
 
719
- **Why specialized research agents instead of one general-purpose agent?**
657
+ **Run parallel research sessions** to compare approaches:
720
658
 
721
- A single agent asked to "research the auth system" will try to search, read, analyze, and summarize — all within one context window. As that window fills with file contents, search results, and intermediate reasoning, the agent's ability to synthesize degrades. This is a fundamental constraint of transformer-based models: attention quality drops as context length grows.
659
+ ```bash
660
+ # Terminal 1: LangChain approach
661
+ atomic chat -a claude "/research-codebase Research GraphRAG using LangChain's graph retrieval."
722
662
 
723
- Atomic solves this by dispatching **purpose-built sub-agents** — a `codebase-locator` that only finds relevant files, a `codebase-analyzer` that only reads and analyzes implementation details, a `codebase-online-researcher` that only queries external documentation. Each agent operates in its own context window with only the tools it needs. The parent agent receives distilled findings from each sub-agent, keeping its own context clean for synthesis.
663
+ # Terminal 2: Microsoft GraphRAG
664
+ atomic chat -a claude "/research-codebase Research GraphRAG using microsoft/graphrag."
724
665
 
725
- This mirrors how effective engineering teams work: you don't send one person to simultaneously search the codebase, read the docs, and analyze the architecture. You parallelize. The result is faster research, higher-quality findings, and significantly less hallucination — because each agent is reasoning over a small, focused context rather than a bloated one.
666
+ # Terminal 3: LlamaIndex approach
667
+ atomic chat -a claude "/research-codebase Research GraphRAG using LlamaIndex's property graph."
668
+ ```
726
669
 
727
- **Run parallel research sessions** to evaluate competing approaches simultaneously:
670
+ Then run `/create-spec` on each output, spin up git worktrees, and run `atomic workflow -n ralph` in each — wake up to three complete implementations on separate branches. Research persists in `research/` and specs in `specs/`, so every investigation compounds into future context.
728
671
 
729
- ```bash
730
- # Terminal 1: Research LangChain approach
731
- atomic chat -a claude "/research-codebase Research implementing GraphRAG using \
732
- LangChain's graph retrieval patterns. Look up langchain-ai/langchain for \
733
- graph store integrations."
734
-
735
- # Terminal 2: Research Microsoft's GraphRAG
736
- atomic chat -a claude "/research-codebase Research implementing GraphRAG using \
737
- Microsoft's GraphRAG library. Look up microsoft/graphrag for their \
738
- community detection pipeline."
739
-
740
- # Terminal 3: Research LlamaIndex approach
741
- atomic chat -a claude "/research-codebase Research implementing GraphRAG using \
742
- LlamaIndex's property graph index. Look up run-llama/llama_index."
743
- ```
672
+ <details>
673
+ <summary><i>Why specialized research agents instead of one general-purpose agent?</i></summary>
744
674
 
745
- Each agent spawns sub-agents that query DeepWiki, pull external documentation, and cross-reference with your codebase. Then run `/create-spec` on each research doc, spin up git worktrees, and run `atomic workflow -n ralph` in each wake up to three complete implementations on separate branches.
675
+ A single agent asked to "research the auth system" tries to search, read, analyze, and summarize within one context window. As that window fills with file contents, search results, and intermediate reasoning, synthesis degrades this is a fundamental constraint of transformer attention, not a prompt-engineering problem.
746
676
 
747
- > Works identically with `atomic chat -a opencode` and `atomic chat -a copilot`.
677
+ Atomic dispatches purpose-built sub-agents: a `codebase-locator` only finds relevant files, a `codebase-analyzer` only reads and analyzes implementations, a `codebase-online-researcher` only queries external docs. Each operates in its own context with only the tools it needs; the parent receives distilled findings. The result: faster research, higher-quality findings, less hallucination.
748
678
 
749
- Research outputs persist in your `research/` directory and specs persist in your `specs/` directory — both become context for future sessions, so every investigation and every specification compounds.
679
+ </details>
750
680
 
751
681
  ### Autonomous Execution (Ralph)
752
682
 
@@ -754,15 +684,15 @@ Research outputs persist in your `research/` directory and specs persist in your
754
684
  <img src="assets/ralph-wiggum.jpg" alt="Ralph Wiggum" width="600">
755
685
  </p>
756
686
 
757
- The [Ralph Method](https://ghuntley.com/ralph/) enables **multi-hour autonomous coding sessions**. After approving your spec, let Ralph work in the background while you focus on other tasks.
687
+ The [Ralph Method](https://ghuntley.com/ralph/) enables **multi-hour autonomous coding sessions**. Approve your spec, let Ralph work in the background, focus on other things.
758
688
 
759
689
  **How Ralph works:**
760
690
 
761
- 1. **Task Decomposition** — A `planner` sub-agent breaks your spec into a structured task list with dependency tracking, stored in a SQLite database with WAL mode for parallel access
762
- 2. **Orchestration** — An `orchestrator` sub-agent retrieves the task list, validates the dependency graph, and dispatches `worker` sub-agents for ready tasks with concurrent execution of independent tasks
763
- 3. **Review & Debug** — A `reviewer` sub-agent audits the implementation with structured JSON output; if actionable findings exist (P0–P2 severity), a `debugger` sub-agent investigates root causes and produces a markdown report that feeds back to the planner on the next iteration
691
+ 1. **Task Decomposition** — A `planner` sub-agent breaks your spec into a task list with dependency tracking, stored in SQLite (WAL mode for parallel access).
692
+ 2. **Orchestration** — An `orchestrator` retrieves the task list, validates the dependency graph, and dispatches `worker` sub-agents for ready tasks.
693
+ 3. **Review & Debug** — A `reviewer` audits the implementation with structured JSON output; if P0–P2 findings exist, a `debugger` investigates root causes and feeds back to the planner on the next iteration.
764
694
 
765
- **Loop configuration:** Ralph runs up to **10 iterations** and exits early after **2 consecutive clean reviews** (zero actionable findings). P3 (minor) findings are filtered as non-actionable.
695
+ **Loop config:** Up to **10 iterations**. Exits early after **2 consecutive clean reviews** (zero actionable findings). P3 (minor) findings are non-actionable.
766
696
 
767
697
  ```bash
768
698
  # From a prompt
@@ -772,7 +702,7 @@ atomic workflow -n ralph -a <claude|opencode|copilot> "Build a REST API for user
772
702
  atomic workflow -n ralph -a claude "specs/YYYY-MM-DD-my-feature.md"
773
703
  ```
774
704
 
775
- **Best practice:** Run Ralph in a separate [git worktree](https://git-scm.com/docs/git-worktree) to isolate autonomous execution:
705
+ **Best practice:** run Ralph in a [git worktree](https://git-scm.com/docs/git-worktree) so autonomous changes stay isolated from your working tree:
776
706
 
777
707
  ```bash
778
708
  git worktree add ../my-project-ralph feature-branch
@@ -782,45 +712,29 @@ atomic workflow -n ralph -a claude "Build the auth module"
782
712
 
783
713
  ### Deep Research Codebase
784
714
 
785
- Atomic also ships with `deep-research-codebase`, a built-in workflow that performs **multi-agent parallel research** across your codebase. While `/research-codebase` is a single-shot command, the `deep-research-codebase` workflow is a full multi-stage pipeline:
715
+ Atomic ships a `deep-research-codebase` workflow that performs **multi-agent parallel research** across your codebase a full pipeline, not a single-shot command.
786
716
 
787
- 1. **Scout** — A single agent scans the codebase structure and produces an architectural orientation
788
- 2. **History** — A parallel agent surfaces prior research from `research/docs/`
789
- 3. **Explorers** — Multiple parallel agents (count scaled by LOC) each investigate a partition of the codebase, writing findings to scratch files
790
- 4. **Aggregator** — A final agent synthesizes all explorer reports + history into a dated research document at `research/docs/YYYY-MM-DD-<slug>.md`
717
+ 1. **Scout** — One agent scans the codebase structure and writes an architectural orientation.
718
+ 2. **History** — A parallel agent surfaces prior research from `research/docs/`.
719
+ 3. **Explorers** — Multiple parallel agents (count scaled by LOC) each investigate a partition.
720
+ 4. **Aggregator** — A final agent synthesizes all explorer reports + history into a dated research doc at `research/docs/YYYY-MM-DD-<slug>.md`.
791
721
 
792
722
  ```bash
793
723
  atomic workflow -n deep-research-codebase -a claude "How does the authentication system work?"
794
724
  ```
795
725
 
796
- The workflow produces a permanent research artifact that can be referenced by future runs, specs, or other workflows.
726
+ The output is a permanent research artifact that future runs, specs, and workflows can reference.
797
727
 
798
728
  ### Containerized Execution
799
729
 
800
- Atomic ships as **devcontainer features** that bundle the CLI, agent, and all dependencies into isolated containers. This is the recommended way to run autonomous agents safely.
801
-
802
- ```jsonc
803
- // .devcontainer/devcontainer.json
804
- {
805
- "image": "mcr.microsoft.com/devcontainers/rust:latest",
806
- "features": {
807
- "ghcr.io/flora131/atomic/claude:1": {},
808
- "ghcr.io/devcontainers/features/github-cli:1": {}
809
- },
810
- "remoteEnv": {
811
- "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"
812
- }
813
- }
814
- ```
730
+ Atomic ships as **devcontainer features** that bundle the CLI, agent, and all dependencies into isolated containers the recommended way to run autonomous agents safely.
815
731
 
816
732
  **Why containerize?**
817
733
 
818
734
  - Agents run `rm`, `git reset --hard`, and arbitrary shell commands — containers limit blast radius
819
735
  - Reproducible environments across team members and CI
820
736
  - Pre-installed dependencies: bun, playwright-cli, agent CLI, GitHub CLI
821
- - Features are versioned in sync with Atomic releases
822
-
823
- Each feature installs Atomic + one agent. Mix and match across projects:
737
+ - Features versioned in sync with Atomic releases
824
738
 
825
739
  | Feature | Installs |
826
740
  | ------------------------------------ | -------------------- |
@@ -828,6 +742,8 @@ Each feature installs Atomic + one agent. Mix and match across projects:
828
742
  | `ghcr.io/flora131/atomic/opencode:1` | Atomic + OpenCode |
829
743
  | `ghcr.io/flora131/atomic/copilot:1` | Atomic + Copilot CLI |
830
744
 
745
+ See [Quick Start → Devcontainer](#1-install) for a working `.devcontainer.json` and the [`.devcontainer/`](./.devcontainer/) directory for per-agent templates.
746
+
831
747
  ### Specialized Sub-Agents
832
748
 
833
749
  Atomic dispatches **purpose-built sub-agents**, each with scoped context, tools, and termination conditions:
@@ -837,7 +753,7 @@ Atomic dispatches **purpose-built sub-agents**, each with scoped context, tools,
837
753
  | `planner` | Decompose specs into structured task lists with dependency tracking |
838
754
  | `worker` | Implement single focused tasks (multiple workers run in parallel) |
839
755
  | `reviewer` | Audit implementations against specs and best practices |
840
- | `code-simplifier` | Simplify and refine code for clarity, consistency, and maintainability |
756
+ | `code-simplifier` | Simplify and refine code for clarity, consistency, maintainability |
841
757
  | `orchestrator` | Coordinate complex multi-step workflows |
842
758
  | `codebase-analyzer` | Analyze implementation details of specific components |
843
759
  | `codebase-locator` | Locate files, directories, and components |
@@ -847,26 +763,30 @@ Atomic dispatches **purpose-built sub-agents**, each with scoped context, tools,
847
763
  | `codebase-research-locator` | Find documents in `research/` directory |
848
764
  | `debugger` | Debug errors, test failures, and unexpected behavior |
849
765
 
850
- **Why specialize?**
766
+ <details>
767
+ <summary><i>Why specialize instead of using one general-purpose agent?</i></summary>
851
768
 
852
- LLMs have a core architectural limitation: the more context they hold, the harder it becomes to attend to the right information at the right time. A single agent juggling a spec, dozens of files, tool outputs, and its own reasoning chain will lose track of details, repeat work, or hallucinate connections between unrelated code. This isn't a solvable prompt-engineering problem — it's how attention mechanisms work.
769
+ LLMs have an architectural limitation: the more context they hold, the harder it becomes to attend to the right information. A single agent juggling a spec, dozens of files, tool outputs, and its own reasoning will lose details, repeat work, or hallucinate connections. This isn't solvable via prompt engineering — it's how attention mechanisms work.
853
770
 
854
- Specialized sub-agents turn this limitation into an advantage:
771
+ Specialized sub-agents turn the limitation into an advantage:
855
772
 
856
- - **Context isolation** — Each sub-agent gets a fresh, minimal context window scoped to exactly one job. A `codebase-locator` doesn't carry file contents; a `worker` doesn't carry the full spec. This keeps each agent reasoning over a small, high-signal context.
857
- - **Tool scoping** — Agents only see tools relevant to their role. A `reviewer` has read-only analysis tools and cannot edit files. A `worker` has edit tools but cannot spawn other workers. This eliminates entire categories of mistakes.
858
- - **Parallel execution** — Independent sub-agents run concurrently. While one worker implements a database migration, another writes the API handler, and a third generates tests — all in separate context windows, all at the same time.
859
- - **Composability** — Sub-agents can be combined into workflows or dispatched ad-hoc. The same `reviewer` agent used by Ralph is the one invoked when you ask for a code review in chat.
773
+ - **Context isolation** — Fresh, minimal context scoped to one job. A `codebase-locator` doesn't carry file contents; a `worker` doesn't carry the full spec.
774
+ - **Tool scoping** — Agents only see tools relevant to their role. A `reviewer` has read-only tools and can't edit files; a `worker` has edit tools but can't spawn other workers.
775
+ - **Parallel execution** — Independent sub-agents run concurrently. One worker writes the migration, another writes the handler, a third generates tests — all at once.
776
+ - **Composability** — Sub-agents combine into workflows or dispatch ad-hoc. The same `reviewer` used by Ralph is the one invoked when you ask for a code review in chat.
860
777
 
861
- The difference is measurable: a specialized `codebase-analyzer` reading three files produces more accurate analysis than a generalist agent that has already consumed 50,000 tokens of search results, tool calls, and prior reasoning. Specialization isn't a nice-to-have — it's how you get reliable output from LLMs on real-world codebases.
778
+ A specialized `codebase-analyzer` reading three files produces more accurate output than a generalist that has already consumed 50,000 tokens of search results and prior reasoning.
779
+
780
+ </details>
862
781
 
863
782
  Use `/agents` in any chat session to see all available sub-agents.
864
783
 
865
784
  ### Built-in Skills
866
785
 
867
- Skills are structured capability modules that give agents best practices and reusable workflows for specific tasks. Atomic ships 55 skills across eight categories; each lives at `.agents/skills/<name>/SKILL.md` and is auto-invoked when the agent detects a relevant trigger.
786
+ Skills are structured capability modules that give agents best practices and reusable workflows. Atomic ships **55 skills** across eight categories; each lives at `.agents/skills/<name>/SKILL.md` and is auto-invoked when the agent detects a relevant trigger.
868
787
 
869
- **Development workflows:**
788
+ <details>
789
+ <summary><b>Development workflows</b></summary>
870
790
 
871
791
  | Skill | Description |
872
792
  | ------------------------- | --------------------------------------------------------------------------- |
@@ -879,7 +799,10 @@ Skills are structured capability modules that give agents best practices and reu
879
799
  | `test-driven-development` | Write tests first; includes a testing anti-patterns guide |
880
800
  | `prompt-engineer` | Create, improve, and optimize prompts using best practices |
881
801
 
882
- **Context engineering** — practical skills for working within (and around) LLM context limits:
802
+ </details>
803
+
804
+ <details>
805
+ <summary><b>Context engineering</b> — working within (and around) LLM context limits</summary>
883
806
 
884
807
  | Skill | Description |
885
808
  | ---------------------- | --------------------------------------------------------------------- |
@@ -895,7 +818,10 @@ Skills are structured capability modules that give agents best practices and reu
895
818
  | `project-development` | Validate task-model fit before building; cost estimation |
896
819
  | `bdi-mental-states` | Belief-desire-intention models for explainable agent reasoning |
897
820
 
898
- **TypeScript & runtime:**
821
+ </details>
822
+
823
+ <details>
824
+ <summary><b>TypeScript & runtime</b></summary>
899
825
 
900
826
  | Skill | Description |
901
827
  | --------------------------- | ----------------------------------------------------------------------- |
@@ -905,7 +831,10 @@ Skills are structured capability modules that give agents best practices and reu
905
831
  | `bun` | Build, test, deploy with Bun (runtime, package manager, bundler, tests) |
906
832
  | `opentui` | Build terminal UIs with OpenTUI (core, React, Solid reconcilers) |
907
833
 
908
- **Frontend design & UI polish** — used by `impeccable` and invoked individually for targeted refinement:
834
+ </details>
835
+
836
+ <details>
837
+ <summary><b>Frontend design & UI polish</b> — used by `impeccable` and invoked individually for targeted refinement</summary>
909
838
 
910
839
  | Skill | Description |
911
840
  | ---------------------------------------------- | ------------------------------------------------------------------------------ |
@@ -921,6 +850,11 @@ Skills are structured capability modules that give agents best practices and reu
921
850
  | `harden` | Error handling, onboarding, empty states, i18n, overflow, edge-case resilience |
922
851
  | `optimize` | Diagnose and fix loading, rendering, animation, bundle-size issues |
923
852
 
853
+ </details>
854
+
855
+ <details>
856
+ <summary><b>Evaluation, documents, git, meta</b></summary>
857
+
924
858
  **Evaluation:**
925
859
 
926
860
  | Skill | Description |
@@ -954,20 +888,22 @@ Skills are structured capability modules that give agents best practices and reu
954
888
  | --------------- | ------------------------------------------------------- |
955
889
  | `skill-creator` | Create, modify, evaluate, and benchmark your own skills |
956
890
 
957
- Skills are auto-invoked when relevant — `test-driven-development` activates before any test is written, `playwright-cli` activates for browser automation tasks, and the context-engineering skills activate whenever you're designing a workflow that'll push context limits. Run `ls .agents/skills/` for the complete, current list on disk.
891
+ </details>
892
+
893
+ Skills are auto-invoked when relevant. Run `ls .agents/skills/` for the complete, current list on disk.
958
894
 
959
895
  ### Workflow Orchestrator Panel
960
896
 
961
- During `atomic workflow` execution, Atomic renders a live orchestrator panel built on [OpenTUI](https://github.com/anomalyco/opentui) on top of the workflow's tmux session graph. It shows:
897
+ During `atomic workflow` execution, Atomic renders a live orchestrator panel built on [OpenTUI](https://github.com/anomalyco/opentui) over the workflow's tmux session graph. It shows:
962
898
 
963
- - **Session graph** — Nodes for each `.stage()` call with status (pending, running, completed, failed) and edges for sequential / parallel dependencies
964
- - **Task list tracking** — Ralph's decomposed task list with dependency arrows, updated in real time as workers complete tasks
965
- - **Pane previews** — Thumbnail of each tmux pane so you can see what every agent is doing without switching contexts
966
- - **Transcript passing visibility** — Highlights `s.save()` / `s.transcript()` handoffs as they happen between sessions
899
+ - **Session graph** — Nodes per `.stage()` with status (pending / running / completed / failed) and edges for sequential / parallel dependencies
900
+ - **Task list tracking** — Ralph's decomposed task list with dependency arrows, updated in real time
901
+ - **Pane previews** — Thumbnail of each tmux pane so you can see every agent without context-switching
902
+ - **Transcript passing visibility** — Highlights `s.save()` / `s.transcript()` handoffs as they happen
967
903
 
968
- During `atomic chat`, there is no Atomic-owned TUI — `atomic chat -a <agent>` spawns the native agent CLI inside a tmux/psmux session, so all chat features (streaming, `@` mentions, `/slash-commands`, model selection, theme switching, keyboard shortcuts) come from the agent CLI itself. Atomic's role in chat mode is to handle config sync, tmux session management, and argument passthrough.
904
+ During `atomic chat`, there is no Atomic-owned TUI — `atomic chat -a <agent>` spawns the native agent CLI inside a tmux session, so chat features (streaming, `@` mentions, `/slash-commands`, model selection, theme, keyboard shortcuts) come from the agent CLI itself. Atomic handles config sync, tmux session management, and argument passthrough.
969
905
 
970
- | Context | Who provides the UI |
906
+ | Context | UI provider |
971
907
  | -------------------------------------- | ----------------------------------------------------------- |
972
908
  | `atomic workflow -n <name> -a <agent>` | Atomic (orchestrator panel + tmux session graph) |
973
909
  | `atomic chat -a <agent>` | The native agent CLI (Claude Code / OpenCode / Copilot CLI) |
@@ -980,8 +916,8 @@ During `atomic chat`, there is no Atomic-owned TUI — `atomic chat -a <agent>`
980
916
 
981
917
  | Command | Description |
982
918
  | ------------------------------- | --------------------------------------------------------------------- |
983
- | `atomic chat` | Spawn the native agent CLI inside a tmux/psmux session |
984
- | `atomic workflow` | Run a multi-session agent workflow with the Atomic orchestrator panel |
919
+ | `atomic chat` | Spawn the native agent CLI inside a tmux session |
920
+ | `atomic workflow` | Run a multi-session workflow with the Atomic orchestrator panel |
985
921
  | `atomic workflow list` | List available workflows, grouped by source |
986
922
  | `atomic session list` | List all running sessions on the atomic tmux socket |
987
923
  | `atomic session connect [name]` | Attach to a session (interactive picker when no name given) |
@@ -991,8 +927,6 @@ During `atomic chat`, there is no Atomic-owned TUI — `atomic chat -a <agent>`
991
927
 
992
928
  #### Global Flags
993
929
 
994
- These flags are available on all commands:
995
-
996
930
  | Flag | Description |
997
931
  | --------------- | ------------------------------------------ |
998
932
  | `-y, --yes` | Auto-confirm all prompts (non-interactive) |
@@ -1001,7 +935,7 @@ These flags are available on all commands:
1001
935
 
1002
936
  #### `atomic session` Subcommands
1003
937
 
1004
- The `session` command is available at three levels — scoped or global:
938
+ Available at three levels — scoped or global:
1005
939
 
1006
940
  | Command | Description |
1007
941
  | ---------------------------------------- | ----------------------------------------------------- |
@@ -1015,17 +949,17 @@ The `session` command is available at three levels — scoped or global:
1015
949
  | `atomic workflow session connect [name]` | Attach to a workflow session |
1016
950
  | `atomic workflow session kill [name]` | Kill a workflow session, or all workflow sessions |
1017
951
 
1018
- `list`, `connect`, and `kill` all accept `-a <agent>` (repeatable) to filter by agent backend. `kill` prompts for confirmation before terminating sessions.
952
+ `list`, `connect`, and `kill` accept `-a <agent>` (repeatable) to filter by agent. `kill` prompts for confirmation.
1019
953
 
1020
954
  ```bash
1021
- atomic session list # All sessions
1022
- atomic session list -a claude # Only Claude sessions
1023
- atomic session connect my-session # Attach by name
1024
- atomic session connect # Interactive picker
1025
- atomic chat session list -a copilot # Chat sessions for Copilot only
1026
- atomic session kill my-session # Kill one session by name
1027
- atomic session kill # Kill all sessions (with confirmation)
1028
- atomic workflow session kill -a claude # Kill all Claude workflow sessions
955
+ atomic session list # all sessions
956
+ atomic session list -a claude # only Claude sessions
957
+ atomic session connect my-session # attach by name
958
+ atomic session connect # interactive picker
959
+ atomic chat session list -a copilot # chat sessions for Copilot only
960
+ atomic session kill my-session # kill one session by name
961
+ atomic session kill # kill all sessions (with confirmation)
962
+ atomic workflow session kill -a claude # kill all Claude workflow sessions
1029
963
  ```
1030
964
 
1031
965
  #### `atomic chat` Flags
@@ -1034,12 +968,12 @@ atomic workflow session kill -a claude # Kill all Claude workflow sessions
1034
968
  | -------------------- | -------------------------------------- |
1035
969
  | `-a, --agent <name>` | Agent: `claude`, `opencode`, `copilot` |
1036
970
 
1037
- All other arguments are forwarded directly to the native agent CLI. For example:
971
+ All other arguments are forwarded directly to the native agent CLI:
1038
972
 
1039
973
  ```bash
1040
- atomic chat -a claude "fix the bug" # Initial prompt
1041
- atomic chat -a copilot --model gpt-5.4 # Custom model
1042
- atomic chat -a claude --verbose # Forward --verbose to claude
974
+ atomic chat -a claude "fix the bug" # initial prompt
975
+ atomic chat -a copilot --model gpt-5.4 # custom model
976
+ atomic chat -a claude --verbose # forward --verbose to claude
1043
977
  ```
1044
978
 
1045
979
  #### `atomic workflow` Flags
@@ -1048,48 +982,80 @@ atomic chat -a claude --verbose # Forward --verbose to claude
1048
982
  | -------------------- | ------------------------------------------------------------------------------------------------- |
1049
983
  | `-n, --name <name>` | Workflow name (matches directory under `.atomic/workflows/<name>/`) |
1050
984
  | `-a, --agent <name>` | Agent: `claude`, `opencode`, `copilot` |
985
+ | `-d, --detach` | Start the workflow in the background without attaching — ideal for scripted / CI runs; attach later with `atomic workflow session connect <name>` |
1051
986
  | `--<field>=<value>` | Structured input for workflows that declare an `inputs` schema (also accepts `--<field> <value>`) |
1052
987
  | `[prompt...]` | Positional prompt — requires the workflow to declare a `prompt` input |
1053
988
 
1054
- The workflow command supports four invocation shapes:
989
+ Five invocation shapes:
1055
990
 
1056
991
  ```bash
1057
- # 1. List every workflow available to you, grouped by source
992
+ # 1. List every workflow available, grouped by source
1058
993
  atomic workflow list
1059
994
  atomic workflow list -a claude # filter by agent
1060
995
 
1061
- # 2. Launch the interactive picker for an agent (no -n) — fuzzy-search
1062
- # the list, fill the form rendered from the workflow's declared inputs,
1063
- # and confirm with y/n
996
+ # 2. Launch the interactive picker (no -n) — fuzzy-search, fill the form, confirm with y/n
1064
997
  atomic workflow -a claude
1065
998
 
1066
- # 3. Run a workflow with a positional prompt (workflow must declare a "prompt" input)
999
+ # 3. Run with a positional prompt (workflow must declare a "prompt" input)
1067
1000
  atomic workflow -n ralph -a claude "build a REST API for user management"
1068
1001
 
1069
1002
  # 4. Run a structured-input workflow with one --<field> flag per declared input
1070
1003
  atomic workflow -n gen-spec -a claude \
1071
1004
  --research_doc=research/docs/2026-04-11-auth.md \
1072
1005
  --focus=standard
1006
+
1007
+ # 5. Run detached — orchestrator runs in the background; prints the session name
1008
+ # and returns immediately. Attach any time with `atomic workflow session connect`.
1009
+ atomic workflow -n ralph -a claude -d "build a REST API for user management"
1073
1010
  ```
1074
1011
 
1075
- Workflows that declare an `inputs: WorkflowInput[]` schema get CLI flag validation for free — missing required fields and invalid enum values are rejected before any tmux session is spawned, with error messages that spell out the expected flag set. Workflows that declare a `prompt` input accept a positional prompt on the command line, which the runtime stores under `ctx.inputs.prompt`. **Builtin workflows (like `ralph`) are reserved names** — a local or global workflow with the same name will not shadow a builtin at resolution time.
1012
+ Workflows that declare `inputs: WorkflowInput[]` get CLI flag validation for free. **Builtin workflows (e.g. `ralph`) are reserved** — a local/global workflow with the same name will not shadow a builtin.
1076
1013
 
1077
1014
  #### `atomic completions` — Shell Completions
1078
1015
 
1079
- Atomic ships tab-completion for **bash**, **zsh**, **fish**, and **PowerShell**. The `atomic completions <shell>` command prints the completion script to stdout pipe it into your shell's config to enable.
1016
+ Atomic ships tab-completion for **bash**, **zsh**, **fish**, and **PowerShell**. Cache the script once so new shells don't re-spawn the atomic binary on startup.
1080
1017
 
1081
- | Shell | One-liner (add to your rc file) |
1082
- | ---------- | ------------------------------------------------------------------------- |
1083
- | Bash | `eval "$(atomic completions bash)"` — add to `~/.bashrc` |
1084
- | Zsh | `eval "$(atomic completions zsh)"` — add to `~/.zshrc` |
1085
- | Fish | `atomic completions fish > ~/.config/fish/completions/atomic.fish` |
1086
- | PowerShell | `atomic completions powershell \| Invoke-Expression` — add to `$PROFILE` |
1018
+ <details>
1019
+ <summary><b>Bash / Zsh / Fish / PowerShell setup</b></summary>
1020
+
1021
+ **Bash**
1022
+
1023
+ ```bash
1024
+ mkdir -p ~/.atomic/completions
1025
+ atomic completions bash > ~/.atomic/completions/atomic.bash
1026
+ echo '[ -f "$HOME/.atomic/completions/atomic.bash" ] && source "$HOME/.atomic/completions/atomic.bash"' >> ~/.bashrc
1027
+ ```
1087
1028
 
1088
- > **Tip:** The bootstrap installer (`install.sh` / `install.ps1`) automatically installs completions for your detected shell.
1029
+ **Zsh**
1030
+
1031
+ ```zsh
1032
+ mkdir -p ~/.atomic/completions
1033
+ atomic completions zsh > ~/.atomic/completions/atomic.zsh
1034
+ echo '[ -f "$HOME/.atomic/completions/atomic.zsh" ] && source "$HOME/.atomic/completions/atomic.zsh"' >> ~/.zshrc
1035
+ ```
1036
+
1037
+ **Fish**
1038
+
1039
+ ```fish
1040
+ atomic completions fish > ~/.config/fish/completions/atomic.fish
1041
+ ```
1042
+
1043
+ **PowerShell**
1044
+
1045
+ ```powershell
1046
+ $cache = Join-Path $HOME '.atomic\completions\atomic.ps1'
1047
+ New-Item -ItemType Directory -Force -Path (Split-Path $cache) | Out-Null
1048
+ atomic completions powershell | Out-File -FilePath $cache -Encoding utf8
1049
+ Add-Content $PROFILE "`nif (Test-Path `"$cache`") { . `"$cache`" }"
1050
+ ```
1051
+
1052
+ </details>
1053
+
1054
+ > The bootstrap installer (`install.sh` / `install.ps1`) sets this up automatically and migrates older `eval "$(atomic completions …)"` snippets to the cached form.
1089
1055
 
1090
1056
  ### Atomic-Provided Skills (invokable from any agent chat)
1091
1057
 
1092
- Atomic ships skills — not slash commands. Skills are auto-discovered by Claude Code, OpenCode, and Copilot CLI and are invoked either by typing `/<skill-name>` (Claude Code) or by natural-language reference (OpenCode / Copilot CLI). The list below covers the headline workflow skills; see **Built-in Skills** below for the full catalog.
1058
+ Atomic ships skills — not slash commands. Skills are auto-discovered by Claude Code, OpenCode, and Copilot CLI, invoked by typing `/<skill-name>` (Claude Code) or by natural-language reference (OpenCode / Copilot CLI).
1093
1059
 
1094
1060
  | Skill | Typical invocation | Purpose |
1095
1061
  | ------------------- | --------------------------------- | ----------------------------------------------------------------------------- |
@@ -1103,7 +1069,7 @@ Atomic ships skills — not slash commands. Skills are auto-discovered by Claude
1103
1069
  | `sl-submit-diff` | `/sl-submit-diff` | Submit a Sapling commit as a Phabricator diff |
1104
1070
  | `workflow-creator` | natural language | Generate a multi-agent workflow file in `.atomic/workflows/` |
1105
1071
 
1106
- Native slash commands like `/help`, `/clear`, `/compact`, `/model`, `/theme`, `/agents`, `/mcp`, and `/exit` are provided by the underlying agent CLI, not by Atomic — consult the Claude Code / OpenCode / Copilot CLI documentation for those.
1072
+ Native slash commands (`/help`, `/clear`, `/compact`, `/model`, `/theme`, `/agents`, `/mcp`, `/exit`) come from the underlying agent CLI, not Atomic.
1107
1073
 
1108
1074
  ---
1109
1075
 
@@ -1121,22 +1087,18 @@ Resolution order:
1121
1087
  "$schema": "https://raw.githubusercontent.com/flora131/atomic/main/assets/settings.schema.json",
1122
1088
  "version": 1,
1123
1089
  "scm": "github",
1124
- "lastUpdated": "2026-04-09T12:00:00.000Z",
1125
- "trustedPaths": [
1126
- { "workspacePath": "/home/you/project", "provider": "claude" }
1127
- ]
1090
+ "lastUpdated": "2026-04-09T12:00:00.000Z"
1128
1091
  }
1129
1092
  ```
1130
1093
 
1131
- | Field | Type | Description |
1132
- | -------------- | ------ | --------------------------------------------------------------------------------------------------------- |
1133
- | `$schema` | string | JSON Schema URL for editor autocomplete |
1134
- | `version` | number | Config schema version (currently `1`) |
1135
- | `scm` | string | Source control: `github` or `sapling` |
1136
- | `lastUpdated` | string | ISO 8601 timestamp of the last update |
1137
- | `trustedPaths` | array | Workspaces that have completed provider onboarding; atomic skips re-prompting for these |
1094
+ | Field | Type | Description |
1095
+ | ------------- | ------ | ----------------------------------------- |
1096
+ | `$schema` | string | JSON Schema URL for editor autocomplete |
1097
+ | `version` | number | Config schema version (currently `1`) |
1098
+ | `scm` | string | Source control: `github` or `sapling` |
1099
+ | `lastUpdated` | string | ISO 8601 timestamp of the last update |
1138
1100
 
1139
- > **Note:** Model selection and reasoning effort are managed by each underlying agent CLI (e.g. Claude Code's `/model`), not by Atomic itself. Atomic's chat command spawns the agent's native TUI — use the agent's own controls to pick a model or adjust reasoning effort.
1101
+ > Model selection and reasoning effort are managed by each underlying agent CLI (e.g. Claude Code's `/model`), not Atomic. Atomic's chat command spawns the agent's native TUI — use the agent's own controls.
1140
1102
 
1141
1103
  ### Agent-Specific Files
1142
1104
 
@@ -1146,162 +1108,7 @@ Resolution order:
1146
1108
  | OpenCode | `.opencode/` | `.agents/skills/` | `AGENTS.md` |
1147
1109
  | GitHub Copilot | `.github/` | `.agents/skills/` | `AGENTS.md` |
1148
1110
 
1149
- > **Note:** All three agents share the same skill set via `.agents/skills/`. Claude Code accesses them through a `.claude/skills/` symlink that points to `.agents/skills/`, so a single skill directory serves all agents.
1150
-
1151
- ---
1152
-
1153
- ## Installation Options
1154
-
1155
- ### Bun (recommended)
1156
-
1157
- ```bash
1158
- bun install -g @bastani/atomic
1159
- ```
1160
-
1161
- ### Devcontainer (recommended for autonomous agents)
1162
-
1163
- > [!TIP]
1164
- > Devcontainers isolate the coding agent from your host system, reducing the risk of destructive actions like unintended file deletions or misapplied shell commands. This makes them the safest way to run Atomic.
1165
- >
1166
- > Use the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for VS Code or [DevPod](https://devpod.sh) to spawn and manage your devcontainers.
1167
-
1168
- Add a single feature to your `.devcontainer/devcontainer.json`:
1169
-
1170
- ```
1171
- your-project/
1172
- +-- .devcontainer/
1173
- | +-- devcontainer.json <-- add the feature here
1174
- +-- src/
1175
- +-- ...
1176
- ```
1177
-
1178
- ```jsonc
1179
- {
1180
- "features": {
1181
- "ghcr.io/flora131/atomic/claude:1": {} // or /opencode:1 or /copilot:1
1182
- }
1183
- }
1184
- ```
1185
-
1186
- | Feature | Reference | Agent |
1187
- | -------------------- | ------------------------------------ | ---------------------------------------------------- |
1188
- | Atomic + Claude Code | `ghcr.io/flora131/atomic/claude:1` | [Claude Code](https://claude.ai) |
1189
- | Atomic + OpenCode | `ghcr.io/flora131/atomic/opencode:1` | [OpenCode](https://opencode.ai) |
1190
- | Atomic + Copilot CLI | `ghcr.io/flora131/atomic/copilot:1` | [Copilot CLI](https://github.com/github/copilot-cli) |
1191
-
1192
- Each feature installs the Atomic CLI, all shared dependencies (bun, playwright-cli), agent-specific configurations (agents, skills), and the agent CLI itself. Features are versioned in sync with Atomic CLI releases.
1193
-
1194
- <details>
1195
- <summary>Standalone binary (macOS / Linux)</summary>
1196
-
1197
- ```bash
1198
- curl -fsSL https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
1199
- # or with wget:
1200
- wget -qO- https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
1201
- ```
1202
-
1203
- </details>
1204
-
1205
- <details>
1206
- <summary>Standalone binary (Windows PowerShell)</summary>
1207
-
1208
- ```powershell
1209
- irm https://raw.githubusercontent.com/flora131/atomic/main/install.ps1 | iex
1210
- ```
1211
-
1212
- </details>
1213
-
1214
- <details>
1215
- <summary>Install a specific version</summary>
1216
-
1217
- ```bash
1218
- bun install -g @bastani/atomic@0.5.0-4 # replace with desired version
1219
- ```
1220
-
1221
- List all published versions with `npm view @bastani/atomic versions`.
1222
-
1223
- > Don't have bun yet? Run the bootstrap installer first (it installs bun and the latest atomic), then re-run the command above to switch to your desired version.
1224
-
1225
- </details>
1226
-
1227
- <details>
1228
- <summary>Install a prerelease version</summary>
1229
-
1230
- > **Warning:** Prerelease versions may contain breaking changes or bugs. Use for testing only.
1231
-
1232
- Prereleases are published under the `next` dist-tag on npm:
1233
-
1234
- ```bash
1235
- bun install -g @bastani/atomic@next
1236
- ```
1237
-
1238
- </details>
1239
-
1240
- <details>
1241
- <summary>Authenticated downloads (CI / enterprise)</summary>
1242
-
1243
- Set `GITHUB_TOKEN` to use authenticated GitHub API requests, which avoids rate limits in CI/CD or enterprise environments:
1244
-
1245
- **macOS / Linux:**
1246
-
1247
- ```bash
1248
- GITHUB_TOKEN=ghp_... curl -fsSL https://raw.githubusercontent.com/flora131/atomic/main/install.sh | bash
1249
- ```
1250
-
1251
- **Windows PowerShell:**
1252
-
1253
- ```powershell
1254
- $env:GITHUB_TOKEN='ghp_...'; irm https://raw.githubusercontent.com/flora131/atomic/main/install.ps1 | iex
1255
- ```
1256
-
1257
- </details>
1258
-
1259
- <details>
1260
- <summary>Devcontainer examples</summary>
1261
-
1262
- **Atomic + Claude in a Rust project:**
1263
-
1264
- ```jsonc
1265
- {
1266
- "image": "mcr.microsoft.com/devcontainers/rust:latest",
1267
- "features": {
1268
- "ghcr.io/flora131/atomic/claude:1": {},
1269
- "ghcr.io/devcontainers/features/github-cli:1": {}
1270
- },
1271
- "remoteEnv": {
1272
- "ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"
1273
- }
1274
- }
1275
- ```
1276
-
1277
- **Atomic + Copilot in a Python project:**
1278
-
1279
- ```jsonc
1280
- {
1281
- "image": "mcr.microsoft.com/devcontainers/python:3.12",
1282
- "features": {
1283
- "ghcr.io/flora131/atomic/copilot:1": {},
1284
- "ghcr.io/devcontainers/features/github-cli:1": {}
1285
- },
1286
- "remoteEnv": {
1287
- "GH_TOKEN": "${localEnv:GH_TOKEN}"
1288
- }
1289
- }
1290
- ```
1291
-
1292
- **Atomic + OpenCode in a Go project:**
1293
-
1294
- ```jsonc
1295
- {
1296
- "image": "mcr.microsoft.com/devcontainers/go:1.22",
1297
- "features": {
1298
- "ghcr.io/flora131/atomic/opencode:1": {},
1299
- "ghcr.io/devcontainers/features/github-cli:1": {}
1300
- }
1301
- }
1302
- ```
1303
-
1304
- </details>
1111
+ All three agents share the same skill set via `.agents/skills/`. Claude Code accesses them through a `.claude/skills/` symlink.
1305
1112
 
1306
1113
  ---
1307
1114
 
@@ -1309,15 +1116,12 @@ $env:GITHUB_TOKEN='ghp_...'; irm https://raw.githubusercontent.com/flora131/atom
1309
1116
 
1310
1117
  ### Update
1311
1118
 
1312
- Use Bun's package manager directly:
1313
-
1314
1119
  ```bash
1315
- bun update -g @bastani/atomic # latest stable
1316
- # or for prerelease builds:
1317
- bun install -g @bastani/atomic@next
1120
+ bun update -g @bastani/atomic # latest stable
1121
+ bun install -g @bastani/atomic@next # prerelease
1318
1122
  ```
1319
1123
 
1320
- The first time you run `atomic` after upgrading, the CLI auto-syncs tooling deps (Node.js/npm) and global skills. No separate command needed.
1124
+ The first `atomic` run after upgrading auto-syncs tooling deps and global skills no separate command needed.
1321
1125
 
1322
1126
  ### Uninstall
1323
1127
 
@@ -1325,47 +1129,14 @@ The first time you run `atomic` after upgrading, the CLI auto-syncs tooling deps
1325
1129
  bun remove -g @bastani/atomic
1326
1130
  ```
1327
1131
 
1328
- That removes the `atomic` binary installed by `bun install -g`. If you used the bootstrap installer (`install.sh` / `install.ps1`) on a machine without Bun, the same `bun remove` command still works once Bun is on your PATH.
1329
-
1330
- <details>
1331
- <summary>Clean up project config files</summary>
1332
-
1333
- > **Warning:** This deletes all project-specific settings, skills, and agents configured by Atomic for the current project.
1334
-
1335
- **macOS / Linux:**
1336
-
1337
- ```bash
1338
- rm -rf .claude/ CLAUDE.md # Claude Code
1339
- rm -rf .opencode/ AGENTS.md # OpenCode
1340
- rm -f .github/copilot-instructions.md # Copilot CLI
1341
- rm -rf .atomic/ # Atomic local settings + workflows
1342
- ```
1343
-
1344
- **Windows PowerShell:**
1345
-
1346
- ```powershell
1347
- Remove-Item -Path ".claude" -Recurse -Force; Remove-Item "CLAUDE.md" -Force
1348
- Remove-Item -Path ".opencode" -Recurse -Force; Remove-Item "AGENTS.md" -Force
1349
- Remove-Item -Path ".github\copilot-instructions.md" -Force
1350
- Remove-Item -Path ".atomic" -Recurse -Force
1351
- ```
1352
-
1353
- </details>
1354
-
1355
1132
  <details>
1356
- <summary>Clean up global config files</summary>
1357
-
1358
- > **Warning:** This deletes Atomic's global settings and cached agent configs.
1359
-
1360
- **macOS / Linux:**
1133
+ <summary><b>Also remove global config and cached agent configs</b></summary>
1361
1134
 
1362
1135
  ```bash
1136
+ # macOS / Linux
1363
1137
  rm -rf ~/.atomic/
1364
- ```
1365
-
1366
- **Windows PowerShell:**
1367
1138
 
1368
- ```powershell
1139
+ # Windows PowerShell
1369
1140
  Remove-Item -Path "$env:USERPROFILE\.atomic" -Recurse -Force
1370
1141
  ```
1371
1142
 
@@ -1373,11 +1144,10 @@ Remove-Item -Path "$env:USERPROFILE\.atomic" -Recurse -Force
1373
1144
 
1374
1145
  ---
1375
1146
 
1376
-
1377
1147
  ## Troubleshooting
1378
1148
 
1379
1149
  <details>
1380
- <summary>Git identity error</summary>
1150
+ <summary><b>Git identity error</b></summary>
1381
1151
 
1382
1152
  ```bash
1383
1153
  git config --global user.name "Your Name"
@@ -1387,43 +1157,22 @@ git config --global user.email "you@example.com"
1387
1157
  </details>
1388
1158
 
1389
1159
  <details>
1390
- <summary>Windows command resolution</summary>
1160
+ <summary><b>Windows: agents fail to spawn</b></summary>
1391
1161
 
1392
- If agents fail to spawn on Windows, ensure the agent CLI is in your PATH. Atomic uses `Bun.which()` which handles `.cmd`, `.exe`, and `.bat` extensions automatically.
1162
+ Ensure the agent CLI is in your PATH. Atomic uses `Bun.which()`, which handles `.cmd`, `.exe`, and `.bat` extensions automatically.
1393
1163
 
1394
1164
  </details>
1395
1165
 
1396
- <details>
1397
- <summary>Sub-agent tree stuck on "Initializing..."</summary>
1398
-
1399
- 1. Update to the latest release (`bun install -g @bastani/atomic`) and retry
1400
- 2. Check for terminal progress events in verbose mode
1401
- 3. Press `Ctrl+F` twice to terminate stuck background agents, then resend your prompt
1402
- 4. If the issue persists, capture reproduction steps and [open an issue](https://github.com/flora131/atomic/issues)
1403
-
1404
- </details>
1405
-
1406
- <details>
1407
- <summary>Shift+Enter not inserting newline</summary>
1408
-
1409
- - **VS Code terminal:** Keep `terminal.integrated.enableKittyKeyboardProtocol` enabled
1410
- - **GNOME Terminal, xterm, Alacritty, WezTerm, iTerm2:** `modifyOtherKeys` mode is enabled automatically
1411
- - **Universal fallback:** Use `Ctrl+J` for newline
1412
- - **Last resort:** End line with `\` and press Enter
1413
-
1414
- </details>
1415
-
1416
-
1417
1166
  ---
1418
1167
 
1419
1168
  ## FAQ
1420
1169
 
1421
1170
  <details>
1422
- <summary>How does Atomic differ from Spec-Kit?</summary>
1171
+ <summary><b>How does Atomic differ from Spec-Kit?</b></summary>
1423
1172
 
1424
1173
  [Spec Kit](https://github.com/github/spec-kit) is GitHub's toolkit for "Spec-Driven Development." Both improve AI-assisted development, but solve different problems:
1425
1174
 
1426
- **In short:** Spec-Kit works well for greenfield projects where you start from a spec and use a single Copilot session to generate code. Atomic is built for the harder case — large existing codebases where you need to research what's already there before changing anything. It gives you multi-session pipelines with isolated context windows (so the agent doesn't degrade over long tasks), deterministic execution, and support for Claude Code, OpenCode, and Copilot CLI instead of just one agent. If you're starting a new project from scratch with Copilot, Spec-Kit is simpler. If you're working on an established codebase and need chained sessions, parallel research, or autonomous execution, that's what Atomic is for.
1175
+ **In short:** Spec-Kit works well for greenfield projects where you start from a spec and use a single Copilot session to generate code. Atomic is built for the harder case — large existing codebases where you need to research what's already there before changing anything. Atomic gives you multi-session pipelines with isolated context windows, deterministic execution, and support for Claude Code, OpenCode, and Copilot CLI instead of just one agent.
1427
1176
 
1428
1177
  | Aspect | Spec-Kit | Atomic |
1429
1178
  | ------------------------ | -------------------------------------------- | --------------------------------------------------------------------------------------------------- |
@@ -1442,11 +1191,11 @@ If agents fail to spawn on Windows, ensure the agent CLI is in your PATH. Atomic
1442
1191
  </details>
1443
1192
 
1444
1193
  <details>
1445
- <summary>How does Atomic differ from DeerFlow?</summary>
1194
+ <summary><b>How does Atomic differ from DeerFlow?</b></summary>
1446
1195
 
1447
1196
  [DeerFlow](https://github.com/bytedance/deer-flow) is ByteDance's agent harness built on LangGraph/LangChain. Both are multi-agent orchestrators, but take different approaches:
1448
1197
 
1449
- **In short:** DeerFlow is a general-purpose agent orchestrator — it handles research, report generation, and other tasks through a LangGraph DAG with a web UI. Atomic is narrowly focused on coding workflows. The key difference is that Atomic runs on top of production coding agents (Claude Code, OpenCode, Copilot CLI) rather than reimplementing coding tools through a generic API. You get each agent's native file editing, permissions, MCP integrations, and hooks out of the box. Atomic also gives you deterministic execution — same step order, same data flow every run — which matters when you're encoding a team's dev process and need it to be reproducible across people and CI. If you need a general-purpose agent pipeline with a web UI, DeerFlow is the better fit. If you need coding-specific workflows with strict execution guarantees, Atomic is more appropriate.
1198
+ **In short:** DeerFlow is a general-purpose agent orchestrator with a web UI. Atomic is narrowly focused on coding workflows. The key difference is that Atomic runs on top of production coding agents (Claude Code, OpenCode, Copilot CLI) rather than reimplementing coding tools through a generic API you get each agent's native file editing, permissions, MCP integrations, and hooks out of the box. Atomic also gives you deterministic execution, which matters when encoding a team's dev process.
1450
1199
 
1451
1200
  | Aspect | DeerFlow | Atomic |
1452
1201
  | ----------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------- |
@@ -1466,11 +1215,11 @@ If agents fail to spawn on Windows, ensure the agent CLI is in your PATH. Atomic
1466
1215
  </details>
1467
1216
 
1468
1217
  <details>
1469
- <summary>How does Atomic differ from Hermes Agent?</summary>
1218
+ <summary><b>How does Atomic differ from Hermes Agent?</b></summary>
1470
1219
 
1471
1220
  [Hermes Agent](https://github.com/NousResearch/hermes-agent) is Nous Research's general-purpose AI agent with a self-improving learning loop. Both are open-source agent frameworks, but serve different use cases:
1472
1221
 
1473
- **In short:** Hermes Agent is a broad AI assistant that learns and improves across sessions, connects to messaging platforms, and works with any OpenAI-compatible model. Atomic is a coding-specific harness built for engineering teams. It lets you encode your development process as deterministic TypeScript workflows that run identically across team members, machines, and CI pipelines. Instead of reimplementing coding tools from scratch, Atomic inherits production-hardened tool ecosystems from Claude Code, OpenCode, and Copilot CLI — including their permission systems, MCP integrations, and hooks — giving you two independent security boundaries (devcontainer isolation + agent permissions) rather than one. Each workflow session runs in a fresh context window with only distilled transcripts passed forward, so output stays sharp over multi-hour coding tasks instead of degrading through lossy compression. And because skills are developer-authored and version-controlled, they don't drift or accumulate errors the way auto-generated skills can. Choose Hermes if you want a self-improving general-purpose agent with multi-platform messaging; choose Atomic if you want repeatable, auditable coding workflows with strict execution guarantees and production-grade isolation.
1222
+ **In short:** Hermes is a broad AI assistant that learns across sessions and connects to messaging platforms. Atomic is a coding-specific harness for engineering teams. It lets you encode your development process as deterministic TypeScript workflows that run identically across team members, machines, and CI. Atomic inherits production-hardened tools from Claude Code, OpenCode, and Copilot CLI — including their permission systems, MCP integrations, and hooks — giving you two independent security boundaries (devcontainer isolation + agent permissions). Fresh context per session keeps output sharp over multi-hour tasks. Developer-authored skills don't drift the way auto-generated ones can.
1474
1223
 
1475
1224
  | Aspect | Hermes Agent | Atomic |
1476
1225
  | ------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |