@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 +7 -4
- package/claude/CLAUDE.md +6 -3
- package/claude/commands/bug.md +5 -0
- package/claude/commands/comment.md +2 -0
- package/claude/commands/commit.md +2 -0
- package/claude/commands/draft.md +10 -0
- package/claude/commands/forward-comments.md +1 -1
- package/claude/commands/next.md +1 -0
- package/claude/commands/prompts.md +1 -0
- package/claude/commands/refine.md +7 -0
- package/claude/commands/seq.md +2 -0
- package/claude/commands/strip-comments.md +1 -1
- package/claude/commands/test-cover.md +15 -13
- package/claude/commands/test-review.md +9 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
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
|
|
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
|
|
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.
|
package/claude/commands/bug.md
CHANGED
|
@@ -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
|
package/claude/commands/draft.md
CHANGED
|
@@ -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
|
|
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
|
|
package/claude/commands/next.md
CHANGED
|
@@ -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.
|
package/claude/commands/seq.md
CHANGED
|
@@ -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
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
describe("when given a valid token", () => {
|
|
68
|
+
it("should return the decoded payload", () => {
|
|
69
|
+
const token = createToken({ sub: "user-1" });
|
|
69
70
|
|
|
70
|
-
|
|
71
|
+
const result = parseToken(token);
|
|
71
72
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
expect(result.sub).toBe("user-1");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
75
76
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
describe("when given an expired token", () => {
|
|
78
|
+
it("should throw an expiration error", () => {
|
|
79
|
+
const token = createToken({ exp: pastDate() });
|
|
79
80
|
|
|
80
|
-
|
|
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