@staff0rd/assist 0.751.0 → 0.753.0

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 (34) hide show
  1. package/README.md +5 -30
  2. package/allowed.cli-reads +0 -1
  3. package/allowed.cli-writes +0 -1
  4. package/claude/settings.json +1 -22
  5. package/claude/skills/review-ci/scripts/review.mjs +111 -111
  6. package/dist/allowed.cli-reads +0 -1
  7. package/dist/allowed.cli-writes +0 -1
  8. package/dist/commands/sessions/web/bundle.js +1 -1
  9. package/dist/index.js +1863 -2328
  10. package/package.json +1 -1
  11. package/claude/commands/handover.md +0 -65
  12. package/claude/commands/journal.md +0 -74
  13. package/claude/commands/recall.md +0 -55
  14. package/claude/commands/standup.md +0 -35
  15. package/claude/commands/voice-logs.md +0 -5
  16. package/claude/commands/voice-setup.md +0 -5
  17. package/claude/commands/voice-start.md +0 -5
  18. package/claude/commands/voice-status.md +0 -5
  19. package/claude/commands/voice-stop.md +0 -5
  20. package/dist/commands/voice/python/CLAUDE.md +0 -11
  21. package/dist/commands/voice/python/audio_capture.py +0 -52
  22. package/dist/commands/voice/python/check_mi.py +0 -21
  23. package/dist/commands/voice/python/dispatch.py +0 -14
  24. package/dist/commands/voice/python/keyboard.py +0 -73
  25. package/dist/commands/voice/python/list_devices.py +0 -20
  26. package/dist/commands/voice/python/logger.py +0 -38
  27. package/dist/commands/voice/python/pyproject.toml +0 -26
  28. package/dist/commands/voice/python/setup_models.py +0 -91
  29. package/dist/commands/voice/python/smart_turn.py +0 -63
  30. package/dist/commands/voice/python/stt.py +0 -54
  31. package/dist/commands/voice/python/uv.lock +0 -5946
  32. package/dist/commands/voice/python/vad.py +0 -50
  33. package/dist/commands/voice/python/voice_daemon.py +0 -528
  34. package/dist/commands/voice/python/wake_word.py +0 -26
package/README.md CHANGED
@@ -52,13 +52,11 @@ After installation, the `assist` command will be available globally. You can als
52
52
  - `/fix-conflict [--rebase]` - Resolve the current PR branch's conflicts against the remote default, verify, then push; merges by default, `--rebase` replays the branch and pushes with `--force-with-lease`
53
53
  - `/fix-rules [dir]` - Put existing rules into the `## Rules` format `assist rules` reads
54
54
  - `/forward-comments` - Split a coarse PR comment into per-line review comments, attributed to the original reviewer
55
- - `/handover` - Write a session handover note for the next conversation
56
55
  - `/pr` - Raise a PR with a concise description, then watch CI in the background
57
56
  - `/prs-slack <number> [--no-confirm]` - Post a PR's title and URL to the Slack channel configured in `prs.slack`; `--no-confirm` skips the confirmation and posts straight away (used by chained announces)
58
57
  - `/prs-status [channel] <owner/repo>...` - Post an overview of the open PRs across the named repos to Slack: a summary line in the channel, the PRs grouped by what they are waiting on in its thread; the channel falls back to `slack.channel`
59
58
  - `/refactor` - Run refactoring checks for code quality
60
59
  - `/prompts` - Analyze denied tool calls and suggest settings changes to auto-allow recurring prompts
61
- - `/recall` - Recall the most recent handover note for this repo
62
60
  - `/run-logs [session-id|group]` - Read a run session's output via `assist sessions output` — a session id, or else a server group (default `default`) for this repo — and summarise its errors and relevant lines
63
61
  - `/releases-configure` - Set this repo's release promotion topology: read its workflow files, follow every `uses:` reusable-workflow call to whatever depth it nests, flatten the `needs:` graph across those boundaries into nodes and edges, put the graph to the user to accept or edit, then write it with `assist releases configure --streams ...` to the project `assist.yml` or this repo's block in `~/.assist.yml`. The repo is the one you are in — it is never passed
64
62
  - `/refine` - Refine an existing backlog item through conversation
@@ -70,10 +68,8 @@ After installation, the `assist` command will be available globally. You can als
70
68
  - `/review-pr-comments` - Process PR review comments one by one
71
69
  - `/jira [action] [KEY] [args]` - Jira actions: `view`, `associate`, `update`, `started`, `done`, `help`. `[KEY]` is optional — it resolves from the session's backlog item
72
70
  - `/github [action] [ref] [args]` - GitHub issue actions: `view`, `edit`, `associate`, `update`, `started`, `done`, `help`. `[ref]` is optional — it resolves from the session's backlog item. A bare `/github <ref>` runs `edit`, which opens the issue in the web preview pane; outside a web session the command prints the issue to chat instead
73
- - `/journal` - Append a journal entry summarising recent work
74
71
  - `/next [id]` - Signal completion and chain into the next backlog item
75
72
  - `/slack-post [channel] [--thread <ts-or-permalink>] <what to say>` - Compose a markdown message, preview it in the web pane via `assist slack post`, then post the approved body to that Slack channel with the Slack MCP connector and report the permalink. The channel falls back to `slack.channel`; `--thread` posts the message as a reply in that thread. Asked for a thread of several messages, it composes all of them up front and previews the batch in a single `assist slack post --parts` call — a pane per message, in order — and posts nothing until every one is approved: the first message opens the thread and the rest follow under the `thread_ts` it returns, or all of them reply under the resolved `thread_ts` when `--thread` was given. A rejection posts nothing at all; the rejected message is revised in its working file and the whole batch re-previewed from the first message
76
- - `/standup` - Summarise recent journal entries as a standup update
77
73
  - `/subtask <text>` - Add a sub-task to the session's current backlog item
78
74
  - `/strip-code-comments` - Strip redundant comments from tracked source files
79
75
  - `/sync` - Sync commands and settings to ~/.claude
@@ -91,11 +87,6 @@ After installation, the `assist` command will be available globally. You can als
91
87
  - `/verify` - Run all verification commands in parallel
92
88
  - `/verify-new` - Add a new verify:\* run command to assist.yml
93
89
  - `/transcripts` - Format and summarise meeting transcripts end to end
94
- - `/voice-setup` - Download required voice models (VAD, STT)
95
- - `/voice-start` - Start the voice interaction daemon
96
- - `/voice-stop` - Stop the voice interaction daemon
97
- - `/voice-status` - Check voice daemon status
98
- - `/voice-logs` - Show recent voice daemon logs
99
90
 
100
91
  ## CLI Commands
101
92
 
@@ -109,6 +100,7 @@ Every command supports `--help` for full detail on its flags and behaviour.
109
100
  - `assist backup schedule remove` - Remove the backup schedule block from the crontab
110
101
  - `assist db migrate` - Apply pending backlog database migrations in order
111
102
  - `assist db status` - Report whether the database is in sync with the build's bundled migrations
103
+ - `assist db drop-retired` - Drop retired tables left by removed features (e.g. `handovers`), showing each table's row count and asking for confirmation first
112
104
 
113
105
  ### Git and GitHub
114
106
 
@@ -341,10 +333,6 @@ The Config tab of the sessions web dashboard never receives secret values: `GET
341
333
  - `assist netcap extract-linkedin-posts [file]` - Parse a netcap capture into structured LinkedIn posts, written to `posts.json` beside the capture
342
334
  - `assist criteria-extension [--sign]` - Print the directory to load the [acceptance criteria outliner extension](#acceptance-criteria-outliner-extension) unpacked from (copies to `C:\tools\criteria-extension` under WSL); `--sign` signs it on AMO's unlisted channel and prints the `.xpi` for a permanent Firefox install
343
335
  - `assist screenshot <process>` - Capture a screenshot of a running application window (`screenshot.outputDir`, default `./screenshots`)
344
- - `assist handover save --summary <s>` - Save a session handover note (content from stdin), scoped by the repo's git origin
345
- - `assist handover list` - List unrecalled handovers for this repo, most recent first
346
- - `assist handover recall [id]` - Print an unrecalled handover and mark it recalled (most recent by default)
347
- - `assist handover load` - SessionStart hook entry point advising how many unrecalled handovers exist
348
336
  - `assist mermaid export [file.md]` - Render each fenced mermaid block to `<stem>-<index>.svg` via [Kroki](https://kroki.io) (`--out`, `--index`, `mermaid.krokiUrl`)
349
337
  - `assist prompts` - Show top 10 denied tool calls by frequency with count and repo breakdown
350
338
  - `assist chart [--title <title>]` - Draw a terminal line chart of a `label value` series piped in on stdin, one pair per line, separated by a comma, tab or whitespace. Points are charted in the order given — nothing is sorted or aggregated — and the chart closes on q, Esc or Ctrl-C. The y axis fits the data range with 20% padding rather than starting at zero, so a series that only moves in its third decimal still reads as a shape; a flat series is padded so the line does not sit on the axis. Blank lines are skipped, fewer than two points prints `Not enough data points to chart.`, and a non-numeric value exits 1 naming the line
@@ -372,19 +360,13 @@ The Config tab of the sessions web dashboard never receives secret values: `GET
372
360
  - `assist complexity maintainability [pattern]` - Calculate maintainability index per file (`--ignore <glob>`, plus `complexity.ignore`). A file can declare its own threshold with a `// assist-maintainability-override: N` comment in its first ~10 lines, replacing `--threshold` for that file only
373
361
  - `assist complexity sloc [pattern]` - Count source lines of code per file
374
362
 
375
- ### Transcripts and voice
363
+ ### Transcripts
376
364
 
377
365
  - `assist transcript configure` - Configure transcript directories
378
366
  - `assist transcript clean <path>` - Clean any .vtt file and write the result to stdout (`--format <md|vtt>`, default `md`). Markdown chat log: `assist transcript clean ./raw.vtt > clean.md`; cleaned WebVTT with timings preserved: `assist transcript clean ./raw.vtt --format vtt > fixed.vtt`. `--timestamps` prefixes each markdown speaker turn with `[hh:mm:ss]`, so passages can be cited as ranges for `merge --select`: `assist transcript clean ./raw.vtt --format md --timestamps`
379
367
  - `assist transcript list` - List raw .vtt filenames waiting in the pick-up directory
380
368
  - `assist transcript merge <path...>` - Collapse several .vtt files into one transcript with `NOTE` provenance, rebasing cue times onto a continuous timeline (`--out <path>` to write a file instead of stdout): `assist transcript merge ./a.vtt ./b.vtt --out ./refinement.vtt`. `--select <file|->` takes keep/removed JSON (`-` reads it from stdin) naming the ranges to keep, so only those passages survive and the dropped ones are counted in the header: `assist transcript merge ./a.vtt ./b.vtt --select ./selection.json`. `--no-provenance` omits every `NOTE` — the Collapsed-from header, the per-passage source marks and the removed count — for an output going somewhere the source names and cut points should not follow: `assist transcript merge ./a.vtt ./b.vtt --select ./selection.json --no-provenance`. `--widen-audience` retunes the language for a reader who was not in the call: the casual asides pitched at the people who were — an intensifier before a word, emphasis after a wh-word, a standalone interjection — are deleted, along with any cue that is nothing but one, leaving anything that carries meaning (verb, idiom, decision marker, predicate adjective, noun, reported speech) for you to judge: `assist transcript merge ./a.vtt ./b.vtt --no-provenance --widen-audience`
381
369
  - `assist transcript move <file>` - Convert a raw .vtt to a dated markdown transcript and archive the original
382
- - `assist voice setup` - Download required voice models (VAD, STT)
383
- - `assist voice start [--foreground]` - Start the voice daemon (always-on, listens for wake word)
384
- - `assist voice stop` - Stop the voice daemon
385
- - `assist voice status` - Check voice daemon status and recent events
386
- - `assist voice devices` - List available audio input devices
387
- - `assist voice logs [-n <count>]` - Show recent voice daemon log entries
388
370
 
389
371
  ### Sessions
390
372
 
@@ -397,7 +379,6 @@ The Config tab of the sessions web dashboard never receives secret values: `GET
397
379
  - `assist sessions nodes [--json]` - List this node and every linked node with its link state (see [Linked nodes](#linked-nodes))
398
380
  - `assist sessions nodes link <name> [url] [--tailscale <host> --port <port>] [--ssh <alias> --port <port>] [--local-port <port>]` - Link a peer node by its web server URL, its Tailscale name, or over an ssh tunnel
399
381
  - `assist sessions nodes unlink <name>` - Remove a linked node
400
- - `assist sessions nodes serve [-p, --port <port>]` - Expose this node's web server on the tailnet with `tailscale serve` and print the command that links it
401
382
  - `assist sessions nodes doctor [name] [--json]` - Probe each hop of every link (or one) and stop at the first failure with a remediation
402
383
  - `assist sessions nodes logs <name> [-n, --lines <count>] [--json]` - Tail a linked node's `daemon.log` through its web server
403
384
  - `assist 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 session
@@ -437,7 +418,6 @@ Each assist install is a **node** with its own daemon and web server. A node can
437
418
  - `assist sessions nodes [--json]` — this node and each link's state (connected / connecting / disconnected / version-blocked), peer version and last error.
438
419
  - `assist sessions nodes link <name> <url>` — link a peer by its web server URL, e.g. `assist sessions nodes link <name> http://127.0.0.1:<port>`. `<name>` must match the peer's `sessions.nodeName`. A running daemon picks up the change immediately; the command confirms the reload, or warns when the daemon could not be notified. With `--tailscale <host> --port <port>` it writes a url link to `https://<host>.<tailnet>.ts.net:<port>`, reading the tailnet's MagicDNS suffix from `tailscale status --json` (`tailscale.exe` under WSL); see [Linking machines over Tailscale](#linking-machines-over-tailscale). With `--ssh <alias> --port <port>` the link goes over ssh instead: the daemon keeps `ssh -N -L <local-port>:127.0.0.1:<port> <alias>` up, restarting it behind the link's circuit breaker and logging its stderr to `daemon.log` as `link <name> ssh:`, and the link and `?node=` panel requests dial the local end. `--local-port` defaults to 43000 + `port` % 1000, bumped past any other link's.
439
420
  - `assist sessions nodes unlink <name>` — remove a link.
440
- - `assist sessions nodes serve [-p, --port <port>]` — runs `tailscale serve --bg --https=<port> http://127.0.0.1:<port>` for this node's web server port (default 3100; `tailscale.exe` under WSL), skipping it when `tailscale serve status --json` already proxies that port there, then prints the `https://<host>.<tailnet>.ts.net:<port>` URL and the `assist sessions nodes link <this node> --tailscale <host> --port <port>` command to run on other nodes.
441
421
  - `assist sessions nodes doctor [name] [--json]` — probes each link's hops in order: for a `*.ts.net` link, local Tailscale running and the peer host online in `tailscale status`; for an ssh link, the SSH agent (the alias's `IdentityAgent` answering `ssh-add -l`), `ssh -o BatchMode=yes <alias>` reach and auth, and the local tunnel port accepting; then the peer's web server (`GET /api/health`, including that its `nodeName` matches the link), the peer's daemon (as its health reports it), a WebSocket `hello` (version and protocol), then this node's own link state. It stops at the first failing hop and prints the raw error with a remediation, and exits 1 on any failure. On WSL with no links, it reports a Windows node answering on `127.0.0.1:3101` and prints the command that links it.
442
422
  - `assist sessions nodes logs <name> [-n, --lines <count>] [--json]` — tail a linked node's `daemon.log` (default 200 lines) through its web server's `GET /api/daemon-log`; naming this node reads the local log.
443
423
  - `sessions.linkVersionCheck` — reaction to a version mismatch with a linked node: `block` (default) heals an older peer by calling its `POST /api/self-update` (runs `assist update`, then restarts its daemon and web server) and reconnects, latching with an error if the gap remains or this node is the older side (a latched link re-checks the peer every minute and reconnects once the versions match); `warn` proceeds anyway; `off` skips the check.
@@ -449,13 +429,7 @@ With more than one node, a machine picker appears in the top nav and a machine s
449
429
  The sessions web server listens on `127.0.0.1` only. Each peer exposes it on its tailnet name with `tailscale serve`, and the linking node dials it over HTTPS, so links keep working off the home network.
450
430
 
451
431
  1. Install Tailscale on every machine and sign in to the same tailnet. In the admin console's DNS page, turn on MagicDNS and HTTPS certificates. On WSL the Tailscale CLI is the Windows one, `tailscale.exe`.
452
- 2. On each peer, serve its web server port on the tailnet with `assist sessions nodes serve --port <port>`, which prints the link command for step 3. On a PC whose WSL node serves 3100 and Windows node 3101, run it in WSL and in Windows (Windows' `tailscale serve` reaches WSL's `127.0.0.1:3100` through localhost forwarding):
453
-
454
- ```
455
- assist sessions nodes serve --port 3100 # in WSL
456
- assist sessions nodes serve --port 3101 # in Windows
457
- ```
458
-
432
+ 2. Each web server serves its own port on the tailnet when it starts: `tailscale serve --bg --https=<port> http://127.0.0.1:<port>`, skipped when `tailscale serve status --json` already proxies that port there, when Tailscale is not installed or running, or when `sessions.tailscaleServe` is false. It logs one `tailscale serve:` line to its stdout. On a PC whose WSL node serves 3100 and Windows node 3101, both go through the Windows Tailscale (WSL's through `tailscale.exe`, reaching its `127.0.0.1:3100` through localhost forwarding), retrying when their writes to its serve config collide at login.
459
433
  3. Link the nodes by Tailscale host name. From the Mac to both PC nodes:
460
434
 
461
435
  ```
@@ -463,7 +437,7 @@ The sessions web server listens on `127.0.0.1` only. Each peer exposes it on its
463
437
  assist sessions nodes link pc-windows --tailscale pc --port 3101
464
438
  ```
465
439
 
466
- 4. Check each link with `assist sessions nodes doctor`; a failed web hop on a `*.ts.net` link names the `assist sessions nodes serve` command to run on the peer.
440
+ 4. Check each link with `assist sessions nodes doctor`; a failed web hop on a `*.ts.net` link points at the `tailscale serve:` line in the peer's web server log.
467
441
 
468
442
  #### Linking machines over ssh
469
443
 
@@ -496,6 +470,7 @@ A remote node is reached through an ssh tunnel to its loopback web server, with
496
470
  ### Session config keys
497
471
 
498
472
  - `sessions.nodeName` — this install's node label, shown at the top of the web UI's hamburger menu and reported by `GET /api/health` (with the assist version, protocol and whether the daemon is reachable). Defaults to the OS hostname, suffixed `-wsl` under WSL.
473
+ - `sessions.tailscaleServe` — defaults to **true**: the web server exposes its port on the tailnet with `tailscale serve` when it starts (see [Linking machines over Tailscale](#linking-machines-over-tailscale)). Set it false to keep that node off the tailnet.
499
474
  - `sessions.includeCommittedChanges` — defaults to **true**: the card's change counts, the `/diff` view 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.
500
475
  - `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.
501
476
  - `sessions.floatWaiting` — defaults to **true**: sessions that have been `waiting` on 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.
package/allowed.cli-reads CHANGED
@@ -73,7 +73,6 @@ assist sql tables
73
73
  assist status-line
74
74
  assist transcript list
75
75
  assist verify
76
- assist voice
77
76
  assist watch report
78
77
  az account list
79
78
  az account lock list
@@ -18,7 +18,6 @@ assist code-comment confirm
18
18
  assist code-comment set
19
19
  assist commit
20
20
  assist devlog
21
- assist handover
22
21
  assist notify
23
22
  assist prs comment
24
23
  assist prs edit
@@ -40,10 +40,7 @@
40
40
  "SessionStart": [
41
41
  {
42
42
  "matcher": "",
43
- "hooks": [
44
- { "type": "command", "command": "assist handover load" },
45
- { "type": "command", "command": "assist advise --hook" }
46
- ]
43
+ "hooks": [{ "type": "command", "command": "assist advise --hook" }]
47
44
  }
48
45
  ]
49
46
  },
@@ -55,26 +52,12 @@
55
52
  "SlashCommand(/refactor)",
56
53
  "SlashCommand(/review-pr-comments)",
57
54
  "SlashCommand(/transcripts)",
58
- "SlashCommand(/voice-setup)",
59
- "SlashCommand(/voice-start)",
60
- "SlashCommand(/voice-stop)",
61
- "SlashCommand(/voice-status)",
62
- "SlashCommand(/voice-logs)",
63
- "SlashCommand(/journal)",
64
- "SlashCommand(/standup)",
65
55
  "Skill(verify)",
66
56
  "Skill(commit)",
67
57
  "Skill(devlog)",
68
58
  "Skill(refactor)",
69
59
  "Skill(review-pr-comments)",
70
60
  "Skill(transcripts)",
71
- "Skill(journal)",
72
- "Skill(standup)",
73
- "Skill(voice-setup)",
74
- "Skill(voice-start)",
75
- "Skill(voice-stop)",
76
- "Skill(voice-status)",
77
- "Skill(voice-logs)",
78
61
  "Skill(jira)",
79
62
  "SlashCommand(/jira)",
80
63
  "Skill(github)",
@@ -96,10 +79,6 @@
96
79
  "SlashCommand(/test-cover)",
97
80
  "Skill(test-review)",
98
81
  "SlashCommand(/test-review)",
99
- "Skill(handover)",
100
- "SlashCommand(/handover)",
101
- "Skill(recall)",
102
- "SlashCommand(/recall)",
103
82
  "Skill(strip-code-comments)",
104
83
  "SlashCommand(/strip-code-comments)",
105
84
  "Skill(subtask)",