Project
The terminal
Differential rendering, a composed frame, and a prompt that stays responsive while the model streams.
Allowed. The edit landed, snapshotted first so /rewind can undo it.
An arcturn session. The header names the model and the working directory; a prompt asks for input validation on the /signup handler; arcturn reads the route, greps for existing validation, then starts an edit to src/routes/signup.ts and stops — a permission dialog asks before the write, offering allow once, allow always for that file in this project, or deny. The edit was allowed: it landed as 24 lines added and 3 removed, and the run finished in 12 seconds having spent four cents.
The prompt
arcturn starts an interactive session rooted at your current working directory. Every tool call — reading a file, editing one, running a shell command — is scoped to that directory.
The header names the model in effect and the root the session is bound to, so the two facts that decide what a turn can do are never more than a glance away.
An arcturn session header naming the model and working directory, the prompt editor holding a typed request for input validation on the signup handler, and the status bar naming the permission mode.
- Session header: arcturn, claude-sonnet-4-5, ~/projects/api.
- Prompt input: add input validation to the /signup handler. Permission mode default.
- Status bar: arcturn, claude-sonnet-4-5, default.
A tool call
The TUI renders each tool call as it happens. The same activity is available as data: --output-format json emits the agent’s full event stream as newline-delimited JSON, one AgentEvent per line — exactly the shape the SDK gives you.
Diagnostics always go to stderr, so piping stdout stays clean data either way.
A non-interactive arcturn run printing its event stream as newline-delimited JSON: a turn start, a grep tool call start and end, and a completed run end.
- $ arcturn -p "list every TODO comment in src/" --output-format json
- {"type":"turnStart","turnIndex":0}
- {"type":"toolStart","toolCallId":"tc_1","toolName":"grep","input":{"pattern":"TODO"}}
- {"type":"toolEnd","toolCallId":"tc_1","result":{"role":"toolResult","toolName":"grep","isError":false,"content":[{"type":"text","text":"…"}]}}
- {"type":"runEnd","reason":"completed"}
A permission ask
The first time Arcturn needs to write a file or run a shell command, it asks — unless a rule already settles it. Allow once, deny, or persist a rule from the prompt itself: always allow src/**.ts writes that rule to project scope.
In non-interactive mode there is no user to answer, so a check that would have asked is denied automatically, with a note on stderr naming the flag that would have allowed it.
An arcturn session that has read src/routes/signup.ts and then stopped at the permission gate: a bordered dialog asking to edit that file, offering allow once, allow always for edit src/routes/signup.ts in project scope, or deny with a reason.
- Prompt: add input validation to the /signup handler
- Tool call: read src/routes/signup.ts.
- Result: 84 lines
- Permission required for edit: src/routes/signup.ts. edit: src/routes/signup.ts. Options: Allow once, selected; Allow always: edit src/routes/signup.ts (project); Deny and tell the model why.
- Status bar: arcturn, claude-sonnet-4-5, default.
A diff
Under --dry-run, file mutations land in a shadow copy of the workspace instead of your tree. /diff prints one aggregate unified diff across every pending change, paths relative to the workspace root, three lines of context per hunk.
/apply writes them back through a temp-file-plus-rename so an interrupted apply can never leave a half-written file; /discard deletes the shadow tree.
The /diff command printing a unified diff of one pending change to src/app.ts inside the dry-run shadow tree.
- Prompt: /diff
- --- a/src/app.ts
- +++ b/src/app.ts
- @@ -12,3 +12,4 @@
- export function start() {
- - console.log("boot");
- + console.log("booting");
- + return true;
- }
A delegated agent
/bg <task> starts a full child agent running your task as its sole prompt, off the foreground thread, and returns immediately. /bg logs, /bg cancel and /bg adopt check back on it later — adopting pulls its final result into the live conversation.
A background agent runs in default permission mode, never yolo: there is nowhere to send a prompt for an unattended agent, so it fails closed by construction. It cannot spawn further agents.
The /bg command starting a background agent to fix a flaky retry test: an informational notice reports the agent id and session id, and the prompt is free again immediately.
- Prompt: /bg fix the flaky retry test and open a summary of what was wrong
- Note: Started background agent bg-a1b2c3d4 (session 019c4a2f).
- Prompt input: Ask arcturn anything, or type / for commands. Permission mode default.
- Status bar: arcturn, claude-sonnet-4-5, default.
/rewind
/rewind with no argument opens a picker: one row per turn, newest first, each labelled with the prompt that began it and how many files changed after that point.
Choosing one restores the files that changed after that turn and forks the conversation rather than deleting it. The turns you rewound past stay reachable by resuming the session at their own leaf.
A /rewind in an arcturn session: two informational notices report that three files were restored and one deleted, and that the conversation forked back to that turn, with the prompt ready underneath.
- Prompt: /rewind
- Note: Restored 3 files, deleted 1.
- Note: Conversation forked back to that turn.
- Prompt input: Ask arcturn anything, or type / for commands. Permission mode default.
- Status bar: arcturn, claude-sonnet-4-5, default.
Slash commands
The session-level controls, each with a page of documentation behind it.
- /model
Switch model mid-session, or refresh the live catalog.
- /permissions
Print the current rules and pick a permission mode.
- /diff · /apply · /discard
Review, land or drop the dry-run shadow tree.
- /rewind
Restore files from a turn and fork the conversation.
- /cost
Current spend, the ceiling, and a forecast before you commit.
- /bg · /team
A durable background task, or a coordinated set of agents.
- /workflow
Run a file-defined, deterministic multi-step pipeline.
Every turn counts.
Start a session, watch every tool call ask first, then go back and read exactly what happened.