@staff0rd/assist 0.318.1 → 0.318.3

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
@@ -5,6 +5,7 @@ A CLI tool for enforcing determinism in LLM development workflow automation.
5
5
  See [devlog](https://staffordwilliams.com/devlog/assist/) for latest features.
6
6
 
7
7
  ## Installation
8
+
8
9
  You can install `assist` globally using npm:
9
10
 
10
11
  ```bash
@@ -13,6 +14,7 @@ assist sync
13
14
  ```
14
15
 
15
16
  ## Updating
17
+
16
18
  ```bash
17
19
  assist update
18
20
  ```
@@ -68,7 +70,7 @@ After installation, the `assist` command will be available globally. You can als
68
70
  - `/seq` - Query Seq logs from a URL or filter expression
69
71
  - `/sql` - Query a MSSQL database via assist sql
70
72
  - `/verify` - Run all verification commands in parallel
71
- - `/verify-new` - Add a new verify:* run command to assist.yml
73
+ - `/verify-new` - Add a new verify:\* run command to assist.yml
72
74
  - `/transcript-format` - Format meeting transcripts from VTT files
73
75
  - `/transcript-summarise` - Summarise transcripts missing summaries
74
76
  - `/voice-setup` - Download required voice models (VAD, STT)
@@ -113,7 +115,7 @@ After installation, the `assist` command will be available globally. You can als
113
115
  - `--top <n>` - Only report the top `n` repos 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)
114
116
  - `--json` - Output all three views as structured JSON instead of tables
115
117
  - `assist news add [url]` - Add an RSS feed URL (rendered in the sessions web News tab)
116
- 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. (There is no SQLite/JSONL fallback.) Commands default to the current repository's items; pass `--all-repos` to span every repository.
118
+ 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. (There is no SQLite/JSONL fallback.) Commands default to the current repository's items; pass `--all-repos` to span every repository.
117
119
 
118
120
  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.
119
121
 
@@ -159,7 +161,7 @@ The first backlog command in a repository that still has a local `.assist/backlo
159
161
  - `assist config get <key>` - Get a config value
160
162
  - `assist config list` - List all config values
161
163
  - `prs.slack` - The Slack channel (e.g. `#example`) that `/prs-slack` posts pull requests to via the Slack MCP connector
162
- - `assist verify` - Run all verify:* commands in parallel (from run configs in assist.yml and scripts in package.json)
164
+ - `assist verify` - Run all verify:\* commands in parallel (from run configs in assist.yml and scripts in package.json)
163
165
  - `assist verify all` - Run all checks, ignoring diff-based filters
164
166
  - `assist verify --measure` - After the run, print a summary table of each command's status and duration (slowest first) plus a wall-clock total
165
167
  - `assist verify init` - Add verify scripts to a project (writes to `assist.yml` by default; pass `--package-json` to write to `package.json` scripts instead)
@@ -268,10 +270,12 @@ The first backlog command in a repository that still has a local `.assist/backlo
268
270
  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.
269
271
 
270
272
  From WSL, the selector can also surface and drive Windows-host repos (requires `assist` installed on the Windows host). Config keys:
273
+
271
274
  - `sessions.windowsProjectsRoot` — the Windows `.claude/projects` directory as seen from WSL (e.g. `/mnt/c/Users/<user>/.claude/projects`); enables discovery of Windows-host repos, tagged with a `Windows` badge. Selecting one launches a native assist daemon on Windows and runs an interactive session there.
272
275
  - `sessions.windowsDaemonHost` / `sessions.windowsDaemonPort` — where the WSL daemon reaches the native Windows daemon (defaults `127.0.0.1` / `51764`; set the host to the Windows IP on WSL2 NAT-mode networking).
273
276
 
274
277
  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.
278
+
275
279
  - `assist next [id] [--once]` - Alias for `backlog next [id]`; `--once` exits after the first completed item run instead of prompting for another
276
280
  - `assist draft [description] [--once]` (alias: `feat`) - Launch Claude in `/draft` mode, chain into next on `/next` signal; an optional `description` is forwarded as `/draft <description>`; `--once` exits when the done signal arrives after the initial draft completes
277
281
  - `assist bug [description] [--once]` - Launch Claude in `/bug` mode, chain into next on `/next` signal; an optional `description` is forwarded as `/bug <description>`; `--once` exits when the done signal arrives after the initial bug report completes
@@ -284,7 +288,6 @@ When `commit.pull` is enabled in config, `assist draft`, `assist bug`, `assist r
284
288
 
285
289
  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.
286
290
 
287
-
288
291
  ## netcap browser extension
289
292
 
290
293
  `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.
package/claude/CLAUDE.md CHANGED
@@ -3,20 +3,23 @@ After any code change, run `/verify` to ensure all checks pass.
3
3
  `assist` is installed globally. Use it directly (e.g., `assist commit "message"`).
4
4
 
5
5
  When renaming TypeScript files or symbols, use the refactor commands instead of doing it manually:
6
+
6
7
  - `assist refactor rename file <source> <destination>` — rename/move a file and update all imports
7
8
  - `assist refactor rename symbol <file> <oldName> <newName>` — rename a variable, function, class, or type across the project
8
9
  - `assist refactor extract <file> <functionName> <destination>` — extract a function and its private dependencies to a new file
9
- All default to dry-run; add `--apply` to execute.
10
- When using extract, name the destination file after the exported function (e.g. `updateWorkerCapacity.ts` for `updateWorkerCapacity`) to satisfy `useFilenamingConvention` lint rules.
10
+ All default to dry-run; add `--apply` to execute.
11
+ When using extract, name the destination file after the exported function (e.g. `updateWorkerCapacity.ts` for `updateWorkerCapacity`) to satisfy `useFilenamingConvention` lint rules.
11
12
 
12
13
  Do not modify `claude/settings.json` without asking the user first. Only read-only commands should be added to the allow list — write operations (add, remove, set, delete) must require confirmation.
13
14
 
14
15
  ## Fetching Jira context
15
- When the user mentions a Jira issue key (e.g. `BAD-671`, `PROJ-123`), use the Atlassian MCP to fetch context.
16
16
 
17
+ When the user mentions a Jira issue key (e.g. `BAD-671`, `PROJ-123`), use the Atlassian MCP to fetch context.
17
18
 
18
19
  ## Commenting code
20
+
19
21
  Do not include comments for standard logic or syntax. Only comment if the specific line involves unintuitive complexity or a hack.
20
22
 
21
23
  ## Backlog items, PRs, and commits
24
+
22
25
  Do not mention assist backlog items in PR descriptions or PR comments. The reference goes the other way: mention the relevant commits or PRs in the assist backlog item.
@@ -33,6 +33,7 @@ Show the user the bug report:
33
33
  **Actual:** ...
34
34
 
35
35
  **Acceptance Criteria:**
36
+
36
37
  - (conditions that confirm the bug is fixed)
37
38
 
38
39
  Do NOT generate a plan — the implementer will determine how to fix it.
@@ -44,15 +45,19 @@ Ask the user if they want to change anything. Iterate until they confirm.
44
45
  ## Step 5: Save
45
46
 
46
47
  Once confirmed, add the item via CLI and capture the id it prints:
48
+
47
49
  ```
48
50
  assist backlog add --name "Bug title" --type bug --desc "**Repro:**\n1. ...\n\n**Expected:** ...\n\n**Actual:** ..." --ac "criterion 1" --ac "criterion 2" 2>&1
49
51
  ```
52
+
50
53
  Note the created item id from the output — you'll pass it to the done signal below.
51
54
 
52
55
  Then show the user the item was created and suggest they can run `assist backlog run <id>` to start implementation.
53
56
 
54
57
  Finally, signal that the bug-filing task is complete, passing the created item id:
58
+
55
59
  ```
56
60
  assist signal done <id> 2>&1
57
61
  ```
62
+
58
63
  This lets a wrapping `assist bug --once` session end and surfaces the created item id to the session card; in a plain interactive session it has no effect.
@@ -12,6 +12,7 @@ Parse `$ARGUMENTS` as a comma-separated list of item numbers (e.g. `1,2` or `1,2
12
12
  ## Finding the Referenced List
13
13
 
14
14
  Look back through the conversation for the most recent numbered list of issues, suggestions, or comments. Each item should have enough context to determine:
15
+
15
16
  - **path**: the file path
16
17
  - **line**: the line number
17
18
  - **body**: a concise comment describing the issue
@@ -29,6 +30,7 @@ assist prs comment <path> <line> '<body>' 2>&1
29
30
  **Important:** Always use single quotes around `<body>`, never double quotes. Double quotes cause shell escaping issues with backticks and special characters.
30
31
 
31
32
  The body must:
33
+
32
34
  - Be a clear, concise description of the issue (1-2 sentences)
33
35
  - Not contain "claude" or "opus" (case-insensitive) — the command will reject it
34
36
  - Not contain single quotes (reword to avoid them)
@@ -7,10 +7,12 @@ Review the git status and create a commit with only the files that are relevant
7
7
  First run `assist commit status` to see the current state of the working tree.
8
8
 
9
9
  Then either:
10
+
10
11
  - `assist commit "your message"` to commit already-staged changes, or
11
12
  - `assist commit "your message" <file1> <file2> ...` to stage files and commit
12
13
 
13
14
  Where:
15
+
14
16
  - The first argument is the commit message
15
17
  - Any subsequent arguments are paths to git add before committing
16
18
  - The commit message is 40 characters or less
@@ -30,9 +30,11 @@ Once you have enough context, propose a complete backlog item. Show it to the us
30
30
  **Type:** story or bug
31
31
  **Description:** 1-3 sentences
32
32
  **Acceptance Criteria:**
33
+
33
34
  - (specific, testable criteria)
34
35
 
35
36
  **Plan:**
37
+
36
38
  - Phase 1: (name) — tasks...
37
39
  - Phase 2: (name) — tasks... [manual checks: ...]
38
40
 
@@ -41,12 +43,14 @@ Once you have enough context, propose a complete backlog item. Show it to the us
41
43
  **Phases must be vertical slices, not horizontal layers.** Each phase should deliver a thin, working increment of the feature that can be verified end-to-end. Do NOT decompose by architectural layer (e.g. "Phase 1: schema changes", "Phase 2: backend API", "Phase 3: UI"). Instead, each phase should cut through all necessary layers to produce something observable.
42
44
 
43
45
  Bad (horizontal):
46
+
44
47
  - Phase 1: Add database schema and types
45
48
  - Phase 2: Build API endpoints
46
49
  - Phase 3: Create UI components
47
50
  - Phase 4: Wire everything together
48
51
 
49
52
  Good (vertical):
53
+
50
54
  - Phase 1: Minimal working feature (hardcoded/simplified) visible end-to-end
51
55
  - Phase 2: Add real data handling and validation
52
56
  - Phase 3: Polish edge cases and error states
@@ -58,6 +62,7 @@ Good (vertical):
58
62
  - 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
63
 
60
64
  Two tests for each phase before proposing the plan:
65
+
61
66
  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
67
  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.
63
68
 
@@ -74,12 +79,15 @@ Ask the user if they want to change anything. Iterate until they confirm.
74
79
  Once confirmed, create the item and its phases via CLI commands.
75
80
 
76
81
  First, add the item and capture the id it prints:
82
+
77
83
  ```
78
84
  assist backlog add --name "Item name" --type story --desc "Description text" --ac "criterion 1" --ac "criterion 2" 2>&1
79
85
  ```
86
+
80
87
  Note the created item id from the output — you'll pass it to the done signal below.
81
88
 
82
89
  Then add each phase:
90
+
83
91
  ```
84
92
  assist backlog add-phase <id> "Phase name" --task "Task 1" --task "Task 2" --manual-check "optional check" 2>&1
85
93
  ```
@@ -87,7 +95,9 @@ assist backlog add-phase <id> "Phase name" --task "Task 1" --task "Task 2" --man
87
95
  Then show the user the item was created and suggest they can run `assist backlog run <id>` to start implementation.
88
96
 
89
97
  Finally, signal that the drafting task is complete, passing the created item id:
98
+
90
99
  ```
91
100
  assist signal done <id> 2>&1
92
101
  ```
102
+
93
103
  This lets a wrapping `assist draft --once` session end and surfaces the created item id to the session card; in a plain interactive session it has no effect.
@@ -32,7 +32,7 @@ If either is missing or ambiguous, ask before proceeding. The PR is always the c
32
32
 
33
33
  Rules for the quote:
34
34
  - **Quote verbatim.** Preserve the reviewer's exact wording, including typos, repeated words, odd spacing, and punctuation. Do not paraphrase, "fix," or tidy. The reviewer's voice matters.
35
- - **Drop framing prose.** Only the actionable suggestion that maps to *this specific line* should appear. If the reviewer's sentence opens with broad framing ("the only thing that's slightly naff is...") and then states the suggestion, quote only the suggestion part.
35
+ - **Drop framing prose.** Only the actionable suggestion that maps to _this specific line_ should appear. If the reviewer's sentence opens with broad framing ("the only thing that's slightly naff is...") and then states the suggestion, quote only the suggestion part.
36
36
  - **Add backticks around symbols.** Identifier names, type names, file names, and function names should be wrapped in backticks (e.g. `` `displayValue` ``, `` `SurveyQuestionModel` ``, `` `resolvers.ts` ``) even if the reviewer didn't use them. This is the only formatting change permitted.
37
37
  - **No editorialising.** Do not add your own commentary, explanation, or restatement. The whole body is the attribution line plus the quote.
38
38
 
@@ -5,6 +5,7 @@ description: Signal completion and chain into the next backlog item
5
5
  You are done with the current session. Write the signal file to terminate this session and chain into the next backlog item.
6
6
 
7
7
  Run:
8
+
8
9
  ```
9
10
  assist signal next $ARGUMENTS
10
11
  ```
@@ -15,6 +15,7 @@ Otherwise, analyze each entry and suggest specific changes to auto-allow the rec
15
15
  Present your suggestions as a numbered list with the specific change for each. Group related suggestions together.
16
16
 
17
17
  **Important:**
18
+
18
19
  - Only suggest allowing read-only, non-destructive commands
19
20
  - Never suggest allowing write operations (git push, rm, npm publish, etc.) without flagging them as risky
20
21
  - Reference the deny reason from the output to explain why each command was blocked
@@ -34,6 +34,7 @@ Ask one focused question at a time. Wait for the user's response before continui
34
34
  Based on the user's input, apply changes using the appropriate commands. Always append `2>&1` to each command.
35
35
 
36
36
  **To update item fields:**
37
+
37
38
  ```
38
39
  assist backlog update-field <id> --name "New name"
39
40
  assist backlog update-field <id> --desc "New description"
@@ -44,6 +45,7 @@ assist backlog update-field <id> --ac "criterion 1" --ac "criterion 2"
44
45
  Note: `--ac` replaces all acceptance criteria, so include the full list (both existing and new).
45
46
 
46
47
  **To modify a plan phase** (phase is 0-indexed):
48
+
47
49
  ```
48
50
  assist backlog update-phase <id> <phase> --name "New phase name"
49
51
  assist backlog update-phase <id> <phase> --task "Task 1" --task "Task 2"
@@ -53,11 +55,13 @@ assist backlog update-phase <id> <phase> --manual-check "Check 1"
53
55
  Note: `--task` and `--manual-check` replace the full list for that phase, so include all items.
54
56
 
55
57
  **To remove a plan phase:**
58
+
56
59
  ```
57
60
  assist backlog remove-phase <id> <phase>
58
61
  ```
59
62
 
60
63
  **To add a new plan phase:**
64
+
61
65
  ```
62
66
  assist backlog add-phase <id> "Phase name" --task "Task 1" --task "Task 2"
63
67
  ```
@@ -71,6 +75,7 @@ When adding or restructuring plan phases, follow the same rules as /draft:
71
75
  - 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
76
 
73
77
  **To add a comment** (for context, decisions, or notes that don't fit in fields):
78
+
74
79
  ```
75
80
  assist backlog comment <id> "Comment text"
76
81
  ```
@@ -84,7 +89,9 @@ Ask if there is anything else to refine. Continue the conversation until the use
84
89
  ## Step 5: Signal completion
85
90
 
86
91
  Once the user confirms they are done refining, signal that the task is complete:
92
+
87
93
  ```
88
94
  assist signal done 2>&1
89
95
  ```
96
+
90
97
  This lets a wrapping `assist refine --once` session end; in a plain interactive session it has no effect.
@@ -7,10 +7,12 @@ The user wants to query Seq log events. The argument is either a Seq UI URL or a
7
7
  ## If the argument is a URL
8
8
 
9
9
  Parse it to extract:
10
+
10
11
  1. **Base URL** — the origin (e.g., `http://localhost:5341`)
11
12
  2. **Filter** — URL-decode the `filter` query parameter from the fragment (after `#`). For example, from `http://localhost:5341/#/events?filter=JobId%20%3D%3D%20%22abc%22`, extract filter `JobId == "abc"`.
12
13
 
13
14
  Then determine the correct connection:
15
+
14
16
  - Run `assist seq auth list` to see configured connections.
15
17
  - Match the base URL from the parsed URL against a connection's URL.
16
18
  - If a match is found, use that connection name with `-c <name>`.
@@ -34,7 +34,7 @@ Read each file and remove only comments that violate the policy:
34
34
  **Never remove** the following, even if they look like noise:
35
35
 
36
36
  - **Functional directives** that the toolchain acts on: `eslint-disable*`, `@ts-expect-error`, `@ts-ignore`, `oxlint-disable`, `prettier-ignore`, `// @ts-nocheck`, coverage pragmas (`c8 ignore`, `istanbul ignore`), `noqa`, `type: ignore`, `#pragma`, `//go:`-style directives, and similar.
37
- - **Comments marking a genuine hack or workaround** — anything explaining *why* non-obvious code exists, including `HACK`/`WORKAROUND`/`FIXME`/`TODO` notes, links to issues, or rationale the code cannot convey on its own.
37
+ - **Comments marking a genuine hack or workaround** — anything explaining _why_ non-obvious code exists, including `HACK`/`WORKAROUND`/`FIXME`/`TODO` notes, links to issues, or rationale the code cannot convey on its own.
38
38
  - **Doc comments** that form part of an API contract (JSDoc/TSDoc, XML doc comments, docstrings) unless they only restate the signature.
39
39
 
40
40
  When in doubt, keep the comment. The cost of leaving a borderline comment is far lower than deleting one that carries intent.
@@ -26,6 +26,7 @@ From the uncovered files, prioritise by:
26
26
  3. **Complexity** — files with branching logic, edge cases, or error handling
27
27
 
28
28
  Skip files that are primarily:
29
+
29
30
  - Thin CLI wrappers (just parse args and call another function)
30
31
  - UI components (React/TSX)
31
32
  - Files that only re-export or wire things together
@@ -63,29 +64,30 @@ Example:
63
64
 
64
65
  ```typescript
65
66
  describe("parseToken", () => {
66
- describe("when given a valid token", () => {
67
- it("should return the decoded payload", () => {
68
- const token = createToken({ sub: "user-1" });
67
+ describe("when given a valid token", () => {
68
+ it("should return the decoded payload", () => {
69
+ const token = createToken({ sub: "user-1" });
69
70
 
70
- const result = parseToken(token);
71
+ const result = parseToken(token);
71
72
 
72
- expect(result.sub).toBe("user-1");
73
- });
74
- });
73
+ expect(result.sub).toBe("user-1");
74
+ });
75
+ });
75
76
 
76
- describe("when given an expired token", () => {
77
- it("should throw an expiration error", () => {
78
- const token = createToken({ exp: pastDate() });
77
+ describe("when given an expired token", () => {
78
+ it("should throw an expiration error", () => {
79
+ const token = createToken({ exp: pastDate() });
79
80
 
80
- expect(() => parseToken(token)).toThrow("expired");
81
- });
82
- });
81
+ expect(() => parseToken(token)).toThrow("expired");
82
+ });
83
+ });
83
84
  });
84
85
  ```
85
86
 
86
87
  ### Coverage targets
87
88
 
88
89
  Cover:
90
+
89
91
  - Happy path for each exported function
90
92
  - Edge cases (empty input, undefined, boundary values)
91
93
  - Error cases and invalid input
@@ -18,21 +18,25 @@ For each test file, read both the test and the source file it covers. You need b
18
18
  Assess each test file against these criteria:
19
19
 
20
20
  ### Correctness
21
+
21
22
  - Do assertions actually verify the behaviour, or are they tautological (e.g., testing that a mock returns what you told it to)?
22
23
  - Are expected values correct and meaningful, not just copied from implementation output?
23
24
  - Do tests assert the right thing — return values, side effects, thrown errors — for each scenario?
24
25
 
25
26
  ### Coverage of behaviour
27
+
26
28
  - Are all exported functions tested?
27
29
  - Are conditional branches exercised (if/else, switch, early returns, error paths)?
28
30
  - Are edge cases covered (empty input, null/undefined, boundary values, large input)?
29
31
  - Are error cases tested (invalid arguments, missing data, thrown exceptions)?
30
32
 
31
33
  ### Test independence
34
+
32
35
  - Can each test run in isolation, or do tests depend on shared mutable state or execution order?
33
36
  - Are mocks reset properly between tests?
34
37
 
35
38
  ### BDD structure and Arrange-Act-Assert
39
+
36
40
  - Does the outer `describe` name the function or module under test?
37
41
  - Do inner `describe("when ...")` blocks group tests by shared setup/scenario?
38
42
  - Do `it` blocks use `should` phrasing with bare outcomes (e.g., `it("should allow")`, `it("should reject")`)? State specifiers (flags, syntax variants, conditions) belong in `when` blocks, never in `it` descriptions.
@@ -40,11 +44,13 @@ Assess each test file against these criteria:
40
44
  - Are assertions minimal per test — ideally one, at most two closely related? If multiple things are asserted about the same action, are they split into separate `it` blocks under the same `describe("when ...")`?
41
45
 
42
46
  ### Mocking discipline
47
+
43
48
  - Are mocks used only when necessary (external I/O, complex dependencies)?
44
49
  - Do mocks faithfully represent the real dependency's contract, or do they mask bugs?
45
50
  - Is there a risk that mocked tests pass but real integration would fail?
46
51
 
47
52
  ### Missing tests
53
+
48
54
  - Are there exported functions or significant code paths with no corresponding test?
49
55
  - Are there recently added functions (check git log) that lack tests?
50
56
 
@@ -57,12 +63,15 @@ For each test file, report:
57
63
  **Verdict:** Good / Needs improvement / Weak
58
64
 
59
65
  **Strengths:**
66
+
60
67
  - (what the tests do well)
61
68
 
62
69
  **Issues:**
70
+
63
71
  - (specific problems, each with a concrete recommendation)
64
72
 
65
73
  **Missing coverage:**
74
+
66
75
  - (untested functions or paths, with suggested test cases)
67
76
 
68
77
  ## Step 5: Summary
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { Command } from "commander";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@staff0rd/assist",
9
- version: "0.318.1",
9
+ version: "0.318.3",
10
10
  type: "module",
11
11
  main: "dist/index.js",
12
12
  bin: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staff0rd/assist",
3
- "version": "0.318.1",
3
+ "version": "0.318.3",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {