@open-agent-toolkit/cli 0.3.12 → 0.3.14

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 (152) hide show
  1. package/README.md +1 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/contributing/index.md +14 -1
  4. package/assets/docs/contributing/skills.md +64 -2
  5. package/assets/docs/contributing/smoke-testing.md +3 -3
  6. package/assets/docs/contributing/updating-model-guidance.md +2 -2
  7. package/assets/docs/contributing/verifying-cursor-pins.md +1 -1
  8. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +112 -15
  9. package/assets/docs/docs-tooling/agent-instructions.md +131 -0
  10. package/assets/docs/docs-tooling/commands.md +74 -30
  11. package/assets/docs/docs-tooling/index.md +7 -6
  12. package/assets/docs/docs-tooling/meta.json +1 -1
  13. package/assets/docs/docs-tooling/workflows.md +357 -11
  14. package/assets/docs/{cli-utilities → getting-started}/bootstrap.md +60 -5
  15. package/assets/docs/{guide → getting-started}/concepts.md +28 -10
  16. package/assets/docs/getting-started/index.md +68 -0
  17. package/assets/docs/getting-started/meta.json +4 -0
  18. package/assets/docs/getting-started/quickstart.md +174 -0
  19. package/assets/docs/{cli-utilities → getting-started}/tool-packs.md +146 -15
  20. package/assets/docs/index.md +47 -48
  21. package/assets/docs/meta.json +6 -7
  22. package/assets/docs/provider-sync/commands.md +26 -3
  23. package/assets/docs/provider-sync/config.md +60 -1
  24. package/assets/docs/provider-sync/index.md +31 -15
  25. package/assets/docs/provider-sync/instruction-sync.md +43 -5
  26. package/assets/docs/provider-sync/manifest-and-drift.md +85 -0
  27. package/assets/docs/provider-sync/meta.json +1 -0
  28. package/assets/docs/provider-sync/pilot-with-a-team.md +236 -0
  29. package/assets/docs/provider-sync/scope-and-surface.md +37 -3
  30. package/assets/docs/reference/cli-reference.md +34 -34
  31. package/assets/docs/{cli-utilities → reference}/config-and-local-state.md +25 -9
  32. package/assets/docs/{cli-utilities → reference}/configuration.md +151 -34
  33. package/assets/docs/reference/docs-index-contract.md +19 -4
  34. package/assets/docs/reference/file-locations.md +7 -2
  35. package/assets/docs/reference/index.md +13 -1
  36. package/assets/docs/reference/meta.json +7 -1
  37. package/assets/docs/reference/oat-directory-structure.md +24 -22
  38. package/assets/docs/{workflows/projects/artifacts.md → reference/project-artifacts.md} +4 -4
  39. package/assets/docs/{workflows/projects/state-machine.md → reference/project-state-machine.md} +1 -1
  40. package/assets/docs/{workflows/projects/repo-analysis.md → reference/repository-pr-comments.md} +2 -2
  41. package/assets/docs/reference/troubleshooting.md +125 -10
  42. package/assets/docs/reference/what-oat-writes.md +410 -0
  43. package/assets/docs/skills/brainstorm.md +77 -0
  44. package/assets/docs/skills/diagnostics.md +56 -0
  45. package/assets/docs/{workflows/skills → skills}/explainer-kit.md +121 -0
  46. package/assets/docs/skills/index.md +416 -0
  47. package/assets/docs/{workflows/skills → skills}/meta.json +4 -2
  48. package/assets/docs/{workflows/skills → skills}/recon.md +49 -0
  49. package/assets/docs/skills/repo-improve.md +254 -0
  50. package/assets/docs/skills/research.md +237 -0
  51. package/assets/docs/skills/session-closeout.md +61 -0
  52. package/assets/docs/workflows/advanced/autonomy.md +344 -0
  53. package/assets/docs/workflows/{projects → advanced}/cursor-cloud.md +69 -1
  54. package/assets/docs/workflows/{projects → advanced}/dispatch-ceiling.md +163 -18
  55. package/assets/docs/workflows/{projects → advanced}/evidence-layers.md +1 -1
  56. package/assets/docs/workflows/advanced/index.md +19 -0
  57. package/assets/docs/workflows/advanced/meta.json +13 -0
  58. package/assets/docs/workflows/{projects → advanced}/orchestration-model.md +63 -4
  59. package/assets/docs/workflows/{projects → advanced}/programmatic-execution.md +4 -4
  60. package/assets/docs/{cli-utilities → workflows/advanced}/workflow-gates.md +162 -8
  61. package/assets/docs/workflows/advanced/worktree-bootstrap.md +83 -0
  62. package/assets/docs/workflows/approvals-and-automation.md +261 -0
  63. package/assets/docs/workflows/backlog-and-planning/backlog-lifecycle.md +348 -0
  64. package/assets/docs/workflows/backlog-and-planning/index.md +13 -0
  65. package/assets/docs/workflows/backlog-and-planning/meta.json +4 -0
  66. package/assets/docs/workflows/backlog-and-planning/remote-project-management.md +303 -0
  67. package/assets/docs/workflows/choose-workflow.md +114 -0
  68. package/assets/docs/workflows/ideas/index.md +3 -3
  69. package/assets/docs/workflows/ideas/lifecycle.md +218 -1
  70. package/assets/docs/workflows/index.md +11 -62
  71. package/assets/docs/workflows/meta.json +10 -2
  72. package/assets/docs/workflows/projects/closeout/closeout-skills.md +538 -0
  73. package/assets/docs/workflows/projects/closeout/index.md +14 -0
  74. package/assets/docs/workflows/projects/closeout/meta.json +4 -0
  75. package/assets/docs/workflows/projects/{pr-flow.md → closeout/pr-flow.md} +1 -1
  76. package/assets/docs/workflows/projects/{retro.md → closeout/retro.md} +1 -1
  77. package/assets/docs/workflows/projects/execution/execution-skills.md +258 -0
  78. package/assets/docs/workflows/projects/{implementation-execution.md → execution/implementation-execution.md} +8 -8
  79. package/assets/docs/workflows/projects/execution/index.md +15 -0
  80. package/assets/docs/workflows/projects/execution/meta.json +9 -0
  81. package/assets/docs/workflows/projects/execution/picking-up-projects.md +376 -0
  82. package/assets/docs/{cli-utilities → workflows/projects/execution}/project-log.md +1 -1
  83. package/assets/docs/workflows/projects/index.md +38 -49
  84. package/assets/docs/workflows/projects/lifecycle.md +47 -11
  85. package/assets/docs/workflows/projects/meta.json +2 -23
  86. package/assets/docs/workflows/projects/{design-modes.md → planning/design-modes.md} +29 -0
  87. package/assets/docs/workflows/projects/planning/hill-checkpoints.md +167 -0
  88. package/assets/docs/workflows/projects/planning/index.md +16 -0
  89. package/assets/docs/workflows/projects/planning/meta.json +10 -0
  90. package/assets/docs/workflows/projects/planning/planning-skills.md +381 -0
  91. package/assets/docs/workflows/projects/{splitting.md → planning/splitting.md} +3 -3
  92. package/assets/docs/workflows/projects/planning/starting-projects.md +511 -0
  93. package/assets/docs/workflows/projects/{reviews.md → reviews/index.md} +51 -5
  94. package/assets/docs/workflows/projects/reviews/meta.json +4 -0
  95. package/assets/docs/workflows/projects/reviews/review-flavors.md +643 -0
  96. package/assets/docs/workflows/projects/{reviewing-oat-prs.md → reviews/reviewing-oat-prs.md} +3 -3
  97. package/assets/docs/workflows/waves/index.md +12 -0
  98. package/assets/docs/workflows/waves/meta.json +4 -0
  99. package/assets/docs/workflows/waves/wave-workflows.md +206 -0
  100. package/assets/public-package-versions.json +4 -4
  101. package/assets/skills/oat-docs/SKILL.md +19 -19
  102. package/assets/skills/oat-docs-analyze/SKILL.md +27 -7
  103. package/assets/skills/oat-docs-analyze/references/quality-checklist.md +16 -3
  104. package/assets/skills/oat-docs-apply/SKILL.md +20 -3
  105. package/assets/skills/oat-docs-authoring/SKILL.md +11 -7
  106. package/assets/skills/oat-docs-authoring/references/docs-root-resolution.md +12 -5
  107. package/assets/skills/oat-docs-authoring/references/lifecycle-boundaries.md +7 -7
  108. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +13 -3
  109. package/assets/skills/oat-docs-authoring/references/targeted-authoring-workflow.md +5 -4
  110. package/assets/skills/oat-docs-authoring/references/validation.md +11 -1
  111. package/assets/skills/oat-docs-bootstrap/SKILL.md +31 -8
  112. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +2 -1
  113. package/assets/skills/oat-doctor/SKILL.md +25 -25
  114. package/assets/skills/oat-project-document/SKILL.md +21 -2
  115. package/assets/templates/docs-markdown/contributing.md +35 -0
  116. package/assets/templates/docs-markdown/index.md +18 -0
  117. package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
  118. package/dist/commands/docs/index-generate/index.js +41 -8
  119. package/dist/commands/docs/init/index.d.ts +17 -2
  120. package/dist/commands/docs/init/index.d.ts.map +1 -1
  121. package/dist/commands/docs/init/index.js +194 -14
  122. package/dist/commands/docs/init/markdown.d.ts +39 -0
  123. package/dist/commands/docs/init/markdown.d.ts.map +1 -0
  124. package/dist/commands/docs/init/markdown.js +317 -0
  125. package/dist/commands/docs/init/resolve-options.d.ts +3 -1
  126. package/dist/commands/docs/init/resolve-options.d.ts.map +1 -1
  127. package/dist/commands/docs/init/resolve-options.js +36 -0
  128. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  129. package/dist/commands/docs/init/scaffold.js +11 -0
  130. package/dist/commands/shared/agents-md.d.ts +7 -0
  131. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  132. package/dist/commands/shared/agents-md.js +131 -91
  133. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  134. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  135. package/dist/config/oat-config.d.ts +2 -1
  136. package/dist/config/oat-config.d.ts.map +1 -1
  137. package/dist/config/oat-config.js +4 -2
  138. package/package.json +2 -2
  139. package/assets/docs/cli-utilities/backlog-lifecycle.md +0 -80
  140. package/assets/docs/cli-utilities/index.md +0 -74
  141. package/assets/docs/cli-utilities/meta.json +0 -13
  142. package/assets/docs/cli-utilities/remote-project-management.md +0 -191
  143. package/assets/docs/guide/index.md +0 -31
  144. package/assets/docs/guide/meta.json +0 -4
  145. package/assets/docs/quickstart.md +0 -88
  146. package/assets/docs/workflows/projects/autonomy.md +0 -196
  147. package/assets/docs/workflows/projects/hill-checkpoints.md +0 -93
  148. package/assets/docs/workflows/projects/picking-up-projects.md +0 -124
  149. package/assets/docs/workflows/projects/review-flavors.md +0 -138
  150. package/assets/docs/workflows/skills/index.md +0 -184
  151. package/assets/docs/workflows/skills/repo-improve.md +0 -89
  152. package/assets/docs/workflows/wave-workflows.md +0 -77
@@ -12,10 +12,10 @@ Use this guide when you need to answer two questions quickly:
12
12
 
13
13
  For the deep file-by-file reference, see:
14
14
 
15
- - [File Locations](../reference/file-locations.md)
16
- - [`.oat` Directory Structure](../reference/oat-directory-structure.md)
15
+ - [File Locations](file-locations.md)
16
+ - [`.oat` Directory Structure](oat-directory-structure.md)
17
17
  - [Sync Config (`.oat/sync/config.json`)](../provider-sync/config.md)
18
- - [Remote Project Management](remote-project-management.md)
18
+ - [Remote Project Management](../workflows/backlog-and-planning/remote-project-management.md)
19
19
 
20
20
  ## The five config surfaces
21
21
 
@@ -44,15 +44,15 @@ oat config list
44
44
  oat config get projects.root
45
45
  oat config describe
46
46
  oat config describe archive.s3Uri
47
- oat config describe sync.providers.github.enabled
47
+ oat config describe sync.providers.copilot.enabled
48
48
  ```
49
49
 
50
50
  What each command is for:
51
51
 
52
52
  - `oat config list` shows the currently resolved command-surface values for shared and repo-local keys.
53
53
  - `oat config get <key>` reads one supported key value.
54
- - `oat config set <key> <value>` updates supported shared or repo-local keys. Writes to the shared `.oat/config.json` keep the file's existing key order, and a write that would not change any value leaves the file byte-identical.
55
- - `oat config unset <key>` removes a supported key from one surface, using the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. The resolved value then falls back to the next surface down, or to the built-in default. A key the surface does not hold exits 0 as already-unset (`--json` adds a `removed` boolean to tell the two apart). Unknown keys, lifecycle state, `tools.*` pack intent, aggregate read views, read-only remote-policy structure, and environment-shadowed keys with nothing stored are refused with exit 1 — see [CLI Reference](../reference/cli-reference.md#oat-config-surface-flags).
54
+ - `oat config set <key> <value>` updates supported shared, repo-local, or user keys according to per-key restrictions. Writes to the shared `.oat/config.json` keep the file's existing key order, and a write that would not change any value leaves the file byte-identical.
55
+ - `oat config unset <key>` removes a supported key from one surface, using the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. The resolved value then falls back to the next surface down, or to the built-in default. A key the surface does not hold exits 0 as already-unset (`--json` adds a `removed` boolean to tell the two apart). Unknown keys, lifecycle state, `tools.*` pack intent, aggregate read views, read-only remote-policy structure, and environment-shadowed keys with nothing stored are refused with exit 1 — see [CLI Reference](cli-reference.md#oat-config-surface-flags).
56
56
  - `oat config describe` shows the supported config catalog across shared repo, repo-local, user, and sync/provider surfaces.
57
57
  - `oat config describe <key>` shows file, scope, default, mutability, owning command, and description for one key. A deprecated key also prints `Deprecated: prefer <successor>`, and `--json` carries the same fact as a `deprecated` object (`supersededBy`, plus `note` and `legacyValues` where they apply).
58
58
 
@@ -72,9 +72,9 @@ For a guided pass instead of individual commands, run the `/oat-doctor` skill (c
72
72
 
73
73
  These labels match what `oat config dump` emits, so tooling that consumes either command can rely on the same vocabulary.
74
74
 
75
- :::note Upgrade note
76
- Earlier CLI versions returned `config.json` / `config.local.json` / `env` / `default` as the `source` strings. External scripts that previously matched on `"source":"config.json"` or `"source":"config.local.json"` should update to match the new `shared` / `local` labels. This change was made to align the `oat config get` / `oat config list` output with `oat config dump` and to avoid confusing users about which file was consulted.
77
- :::
75
+ > [!NOTE]
76
+ > **Upgrade note.**
77
+ > Earlier CLI versions returned `config.json` / `config.local.json` / `env` / `default` as the `source` strings. External scripts that previously matched on `"source":"config.json"` or `"source":"config.local.json"` should update to match the new `shared` / `local` labels. This change was made to align the `oat config get` / `oat config list` output with `oat config dump` and to avoid confusing users about which file was consulted.
78
78
 
79
79
  ## Shared repo config you will touch most often
80
80
 
@@ -93,7 +93,7 @@ Common keys in `.oat/config.json`:
93
93
  configured value for the current process.
94
94
  - `worktrees.root` — where OAT-managed worktrees live
95
95
  - `git.defaultBranch` — base branch fallback for PR workflows
96
- - `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership
96
+ - `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership. With tooling `markdown`, root is the literal content directory (including nested `docs`) and `documentation.index` is authored `<root>/index.md`; Markdown adds no framework config. Framework roots retain app/source semantics. Use `oat docs init --framework markdown` or explicit `--adopt` for setup; optional manifests need external output and never change the authored index. See [Documentation path resolution](oat-directory-structure.md#documentation-path-resolution)
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
98
  - `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
99
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
@@ -106,7 +106,8 @@ Common keys in `.oat/config.json`:
106
106
  - `archive.awsRegion` — optional AWS region forwarded as `AWS_REGION` to every `aws` invocation in archive flows
107
107
  - `tools.<pack>` — project-scope intent for a bundled tool pack (`true` or absent)
108
108
  - `pjm.remote.storage.state` — `local` by default; `shared` requires an
109
- explicit preview and fresh approval and is unavailable to local projects
109
+ explicit preview and fresh approval. The current production store does not
110
+ enforce the intended local-project exclusion; see the remote storage warning
110
111
  - `pjm.remote.policy.description` — `none`, `managed-section`, or `replace`;
111
112
  the default is `none`
112
113
  - `pjm.remote.policy.authority.*` — repository defaults and operation-specific
@@ -126,6 +127,10 @@ and purpose field grants intersect to narrow outbound fields. No configured
126
127
  layer bypasses hard approval floors or current caller-owned authority evidence;
127
128
  missing, stale, or mismatched evidence fails closed.
128
129
 
130
+ Current CLI bindings use fixed intake/source or publish/planning purposes and
131
+ empty per-binding restrictions. Those internal narrowing layers are not
132
+ additional user-settable binding policy controls.
133
+
129
134
  The shared `pjm.remote` tree is closed. An unknown key, a non-object where an
130
135
  object is expected, or a wrong-typed leaf (for example `authority.default: 5`,
131
136
  a string `schemaVersion`, or a number, boolean, array, object, or `null` where a
@@ -189,7 +194,7 @@ oat pjm doctor --json
189
194
  verified. It is the authoritative repository adoption marker: PJM, backlog, and
190
195
  decision mutations fail closed without it, and `oat doctor` keys its `pjm:*`
191
196
  checks on adoption state rather than on `tools.project-management`. See
192
- [Install vs. initialize](tool-packs.md#install-vs-initialize) for the full state
197
+ [Install vs. initialize](../getting-started/tool-packs.md#install-vs-initialize) for the full state
193
198
  table and template precedence.
194
199
 
195
200
  ### Explainer configuration
@@ -263,9 +268,8 @@ packaged `assets/` directory next to the installed CLI. Setting a non-empty
263
268
  `validateBundleStructure`. That is a narrower promise than the exit-2 list
264
269
  above: release validation does not check bundle metadata beyond its presence,
265
270
  so a malformed or version-mismatched `bundle-metadata.json` is not covered.
266
- The regression evidence is the negative pack control in
267
- `packages/cli/src/release/public-package-contract.test.ts`:
268
- `fails release validation when a required bundle directory is empty in the tarball`.
271
+ OAT's own release tests include a check that release validation fails when a
272
+ required bundle directory is empty in the packed tarball.
269
273
  - Produce a matching bundle with `bash packages/cli/scripts/bundle-assets.sh`
270
274
  while `OAT_ASSETS_DIR` points at the target directory (the script already
271
275
  honors the variable as its destination).
@@ -273,12 +277,12 @@ packaged `assets/` directory next to the installed CLI. Setting a non-empty
273
277
  This is primarily a test-isolation and packaging seam; day-to-day use of the CLI
274
278
  does not need it.
275
279
 
276
- See [Explainer Kit](../workflows/skills/explainer-kit.md) for recipes, artifact
280
+ See [Explainer Kit](../skills/explainer-kit.md) for recipes, artifact
277
281
  locations, lifecycle behavior, and archive/export behavior.
278
282
 
279
283
  Workflow gate objects are structured config and use their own command group
280
284
  instead of the scalar `oat config set` surface. See
281
- [Workflow Gates](workflow-gates.md) for the full command surface and examples.
285
+ [Workflow Gates](../workflows/advanced/workflow-gates.md) for the full command surface and examples.
282
286
 
283
287
  Gate budgets resolve per run in this order: CLI `--timeout-ms`, selected
284
288
  target `timeoutMs`, `workflow.gateTimeouts` by review type,
@@ -377,7 +381,7 @@ configuration, never mutates any config layer, and is never written by a
377
381
  non-interactive run. Resolve it with
378
382
  `oat gate resolve <skill> --project <path-or-name> --json`; without `--project`
379
383
  the command keeps its original raw output. See
380
- [Workflow gates](./workflow-gates.md) for the full resolution envelope and the
384
+ [Workflow gates](../workflows/advanced/workflow-gates.md) for the full resolution envelope and the
381
385
  phase-review and autonomous exclusions.
382
386
 
383
387
  In practice, you usually inspect these via:
@@ -398,14 +402,14 @@ Dispatch configuration has two layers:
398
402
 
399
403
  A named ceiling is a maximum constraint, not an exact model-family or effort
400
404
  preference. For the full model, see
401
- [Dispatch Policy](../workflows/projects/dispatch-ceiling.md).
405
+ [Dispatch Policy](../workflows/advanced/dispatch-ceiling.md).
402
406
 
403
407
  ### Config keys
404
408
 
405
409
  | Key | Values | Purpose |
406
410
  | ------------------------------------------------------ | ----------------------------------------------------- | ------------------------------------------------------------------------------------ |
407
411
  | `workflow.dispatchPolicy.mode` | `managed`, `inherit` | `managed` lets OAT select exact candidates; `inherit` leaves controls to the host |
408
- | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Default named maximum or explicit managed uncapped state |
412
+ | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Configured maximum overriding project state, or explicit managed uncapped state |
409
413
  | `workflow.dispatchCeiling.providers.<provider>` | tier map or legacy bare value | Reusable provider candidate column |
410
414
  | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `candidates` cell, route, or legacy bare value | One named tier in the provider ladder |
411
415
  | `workflow.dispatchCeiling.recommendationVersion` | string | Bundle version last written by adoption; does not prove the effective ladder matches |
@@ -705,7 +709,7 @@ Workflow preferences let power users answer repetitive confirmation prompts once
705
709
  Workflow preference keys live under the `workflow.*` namespace:
706
710
 
707
711
  - `workflow.designMode` — `collaborative`, `selective`, or `draft`. Default design interaction mode. `selective` applies only to full `oat-project-design`; quick-start lightweight design treats it as collaborative because quick-start keeps the smaller collaborative/draft choice.
708
- - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement`: pause after every phase or only after the last phase. When unset, the skill prompts.
712
+ - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement` (a HiLL, or human-in-the-loop, checkpoint is a stop for your review): pause after every phase or only after the last phase. When unset, the skill prompts. See [Choosing a checkpoint default](#choosing-a-checkpoint-default).
709
713
  - `workflow.archiveOnComplete` — boolean. Skip the "Archive after completion?" prompt in `oat-project-complete`. When unset, the skill prompts.
710
714
  - `workflow.createPrOnComplete` — boolean. Skip the "Open a PR?" prompt in `oat-project-complete`; when true, completion auto-triggers PR creation. When unset, the skill prompts.
711
715
  - `workflow.postImplementSequence` — legacy `wait`, `summary`, `pr`, or `docs-pr`, or `{ "preApproval": [...], "postApproval": [...] }`. Legacy values remain strings and keep their existing mappings. Structured arrays contain ordered, globally unique `summary`, `document`, `pr`, and `retro` steps. `retro` is post-approval only: a structured value containing it in `preApproval` is rejected. Pre-approval steps run after final review and before final HiLL approval; post-approval steps run only after that approval. Plain retrieval keeps legacy strings and prints structured values as compact JSON; `--json` returns the raw value.
@@ -735,6 +739,22 @@ Without those settings, non-interactive retro generation records proposals but
735
739
  does not apply or file them. Interactive runs still present the applicable
736
740
  promotion and filing choices before side effects.
737
741
 
742
+ What leaves your repository through retro filing: `oat-project-retro-file`
743
+ files the retro's "OAT Upstream Feedback" items (`UP-01`, `UP-02`, and so on;
744
+ each is a title plus a problem, evidence summary, and suggested direction) as
745
+ GitHub issues in the upstream repository. That repository is
746
+ `workflow.retro.upstreamRepo` when set and `voxmedia/open-agent-toolkit` when
747
+ it is not. Nothing is filed by default: the skill runs only when you ask for
748
+ it, an interactive run asks you to confirm each destination and each item, and
749
+ a non-interactive run files nothing for a lane whose filing key is unset or
750
+ `none`. When the source repository is private and the destination is public,
751
+ the skill removes private log excerpts, internal URLs, credential-shaped
752
+ strings, and private identifiers before posting, and does not post an item it
753
+ cannot sanitize safely. To stop non-interactive upstream filing, run
754
+ `oat config set workflow.retro.filing.upstream none`; to send upstream items to
755
+ a different repository, run
756
+ `oat config set workflow.retro.upstreamRepo <owner/name>`.
757
+
738
758
  The two project-log keys use the standard workflow precedence:
739
759
  `local > shared > user > default`.
740
760
 
@@ -764,7 +784,7 @@ explicit final-default path and enables checkpoint auto-review; it preserves an
764
784
  existing valid empty or explicit list. Because autonomy itself is never
765
785
  persisted, a later interactive run pauses at the stored checkpoints normally.
766
786
 
767
- See [HiLL Checkpoints](../workflows/projects/hill-checkpoints.md) for timing and
787
+ See [HiLL Checkpoints](../workflows/projects/planning/hill-checkpoints.md) for timing and
768
788
  approval behavior.
769
789
 
770
790
  ### Auto artifact-review preferences
@@ -792,23 +812,20 @@ Workflow preferences resolve through three config surfaces, with `local > shared
792
812
 
793
813
  ```bash
794
814
  # User-level: applies to all repos on this machine
815
+ # Checkpoint default: choose every (pause after each phase) or final (pause once at the end)
795
816
  oat config set workflow.hillCheckpointDefault final --user
796
- oat config set workflow.archiveOnComplete true --user
797
- oat config set workflow.createPrOnComplete true --user
798
- oat config set workflow.postImplementSequence pr --user
799
817
  oat config set workflow.reviewExecutionModel subagent --user
800
818
  oat config set workflow.autoReviewAtHillCheckpoints true --user
801
819
  oat config set workflow.designMode selective --user
802
- oat config set workflow.dispatchCeiling.preset balanced --user
803
- oat config adopt dispatch-matrix --user
804
- oat config set workflow.autoArtifactReview.plan true --user
805
- oat config set workflow.autoArtifactReview.analysis true --user
820
+ oat config set workflow.autoNarrowReReviewScope true --user
821
+ oat config adopt dispatch-matrix --user # your own model ladder; sets no policy
806
822
 
807
823
  # Shared repo: team decision for this repo
824
+ oat config set workflow.archiveOnComplete true --shared
825
+ oat config set workflow.postImplementSequence docs-pr --shared
808
826
  oat config set workflow.createPrOnComplete false --shared
809
827
  oat config set workflow.designMode collaborative --shared
810
- oat config set workflow.dispatchCeiling.preset balanced --shared
811
- oat config set workflow.dispatchCeiling.providers.cursor.high composer-2.5 --shared
828
+ oat config set workflow.dispatchCeiling.providers.cursor.high composer-2.5 --shared # one ladder cell
812
829
  oat config set workflow.autoArtifactReview.plan false --shared
813
830
  oat config set workflow.projectLog auto --shared
814
831
  oat config set workflow.projectLogLedgerPath .oat/repo/reference/project-observations.md --shared
@@ -816,10 +833,40 @@ oat config set workflow.projectLogLedgerPath .oat/repo/reference/project-observa
816
833
  # Repo-local: personal override for this repo (default when no flag)
817
834
  oat config set workflow.hillCheckpointDefault every
818
835
  oat config set workflow.designMode draft
819
- oat config set workflow.dispatchCeiling.providers.codex medium # Advanced: per-provider override
820
836
  oat config set workflow.autoArtifactReview.analysis false
821
837
  ```
822
838
 
839
+ The user-level workflow preference lines use only keys that this page lists as
840
+ safe personal defaults in [Choosing the right surface](#choosing-the-right-surface-personal-vs-per-repo).
841
+ The dispatch lines adopt a model ladder and set one ladder cell; neither sets
842
+ a dispatch policy. The examples deliberately leave out the legacy
843
+ `workflow.dispatchCeiling.preset` key and bare per-provider values such as
844
+ `workflow.dispatchCeiling.providers.codex medium`: both still work, but they
845
+ replace that scope's ladder columns with a single legacy ceiling, and a
846
+ dispatch policy set in any config file overrides every project's own choice.
847
+ Read the warning below and [Dispatch Policy](../workflows/advanced/dispatch-ceiling.md)
848
+ before setting either.
849
+ The completion and PR keys (`workflow.archiveOnComplete`,
850
+ `workflow.createPrOnComplete`, and `workflow.postImplementSequence`) appear in
851
+ the shared block instead. A value in `~/.oat/config.json` applies in every
852
+ repository on your machine that does not set the same key in its own
853
+ `.oat/config.json` or `.oat/config.local.json`, because OAT resolves each key
854
+ as local, then shared, then user, then the built-in default. Whether those
855
+ completion keys are safe depends on each repository's archive and
856
+ documentation settings, so set them per repository. The
857
+ `workflow.autoArtifactReview.*` keys already default to `true`; set them only
858
+ in a repository that opts out, as the shared and repo-local examples show.
859
+
860
+ The legacy preset and bare-provider examples above remain readable compatibility
861
+ syntax, not recommended complete-ladder setup. They can replace candidate
862
+ columns with bare legacy ceilings. Prefer named policy plus explicit ladder
863
+ adoption for new configurations.
864
+
865
+ > [!WARNING]
866
+ > A dispatch policy set in any config file overrides the policy that every
867
+ > project chose for itself in its `state.md`. Leave the policy keys unset when
868
+ > each project should choose its own policy.
869
+
823
870
  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.
824
871
 
825
872
  ### Choosing the right surface (personal vs per-repo)
@@ -830,7 +877,7 @@ Not every workflow preference belongs at user level, even though "set once, appl
830
877
 
831
878
  Some preferences are **genuinely personal** — their correct value is the same for you regardless of which repo you're in. These are safe to set at `--user`:
832
879
 
833
- - `workflow.hillCheckpointDefault` — your personal tolerance for mid-implementation interruption
880
+ - `workflow.hillCheckpointDefault` — how often you want implementation to pause for your review. It is a personal preference by default; see [Choosing a checkpoint default](#choosing-a-checkpoint-default) below for when a team should set it instead.
834
881
  - `workflow.designMode` — your preferred full-design interaction style. Set `selective` when you usually want low-risk sections drafted silently but high-risk sections reviewed live.
835
882
  - `workflow.reviewExecutionModel` — depends on your provider environment (Claude Code, Cursor, Codex), not the repo
836
883
  - `workflow.autoReviewAtHillCheckpoints` — your preference for automatic lifecycle review at HiLL checkpoints. Shared/local config can still override this when a repo should behave differently.
@@ -845,10 +892,12 @@ Other preferences **depend on per-repo configuration** to be safe. These should
845
892
 
846
893
  **Cross-repo foot-gun example:** If you set `workflow.createPrOnComplete: true --user`, it applies to every repo you work on. In a repo with `documentation.requireForProjectCompletion: true` and `postImplementSequence: pr` (no docs step), running `oat-project-complete` would try to auto-create a PR, then immediately hit the docs gate and block you — leaving you with an open PR and a stuck completion. Your user-level preference silently asserted something that only holds in a specific shared-config shape.
847
894
 
848
- **Recommended split for most users:**
895
+ **Example split between personal and team settings:**
849
896
 
850
897
  ```bash
851
898
  # Personal preferences that differ from built-in defaults (apply everywhere)
899
+ # Optional checkpoint default: every for more control, final for fewer interruptions;
900
+ # leave unset to be asked on each project's first implementation run
852
901
  oat config set workflow.hillCheckpointDefault final --user
853
902
  oat config set workflow.reviewExecutionModel subagent --user
854
903
  oat config set workflow.autoReviewAtHillCheckpoints true --user
@@ -864,6 +913,29 @@ If you want to override a shared team decision for this specific checkout, use `
864
913
  oat config set workflow.archiveOnComplete false --local # "I don't want to archive on this specific branch checkout"
865
914
  ```
866
915
 
916
+ ### Choosing a checkpoint default
917
+
918
+ `workflow.hillCheckpointDefault` decides where `oat-project-implement` stops
919
+ for your review. These stops are called HiLL checkpoints (HiLL stands for
920
+ "human in the loop"). Neither value is right for everyone:
921
+
922
+ - `every` pauses after each phase. You get more control over the work, at the
923
+ cost of more interruptions.
924
+ - `final` pauses once, after the last phase. You are interrupted less, but you
925
+ see the work only at the end.
926
+
927
+ When the key is unset, the first implementation run of each project asks you
928
+ which to use. When it is set, that first run uses the configured value without
929
+ asking, and the value replaces any checkpoint value already written in the
930
+ project's `plan.md`. Later runs of the same project keep the value stored in
931
+ `plan.md`.
932
+
933
+ Treat the key as a personal preference by default, and set it at user level
934
+ (`--user`) or for one checkout (`--local`). Set it at shared level (`--shared`)
935
+ only when your team has agreed on a rule for where agents must pause. A shared
936
+ value overrides each person's user-level value, but anyone can still override
937
+ it for their own checkout with `--local`.
938
+
867
939
  ### Relationship to `autoReviewAtCheckpoints`
868
940
 
869
941
  `workflow.autoReviewAtHillCheckpoints` is the preferred key. It controls whether `oat-project-implement` runs the extra lifecycle review when a configured HiLL checkpoint is reached.
@@ -914,3 +986,48 @@ When you are unsure where a setting lives:
914
986
  3. Use the owning command shown there.
915
987
 
916
988
  That keeps config discovery centralized without forcing you to remember which settings belong to workflow state versus provider sync.
989
+
990
+ ## Choosing a config layer
991
+
992
+ `oat config set` can write a setting to one of three files, called layers:
993
+
994
+ - **shared** (`--shared`): `.oat/config.json`, committed with the repository so
995
+ it applies to the whole team;
996
+ - **local** (`--local`): `.oat/config.local.json`, which applies only to this
997
+ checkout and is not committed;
998
+ - **user** (`--user`): `~/.oat/config.json` in your home directory, which
999
+ applies to you in every repository.
1000
+
1001
+ When the same key is set in more than one layer, local wins over shared, and
1002
+ shared wins over user. A team's shared value therefore overrides your personal
1003
+ user value unless you also set it locally.
1004
+
1005
+ | Layer | Choose it when | What you give up |
1006
+ | ---------- | ----------------------------------------------------------- | --------------------------------------------------------------------- |
1007
+ | `--shared` | The team should behave the same way in this repository | Personal flexibility: changes go through code review like other files |
1008
+ | `--local` | You want to override something for yourself in one checkout | Nobody else, and none of your other checkouts, sees the value |
1009
+ | `--user` | The value is about how you work, whatever the repository | Any repository that sets the key in shared or local config wins |
1010
+
1011
+ With no flag, workflow preferences, project state, and explainer defaults are
1012
+ written to local config, update notifications to user config, and structural
1013
+ settings (repository paths and policy, such as `projects.root` or
1014
+ `documentation.*`) to shared config. Some keys can live in only one layer:
1015
+ project state is local-only, update notifications are user-only, and remote
1016
+ project-management policy is shared-only. `oat tools install` records each pack
1017
+ in the scope you installed it to, but `oat config set tools.*` writes only to
1018
+ shared config.
1019
+
1020
+ - If you are trying OAT on your own, set values with no flag and accept the
1021
+ defaults.
1022
+ - If you are rolling OAT out to a team, set policy keys with `--shared` and
1023
+ commit the change so it is reviewed.
1024
+ - If you want a preference to follow you into every repository, use `--user`,
1025
+ but only for keys listed as personal in
1026
+ [Choosing the right surface](#choosing-the-right-surface-personal-vs-per-repo).
1027
+ - If you need to differ from the team's setting in one checkout, use `--local`
1028
+ rather than changing the policy for everyone.
1029
+
1030
+ Environment variables override all three layers, but only for three keys:
1031
+ `projects.root`, `projects.defaultScope`, and `worktrees.root`. Some skills read
1032
+ their own environment variables, such as `OAT_DESIGN_MODE`; those are separate
1033
+ from config resolution.
@@ -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 meta.json navigation, and MkDocs nav sync.'
3
+ description: 'Docs source contract: authored Markdown context/maps, optional external inventories, Fumadocs manifests and meta.json navigation, and MkDocs nav sync.'
4
4
  ---
5
5
 
6
6
  # Docs Index Contract
@@ -9,7 +9,8 @@ OAT docs navigation starts from authored `docs/**/index.md` files. Each `## Cont
9
9
 
10
10
  ## Rules
11
11
 
12
- - Every documentation directory must contain an `index.md`.
12
+ - Every non-excluded Markdown-bearing content directory must contain an authored `index.md`; asset-only directories are exempt.
13
+ - Preserve useful audience/scope context, ownership guidance, and existing local instructions. Authored pages need nonempty title/description metadata.
13
14
  - Every `index.md` must include a `## Contents` section.
14
15
  - The `## Contents` section is the machine-readable local map for sibling pages and child directories.
15
16
  - Every `## Contents` link should use a `.md`-suffixed relative target, including child directory links such as `subdir/index.md`.
@@ -35,6 +36,20 @@ Notes:
35
36
  - Leaf pages should link to their `.md` filename.
36
37
  - Prose outside `## Contents` is ignored by nav generation and remains freeform; it can explain scope, reader paths, or migration status.
37
38
 
39
+ ## Plain Markdown Ownership
40
+
41
+ Configured Markdown uses `documentation.root` literally, even with a child named
42
+ `docs`. The configured `<root>/index.md` is authored context plus a Contents map;
43
+ edit it directly. Bootstrap/adoption creates missing baseline files and root
44
+ guidance, but content gaps remain analyze/apply work. No app package, site build,
45
+ nav sync, default manifest, or docs-root AGENTS creation is required.
46
+
47
+ Optional inventories need explicit output outside the full configured content
48
+ tree, for example `oat docs generate-index --docs-dir docs --output .oat/docs-manifest.md`.
49
+ Default generation is refused, as is output to the authored index or any part of
50
+ the full root, even with narrowed source flags or symlink aliases. Generation
51
+ never repoints the configured authored index.
52
+
38
53
  ## Fumadocs Generation
39
54
 
40
55
  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.
@@ -84,7 +99,7 @@ MkDocs generated behavior:
84
99
 
85
100
  ## Generated-file boundaries
86
101
 
87
- - Edit authored files under `docs/`, especially the nearest `index.md` and `## Contents`.
102
+ - Edit authored files under the resolved content root (`docs/` inside framework apps, or the literal configured Markdown root), especially the nearest `index.md` and `## Contents`.
88
103
  - Do not hand-edit a Fumadocs app-root generated `index.md`; regenerate it from the docs source tree.
89
104
  - Do not hand-maintain MkDocs `nav:` entries or Fumadocs `meta.json` `pages` lists when the local workflow uses `oat docs nav sync`.
90
105
  - 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.
@@ -94,7 +109,7 @@ MkDocs generated behavior:
94
109
  - Use `index.md` as the local discovery surface for humans and agents.
95
110
  - Add a short topic description next to each link so agents can choose the right file without opening every page.
96
111
  - Update `## Contents` whenever you add, remove, rename, or reorder docs files in a directory.
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.
112
+ - Markdown checks authored files/links, regenerating optional external manifests only when declared. Frameworks regenerate their artifacts after structural changes: `nav sync` for MkDocs `mkdocs.yml` and Fumadocs `meta.json` navigation, plus `generate-index` for Fumadocs root manifests.
98
113
  - Refresh or freshness-check the generated artifact before committing structural docs changes.
99
114
 
100
115
  ## If You Are Trying To...
@@ -111,7 +111,7 @@ When shared state is explicitly previewed and approved,
111
111
  `.oat/repo/pjm/remote/state/` or `<project>/remote/state/` replaces the local
112
112
  operational root. Shared state can contain remote planning content and is not
113
113
  available for local projects. See
114
- [Remote Project Management](../cli-utilities/remote-project-management.md).
114
+ [Remote Project Management](../workflows/backlog-and-planning/remote-project-management.md).
115
115
 
116
116
  ## Project artifact trees
117
117
 
@@ -168,13 +168,16 @@ Archive sync surfaces:
168
168
 
169
169
  ## CLI code
170
170
 
171
+ These paths are in the OAT source repository, not in a repository that uses
172
+ OAT. They matter only if you are working on OAT itself.
173
+
171
174
  - `packages/control-plane/` - read-only control-plane library for project-state parsing and recommendation
172
175
  - `packages/cli/src/commands/`
173
176
  - `packages/cli/src/commands/cleanup/`
174
177
  - `packages/cli/src/commands/cleanup/project/`
175
178
  - `packages/cli/src/commands/cleanup/artifacts/`
176
179
  - `packages/cli/src/commands/docs/` — `oat docs` command family
177
- - `packages/cli/src/commands/docs/init/` — scaffold a docs app (Fumadocs or MkDocs)
180
+ - `packages/cli/src/commands/docs/init/` — bootstrap/adopt authored Markdown or scaffold a docs app (Fumadocs or MkDocs)
178
181
  - `packages/cli/src/commands/docs/migrate/` — convert MkDocs admonitions to GFM callouts
179
182
  - `packages/cli/src/commands/docs/index-generate/` — generate a docs index from markdown files
180
183
  - `packages/cli/src/commands/docs/nav/` — regenerate mkdocs.yml nav or Fumadocs meta.json from index.md sections
@@ -196,3 +199,5 @@ Archive sync surfaces:
196
199
 
197
200
  - `.oat/templates/docs-app-fuma/` — Fumadocs (Next.js) scaffold template
198
201
  - `.oat/templates/docs-app-mkdocs/` — MkDocs Material scaffold template
202
+
203
+ - `.oat/templates/docs-markdown/` — authored `index.md` and `contributing.md` baseline templates; installed by the docs pack, with no app or docs-root AGENTS template
@@ -11,11 +11,17 @@ Contributor how-to material now lives under `contributing/`, and user-facing rou
11
11
 
12
12
  ## Contents
13
13
 
14
+ - [What OAT Writes](what-oat-writes.md) - Every file, link and Git ref OAT creates, what to commit, and how to remove it.
15
+ - [Configuration](configuration.md) - OAT configuration guidance across shared, local, user, and provider-sync surfaces.
16
+ - [Config and Local State](config-and-local-state.md) - Utility command groups for config, local state, diagnostics, and related inspection flows.
14
17
  - [CLI Reference](cli-reference.md) - Shallow map of the OAT command surface with links to owning sections.
15
18
  - [File Locations](file-locations.md) - Where core OAT files, assets, and artifacts live.
16
19
  - [Docs Index Contract](docs-index-contract.md) - Authored `index.md` maps, `.md` links, generated Fumadocs manifests, and MkDocs and Fumadocs nav sync boundaries.
17
- - [OAT Directory Structure](oat-directory-structure.md) - Canonical `.oat/` tree map and the role of each major directory.
20
+ - [`.oat` Directory Structure](oat-directory-structure.md) - Canonical `.oat/` tree map and the role of each major directory.
18
21
  - [Troubleshooting](troubleshooting.md) - Common issues, diagnostics, and remediation guidance.
22
+ - [Project Artifacts](project-artifacts.md) - What lives in `state.md`, `discovery.md`, `plan.md`, `implementation.md`, and related files.
23
+ - [State Machine](project-state-machine.md) - Lifecycle and review status transitions across a project.
24
+ - [Repository PR Comment Analysis](repository-pr-comments.md) - Repo-wide PR comment collection and triage workflows.
19
25
 
20
26
  ## What Belongs Here
21
27
 
@@ -28,3 +34,9 @@ Contributor how-to material now lives under `contributing/`, and user-facing rou
28
34
  - [CLI Reference](cli-reference.md) for the command-surface map
29
35
  - [Docs Tooling](../docs-tooling/index.md) for docs app setup and workflow guidance
30
36
  - [Contributing](../contributing/index.md) for code, docs, and skill-authoring practices
37
+
38
+ ## General CLI Adoption Guidance
39
+
40
+ Use OAT's general CLI for repository setup, tool-pack management, configuration and diagnostics independently of provider sync, docs tooling or tracked workflows.
41
+
42
+ Start with [Getting Started](../getting-started/index.md) for bootstrap and tool packs. See [Configuration](configuration.md) for settings, [Config and Local State](config-and-local-state.md) for diagnostics, and [Advanced](../workflows/advanced/index.md) for workflow gates.
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "title": "Reference",
3
3
  "pages": [
4
+ "what-oat-writes",
5
+ "configuration",
6
+ "config-and-local-state",
4
7
  "cli-reference",
5
8
  "file-locations",
6
9
  "docs-index-contract",
7
10
  "oat-directory-structure",
8
- "troubleshooting"
11
+ "troubleshooting",
12
+ "project-artifacts",
13
+ "project-state-machine",
14
+ "repository-pr-comments"
9
15
  ]
10
16
  }
@@ -48,16 +48,16 @@ Project scope is used for project workflows and repo-local sync state. User scop
48
48
 
49
49
  ## Top-level entries
50
50
 
51
- | Path | Purpose | Notes |
52
- | ------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
53
- | `.oat/config.json` | Shared repo runtime config for non-sync settings | Includes `worktrees.root`, `projects.root`, `git.defaultBranch`, `archive.*`, `documentation.*`, `instructions.*`, and `pjm.remote.*` |
54
- | `.oat/config.local.json` | Local per-developer runtime state | Gitignored; includes `activeProject`, `lastPausedProject`, `activeIdea` |
55
- | `.oat/state.md` | Generated repo state dashboard | Gitignored; rebuilt with `oat state refresh` from config, project artifacts, and knowledge metadata |
56
- | `.oat/projects/` | OAT project artifacts | `shared`, `synced`, `local`, and lifecycle `archived` locations |
57
- | `.oat/ideas/` | Project-level ideas store | Often gitignored |
58
- | `.oat/sync/` | Interop sync state/config | See details below |
59
- | `.oat/templates/` | Artifact templates used by OAT skills | Source for scaffolding. Includes `docs-app-fuma/` (Fumadocs) and `docs-app-mkdocs/` (MkDocs) templates. |
60
- | `.oat/repo/` | Repo-level PJM/knowledge/reference/review artifacts | Active PJM state under `pjm/`; durable references (including decisions) under `reference/` |
51
+ | Path | Purpose | Notes |
52
+ | ------------------------ | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
53
+ | `.oat/config.json` | Shared repo runtime config for non-sync settings | Includes `worktrees.root`, `projects.root`, `git.defaultBranch`, `archive.*`, `documentation.*`, `instructions.*`, and `pjm.remote.*` |
54
+ | `.oat/config.local.json` | Local per-developer runtime state | Gitignored; includes `activeProject`, `lastPausedProject`, `activeIdea` |
55
+ | `.oat/state.md` | Generated repo state dashboard | Gitignored; rebuilt with `oat state refresh` from config, project artifacts, and knowledge metadata |
56
+ | `.oat/projects/` | OAT project artifacts | `shared`, `synced`, `local`, and lifecycle `archived` locations |
57
+ | `.oat/ideas/` | Project-level ideas store | Often gitignored |
58
+ | `.oat/sync/` | Interop sync state/config | See details below |
59
+ | `.oat/templates/` | Artifact templates used by OAT skills | Source for scaffolding. Includes `docs-markdown/` (authored index/contributing), `docs-app-fuma/` (Fumadocs), and `docs-app-mkdocs/` (MkDocs) templates. |
60
+ | `.oat/repo/` | Repo-level PJM/knowledge/reference/review artifacts | Active PJM state under `pjm/`; durable references (including decisions) under `reference/` |
61
61
 
62
62
  ## `.oat/sync/` details
63
63
 
@@ -120,10 +120,10 @@ Current schema keys:
120
120
  | `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects |
121
121
  | `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`. |
122
122
  | `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`. |
123
- | `documentation.root` | `string` | - | Docs **app root** — the directory `oat docs init` scaffolds (e.g., `apps/docs`). Authored pages live under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution). |
124
- | `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`) |
123
+ | `documentation.root` | `string` | - | Literal authored content root for tooling `markdown` (default `docs`); otherwise docs **app root** (e.g., `apps/docs`) with authored pages normally under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution). |
124
+ | `documentation.tooling` | `string` | - | Documentation tooling identifier (`markdown`, `mkdocs`, or `fumadocs`); parsing remains permissive |
125
125
  | `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`) |
126
- | `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs. |
126
+ | `documentation.index` | `string` | - | Path to the docs surface entry point: authored `<root>/index.md` for Markdown, the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for Markdown or MkDocs. |
127
127
  | `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index). |
128
128
  | `documentation.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
129
129
  | `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
@@ -148,7 +148,7 @@ Current schema keys:
148
148
  Most `documentation.*` keys are managed via `oat config get/set` and are set automatically by `oat docs init`. One has no `oat config set` entry and is edited directly in `.oat/config.json`: `documentation.index`, which `oat docs init` still seeds for you.
149
149
  The `git.defaultBranch` key is auto-detected during `oat init` and can be overridden via `oat config set git.defaultBranch <branch>`.
150
150
  Archive settings are managed via `oat config get/set`, and `oat config describe archive.s3Uri` (or the other archive keys) shows the lifecycle and ownership details from the CLI.
151
- Workflow gate objects are structured config and are managed with `oat gate`, not the scalar `oat config set` surface. See [Workflow Gates](../cli-utilities/workflow-gates.md).
151
+ Workflow gate objects are structured config and are managed with `oat gate`, not the scalar `oat config set` surface. See [Workflow Gates](../workflows/advanced/workflow-gates.md).
152
152
 
153
153
  Example:
154
154
 
@@ -174,24 +174,26 @@ Example:
174
174
 
175
175
  ### Documentation path resolution
176
176
 
177
- `documentation.root` canonically names the docs **app root** — exactly the directory `oat docs init` scaffolds. Authored Markdown lives under `<root>/docs`, and the generated Fumadocs manifest is written to `<root>/index.md`, outside the tree it indexes.
177
+ With `documentation.tooling: "markdown"`, `documentation.root` is the dedicated literal content directory and `documentation.index` is authored `<root>/index.md`. A child named `docs` does not narrow it. Fresh setup/adoption creates missing baseline pages and managed root guidance, without app files, dependencies, site builds, or a docs-root AGENTS file; existing local instructions are preserved.
178
+
179
+ Framework roots retain their app-root meaning. Authored content commonly lives under `<root>/docs`; the generated Fumadocs manifest lives at `<root>/index.md`, outside its source tree.
178
180
 
179
181
  `oat docs generate-index` resolves omitted options from this configuration:
180
182
 
181
- | Option | Omitted | Supplied |
182
- | ------------ | ---------------------------------------------------------------------------------------- | ----------------------------------- |
183
- | `--docs-dir` | `<documentation.root>/docs` when that directory exists, otherwise `<documentation.root>` | Resolved from the current directory |
184
- | `--output` | `<documentation.root>/index.md` | Resolved from the current directory |
183
+ | Option | Omitted | Supplied |
184
+ | ------------ | ------------------------------------------------------------------------------------------------------- | ----------------------------------- |
185
+ | `--docs-dir` | Markdown: literal `<documentation.root>`; other tooling: `<root>/docs` when present, otherwise `<root>` | Resolved from the current directory |
186
+ | `--output` | Markdown: explicit external output required; otherwise `<root>/index.md` | Resolved from the current directory |
185
187
 
186
188
  If an omitted option has no non-empty `documentation.root` to resolve against, or the configured root is not a directory, the command fails with exit code `2` before generating or writing anything.
187
189
 
188
- **Compatibility behavior.** Preferring `<root>/docs` exists for legacy configs whose `root` names a docs _source_ directory rather than an app root; it is not a second meaning of the key. Because the rule is a plain directory-existence test, a source root that happens to contain its own `docs` subdirectory is narrowed to it. The command prints the directory it derived in both human and JSON output (`docsDir`, `docsDirSource`), and `--docs-dir` is the escape hatch when the derivation is wrong.
190
+ **Compatibility behavior.** Preferring `<root>/docs` exists for legacy configs whose `root` names a docs _source_ directory rather than an app root; it is not a second meaning of the key. For non-Markdown tooling the rule is a plain directory-existence test, so a source root that happens to contain its own `docs` subdirectory is narrowed to it. The command prints the directory it derived in both human and JSON output (`docsDir`, `docsDirSource`), and `--docs-dir` is the escape hatch when the derivation is wrong.
189
191
 
190
192
  A legacy source root with no `docs` child resolves `--docs-dir` and `--output` to the same tree, so a bare run is refused rather than allowed to overwrite an authored page. Pass an explicit `--output` outside the source tree, or repoint `documentation.root` at the app root.
191
193
 
192
- **Refused output targets.** Checked before generation for derived and explicit paths alike, the command refuses to write an output that is inside the docs directory it indexes, equals `documentation.config`, or ends in `.yml` / `.yaml`. A derived output whose existing file lacks the `AUTOGENERATED by oat docs generate-index` header is also refused; naming that same path with `--output` overwrites it explicitly.
194
+ **Refused output targets.** Checked before generation for derived and explicit paths alike, the command refuses to write an output that is inside the docs directory it indexes, equals `documentation.config`, or ends in `.yml` / `.yaml`. A derived output whose existing file lacks the `AUTOGENERATED by oat docs generate-index` header is also refused; naming that same path with `--output` overwrites it explicitly only when no other guard applies. Configured Markdown additionally protects the full canonical configured content root and authored `documentation.index`, even with narrowed `--docs-dir` or symlink aliases. Default Markdown generation is refused; use explicit output outside the full content tree. The authored index remains configured.
193
195
 
194
- **Configuration writes.** The only configuration write generation performs is the Fumadocs manifest transition: when the written manifest lies inside `documentation.root` and `documentation.tooling` is `fumadocs`, the repo-relative output path is recorded in `documentation.index`. A config that declares neither `documentation.tooling` nor `documentation.config` is treated as the same Fumadocs-shaped case. Any other declared tooling — `mkdocs` included — is never written, and neither are `documentation.root` and `documentation.config`. The value is always repo-relative: when `documentation.root` points outside the repository, the manifest is still generated but the key is left untouched rather than recording a machine-specific path.
196
+ **Configuration writes.** The only configuration write generation performs is the Fumadocs manifest transition: when the written manifest lies inside `documentation.root` and `documentation.tooling` is `fumadocs`, the repo-relative output path is recorded in `documentation.index`. A config that declares neither `documentation.tooling` nor `documentation.config` is treated as the same Fumadocs-shaped case. Any other declared tooling — `markdown` and `mkdocs` included — is never written, and neither are `documentation.root` and `documentation.config`. The value is always repo-relative: when `documentation.root` points outside the repository, the manifest is still generated but the key is left untouched rather than recording a machine-specific path.
195
197
 
196
198
  ### Excluding pages from the generated index
197
199