@staff0rd/assist 0.243.0 → 0.244.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.
package/README.md CHANGED
@@ -243,6 +243,14 @@ The first backlog command in a repository that still has a local `.assist/backlo
243
243
  - `assist sessions` - Start the web dashboard (same as `sessions web`)
244
244
  - `assist sessions web [-p, --port <number>]` - Start the web dashboard with Sessions and Backlog tabs, xterm.js terminals (default port 3100)
245
245
  - `assist 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)
246
+ - `assist daemon run` - Run the sessions daemon in the foreground (normally auto-spawned detached by `assist sessions`)
247
+ - `assist daemon status` - Show sessions daemon status and live sessions
248
+ - `assist daemon stop` - Stop the sessions daemon; running claude sessions resume on next start
249
+ - `assist daemon restart` - Restart the sessions daemon, resuming previously running claude sessions
250
+
251
+ 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` 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).
252
+
253
+ 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.
246
254
  - `assist next [id]` - Alias for `backlog next [id]`
247
255
  - `assist draft` (alias: `feat`) - Launch Claude in `/draft` mode, chain into next on `/next` signal
248
256
  - `assist bug` - Launch Claude in `/bug` mode, chain into next on `/next` signal
@@ -51,7 +51,15 @@ Good (vertical):
51
51
  - Phase 2: Add real data handling and validation
52
52
  - Phase 3: Polish edge cases and error states
53
53
 
54
- The test: at the end of each phase, you should be able to answer "does this work?" by running or inspecting the result. If a phase only produces internal plumbing with no observable effect, it's horizontal restructure it.
54
+ **Every phase must pass `assist verify` on its own.** Verification includes knip, which fails on unused exports. This makes horizontal slicing mechanically impossible to verify: an API helper, type, or stub added in phase 1 "for phase 2 to use" has no caller yet, so knip flags it and phase 1 cannot complete. Therefore:
55
+
56
+ - Every export a phase adds must have a caller wired up **in that same phase**.
57
+ - Never plan a task like "add X helper/endpoint/type" unless the same phase also includes the task that consumes it.
58
+ - If a feature spans backend + UI, each phase carries its slice through both — e.g. "Phase 1: endpoint + UI button that calls it", not "Phase 1: endpoint, Phase 2: button".
59
+
60
+ Two tests for each phase before proposing the plan:
61
+ 1. **Observable**: can you answer "does this work?" by running or inspecting the result? If a phase only produces internal plumbing with no observable effect, it's horizontal — restructure it.
62
+ 2. **Self-contained**: would `assist verify` pass with only this phase's code committed — no unused exports, no dead stubs awaiting a later phase? If not, merge the producer and its consumer into the same phase.
55
63
 
56
64
  Keep phases small (2-4 tasks each). A typical item should have 2-3 phases.
57
65
 
@@ -62,6 +62,14 @@ assist backlog remove-phase <id> <phase>
62
62
  assist backlog add-phase <id> "Phase name" --task "Task 1" --task "Task 2"
63
63
  ```
64
64
 
65
+ ### Phase design rules
66
+
67
+ When adding or restructuring plan phases, follow the same rules as /draft:
68
+
69
+ - **Vertical slices, not horizontal layers.** Each phase delivers a thin, working increment verifiable end-to-end — never "backend in phase 1, UI in phase 2".
70
+ - **Every phase must pass `assist verify` on its own.** Verification includes knip, which fails on unused exports — so every export a phase adds must have a caller wired up in that same phase. No "phase 2 will use it" scaffolding.
71
+ - If the user proposes a horizontal split, point out that the earlier phase won't verify (knip will flag the unused exports) and suggest a vertical restructure instead.
72
+
65
73
  **To add a comment** (for context, decisions, or notes that don't fit in fields):
66
74
  ```
67
75
  assist backlog comment <id> "Comment text"
@@ -80,7 +80,8 @@
80
80
  "SlashCommand(/handover)",
81
81
  "Skill(recall)",
82
82
  "SlashCommand(/recall)",
83
- "WebFetch(domain:staffordwilliams.com)"
83
+ "WebFetch(domain:staffordwilliams.com)",
84
+ "Bash(assist daemon status)"
84
85
  ],
85
86
  "deny": [
86
87
  "Bash(git commit:*)", "Bash(npm run:*)", "Bash(npx assist:*)"