@staff0rd/assist
v0.388.2
Published
A CLI tool for enforcing determinism in LLM development workflow automation.
Readme
assist
A CLI tool for enforcing determinism in LLM development workflow automation.
See devlog for latest features.
Installation
You can install assist globally using npm:
npm install -g @staff0rd/assist
assist syncUpdating
assist updateLocal Development
# Clone the repository
git clone [email protected]: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.
Claude Commands
/add-command- Add a new run command to assist.yml/branch <description> [--jira KEY]- Create a branch off the fresh remote default viaassist branch, deriving a kebab-case slug from the description and auto-filling the Jira key from the session's backlog item when one is associated/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/forward-comments- Split a coarse PR comment (e.g. from Slack) into per-line review comments on the current branch's PR, attributed to the original reviewer/handover- Write a session handover note for the next conversation and save it to the backlog DB (scoped by git origin, never on disk). Can be run any number of times; each call appends a note with a one-line summary. The SessionStart hook advises how many unrecalled handovers exist/pr- Raise a PR with a concise description/prs-slack <number>- Post a PR's title and URL to the Slack channel configured inprs.slack/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 from the backlog DB, emit it as a# Recallblock, and mark it recalled. Reads DB handovers only (no transcripts or disk files)/refine- Refine an existing backlog item through conversation/restructure- Analyze and restructure tightly-coupled files/review-comments- Process PR review comments one by one/jira [action] [KEY] [args]- Dispatch Jira actions.view(default for a bare key) fetches and displays the issue;associate <KEY> [id]associates a ticket with a backlog item viaassist backlog associate-jira;update [KEY]posts a concise session-summary comment via MCP (attaches a passed key to the session item first, else reads the key from it; retargets sub-task comments to the parent; previews before posting);started [KEY]assigns it to the current Atlassian user and transitions it to In Progress;done [KEY]transitions it to Done with no assignment change;help(or bare/jira) lists the actions. A[KEY]is optional for every action — when omitted it resolves from the session's current backlog item; started/done act on the exact issue with no parent retargeting/journal- Append a journal entry summarising recent work, decisions, and notable observations/next [id]- Signal completion and chain into the next backlog item; pass anidto run a specific item directly (falls back to the picker if the id is missing, done, won't-do, or blocked)/standup- Summarise recent journal entries as a standup update/subtask <text>- Add a sub-task to the backlog item this session is working on (errors if there is no current item) by callingassist backlog add-subtask/strip-comments- Enforce self-documenting code: declare the comment policy in CLAUDE.md if absent, then strip redundant comments, commented-out code, and section banners from tracked source files (functional directives and genuine workaround comments are preserved); edits are left unstaged/sync- Sync commands and settings to ~/.claude/design <prompt>- Adopt the vendored design system prompt (~/.claude/system-prompt.md) and its design skills (~/.claude/skills/, both installed byassist sync) as context, then apply that design guidance to<prompt>/test-cover- Incrementally increase test coverage by identifying and testing uncovered files/test-review- Review existing tests for quality, coverage gaps, and adherence to 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
CLI Commands
assist activity [--since <date>]- Chart GitHub commit activity per day (defaults to last 30 days)assist backup [-o, --out <dir>]- Write a dump of the entire backlog database to<dir>/backup-<timestamp>.dump(default dir~/.assist/backups, overridable via thebackup.dirconfig key or--out) and record the dump's path and byte size in the backups table; on failure no row is recorded and the command exits with an errorassist backup schedule --every <duration>- Install or update a marked crontab block that runsassist backupon a recurring cadence (e.g.5m→*/5 * * * *,6h→0 */6 * * *), appending output to<backup.dir>/cron.log; re-running with a new duration replaces the block without duplicating it. Durations cron cannot represent evenly (sub-minute, or non-divisor intervals like90m) are rejectedassist backup schedule status- Print the active backup cadence and cron expression, or report that none is setassist backup schedule remove- Remove the marked backup schedule block from the crontab, leaving all other crontab lines intact (reports if none is set)assist db migrate- Apply pending backlog database migrations in order, recording each in theapplied_migrationstable; a no-op when the database is already up to date. Run this after installing a build that ships new migrationsassist db status- Report whether the database is in sync with the build's bundled migrations, behind (runassist db migrate), or ahead (update assist)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 sync- Copy command files to~/.claude/commands, syncsettings.jsonandCLAUDE.md, and install the design assets —claude/system-prompt.mdto~/.claude/system-prompt.mdandclaude/skills/*into~/.claude/skills(existing files in that directory are preserved)assist commit status- Show git status and diffassist commit <message>- Commit staged changes with validationassist commit <message> [files...]- Stage files and create a git commit with validationassist branch <slug> [--jira <key>]- Create and switch to a new branch off the fresh remote default branch. Assembles the name as[<prefix>/][<JIRA>-]<slug>(prefix from the optionalbranch.prefixconfig, Jira key used verbatim), fetches and branches fromorigin/<default>(resolved live from the remote, falling back tomain, overridable viabranch.defaultBranch), and rejects slugs whose numeric tokens look like backlog IDs. A long free-text slug is first shortened to a concise, LLM-assisted kebab-case name (falling back to a word-boundary trim if the model is unavailable) so branch names stay briefassist prs- List pull requests for the current repositoryassist prs raise --title <title> --what <what> --why <why> [--how <how>] [--resolves <key>] [--force]- Raise a pull request, assembling the body from## What,## Why(with--resolvesJira URLs appended inline), and an optional## How; errors if a PR already exists unless--forceoverwrites its title and bodyassist prs edit [--title <title>] [--what <what>] [--why <why>] [--how <how>] [--resolves <key>]- Update only the supplied sections of the current branch's pull request, preserving every other section of its bodyassist prs list-comments- List all comments on the current branch's pull requestassist prs fixed <comment-id> <sha>- Reply with commit link and resolve threadassist prs wontfix <comment-id> <reason>- Reply with reason and resolve threadassist prs reply <comment-id> <body>- Reply to a comment thread without resolving itassist prs comment <path> <line> <body>- Add a line comment to the pending reviewassist review [number] [options]- Run Claude and Codex in parallel to review the open PR for the current branch. The diff is fetched from GitHub (base SHA → head SHA viagh pr diff), so stale local base branches don't pollute the review; fails fast if no PR is open. By default, prompts before posting line-bound comments and then prompts again to submit the pending review (defaulting to no). Findings whose lines fall outside the diff are skipped with a warning rather than being silently dropped by GitHub. Cachedclaude.md/codex.md/synthesis.mdare reused when present; if any reviewer is re-run, the synthesis is invalidated.[number]- Rungh pr checkout <number>first, then review that PR's branch. If the checkout fails (dirty working tree, unknown PR number), the review aborts--no-prompt- Skip all confirmations--submit- Default the submit prompt to yes (or auto-submit when combined with--no-prompt)--force- Clear all cached files and re-run every phase--refine- Skip posting; launch an interactive Claude session that walks throughsynthesis.mdand edits it in place. A subsequentassist reviewreuses the refined file and posts only the surviving findings--apply- Skip posting; launch an interactive Claude session that walks through each finding asking apply/skip. Applied findings are fixed in the working tree (unstaged) and removed fromsynthesis.md; skipped findings stay so a subsequentassist reviewposts them. Cannot be combined with--refine--backlog- Skip posting; launch an interactive Claude session running/bugthat files all findings (includingalready-raised) as a single bug backlog item with one phase per finding.synthesis.mdis left untouched;--submitis ignored. Cannot be combined with--refineor--apply--verbose- Disable the stacked-spinner UI and fall back to per-line log output. Non-TTY environments (CI) automatically use this mode
assist github commits <org>- Report commit activity across a GitHub organisation over the last 30 days: repos ranked by commits to their default branch, top committers, and a per-repo author breakdown (empty repos are skipped; commits with no linked GitHub account fall back to the raw author name)--since <date>- Start of the window asYYYY-MM-DDinstead of the default 30 days ago--top <n>- Only report the topnrepos by commit count; committers and the author breakdown then cover those repos only (also caps the per-repo author queries, which speeds up large orgs)--json- Output all three views as structured JSON instead of tables
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 theASSIST_DATABASE_URLenvironment variable or thedatabase.urlkey inassist.yml; the environment variable takes precedence. Without one, everyassist backlogcommand exits with a setup message. (There is no SQLite/JSONL fallback.) Commands default to the current repository's items; pass--all-reposto span every repository.
The first backlog command in a repository that still has a local .assist/backlog.jsonl automatically migrates it into Postgres — but only as a one-time bootstrap into an empty origin. If Postgres has no items for the repo's origin yet, it runs git pull (best-effort) to fetch the latest committed copy, imports every item under the origin with fresh global IDs (rewriting links to other items), and verifies the result. If Postgres already has items for that origin (a prior run, another clone, or a pre-seeded database), the import is skipped to avoid creating duplicates. Either way the local .assist/backlog.jsonl and .assist/backlog.db are renamed to *.bak, so the migration never re-runs and a local copy is retained.
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 the prefixed form (a555) or a bare number (555).
assist backlog [--dir <path>]- Open the backlog tab in the web dashboard (same asbacklog web).--diroverrides the directory used to resolve the current repository's git originassist backlog init- Create an empty backlogassist backlog list [--status <type>] [-a, --all] [--all-repos] [-v]- List backlog items with status icons (alias:ls). Defaults to the current repository's todo/in-progress items;--allincludes done/wontdo,--all-reposlists items across all repositories. Also available as the top-level shortcutassist list/assist lswith the same flagsassist backlog add- Add a new backlog item interactively (prompts for type: story/bug)assist backlog add --name <n> --type <t> --desc <d> --ac <criterion...>- Add a backlog item from CLI options (used by/draft)assist backlog add-phase <id> <name> --task <t...> [--manual-check <c...>] [--position <pos>]- Add a phase (appends by default;--positioninserts at a 1-indexed position)assist backlog add-subtask <id> --title <t> [--desc <d>]- Add a sub-task (statustodo) to a backlog item. Sub-tasks listed under thesubtaskskey (eachtitleand optionaldescription) inassist.ymland~/.assist.ymlare auto-applied to every newly created item (stories and bugs); the global and project lists are combinedassist backlog edit-subtask <id> <idx> [--title <t>] [--desc <d>] [--status <s>]- Edit a sub-task by its 1-based index frombacklog show; updates any combination of title, description, and status (omitted fields are left unchanged).--descsupports Markdown and\nline breaks (pass--desc ""to clear it);--statusmust be one oftodo,in-progress,doneassist backlog remove-subtask <id> <idx>- Remove a sub-task by its 1-based index frombacklog show; the remaining sub-tasks are re-indexed so they stay contiguousassist backlog subtask-status <id> <idx> <status>- Set a sub-task's status (todo,in-progress,done) by its 1-based index frombacklog showassist 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 acceptance-criteria edits using 1-based indices matchingbacklog show:--add-acappends (repeatable),--edit-acreplaces criterion n in place,--remove-acdeletes criterion n and renumbers the rest (cannot be combined with the whole-list--ac)assist backlog update-phase <id> <phase> [--name <n>] [--task <t...>] [--manual-check <c...>]- Modify a plan phase (name, tasks, or manual checks)assist backlog update-phase <id> <phase> [--add-task <text>] [--edit-task <n> <text>] [--remove-task <n>] [--add-check <text>] [--edit-check <n> <text>] [--remove-check <n>]- Granular task and manual-check edits using 1-based indices matchingbacklog show:--add-*appends (repeatable),--edit-*replaces entry n in place,--remove-*deletes entry n and renumbers the rest (task ops cannot be combined with--task; check ops cannot be combined with--manual-check)assist backlog remove-phase <id> <phase>- Remove a plan phase from a backlog itemassist backlog move-phase <id> <from> <to>- Reorder a plan phase from one 1-based position to another, carrying its tasks and manual checks with itassist backlog next [id] [--once]- Pick and run the next backlog item, or open/draftif none remain; pass anidto run that item first, then continue chaining;--onceexits after the first completed item run instead of prompting for anotherassist backlog refine [id] [--once]- Alias forrefineassist backlog start <id>- Set a backlog item to in-progressassist backlog stop- Revert all in-progress backlog 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 a backlog item to a specific status (todo,in-progress,done,wontdo)assist backlog star <id>- Star a backlog item to pin it ahead of unstarred items in the web viewassist backlog unstar <id>- Remove the star from a backlog itemassist backlog delete <id>- Delete a backlog itemassist backlog show <id>- Display full detail for a backlog item (alias:view)assist backlog plan <id>- Display the phased plan for 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 from a backlog item (summaries cannot be deleted)assist backlog phase-done <id> <phase> <summary>- Signal that a plan phase is complete with a summary (used by orchestrator)assist backlog rewind <id> <phase> --reason <reason>- Rewind a backlog item to an earlier phase, setting status to in-progressassist backlog run <id>- Run a backlog item's plan phase-by-phase with Claude;--resume-session <id>resumes an interrupted Claude session for the current phase (used by the sessions daemon when it restarts a running item)assist backlog export [file]- Export every table in the backlog database (discovered by live schema introspection, so new tables are covered automatically) to a file, or stdout if omittedassist backlog import [file]- Restore every table present in a dump (file or stdin) back into the backlog database in foreign-key-safe order, faithfully replacing all data and resyncing identity sequences; prompts for confirmation (use-y, --yesto skip; required when reading from stdin)assist backlog associate-jira <id> [key]- Associate a Jira ticket with a backlog item; validates the key shape, fetches the issue to confirm it exists, and stores the key (re-running with a different key replaces it). Use--clearto remove the associationassist backlog add-activity <id> <kind> <ref>- Attach a git activity ref to a backlog item, wherekindisbranch,commit, orpr;branch/commitauto-fill their GitHub URL. Use--title,--url,--stateto supply or override metadata. Re-adding the same kind and ref upserts rather than duplicatingassist backlog move-repo <old-origin> [new-origin]- Retag all items from one origin to another after a repo rename; the new origin defaults to the current repo's remote, both accept URL orgit@forms, and a bare repo name works for the old origin when unambiguous. Prompts for confirmation (use-y, --yesto skip)assist backlog web [-p, --port <number>] [--no-open]- Open the backlog tab in the web dashboard (default port 3100);--no-openskips opening a browser on startupassist roam auth- Authenticate with Roam via OAuth (opens browser, saves tokens to ~/.assist.yml)assist roam show-claude-code-icon- Forward Claude Code hook activity to Roam local APIassist run <name> [params...]- Run a configured command from assist.yml (positional params are matched toparamsconfig; supportsprearray of commands to run first). If<name>is a backlog item id (a555or a bare555) and matches no configured command, it is treated as an alias forassist backlog run <name>and forwards--write/--no-write/-w.assist 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 from assist.yml and delete its Claude command fileassist config set <key> <value>- Set a config value (e.g. commit.push true)assist config get <key>- Get a config valueassist config list- List all config valuesprs.slack- The Slack channel (e.g.#example) that/prs-slackposts pull requests to via the Slack MCP connector (optional; can be omitted when onlyprs.requiredis set)prs.required- Whentrue(defaultfalse),assist backlog runauto-branches a story that has no recorded branch at run start, so a new story never inherits the previous story's branch
assist verify- Run all verify:* commands in parallel (from run configs in assist.yml and scripts in package.json)assist verify all- Run all checks, ignoring diff-based filtersassist verify --measure- After the run, print a summary table of each command's status and duration (slowest first) plus a wall-clock totalassist verify init- Add verify scripts to a project (writes toassist.ymlby default; pass--package-jsonto write topackage.jsonscripts instead)assist verify hardcoded-colors- Check for hardcoded hex colors in src/ (supportshardcodedColors.ignoreglobs in config)assist verify block-comments- Fail on any comment on a changed line (staged + unstaged), whether newly added or edited, reporting each offending file:line; functional machine directives are exempt andblockComments.ignoreglobs in config scope which files are scanned. Yaml.yml/.yamlfiles are scanned for#comments with no directive exemptionsassist verify forbidden-strings- Check configured JSON files for disallowed values. EachforbiddenStringsrule names afile, a list of dot-pathsto inspect (string or string[] values are scanned; other types skipped), and adisallowedwildcard matched via minimatch; any matching value fails the check. Zero rules is a no-op that passesassist verify config-keys- Check that every leaf key inassistConfigSchemais surfaced in some command's--helpvia theconfigHelphelper. Fails when a schema key is documented by no command (add it withconfigHelp) or when a declared key is not in the schema. Keys not yet migrated are tracked in apendingConfigDocumentationlist that must be drained as commands adoptconfigHelpassist verify migrations- Check the bundled DB migrations undersrc/shared/db/migrations/are safe to ship: sequentially numbered1..Ninindex.tsorder with a matching file per id, append-only (fails if a migration already present on the default branch is edited or removed — add a new numbered migration instead), and free of unacknowledged destructive DDL (DROP TABLE,DROP COLUMN,RENAME COLUMNmust carry a-- destructive-okmarker in the migration's SQL)assist lint [-f, --fix]- Run lint checks for conventions not enforced by oxlint (use-fto auto-fix)assist lint init- Initialize oxlint with baseline linter configassist 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 (dry-run by default, use--applyto execute)assist refactor rename symbol <file> <oldName> <newName>- Rename a variable, function, class, or type across the project (dry-run by default, use--applyto execute)assist refactor extract <file> <functionName> <destination>- Extract a function and its private dependencies to a new file (dry-run by default, use--applyto execute)assist refactor restructure [pattern]- Analyze import graph and restructure tightly-coupled files into nested directoriesassist 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 infoassist cli-hook- PreToolUse hook for auto-approving CLI commands (reads fromallowed.cli-readsandallowed.cli-writes, also auto-approves read-onlygh apicalls). Supports compound commands (|,&&,||,;) by checking each sub-command independently.assist 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-approved bycli-hook(tool defaults toBash)assist 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 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 single-line comment (max 50 chars; no block comments for.ts/.js) and issue a pin authorising its insertion; inserts#for#-comment files (.yml/.yaml, Dockerfile,*.env,*.sh) and//otherwiseassist code-comment confirm <pin>- Insert the pinned comment at its file/line and clear the pin stateassist 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 notify- Show desktop notification from JSON stdin (supports macOS, Windows, WSL)assist status-line- Format Claude Code status line from JSON stdinassist dotnet inspect [sln]- Run JetBrains inspections on changed .cs files to find dead codeassist dotnet inspect [sln] --scope all- Inspect the full solutionassist dotnet inspect [sln] --scope base:<ref>- Inspect all .cs files changed since diverging from a base ref (e.g.--scope base:mainfor a full PR)assist dotnet inspect [sln] --scope commit:<ref>- Inspect .cs files changed in a specific commitassist dotnet inspect [sln] --only <ids...>- Show only the specified issue type IDs (e.g.--only CommentedCode)assist dotnet inspect [sln] --suppress <ids...>- Suppress specific issue type IDs on the command lineassist dotnet inspect [sln] --roslyn- Use Roslyn analyzers via msbuild instead of JetBrainsassist dotnet inspect [sln] --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 fileassist jira auth- Authenticate with Jira via API token (saves site/email to ~/.assist/jira.json)assist 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 is wired to the MCP Atlassian server (
mcp__claude_ai_Atlassian__getJiraIssue) for fetching Jira context, so the/jiraslash command and Jira-key mentions go through MCP. Theseassist jiraCLI commands remain for direct human use.
- Note: Claude is wired to the MCP Atlassian server (
assist ravendb auth add- Add a new RavenDB connection (prompts for name, URL, database, op:// secret reference)assist ravendb auth list- List configured RavenDB connectionsassist ravendb auth remove <name>- Remove a configured connectionassist ravendb set-connection <name>- Set the default connection for query/collections commandsassist ravendb query [connection] [collection]- Query a RavenDB collection (outputs JSON to stdout)assist ravendb query [connection] [collection] --page-size <n> --sort <field> --query <lucene> --limit <n>- Query with optionsassist ravendb collections [connection]- List collections and document counts in a databaseassist seq auth add- Add a new Seq connection (prompts for name, URL, API token)assist 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 with a filter expressionassist seq query <filter> -c <connection>- Query using a specific connectionassist seq query <filter> --json- Output raw JSONassist seq query <filter> -n <count>- Fetch a specific number of events (default 50)assist seq query <filter> --from <date>- Start of query window (UTC date or relative e.g. 5m, 1h, 2d)assist seq query <filter> --to <date>- End of query window (UTC date or relative e.g. 5m, 1h, 2d)assist sql auth add- Add a new MSSQL connection (prompts for name, server, port, user, password, database)assist 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 results in table format (rejects INSERT/UPDATE/DELETE/DROP/CREATE/ALTER/TRUNCATE/MERGE/GRANT/REVOKE/EXEC)assist sql mutate "<sql>" [connection]- Execute a mutating SQL statement and print rows affected (rejects non-mutating statements like pure SELECTs)assist sql tables [connection]- List tables in the connected database (via INFORMATION_SCHEMA.TABLES)assist sql columns <table> [connection]- List columns for a table (useschema.tablefor non-default schema; via INFORMATION_SCHEMA.COLUMNS)assist netcap [-p, --port <port>] [-o, --out <dir>] [-f, --filter <pattern>]- Start a local receiver that captures browser network traffic to a JSONL file (capture.jsonlunder--out, default~/.assist/netcap), paired with the netcap browser extension. Sends permissive CORS, logs each ping/capture live, and runs until Ctrl-C, then prints a capture count (default port8723).--filterbakes a URL substring into the extension so only matching requests forward. See netcap browser extensionassist netcap extract-linkedin-posts [file]- Parse a netcap capture file into structured LinkedIn posts (text,markdownwith mentions linked,author,mentions,hashtags,links,relatedPosts,permalinkto the post, andpostedAtdecoded from the activity id) and write them toposts.jsonbeside the capture (defaults to~/.assist/netcap/capture.jsonl). Reads both the LinkedIn SDUI (rsc-action) responses rendered on first paint and the voyager GraphQL profile-updates responses loaded on scroll, deduped by activity urn keeping the richest copy of each postassist screenshot <process>- Capture a screenshot of a running application window (e.g.assist screenshot notepad). Output directory is configurable viascreenshot.outputDir(default./screenshots)assist handover save --summary <s>- Save a session handover note to the backlog DB (content read from stdin), scoped by the repo's git origin. Appends a new row each call;--summaryis the one-line description shown when recallingassist handover list- List unrecalled handovers for this repo, most recent first, one per line as tab-separatedid, ISO-8601 created timestamp, and one-line summary. Prints nothing when none are pendingassist handover recall [id]- Print an unrecalled handover for this repo and mark it recalled (so it drops out of the SessionStart advisory and future recalls). Recalls the most recent by default, or the givenid. Prints nothing when none matchassist handover load- SessionStart hook entry point: reads{cwd, session_id}from stdin, migrates any legacy disk handovers (.assist/HANDOVER.mdand notes under.assist/handovers/) into the backlog DB then deletes them, and emits{ hookSpecificOutput: { hookEventName: "SessionStart" }, systemMessage }advising how many unrecalled handovers exist. Emits nothing when there are none (use/recallto load one)assist mermaid export [file.md]- Render each fenced mermaid block to<stem>-<index>.svgvia Kroki. With no file, scans*.mdin the current directory (non-recursive). Use--out <dir>to override the output directory. Use--index <n>to render only the nth mermaid block (1-based; requires a file argument). Endpoint is configurable viamermaid.krokiUrl(defaulthttps://kroki.io).assist prompts- Show top 10 denied tool calls by frequency with count and repo breakdownassist 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>, repeatable, excludes extra files on top ofcomplexity.ignore). A file can declare its own threshold with a// assist-maintainability-override: Ncomment in its first ~10 lines (integer 0-100); that value replaces the global--thresholdfor that file only and the output annotates it with(override: N)assist complexity sloc [pattern]- Count source lines of code per fileassist 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- Start the voice daemon (always-on, listens for wake word)assist voice start --foreground- Start in foreground for debuggingassist 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 entriesassist 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, xterm.js terminals with clickable http(s) links (default port 3100);--no-openskips opening a browser on startup; press Ctrl+R in the foreground terminal for an in-terminal restart menu (Restart daemon, Restart webserver, Restart both); Restart webserver re-execs the foreground process (passing--no-openso no browser pops on restart) so the connected browser auto-reconnectsassist sessions summarise [-f, --force] [-n, --limit <count>]- Generate one-line summaries for unsummarised Claude sessions (force re-generates all; limit caps how many to process)assist sessions set-status <status>- Report the current session's status (running/waiting) to the sessions daemon; reads the session id from$ASSIST_SESSION_IDand is invoked by the Claude Code hooks the daemon wires into each session (exits silently when run outside a daemon session)assist daemon run- Run the sessions daemon in the foreground (normally auto-spawned detached byassist sessions)assist daemon status- Show sessions daemon status, live sessions, and any stray daemon 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- Remove all sessions from the local daemon for a clean slate (does not affect the Windows daemon)
The sessions topnav has a Design dropdown: submitting a prompt launches an interactive claude session with the vendored design system prompt appended via --append-system-prompt (so the 647-line prompt stays out of the visible conversation) and the prompt sent as the first message; submitting an empty prompt opens a design-configured session with no initial message.
Web sessions are owned by a long-lived daemon process, not the web server: the server is a thin client that relays WebSocket traffic to the daemon over a local IPC socket (unix domain socket at ~/.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 (timestamped lines tagged with the daemon's pid, including why it spawned and which sessions it restored) and auto-exits once no sessions remain and no client has been connected for 60 seconds (it is respawned on demand by the web server). Daemon spawning is arbitrated by an O_EXCL lockfile so racing clients start at most one daemon; sessions are only restored after the daemon owns the IPC socket, and a daemon that loses ownership of daemon.pid shuts down its sessions and exits rather than running orphaned.
From WSL, the selector can also surface and drive Windows-host repos (requires assist installed on the Windows host). Config keys:
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. Selecting one launches a native assist daemon on Windows and runs an interactive session there.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— how the WSL↔Windows daemon handshake reacts to a protocol-version mismatch:block(default) refuses creates and auto-heals the host,warnlogs and proceeds anyway,offskips the check. Usewarn/offto keep working across an unfixable version gap.
When iterating on assist itself: web server changes only need the assist sessions process restarted — sessions survive. Daemon/session-core changes need assist daemon restart to load the new code; this kills the PTYs, then claude sessions — including assist sessions that wrap claude, like assist draft — are auto-respawned via claude --resume with scrollback starting fresh, while run sessions (and assist sessions whose claude sessionId was never discovered) reappear as not-restored tiles that can be retried. A --once draft/bug/refine session is respawned through its assist wrapper instead of bare claude --resume, so its assist signal done watcher is re-established and the card still auto-closes.
assist next [id] [--once]- Alias forbacklog next [id];--onceexits after the first completed item run instead of prompting for anotherassist draft [description] [--once](alias:feat) - Launch Claude in/draftmode, chain into next on/nextsignal; an optionaldescriptionis forwarded as/draft <description>;--onceexits when the done signal arrives after the initial draft completes;--resume-session <id>resumes an interrupted Claude session (used by the sessions daemon when it restarts a running item)assist bug [description] [--once]- Launch Claude in/bugmode, chain into next on/nextsignal; an optionaldescriptionis forwarded as/bug <description>;--onceexits when the done signal arrives after the initial bug report completes;--resume-session <id>resumes an interrupted Claude session (used by the sessions daemon when it restarts a running item)assist refine [id] [--once]- Launch Claude in/refinemode to refine a backlog item; prompts for selection when no id given;--onceexits when the done signal arrives after refinement completes;--resume-session <id>resumes an interrupted Claude session (used by the sessions daemon when it restarts a running item)assist review-comments [number]- Launch Claude in/review-commentsmode to process PR review comments (single session, no chaining); when a PR number is supplied, checks out that PR viagh pr checkoutfirstassist signal next [id]- Write a next signal to chain intoassist next; whenidis supplied, the parent launcher runs that backlog item directlyassist signal done [id]- Write a done signal marking the session's initial task complete; an optionalidsurfaces the backlog item the session created onto its session card;--oncelaunch sessions exit when it arrives, plain sessions ignore it
When commit.pull is enabled in config, assist draft, assist bug, assist refine, assist next, and assist backlog run run git pull --ff-only before doing anything else; if the pull fails the command aborts. assist next pulls once per invocation, not per item in its loop.
When commit.expectedBranch is set (e.g. main), assist commit prints a prominent warning if HEAD is on any other branch before committing — so work committed (and pushed) on a stray branch in a repo that lands directly on the expected branch isn't silently orphaned. The warning is non-blocking: the commit still proceeds. With the key unset, behaviour is unchanged and no branch check runs.
When branch.prefix is set (e.g. sw), assist branch <slug> prepends <prefix>/ to the branch name. With the key unset, no prefix segment is added.
assist branch resolves the base branch live from the remote (git ls-remote --symref origin HEAD), so it never depends on a stale or unset local origin/HEAD. If the remote advertises no default it falls back to main. Set branch.defaultBranch (e.g. develop) to override the base branch outright.
When prs.required is true, assist backlog run checks at run start whether a branch has been recorded against the story; if none has, it uses the same branch-creation code as assist branch to cut a fresh branch off origin/<default> (a concise, LLM-assisted name derived from the story's title, plus its Jira key when associated) and records it against the story. A story that already has a recorded branch is left untouched, so resumes and later phases never re-branch. With the key unset or false, run behaviour is unchanged.
netcap browser extension
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}, relays each entry to the background service worker (window.postMessage → chrome.runtime.sendMessage), and the background worker POSTs it to the receiver. The XHR patch reads the response across every responseType (json, blob, arraybuffer, document, not just text) — LinkedIn's voyager GraphQL calls use responseType: "json", which exposes no responseText, so reading responseText alone captured those bodies empty. Forwarding happens in the background context, so the page's CSP (connect-src) never blocks it — the limitation that killed the earlier console-paste approach.
- Run
assist netcap— it prints the receiver URL, the capture file path, and the absolute path to the extension directory to load. The receiver host/port is baked into the extension'sbackground.jsat this point. Under WSL (where the browser runs on the Windows host, cannot load from a WSL path, and cannot reach the receiver onlocalhostbecause WSL2 localhost forwarding is unreliable) it copies the extension toC:\tools\netcap-extension, targets the WSL VM's IP, and prints that Windows path instead. Re-runassist netcapafter 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 (e.g. LinkedIn activity); matching requests append to the capture file live and survive page refreshes (re-loading the extension appends to the same file). Press Ctrl-C to stop the receiver; it prints how many entries were captured.
assist netcap bakes the receiver host/port and the optional --filter substring into the extension's background.js at startup, so you don't normally edit it by hand. With --filter <pattern>, the background worker only forwards requests whose URL contains <pattern> (case-sensitive substring); the matching logic mirrors matchesNetcapFilter in src/commands/netcap. Use --out <dir> to write capture.jsonl into a different directory.
