@open-agent-toolkit/cli 0.2.46 → 0.2.48

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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.46"
3
+ "oatVersion": "0.2.48"
4
4
  }
@@ -92,6 +92,25 @@ still fail closed with the owning pack's install or update command. See
92
92
  [Writing Skills → Portable sibling reads](../contributing/skills.md#portable-sibling-reads-skills-and-agents)
93
93
  for the full contract.
94
94
 
95
+ Skills that read a fixed canonical workflows role use a different, local
96
+ `${AGENT_PROVIDER_ROOT}` binding. They try the loaded skill's provider root,
97
+ then `${HOME}/.agents`, then the repository's `.agents` root. The loaded tier
98
+ qualifies only when the exact unsuffixed `agents/<canonical-name>.md` target is
99
+ the same-scope canonical Markdown file or a symlink resolving exactly to it.
100
+ Copies, broken or escaping links, Cursor model/effort variants, and Codex TOML
101
+ roles are misses; resolution continues to the next tier.
102
+
103
+ That binding only locates canonical source instructions for the one owning
104
+ dependency. It does not select a provider, model, effort, variant, route, or
105
+ native agent. Resolve simultaneous pack dependencies independently. If every
106
+ workflows candidate misses, stop before fallback dispatch and report the
107
+ intended-scope recovery explicitly:
108
+
109
+ ```bash
110
+ oat tools install workflows --scope <user|project>
111
+ oat tools update --pack workflows --scope <user|project>
112
+ ```
113
+
95
114
  The packs remain independently installable. If the workflows adapter is
96
115
  present without the utility contracts, it fails closed and reports the missing
97
116
  dependency instead of inventing a fallback route. Non-project analytical
@@ -51,6 +51,37 @@ Probe each candidate for the exact target and use the first match. If none
51
51
  exists, name the missing sibling, give an actionable install or update command,
52
52
  and stop that workflow branch instead of improvising the sibling's process.
53
53
 
54
+ ### Skills bind canonical agent reads through a local provider root
55
+
56
+ When a skill must read one fixed canonical role instruction, bind a local
57
+ `${AGENT_PROVIDER_ROOT}` for that dependency in this order:
58
+
59
+ 1. Derive `${SKILL_DIR}/../..` from the loaded skill path, but admit it only
60
+ when the exact unsuffixed `agents/<canonical-name>.md` target is the
61
+ same-scope canonical Markdown file or a symlink whose real path is exactly
62
+ that file.
63
+ 2. Try the user-scope root at `${HOME}/.agents`.
64
+ 3. Fall back to the project-scope root at `<repo-root>/.agents`.
65
+
66
+ An invalid loaded target is a candidate miss, so resolution continues to the
67
+ user and project roots. Regular provider copies, broken or escaping symlinks,
68
+ transformed content, other role names, model/effort/variant-suffixed files, and
69
+ `.codex/agents/*.toml` are never canonical candidates. Claude and Cursor base
70
+ role symlinks can qualify when they resolve exactly to the same-scope canonical
71
+ file; Cursor materialized variants cannot.
72
+
73
+ `${AGENT_PROVIDER_ROOT}` is local authored-instruction notation, not a global
74
+ environment variable or a provider-native role selector. It has no authority
75
+ over provider, model, effort, variant, route, or dispatch choice. Resolve every
76
+ owning pack independently, even when multiple role dependencies coexist. If
77
+ all candidates miss for a workflows-owned role, stop before fallback launch
78
+ and report both recovery forms for the intended scope:
79
+
80
+ ```bash
81
+ oat tools install workflows --scope <user|project>
82
+ oat tools update --pack workflows --scope <user|project>
83
+ ```
84
+
54
85
  ### Materialized agents resolve in two steps
55
86
 
56
87
  Canonical agents are materialized into provider-specific views — Codex receives
@@ -88,21 +119,26 @@ dependency.
88
119
 
89
120
  ### The ratchet allows only exact historical baselines
90
121
 
91
- Do not use a bare `.agents/skills/<sibling>/SKILL.md`, `./.agents/...`, or
92
- `../.agents/...` path for an executable read in any user-default skill or
93
- agent. The bundled-docs contract test enforces this over the whole
94
- manifest-derived surface and reports each violation as exact
95
- `source -> target` evidence.
96
-
97
- The only exemption is a pinned historical baseline: non-executable evidence
98
- such as a dogfood transcript or a fixture README, recorded by exact source
99
- file, target skill, and target path. There is no wildcard, directory-wide, or
100
- skill-wide allowance, and no temporary migration allowlist — executable debt is
101
- fixed at the caller instead of being exempted. The same assertions run against
102
- the bundled CLI copies of both skills and agents, and the sync contract test
103
- re-checks the roles it materializes for Codex, so a canonical fix must survive
104
- bundling and Codex sync as well. No test yet gates the generated `.claude` or
105
- `.cursor` agent views, so regenerate and spot-check those by hand.
122
+ Do not use a bare `.agents/skills/<sibling>/SKILL.md`,
123
+ `.agents/agents/<canonical-name>.md`, dot-relative equivalent, or repeated-parent
124
+ canonical `agents/<canonical-name>.md` hop for an executable read in any
125
+ user-default skill or agent. The bundled-docs contract test enforces this over
126
+ the whole manifest-derived surface and reports each violation as exact
127
+ `source -> target` evidence. Executable agent findings have a zero baseline, so
128
+ every bare canonical-agent read fails the ratchet. Portable
129
+ `${AGENT_PROVIDER_ROOT}/agents/...` reads and legitimate `.claude` or `.cursor`
130
+ provider-view examples are classified as non-findings.
131
+
132
+ The pinned historical baseline applies only to skill findings: its six exact
133
+ entries are non-executable evidence such as dogfood transcripts or fixture
134
+ READMEs, recorded by source file, target skill, and target path. There is no
135
+ wildcard, directory-wide, or skill-wide allowance, and no temporary migration
136
+ allowlist — executable debt is fixed at the caller instead of being exempted.
137
+ The same assertions run against the bundled CLI copies of both skills and
138
+ agents, and the sync contract test re-checks the roles it materializes for
139
+ Codex, so a canonical fix must survive bundling and Codex sync as well. No test
140
+ yet gates the generated `.claude` or `.cursor` agent views, so regenerate and
141
+ spot-check those by hand.
106
142
 
107
143
  ## Contract components
108
144
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.2.46",
3
- "docs-config": "0.2.46",
4
- "docs-theme": "0.2.46",
5
- "docs-transforms": "0.2.46"
2
+ "cli": "0.2.48",
3
+ "docs-config": "0.2.48",
4
+ "docs-theme": "0.2.48",
5
+ "docs-transforms": "0.2.48"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-implement
3
- version: 2.3.0
3
+ version: 2.3.1
4
4
  description: Use when plan.md is ready for execution. Dispatches one phase implementer per phase, owns independent phase review and bounded fix routing, and supports plan-declared worktree-isolated parallel phases.
5
5
  oat_gateable: true
6
6
  argument-hint: '[--retry-limit <N>] [--dry-run]'
@@ -13,6 +13,32 @@ canonical.
13
13
 
14
14
  ### Step 0.5: Capability Detection and Tier Selection
15
15
 
16
+ **Canonical fallback role instructions:** Before a fresh-child fallback can
17
+ read either workflows-owned role, independently resolve each exact target. For
18
+ `oat-phase-implementer`, bind the first valid root to
19
+ `${IMPLEMENTER_AGENT_PROVIDER_ROOT}`; for `oat-reviewer`, bind the first valid
20
+ root to `${REVIEWER_AGENT_PROVIDER_ROOT}`. For each role independently probe
21
+ candidates in this order: `${SKILL_DIR}/../..`, `${HOME}/.agents`, then
22
+ `<repo-root>/.agents`. Do not reuse one role's resolved root for the other.
23
+
24
+ Each loaded candidate is valid only when the exact unsuffixed role target is
25
+ the same-scope canonical file or a symlink whose realpath is exactly that
26
+ canonical file. Treat a missing, broken, escaping, copied, transformed,
27
+ suffixed, wrong-role, or otherwise noncanonical candidate as a miss and
28
+ continue to the next candidate. If either required role misses every candidate,
29
+ name that role, stop before the fresh-child fallback, and report
30
+ `oat tools install workflows --scope <user|project>` or
31
+ `oat tools update --pack workflows --scope <user|project>` for the intended
32
+ scope.
33
+
34
+ These canonical role instructions cannot change the immutable target,
35
+ provider, model, effort, or variant fields selected by the resolver. Native
36
+ dispatch sends the exact resolver-selected variant or `agent_type` first. A
37
+ fresh child is allowed only after an explicit pre-start native role-selection
38
+ rejection before any child starts. Once accepted, continue only through the existing
39
+ handle; terminal results, including `BLOCKED`, never authorize replacement or
40
+ fallback.
41
+
16
42
  **Mandatory target-first order:** Complete Dispatch Policy Preflight and
17
43
  resolve the concrete managed target before probing generic agent availability
18
44
  or locking Tier 1/Tier 2. A concrete target takes precedence over tier
@@ -22,9 +48,10 @@ native spawn API as native `agent_type`; spawn acceptance plus the constructed
22
48
  launcher payload is configured invocation evidence, and independent runtime
23
49
  telemetry or agent self-report is not required. Launch a fresh Codex child
24
50
  pinned to the resolver target's explicit model, reasoning effort, and
25
- canonical role instructions from `.agents/agents/oat-phase-implementer.md` or
26
- `.agents/agents/oat-reviewer.md` only after a native role-selection rejection
27
- as defined below.
51
+ canonical role instructions from
52
+ `${IMPLEMENTER_AGENT_PROVIDER_ROOT}/agents/oat-phase-implementer.md` or
53
+ `${REVIEWER_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md` only after a native
54
+ role-selection rejection as defined below.
28
55
  If that fresh child cannot be launched, fail closed and block; never
29
56
  substitute a base or coordinator role for a managed phase target. Inline
30
57
  execution is allowed only with verified equivalent current-host model and
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.19
3
+ version: 1.2.20
4
4
  description: Use when authoring or mutating plan.md in any OAT workflow. Defines canonical format invariants — stable task IDs, required sections, review table rules, and resume guardrails.
5
5
  disable-model-invocation: true
6
6
  user-invocable: false
@@ -197,6 +197,25 @@ for an exception. A `## Dispatch Profile` row alone cannot authorize reviewer
197
197
  lowering; only a separate reviewed contract may define a bounded lower
198
198
  candidate exception.
199
199
 
200
+ Before the artifact-review exception can read canonical reviewer instructions,
201
+ resolve the workflows-owned role locally. Probe candidates in this order:
202
+ `${SKILL_DIR}/../..`, `${HOME}/.agents`, then `<repo-root>/.agents`. The loaded
203
+ candidate is valid only when the exact unsuffixed `agents/oat-reviewer.md` is
204
+ the same-scope canonical file or a symlink whose realpath is exactly that
205
+ canonical file. Treat a missing, broken, escaping, copied, transformed,
206
+ suffixed, or otherwise noncanonical candidate as a miss and continue to the
207
+ next candidate. Bind the first valid root to
208
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}`; never use ambient discovery.
209
+
210
+ If every candidate misses, name `oat-reviewer`, stop before the artifact-review
211
+ fresh-child fallback dispatch, and report
212
+ `oat tools install workflows --scope <user|project>` or
213
+ `oat tools update --pack workflows --scope <user|project>` for the intended
214
+ scope. Canonical role instructions cannot change the immutable target,
215
+ provider, model, effort, or variant fields selected by the resolver. The exact
216
+ registered native reviewer variant remains first; only an explicit pre-start
217
+ native role-selection rejection before a child starts unlocks the fresh child.
218
+
200
219
  For the exception route, bind every concrete managed reviewer target to the
201
220
  actual provider invocation before probing generic reviewer availability or
202
221
  selecting execution mechanics. A concrete managed Codex target takes precedence
@@ -207,10 +226,11 @@ over generic tier availability.
207
226
  reviewer variant as native `agent_type`. Only a recorded actual pre-start
208
227
  native role-selection rejection permits a fresh Codex child with the resolver
209
228
  target's explicit model, reasoning effort, and canonical role instructions
210
- from `.agents/agents/oat-reviewer.md`. A separately pre-selected CLI route is
211
- allowed only when native dispatch cannot express the complete target and no
212
- child has started. If another route cannot preserve the target, use only a
213
- verified-equivalent inline route or block the review.
229
+ from `${WORKFLOWS_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md`. A separately
230
+ pre-selected CLI route is allowed only when native dispatch cannot express
231
+ the complete target and no child has started. If another route cannot
232
+ preserve the target, use only a verified-equivalent inline route or block the
233
+ review.
214
234
  - Claude: require a non-empty `providers.claude.dispatchArgs.model` and put
215
235
  that exact value in the actual provider invocation as its `model` argument.
216
236
  - Cursor: require a non-empty `providers.cursor.dispatchArgs.variant` and
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-provide
3
- version: 1.5.1
3
+ version: 1.5.2
4
4
  description: Use when the user explicitly asks to review an OAT project — e.g. "review project", "review the project", "run project review", or confirms a previously offered review. Do NOT auto-invoke on completed work alone. Resolves a project review scope and offers before running.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -624,6 +624,26 @@ Build the "Review Scope" metadata for the reviewer:
624
624
 
625
625
  ### Step 6: Execute Review (3-Tier Capability Model)
626
626
 
627
+ **Canonical reviewer instructions:** Before a direct reviewer-definition read or
628
+ fresh-child fallback, resolve the workflows-owned role locally. Probe candidates
629
+ in this order: `${SKILL_DIR}/../..`, `${HOME}/.agents`, then
630
+ `<repo-root>/.agents`. The loaded candidate is valid only when the exact
631
+ unsuffixed `agents/oat-reviewer.md` is the same-scope canonical file or a
632
+ symlink whose realpath is exactly that canonical file. Treat a missing, broken,
633
+ escaping, copied, transformed, suffixed, or otherwise noncanonical candidate as
634
+ a miss and continue to the next candidate. Bind the first valid root to
635
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}`; never use ambient discovery.
636
+
637
+ If every candidate misses, name `oat-reviewer`, stop before launching the
638
+ fresh-child fallback, and report
639
+ `oat tools install workflows --scope <user|project>` or
640
+ `oat tools update --pack workflows --scope <user|project>` for the intended
641
+ scope. Canonical role instructions cannot change the immutable target,
642
+ provider, model, effort, or variant fields selected by the resolver. Native
643
+ dispatch with the exact resolver-selected role remains first. Only an explicit
644
+ pre-start native role-selection rejection before a reviewer starts unlocks a
645
+ fresh child that preserves those fields.
646
+
627
647
  **Step 6.0: Resolve the managed reviewer target**
628
648
 
629
649
  Before capability-tier selection, resolve the same reviewer contract used by
@@ -669,7 +689,8 @@ Build the actual provider invocation before reporting the target as enforced:
669
689
  explicit host rejection of that exact `agent_type` before any reviewer or
670
690
  child starts. Only after that pre-start rejection may the workflow launch a
671
691
  fresh Codex child with the resolver target's explicit model, reasoning
672
- effort, canonical role instructions from `.agents/agents/oat-reviewer.md`,
692
+ effort, canonical role instructions from
693
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md`,
673
694
  and the same Review Scope payload. If neither exact route is available, use
674
695
  only a verified-equivalent inline route or block the review.
675
696
  - Claude requires a non-empty `providers.claude.dispatchArgs.model`; the actual
@@ -912,7 +933,8 @@ If running inline (Tier 3), execute the review and write artifact.
912
933
  6. For final scope: explicitly disposition deferred Medium ledger items (fix now vs accept defer)
913
934
  7. Write artifact with file:line references and fix guidance
914
935
 
915
- **Review artifact template:** (see `.agents/agents/oat-reviewer.md` for full format)
936
+ **Review artifact template:** (see
937
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md` for full format)
916
938
 
917
939
  Shared ad-hoc companion reference (non-project mode): the `oat-review-provide`
918
940
  review artifact template. Independently probe each required `<name>/SKILL.md`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-provide-remote
3
- version: 1.1.0
3
+ version: 1.1.1
4
4
  description: Use when reviewing a GitHub PR opened on another machine for an active OAT project and posting findings back as a single PR review. Resolves the project from the PR diff, reads project artifacts for mode-aware review, and posts via gh api.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -116,7 +116,31 @@ Severity conventions:
116
116
  - `medium`: Meaningful but non-blocking quality/maintainability issue.
117
117
  - `minor`: Cosmetic/style/documentation issue.
118
118
 
119
- `file` and `line` are both set (inline finding) or both `null` (reviewer-level finding that lands in the top-level body). Checklist + severity model + the `StructuredFindings` schema source of truth: `.agents/agents/oat-reviewer.md` and `design.md` → Data Models → StructuredFindings.
119
+ Before reading the canonical reviewer definition or starting a fresh-child
120
+ fallback, resolve the workflows-owned role locally. Probe candidates in this
121
+ order: `${SKILL_DIR}/../..`, `${HOME}/.agents`, then `<repo-root>/.agents`.
122
+ The loaded candidate is valid only when the exact unsuffixed
123
+ `agents/oat-reviewer.md` is the same-scope canonical file or a symlink whose
124
+ realpath is exactly that canonical file. Treat a missing, broken, escaping,
125
+ copied, transformed, suffixed, or otherwise noncanonical candidate as a miss
126
+ and continue to the next candidate. Bind the first valid root to
127
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}`; never use ambient discovery.
128
+
129
+ If every candidate misses, name `oat-reviewer`, stop before starting the
130
+ fresh-child fallback, and report
131
+ `oat tools install workflows --scope <user|project>` or
132
+ `oat tools update --pack workflows --scope <user|project>` for the intended
133
+ scope. Canonical role instructions cannot change the immutable target,
134
+ provider, model, effort, or variant fields selected by the resolver. Native
135
+ dispatch with the exact resolver-selected role remains first. Only an explicit
136
+ pre-start native role-selection rejection before a reviewer starts unlocks a
137
+ fresh child that preserves those fields.
138
+
139
+ `file` and `line` are both set (inline finding) or both `null` (reviewer-level
140
+ finding that lands in the top-level body). Checklist + severity model + the
141
+ `StructuredFindings` schema source of truth:
142
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md` and `design.md` → Data
143
+ Models → StructuredFindings.
120
144
 
121
145
  ## Process
122
146
 
@@ -312,7 +336,10 @@ Detection:
312
336
 
313
337
  Build the dispatch payload and spawn the reviewer in structured-output mode. This mirrors the tested wrapper at `packages/cli/src/review-remote/reviewer-dispatch.ts` (`buildDispatchPayload` / `dispatchStructuredReview`):
314
338
 
315
- - Set `oat_output_mode: structured` in the dispatch payload (the flag `.agents/agents/oat-reviewer.md` recognizes). In this mode the reviewer returns a `StructuredFindings` object in-memory and writes NO artifact under `reviews/`.
339
+ - Set `oat_output_mode: structured` in the dispatch payload (the flag
340
+ `${WORKFLOWS_AGENT_PROVIDER_ROOT}/agents/oat-reviewer.md` recognizes). In
341
+ this mode the reviewer returns a `StructuredFindings` object in-memory and
342
+ writes NO artifact under `reviews/`.
316
343
  - Include the project context (`oat_project`, `oat_review_scope`, `oat_review_head_sha`), the Review Scope metadata block, a pointer to the posted-review-body schema (`design.md` → Data Models → Posted-review-body), and the resolved narrowing range (`<prior_sha>..<HEAD>` or none).
317
344
  - If a worktree was resolved in Step 2, include its path so the reviewer reads from the checkout.
318
345
  - For Cursor concrete managed dispatch, invoke
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-wave-execute
3
- version: 1.8.2
3
+ version: 1.9.0
4
4
  description: Use when executing a wave of external implementation plans as a wrapper OAT project — scaffolding, drift refresh, parallel worktree groups, briefs, gates, merge choreography, and closeout.
5
5
  argument-hint: '<wave-id> [plan-names...] (e.g. wave-2 http-listener-before-indexing ...)'
6
6
  disable-model-invocation: false
@@ -459,7 +459,8 @@ The mechanical caller constructs an `explainer-kit.run-request/v1` document whos
459
459
  required keys are exactly:
460
460
  `schemaVersion, recipe, slug, outputRoot, factBase, mode`. Set `recipe` to
461
461
  `{ "id": "program-recap", "version": "1" }`; this is an object with exactly
462
- `id` and `version`. Set `outputRoot` to `.oat/repo/explainers/<slug>/`. Bind the
462
+ `id` and `version`. Set `outputRoot` to
463
+ `.oat/repo/reference/explainers/<slug>/`. Bind the
463
464
  synthesized fact-base file through `factBase` with the required keys
464
465
  `mode, freshnessPolicy`, set `mode` to `"supplied"`, set `freshnessPolicy` to
465
466
  `"live-wins"`, and set `path` to that file.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-wave-program
3
- version: 1.4.0
3
+ version: 1.5.0
4
4
  description: Use when decomposing a corpus of external implementation plans into an ordered wave program — coverage inventory, dependency mapping, wave composition, and the durable execution-program artifact that oat-wave-execute consumes and updates.
5
5
  argument-hint: '[new|refresh|wave-close <wave-id>] (default: refresh against the current artifact)'
6
6
  disable-model-invocation: false
@@ -152,7 +152,8 @@ The mechanical caller constructs an `explainer-kit.run-request/v1` document whos
152
152
  required keys are exactly:
153
153
  `schemaVersion, recipe, slug, outputRoot, factBase, mode`. Set `recipe` to
154
154
  `{ "id": "program-recap", "version": "1" }`; this is an object with exactly
155
- `id` and `version`. Set `outputRoot` to `.oat/repo/explainers/<slug>/`. Bind the
155
+ `id` and `version`. Set `outputRoot` to
156
+ `.oat/repo/reference/explainers/<slug>/`. Bind the
156
157
  synthesized fact-base file through `factBase` with the required keys
157
158
  `mode, freshnessPolicy`, set `mode` to `"supplied"`, set `freshnessPolicy` to
158
159
  `"live-wins"`, and set `path` to that file.
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/commands/pjm/doctor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AA4LlE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CAiVxB"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/commands/pjm/doctor.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AA4MlE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CA2UxB"}
@@ -11,9 +11,25 @@ const ALLOWED_TOP_LEVEL_DIRECTORIES = new Set([
11
11
  'analysis',
12
12
  'reviews',
13
13
  ]);
14
- // A human-facing `README.md` at the repo-reference root is benign, so it is an
15
- // allowed top-level file alongside the canonical `AGENTS.md` (F5).
16
- const ALLOWED_TOP_LEVEL_FILES = new Set(['AGENTS.md', 'README.md']);
14
+ // Human/provider-facing companions to the canonical `AGENTS.md` are benign.
15
+ // Pointer correctness remains the responsibility of `oat instructions
16
+ // validate`; PJM doctor only classifies the repository layout.
17
+ const ALLOWED_TOP_LEVEL_FILES = new Set([
18
+ 'AGENTS.md',
19
+ 'CLAUDE.md',
20
+ 'README.md',
21
+ ]);
22
+ // `project-observations.md` is the documented append-only project-log ledger.
23
+ // The remaining names have dedicated migration/duplicate checks below, so the
24
+ // loose-reference classifier must not report them a second time.
25
+ const ALLOWED_REFERENCE_FILES = new Set([
26
+ 'AGENTS.md',
27
+ 'CLAUDE.md',
28
+ 'project-observations.md',
29
+ 'decision-record.md',
30
+ 'roadmap.md',
31
+ 'current-state.md',
32
+ ]);
17
33
  const LEGACY_MONOLITHS = ['reference/decision-record.md'];
18
34
  async function pathExists(path) {
19
35
  try {
@@ -265,10 +281,7 @@ export async function runPjmDoctorChecks(repoRoot, options = {}) {
265
281
  const referenceEntries = await listDirectoryNames(join(repoRoot, 'reference'));
266
282
  const looseReferenceFiles = referenceEntries
267
283
  .filter((name) => name.endsWith('.md'))
268
- .filter((name) => name !== 'AGENTS.md' &&
269
- name !== 'decision-record.md' &&
270
- name !== 'roadmap.md' &&
271
- name !== 'current-state.md')
284
+ .filter((name) => !ALLOWED_REFERENCE_FILES.has(name))
272
285
  .map((name) => `reference/${name}`);
273
286
  checks.push({
274
287
  name: 'pjm:loose_reference_files',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.2.46",
3
+ "version": "0.2.48",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.2.46"
37
+ "@open-agent-toolkit/control-plane": "0.2.48"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",