A CLI tool for enforcing determinism in LLM development workflow automation.
See devlog for latest features.
You can install assist globally using npm:
npm install -g @staff0rd/assist
assist syncassist update# Clone the repository
git clone git@github.com:staff0rd/assist.git
cd assist
# Install dependencies
npm install
# Build the project
npm run build
# Install globally
npm install -g .After installation, the assist command will be available globally. You can also use the shorter ast alias.
/add-command- Add a new run command to assist.yml/branch <description> [--jira KEY]- Create a branch off the fresh remote default, deriving a kebab-case slug from the description/bug- File a bug with reproduction steps, expected and actual behavior/comment- Add pending review comments to the current PR/commit- Commit only relevant files from the session/devlog- Generate devlog entry for the next unversioned day/draft- Draft a new backlog item with LLM-assisted questioning/fix-conflict [--rebase]- Resolve the current PR branch's conflicts against the remote default, verify, then push; merges by default,--rebasereplays the branch and pushes with--force-with-lease/forward-comments- Split a coarse PR comment into per-line review comments, attributed to the original reviewer/handover- Write a session handover note for the next conversation/pr- Raise a PR with a concise description, then watch CI in the background/prs-slack <number> [--no-confirm]- Post a PR's title and URL to the Slack channel configured inprs.slack;--no-confirmskips the confirmation and posts straight away (used by chained announces)/refactor- Run refactoring checks for code quality/prompts- Analyze denied tool calls and suggest settings changes to auto-allow recurring prompts/recall- Recall the most recent handover note for this repo/refine- Refine an existing backlog item through conversation/restructure- Analyze and restructure tightly-coupled files/review-pr-comments- Process PR review comments one by one/jira [action] [KEY] [args]- Jira actions:view,associate,update,started,done,help.[KEY]is optional — it resolves from the session's backlog item/github [action] [ref] [args]- GitHub issue actions:view,associate,update,started,done,help.[ref]is optional — it resolves from the session's backlog item/journal- Append a journal entry summarising recent work/next [id]- Signal completion and chain into the next backlog item/standup- Summarise recent journal entries as a standup update/subtask <text>- Add a sub-task to the session's current backlog item/strip-code-comments- Strip redundant comments from tracked source files/sync- Sync commands and settings to ~/.claude/design <prompt>- Apply the vendored design system prompt to a design task/test-cover- Incrementally increase test coverage by identifying and testing uncovered files/test-review- Review existing tests for quality, coverage gaps, and conventions/inspect- Run .NET code inspections on changed files/screenshot- Capture a screenshot of a running application window/raven- Query and manage RavenDB connections and collections/seq- Query Seq logs from a URL or filter expression/sql- Query a MSSQL database via assist sql/verify- Run all verification commands in parallel/verify-new- Add a new verify:* run command to assist.yml/transcripts- Format and summarise meeting transcripts end to end/voice-setup- Download required voice models (VAD, STT)/voice-start- Start the voice interaction daemon/voice-stop- Stop the voice interaction daemon/voice-status- Check voice daemon status/voice-logs- Show recent voice daemon logs
Every command supports --help for full detail on its flags and behaviour.
assist backup [-o, --out <dir>]- Dump the entire backlog database to<dir>/backup-<timestamp>.dump(default~/.assist/backups, orbackup.dir)assist backup schedule --every <duration>- Install or update a crontab block runningassist backupon a cadence (e.g.5m,6h)assist backup schedule status- Print the active backup cadence and cron expressionassist backup schedule remove- Remove the backup schedule block from the crontabassist db migrate- Apply pending backlog database migrations in orderassist db status- Report whether the database is in sync with the build's bundled migrations
-
assist sync [--prune] [--force]- Copy commands, settings,CLAUDE.mdand design assets to~/.claude(plus~/.codexand~/.piwhen those CLIs are on PATH). With--prune, also lists commands in the target dirs that sync did not write — anything whose name is not in the repo'sclaude/commands/*.mdset — and adding--forceremoves them.~/.codex/skillsand~/.pi/agent/promptsare only inspected when those CLIs are detected; an orphaned codex skill directory is removed only whenSKILL.mdis its sole content, and any other is left in place with a reason. Subdirectories and non-.mdfiles are listed separately and never removed.--forcewithout--pruneis an error -
assist activity [--since <date>]- Chart GitHub commit activity per day (defaults to last 30 days) -
assist commit status- Show git status and diff -
assist commit <message> [files...]- Stage files and create a git commit with validation -
assist branch <slug> [--jira <key>] [--from <ref>]- Create and switch to a new branch off the fresh remote default (or--from <ref>); name is[<prefix>/][<JIRA>-]<slug>, long slugs shortened by LLM -
assist watch wait [--interval <d>] [--timeout <d>|none] [--pull] [--build [entry]]- Block until the current branch's upstream gains commits, then exit. Fetches once at startup, so commits already on the remote are picked up without waiting out an interval.--timeoutdefaults tonone, so a quiet branch waits indefinitely rather than exiting 2. With--pull, fast-forwards (recovering a dirty tree or a merely-behind branch) and prints the build report (seeassist watch report) baselined on the pre-pull SHA. With--build, runs theauto-buildrun entry — or[entry]if named — after a successful pull. Exit codes:0moved (and cleanly pulled and built),2timed out on an explicit finite--timeout,3the branch has genuinely diverged,4the build failed,1cannot wait,130interrupted -
assist watch report [--from <sha>]- Print the built version frompackage.json, the last 10 commits as a markdown SHA/When/Subject table newest-first, and the restarts the new commits make necessary. With--from, commits reachable fromHEADbut not<sha>are marked← newand the restart advice comes from the files they changed. Exit codes:0printed,1git could not resolve the range -
assist prs- List pull requests for the current repository -
assist prs raise --title <t> --what <w> --why <y> [--how <h>] [--resolves <key>] [--force] [--draft|--no-draft]- Raise a PR, assembling the body from What/Why/How. Whether the PR is created as a draft comes fromprs.draftunless--draftor--no-draftis passed, which always wins. In a web session the draft is previewed for approve/reject (with inline comments and pasted screenshots, hosted via thegh-imagegh extension) before the PR is created. The preview pane carries two independent chain checkboxes, both default on: Review chains areview --no-prompt --submit <n> --address-commentssession once the PR is raised (review → post findings → Address Comments), and Post announces the PR in Slack at the tail of that chain — or directly via/prs-slack <n> --no-confirmwhen Review is off. With both on, approving runs raise → Review + Post → Address Comments → Slack announce end to end -
assist prs edit [--title <t>] [--what <w>] [--why <y>] [--how <h>] [--resolves <key>]- Update only the supplied sections of the current PR's body. In a web session the resulting title and body are previewed for approve/reject first (with inline comments and pasted screenshots, as forraise); on approval the edit is applied with any screenshots appended, on rejection the reviewer's comments are printed and nothing is changed. Outside a session the edit applies directly -
assist prs list-comments- List all comments on the current branch's pull request -
assist prs fixed <comment-id> <sha>- Reply with commit link and resolve thread -
assist prs wontfix <comment-id> <reason>- Reply with reason and resolve thread. Pass-as the reason to read it from stdin. A body containing markdown — backticks around identifiers,$(...),$VAR— must be piped in rather than passed as an argument, or the calling shell expands it before assist sees it:assist prs wontfix 3718677497 - <<'EOF' Deferring to #197, which renames `query_duckdb` to `query_data`. EOF
-
assist prs reply <comment-id> <body>- Reply to a comment thread without resolving it. Pass-as the body to read it from stdin -
assist prs comment <path> <line> <body>- Add a line comment to the pending review. Pass-as the body to read it from stdin -
assist review [number]- Run Claude and Codex in parallel to review the current branch's PR, then post line-bound comments. The diff comes from GitHub, so stale local base branches don't pollute the review; cachedclaude.md/codex.md/synthesis.mdare reused when present[number]-gh pr checkout <number>first, placed by the worktree allocator on a repo with parallel work enabled (see docs/parallel-work.md)--no-prompt- Skip all confirmations--submit- Default the submit prompt to yes--force- Clear all cached files and re-run every phase--refine- Skip posting; walk throughsynthesis.mdinteractively and edit it in place--apply- Skip posting; walk through each finding asking apply/skip. Applied findings are fixed in the working tree--backlog- Skip posting; file all findings as a single bug backlog item with one phase per finding--address-comments- After the review posts comments and submits, start an Address Comments session (assist review-pr-comments <n>) for the PR. Only fires inside an assist session, and only when at least one comment was posted and the review was submitted--announce- Announce the PR in Slack (/prs-slack <n> --no-confirm) at the tail of the chain: the Address Comments session announces once every thread is processed when one was started, otherwise a/prs-slacksession is started directly. Announces exactly once, and only inside an assist session--verbose- Per-line log output instead of the stacked-spinner UI (automatic in CI)
-
assist github commits <org> [--since <date>] [--top <n>] [--json]- Report commit activity across a GitHub organisation: repos ranked by commits, top committers, and a per-repo author breakdown -
assist news add [url]- Add an RSS feed URL (rendered in the sessions web News tab)
Backlog data is stored in a global Postgres database (shared across all repos, scoped per repository by git origin), so a connection string is required. Set it via the ASSIST_DATABASE_URL environment variable or the database.url key in assist.yml; the environment variable takes precedence. Without one, every assist backlog command exits with a setup message. Commands default to the current repository's items; pass --all-repos to span every repository.
Backlog item ids are written and displayed in an a-prefixed form (e.g. item 555 is a555) to disambiguate them from GitHub PR/issue numbers (#42) and Jira keys. Commands and web API routes that take an <id> accept either form.
assist backlog [--dir <path>]- Open the backlog tab in the web dashboard (same asbacklog web)assist backlog list [--status <type>] [-a, --all] [--all-repos] [-v]- List backlog items with status icons (alias:ls; alsoassist list/assist ls)assist backlog add- Add a new backlog item interactively (human CLI use only; agents must usepropose)assist backlog add --name <n> --type <t> --desc <d> --ac <criterion...>- Add a backlog item from CLI optionsassist backlog propose --json <file|-> [--confirmed]- Create an agent-authored item from a JSON payload, previewed for approval in a web session. Outside a web session an agent invocation prints the draft and writes nothing until it is re-run with--confirmed;--confirmedis rejected in a web session, where the pane is the gate. Used by/draftand/bug. See docs/backlog-item-preview.mdassist backlog show <id> [--all-commits]- Display full detail for a backlog item (alias:view). Activity lists the newest 10 commits;--all-commitsprints every commitassist backlog plan <id>- Display the phased plan for a backlog itemassist backlog update-field <id> [--name <n>] [--desc <d>] [--type <t>] [--ac <criterion...>]- Update fields on a backlog itemassist backlog update-field <id> [--add-ac <text>] [--edit-ac <n> <text>] [--remove-ac <n>]- Granular 1-based acceptance-criteria editsassist backlog update-field <id> --origin [url-or-key]- Retag a single item to a different repoassist backlog add-phase <id> <name> --task <t...> [--manual-check <c...>] [--position <pos>]- Add a phase to an existing itemassist backlog update-phase <id> <phase> [--name <n>] [--task <t...>] [--manual-check <c...>]- Modify a plan phase (alias:edit-phase)assist backlog update-phase <id> <phase> [--add-task <t>] [--edit-task <n> <t>] [--remove-task <n>] [--add-check <c>] [--edit-check <n> <c>] [--remove-check <n>]- Granular 1-based task and manual-check editsassist backlog remove-phase <id> <phase>- Remove a plan phase from a backlog itemassist backlog move-phase <id> <from> <to>- Reorder a plan phase between 1-based positionsassist backlog update-plan <id> --json <file|->- Replace an item's whole plan from a JSON payload, previewed as a single diff for approval. The path/refineand agent sessions use for every plan changeassist backlog add-subtask <id> --title <t> [--desc <d>]- Add a sub-task. Sub-tasks under thesubtaskskey inassist.yml/~/.assist.ymlare auto-applied to every new itemassist backlog edit-subtask <id> <idx> [--title <t>] [--desc <d>] [--status <s>]- Edit a sub-task by its 1-based indexassist backlog remove-subtask <id> <idx>- Remove a sub-task by its 1-based indexassist backlog subtask-status <id> <idx> <status>- Set a sub-task's status (todo,in-progress,done)assist backlog start <id>- Set a backlog item to in-progressassist backlog stop- Revert all in-progress items to todo and reset their phase to 1assist backlog done <id>- Set a backlog item to done (blocked while any sub-task is not done)assist backlog wontdo <id> [reason]- Set a backlog item to won't doassist backlog set-status <id> <status>- Set status (todo,in-progress,done,wontdo)assist backlog star <id>/assist backlog unstar <id>- Pin an item ahead of unstarred items in the web viewassist backlog delete <id>- Delete a backlog itemassist backlog comment <id> <text>- Add a comment to a backlog itemassist backlog comments <id>- List comments and summaries for a backlog itemassist backlog delete-comment <id> <comment-id>- Delete a comment (summaries cannot be deleted)assist backlog phase-done <id> <phase> <summary>- Signal that a plan phase is completeassist backlog rewind <id> <phase> --reason <reason>- Rewind an item to an earlier phaseassist backlog next [id] [--once]- Pick and run the next backlog item, or open/draftif none remainassist backlog refine [id] [--once] [--harness <claude|codex|pi>]- Alias forrefineassist backlog run <id> [--harness <claude|codex|pi>] [--write|--no-write]- Run a backlog item's plan phase-by-phase with the selected harness, defaulting toharness.engine; for Codex, write access uses theworkspace-writesandbox and--no-writeusesread-onlyassist backlog export [file]- Export every table in the backlog database to a file, or stdoutassist backlog import [file]- Restore every table present in a dump back into the database (-y, --yesskips the prompt)assist backlog associate-jira <id> [key]- Associate a Jira ticket (bare key or browse URL); clears any GitHub issue on the item.--clearremoves itassist backlog associate-github <id> [issue]- Associate a GitHub issue (URL orowner/repo#number); clears any Jira key on the item.--clearremoves itassist backlog add-activity <id> <kind> <ref>- Attach an activity ref (branch,commit,commit-parent,pr,slack);--title,--url,--stateoverride metadataassist backlog record-slack <url>- Attach a Slack thread permalink to the current session's item; used by/prs-slackassist backlog move-repo <old-origin> [new-origin]- Retag all items from one origin to another after a repo rename (-y, --yesskips the prompt)assist backlog clone <origin>- Clone a repo over SSH intoclone.baseDir(default~/git)assist backlog web [-p, --port <number>] [--no-open]- Open the backlog tab in the web dashboard (default port 3100)
assist run <name> [params...]- Run a configured command from assist.yml. A backlog item id (a555/555) with no matching command forwards toassist backlog runassist run add- Add a new run configuration to assist.yml and create a Claude command fileassist run link <path> --prefix <prefix>- Link run configurations from another project's assist.ymlassist run remove <name>- Remove a run configuration and delete its Claude command file
A run entry's relative cwd (and a link path) resolves against the repo root - the directory holding assist.yml or .claude/, or the enclosing git repository when the repo has no project config at all (entries coming only from a repos: override in ~/.assist.yml). The base does not shift with which config file the entry came from. A resolved cwd that does not exist fails with run config "<name>": cwd <path> does not exist rather than a spawn <command> ENOENT, and the daemon logs that reason when a run: session errors.
assist config keys [filter]- List every key in the config schema with its type, schema default, what it does and theassist config setline that sets it. The optional filter narrows to keys containing it (case-insensitive), soassist config keys worktreeshows just the worktree block. The listing is derived fromassistConfigSchemaand theconfigHelpregistry thatassist verify config-keysforces to cover every key, so no key can go missing from itassist config get <key>- Get a config value. Secret values (database.url,roam.*tokens,sql.connections[].password,seq.connections[].apiToken) print as<hidden>;--revealprints the raw value undecorated for command substitution and always needs an explicit permission prompt (the CLI hook never auto-approves it). An unset key exits non-zero and reportsKey "<key>" is not set; when the key is a valid schema key that message carries its schema default (orhas no schema default) plus the key's note and setterassist config list- List the config values that are set, with secret values shown as<hidden>(no reveal option). Unset optional blocks are omitted entirely, so the output leads with a comment pointing atassist config keysfor the full schemaassist config set <key> <value>- Set a config value.--globalwrites to~/.assist.yml;-g --repo [name]writes a per-repo override there. The confirmation line and any validation error mask secret valuesassist config unset <key>- Remove a config value so the key falls back to the global value or schema default (-gtargets~/.assist.yml;-g --repo [name]removes it from a per-repo override there)
The Config tab of the sessions web dashboard never receives secret values: GET /api/config replaces each one with a set-or-unset marker, so a configured secret renders as a mask and an unset one as not set, both keeping their project/global/default chip. Secret fields edit write-only - the mask clears on focus, typing a value replaces the stored one, and leaving the field untouched keeps it.
assist verify- Run all verify:* commands in parallel (from assist.yml run configs and package.json scripts)assist verify all- Run all checks, ignoring diff-based filtersassist verify --measure- Print a summary table of each command's status and durationassist verify init [--package-json]- Add verify scripts to a projectassist verify hardcoded-colors- Check for hardcoded hex colors in src/ (hardcodedColors.ignore)assist verify block-code-comments- Fail on any comment on a changed line (blockCodeComments.ignore); machine directives exemptassist verify forbidden-strings- Check configured JSON files for disallowed values (forbiddenStringsrules)assist verify config-keys- Check every leaf key inassistConfigSchemais surfaced in some command's--helpviaconfigHelpassist verify migrations- Check bundled DB migrations are sequentially numbered, append-only, and free of unacknowledged destructive DDLassist lint [-f, --fix]- Run lint checks for conventions not enforced by oxlintassist lint init- Initialize oxlint with baseline linter config
assist refactor check [pattern]- Check for files that exceed the maximum line countassist refactor ignore <file>- Add a file to the refactor ignore listassist refactor rename file <source> <destination>- Rename/move a TypeScript file and update all imports (--applyto execute)assist refactor rename symbol <file> <oldName> <newName>- Rename a symbol across the project (--applyto execute)assist refactor extract <file> <functionName> <destination>- Extract a function and its private dependencies to a new file (--applyto execute)assist refactor restructure [pattern]- Analyze the import graph and restructure tightly-coupled files into nested directories
assist devlog list- Group git commits by dateassist devlog next- Show commits for the day after the last versioned entryassist devlog repos- Show which github.com/staff0rd repos are missing devlog entriesassist devlog skip <date>- Add a date to the skip listassist devlog version- Show current repo name and version info
assist cli-hook- PreToolUse hook auto-approving CLI commands fromallowed.cli-reads/allowed.cli-writes(plus read-onlygh api), checking each sub-command of a compound command independentlyassist cli-hook add <cli>- Discover a CLI's commands and auto-permit read-only onesassist cli-hook check <command> [--tool <tool>]- Check whether a command would be auto-approvedassist cli-hook deny- List all deny rulesassist cli-hook deny add <pattern> <message>- Add a deny rule for a command patternassist cli-hook deny remove <pattern>- Remove a deny rule by patternassist codex-hook- Codex hook that auto-approves read-only commands (PreToolUse/PermissionRequest) reusing thecli-hookallowlist, and reports session status to the sessions daemon (UserPromptSubmit/PreToolUse/PostToolUse→ running,Stopand an undecidedPermissionRequest→ waiting) so a Codex session card shows live running/waiting; installed byassist syncwhencodexis on PATHassist pi-hook- pi permission-gate adapter reusing thecli-hookallowlist, emittingallow/deny/gate; installed byassist syncwhenpiis on PATHassist edit-hook- PreToolUse hook that blocksEdit/Write/MultiEditcalls from adding, changing, or removing a// assist-maintainability-overridemarker, or from introducing a code comment (usecode-comment set/confirmfor the rare comment that belongs)assist code-comment set <file> <line> <text>- Validate a comment (max 50 chars, single-line) and issue a pin authorising its insertionassist code-comment confirm <pin>- Insert the pinned comment at its file/line and clear the pin stateassist db-migration unlock- Page a human to approve creating the next new migration module, issuing a pin via desktop notificationassist db-migration confirm <pin>- Confirm a pin fromdb-migration unlock, letting that migration's file write through onceassist notify- Show desktop notification from JSON stdin (macOS, Windows, WSL)assist status-line- Format Claude Code status line from JSON stdin
assist dotnet inspect [sln]- Run JetBrains inspections on changed .cs files to find dead code--scope all|base:<ref>|commit:<ref>- Inspect the whole solution, everything changed since a base ref, or one commit--only <ids...>/--suppress <ids...>- Show only, or suppress, specific issue type IDs--roslyn- Use Roslyn analyzers via msbuild instead of JetBrains--swea- Enable solution-wide error analysis (slower but more thorough)
assist dotnet check-locks- Check if build output files are locked by a debuggerassist dotnet deps <csproj>- Show .csproj project dependency tree and solution membershipassist dotnet in-sln <csproj>- Check whether a .csproj is referenced by any .sln file
assist jira auth- Authenticate with Jira via API tokenassist jira ac <issue-key>- Print acceptance criteria for a Jira issueassist jira view <issue-key>- Print the title and description of a Jira issue- Note: Claude fetches Jira context via the MCP Atlassian server, so
/jiraand Jira-key mentions go through MCP. These CLI commands remain for direct human use.
- Note: Claude fetches Jira context via the MCP Atlassian server, so
assist ravendb auth add- Add a new RavenDB connectionassist ravendb auth list- List configured RavenDB connectionsassist ravendb auth remove <name>- Remove a configured connectionassist ravendb set-connection <name>- Set the default connectionassist ravendb query [connection] [collection]- Query a RavenDB collection (--page-size,--sort,--query,--limit)assist ravendb collections [connection]- List collections and document countsassist seq auth add- Add a new Seq connectionassist seq auth list- List configured Seq connectionsassist seq auth remove <name>- Remove a configured connectionassist seq set-connection <name>- Set the default Seq connectionassist seq query <filter>- Query Seq events (-c <connection>,--json,-n <count>,--from <date>,--to <date>)assist sql auth add- Add a new MSSQL connectionassist sql auth list- List configured SQL connectionsassist sql auth remove <name>- Remove a configured connectionassist sql set-connection <name>- Set the default SQL connectionassist sql query "<sql>" [connection]- Execute a read-only SQL statement and print a table (rejects mutating statements)assist sql mutate "<sql>" [connection]- Execute a mutating SQL statement and print rows affectedassist sql tables [connection]- List tables in the connected databaseassist sql columns <table> [connection]- List columns for a table (schema.tablefor a non-default schema)
assist netcap [-p, --port <port>] [-o, --out <dir>] [-f, --filter <pattern>]- Capture browser network traffic tocapture.jsonlunder--out(default~/.assist/netcap), paired with the netcap browser extensionassist netcap extract-linkedin-posts [file]- Parse a netcap capture into structured LinkedIn posts, written toposts.jsonbeside the captureassist screenshot <process>- Capture a screenshot of a running application window (screenshot.outputDir, default./screenshots)assist handover save --summary <s>- Save a session handover note (content from stdin), scoped by the repo's git originassist handover list- List unrecalled handovers for this repo, most recent firstassist handover recall [id]- Print an unrecalled handover and mark it recalled (most recent by default)assist handover load- SessionStart hook entry point advising how many unrecalled handovers existassist mermaid export [file.md]- Render each fenced mermaid block to<stem>-<index>.svgvia Kroki (--out,--index,mermaid.krokiUrl)assist prompts- Show top 10 denied tool calls by frequency with count and repo breakdown
assist init- Initialize project with VS Code and verify configurationsassist new vite- Initialize a new Vite React TypeScript projectassist new cli- Initialize a new tsup CLI projectassist update- Update assist to the latest version and sync commandsassist vscode init- Add VS Code configuration filesassist deploy init- Initialize Netlify project and configure deploymentassist deploy redirect- Add trailing slash redirect script to index.htmlassist roam auth- Authenticate with Roam via OAuthassist roam show-claude-code-icon- Forward Claude Code hook activity to Roam local API
assist coverage- Print global statement coverage percentageassist complexity <pattern>- Analyze a file (all metrics if single match, maintainability if multiple)assist complexity cyclomatic [pattern]- Calculate cyclomatic complexity per functionassist complexity halstead [pattern]- Calculate Halstead metrics per functionassist complexity maintainability [pattern]- Calculate maintainability index per file (--ignore <glob>, pluscomplexity.ignore). A file can declare its own threshold with a// assist-maintainability-override: Ncomment in its first ~10 lines, replacing--thresholdfor that file onlyassist complexity sloc [pattern]- Count source lines of code per file
assist transcript configure- Configure transcript directoriesassist transcript list- List raw .vtt filenames waiting in the pick-up directoryassist transcript move <file>- Convert a raw .vtt to a dated markdown transcript and archive the originalassist voice setup- Download required voice models (VAD, STT)assist voice start [--foreground]- Start the voice daemon (always-on, listens for wake word)assist voice stop- Stop the voice daemonassist voice status- Check voice daemon status and recent eventsassist voice devices- List available audio input devicesassist voice logs [-n <count>]- Show recent voice daemon log entries
assist sessions- Start the web dashboard (same assessions web)assist sessions web [-p, --port <number>] [--no-open]- Start the web dashboard with Sessions, Backlog and News tabs (default port 3100). Ctrl+R in the foreground terminal opens a restart menu; Ctrl+. in the browser jumps to the next session waiting on inputassist sessions summarise [-f, --force] [-n, --limit <count>]- Generate one-line summaries for unsummarised Claude sessionsassist sessions set-status <status>- Report the current session's status (running/waiting) to the daemon; invoked by the Claude Code hooks the daemon wires into each sessionassist daemon run- Run the sessions daemon in the foreground (normally auto-spawned detached)assist daemon status- Show daemon status, live sessions, and any stray processes or stolen socketassist daemon stop- Stop the sessions daemon; running claude sessions resume on next startassist daemon restart- Restart the sessions daemon, resuming previously running claude sessionsassist daemon drain [--yes]- Remove all sessions from the local daemon for a clean slate; a session holding unpushed work is stopped, not removed
assist next [id] [--once]- Alias forbacklog next [id];--onceexits after the first completed item runassist draft [description] [--once](alias:feat) - Launch Claude in/draftmode, chain into next on/nextsignalassist bug [description] [--once]- Launch Claude in/bugmode, chain into next on/nextsignalassist refine [id] [--once] [--harness <claude|codex|pi>]- Launch a coding harness in/refinemode;--harnesspicks the engine, defaulting to the configuredharness.engine(Claude)assist review-pr-comments [number] [--announce] [--resume-session <id>]- Launch Claude in/review-pr-commentsmode; a PR number is checked out first viagh pr checkout.--announce(requires a number) announces the PR in Slack via/prs-slack <number> --no-confirmonce every comment thread has been processedassist fix-conflict [number] [--rebase] [--resume-session <id>]- Launch Claude in/fix-conflictmode to resolve the branch's conflicts against the remote default; a PR number is checked out first viagh pr checkout.--rebaserebases onto the remote default instead of merging it inassist signal next [id]- Write a next signal to chain intoassist nextassist signal done [id]- Write a done signal marking the session's initial task complete; an optionalidsurfaces the backlog item the session created onto its card
draft, bug, refine, review-pr-comments, fix-conflict and backlog run accept --resume-session <id> to resume an interrupted Claude session (used by the daemon when it restarts or restores a running item). Launchers without the flag — next among them — are respawned without it rather than being handed an option they would reject.
Web sessions are owned by a long-lived daemon process, not the web server: the server is a thin client relaying WebSocket traffic to the daemon over a local IPC socket (~/.assist/daemon/daemon.sock; named pipe \\.\pipe\assist-sessions-daemon on Windows). Restarting the web server leaves sessions running with scrollback intact. The daemon logs to ~/.assist/daemon/daemon.log and auto-exits once no sessions remain and no client has connected for 60 seconds. See docs/session-lifecycle.md.
The topnav has a Design dropdown: submitting a prompt launches an interactive claude session with the vendored design system prompt appended via --append-system-prompt.
Every live session card carries an add-agent button (👥) that starts a second agent inside that session's existing workspace rather than allocating a new one. While several agents share a workspace, only the last one to leave triggers teardown.
A run: entry in assist.yml flagged server: true (with an optional display-only port:) is a singleton dev server: at most one may be live per normalised git remote, i.e. across a clone and all its sibling clones. Session cards for such a repo show a ▶ start button; the daemon rejects a second server run for that remote, and the web UI turns the conflict into a "replace running server?" prompt. The serving card shows a serving :<port> chip and a ⏹ stop button, and the slot frees whenever that session stops. Non-server runs are unconstrained.
Requires assist installed on the Windows host.
sessions.windowsProjectsRoot— the Windows.claude/projectsdirectory as seen from WSL (e.g./mnt/c/Users/<user>/.claude/projects); enables discovery of Windows-host repos, tagged with aWindowsbadge.sessions.windowsDaemonHost/sessions.windowsDaemonPort— where the WSL daemon reaches the native Windows daemon (defaults127.0.0.1/51764; set the host to the Windows IP on WSL2 NAT-mode networking).sessions.windowsVersionCheck— reaction to a protocol-version mismatch in the WSL↔Windows handshake:block(default) refuses creates and auto-heals the host,warnproceeds anyway,offskips the check.
sessions.includeCommittedChanges— defaults to true: the card's change counts, the/diffview and its scope picker cover the commits recorded against the session's backlog item as well as uncommitted work, so the change link survives the agent committing. Each committed path is diffed against the parent of the earliest of those commits that touched it, so nothing outside the item's own commits is shown. Set it false to count and diff only uncommitted changes. A session whose item has no recorded commits and a clean tree still shows nothing either way.sessions.topBar— defaults to true: a sticky top bar inside the terminal panel carrying the session's ids, backlog chip and story name, the phase caption, elapsed time, the Continue/Auto-run/Dismiss switches and the session actions. Set it false to keep all of that on the card instead.sessions.floatWaiting— defaults to true: sessions that have beenwaitingon input for longer than the threshold float above the other cards, longest waiting first. Set it false to keep the star-only ordering; starred sessions still sort above everything.sessions.floatWaitingAfterMs— defaults to 5000: how long a session must have beenwaitingon input beforesessions.floatWaitingfloats it.sessions.maxLive— defaults to 24: the ceiling on concurrent live sessions one daemon holds. Spawning past it is refused (session ceiling of N reached) and a daemon birth respawns at most this many persisted sessions, deferring the rest to stopped cards. The daemon serves every repo, so set it globally:assist config set sessions.maxLive 32 -g.
Concurrent sessions in one repo can be isolated with native git worktrees instead of keeping multiple physical clones: see docs/parallel-work.md. All of these flags default off:
-
worktree.enabled(parallel work) — spill concurrent sessions into adjacent<clone>-Nworktrees. Off means every session on the repo shares its single working copy. -
worktree.watcher— starting a backlog run also ensures one starred watcher session in the clone itself: a claude session whose prompt is/watch, run with--permission-mode auto, so the clone keeps fast-forwarding and rebuilding while the run works in its worktree. The watcher's cwd is always the clone, never a worktree. One watcher per clone — a run (fresh or chained) that finds a live one spawns no second, and the reason lands indaemon.log; a watcher that has stopped or errored is replaced by the next run. Needsworktree.enabled, a/watchcommand in the repo, and anauto-buildrun entry in itsassist.yml(whatassist watch wait --buildinvokes). -
worktree.trunk(trunk-based) — on, a spilled worktree's branch tracksorigin/<trunk>so commits land on the mainline. Off, it starts off the remote default branch with no mainline tracking, leaving the session to raise its own branch and PR.While it is on, a job that commits never runs in the clone:
backlog run <id>(spawned fresh or chained into from a session already sitting in the clone) and PR checkouts (review <n>,review-pr-comments <n>) always allocate a<clone>-N, even when the clone is idle and clean. Committing there would land the work on the local mainline and leave every later worktree starting from that HEAD. Plain prompts,spawnInTreesessions,draft/bug/refineand every other command keep the normal clone-preferring placement, and a session pinned in place stays where it was launched. There is no fallback — if the worktree can't be created the spawn fails with the reason indaemon.lograther than dropping the job in the clone. Non-trunk repos are unaffected. -
worktree.includeDrafts— give draft, bug and refine sessions their own<clone>-N. They change no code, so by default they run in the clone's working copy at no worktree, dep-install or teardown cost.
Neither flag leaves permanent state on the clone: nothing writes to the clone's .git/config (assist commit derives its push refspec from the current branch), so turning parallel work back off leaves the repo as it was.
Web server changes only need the assist sessions process restarted — sessions survive. Daemon/session-core changes need assist daemon restart: claude sessions are auto-respawned via claude --resume with scrollback starting fresh, while run sessions reappear as not-restored tiles that can be retried.
prs.slack— the Slack channel (e.g.#example) that/prs-slackposts pull requests to via the Slack MCP connectorprs.required— whentrue(defaultfalse),assist backlog runcuts and records a fresh branch for a story that has no recorded branch at run start, so a new story never inherits the previous one's branchprs.promptJira— whentrue(defaultfalse), theassist prs raise --help--resolvesguidance instructs asking the user for a Jira keyprs.draft— whentrue(defaultfalse),assist prs raisecreates a draft PR.--draftand--no-draftoverride it in either direction; only the create path is affected,assist prs editnever changes an existing PR's draft statecommit.pull— when enabled,assist draft,bug,refine,nextandbacklog runrungit pull --ff-onlyfirst and abort if it fails (nextpulls once per invocation, not per item)commit.expectedBranch— when set (e.g.main),assist commitprints a non-blocking warning if HEAD is on any other branch, so work on a stray branch isn't silently orphanedbranch.prefix— when set (e.g.sw),assist branch <slug>prepends<prefix>/to the branch namebranch.defaultBranch— override the base branch, which is otherwise resolved live from the remote (git ls-remote --symref origin HEAD), falling back tomain
assist netcap only runs the receiver; the browser side is a raw Manifest V3 extension (no build step) under netcap-extension/. A MAIN-world content script patches fetch/XMLHttpRequest to capture {url, method, status, requestBody, responseBody, timestamp} and relays each entry to the background service worker, which POSTs it to the receiver. Forwarding happens in the background context, so the page's CSP (connect-src) never blocks it.
- Run
assist netcap— it prints the receiver URL, the capture file path, and the extension directory to load. The receiver host/port and the optional--filtersubstring are baked into the extension'sbackground.jsat this point. Under WSL it copies the extension toC:\tools\netcap-extensionand targets the WSL VM's IP, printing that Windows path instead; re-run after a reboot (the WSL IP can change) and reload the extension. - Load the unpacked extension:
- Firefox: open
about:debugging#/runtime/this-firefox→ Load Temporary Add-on… → pickmanifest.jsoninside the printed extension directory. (Requires Firefox 128+ for MAIN-world content scripts.) - Chrome: open
chrome://extensions, enable Developer mode, click Load unpacked, and select the extension directory.
- Firefox: open
- On load the background worker pings the receiver;
ping from extensionappears in theassist netcaplog, confirming browser→server connectivity. - Browse a site; matching requests append to the capture file live and survive page refreshes. Press Ctrl-C to stop the receiver; it prints how many entries were captured.