@open-agent-toolkit/cli 0.3.8 → 0.3.9

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 (88) hide show
  1. package/README.md +3 -3
  2. package/assets/agents/oat-codebase-mapper.md +3 -2
  3. package/assets/agents/oat-reviewer.md +5 -13
  4. package/assets/agents/skeptical-evaluator.md +6 -2
  5. package/assets/bundle-metadata.json +1 -1
  6. package/assets/docs/cli-utilities/backlog-lifecycle.md +3 -2
  7. package/assets/docs/cli-utilities/bootstrap.md +5 -2
  8. package/assets/docs/cli-utilities/config-and-local-state.md +13 -6
  9. package/assets/docs/cli-utilities/configuration.md +10 -9
  10. package/assets/docs/cli-utilities/tool-packs.md +60 -10
  11. package/assets/docs/contributing/code.md +9 -5
  12. package/assets/docs/provider-sync/commands.md +11 -8
  13. package/assets/docs/provider-sync/instruction-sync.md +241 -39
  14. package/assets/docs/provider-sync/scope-and-surface.md +1 -1
  15. package/assets/docs/reference/cli-reference.md +2 -0
  16. package/assets/docs/reference/oat-directory-structure.md +12 -11
  17. package/assets/docs/reference/troubleshooting.md +19 -4
  18. package/assets/docs/workflows/projects/implementation-execution.md +22 -8
  19. package/assets/docs/workflows/projects/lifecycle.md +4 -6
  20. package/assets/public-package-versions.json +4 -4
  21. package/assets/skills/oat-agent-instructions-analyze/SKILL.md +4 -4
  22. package/assets/skills/oat-agent-instructions-analyze/references/analysis-artifact-template.md +5 -5
  23. package/assets/skills/oat-agent-instructions-analyze/references/docs/rules-files.md +14 -11
  24. package/assets/skills/oat-agent-instructions-analyze/references/quality-checklist.md +2 -2
  25. package/assets/skills/oat-agent-instructions-analyze/scripts/resolve-instruction-files.sh +4 -3
  26. package/assets/skills/oat-agent-instructions-apply/SKILL.md +3 -3
  27. package/assets/skills/oat-agent-instructions-apply/references/docs/rules-files.md +14 -11
  28. package/assets/skills/oat-doctor/SKILL.md +17 -13
  29. package/assets/skills/oat-project-implement/SKILL.md +2 -2
  30. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +33 -11
  31. package/assets/skills/oat-project-implement/references/phase-execution.md +109 -8
  32. package/assets/skills/oat-project-lite/SKILL.md +23 -1
  33. package/assets/skills/oat-project-next/SKILL.md +3 -3
  34. package/assets/skills/oat-project-progress/SKILL.md +2 -2
  35. package/assets/templates/docs-app-mkdocs/docs/contributing.md +1 -3
  36. package/assets/templates/pjm-agents.md +7 -3
  37. package/assets/templates/state.md +2 -2
  38. package/dist/commands/backlog/archive.d.ts +10 -2
  39. package/dist/commands/backlog/archive.d.ts.map +1 -1
  40. package/dist/commands/backlog/archive.js +22 -6
  41. package/dist/commands/backlog/index.d.ts.map +1 -1
  42. package/dist/commands/backlog/index.js +5 -1
  43. package/dist/commands/backlog/rewrite-references.d.ts +41 -0
  44. package/dist/commands/backlog/rewrite-references.d.ts.map +1 -0
  45. package/dist/commands/backlog/rewrite-references.js +516 -0
  46. package/dist/commands/config/index.d.ts +1 -0
  47. package/dist/commands/config/index.d.ts.map +1 -1
  48. package/dist/commands/config/index.js +69 -34
  49. package/dist/commands/init/index.d.ts +6 -0
  50. package/dist/commands/init/index.d.ts.map +1 -1
  51. package/dist/commands/init/index.js +27 -4
  52. package/dist/commands/init/tools/index.d.ts +18 -1
  53. package/dist/commands/init/tools/index.d.ts.map +1 -1
  54. package/dist/commands/init/tools/index.js +84 -17
  55. package/dist/commands/init/tools/project-guidance.d.ts +19 -4
  56. package/dist/commands/init/tools/project-guidance.d.ts.map +1 -1
  57. package/dist/commands/init/tools/project-guidance.js +58 -15
  58. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  59. package/dist/commands/init/tools/workflows/index.js +5 -1
  60. package/dist/commands/instructions/instructions.types.d.ts +105 -4
  61. package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
  62. package/dist/commands/instructions/instructions.types.js +4 -5
  63. package/dist/commands/instructions/instructions.utils.d.ts +161 -6
  64. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  65. package/dist/commands/instructions/instructions.utils.js +650 -12
  66. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  67. package/dist/commands/instructions/sync/sync.js +256 -18
  68. package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
  69. package/dist/commands/instructions/validate/validate.js +36 -8
  70. package/dist/commands/pjm/index.d.ts.map +1 -1
  71. package/dist/commands/pjm/index.js +19 -4
  72. package/dist/commands/pjm/init.d.ts +3 -0
  73. package/dist/commands/pjm/init.d.ts.map +1 -1
  74. package/dist/commands/pjm/init.js +23 -5
  75. package/dist/commands/shared/agents-md.d.ts +26 -5
  76. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  77. package/dist/commands/shared/agents-md.js +182 -3
  78. package/dist/commands/tools/guidance/index.d.ts +15 -0
  79. package/dist/commands/tools/guidance/index.d.ts.map +1 -0
  80. package/dist/commands/tools/guidance/index.js +81 -0
  81. package/dist/commands/tools/index.d.ts.map +1 -1
  82. package/dist/commands/tools/index.js +2 -0
  83. package/dist/config/oat-config.d.ts +49 -3
  84. package/dist/config/oat-config.d.ts.map +1 -1
  85. package/dist/config/oat-config.js +107 -14
  86. package/dist/config/resolve.d.ts.map +1 -1
  87. package/dist/config/resolve.js +12 -2
  88. package/package.json +2 -2
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Open Agent Toolkit command-line interface for provider sync, docs tooling, workflow utilities, and diagnostics.
4
4
 
5
- The CLI also supports project-scoped instruction sync for nested `AGENTS.md` / `CLAUDE.md` files, including pointer, symlink, and hard-copy repair strategies plus Claude-only adoption.
5
+ The CLI also supports project-scoped instruction sync for nested `AGENTS.md` files. By default it creates no `CLAUDE.md` shims, because Claude Code reads `AGENTS.md` itself, and removes the shims OAT created earlier once no `CLAUDE.md` with its own content remains; pointer, symlink, and hard-copy shim strategies are opt-in through `instructions.claude.shims`, and Claude-only `CLAUDE.md` files are adopted into `AGENTS.md`.
6
6
 
7
7
  ## Install
8
8
 
@@ -28,8 +28,8 @@ oat config describe
28
28
  Additional useful entry points:
29
29
 
30
30
  - `oat tools install`
31
- - `oat instructions validate --strategy pointer`
32
- - `oat instructions sync --dry-run --strategy symlink`
31
+ - `oat instructions validate`
32
+ - `oat instructions sync --dry-run`
33
33
  - `oat docs init --app-name my-docs`
34
34
  - `oat pjm init` - initialize the project-management repo-reference surface after installing the pack
35
35
  - `oat config dump --json`
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-codebase-mapper
3
- version: 1.0.1
3
+ version: 1.0.2
4
4
  description: Explores codebase and writes structured analysis documents. Spawned by oat-repo-knowledge-index with a focus area (tech, arch, quality, concerns). Writes documents directly to reduce orchestrator context load.
5
5
  tools: Read, Bash, Grep, Glob, Write
6
6
  color: cyan
@@ -243,11 +243,12 @@ Return a brief confirmation. DO NOT include document contents.
243
243
 
244
244
  Format:
245
245
 
246
- ```
246
+ ```markdown
247
247
  ## Mapping Complete
248
248
 
249
249
  **Focus:** {focus}
250
250
  **Documents written:**
251
+
251
252
  - `.oat/repo/knowledge/{DOC1}.md` ({N} lines)
252
253
  - `.oat/repo/knowledge/{DOC2}.md` ({N} lines)
253
254
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.2.9
3
+ version: 1.2.10
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
5
5
  tools: Read, Bash, Grep, Glob, Write, Task
6
6
  color: yellow
@@ -98,7 +98,7 @@ When delegation is eligible:
98
98
  Mechanical workers may execute checks and report exact output, but interpretation and policy judgment require stronger classes or stay with the root reviewer.
99
99
 
100
100
  5. The generic dispatch contract owns capability, catalog, model, effort, route, authorization, launch evidence, class-floor selection, and floor-satisfaction evidence. It applies active user and repository instructions, the active-provider reference, the live nested catalog, and the supplied policy/ceiling. Select an explicit target meeting the declared floor; never silently inherit the primary reviewer's model and never hard-code provider model names. Prefer a cheaper/faster worker only when the host reliably exposes that control and the target still satisfies the floor.
101
- 6. When the selected lane worker is the canonical `recon-worker`, construct and validate its complete Assignment Gate envelope before launch: run, wave, and lane IDs; approved manifest wave mode; worker assignment mode; bounded objective; included and excluded scope; allowed and excluded inputs; source-read authority and read-only tools; sole write path; artifact kind, schema version, and closed output schema; enforcement; deadline; and escalation path. If the complete envelope cannot be constructed, do not launch the worker; record the attempt as not attempted or failed as appropriate and cover the lane inline. Other worker roles follow their own contracts.
101
+ 6. Launch every lane as an ordinary read-only sub-agent through the generic dispatch contract. The `recon` skill's evidence-packet worker and its assignment machinery belong to that skill alone; reviewer lanes never use them. When a lane cannot be launched within these limits, record the attempt as not attempted or failed as appropriate and cover the lane inline.
102
102
  7. Give each lane an exact scope and a compact return contract: coverage, checks performed, exact `file:line` evidence, gaps, and explicit uncertainty. Reports are advisory candidate observations, not accepted findings.
103
103
  8. Workers must not mutate files, emit final findings, assign severity, make validation decisions, write review artifacts or `StructuredFindings`, or otherwise write either output sink.
104
104
 
@@ -499,8 +499,6 @@ Run these to verify the implementation:
499
499
  Run the `oat-project-review-receive` skill to convert findings into plan tasks.
500
500
  ````
501
501
 
502
- ```
503
-
504
502
  Gate parsing contract: artifact-mode reviews, including reviews spawned by `oat gate review`, MUST include either the complete `Findings by severity: {N} critical, {N} high, {N} medium, {N} low` count line or the standard `## Findings` sections shown above with every severity subsection present. When more than one count source is present — the frontmatter count fields, the count line, and the sections — the counts must agree; the gate refuses an artifact whose sources contradict each other rather than picking one. How a section is counted is load-bearing: the gate counts only markdown list items (`- `, `* `, `+ `, or `1. `) as findings. A finding written as a bold paragraph, a heading, or any other prose shape counts as zero, so a section of prose findings under a non-zero count line is a contradiction and the gate refuses the artifact — the entire review is rejected, not just the miscounted section.
505
503
 
506
504
  For every artifact-mode code review, `oat_review_head_sha` is required and must be the full 40-character commit SHA at the head of the authoritative review range. Resolve it with `git rev-parse <authoritative-range-head>^{commit}`. An abbreviated SHA, symbolic ref, or range string is invalid. When the review narrowed, `oat_review_range`, `oat_prior_review_artifact`, and `oat_prior_review_head_sha` are also required; the prior head must likewise be a full 40-character SHA. These code-review fields are independent of the gate-only block and do not apply to artifact, analysis, or structured-output reviews.
@@ -509,7 +507,6 @@ For a narrowed review, do not restate requirements-coverage claims that this pas
509
507
 
510
508
  For gate-originated artifacts, all six gate-only fields are required when the prompt supplies gate context. Copy the values exactly. Do not parse the provider command, infer values from the target id, or replace configured values with observed/self-reported identity. Any optional self-report belongs in review prose and is non-authoritative; the gate validates the copied frontmatter against its immutable configured invocation record before applying severity thresholds.
511
509
 
512
-
513
510
  ### Step 9: Return Confirmation
514
511
 
515
512
  **Artifact mode only.** In structured-output mode (`oat_output_mode: structured`), return the `StructuredFindings` object instead — see **Structured-Output Mode** below.
@@ -520,8 +517,8 @@ Return exactly one reconnaissance status line using only `attempted` or
520
517
  attempted, including an attempted launch that fell back or failed.
521
518
 
522
519
  Format:
523
- ```
524
520
 
521
+ ```markdown
525
522
  ## Review Complete
526
523
 
527
524
  **Scope:** {scope}
@@ -530,8 +527,7 @@ Format:
530
527
  **Reconnaissance:** {attempted | not-attempted}
531
528
 
532
529
  Return to your main session and run the `oat-project-review-receive` skill.
533
-
534
- ````
530
+ ```
535
531
 
536
532
  ## Structured-Output Mode
537
533
 
@@ -556,7 +552,7 @@ interface StructuredFindings {
556
552
  }>;
557
553
  verification_commands: string[]; // commands the caller can run to verify fixes — returned as an array, NOT appended to a file
558
554
  }
559
- ````
555
+ ```
560
556
 
561
557
  **Rules for the structured return:**
562
558
 
@@ -595,7 +591,3 @@ Default behavior is unaffected: when `oat_output_mode` is absent or set to anyth
595
591
  - [ ] Findings have actionable fix guidance
596
592
  - [ ] Verification commands included
597
593
  - [ ] Brief confirmation returned (artifact mode) / `StructuredFindings` object returned (structured-output mode)
598
-
599
- ```
600
-
601
- ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: skeptical-evaluator
3
- version: 1.0.0
3
+ version: 1.0.1
4
4
  description: Adversarial claim evaluator — receives a context package and gathers evidence to disprove then support a claim. Returns structured findings with citations.
5
5
  tools: Read, Bash, Grep, Glob, WebSearch, WebFetch
6
6
  color: red
@@ -78,21 +78,25 @@ Return findings to the orchestrator using the output structure below. Do NOT wri
78
78
 
79
79
  Return inline findings to the orchestrator in this structure:
80
80
 
81
- ```
81
+ ```markdown
82
82
  ## Evidence
83
83
 
84
84
  ### Contradicting Evidence
85
+
85
86
  {Each piece with specific citation — file:line, URL, version, etc.}
86
87
  {Or "None found after searching: [list of sources checked]"}
87
88
 
88
89
  ### Supporting Evidence
90
+
89
91
  {Each piece with specific citation}
90
92
  {Or "None found"}
91
93
 
92
94
  ### Evidence Quality Assessment
95
+
93
96
  {How reliable the evidence is — direct vs indirect, authoritative vs anecdotal}
94
97
 
95
98
  ## Preliminary Assessment
99
+
96
100
  {Lean toward one of: holds_up | skepticism_warranted | nuanced | inconclusive}
97
101
  {Brief reasoning for the lean}
98
102
  {Confidence estimate: X%}
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.8"
3
+ "oatVersion": "0.3.9"
4
4
  }
@@ -56,9 +56,10 @@ A single `oat backlog archive` run performs the whole close-out so its parts can
56
56
  1. Sets the terminal `status` (`closed` by default, `wont_do` with `--wont-do`) and stamps `updated`.
57
57
  2. Validates and trims a nonblank `--summary` before mutating a `closed` item, then appends its canonical newest-first `completed.md` entry. `wont_do` items may omit the summary and get an entry only when one is provided.
58
58
  3. Moves `items/<id>.md` into `archived/` — with `git mv` inside a work tree, or a plain rename outside git.
59
- 4. Regenerates the managed backlog index.
59
+ 4. Rewrites inbound references to the moved file across Markdown under `.oat/repo/**` (tracked and untracked files that Git does not ignore; a code span whose whole content is the item's path, such as an external plan's source citation, is rewritten, while other code spans and fenced code are left as written with a warning) — external plans, decision records, and other backlog items — so no link dangles at `items/<id>.md`, and reports each rewritten file. A reference it cannot resolve is left alone with a warning.
60
+ 5. Regenerates the managed backlog index.
60
61
 
61
- The command is safe to re-run: an item already in `archived/` produces a no-op warning with no writes. A missing closed-item summary or an out-of-enum current status (for example a hand-set `done`) is a hard error before mutation and includes recovery guidance. See the [command reference](config-and-local-state.md#oat-backlog-archive) for exit codes and the `--json` payload.
62
+ The command is safe to re-run: an item already in `archived/` produces a no-op warning and only retries the reference rewrite and index regeneration, so an interrupted close-out finishes on the next run. A missing closed-item summary or an out-of-enum current status (for example a hand-set `done`) is a hard error before mutation and includes recovery guidance. See the [command reference](config-and-local-state.md#oat-backlog-archive) for exit codes and the `--json` payload.
62
63
 
63
64
  ## Catching lifecycle drift
64
65
 
@@ -47,7 +47,7 @@ After core initialization completes, `oat init` can enter an interactive guided
47
47
  - choose **Yes** to run the per-pack scope selector for every pack that allows both scopes (`ideas`, `docs`, `workflows`, `utility`, `project-management`, `research`, `brainstorm`)
48
48
  - choose **No** to apply additive per-pack defaults without extra scope prompts
49
49
  - on a fresh install every pack defaults to **user** scope, so capabilities follow you across repositories; an existing install keeps its current placement
50
- - after placement is chosen, repository `AGENTS.md` guidance is a separate opt-in. Accepting creates the managed `OAT tools` section only when the root file is absent. An existing file or symlink is never replaced: OAT prints a repository-relative, copy-pasteable managed-block patch instead. Declining leaves `AGENTS.md` unchanged
50
+ - after placement is chosen, repository `AGENTS.md` guidance is a separate opt-in. Accepting creates the root file with the managed `OAT tools` section when it is absent, and appends that section to an existing file or contained symlink target that lacks it, with one append-only write. An existing file is never replaced: when the section exists but differs, OAT prints a repository-relative, copy-pasteable managed-block patch instead. Declining leaves `AGENTS.md` unchanged
51
51
  - installing `project-management` installs the capability only. Adopting it for this repository is a third, separate choice made with `oat pjm init` — see [Install vs. initialize](tool-packs.md#install-vs-initialize)
52
52
  2. **Local paths** — multi-select from default gitignored artifact paths (analysis, PR, reviews, ideas). Pre-existing paths are pre-checked; only new paths are added.
53
53
  3. **Documentation** — detect or enter docs metadata for the repo when documentation exists.
@@ -65,9 +65,12 @@ Hook install note:
65
65
  # Explicit guided setup on an existing repo
66
66
  oat init --setup --scope project
67
67
 
68
- # Install capabilities and create or propose repository guidance
68
+ # Install capabilities and create, append, or propose repository guidance
69
69
  oat init --setup --project-guidance
70
70
 
71
+ # Write guidance for the packs already installed, without guided setup
72
+ oat init --project-guidance
73
+
71
74
  # Fresh init — guided setup is offered automatically
72
75
  oat init --scope project
73
76
  ```
@@ -17,7 +17,7 @@ Use the `oat backlog` group when you want direct CLI support for the file-backed
17
17
  - `oat backlog new <title>` - validate and create a file-backed backlog item from the canonical template, then regenerate the managed index
18
18
  - `oat backlog generate-id <title>` - generate a deterministic `BL-YYMMDD-slug` backlog ID from a title
19
19
  - `oat backlog generate-id <title> --created-at <timestamp>` - generate a reproducible ID for a known creation timestamp
20
- - `oat backlog archive <id>` - atomic close-out: set a terminal status, record the completion in `completed.md`, move the item into `archived/`, and regenerate the index in one step
20
+ - `oat backlog archive <id>` - atomic close-out: set a terminal status, record the completion in `completed.md`, move the item into `archived/`, rewrite inbound `.oat/repo` references to the moved file, and regenerate the index in one step
21
21
  - `oat backlog regenerate-index` - rebuild the managed backlog index table from item frontmatter
22
22
 
23
23
  Backlog IDs are deterministic date+slug identifiers (`BL-YYMMDD-slug`) derived from the creation date and title, so two machines or worktrees produce the same ID for the same record without scanning the local checkout. The slug is capped at 30 characters at the last whole-word boundary (with trailing stop-words trimmed), so prefer concise, meaningful titles. Index regeneration is deterministic and safe to re-run when resolving an index merge conflict.
@@ -52,8 +52,9 @@ The command validates all inputs before creating the scaffold or writing an item
52
52
  - For the default `closed` path, validates and trims a nonblank `--summary` before any file or index mutation. The `wont_do` path may omit the summary and completion-ledger entry.
53
53
  - Rewrites only the `status:` and `updated:` frontmatter lines (preserving any inline enum comment), then moves the item from `items/` to `archived/` with `git mv` inside a work tree, falling back to a plain rename (with a warning) outside git or if `git mv` fails.
54
54
  - `closed` archives append a canonical newest-first `completed.md` entry (`YYYY-MM-DD — <id> — Title — summary`). `wont_do` archives append an entry only when `--summary` is provided. A missing `completed.md` is scaffolded from the starter template; a missing `## Completed Items` heading is scaffolded with a warning.
55
+ - Rewrites inbound references to the moved file across Markdown under `.oat/repo/**` — tracked and untracked files that Git does not ignore, or every `.md` file outside a Git work tree — (external plans, decision records, other backlog items): relative links, `.oat/repo`-relative and repository-root path strings (including `oat_external_plan_sources` frontmatter) that resolve to `items/<id>.md` now point at `archived/<id>.md`, and the moved item's own relative links (inline links with any title form, and reference-style definitions; never footnotes or prose) are rebased when their target exists, so they keep resolving. An inline code span whose whole content is a path to the item (optionally with an `#anchor`), such as an external plan's `Source artifact or scope` citation, is rewritten; any other code span or fenced code block that mentions `items/<id>.md` is left as written with a warning, so recorded commands keep their meaning. Only references that resolve to the item's former `items/<id>.md` path change, and a link that already resolves to a different existing file is never repointed; URLs are never touched, and symlinked Markdown files are skipped so nothing outside `.oat/repo` is read or written. Each rewritten file is reported; a reference that names `items/<id>.md` but cannot be resolved is left untouched with a warning.
55
56
  - Regenerates the managed backlog index after the move.
56
- - Idempotent: re-running on an item already in `archived/` is a no-op warning with no writes.
57
+ - Idempotent: re-running on an item already in `archived/` returns `noop` with a warning and makes no status, `completed.md`, or move changes; it only retries the idempotent reference rewrite and index regeneration, so a run interrupted during the rewrite (or an item archived by hand or by an older CLI) can be finished by running the command again.
57
58
 
58
59
  **Exit codes:**
59
60
 
@@ -73,11 +74,14 @@ On success the payload is the archive result object:
73
74
  "completedEntry": "written",
74
75
  "movedTo": ".oat/repo/pjm/backlog/archived/BL-260705-example.md",
75
76
  "indexRegenerated": true,
77
+ "rewrittenReferences": [
78
+ ".oat/repo/reference/external-plans/2026-07-05-example-plan.md"
79
+ ],
76
80
  "warnings": []
77
81
  }
78
82
  ```
79
83
 
80
- `result` is `archived` or `noop` (already archived); `completedEntry` is `written`, `scaffolded`, or `skipped` (e.g. a `wont_do` archive without `--summary`); `movedTo` is the destination path or `null`. On an actionable failure the payload is `{ "result": "error", "id": "<id>", "message": "<why + fix>" }`.
84
+ `result` is `archived` or `noop` (already archived); `completedEntry` is `written`, `scaffolded`, or `skipped` (e.g. a `wont_do` archive without `--summary`); `movedTo` is the destination path or `null`; `rewrittenReferences` lists the repository-relative Markdown files whose references to the moved item were rewritten (on a no-op this lists anything the retried rewrite changed, and the human output prints each file on both paths). On an actionable failure the payload is `{ "result": "error", "id": "<id>", "message": "<why + fix>" }`.
81
85
 
82
86
  For full project-management repo-reference setup, use [`oat pjm init`](tool-packs.md#install-vs-initialize). It scaffolds the two-layer PJM surface (`pjm/current-state.md`, `pjm/roadmap.md`, `reference/decisions/`, and AGENTS guides) and delegates the backlog sub-surface to `oat backlog init`.
83
87
 
@@ -258,15 +262,18 @@ Use these reference pages for file ownership and schema details:
258
262
 
259
263
  These commands validate and repair project-scoped instruction integrity between `AGENTS.md` and sibling `CLAUDE.md` files.
260
264
 
261
- - `oat instructions validate` - read-only integrity check with `--strategy pointer|symlink|copy`
262
- - `oat instructions sync` - preview or apply pointer, symlink, or hard-copy repairs
265
+ - `oat instructions validate` - read-only integrity check with `--strategy none|pointer|symlink|copy`
266
+ - `oat instructions sync` - preview or apply the effective strategy: remove OAT-managed shims (`none`, the default) or create and repair pointer, symlink, or hard-copy shims
263
267
 
264
268
  Use this command group when instruction files drift after manual edits or generated updates, or when nested project directories contain Claude-only stray files that should be adopted into canonical `AGENTS.md`.
265
269
 
266
270
  Operational notes:
267
271
 
268
272
  - Validation and sync use the same recursive scan model, so `--dry-run` previews the same states that `validate` reports.
269
- - `pointer` is the default strategy; `symlink` and `copy` make file shape part of correctness.
273
+ - `none` is the default strategy: no `CLAUDE.md` shims, because Claude Code reads `AGENTS.md` itself. Persist a shim strategy with `oat config set instructions.claude.shims pointer|symlink|copy`; `--strategy` overrides it for one run.
274
+ - Under `none`, every remaining `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` is reported with a warning, because it makes Claude Code ignore every `AGENTS.md`.
275
+ - Under `none`, shim removal is all or nothing: while any of those files has content of its own, sync removes no shim, exits `1`, and reports one `claude_md_blocks_shim_removal` finding naming the files with content and the shims it kept. See [All or nothing](../provider-sync/instruction-sync.md#all-or-nothing).
276
+ - Under a shim strategy, `symlink` and `copy` make file shape part of correctness.
270
277
  - Unreadable canonical `AGENTS.md` files and unreadable Claude-only sources are surfaced as drift, but sync leaves them in manual-repair mode instead of guessing at recovery.
271
278
 
272
279
  For the full state model, repair semantics, and examples, see [Instruction Sync](../provider-sync/instruction-sync.md).
@@ -19,13 +19,13 @@ For the deep file-by-file reference, see:
19
19
 
20
20
  ## The five config surfaces
21
21
 
22
- | Surface | File | Typical contents | Primary CLI surface |
23
- | ------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
24
- | Shared repo config | `.oat/config.json` | Repo-wide non-sync settings such as `projects.root`, `git.defaultBranch`, `documentation.*`, `archive.*`, `tools.*`, and shared `workflow.*` defaults | `oat config get/set/unset/list/describe`, `oat gate` |
25
- | Repo-local config | `.oat/config.local.json` | Per-developer state for this checkout, such as `activeProject`, `lastPausedProject`, repo-local `activeIdea`, and local `workflow.*` overrides | `oat config get/set/unset/list/describe`, `oat gate` |
26
- | User config | `~/.oat/config.json` | User-level state such as global `activeIdea` fallback and personal `workflow.*` defaults | `oat config get/set/unset/describe`, `oat gate` |
27
- | Project sync config | `.oat/sync/config.json` | Provider enablement, sync strategy, and repo-level known stray settings | `oat providers set`, `oat config describe` |
28
- | User provider sync config | `~/.oat/sync/config.json` | User sync strategy and personal known provider strays | Provider-sync commands, `oat config describe` |
22
+ | Surface | File | Typical contents | Primary CLI surface |
23
+ | ------------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
24
+ | Shared repo config | `.oat/config.json` | Repo-wide non-sync settings such as `projects.root`, `git.defaultBranch`, `documentation.*`, `instructions.*`, `archive.*`, `tools.*`, and shared `workflow.*` defaults | `oat config get/set/unset/list/describe`, `oat gate` |
25
+ | Repo-local config | `.oat/config.local.json` | Per-developer state for this checkout, such as `activeProject`, `lastPausedProject`, repo-local `activeIdea`, and local `workflow.*` overrides | `oat config get/set/unset/list/describe`, `oat gate` |
26
+ | User config | `~/.oat/config.json` | User-level state such as global `activeIdea` fallback and personal `workflow.*` defaults | `oat config get/set/unset/describe`, `oat gate` |
27
+ | Project sync config | `.oat/sync/config.json` | Provider enablement, sync strategy, and repo-level known stray settings | `oat providers set`, `oat config describe` |
28
+ | User provider sync config | `~/.oat/sync/config.json` | User sync strategy and personal known provider strays | Provider-sync commands, `oat config describe` |
29
29
 
30
30
  The main split is:
31
31
 
@@ -95,8 +95,9 @@ Common keys in `.oat/config.json`:
95
95
  - `git.defaultBranch` — base branch fallback for PR workflows
96
96
  - `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership
97
97
  - `documentation.excludes` — a JSON array of globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. `oat config set` takes the list as one comma-separated value (`"a/**,b.md"`) and stores it as an array; repeated `--exclude` flags extend it, and an empty value clears the key
98
- - `documentation.instructionPointerExcludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset documentation.instructionPointerExcludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive, and the warning names the on-disk spelling when the path differs only in case), paths that resolve elsewhere through a symlink (the warning names the resolved target instead of blaming case-sensitivity), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
99
98
  - `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
99
+ - `instructions.claude.shims` — how `oat instructions sync` keeps a `CLAUDE.md` beside each `AGENTS.md`: `none` (the default: no shims; sync removes the ones OAT created and warns about any other `CLAUDE.md`, all or nothing: it removes none while any `CLAUDE.md`, `.claude/CLAUDE.md`, or `CLAUDE.local.md` has content of its own; see [All or nothing](../provider-sync/instruction-sync.md#all-or-nothing)), `pointer`, `symlink`, or `copy`. The `--strategy` flag overrides it for one run. Set it with `oat config set instructions.claude.shims pointer` when contributors need `CLAUDE.md` (see [Claude Code and AGENTS.md](../provider-sync/instruction-sync.md#claude-code-and-agentsmd)); `oat config unset` returns to `none`. Any other value is rejected with exit code `2` rather than read as unset, and `oat config set` can still replace it
100
+ - `instructions.claude.excludes` — a JSON array of repository-relative directories that `oat instructions sync` and `oat instructions validate` must not treat as pointer sites, additive to the documentation content root they already skip by default (see [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees)). `oat config set` takes the list as one comma-separated value (`"vendor/generated,apps/oat-docs/docs"`) and stores it as an array of repository-relative POSIX paths, trimmed and de-duplicated; an empty value clears the key, and `oat config unset instructions.claude.excludes` removes it. An entry that could never exclude anything — an absolute path, or one escaping the repository with `..` — is rejected with exit code `1` rather than stored. A structurally malformed value already on disk (a non-array, or an empty or non-string entry) is rejected with exit code `2` and a repair message, and `oat config set` can still replace it. Entries that are well formed but cannot exclude anything — among them absolute paths, paths escaping the repository, paths that match no directory (matching is case-sensitive, and the warning names the on-disk spelling when the path differs only in case), paths that resolve elsewhere through a symlink (the warning names the resolved target instead of blaming case-sensitivity), and the unexcludable `.oat/repo` carve-in root — never abort the command; they are reported as warnings and are not counted as protection. Warnings go to stderr in human mode and to the `exclusionWarnings` field under `--json`
100
101
  - `archive.s3Uri` — base S3 archive prefix
101
102
  - `archive.s3SyncOnComplete` — upload archived projects to S3 during completion
102
103
  - `archive.summaryExportPath` — export `summary.md` into a durable tracked directory during completion
@@ -815,7 +816,7 @@ oat config set workflow.dispatchCeiling.providers.codex medium # Advanced: per-
815
816
  oat config set workflow.autoArtifactReview.analysis false
816
817
  ```
817
818
 
818
- Default (no flag) targets `.oat/config.local.json` for workflow keys. Pass at most one of `--user`, `--shared`, or `--local`. Structural keys (`projects.root`, `worktrees.root`, `git.*`, `documentation.*`, `archive.*`, `tools.*`) are still shared-only regardless of flag.
819
+ Default (no flag) targets `.oat/config.local.json` for workflow keys. Pass at most one of `--user`, `--shared`, or `--local`. Structural keys (`projects.root`, `worktrees.root`, `git.*`, `documentation.*`, `instructions.*`, `archive.*`, `tools.*`) are still shared-only regardless of flag.
819
820
 
820
821
  ### Choosing the right surface (personal vs per-repo)
821
822
 
@@ -11,7 +11,7 @@ This page covers CLI commands that manage bundled OAT tool packs and installed O
11
11
 
12
12
  - What it does: explains how bundled OAT packs are installed, updated, inspected, and removed.
13
13
  - When to use it: when you need to add capabilities to a repo, update installed skills, or understand which packs own which tools.
14
- - Primary commands: `oat tools list`, `oat tools has`, `oat tools install`, `oat tools update`, `oat tools remove`, `oat tools migrate`
14
+ - Primary commands: `oat tools list`, `oat tools has`, `oat tools guidance`, `oat tools install`, `oat tools update`, `oat tools remove`, `oat tools migrate`
15
15
  - Coming from an earlier CLI: read [Upgrading from an earlier CLI](#upgrading-from-an-earlier-cli) for the changed install-scope default, PJM adoption gating, sparse `tools` config map, and per-pack `--json` shape
16
16
 
17
17
  ## Bundled packs at a glance
@@ -243,16 +243,31 @@ Tool-pack setup separates three decisions that do not imply one another:
243
243
  user scope, or both. Placement controls where the capability is available;
244
244
  it does not authorize a repository `AGENTS.md` edit.
245
245
  2. **Project guidance** is an explicit choice to create an absent root
246
- `AGENTS.md` or print a manual patch for its managed `OAT tools` section. Use
246
+ `AGENTS.md`, append an absent managed `OAT tools` section to an existing
247
+ one, or print a manual patch when that section exists but differs. Use
247
248
  `--project-guidance` to accept or `--no-project-guidance` to decline on
248
- `oat init --setup`, `oat init tools`, and `oat tools install` flows. The
249
+ `oat init`, `oat init tools`, and `oat tools install`, including every
250
+ per-pack subcommand such as `oat tools install docs --project-guidance`:
251
+ the `OAT tools` block describes every installed pack, so any pack install
252
+ can write it. The `workflows` pack also offers guidance without the flag;
253
+ other pack commands plan it only when the flag is given. `oat init` without
254
+ `--setup` applies an explicit `--project-guidance` for the packs already
255
+ installed, because guided setup is not there to do it; with no pack
256
+ installed it writes nothing, reports `skipped` with a warning, and exits 0. The
249
257
  interactive prompt defaults to decline. Non-interactive runs perform no
250
258
  guidance write unless `--project-guidance` is present and report the exact
251
259
  opt-in command instead. When `AGENTS.md` already exists or is a contained
252
- symlink, accepted guidance performs zero writes and prints the same
253
- repository-relative, copy-pasteable managed block on every run. The patch
254
- describes the complete realized project-and-user pack inventory and tells
255
- the operator to remove a legacy `OAT workflows` block manually when needed.
260
+ symlink to a file inside the repository, accepted guidance appends an
261
+ absent `OAT tools` section with one append-only write (reported as
262
+ `appended`, exit 0) that never truncates, renames, or rewrites existing
263
+ bytes. A file with more than one hard link is never appended to; it gets
264
+ the manual patch instead, as does a file OAT cannot write (the patch names
265
+ the cause). A matching section is a no-op. A section that is present but
266
+ differs, or a legacy `OAT workflows` block that must be removed, gets zero
267
+ writes and the same repository-relative, copy-pasteable managed block on
268
+ every run, with a non-zero exit. The block describes the complete realized
269
+ project-and-user pack inventory and tells the operator to remove a legacy
270
+ `OAT workflows` block manually when needed.
256
271
  3. **PJM adoption** is the repository decision to use project-management state.
257
272
  Make it separately with `oat pjm init`; neither installing the
258
273
  `project-management` pack nor accepting tool guidance adopts PJM.
@@ -467,7 +482,7 @@ neither recognized legacy input nor a complete current layout is skipped with
467
482
  an `oat pjm init` recovery. `--print-prompt` only reads the bundled prompt and
468
483
  does not inspect adoption or modify the repository.
469
484
 
470
- 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. A missing AGENTS file can be created exclusively; an existing file or symlink is left byte-for-byte unchanged and receives a manual decision-guidance patch. If the pack is installed later, project-management guidance remains a separate managed section so the decision instructions stay independently reusable.
485
+ 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. A missing AGENTS file can be created exclusively; an existing file or contained symlink target without an `OAT decisions` section gets that section appended with one append-only write that leaves every existing byte in place, and a section that exists but differs is left byte-for-byte unchanged and receives a manual decision-guidance patch. If the pack is installed later, project-management guidance remains a separate managed section so the decision instructions stay independently reusable.
471
486
 
472
487
  `oat pjm init` is idempotent and non-destructive. Existing reference docs are skipped and left unchanged, so curated repo state is not overwritten on repeated runs.
473
488
 
@@ -657,6 +672,41 @@ oat tools has brainstorm --scope user
657
672
  oat --json tools has workflows
658
673
  ```
659
674
 
675
+ ### `oat tools guidance`
676
+
677
+ Purpose:
678
+
679
+ - Print the managed `OAT tools` `AGENTS.md` block for the packs installed now,
680
+ without installing, upgrading, or writing anything
681
+
682
+ Key behavior:
683
+
684
+ - Reads installed pack placement at project and user scope (user scope only
685
+ outside a Git repository) and renders the same block, markers included,
686
+ that `--project-guidance` would create or append
687
+ - Never touches `AGENTS.md`, pack assets, or config, so it is the safe way to
688
+ obtain the block for a manual edit, such as when an existing `OAT tools`
689
+ section differs and guidance prints a manual patch
690
+ - The block names `.agents/skills/` only when a pack is installed at project
691
+ scope and `~/.agents/skills/` only when a pack is installed at user scope,
692
+ each with its packs, deciding by pack membership rather than by whether the
693
+ directory exists. Project skills that belong to no OAT pack are described
694
+ on a separate line, never as pack skills
695
+ - `--json` returns `status`, `sectionKey` (`tools`), `target` (`AGENTS.md`),
696
+ `packs` (each `pack` with its `scope`), `otherProjectSkills` (names of
697
+ project skills that belong to no pack), and `managedBlock`
698
+ - With no OAT pack installed it prints no block, only a note that there is
699
+ nothing to add (an empty block would be a stale placeholder); `--json`
700
+ returns `status: "no-packs"`, `managedBlock: null`, and a `message`
701
+ - Exits `0` on success and `1` when pack state cannot be read
702
+
703
+ Examples:
704
+
705
+ ```bash
706
+ oat tools guidance
707
+ oat --json tools guidance
708
+ ```
709
+
660
710
  ### `oat tools install`
661
711
 
662
712
  Purpose:
@@ -685,8 +735,8 @@ Key behavior:
685
735
  JSON output adds `adoptedPacks` only when the list is non-empty. This is pack
686
736
  intent reconciliation, not repository PJM adoption
687
737
  - A user-only capability install needs no Git repository and performs no repository writes unless `--project-guidance` explicitly requests the separate repository guidance update
688
- - Offers repository `AGENTS.md` guidance independently of capability scope. Pass `--project-guidance` to create an absent file or print a manual managed `OAT tools` patch for an existing file/symlink, or `--no-project-guidance` to decline; the interactive prompt defaults to decline and non-interactive runs write nothing without the explicit opt-in
689
- - Repository `AGENTS.md` guidance for project management is owned by adoption, not by pack placement. Installing the `project-management` pack never writes the section. `oat pjm init` creates guidance only when the root file is absent; otherwise it completes scaffold/adoption and prints a manual patch without changing the existing file or symlink
738
+ - Offers repository `AGENTS.md` guidance independently of capability scope. Pass `--project-guidance` to create an absent file, append an absent managed `OAT tools` section to an existing file/symlink target, or print a manual patch for a section that exists but differs, or `--no-project-guidance` to decline; the interactive prompt defaults to decline and non-interactive runs write nothing without the explicit opt-in
739
+ - Repository `AGENTS.md` guidance for project management is owned by adoption, not by pack placement. Installing the `project-management` pack never writes the section. `oat pjm init` creates the root file when it is absent and appends the absent `OAT project-management` and `OAT decisions` sections to an existing file (reported as `appended`, exit 0). A section that exists but differs from the managed version, or an `AGENTS.md` OAT will not append to (more than one hard link, or not writable), completes scaffold/adoption with one combined manual patch, printed once, and a non-zero exit, without changing the existing file or symlink; the header names the refusal cause when OAT could not append
690
740
  - Interactive runs can prompt to update selected outdated skills
691
741
  - Successful installs report the final scope chosen for each pack, including `project + user` when a pack is installed in both, and auto-sync only the scopes actually changed by the install so untouched scopes are never re-synced or pruned
692
742
  - Install-triggered auto-sync limits removal planning to the canonical entries from the pack that was just installed, so stale manifest drift in unrelated packs does not delete other provider views
@@ -73,12 +73,16 @@ checkout with neither `origin/main` nor `main` skips the whole gate (CI uses
73
73
  `fetch-depth: 0`). Test files under `packages/cli/src/` count as publishable
74
74
  changes for this gate.
75
75
 
76
- CI runs neither `pnpm lint` nor `pnpm format`. `pnpm check` now covers the
76
+ CI runs neither `pnpm lint` nor `pnpm format`. `pnpm check` covers the
77
77
  formatting of `.agents/skills/**`, `apps/oat-docs/docs`, and `tools/smoke`
78
- through `format:root`, but `pnpm lint`'s root `oxlint` pass over `tools/smoke`
79
- and `.agents/skills`, and `packages/control-plane`'s `format` (it defines no
80
- `check` script), still run in no CI gate — run both whenever a change touches
81
- those paths.
78
+ through `format:root`, and the `check` script of every package under
79
+ `packages/` (`packages/control-plane` included) runs its `oxlint` passes and
80
+ `oxfmt --check .` (the docs app's `check` covers only its Markdown), but
81
+ `pnpm lint`'s root `oxlint` pass over `tools/smoke` and `.agents/skills` still
82
+ runs in no CI gate — the smoke test that shells out to `pnpm lint` passes as
83
+ long as its own seeded violations are reported, so it cannot catch an existing
84
+ root-oxlint violation. Run `pnpm lint` and `pnpm format` whenever a change
85
+ touches those paths.
82
86
  For narrower changes, use package-specific checks when possible, but do not
83
87
  merge without passing the relevant workspace gates.
84
88
 
@@ -213,10 +213,11 @@ Purpose:
213
213
  Key behavior:
214
214
 
215
215
  - Read-only validation of nested project-scoped instruction directories
216
- - Supports `--strategy pointer|symlink|copy` to validate the expected file shape
217
- - Reports `ok`, `missing`, `content_mismatch`, and `stray` states
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
- - Skips the derived documentation content root and any `documentation.instructionPointerExcludes` paths, using the same exclusions as `oat instructions sync`
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
- - Creates missing `CLAUDE.md` files using the selected strategy
234
- - Adopts Claude-only stray files by writing canonical `AGENTS.md` content first, then regenerating `CLAUDE.md`
235
- - Skips mismatched files unless `--force` is provided
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 `documentation.instructionPointerExcludes` paths, so authored pages never receive pointers; app-level instruction files such as `apps/oat-docs/AGENTS.md` are still synced
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)