@open-agent-toolkit/cli 0.3.8 → 0.3.10
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 +3 -3
- package/assets/agents/oat-codebase-mapper.md +3 -2
- package/assets/agents/oat-reviewer.md +5 -13
- package/assets/agents/skeptical-evaluator.md +6 -2
- package/assets/bundle-metadata.json +1 -1
- package/assets/config/dispatch-matrix-recommendation.json +6 -6
- package/assets/docs/cli-utilities/backlog-lifecycle.md +3 -2
- package/assets/docs/cli-utilities/bootstrap.md +5 -2
- package/assets/docs/cli-utilities/config-and-local-state.md +13 -6
- package/assets/docs/cli-utilities/configuration.md +22 -17
- package/assets/docs/cli-utilities/tool-packs.md +60 -10
- package/assets/docs/cli-utilities/workflow-gates.md +1 -1
- package/assets/docs/contributing/code.md +9 -5
- package/assets/docs/contributing/updating-model-guidance.md +34 -6
- package/assets/docs/contributing/verifying-cursor-pins.md +38 -9
- package/assets/docs/provider-sync/commands.md +11 -8
- package/assets/docs/provider-sync/instruction-sync.md +241 -39
- package/assets/docs/provider-sync/providers.md +4 -4
- package/assets/docs/provider-sync/scope-and-surface.md +1 -1
- package/assets/docs/reference/cli-reference.md +2 -0
- package/assets/docs/reference/oat-directory-structure.md +12 -11
- package/assets/docs/reference/troubleshooting.md +19 -4
- package/assets/docs/workflows/projects/dispatch-ceiling.md +21 -14
- package/assets/docs/workflows/projects/implementation-execution.md +26 -9
- package/assets/docs/workflows/projects/lifecycle.md +4 -6
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-agent-instructions-analyze/SKILL.md +4 -4
- package/assets/skills/oat-agent-instructions-analyze/references/analysis-artifact-template.md +5 -5
- package/assets/skills/oat-agent-instructions-analyze/references/docs/rules-files.md +14 -11
- package/assets/skills/oat-agent-instructions-analyze/references/quality-checklist.md +2 -2
- package/assets/skills/oat-agent-instructions-analyze/scripts/resolve-instruction-files.sh +4 -3
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +3 -3
- package/assets/skills/oat-agent-instructions-apply/references/docs/rules-files.md +14 -11
- package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
- package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +5 -2
- package/assets/skills/oat-doctor/SKILL.md +17 -13
- package/assets/skills/oat-project-implement/SKILL.md +2 -2
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +33 -11
- package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +1 -1
- package/assets/skills/oat-project-implement/references/phase-execution.md +109 -8
- package/assets/skills/oat-project-lite/SKILL.md +23 -1
- package/assets/skills/oat-project-next/SKILL.md +3 -3
- package/assets/skills/oat-project-plan-writing/SKILL.md +3 -3
- package/assets/skills/oat-project-progress/SKILL.md +2 -2
- package/assets/skills/subagent-orchestration/SKILL.md +1 -1
- package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +20 -8
- package/assets/skills/subagent-orchestration/references/provider-claude.md +25 -12
- package/assets/skills/subagent-orchestration/references/provider-codex.md +27 -18
- package/assets/skills/subagent-orchestration/references/provider-cursor.md +40 -10
- package/assets/templates/docs-app-mkdocs/docs/contributing.md +1 -3
- package/assets/templates/pjm-agents.md +7 -3
- package/assets/templates/state.md +2 -2
- package/dist/commands/backlog/archive.d.ts +10 -2
- package/dist/commands/backlog/archive.d.ts.map +1 -1
- package/dist/commands/backlog/archive.js +22 -6
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +5 -1
- package/dist/commands/backlog/rewrite-references.d.ts +41 -0
- package/dist/commands/backlog/rewrite-references.d.ts.map +1 -0
- package/dist/commands/backlog/rewrite-references.js +516 -0
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +69 -34
- package/dist/commands/init/index.d.ts +6 -0
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +27 -4
- package/dist/commands/init/tools/index.d.ts +18 -1
- package/dist/commands/init/tools/index.d.ts.map +1 -1
- package/dist/commands/init/tools/index.js +84 -17
- package/dist/commands/init/tools/project-guidance.d.ts +19 -4
- package/dist/commands/init/tools/project-guidance.d.ts.map +1 -1
- package/dist/commands/init/tools/project-guidance.js +58 -15
- package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
- package/dist/commands/init/tools/workflows/index.js +5 -1
- package/dist/commands/instructions/instructions.types.d.ts +105 -4
- package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.types.js +4 -5
- package/dist/commands/instructions/instructions.utils.d.ts +161 -6
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +650 -12
- package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
- package/dist/commands/instructions/sync/sync.js +256 -18
- package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
- package/dist/commands/instructions/validate/validate.js +36 -8
- package/dist/commands/pjm/index.d.ts.map +1 -1
- package/dist/commands/pjm/index.js +19 -4
- package/dist/commands/pjm/init.d.ts +3 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +23 -5
- package/dist/commands/shared/agents-md.d.ts +26 -5
- package/dist/commands/shared/agents-md.d.ts.map +1 -1
- package/dist/commands/shared/agents-md.js +182 -3
- package/dist/commands/tools/guidance/index.d.ts +15 -0
- package/dist/commands/tools/guidance/index.d.ts.map +1 -0
- package/dist/commands/tools/guidance/index.js +81 -0
- package/dist/commands/tools/index.d.ts.map +1 -1
- package/dist/commands/tools/index.js +2 -0
- package/dist/config/oat-config.d.ts +49 -3
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +107 -14
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +12 -2
- package/dist/providers/claude/dispatch-envelope.d.ts.map +1 -1
- package/dist/providers/claude/dispatch-envelope.js +1 -0
- package/dist/providers/claude/targets.d.ts +1 -0
- package/dist/providers/claude/targets.d.ts.map +1 -1
- package/dist/providers/claude/targets.js +3 -1
- package/dist/providers/codex/codec/shared.d.ts +3 -0
- package/dist/providers/codex/codec/shared.d.ts.map +1 -1
- package/dist/providers/codex/codec/shared.js +4 -0
- package/dist/providers/cursor/codec/catalog.d.ts +2 -2
- package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
- package/dist/providers/cursor/codec/catalog.js +45 -0
- package/dist/providers/cursor/codec/mapping-validation.d.ts +4 -0
- package/dist/providers/cursor/codec/mapping-validation.d.ts.map +1 -0
- package/dist/providers/cursor/codec/mapping-validation.js +25 -0
- package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
- package/dist/providers/cursor/codec/materialize.js +2 -11
- package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
- package/dist/providers/cursor/codec/sync-extension.js +2 -11
- package/package.json +2 -2
|
@@ -26,7 +26,9 @@ they choose to adopt a newer recommendation.
|
|
|
26
26
|
|
|
27
27
|
A model can remain supported for a user's explicit configuration without being
|
|
28
28
|
recommended by the new ladder. For example, this refresh keeps GPT-5.6 Codex
|
|
29
|
-
and Cursor targets available while preferring GPT-6
|
|
29
|
+
and Cursor targets available while preferring GPT-6.1 Sol and GPT-6 Luna in
|
|
30
|
+
Codex. GPT-6 Sol remains supported for explicit compatibility configurations.
|
|
31
|
+
Claude Opus 4.8
|
|
30
32
|
and 5.0 have left current supported generations and recommendations; historical
|
|
31
33
|
probe records can still describe past behavior, clearly labeled as historical.
|
|
32
34
|
|
|
@@ -34,7 +36,11 @@ probe records can still describe past behavior, clearly labeled as historical.
|
|
|
34
36
|
|
|
35
37
|
Check the provider's official model documentation and the local runtime before
|
|
36
38
|
editing an ID or effort range. The [OpenAI model catalog](https://developers.openai.com/api/docs/models)
|
|
37
|
-
lists GPT-6 Astra, Sol, and Luna. The
|
|
39
|
+
lists GPT-6.1 Sol and GPT-6 Astra, Sol, and Luna. The
|
|
40
|
+
[GPT-6.1 Sol model page](https://developers.openai.com/api/docs/models/gpt-6.1-sol)
|
|
41
|
+
identifies `gpt-6.1-sol` and supports `low`, `medium`, `high`, `xhigh`, and
|
|
42
|
+
`max`; `none` and `minimal` are not supported efforts for this family. Direct
|
|
43
|
+
API tool calls require the Responses API. The
|
|
38
44
|
[Astra model page](https://developers.openai.com/api/docs/models/gpt-6-astra)
|
|
39
45
|
names `gpt-6-astra` and documents `low`, `medium`, `high`, `xhigh`, and `max`;
|
|
40
46
|
compare it with the installed Codex runtime model cache for the exact names and
|
|
@@ -42,7 +48,11 @@ local effort set. Catalog presence establishes support, not relative task
|
|
|
42
48
|
quality. The
|
|
43
49
|
[Anthropic Opus 5.5 documentation](https://www.anthropic.com/claude-opus-5-5)
|
|
44
50
|
names `claude-opus-5-5`; confirm a Claude Code invocation reports that exact
|
|
45
|
-
assistant model before admitting it to the Claude catalog.
|
|
51
|
+
assistant model before admitting it to the Claude catalog. The
|
|
52
|
+
[Sonnet 5.5 overview](https://platform.claude.com/docs/en/models/sonnet-5-5/overview)
|
|
53
|
+
and [effort reference](https://platform.claude.com/docs/en/build-with-claude/effort)
|
|
54
|
+
identify `claude-sonnet-5-5` and its five low-through-max efforts. Verify
|
|
55
|
+
Claude Code identity separately. Claude subagent
|
|
46
56
|
`model` and `effort` frontmatter select a per-agent route; see the
|
|
47
57
|
[Claude Code subagent fields](https://code.claude.com/docs/en/sub-agents).
|
|
48
58
|
An API model announcement alone does not prove a third-party harness supports
|
|
@@ -66,14 +76,32 @@ The positive Sonnet control resolved, while invalid family and effort controls
|
|
|
66
76
|
fell back to defaults. Five Opus 5.5 mappings are now approved for desktop
|
|
67
77
|
subagents; the CLI result alone does not establish that the same bracket syntax
|
|
68
78
|
works as a CLI top-level `--model` argument. Likewise, do not add GPT-6
|
|
69
|
-
Cursor targets until that runtime lists and verifies them.
|
|
79
|
+
or GPT-6.1 Cursor targets until that runtime lists and verifies them.
|
|
70
80
|
|
|
71
81
|
A 2026-09-25 desktop 3.21.18 probe added Grok 4.6 and Fable 5.1 mappings
|
|
72
82
|
and moved the bundled Cursor ladder to them. The same probe showed Grok 4.7
|
|
73
|
-
resolves only bare flat IDs, never bracket selectors
|
|
74
|
-
|
|
83
|
+
resolves only bare flat IDs, never bracket selectors. It still needs its own
|
|
84
|
+
approved registry entry and complete per-pin evidence before admission; see [Verifying Cursor Pins](verifying-cursor-pins.md). See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
|
|
75
85
|
for the distinction between catalog, configured mapping, and runtime identity.
|
|
76
86
|
|
|
87
|
+
The October 1 refresh migrates Codex Sol defaults and examples to
|
|
88
|
+
`gpt-6.1-sol` while preserving existing effort choices, including medium for
|
|
89
|
+
intelligent recon. Claude Economy moves to `claude-sonnet-5-5` medium by user
|
|
90
|
+
direction. GPT-6 Sol and Sonnet 5 remain explicitly supported. Cursor lists
|
|
91
|
+
Sonnet 5.5 flat IDs at low through max. Cursor 3.22.12 native probes matched
|
|
92
|
+
those exact IDs at start, Shell execution, and stop while every Sonnet 5.5
|
|
93
|
+
bracket pin fell back to the account default. The existing Opus low control
|
|
94
|
+
matched; unknown-family and Sonnet `ultra` exact-ID controls fell back. The
|
|
95
|
+
fixture summary and event records at
|
|
96
|
+
`packages/cli/src/providers/cursor/codec/__fixtures__/cursor-pin-probe-2026-10-01{,-events}.jsonl`
|
|
97
|
+
retain both rounds. Ship explicit, evidence-backed exact-ID mappings for that family;
|
|
98
|
+
keep existing bracket mappings. An exact-ID mapping requires the same per-pin
|
|
99
|
+
native evidence and controls as a bracket mapping. Do not enable generic
|
|
100
|
+
pass-through of CLI IDs. Cursor does not list GPT-6 Sol or
|
|
101
|
+
GPT-6.1 Sol in the observed catalog. Do not carry Codex model IDs into Cursor
|
|
102
|
+
configurations. These selector changes do not import a separate vault policy
|
|
103
|
+
refresh or claim newly measured task-performance gains.
|
|
104
|
+
|
|
77
105
|
## Change and Validate
|
|
78
106
|
|
|
79
107
|
1. Update the supported catalog for each verified runtime and its tests. Preserve
|
|
@@ -7,7 +7,8 @@ description: 'Runbook for probe-verifying a Cursor model pin before shipping it:
|
|
|
7
7
|
|
|
8
8
|
A Cursor model pin maps an OAT ladder model ID to the frontmatter selector that
|
|
9
9
|
materialized role files carry, for example `gpt-5.6-sol-medium` to
|
|
10
|
-
`gpt-5.6-sol[reasoning=medium]
|
|
10
|
+
`gpt-5.6-sol[reasoning=medium]`, or the verified exact ID
|
|
11
|
+
`claude-sonnet-5-5-medium`. Adding one to
|
|
11
12
|
`packages/cli/src/providers/cursor/codec/catalog.ts` requires evidence that
|
|
12
13
|
Cursor actually resolves that selector to the intended model.
|
|
13
14
|
|
|
@@ -81,10 +82,22 @@ flat IDs such as `grok-4.7-medium` resolved exactly. Two lessons follow:
|
|
|
81
82
|
control and probe non-default rungs. Here even `effort=low,fast=false`
|
|
82
83
|
landed on the high-fast default.
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
directory.
|
|
85
|
+
The 2026-10-01 revision of `DR-260718-explicit-cursor-pin-mapping` permits
|
|
86
|
+
verified exact-ID entries as well as bracket selectors. Grok 4.7 remains
|
|
87
|
+
outside the shipped catalog until its own entry is added and approved. The
|
|
88
|
+
redacted evidence is in the same fixtures directory.
|
|
89
|
+
|
|
90
|
+
The 2026-10-01 Sonnet 5.5 probe on Cursor 3.22.12 confirmed the same syntax
|
|
91
|
+
distinction: every `claude-sonnet-5-5[effort=...]` selector fell back to
|
|
92
|
+
`grok-4.7-high-fast`, but all five exact IDs
|
|
93
|
+
`claude-sonnet-5-5-low|medium|high|xhigh|max` resolved correctly. Both rounds
|
|
94
|
+
included a working Opus 5.5 low control and unknown-family and unsupported-effort
|
|
95
|
+
controls that fell back. The summary and 64 correlated native events are
|
|
96
|
+
retained beside the earlier fixtures.
|
|
97
|
+
|
|
98
|
+
[Cursor documents specific model IDs and bracket parameters](https://cursor.com/docs/subagents#model-configuration).
|
|
99
|
+
Choose a candidate from the live catalog, then probe its exact frontmatter
|
|
100
|
+
spelling. Documentation and catalog presence do not replace native evidence.
|
|
88
101
|
|
|
89
102
|
## Prerequisites
|
|
90
103
|
|
|
@@ -272,10 +285,19 @@ approved it:
|
|
|
272
285
|
|
|
273
286
|
```ts
|
|
274
287
|
approvedMapping(
|
|
275
|
-
'
|
|
276
|
-
'
|
|
277
|
-
'
|
|
278
|
-
{
|
|
288
|
+
'claude-sonnet-5-5-medium',
|
|
289
|
+
'claude-sonnet-5-5-medium',
|
|
290
|
+
'explicit-model-id',
|
|
291
|
+
{
|
|
292
|
+
probeName: 'zz-pin-probe-sonnet55-flat-medium',
|
|
293
|
+
probeRecord: {
|
|
294
|
+
submittedSelector: 'claude-sonnet-5-5-medium',
|
|
295
|
+
resolvedModel: 'claude-sonnet-5-5-medium',
|
|
296
|
+
verifiedAt: '2026-10-01',
|
|
297
|
+
evidencePath:
|
|
298
|
+
'packages/cli/src/providers/cursor/codec/__fixtures__/cursor-pin-probe-2026-10-01.jsonl',
|
|
299
|
+
},
|
|
300
|
+
},
|
|
279
301
|
),
|
|
280
302
|
```
|
|
281
303
|
|
|
@@ -287,6 +309,13 @@ than inheriting an approval that never covered the new selector.
|
|
|
287
309
|
Retain the raw payloads alongside the summary. They are the primary evidence;
|
|
288
310
|
the summary is an interpretation of them.
|
|
289
311
|
|
|
312
|
+
For an exact-ID mapping, use the `explicit-model-id` syntax family and a
|
|
313
|
+
mapping-specific probe record. The frontmatter selector must equal the ladder
|
|
314
|
+
ID, and the independently captured submitted selector and resolved model must
|
|
315
|
+
agree with both. Missing or mismatched evidence must fail materialization;
|
|
316
|
+
there is no generic model-ID pass-through. Preserve rejected selector results
|
|
317
|
+
and control observations alongside the successful rungs.
|
|
318
|
+
|
|
290
319
|
## Cleanup
|
|
291
320
|
|
|
292
321
|
Delete every temporary artifact:
|
|
@@ -213,10 +213,11 @@ Purpose:
|
|
|
213
213
|
Key behavior:
|
|
214
214
|
|
|
215
215
|
- Read-only validation of nested project-scoped instruction directories
|
|
216
|
-
-
|
|
217
|
-
- Reports `ok`, `missing
|
|
216
|
+
- Validates the effective strategy: `--strategy none|pointer|symlink|copy`, else `instructions.claude.shims`, else `none` (the default, which expects no `CLAUDE.md`); reports it as `strategy` under `--json`
|
|
217
|
+
- Reports `ok`, `missing` (shim strategies only), `content_mismatch`, `stray`, and, under `none`, `managed_shim` (drift sync removes) and `unmanaged` (kept, not drift)
|
|
218
218
|
- Detects Claude-only adoptable directories and unreadable/broken instruction paths as drift
|
|
219
|
-
-
|
|
219
|
+
- Under `none`, warns about every remaining `CLAUDE.md`, `.claude/CLAUDE.md`, and `CLAUDE.local.md` (stderr, or the `warnings` array under `--json`) without changing the exit code
|
|
220
|
+
- Skips the derived documentation content root and any `instructions.claude.excludes` paths, using the same exclusions as `oat instructions sync`
|
|
220
221
|
- Exit code `0` when all entries are valid, `1` when drift is detected
|
|
221
222
|
- Detailed behavior: [`Instruction Sync`](instruction-sync.md)
|
|
222
223
|
|
|
@@ -229,12 +230,14 @@ Purpose:
|
|
|
229
230
|
Key behavior:
|
|
230
231
|
|
|
231
232
|
- Mutates by default; use `--dry-run` to preview changes
|
|
232
|
-
- Supports `--strategy pointer|symlink|copy`
|
|
233
|
-
-
|
|
234
|
-
-
|
|
235
|
-
-
|
|
233
|
+
- Supports `--strategy none|pointer|symlink|copy` as a one-run override of `instructions.claude.shims` (default `none`)
|
|
234
|
+
- Under `none`, removes the `CLAUDE.md` shims OAT created (exact `@AGENTS.md` pointer, symlink to the sibling `AGENTS.md`, or byte-identical copy), re-verifying each immediately before deletion; hand-written or modified `CLAUDE.md` files are reported, never deleted, and while any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` has content of its own, nothing is removed (`claude_md_blocks_shim_removal`)
|
|
235
|
+
- Under a shim strategy, creates missing `CLAUDE.md` files using that strategy
|
|
236
|
+
- Adopts Claude-only stray files by writing canonical `AGENTS.md` content first, then regenerating `CLAUDE.md` (shim strategies) or removing it (`none`)
|
|
237
|
+
- Under a shim strategy, skips mismatched files unless `--force` is provided
|
|
236
238
|
- Skips unreadable canonical or Claude-only sources and reports manual-repair guidance instead of forcing recovery
|
|
237
|
-
- Skips the documentation content tree (`<documentation.root>/docs` when that is a directory, otherwise `documentation.root`) plus any `
|
|
239
|
+
- Skips the documentation content tree (`<documentation.root>/docs` when that is a directory, otherwise `documentation.root`) plus any `instructions.claude.excludes` paths, so authored pages never receive pointers; app-level instruction files such as `apps/oat-docs/AGENTS.md` are still synced
|
|
238
240
|
- Never deletes an existing `CLAUDE.md` inside an excluded tree
|
|
241
|
+
- Under `none`, warns about every `CLAUDE.md` that remains after sync, including inside excluded trees, because any one of them makes Claude Code ignore every `AGENTS.md`
|
|
239
242
|
- Uses pointer content `@AGENTS.md\n`, file symlinks, or hard copies depending on the selected strategy
|
|
240
243
|
- Detailed behavior and examples: [`Instruction Sync`](instruction-sync.md)
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Instruction Sync
|
|
3
|
-
description: Project-scoped AGENTS.md and CLAUDE.md validation,
|
|
3
|
+
description: Project-scoped AGENTS.md and CLAUDE.md validation, the no-shim default, opt-in shim strategies, and Claude-only adoption.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Instruction Sync
|
|
7
7
|
|
|
8
|
-
`oat instructions ...` is the project-scoped lane for keeping canonical `AGENTS.md` files
|
|
8
|
+
`oat instructions ...` is the project-scoped lane for keeping canonical `AGENTS.md` files and any sibling `CLAUDE.md` files consistent throughout a repository tree.
|
|
9
|
+
|
|
10
|
+
By default OAT keeps **no** `CLAUDE.md` shims: Claude Code reads `AGENTS.md` itself (see [Claude Code and AGENTS.md](#claude-code-and-agentsmd)). A repository opts back into shims with `instructions.claude.shims`.
|
|
9
11
|
|
|
10
12
|
Use it when you want OAT to:
|
|
11
13
|
|
|
12
|
-
- validate nested `AGENTS.md`
|
|
13
|
-
-
|
|
14
|
+
- validate nested `AGENTS.md` files, and their `CLAUDE.md` shims when a shim strategy is configured
|
|
15
|
+
- remove the `CLAUDE.md` shims OAT created, under the default, once no `CLAUDE.md` with its own content remains, and warn about any `CLAUDE.md` that would hide `AGENTS.md` from Claude Code
|
|
16
|
+
- create or repair `CLAUDE.md` shims with a chosen strategy, when you opt in
|
|
14
17
|
- adopt Claude-only directories back into canonical `AGENTS.md`
|
|
15
18
|
|
|
16
|
-
This command group is intentionally separate from manifest-backed provider sync. It operates on repo-local instruction files, not provider view manifests.
|
|
19
|
+
This command group is intentionally separate from manifest-backed provider sync. It operates on repo-local instruction files, not provider view manifests. The shim setting affects only `oat instructions`: `oat sync` writes the same rules (including `.claude/rules`), skills, and agents under every strategy and never creates or removes a `CLAUDE.md`, and `oat instructions sync` leaves synced `.claude/rules` files alone.
|
|
17
20
|
|
|
18
21
|
## Scope
|
|
19
22
|
|
|
@@ -22,8 +25,9 @@ Instruction sync is currently project-only.
|
|
|
22
25
|
- It scans the current repository recursively.
|
|
23
26
|
- It supports nested directories all the way down the tree.
|
|
24
27
|
- It skips provider-irrelevant or local-only roots such as `.git`, `.oat`, `.worktrees`, and `node_modules`.
|
|
25
|
-
-
|
|
26
|
-
-
|
|
28
|
+
- It stops at nested git checkouts: any directory below the root that holds its own `.git` (a directory, or the gitdir file of a submodule or linked worktree such as `.claude/worktrees/<name>`) is a separate repository that its own `oat instructions` run owns. Nothing inside it is scanned, removed, or warned about.
|
|
29
|
+
- Exception: `.oat/repo/**` is scanned even though the rest of `.oat/` is skipped, so the curated `AGENTS.md` files there (repo root guidance, `pjm/`, `reference/`) are managed and validated like any other directory. The rest of `.oat/` (`templates/`, `projects/`, `sync/`) stays excluded.
|
|
30
|
+
- It skips the documentation content tree by default, and any path you add to `instructions.claude.excludes`. See [Documentation trees](#documentation-trees) below.
|
|
27
31
|
- It does not scan user-level provider roots such as `~/.claude` in this release.
|
|
28
32
|
|
|
29
33
|
## Documentation Trees
|
|
@@ -49,20 +53,25 @@ only; it does not change what instruction sync excludes.)
|
|
|
49
53
|
canonically names the docs _app_ root, and a file like
|
|
50
54
|
`apps/oat-docs/AGENTS.md` is instructions for working on the docs app rather
|
|
51
55
|
than a documentation page. When the app root has a `docs` child, only that
|
|
52
|
-
child is skipped, and the app root
|
|
53
|
-
the app root out explicitly if
|
|
56
|
+
child is skipped, and the app root is still synced (under a shim strategy it
|
|
57
|
+
keeps receiving its `CLAUDE.md` pointer). Opt the app root out explicitly if
|
|
58
|
+
you do not want it synced.
|
|
54
59
|
|
|
55
|
-
Add further paths with `
|
|
60
|
+
Add further paths with `instructions.claude.excludes`, a list of
|
|
56
61
|
repository-relative directories. Set it with
|
|
57
|
-
`oat config set
|
|
62
|
+
`oat config set instructions.claude.excludes "vendor,third_party/docs"`
|
|
58
63
|
(an empty value clears it, and `oat config unset` removes it), or write it
|
|
59
64
|
directly:
|
|
60
65
|
|
|
61
66
|
```json
|
|
62
67
|
{
|
|
63
68
|
"documentation": {
|
|
64
|
-
"root": "apps/oat-docs"
|
|
65
|
-
|
|
69
|
+
"root": "apps/oat-docs"
|
|
70
|
+
},
|
|
71
|
+
"instructions": {
|
|
72
|
+
"claude": {
|
|
73
|
+
"excludes": ["vendor", "third_party/docs"]
|
|
74
|
+
}
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
77
|
```
|
|
@@ -115,8 +124,11 @@ leaves the content root underived, and no default exclusion applies).
|
|
|
115
124
|
|
|
116
125
|
Exclusion only stops a directory from being scanned. Nothing is deleted: a
|
|
117
126
|
`CLAUDE.md` that already exists inside an excluded tree is left exactly as it
|
|
118
|
-
is
|
|
119
|
-
|
|
127
|
+
is, even under the default `none` strategy, which removes managed shims
|
|
128
|
+
everywhere else. Exclusion does not silence the
|
|
129
|
+
[leftover `CLAUDE.md` warning](#leftover-claudemd-warnings), because Claude
|
|
130
|
+
Code does not honor OAT's exclusions. When any exclusion is configured,
|
|
131
|
+
`--json` output carries three additional fields.
|
|
120
132
|
|
|
121
133
|
- `excludedPaths` lists the configured exclusions — a statement of intent, not
|
|
122
134
|
a per-directory skip log, so `.oat` appearing there does not contradict
|
|
@@ -135,8 +147,8 @@ dropped before `excludedPaths` is built, so it appears only here.
|
|
|
135
147
|
## Canonical Model
|
|
136
148
|
|
|
137
149
|
- `AGENTS.md` is canonical.
|
|
138
|
-
- `CLAUDE.md` is derived from the sibling `AGENTS.md
|
|
139
|
-
- If a directory contains only `CLAUDE.md`, OAT can adopt that file by writing canonical `AGENTS.md` content first
|
|
150
|
+
- A `CLAUDE.md` beside it is either absent (the default, strategy `none`) or a shim derived from the sibling `AGENTS.md` (strategies `pointer`, `symlink`, and `copy`).
|
|
151
|
+
- If a directory contains only `CLAUDE.md`, OAT can adopt that file by writing canonical `AGENTS.md` content first. Under a shim strategy it then regenerates `CLAUDE.md`; under `none` it removes it.
|
|
140
152
|
|
|
141
153
|
## Commands
|
|
142
154
|
|
|
@@ -146,40 +158,177 @@ Read-only validation for instruction integrity.
|
|
|
146
158
|
|
|
147
159
|
- Resolves the project root automatically.
|
|
148
160
|
- Scans nested directories for instruction pairs and Claude-only strays.
|
|
149
|
-
- Returns exit code `0` when everything is valid and `1` when drift is detected.
|
|
150
|
-
- Suggests the matching repair command, including `--strategy` when you validated with
|
|
161
|
+
- Returns exit code `0` when everything is valid and `1` when drift is detected. Leftover-`CLAUDE.md` warnings never change the exit code.
|
|
162
|
+
- Suggests the matching repair command, including `--strategy` when you validated with an explicit `--strategy`.
|
|
151
163
|
|
|
152
164
|
### `oat instructions sync`
|
|
153
165
|
|
|
154
166
|
Repair and adoption command for instruction drift.
|
|
155
167
|
|
|
156
168
|
- Mutates by default.
|
|
157
|
-
- Use `--dry-run` to preview planned actions.
|
|
158
|
-
-
|
|
159
|
-
-
|
|
169
|
+
- Use `--dry-run` to preview planned actions, including every planned removal.
|
|
170
|
+
- Under a shim strategy, use `--force` to overwrite mismatched `CLAUDE.md` files. Under `none`, `--force` has no effect: sync never deletes anything that is not an exact managed shim.
|
|
171
|
+
- Applies the effective strategy when creating, repairing, or removing `CLAUDE.md`.
|
|
160
172
|
|
|
161
|
-
|
|
173
|
+
Both commands report the effective strategy as `strategy:` in human output and as the `strategy` field under `--json`.
|
|
162
174
|
|
|
163
|
-
|
|
175
|
+
## Supported Strategies
|
|
164
176
|
|
|
165
|
-
| Strategy | Expected `CLAUDE.md` shape | Notes
|
|
166
|
-
| --------- | -------------------------------- |
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
| `
|
|
177
|
+
| Strategy | Expected `CLAUDE.md` shape | Notes |
|
|
178
|
+
| --------- | -------------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
179
|
+
| `none` | no `CLAUDE.md` | Default. Sync removes the shims OAT created (all or nothing) and warns about any other `CLAUDE.md`. |
|
|
180
|
+
| `pointer` | file content `@AGENTS.md` | Lightweight and explicit. The default before shims became opt-in. |
|
|
181
|
+
| `symlink` | file symlink to `AGENTS.md` | Uses a same-directory relative symlink. |
|
|
182
|
+
| `copy` | hard copy of `AGENTS.md` content | Useful when symlinks are undesirable. |
|
|
170
183
|
|
|
171
184
|
Validation treats the selected file shape as part of correctness. For example, `copy` mode rejects a symlink even if the symlink resolves to identical content.
|
|
172
185
|
|
|
186
|
+
### Choosing a strategy
|
|
187
|
+
|
|
188
|
+
The effective strategy for a run is resolved in this order:
|
|
189
|
+
|
|
190
|
+
1. the `--strategy` flag, which overrides for that one run and never changes config;
|
|
191
|
+
2. `instructions.claude.shims` in `.oat/config.json`;
|
|
192
|
+
3. the built-in default, `none`.
|
|
193
|
+
|
|
194
|
+
Persist a shim strategy for the repository with:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
oat config set instructions.claude.shims pointer
|
|
198
|
+
oat instructions sync
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`oat config unset instructions.claude.shims` returns to the default. A value outside `none`, `pointer`, `symlink`, and `copy` is rejected with exit code `2` instead of silently falling back to the default, and `oat config set` can still repair it.
|
|
202
|
+
|
|
173
203
|
## Reported States
|
|
174
204
|
|
|
175
205
|
`oat instructions validate` and `oat instructions sync --dry-run` work from the same scan model.
|
|
176
206
|
|
|
177
|
-
| State | Meaning
|
|
178
|
-
| ------------------ |
|
|
179
|
-
| `ok` | The
|
|
180
|
-
| `missing` | `AGENTS.md` exists but sibling `CLAUDE.md` is missing.
|
|
181
|
-
| `content_mismatch` | `CLAUDE.md` exists but has the wrong shape/content, or an instruction file is unreadable/broken.
|
|
182
|
-
| `stray` | `CLAUDE.md` exists without sibling `AGENTS.md` and the Claude file is readable enough to adopt.
|
|
207
|
+
| State | Meaning |
|
|
208
|
+
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
209
|
+
| `ok` | The directory matches the effective strategy (under `none`: no `CLAUDE.md` beside `AGENTS.md`). |
|
|
210
|
+
| `missing` | Shim strategies only: `AGENTS.md` exists but sibling `CLAUDE.md` is missing. Under `none` a missing `CLAUDE.md` is correct, never drift. |
|
|
211
|
+
| `content_mismatch` | `CLAUDE.md` exists but has the wrong shape/content, or an instruction file is unreadable/broken. |
|
|
212
|
+
| `stray` | `CLAUDE.md` exists without sibling `AGENTS.md` and the Claude file is readable enough to adopt. |
|
|
213
|
+
| `managed_shim` | `none` only: a `CLAUDE.md` in an exact shape OAT writes. Drift; sync removes it unless [a `CLAUDE.md` with content blocks removal](#all-or-nothing). |
|
|
214
|
+
| `unmanaged` | `none` only: a `CLAUDE.md` that is not an exact managed shape (hand-written, modified, or a symlink elsewhere). Reported and kept, never deleted, and not drift. |
|
|
215
|
+
|
|
216
|
+
## Removing OAT-Managed Shims
|
|
217
|
+
|
|
218
|
+
Under `none`, a non-dry-run sync removes the `CLAUDE.md` files OAT created, so
|
|
219
|
+
the repository never sits with shims in some directories and not others (see
|
|
220
|
+
[Claude Code and AGENTS.md](#claude-code-and-agentsmd) for why that state is
|
|
221
|
+
worse than either extreme). `--dry-run` lists each planned `remove` action and
|
|
222
|
+
changes nothing.
|
|
223
|
+
|
|
224
|
+
Removal is deliberately narrow. It only ever targets a file named `CLAUDE.md`
|
|
225
|
+
whose sibling is `AGENTS.md`, inside the tree the scan walks, in one of these
|
|
226
|
+
exact shapes:
|
|
227
|
+
|
|
228
|
+
- the pointer `@AGENTS.md` followed by a newline (LF or CRLF), and nothing else;
|
|
229
|
+
- a symlink whose target names the sibling `AGENTS.md`;
|
|
230
|
+
- a byte-identical copy of the sibling `AGENTS.md`.
|
|
231
|
+
|
|
232
|
+
Everything else is kept and reported as `unmanaged`: a hand-written or edited
|
|
233
|
+
`CLAUDE.md`, a pointer with extra lines or trailing spaces, a symlink to any
|
|
234
|
+
other file, `.claude/CLAUDE.md`, and any `CLAUDE.md` that a scanned instruction
|
|
235
|
+
file in another directory links to (`pkg/AGENTS.md -> ../CLAUDE.md`), which
|
|
236
|
+
is neither removed nor adopted because that would leave the link dangling; the
|
|
237
|
+
entry names the links. A `CLAUDE.md` that the sibling
|
|
238
|
+
`AGENTS.md` resolves to (the Claude-first `ln -s CLAUDE.md AGENTS.md` layout,
|
|
239
|
+
or a hard link) holds the only copy of the instructions, so it is never
|
|
240
|
+
treated as a shim of any shape; and a copy is only ever recognized against a
|
|
241
|
+
distinct regular `AGENTS.md`. `CLAUDE.local.md` is never touched and never
|
|
242
|
+
scanned as a shim; it is reported only through the
|
|
243
|
+
[leftover warning](#leftover-claudemd-warnings). A `CLAUDE.md` inside the
|
|
244
|
+
documentation content tree, an excluded directory, or a nested git checkout is
|
|
245
|
+
never touched.
|
|
246
|
+
|
|
247
|
+
### All or nothing
|
|
248
|
+
|
|
249
|
+
A file with content never leaves a mix behind. If any `CLAUDE.md`,
|
|
250
|
+
`.claude/CLAUDE.md`, or `CLAUDE.local.md` in the repository is not one of the
|
|
251
|
+
exact shapes above — it has content of its own — sync removes **nothing**, not
|
|
252
|
+
even the managed shims.
|
|
253
|
+
A partial removal would strand directories: while that file exists, Claude
|
|
254
|
+
Code ignores `AGENTS.md` for the sessions it covers, and the removed shims were
|
|
255
|
+
what carried those directories' instructions. The check covers the whole
|
|
256
|
+
repository, including excluded and documentation trees, because Claude Code's
|
|
257
|
+
walk does not honor OAT's exclusions. A lone `CLAUDE.md` that sync will adopt
|
|
258
|
+
(no sibling `AGENTS.md`) is not counted: its content moves into a new
|
|
259
|
+
`AGENTS.md`. While another file blocks removal, that stray is still adopted
|
|
260
|
+
into `AGENTS.md`, but its `CLAUDE.md` is kept.
|
|
261
|
+
|
|
262
|
+
Exact shims do not block. An exact shim inside an `instructions.claude.excludes`
|
|
263
|
+
directory or the documentation content tree is never touched, so sync removes
|
|
264
|
+
the other shims and reports that one as a
|
|
265
|
+
[leftover](#leftover-claudemd-warnings); sessions started in its directory
|
|
266
|
+
still ignore `AGENTS.md` until you remove it.
|
|
267
|
+
|
|
268
|
+
When removal is blocked, sync reports every removal it held back as a skipped
|
|
269
|
+
action and exits `1`, and sync, `oat instructions validate`, and `oat-doctor`
|
|
270
|
+
report one finding (`code: "claude_md_blocks_shim_removal"` under `--json`,
|
|
271
|
+
with `paths` naming the files with content, `wouldRemove` naming the
|
|
272
|
+
`CLAUDE.md` files kept, and `linkedBy` mapping each file in `paths` to the
|
|
273
|
+
`AGENTS.md` links that reach it). The finding names the `CLAUDE.md` files the
|
|
274
|
+
configuration would remove, says none were removed and why, links to
|
|
275
|
+
[Claude Code and AGENTS.md](#claude-code-and-agentsmd), and names what to do
|
|
276
|
+
next:
|
|
277
|
+
|
|
278
|
+
- remove each named file, or move its content into an `AGENTS.md`, and rerun
|
|
279
|
+
`oat instructions sync`; for a file an `AGENTS.md` links to (the Claude-first
|
|
280
|
+
layout), replace each link with the file's content first, then remove the
|
|
281
|
+
file, because it holds the only copy of those instructions; or
|
|
282
|
+
- set `instructions.claude.shims` to a shim strategy (`pointer`, `symlink`, or
|
|
283
|
+
`copy`) to keep `CLAUDE.md` files.
|
|
284
|
+
|
|
285
|
+
While removal is blocked, the files in `wouldRemove` get no
|
|
286
|
+
[leftover warning](#leftover-claudemd-warnings) of their own: the finding
|
|
287
|
+
already names them, and removing one by hand would recreate the mix.
|
|
288
|
+
|
|
289
|
+
Removal also fails closed at apply time. Immediately before deleting, sync
|
|
290
|
+
re-checks the file: it must still be the same file the scan saw (same device
|
|
291
|
+
and inode, and the same symlink target), still an exact managed shape, and not
|
|
292
|
+
the target of a link from any scanned instruction file. If it was edited or
|
|
293
|
+
replaced, or a link to it appeared, in between, it is kept, byte for byte, and reported
|
|
294
|
+
as `CLAUDE.md changed since planning (...); kept`, and the command exits `1`
|
|
295
|
+
so you can rerun it.
|
|
296
|
+
|
|
297
|
+
## Leftover `CLAUDE.md` Warnings
|
|
298
|
+
|
|
299
|
+
Under `none`, after sync (and on every `validate`) OAT reports each remaining
|
|
300
|
+
`CLAUDE.md`, `.claude/CLAUDE.md`, and `CLAUDE.local.md` anywhere in the
|
|
301
|
+
repository with a warning: while that file exists, Claude Code's default
|
|
302
|
+
`agents-md` mode ignores every `AGENTS.md` in the project. For a file at the
|
|
303
|
+
root (including `.claude/CLAUDE.md` and `CLAUDE.local.md` there) that holds for
|
|
304
|
+
every session; for a file in a subdirectory it holds for sessions started in
|
|
305
|
+
that directory or below, and the warning says so. The warning names exactly
|
|
306
|
+
two ways out:
|
|
307
|
+
|
|
308
|
+
- remove the file — or, when an `AGENTS.md` links to it (the warning's
|
|
309
|
+
`linkedBy`), first replace each linking `AGENTS.md` with the file's content,
|
|
310
|
+
because the file holds the only copy of those instructions; or
|
|
311
|
+
- set `instructions.claude.shims` in `.oat/config.json` to a shim
|
|
312
|
+
strategy (`pointer`, `symlink`, or `copy`) and rerun `oat instructions sync`
|
|
313
|
+
to add shims back everywhere.
|
|
314
|
+
|
|
315
|
+
This check is a separate, read-only walk of the whole repository. It
|
|
316
|
+
deliberately ignores `documentation.root` and
|
|
317
|
+
`instructions.claude.excludes`, which only limit what OAT may
|
|
318
|
+
change, because Claude Code's own walk does not honor them. Only `.git`,
|
|
319
|
+
`node_modules`, the root `.worktrees`, and nested git checkouts are skipped.
|
|
320
|
+
|
|
321
|
+
Warnings go to stderr in human mode and to the `warnings` array under `--json`
|
|
322
|
+
(each item has `code: "claude_md_hides_agents_md"`, a repository-relative
|
|
323
|
+
`path`, `linkedBy` — the repository-relative `AGENTS.md` paths whose symlink
|
|
324
|
+
chain reaches the file, empty when there are none — and the `message`).
|
|
325
|
+
Names are matched exactly: a case variant such as `claude.md` is neither
|
|
326
|
+
reported nor ever removed, because such names are common for ordinary
|
|
327
|
+
documents (a provider page named `claude.md`, for example). On a
|
|
328
|
+
case-insensitive filesystem, rename a case-variant file yourself if Claude Code
|
|
329
|
+
treats it as `CLAUDE.md`. They never change the exit code, a dry run leaves
|
|
330
|
+
out files it is about to remove, a repository with no remaining `CLAUDE.md`
|
|
331
|
+
prints nothing, and no warning is emitted under a shim strategy.
|
|
183
332
|
|
|
184
333
|
## Claude-Only Adoption
|
|
185
334
|
|
|
@@ -187,15 +336,59 @@ When a directory contains `CLAUDE.md` but no `AGENTS.md`, sync can adopt it:
|
|
|
187
336
|
|
|
188
337
|
1. Read the existing `CLAUDE.md`
|
|
189
338
|
2. Write canonical `AGENTS.md` with that content
|
|
190
|
-
3.
|
|
339
|
+
3. Under a shim strategy, regenerate `CLAUDE.md` using that strategy. Under
|
|
340
|
+
`none`, remove the `CLAUDE.md`, so adoption never leaves a file that makes
|
|
341
|
+
Claude Code ignore `AGENTS.md` — unless another `CLAUDE.md` with content
|
|
342
|
+
[blocks removal](#all-or-nothing), in which case the adopted `CLAUDE.md` is
|
|
343
|
+
kept.
|
|
344
|
+
|
|
345
|
+
This means the original Claude instructions become canonical before the derived file is rewritten or removed.
|
|
191
346
|
|
|
192
|
-
|
|
347
|
+
Under `none` the removal is re-verified like any other: the `CLAUDE.md` must
|
|
348
|
+
still be the same file and now byte-identical to the new `AGENTS.md`. If it
|
|
349
|
+
changed during adoption, it is kept and reported as
|
|
350
|
+
`CLAUDE.md kept after adoption into AGENTS.md (...)`, and it is also named in a
|
|
351
|
+
leftover warning.
|
|
193
352
|
|
|
194
353
|
Readable Claude-only files are adoptable. Unreadable Claude-only files are not.
|
|
354
|
+
`.claude/CLAUDE.md` is Claude Code's own alternate project file, not a stray,
|
|
355
|
+
so under `none` it is never adopted.
|
|
356
|
+
|
|
357
|
+
## Claude Code and AGENTS.md
|
|
358
|
+
|
|
359
|
+
Claude Code reads `AGENTS.md` natively through its built-in `agents-md` plugin
|
|
360
|
+
(`anthropics/claude-code`, `mods/agents-md`, as of v2.1.278). Its
|
|
361
|
+
`instructionFiles` option defaults to `claude-md-or-agents-md`:
|
|
362
|
+
|
|
363
|
+
- In that default mode the plugin stands down for the **whole project** when
|
|
364
|
+
any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` exists in any
|
|
365
|
+
directory from the project root down to the working directory; Claude Code
|
|
366
|
+
then loads only `CLAUDE.md` files. A single root `CLAUDE.md` or a personal
|
|
367
|
+
`CLAUDE.local.md` is enough to make it ignore every `AGENTS.md`, and a
|
|
368
|
+
repository with shims in some directories but not others loses every
|
|
369
|
+
`AGENTS.md` that has no shim. This is why the default removes managed shims
|
|
370
|
+
and warns about the rest.
|
|
371
|
+
- In `claude-md-and-agents-md` mode, an `AGENTS.md` that a `CLAUDE.md` already
|
|
372
|
+
imports or links is not loaded twice, so shims are harmless there.
|
|
373
|
+
- The option can be set only in user settings (`~/.claude/settings.json`),
|
|
374
|
+
with `--settings`, or in managed settings. A project's
|
|
375
|
+
`.claude/settings.json` cannot set it, so a repository cannot choose the mode
|
|
376
|
+
for its contributors.
|
|
377
|
+
|
|
378
|
+
Opt into a shim strategy when your contributors need `CLAUDE.md`:
|
|
379
|
+
|
|
380
|
+
- they run Claude Code releases from before the built-in `agents-md` plugin;
|
|
381
|
+
- they set `instructionFiles` to `claude-md`, which loads no `AGENTS.md`;
|
|
382
|
+
- the plugin's documented gaps matter to you: nested `AGENTS.md` files attach
|
|
383
|
+
only on a text file `Read` (not on `@`-mentions, IDE selections, or
|
|
384
|
+
notebook, image, or PDF reads), and `--add-dir` directories contribute no
|
|
385
|
+
`AGENTS.md`, where Claude Code's own `CLAUDE.md` loading covers those cases
|
|
386
|
+
(for `--add-dir`, only when `CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1`
|
|
387
|
+
is set).
|
|
195
388
|
|
|
196
389
|
## When `--force` Is Required
|
|
197
390
|
|
|
198
|
-
`oat instructions sync` does not overwrite a mismatched `CLAUDE.md` unless you pass `--force`.
|
|
391
|
+
Under a shim strategy, `oat instructions sync` does not overwrite a mismatched `CLAUDE.md` unless you pass `--force`.
|
|
199
392
|
|
|
200
393
|
Typical pattern:
|
|
201
394
|
|
|
@@ -223,9 +416,18 @@ In these cases, sync reports a manual-repair skip instead of guessing at destruc
|
|
|
223
416
|
|
|
224
417
|
## Example Workflow
|
|
225
418
|
|
|
226
|
-
Preview and
|
|
419
|
+
Preview and apply the default: remove OAT-managed shims and adopt Claude-only
|
|
420
|
+
strays into `AGENTS.md`:
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
oat instructions sync --dry-run
|
|
424
|
+
oat instructions sync
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
Opt the repository into pointer shims:
|
|
227
428
|
|
|
228
429
|
```bash
|
|
430
|
+
oat config set instructions.claude.shims pointer
|
|
229
431
|
oat instructions sync --dry-run
|
|
230
432
|
oat instructions sync
|
|
231
433
|
```
|
|
@@ -26,11 +26,11 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
|
|
|
26
26
|
- Interactive `oat init` and `oat status` ask for an individual disposition for each unresolved Cursor-local skill: adopt it into `.agents/skills` or keep it Cursor-only and remember the exact path in sync config
|
|
27
27
|
- Keep-local is blocked when a canonical skill has the same name because Cursor does not document a safe duplicate-resolution order
|
|
28
28
|
- During upgrades, OAT removes only verified clean legacy managed skill views. Changed or replaced views are preserved, detached from manifest ownership, and offered for migration.
|
|
29
|
-
- Sync materializes pinned Markdown definitions for both `oat-phase-implementer` and `oat-reviewer` in addition to the base roles, which sync like any other canonical agent at both scopes. Each generated name keeps the configured flat ladder ID, while an explicit verified mapping writes
|
|
29
|
+
- Sync materializes pinned Markdown definitions for both `oat-phase-implementer` and `oat-reviewer` in addition to the base roles, which sync like any other canonical agent at both scopes. Each generated name keeps the configured flat ladder ID, while an explicit verified mapping writes its frontmatter model: a bracket-form selector for existing families or an exact ID for Sonnet 5.5. The supported catalogue contains 31 pins and 62 pinned role variants. OAT never derives a selector from the ladder ID or passes through an unregistered ID.
|
|
30
30
|
- Generated definitions carry `supported-catalogue`, `project-config`, or `user-config` ownership. Project and supported output lives in the tracked `.cursor/agents` view; user-owned output lives under `~/.cursor/agents`. Cleanup reconciles only the applicable owner.
|
|
31
31
|
- Managed dispatch requires `providers.cursor.dispatchArgs.variant` and launches that exact resolver-selected native agent type first. Skills do not pass a Task-level model argument or normalize Cursor model strings.
|
|
32
32
|
- Cursor may silently fallback when a definition pin cannot be honored. Variant acceptance therefore establishes launcher-owned `configured` provenance only; runtime identity remains `not-reported` unless independently observed.
|
|
33
|
-
- `oat doctor` checks whether each flat ID is still present in the current Cursor catalogue and reports availability drift. Catalogue availability is diagnostic and does not prove that a definition-level
|
|
33
|
+
- `oat doctor` checks whether each flat ID is still present in the current Cursor catalogue and reports availability drift. Catalogue availability is diagnostic and does not prove that a definition-level pin ran as configured.
|
|
34
34
|
- Rule files render as `.cursor/rules/*.mdc`
|
|
35
35
|
|
|
36
36
|
=== "Copilot"
|
|
@@ -59,7 +59,7 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
|
|
|
59
59
|
- `.codex/agents/<role>.toml`
|
|
60
60
|
- `.codex/config.toml` (`[features] multi_agent = true`, `[agents.<role>]` upserts)
|
|
61
61
|
- Codex role files include OAT managed provenance headers and are regenerated by `oat sync --scope project|user|all`
|
|
62
|
-
- Project sync writes and maintains the version-controlled supported catalogue: GPT-6 Luna, Sol, and Astra at `low`, `medium`, `high`, `xhigh`, and `max`; GPT-5.6 Luna and Terra through `xhigh`; and GPT-5.6 Sol through `max`. Both `oat-phase-implementer` and `oat-reviewer` receive each supported pair (
|
|
62
|
+
- Project sync writes and maintains the version-controlled supported catalogue: GPT-6.1 Sol and GPT-6 Luna, Sol, and Astra at `low`, `medium`, `high`, `xhigh`, and `max`; GPT-5.6 Luna and Terra through `xhigh`; and GPT-5.6 Sol through `max`. Both `oat-phase-implementer` and `oat-reviewer` receive each supported pair (66 pinned variants). Sync writes files; it does not create a Git commit.
|
|
63
63
|
- Custom targets follow configuration provenance: user-config targets write only under `~/.codex`; shared, repo-local, and active-project targets write under the project's tracked `.codex` view.
|
|
64
64
|
- User sync loads only the bundled canonical `oat-phase-implementer` and `oat-reviewer` definitions needed to expand user-config targets. It does not enable general user-agent mirroring, and it refuses stale user-role cleanup if either managed definition is unavailable.
|
|
65
65
|
- Generated variants carry `supported-catalogue`, `user-config`, or `project-config` ownership. Cleanup removes stale entries only for the owner being reconciled and preserves other scopes plus unrelated Codex entries.
|
|
@@ -67,7 +67,7 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
|
|
|
67
67
|
- A single role can be materialized directly with `oat providers codex materialize <agent-name> --model <model-id> --effort <reasoning-effort>`; `--agent-path` selects a specific canonical markdown agent, `--role-name` overrides the generated role name, and `--scope user` writes a user-config-owned role.
|
|
68
68
|
- Aggregate Codex config drift metadata (`aggregateConfigHash`) is emitted in sync/status codex extension output and intentionally not stored as a separate manifest row
|
|
69
69
|
- Sync-time materialization is best effort; managed workflow correctness uses exact registered roles or a fresh child pinned to the resolved model plus reasoning effort with canonical role instructions. After a successful provider-visible file change, OAT conservatively advises starting a new Codex session so it has an opportunity to load the role. This repository policy is not a Codex hot-reload contract, an application-process restart requirement, or proof that the new session exposed the role.
|
|
70
|
-
- Codex `max` is a first-class dispatch effort. It is supported for GPT-6 Luna, Sol, and Astra, plus GPT-5.6 Sol, for both implementer and reviewer roles.
|
|
70
|
+
- Codex `max` is a first-class dispatch effort. It is supported for GPT-6.1 Sol, GPT-6 Luna, Sol, and Astra, plus GPT-5.6 Sol, for both implementer and reviewer roles.
|
|
71
71
|
- Codex multi-agent dispatch uses config-defined roles (`[agents.<name>]`) and `agent_type`
|
|
72
72
|
- Codex subagent workflows require `[features] multi_agent = true` in active Codex config layers
|
|
73
73
|
- Default managed Codex execution requires root (depth 0) → phase implementer (depth 1). `agents.max_depth >= 2` enables optional nested phase-agent work; sync and direct materialization still merge that capability floor without lowering a higher target value.
|
|
@@ -123,7 +123,7 @@ runtime mismatch, malformed output, and missing telemetry never authorize it.
|
|
|
123
123
|
## Non-interop namespaces in the same CLI
|
|
124
124
|
|
|
125
125
|
- `oat project new <name>` (workflow/project scaffolding)
|
|
126
|
-
- `oat instructions validate` / `oat instructions sync` (AGENTS.md
|
|
126
|
+
- `oat instructions validate` / `oat instructions sync` (AGENTS.md integrity with no CLAUDE.md shims by default, opt-in pointer, symlink, or copy shims, plus Claude-only adoption)
|
|
127
127
|
- `oat internal validate-oat-skills` (internal maintenance)
|
|
128
128
|
|
|
129
129
|
## Reference artifacts
|