@open-agent-toolkit/cli 0.2.48 → 0.2.50

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/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/tool-packs.md +35 -24
  3. package/assets/docs/cli-utilities/workflow-gates.md +19 -0
  4. package/assets/docs/contributing/skills.md +6 -4
  5. package/assets/docs/reference/cli-reference.md +1 -1
  6. package/assets/docs/reference/troubleshooting.md +22 -4
  7. package/assets/public-package-versions.json +4 -4
  8. package/assets/skills/oat-project-design/SKILL.md +13 -6
  9. package/assets/skills/oat-project-discover/SKILL.md +13 -6
  10. package/assets/skills/oat-project-import-plan/SKILL.md +8 -2
  11. package/assets/skills/oat-project-plan/SKILL.md +8 -2
  12. package/assets/skills/oat-project-quick-start/SKILL.md +8 -2
  13. package/dist/commands/doctor/index.d.ts +7 -0
  14. package/dist/commands/doctor/index.d.ts.map +1 -1
  15. package/dist/commands/doctor/index.js +44 -23
  16. package/dist/commands/gate/__fixtures__/fake-runtime.mjs +10 -0
  17. package/dist/commands/gate/configured-command.d.ts +12 -0
  18. package/dist/commands/gate/configured-command.d.ts.map +1 -0
  19. package/dist/commands/gate/configured-command.js +120 -0
  20. package/dist/commands/gate/index.d.ts.map +1 -1
  21. package/dist/commands/gate/index.js +51 -0
  22. package/dist/commands/pjm/index.d.ts +0 -2
  23. package/dist/commands/pjm/index.d.ts.map +1 -1
  24. package/dist/commands/pjm/index.js +5 -4
  25. package/dist/commands/pjm/migrate.d.ts +2 -1
  26. package/dist/commands/pjm/migrate.d.ts.map +1 -1
  27. package/dist/commands/pjm/migrate.js +23 -17
  28. package/dist/commands/status/index.d.ts +3 -1
  29. package/dist/commands/status/index.d.ts.map +1 -1
  30. package/dist/commands/status/index.js +77 -10
  31. package/dist/commands/tools/shared/pack-inventory.d.ts +10 -0
  32. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  33. package/dist/commands/tools/shared/pack-inventory.js +71 -21
  34. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.48"
3
+ "oatVersion": "0.2.50"
4
4
  }
@@ -189,23 +189,30 @@ creates `~/.oat/ideas/backlog.md` and `~/.oat/ideas/scratchpad.md`. Only the
189
189
  `workflows` project-scaffold seeds — `.oat/projects-root`, `.oat/config.json`,
190
190
  and the project `.gitkeep` files — are pinned to project scope.
191
191
 
192
- #### User-scope agents reach no provider
193
-
194
- Canonical **agents** are installed at either scope, but only project scope
195
- materializes a provider view for them. At user scope the sync pipeline
196
- enumerates skills only, and the sole user-scope agent materialization is the
197
- bundled managed role file set (`oat-phase-implementer.md` and
198
- `oat-reviewer.md`). A pack installed at user scope therefore writes its agents
199
- to `~/.agents/agents/` where no provider can see them — for example
200
- `oat tools install workflows --scope user` leaves `oat-codebase-mapper` without
201
- a provider agent, and `oat tools install research --scope user` does the same
202
- for `skeptical-evaluator`.
192
+ #### User-scope agents have limited native materialization
193
+
194
+ Canonical **agents** are installed at either scope. At user scope, native
195
+ Codex or Cursor role materialization is active only when that adapter is active
196
+ under the resolved sync config: explicit enablement wins without filesystem
197
+ detection, explicit disablement wins despite detection, and an unset adapter
198
+ follows detection. That native materialization supplies the bundled managed
199
+ role files (`oat-phase-implementer.md` and `oat-reviewer.md`); it does not
200
+ materialize other pack-owned user agents. For example, a user-scope workflows
201
+ install leaves `oat-codebase-mapper` without a native provider role, and a
202
+ user-scope research install does the same for `skeptical-evaluator`. When no
203
+ Codex or Cursor adapter is active, even the bundled managed roles lack native
204
+ materialization.
205
+
206
+ This diagnostic concerns native provider roles only. Providers may read
207
+ canonical agent instructions through a separate loaded, user, and project
208
+ lookup contract; that read availability does not establish native
209
+ materialization and does not suppress this finding.
203
210
 
204
211
  `oat status` and `oat doctor` name the affected agents with a
205
212
  `user-agent-unmaterialized` finding rather than reporting the pack as complete
206
213
  without qualification. Install the pack at **project scope** when you need its
207
- agents; `oat tools update` cannot repair this, because it is a scope limitation
208
- rather than drift.
214
+ native provider roles; `oat tools update` cannot repair this, because it is a
215
+ scope limitation rather than drift.
209
216
 
210
217
  Repository templates under `.oat/templates/` are **owner-owned seeds**. OAT
211
218
  compares a source-backed seed with its bundled default: a byte-equivalent copy
@@ -299,12 +306,14 @@ The canonical surface splits active operational state (under `pjm/`) from durabl
299
306
 
300
307
  Decisions are now file-per-record under `reference/decisions/` (created and indexed with the [`oat decision`](config-and-local-state.md#oat-decision-) command group), replacing the legacy single `decision-record.md`. Repos still on the old `reference/` layout can migrate with `oat pjm migrate`.
301
308
 
302
- > **Current migration prerequisite:** In CLI `0.2.37`, `oat pjm migrate` still
303
- > requires project-scope `tools.project-management: true` in `.oat/config.json`;
304
- > a user-only pack install does not satisfy that gate. In an adopted legacy
305
- > repository, run `oat config set tools.project-management true` before the
306
- > migration preview. Removing this temporary coupling is tracked by
307
- > `BL-260827-correct-scope-and-adoption`.
309
+ Migration eligibility is independent of where the `project-management` pack is
310
+ installed. `oat pjm migrate` resolves the repository's adoption state for
311
+ diagnostic context, then inventories recognized legacy sources before writing.
312
+ A complete current layout returns `already-migrated`; recognized legacy input
313
+ can be previewed or applied from any adoption state; and a repository with
314
+ neither recognized legacy input nor a complete current layout is skipped with
315
+ an `oat pjm init` recovery. `--print-prompt` only reads the bundled prompt and
316
+ does not inspect adoption or modify the repository.
308
317
 
309
318
  Decision records still require repository PJM adoption. Run `oat pjm init` first: like every repository-mutating PJM command, `oat decision init` fails closed in an unadopted repository, writes nothing, and returns `oat pjm init` as the recovery. Once the repository is adopted, `oat decision init` scaffolds only the decision surface — the decision directory, generated index, and decision-specific AGENTS guidance — without touching current state, roadmap, or backlog artifacts. It does not require the `project-management` pack. If the pack is installed later, its root guidance is maintained as a separate managed section so the decision instructions remain independently reusable.
310
319
 
@@ -322,11 +331,13 @@ repository-mutating PJM command checks it before writing anything:
322
331
  | `partial-initialization` | Some canonical scaffold files exist but the surface is incomplete | `oat pjm init` |
323
332
  | `none` | The repository has not adopted PJM | `oat pjm init` |
324
333
 
325
- `oat pjm`, `oat backlog`, and `oat decision` mutations **fail closed** for
326
- `partial-initialization` and `none`. They write nothing and return an error
327
- naming the repository path and `oat pjm init` as the recovery. `oat backlog
328
- init` and `oat decision init` are no longer alternate adoption paths for the
329
- full PJM surface.
334
+ Normal `oat pjm`, `oat backlog`, and `oat decision` mutations **fail closed**
335
+ for `partial-initialization` and `none`. They write nothing and return an error
336
+ naming the repository path and `oat pjm init` as the recovery. The explicit
337
+ `oat pjm migrate` command is the bounded exception: recognized legacy sources
338
+ authorize that migration regardless of the adoption label. `oat backlog init`
339
+ and `oat decision init` are no longer alternate adoption paths for the full PJM
340
+ surface.
330
341
 
331
342
  Run `oat pjm doctor` to inspect an existing surface. It is read-only, reports
332
343
  missing canonical files, leftover template frontmatter, and
@@ -51,6 +51,17 @@ Fields:
51
51
  - `description` - optional context for the agent running the gate.
52
52
  - `maxAttempts` - retry bound for `block`; defaults to `2`.
53
53
 
54
+ When `oat gate set` recognizes a direct lifecycle `oat gate review` command,
55
+ it requires the canonical global option placement `oat --json gate review`.
56
+ Missing, late, repeated, or subcommand-scoped `--json` is rejected with exit 1
57
+ before the selected shared, local, or user config layer is changed. Arbitrary
58
+ wrappers, unrelated gate commands, and provider exec-target `baseCommand`
59
+ arrays remain outside this validator.
60
+
61
+ A valid command is stored byte-for-byte. `oat gate resolve` returns that exact
62
+ string, and the lifecycle executes it unchanged; OAT does not inject, reorder,
63
+ or rewrite its shell arguments.
64
+
54
65
  `oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`, and
55
66
  `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
56
67
  in skill frontmatter with `oat_gateable: true`, and
@@ -284,6 +295,7 @@ and disambiguate re-gate rounds:
284
295
  | `ok` | 0 | Review completed; gate passed at the threshold. |
285
296
  | `blocked` | 1 | Review completed; findings at/above the threshold. |
286
297
  | `review_failed` | ≠0 | The provider target exited non-zero; no verdict. |
298
+ | `artifact_missing` | 1 | The child exited cleanly without producing an artifact. |
287
299
  | `artifact_validation_failed` | 1 | Artifact format or configured invocation fields are invalid. |
288
300
  | `targeting_correlation_failed` | 1 | Identity did not correlate; do not run review-receive. |
289
301
 
@@ -296,6 +308,13 @@ For `artifact_validation_failed`, correct the artifact and rerun the gate; do
296
308
  not invoke review-receive until the gate successfully revalidates it as `ok` or
297
309
  `blocked`.
298
310
 
311
+ `artifact_missing` means the accepted headless child completed without any
312
+ review artifact. It sets `receiveEligible: false`, `remediable: false`, and
313
+ `handoff: null`. Fix the reviewer so review work, artifact creation, and
314
+ bookkeeping finish inline or through a synchronously awaited child, then start
315
+ a new gate run. Do not use review-fix retries or review-receive for the failed
316
+ run.
317
+
299
318
  `ok` and `blocked` also include `receiveEligible: true`, `outcome`,
300
319
  `artifactPath`, `counts`, `scope`, `handoff`, `gateInvocation`, and
301
320
  `corroboration`. Invoke review-receive only when all three conditions hold:
@@ -262,9 +262,11 @@ The Gate Execution step should:
262
262
  2. Treat `null` as "no gate configured."
263
263
  3. Export the resolved path with `export PROJECT_PATH` before launching the
264
264
  command shell.
265
- 4. For `oat gate review`, require the configured command to include
266
- `--project "$PROJECT_PATH"`; do not append it at runtime, because the resolved
267
- command must execute exactly as configured.
265
+ 4. For `oat gate review`, require the configured command to use
266
+ `oat --json gate review --project "$PROJECT_PATH" ...`, with the global
267
+ `--json` option before `gate review`. Do not inject, append, or reorder
268
+ arguments at runtime, because the resolved command must execute exactly as
269
+ configured.
268
270
  5. Run the resolved `command` as the skill's last step and use its exit code as
269
271
  the pass/fail signal.
270
272
  6. Follow the gate's `onFailure` policy:
@@ -273,7 +275,7 @@ The Gate Execution step should:
273
275
  - `warn` - record the failure and continue.
274
276
 
275
277
  For OAT review gates, prefer putting
276
- `oat gate review --project "$PROJECT_PATH" "<prompt>"` in the configured gate
278
+ `oat --json gate review --project "$PROJECT_PATH" "<prompt>"` in the configured gate
277
279
  command rather than hard-coding a provider CLI directly in the skill. Use
278
280
  `oat gate cross-provider-exec "<prompt>"` for generic cross-runtime commands
279
281
  that should report only the child process status, not review findings.
@@ -126,7 +126,7 @@ Notable commands introduced in the current CLI surface:
126
126
  - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
127
127
  - `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../cli-utilities/project-log.md).
128
128
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
129
- - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. For `targeting_correlation_failed`, do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
129
+ - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
130
130
  - `oat gate route --expect-runtime <runtime> --expect-model <model> --can-await <true|false> --json` - return the headless child route (`inline`, `delegate-sync`, or `refuse`) from provider-marker and model evidence. Ambiguous or contradictory evidence never routes inline.
131
131
  - `oat gate exec <prompt...>` / `oat gate cross-provider-exec <prompt...>` - run a generic target prompt. `--timeout-ms` uses the same validated CLI override; untyped runs otherwise retain the legacy default path.
132
132
  - `oat gate target set <id> --invocation-model <model|provider-default> --invocation-reasoning-effort <effort|provider-default>` - persist optional configured invocation metadata alongside an exec target without inferring it from the target command.
@@ -167,12 +167,30 @@ Both commands report managed pack state with a scoped recovery command:
167
167
  place and your edits are gone. The finding is informational and carries no
168
168
  recovery command for exactly that reason.
169
169
  - `user-agent-unmaterialized` — the pack installed canonical agents into
170
- `~/.agents/agents/`, but user scope materializes no provider view for them
171
- beyond the bundled managed role files. `oat tools update` cannot fix this.
172
- Install the pack at project scope (`oat tools install <pack> --scope project`)
173
- when you need its agents. See
170
+ `~/.agents/agents/`, but active native Codex/Cursor adapters materialize only
171
+ the bundled managed role files at user scope. Other pack-owned agents remain
172
+ unmaterialized; when neither adapter is active, the managed roles do too.
173
+ Provider access to canonical instructions through loaded, user, and project
174
+ reads is a separate contract and does not clear this native-role finding.
175
+ `oat tools update` cannot fix it. Install the pack at project scope
176
+ (`oat tools install <pack> --scope project`) when you need its native roles. See
174
177
  [Tool packs](../cli-utilities/tool-packs.md) for the full limitation.
175
178
 
179
+ ## `status` or `doctor` reports `packs:inventory`
180
+
181
+ OAT could not read the canonical managed-pack inventory. `oat status` keeps the
182
+ rest of the report available and returns `packs.availability.status` as
183
+ `unavailable` in JSON, with an empty `packs.states` array and a structured
184
+ diagnostic. `oat doctor` emits the same condition as a warning instead of
185
+ stopping its other checks. Reported project and home paths remain redacted.
186
+
187
+ Rebuild the CLI workspace, then rerun the command named in the diagnostic:
188
+
189
+ ```bash
190
+ pnpm build
191
+ oat status # or: oat doctor
192
+ ```
193
+
176
194
  ## `status` or `doctor` reports `legacy-false-conflict`
177
195
 
178
196
  An older repository left `tools.<pack>: false` in shared config while managed
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.48",
3
- "docs-config": "0.2.48",
4
- "docs-theme": "0.2.48",
5
- "docs-transforms": "0.2.48"
2
+ "cli": "0.2.50",
3
+ "docs-config": "0.2.50",
4
+ "docs-theme": "0.2.50",
5
+ "docs-transforms": "0.2.50"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-design
3
- version: 2.3.1
3
+ version: 2.3.2
4
4
  description: Use when discovery is complete and implementation-ready decisions are needed. Runs a collaborative, selective collaborative, or draft-and-review design flow, confirms requirements and produces both `spec.md` and `design.md`, and commits artifacts before the user-review gate.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -658,11 +658,18 @@ gate as the last check before the completion boundary:
658
658
  ```
659
659
 
660
660
  If the resolved command invokes `oat gate review`, the configured review
661
- command must already include `--project "$PROJECT_PATH"` and must not include
662
- `--target <id>`. A valid reusable shape is
663
- `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is
664
- missing, stop and migrate the stored gate command; do not inject or append
665
- arguments at execution time.
661
+ command must already include `--project "$PROJECT_PATH"` as part of the
662
+ structured-output contract. Its canonical form is:
663
+
664
+ ```bash
665
+ oat --json gate review --project "$PROJECT_PATH" ...
666
+ ```
667
+
668
+ This requires global `--json` before `gate review`. Reusable declarations
669
+ must not include
670
+ `--target <id>`. Reject `oat gate review ...` without the global `--json`
671
+ placement. Stop and migrate an invalid stored declaration before execution;
672
+ never inject or append execution-time argv.
666
673
 
667
674
  3. Execute the resolved command exactly as configured. Capture stdout, stderr,
668
675
  the exit code, and the structured JSON result. A zero exit code means the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-discover
3
- version: 2.2.1
3
+ version: 2.2.2
4
4
  description: Use when the user explicitly asks to continue discovery for an active spec-driven OAT project — e.g. "continue discovery", "run discovery", or confirms a previously offered discovery step. Do NOT auto-invoke for new ideas or quick-mode projects. Gathers requirements and context before spec/design.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -445,11 +445,18 @@ gate as the last check before the completion boundary:
445
445
  ```
446
446
 
447
447
  If the resolved command invokes `oat gate review`, the configured review
448
- command must already include `--project "$PROJECT_PATH"` and must not include
449
- `--target <id>`. A valid reusable shape is
450
- `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is
451
- missing, stop and migrate the stored gate command; do not inject or append
452
- arguments at execution time.
448
+ command must already include `--project "$PROJECT_PATH"` as part of the
449
+ structured-output contract. Its canonical form is:
450
+
451
+ ```bash
452
+ oat --json gate review --project "$PROJECT_PATH" ...
453
+ ```
454
+
455
+ This requires global `--json` before `gate review`. Reusable declarations
456
+ must not include
457
+ `--target <id>`. Reject `oat gate review ...` without the global `--json`
458
+ placement. Stop and migrate an invalid stored declaration before execution;
459
+ never inject or append execution-time argv.
453
460
 
454
461
  3. Execute the resolved command exactly as configured. Capture stdout, stderr,
455
462
  the exit code, and the structured JSON result. A zero exit code means the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-import-plan
3
- version: 1.4.10
3
+ version: 1.4.11
4
4
  description: Use when you have an external markdown plan to execute with OAT. Preserves the source plan and normalizes it into canonical plan.md format.
5
5
  argument-hint: '<path-to-plan.md> [--provider codex|cursor|claude] [--project <name>]'
6
6
  oat_gateable: true
@@ -460,7 +460,13 @@ Before reporting this skill as complete, run the configured gate as the final st
460
460
  export PROJECT_PATH
461
461
  ```
462
462
 
463
- If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` and must not include `--target <id>`. A valid reusable shape is `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is missing, stop and migrate the stored gate command; do not inject or append arguments at execution time.
463
+ If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` as part of the structured-output contract. Its canonical form is:
464
+
465
+ ```bash
466
+ oat --json gate review --project "$PROJECT_PATH" ...
467
+ ```
468
+
469
+ This requires global `--json` before `gate review`. Reusable declarations must not include `--target <id>`. Reject `oat gate review ...` without the global `--json` placement. Stop and migrate an invalid stored declaration before execution; never inject or append execution-time argv.
464
470
 
465
471
  3. Resolve the current planning parent's model identity from session context.
466
472
  When that identity is non-empty and the resolved configured command invokes
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan
3
- version: 1.4.5
3
+ version: 1.4.6
4
4
  description: Use when design.md is complete and executable implementation tasks are needed. Breaks design into bite-sized TDD tasks in canonical plan.md format.
5
5
  oat_gateable: true
6
6
  disable-model-invocation: true
@@ -544,7 +544,13 @@ the last check before the completion boundary:
544
544
  export PROJECT_PATH
545
545
  ```
546
546
 
547
- If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` and must not include `--target <id>`. A valid reusable shape is `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is missing, stop and migrate the stored gate command; do not inject or append arguments at execution time.
547
+ If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` as part of the structured-output contract. Its canonical form is:
548
+
549
+ ```bash
550
+ oat --json gate review --project "$PROJECT_PATH" ...
551
+ ```
552
+
553
+ This requires global `--json` before `gate review`. Reusable declarations must not include `--target <id>`. Reject `oat gate review ...` without the global `--json` placement. Stop and migrate an invalid stored declaration before execution; never inject or append execution-time argv.
548
554
 
549
555
  3. Resolve the current planning parent's model identity from session context.
550
556
  When that identity is non-empty and the resolved configured command invokes
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 2.3.6
3
+ version: 2.3.7
4
4
  description: Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design.
5
5
  argument-hint: '<project-name> ["project description"]'
6
6
  oat_gateable: true
@@ -735,7 +735,13 @@ as the last check before plan and project completion:
735
735
  export PROJECT_PATH
736
736
  ```
737
737
 
738
- If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` and must not include `--target <id>`. A valid reusable shape is `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is missing, stop and migrate the stored gate command; do not inject or append arguments at execution time.
738
+ If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` as part of the structured-output contract. Its canonical form is:
739
+
740
+ ```bash
741
+ oat --json gate review --project "$PROJECT_PATH" ...
742
+ ```
743
+
744
+ This requires global `--json` before `gate review`. Reusable declarations must not include `--target <id>`. Reject `oat gate review ...` without the global `--json` placement. Stop and migrate an invalid stored declaration before execution; never inject or append execution-time argv.
739
745
 
740
746
  3. Resolve the current planning parent's model identity from session context.
741
747
  When that identity is non-empty and the resolved configured command invokes
@@ -2,10 +2,12 @@ import { type CommandContext, type GlobalOptions } from '../../app/command-conte
2
2
  import { type PjmAdoption, type ResolvePjmAdoptionOptions } from '../pjm/adoption.js';
3
3
  import { type PjmDoctorOptions } from '../pjm/doctor.js';
4
4
  import { type InventoryPackInput, type PackInventory } from '../tools/shared/pack-inventory.js';
5
+ import type { SyncConfig } from '../../config/index.js';
5
6
  import { type OatConfig, type OatLocalConfig, type UserConfig } from '../../config/oat-config.js';
6
7
  import { type Manifest } from '../../manifest/index.js';
7
8
  import { type CursorMaterializedModelDiagnostic, type MatrixCellAvailabilityResponse, type ValidateMatrixCellOptions } from '../../providers/identity/availability.js';
8
9
  import { createDispatchValidationPassContext, validateDispatchMatrixRefs } from '../../providers/identity/dispatch-validation.js';
10
+ import { type ProviderAdapter } from '../../providers/shared/index.js';
9
11
  import type { ConcreteScope } from '../../shared/types.js';
10
12
  import { type DoctorCheck } from '../../ui/output.js';
11
13
  import { Command } from 'commander';
@@ -22,6 +24,11 @@ interface DoctorDependencies {
22
24
  }>>;
23
25
  readFile: (path: string) => Promise<string>;
24
26
  resolveAssetsRoot: () => Promise<string>;
27
+ resolveUserSyncConfig: (userConfigDir: string) => Promise<SyncConfig>;
28
+ getAdapters: () => ProviderAdapter[];
29
+ getConfigAwareAdapters: (adapters: ProviderAdapter[], scopeRoot: string, config: SyncConfig) => Promise<{
30
+ activeAdapters: ProviderAdapter[];
31
+ }>;
25
32
  readOatConfig: (repoRoot: string) => Promise<OatConfig>;
26
33
  readOatConfigForDefaultScopeRepair: (repoRoot: string) => Promise<OatConfig>;
27
34
  readOatLocalConfig: (repoRoot: string) => Promise<OatLocalConfig>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,12 @@ import { runPjmDoctorChecks, } from '../pjm/doctor.js';
8
8
  import { getSkillVersion } from '../shared/frontmatter.js';
9
9
  import { withScopeOption } from '../shared/scope-option.js';
10
10
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
11
- import { hasScopedPackPlacementEvidence, inventoryPack, } from '../tools/shared/pack-inventory.js';
11
+ import { attributeSharedOwnerDiagnostics, hasScopedPackPlacementEvidence, inventoryPack, } from '../tools/shared/pack-inventory.js';
12
12
  import { PACK_NAMES } from '../tools/shared/pack-manifest.js';
13
13
  import { formatPackPaths, updatePackRecovery, } from '../tools/shared/pack-paths.js';
14
14
  import { walkDispatchMatrix, } from '../../config/dispatch-matrix.js';
15
15
  import { readOatConfig, readOatConfigForDefaultScopeRepair, readOatLocalConfig, readUserConfig, } from '../../config/oat-config.js';
16
+ import { resolveUserSyncConfig } from '../../config/user-sync-config.js';
16
17
  import { resolveAssetsRoot } from '../../fs/assets.js';
17
18
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
18
19
  import TOML from '@iarna/toml';
@@ -26,6 +27,7 @@ import { CURSOR_MODEL_PIN_MAPPINGS } from '../../providers/cursor/codec/catalog.
26
27
  import { geminiAdapter } from '../../providers/gemini/index.js';
27
28
  import { diagnoseCursorMaterializedModels, validateMatrixCell, } from '../../providers/identity/availability.js';
28
29
  import { createDispatchValidationPassContext, validateDispatchMatrixRefs, } from '../../providers/identity/dispatch-validation.js';
30
+ import { getConfigAwareAdapters, } from '../../providers/shared/index.js';
29
31
  import { formatDoctorResults } from '../../ui/output.js';
30
32
  import { Command } from 'commander';
31
33
  import { checkStaleInvocations } from './stale-invocations.js';
@@ -139,6 +141,15 @@ function createDependencies() {
139
141
  checkProviders: checkProvidersDefault,
140
142
  readFile: async (path) => readFile(path, 'utf8'),
141
143
  resolveAssetsRoot,
144
+ resolveUserSyncConfig,
145
+ getAdapters: () => [
146
+ claudeAdapter,
147
+ cursorAdapter,
148
+ codexAdapter,
149
+ copilotAdapter,
150
+ geminiAdapter,
151
+ ],
152
+ getConfigAwareAdapters,
142
153
  readOatConfig,
143
154
  readOatConfigForDefaultScopeRepair,
144
155
  readOatLocalConfig,
@@ -477,18 +488,6 @@ function collectPackStateFindings(inventories) {
477
488
  for (const scoped of inventory.scopes) {
478
489
  const { scope } = scoped;
479
490
  if (!hasScopedPackPlacementEvidence(scoped)) {
480
- const sharedPresent = scoped.assets.filter((asset) => asset.definition.sharedOwner !== undefined &&
481
- asset.status !== 'missing');
482
- if (sharedPresent.length > 0) {
483
- findings.push({
484
- pack: inventory.pack,
485
- scope,
486
- code: 'shared-owner-observation',
487
- detail: 'shared managed assets are present without pack ownership evidence',
488
- paths: sharedPresent.map(({ path }) => path),
489
- recovery: null,
490
- });
491
- }
492
491
  continue;
493
492
  }
494
493
  const managed = scoped.assets.filter((asset) => asset.definition.ownership[scope] === 'managed');
@@ -560,7 +559,18 @@ function collectPackStateFindings(inventories) {
560
559
  pack: inventory.pack,
561
560
  scope,
562
561
  code: 'user-agent-unmaterialized',
563
- detail: `${diagnostic.paths.length} user-scope agent(s) reach no provider; user-scope agent materialization is limited to the bundled managed role files, so install this pack at project scope to use them`,
562
+ detail: `${diagnostic.paths.length} user-scope agent(s) lack native provider-role materialization; canonical instruction reads are unaffected, and active Codex or Cursor materialization supplies only the bundled managed roles, so install this pack at project scope to materialize the affected agents`,
563
+ paths: diagnostic.paths,
564
+ recovery: null,
565
+ });
566
+ continue;
567
+ }
568
+ if (diagnostic.code === 'shared-owner-observation') {
569
+ findings.push({
570
+ pack: inventory.pack,
571
+ scope,
572
+ code: 'shared-owner-observation',
573
+ detail: diagnostic.message,
564
574
  paths: diagnostic.paths,
565
575
  recovery: null,
566
576
  });
@@ -610,10 +620,10 @@ function createScopedPackStateCheck(scope, findings, roots) {
610
620
  name: `${scope}:pack_state`,
611
621
  description: 'Managed pack completeness and drift',
612
622
  status: recoveries.length > 0 ? 'warn' : 'pass',
613
- message: scoped
614
- .map((finding) => formatPackFinding(finding, roots))
615
- .join('; '),
616
- fix: recoveries.length > 0 ? recoveries.join('; ') : undefined,
623
+ message: `Findings:\n${scoped
624
+ .map((finding) => ` - ${formatPackFinding(finding, roots)}`)
625
+ .join('\n')}`,
626
+ fix: recoveries.length > 0 ? recoveries.join('\n Fix: ') : undefined,
617
627
  };
618
628
  }
619
629
  function createPackDuplicationCheck(findings, roots) {
@@ -630,10 +640,10 @@ function createPackDuplicationCheck(findings, roots) {
630
640
  name: 'packs:scope_duplication',
631
641
  description: 'Cross-scope pack duplication',
632
642
  status: 'warn',
633
- message: duplicates
634
- .map((finding) => formatPackFinding(finding, roots))
635
- .join('; '),
636
- fix: uniqueRecoveries(duplicates).join('; '),
643
+ message: `Findings:\n${duplicates
644
+ .map((finding) => ` - ${formatPackFinding(finding, roots)}`)
645
+ .join('\n')}`,
646
+ fix: uniqueRecoveries(duplicates).join('\n Fix: '),
637
647
  };
638
648
  }
639
649
  async function createPackStateChecks(scopeRoots, dependencies) {
@@ -649,7 +659,18 @@ async function createPackStateChecks(scopeRoots, dependencies) {
649
659
  let findings;
650
660
  try {
651
661
  const assetsRoot = await dependencies.resolveAssetsRoot();
652
- const inventories = await Promise.all(PACK_NAMES.map((pack) => dependencies.inventoryPack({ pack, assetsRoot, ...roots })));
662
+ const userRoot = scopeRoots.get('user');
663
+ const userManagedRoleMaterialization = userRoot
664
+ ? await dependencies
665
+ .getConfigAwareAdapters(dependencies.getAdapters(), userRoot, await dependencies.resolveUserSyncConfig(join(userRoot, '.oat')))
666
+ .then(({ activeAdapters }) => activeAdapters.some(({ name }) => name === 'codex' || name === 'cursor'))
667
+ : false;
668
+ const inventories = attributeSharedOwnerDiagnostics(await Promise.all(PACK_NAMES.map((pack) => dependencies.inventoryPack({
669
+ pack,
670
+ assetsRoot,
671
+ ...roots,
672
+ ...(userRoot ? { userManagedRoleMaterialization } : {}),
673
+ }))));
653
674
  findings = collectPackStateFindings(inventories);
654
675
  }
655
676
  catch (error) {
@@ -8,6 +8,16 @@ const delayMs = Number(process.env.FAKE_GATE_DELAY_MS ?? '0');
8
8
  const exitCode = Number(process.env.FAKE_GATE_EXIT_CODE ?? '0');
9
9
  const artifactMode = process.env.FAKE_GATE_ARTIFACT ?? 'none';
10
10
  const transcriptIntervalMs = Number(process.env.FAKE_GATE_TRANSCRIPT_INTERVAL_MS ?? '0');
11
+ if (process.env.FAKE_GATE_INVOCATION_LOG) {
12
+ await appendFile(process.env.FAKE_GATE_INVOCATION_LOG, `${JSON.stringify({
13
+ pid: process.pid,
14
+ headless: process.env.OAT_GATE_HEADLESS ?? null,
15
+ nonInteractive: process.env.OAT_NON_INTERACTIVE ?? null,
16
+ runId: process.env.OAT_GATE_RUN_ID ?? null,
17
+ cliPath: process.env.OAT_GATE_CLI_PATH ?? null,
18
+ routeReceiptPath: process.env.OAT_GATE_ROUTE_RECEIPT_PATH ?? null,
19
+ })}\n`);
20
+ }
11
21
  function promptValue(key) {
12
22
  return prompt.match(new RegExp(`^${key}: (.+)$`, 'm'))?.[1] ?? 'unknown';
13
23
  }
@@ -0,0 +1,12 @@
1
+ export type GateCommandContractResult = {
2
+ kind: 'not-applicable';
3
+ } | {
4
+ kind: 'valid';
5
+ command: 'gate-review';
6
+ } | {
7
+ kind: 'invalid';
8
+ command: 'gate-review';
9
+ message: string;
10
+ };
11
+ export declare function validateConfiguredGateCommand(command: string): GateCommandContractResult;
12
+ //# sourceMappingURL=configured-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configured-command.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/configured-command.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAmIjE,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,GACd,yBAAyB,CAoB3B"}