@open-agent-toolkit/cli 0.3.10 → 0.3.12

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 (163) hide show
  1. package/README.md +2 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/cli-utilities/meta.json +13 -0
  4. package/assets/docs/cli-utilities/tool-packs.md +8 -2
  5. package/assets/docs/cli-utilities/workflow-gates.md +13 -0
  6. package/assets/docs/contributing/code.md +8 -2
  7. package/assets/docs/contributing/documentation.md +7 -1
  8. package/assets/docs/contributing/meta.json +15 -0
  9. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +14 -5
  10. package/assets/docs/docs-tooling/commands.md +26 -8
  11. package/assets/docs/docs-tooling/meta.json +4 -0
  12. package/assets/docs/docs-tooling/workflows.md +2 -2
  13. package/assets/docs/guide/meta.json +4 -0
  14. package/assets/docs/meta.json +14 -0
  15. package/assets/docs/provider-sync/instruction-sync.md +8 -0
  16. package/assets/docs/provider-sync/meta.json +11 -0
  17. package/assets/docs/provider-sync/scope-and-surface.md +3 -4
  18. package/assets/docs/reference/cli-reference.md +5 -2
  19. package/assets/docs/reference/docs-index-contract.md +23 -6
  20. package/assets/docs/reference/file-locations.md +7 -2
  21. package/assets/docs/reference/index.md +1 -1
  22. package/assets/docs/reference/meta.json +10 -0
  23. package/assets/docs/reference/troubleshooting.md +41 -6
  24. package/assets/docs/workflows/ideas/meta.json +4 -0
  25. package/assets/docs/workflows/meta.json +4 -0
  26. package/assets/docs/workflows/projects/cursor-cloud.md +8 -3
  27. package/assets/docs/workflows/projects/evidence-layers.md +6 -8
  28. package/assets/docs/workflows/projects/implementation-execution.md +30 -4
  29. package/assets/docs/workflows/projects/lifecycle.md +7 -1
  30. package/assets/docs/workflows/projects/meta.json +25 -0
  31. package/assets/docs/workflows/projects/orchestration-model.md +5 -6
  32. package/assets/docs/workflows/skills/meta.json +10 -0
  33. package/assets/docs/workflows/skills/recon.md +31 -3
  34. package/assets/public-package-versions.json +4 -4
  35. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +30 -16
  36. package/assets/skills/oat-dispatch-subagents/SKILL.md +4 -12
  37. package/assets/skills/oat-dispatch-subagents/references/managed-claude-example.json +1 -1
  38. package/assets/skills/oat-dispatch-subagents/references/provider-codex.md +51 -0
  39. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +8 -7
  40. package/assets/skills/oat-docs-analyze/SKILL.md +28 -3
  41. package/assets/skills/oat-docs-apply/SKILL.md +3 -3
  42. package/assets/skills/oat-docs-authoring/SKILL.md +1 -1
  43. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +5 -2
  44. package/assets/skills/oat-docs-bootstrap/SKILL.md +4 -3
  45. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +3 -3
  46. package/assets/skills/oat-pjm-decision/SKILL.md +3 -2
  47. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -4
  48. package/assets/skills/oat-project-complete/SKILL.md +47 -2
  49. package/assets/skills/oat-project-design/SKILL.md +10 -6
  50. package/assets/skills/oat-project-discover/SKILL.md +3 -3
  51. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +3 -10
  52. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -4
  53. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  54. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +135 -3
  55. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +7 -9
  56. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -4
  57. package/assets/skills/oat-project-implement/references/plan-and-resume.md +1 -1
  58. package/assets/skills/oat-project-import-plan/SKILL.md +3 -3
  59. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +4 -4
  60. package/assets/skills/oat-project-new/SKILL.md +3 -3
  61. package/assets/skills/oat-project-next/SKILL.md +50 -7
  62. package/assets/skills/oat-project-plan/SKILL.md +4 -4
  63. package/assets/skills/oat-project-plan-writing/SKILL.md +2 -2
  64. package/assets/skills/oat-project-pr-final/SKILL.md +11 -1
  65. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -4
  66. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
  67. package/assets/skills/oat-project-quick-start/SKILL.md +12 -8
  68. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -4
  69. package/assets/skills/oat-project-retro/SKILL.md +6 -3
  70. package/assets/skills/oat-project-review-provide/SKILL.md +2 -2
  71. package/assets/skills/oat-project-review-provide-remote/SKILL.md +2 -2
  72. package/assets/skills/oat-project-spec/SKILL.md +3 -3
  73. package/assets/skills/oat-project-summary/SKILL.md +22 -3
  74. package/assets/skills/oat-repo-improve/SKILL.md +2 -2
  75. package/assets/skills/recon/SKILL.md +24 -3
  76. package/assets/skills/recon/references/packet-contract.md +36 -6
  77. package/assets/skills/recon/references/profiles.md +3 -0
  78. package/assets/skills/recon/references/worker-contract.md +16 -3
  79. package/assets/skills/recon/scripts/create-review-brief.mjs +17 -86
  80. package/assets/skills/recon/scripts/lib/contracts.mjs +158 -41
  81. package/assets/skills/recon/scripts/lib/review-binding.mjs +123 -0
  82. package/assets/skills/recon/scripts/lib/routing.mjs +5 -2
  83. package/assets/skills/recon/scripts/reconcile-ledger.mjs +18 -7
  84. package/assets/skills/recon/scripts/render-packet.mjs +120 -1
  85. package/assets/skills/recon/scripts/validate-packet.mjs +119 -88
  86. package/assets/templates/state.md +1 -0
  87. package/dist/commands/backlog/new.d.ts +2 -2
  88. package/dist/commands/backlog/new.d.ts.map +1 -1
  89. package/dist/commands/backlog/new.js +2 -2
  90. package/dist/commands/decision/new.d.ts +2 -2
  91. package/dist/commands/decision/new.d.ts.map +1 -1
  92. package/dist/commands/decision/new.js +2 -2
  93. package/dist/commands/docs/nav/contents.d.ts +9 -0
  94. package/dist/commands/docs/nav/contents.d.ts.map +1 -1
  95. package/dist/commands/docs/nav/contents.js +7 -2
  96. package/dist/commands/docs/nav/fumadocs.d.ts +58 -0
  97. package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -0
  98. package/dist/commands/docs/nav/fumadocs.js +326 -0
  99. package/dist/commands/docs/nav/sync.d.ts +31 -1
  100. package/dist/commands/docs/nav/sync.d.ts.map +1 -1
  101. package/dist/commands/docs/nav/sync.js +163 -6
  102. package/dist/commands/index.d.ts.map +1 -1
  103. package/dist/commands/index.js +2 -0
  104. package/dist/commands/instructions/instructions.utils.d.ts +19 -0
  105. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  106. package/dist/commands/instructions/instructions.utils.js +89 -17
  107. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  108. package/dist/commands/instructions/sync/sync.js +49 -2
  109. package/dist/commands/pjm/init.d.ts.map +1 -1
  110. package/dist/commands/pjm/init.js +2 -2
  111. package/dist/commands/project/closeout-check/closeout-invariant.d.ts +97 -0
  112. package/dist/commands/project/closeout-check/closeout-invariant.d.ts.map +1 -0
  113. package/dist/commands/project/closeout-check/closeout-invariant.js +301 -0
  114. package/dist/commands/project/closeout-check/index.d.ts +38 -0
  115. package/dist/commands/project/closeout-check/index.d.ts.map +1 -0
  116. package/dist/commands/project/closeout-check/index.js +117 -0
  117. package/dist/commands/project/complete-state/index.d.ts +4 -0
  118. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  119. package/dist/commands/project/complete-state/index.js +11 -13
  120. package/dist/commands/project/dispatch/index.d.ts.map +1 -1
  121. package/dist/commands/project/dispatch/index.js +6 -30
  122. package/dist/commands/project/dispatch/record.d.ts +9 -18
  123. package/dist/commands/project/dispatch/record.d.ts.map +1 -1
  124. package/dist/commands/project/dispatch/record.js +15 -212
  125. package/dist/commands/project/index.d.ts.map +1 -1
  126. package/dist/commands/project/index.js +2 -0
  127. package/dist/commands/project/new/scaffold.d.ts +0 -1
  128. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  129. package/dist/commands/project/new/scaffold.js +19 -20
  130. package/dist/commands/project/promote/promote.d.ts +2 -2
  131. package/dist/commands/project/promote/promote.d.ts.map +1 -1
  132. package/dist/commands/project/promote/promote.js +13 -11
  133. package/dist/commands/shared/frontmatter.d.ts +21 -0
  134. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  135. package/dist/commands/shared/frontmatter.js +70 -4
  136. package/dist/commands/shared/template-source.d.ts +29 -0
  137. package/dist/commands/shared/template-source.d.ts.map +1 -0
  138. package/dist/commands/{pjm → shared}/template-source.js +24 -7
  139. package/dist/commands/state/generate.js +2 -2
  140. package/dist/commands/template/index.d.ts +10 -0
  141. package/dist/commands/template/index.d.ts.map +1 -0
  142. package/dist/commands/template/index.js +87 -0
  143. package/dist/commands/template/resolve.d.ts +31 -0
  144. package/dist/commands/template/resolve.d.ts.map +1 -0
  145. package/dist/commands/template/resolve.js +86 -0
  146. package/dist/fs/io.d.ts +0 -41
  147. package/dist/fs/io.d.ts.map +1 -1
  148. package/dist/fs/io.js +2 -414
  149. package/dist/providers/identity/absolute-paths.d.ts +4 -13
  150. package/dist/providers/identity/absolute-paths.d.ts.map +1 -1
  151. package/dist/providers/identity/absolute-paths.js +4 -17
  152. package/dist/providers/identity/generic-dispatch-record.d.ts +1 -1
  153. package/dist/providers/identity/generic-dispatch-record.js +2 -2
  154. package/dist/providers/identity/oat-dispatch-record.d.ts +4 -357
  155. package/dist/providers/identity/oat-dispatch-record.d.ts.map +1 -1
  156. package/dist/providers/identity/oat-dispatch-record.js +4 -236
  157. package/dist/release/public-package-contract.d.ts.map +1 -1
  158. package/dist/release/public-package-contract.js +12 -4
  159. package/dist/validation/skills.d.ts.map +1 -1
  160. package/dist/validation/skills.js +32 -6
  161. package/package.json +2 -2
  162. package/dist/commands/pjm/template-source.d.ts +0 -14
  163. package/dist/commands/pjm/template-source.d.ts.map +0 -1
package/README.md CHANGED
@@ -62,7 +62,8 @@ Use these commands when you want structured runtime/project state out of the CLI
62
62
  - `oat config dump --json` - emit merged OAT config with per-key source attribution
63
63
  - `oat project status --json` - emit the active project's full parsed control-plane state
64
64
  - `oat project list --json` - emit summary state for tracked projects under the configured projects root
65
- - `oat project complete-state <project-path>` - emit the canonical completed lifecycle shape into a tracked project's `state.md`
65
+ - `oat project closeout-check <project-path> --json` - report whether a configured, autonomous, or lite closeout's `oat_post_implement_sequence` snapshot permits terminal completion, and which step or approval owns it next (read-only)
66
+ - `oat project complete-state <project-path>` - emit the canonical completed lifecycle shape into a tracked project's `state.md`; refuses the same incomplete closeout `closeout-check` reports
66
67
 
67
68
  ## Requirements
68
69
 
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.10"
3
+ "oatVersion": "0.3.12"
4
4
  }
@@ -0,0 +1,13 @@
1
+ {
2
+ "title": "CLI Utilities",
3
+ "pages": [
4
+ "bootstrap",
5
+ "tool-packs",
6
+ "configuration",
7
+ "remote-project-management",
8
+ "config-and-local-state",
9
+ "project-log",
10
+ "backlog-lifecycle",
11
+ "workflow-gates"
12
+ ]
13
+ }
@@ -528,14 +528,20 @@ repository that adopted PJM with a user-scope pack is diagnosed correctly.
528
528
 
529
529
  ### Template precedence
530
530
 
531
- PJM templates resolve through three tiers, first match wins:
531
+ Project lifecycle and PJM templates resolve through three tiers, first match
532
+ wins (idea templates instead follow the ideas scope the ideas skills select):
532
533
 
533
534
  1. **Repository** — `.oat/templates/<name>` in this repo. An existing repository
534
535
  template is an owner override and is never rewritten by pack updates.
535
536
  2. **User** — `~/.oat/templates/<name>`, the managed default that
536
- `oat tools update --pack project-management --scope user` keeps current.
537
+ `oat tools update --pack <pack> --scope user` keeps current (`workflows`
538
+ for project lifecycle templates, `project-management` for PJM templates).
537
539
  3. **Bundle** — the templates shipped inside the installed CLI.
538
540
 
541
+ `oat template resolve <name>` reports which tier wins, and lifecycle skills
542
+ copy their templates with `oat template resolve <name> --output <path>`, so a
543
+ user-scope-only install needs no repository `.oat/templates/` directory.
544
+
539
545
  Delete a repository template to fall back to the managed user default. If a
540
546
  template is missing from all three tiers, the command errors rather than
541
547
  inventing content.
@@ -194,6 +194,19 @@ bookkeeping. Implementation, test, skill, template, workflow configuration, or
194
194
  unknown changed paths make the result stale and require a current final review
195
195
  and a new gate generation.
196
196
 
197
+ An operator can waive specific stale-making descendants, such as a test-only
198
+ fix, instead of rerunning the gate. The waiver is an append-only entry in
199
+ `oat_implement_exit_gate.waivers` recording who waived, the reason, the covered
200
+ commit range, the effective-delta fingerprint at the range end, and a UTC
201
+ timestamp; it never rewrites earlier provenance. Waivers are operator-only:
202
+ agents never infer or self-issue one, and an `OAT_AUTONOMOUS=1` run refuses to
203
+ write one. A later substantive change after the covered range makes the
204
+ generation stale again, and a malformed waiver fails closed. An interactive
205
+ implement run offers the waiver before it persists `stale`; an operator can
206
+ also give it when resuming implementation after `oat-project-next` reports
207
+ stale state. See
208
+ [Implementation Execution](../workflows/projects/implementation-execution.md).
209
+
197
210
  Only an artifact with `oat_review_invocation: gate` and the matching
198
211
  `oat_gate_run_id` can satisfy configured-gate provenance. A normal final
199
212
  review, phase review, or manually produced independent review cannot substitute
@@ -70,8 +70,14 @@ local `origin/main` tracking ref (falling back to a local `main` branch when no
70
70
  release fails locally the same way it fails in CI. Fetch first (`git fetch
71
71
  origin`) so that ref is current; a
72
72
  checkout with neither `origin/main` nor `main` skips the whole gate (CI uses
73
- `fetch-depth: 0`). Test files under `packages/cli/src/` count as publishable
74
- changes for this gate.
73
+ `fetch-depth: 0`). Test-only changes do not require the bump
74
+ (`DR-260927-test-only-paths-skip`): each public package's
75
+ `versionPolicyIgnorePatterns` in
76
+ `packages/cli/src/release/public-package-contract.ts` lists exactly the test
77
+ paths its `tsconfig.json` leaves out of `dist` (for `packages/cli`,
78
+ `src/**/*.test.ts` and `src/**/__tests__/**`), and a contract test fails if
79
+ the two diverge. A test helper or fixture that compiles into `dist` still
80
+ counts as a publishable change.
75
81
 
76
82
  CI runs neither `pnpm lint` nor `pnpm format`. `pnpm check` covers the
77
83
  formatting of `.agents/skills/**`, `apps/oat-docs/docs`, and `tools/smoke`
@@ -62,7 +62,13 @@ Documentation should ship with the code it explains. This page covers the core d
62
62
  pnpm -w run cli:source -- docs generate-index --docs-dir apps/oat-docs/docs --output apps/oat-docs/index.md
63
63
  ```
64
64
 
65
- - In MkDocs apps, use `oat docs nav sync` to refresh `mkdocs.yml` instead. Do not use MkDocs nav sync as the Fumadocs regeneration step.
65
+ - Then refresh the sidebar navigation. `oat docs nav sync` rewrites the committed `meta.json` files from the `## Contents` maps and reports any page no map lists; list the page in its directory's `## Contents` rather than editing `meta.json`. The build runs the read-only `--check` form and fails while the navigation is stale or a page is unlisted:
66
+
67
+ ```bash
68
+ pnpm -w run cli:source -- docs nav sync --target-dir apps/oat-docs
69
+ ```
70
+
71
+ - In MkDocs apps, the same `oat docs nav sync` command refreshes the `nav:` block in `mkdocs.yml` instead.
66
72
  - Use [Markdown Features](markdown-features.md) for supported syntax and examples.
67
73
 
68
74
  ## Agent guidance
@@ -0,0 +1,15 @@
1
+ {
2
+ "title": "Contributing",
3
+ "pages": [
4
+ "code",
5
+ "documentation",
6
+ "markdown-features",
7
+ "skills",
8
+ "design-principles",
9
+ "commit-conventions",
10
+ "hooks-and-safety",
11
+ "smoke-testing",
12
+ "updating-model-guidance",
13
+ "verifying-cursor-pins"
14
+ ]
15
+ }
@@ -143,15 +143,24 @@ Core rules:
143
143
  - the `## Contents` section should map sibling pages and immediate child directories
144
144
  - `## Contents` links should use `.md`-suffixed relative targets, including `subdir/index.md` for child directories
145
145
 
146
- For **MkDocs** apps, regenerate navigation after adding or moving pages:
146
+ Regenerate navigation after adding or moving pages. In **MkDocs** apps this
147
+ rewrites the `nav:` block in `mkdocs.yml`; in **Fumadocs** apps it writes the
148
+ committed `meta.json` files and reports any page no `## Contents` map lists:
147
149
 
148
150
  ```bash
149
151
  oat docs nav sync --target-dir apps/my-docs
150
152
  ```
151
153
 
152
- For **Fumadocs** apps, the app-root docs index manifest is generated from the
153
- Markdown file tree automatically via `predev`/`prebuild` hooks. You can also
154
- run it manually:
154
+ Generated Fumadocs `meta.json` is strict: a page no `## Contents` map lists
155
+ stays out of the sidebar. The `prebuild` script that `oat docs init` scaffolds
156
+ for Fumadocs does not run the read-only check. To make builds fail on stale
157
+ navigation or an unlisted page, as `apps/oat-docs` does, append
158
+ `&& oat docs nav sync --check` to it; the script runs from the app directory,
159
+ which `--target-dir` defaults to.
160
+
161
+ **Fumadocs** apps also have an app-root docs index manifest, generated from
162
+ the Markdown file tree automatically via `predev`/`prebuild` hooks. You can
163
+ also run it manually:
155
164
 
156
165
  ```bash
157
166
  oat docs generate-index --docs-dir docs
@@ -205,7 +214,7 @@ Important:
205
214
  3. `oat docs init --app-name my-docs`
206
215
  4. (optional) handle MkDocs migration as a separate workstream; use `oat docs migrate --docs-dir docs --config mkdocs.yml --apply` only for the syntax/frontmatter helper
207
216
  5. Author docs with `index.md` + `## Contents`
208
- 6. `oat docs nav sync --target-dir apps/my-docs` (MkDocs) or `oat docs generate-index` (Fumadocs)
217
+ 6. `oat docs nav sync --target-dir apps/my-docs` (both frameworks), plus `oat docs generate-index` (Fumadocs)
209
218
  7. `/oat-docs-analyze`
210
219
  8. `/oat-docs-apply`
211
220
  9. Repeat as the codebase changes
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Docs App Commands
3
- description: 'Docs scaffolding CLI surface for Fumadocs/MkDocs, migration helpers, Fumadocs index generation, and MkDocs nav sync.'
3
+ description: 'Docs scaffolding CLI surface for Fumadocs/MkDocs, migration helpers, Fumadocs index generation, and nav sync for both frameworks.'
4
4
  ---
5
5
 
6
6
  # Docs App Commands
@@ -11,7 +11,7 @@ and **MkDocs Material**.
11
11
 
12
12
  ## Quick Look
13
13
 
14
- - What it does: documents the docs-specific CLI surface for scaffolding apps, migrating markdown, generating Fumadocs app-root index manifests, and syncing MkDocs navigation.
14
+ - What it does: documents the docs-specific CLI surface for scaffolding apps, migrating markdown, generating Fumadocs app-root index manifests, and syncing MkDocs or Fumadocs navigation.
15
15
  - When to use it: when you already know you are working on a docs surface and need the exact command-level behavior.
16
16
  - Primary commands: `oat docs init`, `oat docs migrate`, `oat docs generate-index`, `oat docs nav sync`
17
17
 
@@ -22,7 +22,7 @@ and **MkDocs Material**.
22
22
  | `oat docs init` | Scaffold a new docs app (Fumadocs or MkDocs). |
23
23
  | `oat docs migrate` | Convert MkDocs admonitions to GFM callouts and inject frontmatter. |
24
24
  | `oat docs generate-index` | Generate a Fumadocs app-root docs index manifest from the Markdown file tree. |
25
- | `oat docs nav sync` | Regenerate MkDocs `mkdocs.yml` navigation from directory `index.md` maps. |
25
+ | `oat docs nav sync` | Regenerate `mkdocs.yml` nav or Fumadocs `meta.json` from `index.md` maps. |
26
26
  | `oat docs analyze` | CLI entrypoint that points users to the `oat-docs-analyze` skill. |
27
27
  | `oat docs apply` | CLI entrypoint that points users to the `oat-docs-apply` skill. |
28
28
 
@@ -30,7 +30,7 @@ and **MkDocs Material**.
30
30
 
31
31
  Use the framework-specific generated-artifact command:
32
32
 
33
- - Fumadocs apps run `fumadocs-mdx` and `oat docs generate-index`. In this repo, `predev` and `prebuild` regenerate `apps/oat-docs/index.md` from `apps/oat-docs/docs`.
33
+ - Fumadocs apps run `fumadocs-mdx` and `oat docs generate-index`. In this repo, `predev` and `prebuild` regenerate `apps/oat-docs/index.md` from `apps/oat-docs/docs`. Run `oat docs nav sync` yourself after structural changes to rewrite the committed `meta.json` sidebar files from authored directory `index.md` `## Contents` sections; the hooks never write them. `prebuild` runs `oat docs nav sync --check`, so a build fails when those files are stale or a page is unlisted.
34
34
  - MkDocs apps use `oat docs nav sync` to regenerate the `nav:` block in `mkdocs.yml` from authored directory `index.md` `## Contents` sections.
35
35
 
36
36
  Both frameworks keep authored `## Contents` sections as the source of local discovery. The generated artifact differs by framework.
@@ -183,17 +183,35 @@ script hooks.
183
183
 
184
184
  ## `oat docs nav sync`
185
185
 
186
- Use nav sync in MkDocs apps after adding, removing, or renaming docs pages.
186
+ Use nav sync after adding, removing, renaming, or reordering docs pages.
187
187
 
188
188
  The command reads only the reserved `## Contents` section from each directory
189
- `index.md` and regenerates the `nav:` block in `mkdocs.yml`.
190
-
191
- For Fumadocs apps, regenerate the root markdown manifest with `oat docs generate-index` instead.
189
+ `index.md`. It detects the framework from the app directory:
190
+
191
+ - **MkDocs** (`mkdocs.yml`): regenerates the `nav:` block in `mkdocs.yml`.
192
+ - **Fumadocs** (`source.config.ts`): writes one `meta.json` per docs directory
193
+ that has an `index.md`. `pages` follows the `## Contents` order with no
194
+ `"..."` rest entry, so a page no map lists stays out of the sidebar and is
195
+ reported by path (`unlisted` in `--json`). A link to a page in another
196
+ directory becomes a Fumadocs link entry, and the folder `title` comes from
197
+ the `index.md` frontmatter `title` or first heading. Files are compared by
198
+ meaning, so a rerun with no docs changes writes nothing. Commit the
199
+ generated `meta.json` files.
200
+
201
+ Use `--check` in builds and CI. It computes the same navigation, writes
202
+ nothing, and exits 1 when any generated file would change or, for Fumadocs,
203
+ any page or folder is unlisted, naming each one (`stale` and `unlisted` in
204
+ `--json`). This repository's `apps/oat-docs` `prebuild` runs it, so
205
+ `pnpm build:docs` fails on stale navigation.
206
+
207
+ Fumadocs apps also regenerate the root markdown manifest with
208
+ `oat docs generate-index`; the two commands write different artifacts.
192
209
 
193
210
  Example:
194
211
 
195
212
  ```bash
196
213
  oat docs nav sync --target-dir apps/oat-docs
214
+ oat docs nav sync --target-dir apps/oat-docs --check
197
215
  ```
198
216
 
199
217
  Related reference:
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Docs Tooling",
3
+ "pages": ["add-docs-to-a-repo", "commands", "workflows"]
4
+ }
@@ -18,7 +18,7 @@ Install the workflow skills with `oat tools install docs` (preferred) or
18
18
  - `oat docs init` scaffolds a docs app (Fumadocs or MkDocs)
19
19
  - `oat docs migrate` converts MkDocs admonitions to GFM callouts and injects frontmatter
20
20
  - `oat docs generate-index` generates a Fumadocs app-root docs index manifest from the Markdown file tree
21
- - `oat docs nav sync` regenerates MkDocs `mkdocs.yml` nav from `index.md` `## Contents` sections
21
+ - `oat docs nav sync` regenerates MkDocs `mkdocs.yml` nav, or strict Fumadocs `meta.json` files, from `index.md` `## Contents` sections
22
22
  - `oat docs analyze` and `oat docs apply` expose the workflow surface in CLI help
23
23
 
24
24
  ### Skills
@@ -67,7 +67,7 @@ skills.
67
67
  5. Keep local `## Contents` sections current
68
68
  6. Refresh generated artifacts:
69
69
  - **MkDocs:** `oat docs nav sync`
70
- - **Fumadocs:** `oat docs generate-index` (runs automatically via `predev`/`prebuild` hooks)
70
+ - **Fumadocs:** `oat docs nav sync` for the committed `meta.json` sidebar files (it reports pages no `## Contents` map lists), and `oat docs generate-index` for the root manifest (runs automatically via `predev`/`prebuild` hooks)
71
71
  7. Run `oat-docs-analyze`; by default it verifies the generated analysis artifact
72
72
  through `workflow.autoArtifactReview.analysis`
73
73
  8. Review the artifact and run `oat-docs-apply`
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "User Guide",
3
+ "pages": ["concepts"]
4
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "title": "OAT Documentation",
3
+ "pages": [
4
+ "index",
5
+ "quickstart",
6
+ "guide",
7
+ "provider-sync",
8
+ "workflows",
9
+ "docs-tooling",
10
+ "cli-utilities",
11
+ "contributing",
12
+ "reference"
13
+ ]
14
+ }
@@ -401,6 +401,14 @@ oat instructions validate --strategy symlink
401
401
 
402
402
  This keeps validation, preview, and repair aligned to the same expected file shape.
403
403
 
404
+ `--force` never overwrites a `CLAUDE.md` that an `AGENTS.md` resolves to,
405
+ whether through a symlink, a symlink chain, or a hard link, because that
406
+ `CLAUDE.md` holds the only copy of the instructions behind the link. Sync plans
407
+ a `skip` for it instead, with a reason such as
408
+ `AGENTS.md resolves to this CLAUDE.md, so it holds the instructions; kept`, and
409
+ leaves the file unchanged under every shim strategy, including in
410
+ `--dry-run` previews. Resolve that link by hand before repairing the pair.
411
+
404
412
  ## Manual-Repair Cases
405
413
 
406
414
  Some states are intentionally surfaced as drift but not auto-repaired.
@@ -0,0 +1,11 @@
1
+ {
2
+ "title": "Provider Sync",
3
+ "pages": [
4
+ "commands",
5
+ "config",
6
+ "instruction-sync",
7
+ "manifest-and-drift",
8
+ "providers",
9
+ "scope-and-surface"
10
+ ]
11
+ }
@@ -43,8 +43,8 @@ Rules are currently project-scoped canonical content. Unlike skills and agents,
43
43
  - `oat providers inspect`
44
44
  - `oat providers set`
45
45
  - `oat providers codex materialize`
46
- - `oat project dispatch record` (project-aware dispatch evidence only; never a
47
- provider launcher)
46
+ - `oat project dispatch record` (validates project-aware dispatch evidence and
47
+ writes nothing; never a provider launcher)
48
48
  - `oat project dispatch canonical-role` (read-only; prints the
49
49
  canonical-role-resolution event that `oat project dispatch record` accepts)
50
50
 
@@ -112,8 +112,7 @@ role-selection rejection and do not permit fallback.
112
112
 
113
113
  Project workflows construct and redact the complete dispatch payload before
114
114
  the native call, then record its accepted or `blocked-before-start` result in
115
- the project's run record; persisting it under the project's `dispatch/`
116
- directory is optional and off by default. The generic
115
+ the project's run record, which is the only launch record. The generic
117
116
  record remains provider-neutral. OAT-specific canonical role, rejection,
118
117
  fallback, and runtime facts live only under its `oat` namespace. A qualifying
119
118
  fallback is a fresh request that preserves exact target and controls and is
@@ -53,6 +53,7 @@ The first practical expansion path is to keep improving the existing owners: [Do
53
53
  | `oat docs ...` | Docs app bootstrap, migration, index generation, nav sync, and docs workflow entrypoints. | [Docs Tooling Commands](../docs-tooling/commands.md) |
54
54
  | `oat status` / `oat sync` / `oat providers ...` | Provider sync, drift inspection, provider configuration, and adoption behavior. | [Provider Sync](../provider-sync/index.md) |
55
55
  | `oat project ...` / `oat cleanup ...` | Project scaffolding, active-project status inspection, tracked-project listing, plan validation, archive creation, and project/artifact cleanup commands. | [Workflow & Projects](../workflows/projects/index.md) |
56
+ | `oat template resolve` | Resolve a lifecycle template in repository, user, then bundle order and optionally copy it into place. | [File Locations](file-locations.md) |
56
57
  | `oat review ...` | Review artifact discovery helpers, including latest-review resolution for project and ad-hoc review flows. | [Reviews](../workflows/projects/reviews.md) |
57
58
  | `oat repo ...` | Repository-level workflows such as archive sync and PR-comment analysis. | [Repository Analysis](../workflows/projects/repo-analysis.md) |
58
59
 
@@ -149,12 +150,14 @@ Notable commands introduced in the current CLI surface:
149
150
  - `oat project status --project-path <path>` - read from a repo-relative or absolute project path instead of `.oat/config.local.json`'s active project pointer. Combine it with `--field` or `--shell` when a skill has already resolved the target project path.
150
151
  - `oat project status --shell NAME=path ...` - print shell-safe assignments for one or more fields from one status read, e.g. `WORKFLOW_MODE='quick'`. This is the preferred multi-field read API for skills. See [Writing Skills → Reading project state](../contributing/skills.md#reading-project-state) for examples and the `npx`-backed `oat` shim contract.
151
152
  - `oat project promote <project-path> --to quick [--json]` - promote an authored lite project to quick mode. The command derives `discovery.md` from the lite plan's Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria; carries Product Behavior into Success Criteria and Technical Design into a carried-forward discovery section when those adaptive sections are present; preserves the original as `references/lite-plan.md`; and scaffolds a fresh quick `plan.md`. It refuses unsupported targets, non-lite or unreadable projects, an existing lite-plan reference, invalid authored sections, unresolved scope, unavailable templates, failed writes, or failed persistence. JSON output is `{ status: "promoted" | "refused", reason, files }`; `reason` is the stable categorical contract and refused results exit non-zero.
153
+ - `oat template resolve <name> [--output <path>] [--json]` - resolve a template in repository (`<repo>/.oat/templates/`), user (`~/.oat/templates/`), then bundled order and report `name`, `found`, `tier` (`repository` | `user` | `bundle`), and `path`. `path` is set only for the repository and user tiers; it is `null` for the bundled tier, so callers never depend on a package-manager path. `<name>` accepts `plan` or `plan.md` and rejects path separators and `..`. `--output <path>` copies the resolved content to that file, replacing an existing file, and does not create missing parent directories; JSON output adds the absolute `output` path. A template missing from every tier exits 1 with `found: false`. Lifecycle skills use `--output` to copy their artifact templates, so a user-scope-only install works without a repository `.oat/templates/` directory.
152
154
  - `oat review latest --json` - find the newest review artifact by `oat_generated_at`, scanning the active or specified project's `reviews/` and `reviews/archived/` directories plus ad-hoc review locations. Same-time candidates use target priority, then lifecycle recency (`final` > higher phase/task > lower phase/task). The JSON contract returns `path`, `scope`, `generatedAt`, `kind` (`project` or `adhoc`), `archived`, and `actionable`, with `null` values when no review exists. Archived project reviews remain discoverable as history but return `actionable: false`.
153
155
  - `oat project list --json` - summary state for tracked projects under the configured projects root
154
- - `oat project complete-state <project-path>` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout
156
+ - `oat project closeout-check <project-path> [--autonomous] [--json]` - read-only check of the closeout invariant: a closeout that must snapshot its post-implementation sequence cannot reach terminal completion until its `oat_post_implement_sequence` snapshot exists, every stored step is recorded complete, approval is recorded, and the snapshot reached `status: complete`. A snapshot is required when the effective layered `workflow.postImplementSequence` is configured, when the closeout is autonomous (`--autonomous`, or `OAT_AUTONOMOUS=1` in the environment even without the flag), or when `oat_workflow_mode` is `lite`. Once a snapshot exists its recorded state is authoritative and current configuration is not consulted. JSON output reports `status` (`complete`, `not_required`, or `incomplete`), the missing `invariant` (`snapshot_missing`, `snapshot_malformed`, `sequence_failed`, `pre_approval_step_pending`, `approval_pending`, `post_approval_step_pending`, or `sequence_not_complete`), `route` (`oat-project-implement` when incomplete), `nextOwner` (the next stored step and its skill, or the approval), and the evaluated `inputs`. An incomplete or malformed result exits 1.
157
+ - `oat project complete-state <project-path> [--archived] [--autonomous]` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout. It first evaluates the same closeout invariant as `oat project closeout-check` and refuses, with the same message and without writing, a configured, autonomous, or lite closeout whose snapshot is absent, malformed, or incomplete. A project whose implementation finished before closeout snapshots existed recovers by running `oat-project-implement`, which persists the snapshot (`completion-and-closeout.md` Step 15) and completes its stored steps; there is no override flag. An unconfigured, interactive, non-lite closeout without a snapshot completes as before.
155
158
  - `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive stages the selected complete package into `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>/`, verifies every manifest-declared file byte, then atomically installs the export before deleting the active project. Existing destinations, incomplete inventory coverage, stale bytes, path escapes, and recipe mismatches fail without removing the active project. For synced projects, a configured S3 upload must succeed before terminal cleanup. Successful closeout makes `refs/oat/completed/<project>` authoritative, deletes the tracked JSON record and nested checkout, and leaves archive metadata sufficient for an idempotent recordless retry. With `--json`, the terminal receipt reports `completedRef`, `verifiedSourceSha`, whether `activeAliasDisposition` was `retained` or `removed`, whether `recordRetired` completed, and the parent `lifecycleCommit`. `--no-commit` is a manual/library-only option: for a synced project it still removes the checkout but deliberately leaves `lifecycleCommit` null. Never pass it through `oat-project-complete`, which requires that receipt.
156
159
  - `oat repo archive sync [project-name]` - hydrate archived project snapshots from the configured repo-scoped S3 archive into `.oat/projects/archived/`. The old `oat project archive sync` path remains as a deprecated shim.
157
- - `oat project dispatch record --event-file <json-file-or-dash> [--project <project-path>]` - validate one generic dispatch record plus its namespaced OAT evidence event, and persist it into the project's append-only `dispatch/` journal (optional; no lifecycle skill requires persistence). Omit `--project` to validate without persisting. Managed, effort-pinned Claude launches use the validation-only form before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. One validation run reports every violation across `claudeLaunch`, `recordBase`, and `event` in a single error message, one `stage path: message` line each; the `recordBase` cross-field rules run even when a required field is missing, checks that need a value that failed to parse are skipped and named on a final line, secret-shaped values and absolute paths are scrubbed from the message, and the exit code stays 1. A validated input per role is published at `.agents/skills/oat-dispatch-subagents/references/managed-claude-example.json`. Revision 1 is `dispatch/<request-id>.json` and every later revision is `dispatch/<request-id>@<NNNN>.json`; superseded revisions are never replaced or removed. The command validates and records evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never persisted, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
160
+ - `oat project dispatch record --event-file <json-file-or-dash>` - validate one generic dispatch record plus its namespaced OAT evidence event and print the result with `status: validated-only`. The command writes nothing; launches are recorded in the calling workflow's run record. Managed, effort-pinned Claude launches run it before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. One validation run reports every violation across `claudeLaunch`, `recordBase`, and `event` in a single error message, one `stage path: message` line each; the `recordBase` cross-field rules run even when a required field is missing, checks that need a value that failed to parse are skipped and named on a final line, secret-shaped values and absolute paths are scrubbed from the message, and the exit code stays 1. A validated input per role is published at `.agents/skills/oat-dispatch-subagents/references/managed-claude-example.json`. The command validates evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never echoed in the output, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
158
161
  - `oat project dispatch canonical-role --role <name> --request-id <id> --skill-dir <dir> [--json]` - resolve a canonical role through the loaded, user (`$HOME/.agents`), and project (`<repo>/.agents`) tiers and print the `canonical-role-resolution` event that `oat project dispatch record` accepts unchanged: redacted `canonicalPath` and `selectedPath` in the form `<loaded|user|project>/agents/<name>.md`, the role's `contentDigest`, and `candidateMisses`. `--skill-dir` is required because the loaded tier is derived from the loaded skill's directory; a missing or invalid directory exits 1 with a redacted error. An unknown role prints `missing` evidence with its recovery commands. Read-only; the dependency is the `workflows` pack.
159
162
  - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
160
163
  - `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../cli-utilities/project-log.md).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Docs Index Contract
3
- description: 'Docs source contract: authored index.md maps, generated Fumadocs manifests, and MkDocs nav sync.'
3
+ description: 'Docs source contract: authored index.md maps, generated Fumadocs manifests and meta.json navigation, and MkDocs nav sync.'
4
4
  ---
5
5
 
6
6
  # Docs Index Contract
@@ -15,7 +15,7 @@ OAT docs navigation starts from authored `docs/**/index.md` files. Each `## Cont
15
15
  - Every `## Contents` link should use a `.md`-suffixed relative target, including child directory links such as `subdir/index.md`.
16
16
  - Do not hand-edit generated navigation or generated root-index artifacts.
17
17
  - For Fumadocs, refresh or freshness-check the generated app-root manifest after adding, removing, or renaming Markdown files. Compare that manifest against authored `## Contents` maps for drift; reordering `## Contents` does not reorder the generated manifest's file-tree sort.
18
- - For MkDocs, run `oat docs nav sync` after adding, removing, renaming, or reordering pages. It regenerates `mkdocs.yml` from authored `## Contents` maps and preserves the order declared in each local map.
18
+ - Run `oat docs nav sync` after adding, removing, renaming, or reordering pages. It regenerates the framework's navigation from authored `## Contents` maps and preserves the order declared in each local map: the `nav:` block in `mkdocs.yml` for MkDocs, and one `meta.json` per docs directory for Fumadocs.
19
19
 
20
20
  ## `## Contents` format
21
21
 
@@ -37,7 +37,7 @@ Notes:
37
37
 
38
38
  ## Fumadocs Generation
39
39
 
40
- For this Fumadocs app, rendered page routing and sidebar data come from the Fumadocs file/source pipeline over `apps/oat-docs/docs`. The generated root manifest, `apps/oat-docs/index.md`, is an inventory for agents and tooling; it is not the rendered sidebar/page-tree source.
40
+ For this Fumadocs app, rendered page routing comes from the Fumadocs file/source pipeline over `apps/oat-docs/docs`, and the sidebar order comes from the committed `meta.json` files that `oat docs nav sync` writes (see [Fumadocs Nav Sync](#fumadocs-nav-sync)). The generated root manifest, `apps/oat-docs/index.md`, is an inventory for agents and tooling; it is not the rendered sidebar/page-tree source.
41
41
 
42
42
  `oat docs generate-index` walks the Markdown file tree under `docs/` and writes the app-root generated manifest. The app scripts run:
43
43
 
@@ -46,7 +46,7 @@ fumadocs-mdx
46
46
  pnpm -w run cli:source -- docs generate-index --docs-dir apps/oat-docs/docs --output apps/oat-docs/index.md
47
47
  ```
48
48
 
49
- `oat docs generate-index` rewrites the generated root manifest from the docs source tree. It is the command to use after adding, removing, or retiring pages in this Fumadocs app. Do not use `oat docs nav sync` as the Fumadocs regeneration step.
49
+ `oat docs generate-index` rewrites the generated root manifest from the docs source tree. Run it after adding, removing, or retiring pages in this Fumadocs app, and run `oat docs nav sync` as well so the sidebar's `meta.json` files follow the same change. The two commands produce different artifacts: `generate-index` writes the agent-facing inventory and `nav sync` writes the sidebar navigation.
50
50
 
51
51
  Fumadocs generated behavior:
52
52
 
@@ -54,6 +54,23 @@ Fumadocs generated behavior:
54
54
  - Reordering a `## Contents` block does not reorder the generated manifest's file-tree sort.
55
55
  - Generated manifests should carry an autogen warning and are rewritten by `predev` / `prebuild`.
56
56
 
57
+ ## Fumadocs Nav Sync
58
+
59
+ In a Fumadocs app (detected by its `source.config.ts`), `oat docs nav sync --target-dir <docs-app-dir>` writes one `meta.json` beside every docs directory `index.md`. The files are generated and committed; edit the `## Contents` map, not the `meta.json`.
60
+
61
+ Fumadocs generated behavior:
62
+
63
+ - `pages` follows the order of the directory's `## Contents` links. The root list starts with `index`; a child directory appears by its folder name, and its own `index.md` becomes that folder's landing page. A folder whose `meta.json` keeps `root: true` also lists `index` first, because Fumadocs gives a root folder no implicit landing page.
64
+ - Navigation is strict: there is no `"..."` rest entry. A page or folder that no `## Contents` map lists stays out of the sidebar, and the command reports it by path in its human output and in `--json` (`unlisted`). Add the page to its directory's `## Contents` map to show it.
65
+ - A `## Contents` link to a page in another directory is written as a Fumadocs link entry such as `[Writing Skills](/contributing/skills)`, so each page belongs to exactly one folder.
66
+ - A page or folder whose name Fumadocs would read as a `pages` directive, such as `!hidden`, `z...a`, `...name`, or `---`, is written in the local-path form `./!hidden` so it stays a page entry.
67
+ - The folder `title` comes from the `index.md` frontmatter `title`, falling back to its first `#` heading.
68
+ - Keys nav sync does not own, such as `icon` or `defaultOpen`, are kept.
69
+ - Existing files are compared by meaning, not bytes, so a second run with no docs changes writes nothing, even after a formatter rewrites the files.
70
+ - `.md` and `.mdx` pages can both be listed; each appears in `pages` by its file name without the extension.
71
+
72
+ `oat docs nav sync --check` computes the same result and writes nothing. It exits 1 when a `meta.json` file would change or a page or folder is unlisted, and names each one. In this app, `prebuild` runs it, so `pnpm build:docs` fails until the `## Contents` maps and the committed `meta.json` files agree.
73
+
57
74
  ## MkDocs Nav Sync
58
75
 
59
76
  MkDocs apps use `oat docs nav sync --target-dir <docs-app-dir>` to walk the docs tree from `docs/index.md` downward and regenerate the `nav:` block in `mkdocs.yml` from discovered directory `index.md` files.
@@ -69,7 +86,7 @@ MkDocs generated behavior:
69
86
 
70
87
  - Edit authored files under `docs/`, especially the nearest `index.md` and `## Contents`.
71
88
  - Do not hand-edit a Fumadocs app-root generated `index.md`; regenerate it from the docs source tree.
72
- - Do not hand-maintain MkDocs `nav:` entries when the local workflow uses `oat docs nav sync`.
89
+ - Do not hand-maintain MkDocs `nav:` entries or Fumadocs `meta.json` `pages` lists when the local workflow uses `oat docs nav sync`.
73
90
  - If a Fumadocs generated manifest lists pages that are missing from authored `## Contents`, treat that as authored-source drift or intentional generator-inventory behavior to verify before relying on the generated file as navigation evidence.
74
91
 
75
92
  ## Authoring guidance
@@ -77,7 +94,7 @@ MkDocs generated behavior:
77
94
  - Use `index.md` as the local discovery surface for humans and agents.
78
95
  - Add a short topic description next to each link so agents can choose the right file without opening every page.
79
96
  - Update `## Contents` whenever you add, remove, rename, or reorder docs files in a directory.
80
- - Regenerate the framework-specific artifact after structural changes: `generate-index` for Fumadocs root manifests, `nav sync` for MkDocs `mkdocs.yml`.
97
+ - Regenerate the framework-specific artifacts after structural changes: `nav sync` for MkDocs `mkdocs.yml` and Fumadocs `meta.json` navigation, plus `generate-index` for Fumadocs root manifests.
81
98
  - Refresh or freshness-check the generated artifact before committing structural docs changes.
82
99
 
83
100
  ## If You Are Trying To...
@@ -38,7 +38,12 @@ columns are ordinary states.
38
38
 
39
39
  Project-scope templates under `.oat/templates/` are owner overrides that OAT
40
40
  seeds once and never rewrites; the managed default lives at user scope and in
41
- the bundle. PJM templates resolve repository → user → bundle.
41
+ the bundle. Project lifecycle and PJM templates resolve repository → user →
42
+ bundle. Run `oat template resolve <name>` to see which tier supplies one, or
43
+ add `--output <path>` to copy it. Idea templates under `ideas/` are different:
44
+ the ideas skills select `.oat/templates/ideas/` or `~/.oat/templates/ideas/` by
45
+ the ideas scope, and `oat template resolve` does not search nested
46
+ directories.
42
47
 
43
48
  Pack intent is stored per scope:
44
49
 
@@ -172,7 +177,7 @@ Archive sync surfaces:
172
177
  - `packages/cli/src/commands/docs/init/` — scaffold a docs app (Fumadocs or MkDocs)
173
178
  - `packages/cli/src/commands/docs/migrate/` — convert MkDocs admonitions to GFM callouts
174
179
  - `packages/cli/src/commands/docs/index-generate/` — generate a docs index from markdown files
175
- - `packages/cli/src/commands/docs/nav/` — regenerate mkdocs.yml nav from index.md sections
180
+ - `packages/cli/src/commands/docs/nav/` — regenerate mkdocs.yml nav or Fumadocs meta.json from index.md sections
176
181
  - `packages/cli/src/commands/instructions/`
177
182
  - `packages/cli/src/commands/project/`
178
183
  - `packages/cli/src/commands/internal/`
@@ -13,7 +13,7 @@ Contributor how-to material now lives under `contributing/`, and user-facing rou
13
13
 
14
14
  - [CLI Reference](cli-reference.md) - Shallow map of the OAT command surface with links to owning sections.
15
15
  - [File Locations](file-locations.md) - Where core OAT files, assets, and artifacts live.
16
- - [Docs Index Contract](docs-index-contract.md) - Authored `index.md` maps, `.md` links, generated Fumadocs manifests, and MkDocs nav sync boundaries.
16
+ - [Docs Index Contract](docs-index-contract.md) - Authored `index.md` maps, `.md` links, generated Fumadocs manifests, and MkDocs and Fumadocs nav sync boundaries.
17
17
  - [OAT Directory Structure](oat-directory-structure.md) - Canonical `.oat/` tree map and the role of each major directory.
18
18
  - [Troubleshooting](troubleshooting.md) - Common issues, diagnostics, and remediation guidance.
19
19
 
@@ -0,0 +1,10 @@
1
+ {
2
+ "title": "Reference",
3
+ "pages": [
4
+ "cli-reference",
5
+ "file-locations",
6
+ "docs-index-contract",
7
+ "oat-directory-structure",
8
+ "troubleshooting"
9
+ ]
10
+ }
@@ -97,6 +97,27 @@ Use [Instruction Sync](../provider-sync/instruction-sync.md) for the full strate
97
97
  - Per-pack install commands no longer accept the previously inert `--force`
98
98
  option.
99
99
 
100
+ ## A skill fails with `unknown command 'template'` or `'closeout-check'`
101
+
102
+ Lifecycle skills from OAT 0.3.11 copy their templates with
103
+ `oat template resolve` and check closeout with `oat project closeout-check`.
104
+ An older `oat` on `PATH` rejects both:
105
+
106
+ ```text
107
+ error: unknown command 'template'
108
+ error: unknown command 'closeout-check'
109
+ ```
110
+
111
+ `oat-project-complete` treats a failed closeout check as an incomplete
112
+ closeout, so with an older CLI it stops and routes back to
113
+ `oat-project-implement` even when every closeout step is done. This happens
114
+ when the skills a host loads are newer than the CLI, for example repository
115
+ skills from a newer checkout run against an older global CLI.
116
+
117
+ Check `oat --version`. Install `@open-agent-toolkit/cli` 0.3.11 or later, then
118
+ refresh the installed skills to that CLI's bundle with
119
+ `oat tools update --all`.
120
+
100
121
  ## `sync` reports an unsafe provider parent
101
122
 
102
123
  Errors containing `Unsafe provider parent`, `symbolic links are not allowed in
@@ -200,7 +221,13 @@ OAT could not read the canonical managed-pack inventory. `oat status` keeps the
200
221
  rest of the report available and returns `packs.availability.status` as
201
222
  `unavailable` in JSON, with an empty `packs.states` array and a structured
202
223
  diagnostic. `oat doctor` emits the same condition as a warning instead of
203
- stopping its other checks. Reported project and home paths remain redacted.
224
+ stopping its other checks.
225
+
226
+ The diagnostic message redacts only the roots that are part of the run: the
227
+ project root becomes a relative path (or `.`) when project scope is checked,
228
+ and the home root becomes `~` when user scope is checked. Redaction is a literal
229
+ replacement of those exact root paths, so a path outside them, such as a global
230
+ bundle path in an assets error, stays absolute in the message.
204
231
 
205
232
  Rebuild the CLI workspace, then rerun the command named in the diagnostic:
206
233
 
@@ -269,16 +296,24 @@ oat pjm init
269
296
  scaffold — rerun `oat pjm init`), or `none`. `oat pjm init` records
270
297
  `pjm.initialized` in `.oat/config.json` after verifying the canonical scaffold.
271
298
 
272
- ## A PJM template change is not taking effect
299
+ ## A template change is not taking effect
300
+
301
+ Project lifecycle and PJM templates resolve repository → user → bundle, first
302
+ match wins (idea templates follow the ideas scope instead). A repository
303
+ template under `.oat/templates/` is an owner override that pack updates never
304
+ rewrite, so it shadows the managed user default. Check which tier supplies a
305
+ template:
273
306
 
274
- PJM templates resolve repository → user → bundle, first match wins. A
275
- repository template under `.oat/templates/` is an owner override that pack
276
- updates never rewrite, so it shadows the managed user default.
307
+ ```bash
308
+ oat template resolve plan
309
+ ```
277
310
 
278
311
  Delete the repository copy to fall back to the managed default, or update the
279
- managed default itself:
312
+ managed default itself (`workflows` owns the project lifecycle templates,
313
+ `project-management` the PJM templates):
280
314
 
281
315
  ```bash
316
+ oat tools update --pack workflows --scope user
282
317
  oat tools update --pack project-management --scope user
283
318
  ```
284
319
 
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Ideas Workflow",
3
+ "pages": ["lifecycle"]
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Agentic Workflows",
3
+ "pages": ["ideas", "projects", "wave-workflows", "skills"]
4
+ }
@@ -95,9 +95,14 @@ dispatch records, prompts, logs, or the VM image.
95
95
  ## User-scope asset precedence
96
96
 
97
97
  In provisioned cloud environments, the user-scope installation is the execution
98
- source for every OAT asset class: skills, templates, and scripts. The user tier
99
- is refreshed from the published package during environment setup; repository
100
- copies are compatibility context, not an override.
98
+ source for skills and scripts. The user tier is refreshed from the published
99
+ package during environment setup; repository copies of skills and scripts are
100
+ compatibility context, not an override.
101
+
102
+ Templates are the exception. They resolve repository, then user, then bundled,
103
+ the same order as everywhere else, because a repository template is an owner
104
+ override. Agents resolve and copy them with `oat template resolve <name>
105
+ --output <destination>` rather than reading `~/.oat/templates/` directly.
101
106
 
102
107
  For skills, compare frontmatter versions as a freshness check:
103
108