ts-reviewer 3.6.1 → 3.7.1
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
|
@@ -4,6 +4,8 @@ An AI skill for deep code review and auto-fix of pure TypeScript codebases. Find
|
|
|
4
4
|
|
|
5
5
|
Built for one fixed stack — **TypeScript 5.9.x, ES2024, Node 24** — without any framework-specific checks (no React, Vue, Angular, etc.). Anything below the stack is a finding, anything above it is never recommended.
|
|
6
6
|
|
|
7
|
+
Supported AI agents: **Claude Code** and **Codex** only. Other agents are not supported by the installer or tested with the skill.
|
|
8
|
+
|
|
7
9
|
## What It Does
|
|
8
10
|
|
|
9
11
|
Four modes, one skill:
|
|
@@ -17,6 +19,10 @@ Four modes, one skill:
|
|
|
17
19
|
|
|
18
20
|
## What's New
|
|
19
21
|
|
|
22
|
+
**3.7.1 — 1 message on Codex.** Codex has no question menu outside Plan mode, so the start questions come as 1 chat message with a 1-line answer instead of 4 round trips.
|
|
23
|
+
|
|
24
|
+
**3.7.0 — 3 questions before a scan.** A scan you start asks, in this order: which domains (2 pages, nothing pre-ticked — page 1 the 4 cheap groups, page 2 Security and Architecture), whether to run the skill lint, and which model runs the passes (every run, your last answer first). A flag answers its own question, a resumed scan asks nothing, and `--defaults` asks nothing at all — for an agent that starts the scan for you. The default set drops Security: 8 domains. `--pick` is gone: the menu now shows without it.
|
|
25
|
+
|
|
20
26
|
**3.6.1 — the agent menu waits.** On Windows, after you picked the install scope, the agent menu took no keys: it confirmed both agents unasked or quit without installing. It now waits for your choice.
|
|
21
27
|
|
|
22
28
|
**3.6.0 — install once for every project.** `npx ts-reviewer@latest install` asks whether to install globally or into the project, and `update` brings every install to the latest version without questions. Antigravity is no longer a target.
|
|
@@ -31,12 +37,12 @@ Four modes, one skill:
|
|
|
31
37
|
|
|
32
38
|
Both are optional: a project with no `@hotpath` markers, no tests, and no history gets today's behaviour plus 1 verdict line per finding.
|
|
33
39
|
|
|
34
|
-
The review
|
|
40
|
+
The review has ten domains, each with its own detailed checklist. A scan asks which to run; the default set, for `--defaults` or no answer, is the eight below without Security and Architecture:
|
|
35
41
|
|
|
36
42
|
| Domain | Examples | Default |
|
|
37
43
|
|---|---|---|
|
|
38
44
|
| **Type Safety** | `any` abuse, unsafe casts, non-null assertions, `unknown` discipline, missing exhaustive checks | ✓ |
|
|
39
|
-
| **Security** | Injection, SSRF, prototype pollution, ReDoS, path traversal, hardcoded secrets |
|
|
45
|
+
| **Security** | Injection, SSRF, prototype pollution, ReDoS, path traversal, hardcoded secrets | menu page 2 / `--full` |
|
|
40
46
|
| **Async Patterns** | Floating promises, race conditions, missing timeouts, unbounded concurrency, `forEach(async...)` | ✓ |
|
|
41
47
|
| **Modernization** | Numeric enums, `\|\|` vs `??`, mutating array methods, `satisfies`, `using` keyword | ✓ |
|
|
42
48
|
| **Code Quality** | Dead code, complexity, duplication, debug artifacts, import-time side effects, testability | ✓ |
|
|
@@ -44,10 +50,12 @@ The review covers nine domains by default, each with its own detailed checklist.
|
|
|
44
50
|
| **Boundary Validation** | `as T` on `JSON.parse`/`fetch`/env, DTO vs domain model separation, contract drift | ✓ |
|
|
45
51
|
| **Error Handling** | Silent failures, throw hygiene, `cause` chaining, failure design at API seams | ✓ |
|
|
46
52
|
| **Dependency Hygiene** | Lockfiles, wildcard versions, `npm audit`, duplicate-purpose and trivial deps | ✓ |
|
|
47
|
-
| **Architecture** | Shallow modules, scattered concepts, tight coupling, dependency direction, layering | `--arch` / `--full` |
|
|
53
|
+
| **Architecture** | Shallow modules, scattered concepts, tight coupling, dependency direction, layering | menu page 2 / `--arch` / `--full` |
|
|
48
54
|
|
|
49
55
|
## Installation
|
|
50
56
|
|
|
57
|
+
The installer supports 2 AI agents: Claude Code and Codex. Antigravity was dropped in 3.6.0.
|
|
58
|
+
|
|
51
59
|
### Install with npx
|
|
52
60
|
|
|
53
61
|
```bash
|
|
@@ -127,18 +135,33 @@ The main agent writes its decisions, not the report: `tools/pass-prompts.mjs` fi
|
|
|
127
135
|
|
|
128
136
|
The passes run in groups: Type Safety with Boundary Validation, Async Patterns with Error Handling, Config with Dependency Hygiene, Modernization with Code Quality, and Security and Architecture alone.
|
|
129
137
|
|
|
138
|
+
#### Start questions
|
|
139
|
+
|
|
140
|
+
A scan or auto run you start asks 3 questions before it reads the project, in this order:
|
|
141
|
+
|
|
142
|
+
1. **Domains** — a multi-select in 2 pages, with nothing ticked in advance:
|
|
143
|
+
- page 1: Type Safety + Boundary Validation, Async Patterns + Error Handling, Config + Dependency Hygiene, Modernization + Code Quality — a usual scan ticks all 4;
|
|
144
|
+
- page 2: Security, Architecture — the expensive ones.
|
|
145
|
+
2. **Skill lint** — whether to download and run the pinned ESLint config. Asked only when a picked domain has lint-owned lines; Knip and dependency-cruiser are approved in the same question when Architecture is picked and missing locally.
|
|
146
|
+
3. **Pass model** — the model and effort for the analysis passes, your last answer first.
|
|
147
|
+
|
|
148
|
+
A resumed scan asks none of them: the queue holds the answers. Leaving a question unanswered takes the default, except the skill lint, which an unanswered approval declines.
|
|
149
|
+
|
|
150
|
+
**On Codex** there is no question menu outside Plan mode, so the scan asks all of them in 1 chat message: the 6 groups as 1 numbered list, then the lint and the model. Answer in 1 line, e.g. `1-4,6; lint yes; sonnet high`. `codex exec` has nobody to answer: pass `--defaults`.
|
|
151
|
+
|
|
130
152
|
#### Domain flags
|
|
131
153
|
|
|
132
|
-
|
|
154
|
+
A flag answers its question, so the scan does not ask it:
|
|
133
155
|
|
|
134
|
-
| Flag | What
|
|
156
|
+
| Flag | What it answers |
|
|
135
157
|
|---|---|
|
|
136
|
-
|
|
|
158
|
+
| `--defaults` | All 3: the 8 default domains, the skill lint on, the model of the scout file (or the default sub-agent). For an agent that starts the scan for you; another flag next to it still wins for its own question |
|
|
159
|
+
| `--domains <slugs>` | Only the named domains, by slug (`security`, `type-safety`, `boundary-validation`, ...) or by pass group (`type-safety+boundary-validation`). `--no-arch` still removes Architecture |
|
|
137
160
|
| `--arch` | Architecture only (shallow modules, coupling, dependency direction, seams) |
|
|
138
161
|
| `--full` | All ten domains |
|
|
139
|
-
| `--no-arch` |
|
|
140
|
-
| `--
|
|
141
|
-
| `--
|
|
162
|
+
| `--no-arch` | Removes Architecture from the set the other flags give, or runs the default set alone |
|
|
163
|
+
| `--lint` / `--no-lint` | Runs or skips the skill lint |
|
|
164
|
+
| `--scout <model>` | The pass model, for 1 run |
|
|
142
165
|
|
|
143
166
|
Examples:
|
|
144
167
|
|
|
@@ -338,7 +361,7 @@ The test catches a check line that lost its severity, a block the profile does n
|
|
|
338
361
|
|
|
339
362
|
### Scan mode
|
|
340
363
|
|
|
341
|
-
1. **Discovery** — detects domain flags, maps the project, reads tsconfig.json, detects linter and test runner,
|
|
364
|
+
1. **Discovery** — detects domain flags, maps the project, reads tsconfig.json, detects linter and test runner, after the 3 start questions: domains, the skill lint and any missing architecture tool, and the pass model.
|
|
342
365
|
2. **Diagnostics** — runs `tsc --noEmit`, the project linter, the skill lint, and LSP diagnostics (if available). The skill lint's findings become the pass `lint-skill`; compiler and linter output is cached under `code-smells/passes/` and reused on a resume of the same commit.
|
|
343
366
|
3. **Architecture pre-pass** — when active, writes bounded Knip, graph, metric, co-change, rule, and Mermaid artifacts under `code-smells/`, with project coverage and bounded failure diagnostics.
|
|
344
367
|
4. **Analysis** — specialized passes, 1 per group of domains, judge the candidates against the active checklists, skipping the lines the skill lint owns, running in waves of `--agents` at a time; each pass writes its own `code-smells/passes/<id>.jsonl`, and `passes/queue.md` marks which are done, so a stopped run resumes from the last checkpoint. Tool output is never a finding by itself.
|
|
@@ -375,7 +398,7 @@ Validate a report directly with `node ts-reviewer/tools/validate-report.mjs --re
|
|
|
375
398
|
|
|
376
399
|
- **Claude Code users** — `CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS` in `settings.json` under `env` caps sub-agents for every session on the host. It is independent of `--agents`, which caps one review run and works in every supported agent.
|
|
377
400
|
|
|
378
|
-
- **Pick the pass model
|
|
401
|
+
- **Pick the pass model** — every scan asks which model and effort the analysis passes use, offers your last answer first, and writes the answer to `.claude/agents/ts-reviewer-scout.md` (Claude Code: `model`, `effort`) or `.codex/agents/ts-reviewer-scout.toml` (Codex: `model`, `model_reasoning_effort`). A smaller model there, for example Sonnet at `high`, costs less, while the main agent keeps verifying every finding. Pass `--scout <model>` to skip the question for 1 run. Architecture always runs on the main agent's model.
|
|
379
402
|
|
|
380
403
|
- **Commit before running fix** — so you can `git diff` to review changes and `git checkout -- .` to revert if needed.
|
|
381
404
|
|
|
@@ -7,7 +7,7 @@ description: >
|
|
|
7
7
|
fix issues, fix the report, fix code smells, auto-fix, review and fix,
|
|
8
8
|
clean up code, tech debt, code health, security audit, modernize, review my changes,
|
|
9
9
|
review my PR, review last commit. Architecture review: --arch, --full, review architecture,
|
|
10
|
-
find refactoring opportunities, full audit. Domain pick: --domains, --
|
|
10
|
+
find refactoring opportunities, full audit. Domain pick: --domains, --defaults, pick domains,
|
|
11
11
|
choose domains. Pure TypeScript 5.9.x, ES2024, Node 24 only.
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -64,7 +64,7 @@ forbidden_behaviors:
|
|
|
64
64
|
- do not emit the same file and line twice
|
|
65
65
|
- do not boost severity in `full` scope mode: all code is treated alike
|
|
66
66
|
- do not flag a config issue in a scoped mode unless `tsconfig.json` is in the diff
|
|
67
|
-
- do not download and execute a missing analysis tool before the operator approves it
|
|
67
|
+
- do not download and execute a missing analysis tool before the operator approves it in `start_questions`
|
|
68
68
|
- do not run `npm install` or `npm uninstall` for analysis: use an approved pinned-major `npx -y` command, or record the pre-pass as skipped
|
|
69
69
|
- do not rename a report section, field, severity, confidence, or domain: `report_format` and `domains` hold exact identifiers
|
|
70
70
|
- do not start a wave before every pass of the previous wave is marked `done`, `pending`, or `failed` in the queue
|
|
@@ -91,23 +91,55 @@ run_modes:
|
|
|
91
91
|
| `auto` | review and fix, auto-fix, scan and fix, clean up | scan, then investigate, then fix, then a re-scan |
|
|
92
92
|
|
|
93
93
|
domain_sets:
|
|
94
|
-
- read `--domains`
|
|
95
|
-
- Architecture
|
|
94
|
+
- read `--domains` first, then the explicit `--arch`, `--full`, and `--no-arch` flags, then the phrases below, then ask the domain menu of `start_questions`
|
|
95
|
+
- Architecture and Security are off in the default set: both are expensive, and Architecture loads `references/architecture.md` only when it is active
|
|
96
96
|
- `--domains` takes slugs joined by `,`: a domain name in lowercase with `-` for each space, or a `pass_groups` group id for every domain of the group
|
|
97
97
|
- stop and list the valid slugs when `--domains` names a slug that is neither
|
|
98
|
-
-
|
|
99
|
-
- ask the pick as a multi-select in questions of <= 4 options, or as a numbered list read from a reply such as `1,3` on a host with no multi-select
|
|
100
|
-
- a pick with no operator answer runs the default set, and the discovery summary says so
|
|
101
|
-
- a module joins `--domains` and `--pick` through its rows in `domains` and `pass_groups`, with no edit to this block
|
|
98
|
+
- a module joins `--domains` and the domain menu through its rows in `domains` and `pass_groups`, with no edit to this block
|
|
102
99
|
|
|
103
100
|
| Flag or phrase | Active domains |
|
|
104
101
|
|---|---|
|
|
105
|
-
|
|
|
102
|
+
| `--defaults`, or no answer to the domain menu | the 8 default domains: Type Safety, Boundary Validation, Async Patterns, Error Handling, Config, Dependency Hygiene, Modernization, Code Quality |
|
|
103
|
+
| the domain menu | the domains of the picked groups |
|
|
106
104
|
| `--arch`, review architecture, find refactoring opportunities, deepening review | Architecture only |
|
|
107
105
|
| `--full`, full audit, full review, review everything | all 10 domains |
|
|
108
106
|
| `--domains <slugs>` | the named domains, and every domain of a named group |
|
|
109
|
-
| `--
|
|
110
|
-
|
|
107
|
+
| `--no-arch` | the set the rows above give, without Architecture, and the default set when no row above answers |
|
|
108
|
+
|
|
109
|
+
start_questions:
|
|
110
|
+
- ask the 3 questions below in their order in a `scan` or `auto` run, after the resume ask of step 6 and before discovery
|
|
111
|
+
- skip a question its flag answers, and skip all 3 on a resume: the plan holds the answers
|
|
112
|
+
- `--defaults` answers all 3: the default set, the skill lint run, and the model of the scout file or the default sub-agent
|
|
113
|
+
- a flag next to `--defaults` wins for its own question
|
|
114
|
+
- a question with no operator answer takes the `--defaults` answer, except the skill lint: an unanswered approval is a decline
|
|
115
|
+
- the domain menu has 2 pages, each 1 multi-select question holding the `pass_groups` rows of its page in row order, each option naming its domains
|
|
116
|
+
- tick no option in advance, and say in the page 1 question that a usual scan ticks every option of page 1
|
|
117
|
+
- ask every pending start question in 1 message on a host with no question tool, such as Codex in default mode: 1 chat round trip per question ends the agent's turn 4 times
|
|
118
|
+
- write that message in the shape below, with the `pass_groups` rows of page 1 and then page 2, and leave out a line whose question a flag answers
|
|
119
|
+
- offer no ready-made answer such as "defaults" in that message: the operator ticks the groups, as on a menu
|
|
120
|
+
```text
|
|
121
|
+
Before the scan, answer in 1 line, e.g. `1-4; lint yes; sonnet high`.
|
|
122
|
+
Domains (a usual scan picks 1-4; 5 and 6 are expensive):
|
|
123
|
+
1. Type Safety, Boundary Validation
|
|
124
|
+
2. Async Patterns, Error Handling
|
|
125
|
+
3. Config, Dependency Hygiene
|
|
126
|
+
4. Modernization, Code Quality
|
|
127
|
+
5. Security
|
|
128
|
+
6. Architecture
|
|
129
|
+
Skill lint: download and run the pinned ESLint config? yes / no
|
|
130
|
+
Pass model: <the scout file's model and effort> / the main agent's model / another model and effort
|
|
131
|
+
```
|
|
132
|
+
- read every answer from 1 reply such as `1-4,6; lint yes; sonnet high`, and ask again only the part the reply leaves unreadable
|
|
133
|
+
- ask a page as a numbered list in the question text on a host whose question tool takes 1 choice per question
|
|
134
|
+
- ask the domain menu again when the operator ticks no option on either page: an empty scan is never the intent
|
|
135
|
+
- ask the skill lint only when an active domain owns a line carrying "lint-owned by", and approve Knip and dependency-cruiser in the same question when Architecture is active and missing locally
|
|
136
|
+
- ask the pass model as `pass_agent` states
|
|
137
|
+
|
|
138
|
+
| Question | Answered by |
|
|
139
|
+
|---|---|
|
|
140
|
+
| domains | `--domains`, `--arch`, `--full`, `--no-arch`, and the phrases of `domain_sets` |
|
|
141
|
+
| skill lint | `--lint` runs it, `--no-lint` declines it |
|
|
142
|
+
| pass model | `--scout <model>` |
|
|
111
143
|
|
|
112
144
|
scope_modes:
|
|
113
145
|
|
|
@@ -135,11 +167,11 @@ domains:
|
|
|
135
167
|
|
|
136
168
|
workflow:
|
|
137
169
|
1. identify the run mode from `run_modes`
|
|
138
|
-
2. identify the active domain set from `domain_sets`
|
|
170
|
+
2. identify the active domain set from `domain_sets`, and leave a question it does not answer to `start_questions`
|
|
139
171
|
3. identify the scope mode from `scope_modes`, and default to `full` when the request names none
|
|
140
172
|
4. build the file list with the command in `scope_commands` for that scope mode
|
|
141
173
|
5. ask whether to fall back to `full` when a scoped mode yields 0 files
|
|
142
|
-
6. ask once whether to resume or restart when `code-smells/passes/queue.md` exists,
|
|
174
|
+
6. ask once whether to resume or restart when `code-smells/passes/queue.md` exists, delete `code-smells/passes/` on restart, then ask `start_questions` unless resuming
|
|
143
175
|
7. warn when the `HEAD` in the queue header differs from the current `HEAD` on a resume: the line re-read below catches a stale line
|
|
144
176
|
8. map the project tree in full, whatever the scope mode
|
|
145
177
|
9. read `tsconfig.json`, and when Config is active read `references/tsconfig.md` and audit the config flags
|
|
@@ -149,7 +181,7 @@ workflow:
|
|
|
149
181
|
13. read `package.json` for the dependencies and the module type, and verify the TypeScript version, `engines.node`, and `@types/node` against `target_stack`
|
|
150
182
|
14. identify declared entry points from `package.json#exports`, `main`, `bin`, and the `start`, `dev`, and `serve` scripts
|
|
151
183
|
15. count the markers `hot_marker` in `references/stack-cost.md` defines across the files in scope, and name the count in the discovery summary
|
|
152
|
-
16.
|
|
184
|
+
16. run a pinned-major `npx -y` tool only when `start_questions` approved it: the skill lint, Knip, and dependency-cruiser
|
|
153
185
|
17. collect the context files named in `scope:` when the scope mode is scoped
|
|
154
186
|
18. identify feature slices and public entry points when Architecture is active, leaving graph discovery to its mechanical pre-pass
|
|
155
187
|
19. collect machine-readable dependency rules and prose from ADR directories, `ARCHITECTURE.md`, README, and `CONTRIBUTING.md`
|
|
@@ -279,7 +311,7 @@ Hot paths: <N> marked / none: hot rests on loop bodies alone
|
|
|
279
311
|
Files in scope: <N> .ts files (+ <M> context files)
|
|
280
312
|
Excluded framework packages: <package names, or none>
|
|
281
313
|
Agents per wave: <N>
|
|
282
|
-
Domains: <the active domains> from the
|
|
314
|
+
Domains: <the active domains> from the domain menu / a flag / --domains / --defaults / an unanswered menu / the resumed plan
|
|
283
315
|
Main agent: <model>
|
|
284
316
|
Pass agent: ts-reviewer-scout <model> <effort> / the default sub-agent; Architecture on the main agent
|
|
285
317
|
Skill lint: <N> findings / declined / failed: <reason>
|
|
@@ -342,10 +374,11 @@ pass_queue:
|
|
|
342
374
|
- the pass id is the group id of `pass_groups`, or `<group id>.<directory slug>` for a split pass
|
|
343
375
|
- the pass order is the row order of `pass_groups`, after the row `lint-skill` of `skill_lint`
|
|
344
376
|
- the plan names every pass with its domains and files, and `lint-skill` with its files and no prompt
|
|
377
|
+
- the plan holds the start answers a resume reuses: `lint`, the domains of each pass, and the pass `model` and `effort`, or no `model` for the default sub-agent
|
|
345
378
|
- `pass-prompts.mjs` fills `subagent_template` for each pass, and keeps the status, attempts, and findings of a pass the queue already holds: a resume writes the same plan
|
|
346
379
|
```json
|
|
347
380
|
{
|
|
348
|
-
"head": "<sha>", "scope": "full", "agents": 3, "lint": true,
|
|
381
|
+
"head": "<sha>", "scope": "full", "agents": 3, "lint": true, "model": "sonnet", "effort": "medium",
|
|
349
382
|
"passes": [
|
|
350
383
|
{ "id": "security.src-auth", "domains": ["Security"], "files": ["src/auth/a.ts"], "context": ["src/types.ts"] }
|
|
351
384
|
]
|
|
@@ -362,6 +395,8 @@ pass_queue:
|
|
|
362
395
|
HEAD: <sha>
|
|
363
396
|
Scope: <mode>
|
|
364
397
|
Agents per wave: <N>
|
|
398
|
+
Lint: yes / no
|
|
399
|
+
Pass model: <model> <effort> / default sub-agent
|
|
365
400
|
|
|
366
401
|
| Pass | Domains | Files | Status | Attempts | Findings |
|
|
367
402
|
|---|---|---|---|---|---|
|
|
@@ -376,24 +411,24 @@ pass_groups:
|
|
|
376
411
|
- a filtered group takes the scoped files that the `workflow:` command of any of its references lists
|
|
377
412
|
- a filtered group takes every scoped file when the skill lint did not run and the project linter enables no `no-floating-promises`
|
|
378
413
|
|
|
379
|
-
| Group | Domains | Files |
|
|
380
|
-
|
|
381
|
-
| `security` | Security | every scoped file |
|
|
382
|
-
| `type-safety+boundary-validation` | Type Safety, Boundary Validation | every scoped file |
|
|
383
|
-
| `async-patterns+error-handling` | Async Patterns, Error Handling | filtered |
|
|
384
|
-
| `config+dependency-hygiene` | Config, Dependency Hygiene | no `.ts` file: the project files each reference reads |
|
|
385
|
-
| `modernization+code-quality` | Modernization, Code Quality | every scoped file |
|
|
386
|
-
| `architecture` | Architecture | the inputs `references/architecture.md` names |
|
|
414
|
+
| Group | Domains | Files | Menu page |
|
|
415
|
+
|---|---|---|---|
|
|
416
|
+
| `security` | Security | every scoped file | 2 |
|
|
417
|
+
| `type-safety+boundary-validation` | Type Safety, Boundary Validation | every scoped file | 1 |
|
|
418
|
+
| `async-patterns+error-handling` | Async Patterns, Error Handling | filtered | 1 |
|
|
419
|
+
| `config+dependency-hygiene` | Config, Dependency Hygiene | no `.ts` file: the project files each reference reads | 1 |
|
|
420
|
+
| `modernization+code-quality` | Modernization, Code Quality | every scoped file | 1 |
|
|
421
|
+
| `architecture` | Architecture | the inputs `references/architecture.md` names | 2 |
|
|
387
422
|
|
|
388
423
|
pass_agent:
|
|
389
424
|
- every group runs as the `ts-reviewer-scout` agent when the scout file exists, except `architecture`, which runs as the default sub-agent on the main agent's model
|
|
390
425
|
- the scout file is `.claude/agents/ts-reviewer-scout.md` on Claude Code and `.codex/agents/ts-reviewer-scout.toml` on Codex, in the project root
|
|
391
|
-
- ask
|
|
426
|
+
- ask the scout model and effort on every run, by `start_questions`, offering the model of the scout file first, and write the answer to the scout file
|
|
392
427
|
- offer the models the host's agent call lists, or take the name the operator types when the host lists none
|
|
393
428
|
- the answer "the main agent's model" writes `inherit` on Claude Code and leaves `model` out on Codex
|
|
394
429
|
- pass the scout model, and the effort where the call takes one, in each agent call: a host can load a new agent file late
|
|
395
430
|
- `--scout <model>` in the request wins for 1 run: every group but `architecture` runs as the default sub-agent on that model, no scout file is written, and no scout question is asked
|
|
396
|
-
- a run with no operator answer
|
|
431
|
+
- a run with no operator answer, or with `--defaults`, keeps the scout file, and runs every group as the default sub-agent when there is none
|
|
397
432
|
- a host with no scout file format runs every group as the default sub-agent
|
|
398
433
|
- start a new agent for every pass, and never send a second pass to an agent that ran one: a reused agent reads each pass with every earlier one in its context
|
|
399
434
|
- close each agent once its `done` line is written
|
|
@@ -408,6 +443,7 @@ skill_lint:
|
|
|
408
443
|
- add `--in-diff` to the `lint-pass.mjs` command in a scoped mode: the skill lint reads the scoped files only
|
|
409
444
|
- run it after step 21, and write its findings as the pass `lint-skill` with `tools/lint-pass.mjs`, which takes category, severity, and fix from the owning line
|
|
410
445
|
- a declined or failed run marks the pass `lint-skill` failed, and every analysis pass keeps the lint-owned lines
|
|
446
|
+
- `start_questions` asks the approval at the start of the run, and `--lint` or `--no-lint` answers it
|
|
411
447
|
- an approval question with no operator answer is a decline
|
|
412
448
|
- the skill lint replaces no project linter: step 21 runs the project config as before
|
|
413
449
|
- leave the pass `lint-skill` out of the queue when no active domain owns a line carrying "lint-owned by": the lint has nothing to decide
|
|
@@ -64,7 +64,8 @@ export function passPrompts(plan, root) {
|
|
|
64
64
|
writeFileSync(path.join(prompts, `${pass.id}.md`), head + filled + "\n");
|
|
65
65
|
}
|
|
66
66
|
writeFileSync(path.join(dir, "queue.md"), [
|
|
67
|
-
"# Pass queue", "", `HEAD: ${plan.head}`, `Scope: ${plan.scope}`, `Agents per wave: ${plan.agents}`,
|
|
67
|
+
"# Pass queue", "", `HEAD: ${plan.head}`, `Scope: ${plan.scope}`, `Agents per wave: ${plan.agents}`,
|
|
68
|
+
`Lint: ${plan.lint ? "yes" : "no"}`, `Pass model: ${[plan.model ?? "default sub-agent", plan.effort].filter(Boolean).join(" ")}`, "",
|
|
68
69
|
"| Pass | Domains | Files | Status | Attempts | Findings |", "|---|---|---|---|---|---|", ...rows, "",
|
|
69
70
|
].join("\n"));
|
|
70
71
|
return rows.length;
|