@open-agent-toolkit/cli 0.3.24 → 0.3.26

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 (48) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +14 -6
  3. package/assets/docs/docs-tooling/commands.md +12 -9
  4. package/assets/docs/docs-tooling/workflows.md +53 -8
  5. package/assets/docs/reference/cli-reference.md +1 -1
  6. package/assets/docs/reference/configuration.md +3 -0
  7. package/assets/docs/reference/docs-index-contract.md +19 -6
  8. package/assets/docs/reference/oat-directory-structure.md +13 -0
  9. package/assets/public-package-versions.json +4 -4
  10. package/assets/skills/oat-docs-analyze/SKILL.md +106 -6
  11. package/assets/skills/oat-docs-analyze/references/analysis-artifact-template.md +42 -2
  12. package/assets/skills/oat-docs-analyze/scripts/package-drift.mjs +129 -0
  13. package/assets/skills/oat-docs-apply/SKILL.md +131 -12
  14. package/assets/skills/oat-docs-apply/references/apply-plan-template.md +58 -14
  15. package/assets/skills/oat-docs-bootstrap/SKILL.md +33 -8
  16. package/assets/templates/docs-app-fuma/package.json.template +1 -1
  17. package/assets/templates/docs-app-fuma/source.config.ts +6 -1
  18. package/assets/templates/docs-app-mkdocs/package.json.template +2 -2
  19. package/dist/commands/config/index.d.ts.map +1 -1
  20. package/dist/commands/config/index.js +67 -9
  21. package/dist/commands/docs/index-generate/generator.d.ts +4 -34
  22. package/dist/commands/docs/index-generate/generator.d.ts.map +1 -1
  23. package/dist/commands/docs/index-generate/generator.js +51 -157
  24. package/dist/commands/docs/index-generate/index.d.ts +1 -1
  25. package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
  26. package/dist/commands/docs/index-generate/index.js +26 -8
  27. package/dist/commands/docs/init/index.d.ts.map +1 -1
  28. package/dist/commands/docs/init/index.js +21 -1
  29. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  30. package/dist/commands/docs/init/scaffold.js +20 -13
  31. package/dist/commands/docs/nav/contents.d.ts +13 -3
  32. package/dist/commands/docs/nav/contents.d.ts.map +1 -1
  33. package/dist/commands/docs/nav/contents.js +85 -24
  34. package/dist/commands/docs/nav/fumadocs.d.ts +1 -0
  35. package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -1
  36. package/dist/commands/docs/nav/fumadocs.js +26 -9
  37. package/dist/commands/docs/nav/sync.d.ts +2 -0
  38. package/dist/commands/docs/nav/sync.d.ts.map +1 -1
  39. package/dist/commands/docs/nav/sync.js +21 -1
  40. package/dist/commands/docs/shared/exclusions.d.ts +37 -0
  41. package/dist/commands/docs/shared/exclusions.d.ts.map +1 -0
  42. package/dist/commands/docs/shared/exclusions.js +161 -0
  43. package/dist/config/oat-config.d.ts +18 -0
  44. package/dist/config/oat-config.d.ts.map +1 -1
  45. package/dist/config/oat-config.js +64 -3
  46. package/dist/config/resolve.d.ts.map +1 -1
  47. package/dist/config/resolve.js +5 -1
  48. package/package.json +2 -2
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+ // Read-only, offline comparison used by oat-docs-analyze. No package resolution or install.
3
+ import { readFile, realpath } from 'node:fs/promises';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { parseArgs } from 'node:util';
6
+
7
+ const shellQuote = (value) =>
8
+ `'${value.replaceAll("'", String.fromCharCode(39, 92, 39, 39))}'`;
9
+
10
+ async function versionsForCli(executable) {
11
+ if (!executable)
12
+ throw new Error(
13
+ 'Provide --cli with the installed oat executable or --versions with its bundled public-package-versions.json.',
14
+ );
15
+ let directory = dirname(await realpath(executable));
16
+ for (;;) {
17
+ try {
18
+ const pkg = JSON.parse(
19
+ await readFile(join(directory, 'package.json'), 'utf8'),
20
+ );
21
+ if (pkg.name === '@open-agent-toolkit/cli')
22
+ return join(directory, 'assets/public-package-versions.json');
23
+ } catch (error) {
24
+ if (error.code !== 'ENOENT') throw error;
25
+ }
26
+ const parent = dirname(directory);
27
+ if (parent === directory)
28
+ throw new Error(
29
+ 'Cannot locate the running CLI bundle through this wrapper; supply --versions from that installed CLI.',
30
+ );
31
+ directory = parent;
32
+ }
33
+ }
34
+
35
+ try {
36
+ const { values } = parseArgs({
37
+ options: {
38
+ app: { type: 'string' },
39
+ versions: { type: 'string' },
40
+ cli: { type: 'string' },
41
+ },
42
+ });
43
+ if (!values.app) throw new Error('Required: --app <docs-app-directory>.');
44
+ const versionsPath = resolve(
45
+ values.versions ?? (await versionsForCli(values.cli)),
46
+ );
47
+ const versions = JSON.parse(await readFile(versionsPath, 'utf8'));
48
+ const appPath = resolve(values.app);
49
+ const manifest = JSON.parse(
50
+ await readFile(join(appPath, 'package.json'), 'utf8'),
51
+ );
52
+ const packages = [];
53
+ for (const section of [
54
+ 'dependencies',
55
+ 'devDependencies',
56
+ 'optionalDependencies',
57
+ ]) {
58
+ for (const [name, declared] of Object.entries(manifest[section] ?? {})) {
59
+ if (
60
+ ![
61
+ '@open-agent-toolkit/docs-config',
62
+ '@open-agent-toolkit/docs-theme',
63
+ '@open-agent-toolkit/docs-transforms',
64
+ ].includes(name)
65
+ )
66
+ continue;
67
+ const bundled = versions[name.slice('@open-agent-toolkit/'.length)];
68
+ if (
69
+ typeof bundled !== 'string' ||
70
+ !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(bundled)
71
+ )
72
+ throw new Error(`Missing/invalid bundled version for ${name}.`);
73
+ // Report installed package bytes when available, not just a declared range.
74
+ let installed = null;
75
+ try {
76
+ const installedManifest = JSON.parse(
77
+ await readFile(
78
+ join(appPath, 'node_modules', name, 'package.json'),
79
+ 'utf8',
80
+ ),
81
+ );
82
+ if (typeof installedManifest.version !== 'string')
83
+ throw new Error(`Invalid installed version for ${name}.`);
84
+ installed = installedManifest.version;
85
+ } catch (error) {
86
+ if (error.code !== 'ENOENT') throw error;
87
+ }
88
+ // Only stable numeric releases are orderable here; prereleases and other
89
+ // package-manager version forms need manual verification, never an upgrade.
90
+ const stable = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
91
+ let status = 'unverified';
92
+ if (
93
+ installed !== null &&
94
+ stable.test(installed) &&
95
+ stable.test(bundled)
96
+ ) {
97
+ const left = installed.split('.').map(BigInt);
98
+ const right = bundled.split('.').map(BigInt);
99
+ const differing = left.findIndex(
100
+ (part, index) => part !== right[index],
101
+ );
102
+ status =
103
+ differing === -1
104
+ ? 'current'
105
+ : left[differing] < right[differing]
106
+ ? 'drift'
107
+ : 'ahead';
108
+ }
109
+ packages.push({
110
+ name,
111
+ section,
112
+ declared,
113
+ installed,
114
+ bundled,
115
+ status,
116
+ upgradeCommand:
117
+ status === 'drift' || status === 'current'
118
+ ? `pnpm --dir ${shellQuote(appPath)} add${section === 'devDependencies' ? ' --save-dev' : section === 'optionalDependencies' ? ' --save-optional' : ''} ${name}@${bundled}`
119
+ : null,
120
+ });
121
+ }
122
+ }
123
+ process.stdout.write(
124
+ `${JSON.stringify({ versionsPath, appPath, packages }, null, 2)}\n`,
125
+ );
126
+ } catch (error) {
127
+ process.stderr.write(`${error.message}\n`);
128
+ process.exitCode = 1;
129
+ }
@@ -5,7 +5,7 @@ disable-model-invocation: true
5
5
  user-invocable: true
6
6
  allowed-tools: Read, Write, Edit, Bash(git:*), Bash(gh:*), Bash(oat:*), Bash(pnpm:*), Bash(bash:*), Bash(jq:*), Bash(mkdir:*), Bash(date:*), Bash(echo:*), Bash(cd:*), Bash(pwd:*), Glob, Grep, AskUserQuestion
7
7
  metadata:
8
- version: '1.4.5'
8
+ version: '1.4.6'
9
9
  ---
10
10
 
11
11
  # Docs Apply
@@ -33,12 +33,12 @@ Before a parent-branch commit, verify `oat internal commit-paths --help` succeed
33
33
 
34
34
  - No unapproved documentation changes.
35
35
  - No branch creation before the recommendation plan is reviewed.
36
- - No changes outside the documentation scope except deterministic nav sync and tracking updates.
36
+ - No changes outside the documentation scope except the approved IA record/config mirrors, owner-authorized nav sync, tracking updates, and the individually approved tooling-update carve-out below.
37
37
 
38
38
  **ALLOWED Activities:**
39
39
 
40
40
  - Reading analysis artifacts and the current docs surface.
41
- - Creating or updating docs files and `mkdocs.yml` when approved. Fumadocs `meta.json` files change only through `oat docs nav sync`.
41
+ - Creating or updating docs files and hand-authored navigation when approved. Nav-sync-owned navigation changes only through `oat docs nav sync`; undeclared ownership blocks regeneration.
42
42
  - Running `oat docs nav sync` after approved structural changes.
43
43
  - Creating branches, commits, and optional PRs.
44
44
 
@@ -93,7 +93,13 @@ When executing this skill, provide lightweight progress feedback so the user can
93
93
 
94
94
  ### Step 0: Intake - Find Analysis Artifact
95
95
 
96
- Locate the most recent docs analysis artifact:
96
+ The one input is an **analysis artifact path plus approved recommendation IDs**.
97
+ Accept an explicitly supplied artifact; when none is supplied, offer the newest
98
+ artifact below and confirm that it is the reviewed input. Never silently switch
99
+ to a newer artifact after approval. IDs identify recommendations within that
100
+ artifact, remain stable through artifact review, and are never reassigned.
101
+
102
+ Locate a candidate when no artifact path was supplied:
97
103
 
98
104
  ```bash
99
105
  ls -t .oat/repo/analysis/docs-*.md 2>/dev/null | head -1
@@ -103,6 +109,8 @@ If none exists, stop and instruct the user to run `oat-docs-analyze`.
103
109
 
104
110
  Validate that each recommendation in the artifact includes:
105
111
 
112
+ - a unique stable ID (for example `R-001`)
113
+ - `approval: explicit | default`
106
114
  - evidence
107
115
  - confidence
108
116
  - disclosure
@@ -158,9 +166,19 @@ For review-mode and follow-up decisions, use host-aware prompting:
158
166
 
159
167
  If the user chooses `apply all`:
160
168
 
161
- - confirm the full plan
162
- - capture any global notes that apply across the whole plan
163
- - treat all non-blocked recommendations as approved unless the user names exceptions
169
+ - confirm the full plan and capture global notes
170
+ - approve only non-blocked `approval: default` recommendations, excluding named exceptions
171
+ - Blanket approval never approves an `approval: explicit` recommendation.
172
+ - Ask for individual approval by recommendation ID for each explicit item. A
173
+ restructure block always needs its own approval, including its full map and
174
+ old-URL plan; approving a different block does not approve it.
175
+
176
+ In unattended mode, skip every explicit recommendation even when an input list
177
+ names its ID; report `explicit_requires_interactive_approval` in the structured
178
+ result. Never interpret automation configuration or `apply all` as individual
179
+ approval. Missing/unknown approval classes or duplicate/unknown IDs block intake.
180
+ The approved-ID list is captured at this approval step, not inferred from prose.
181
+ An input list alone does not prove individual approval for an explicit item.
164
182
 
165
183
  If the user chooses `apply interactively`, ask for each recommendation:
166
184
 
@@ -174,11 +192,12 @@ If the user chooses `discuss`, answer questions, revise the plan if needed, and
174
192
  - `apply interactively`
175
193
  - `discuss`
176
194
 
177
- If all recommendations are skipped, stop without changing files.
195
+ If all recommendations are skipped, emit the structured result with reasons and stop without changing files.
178
196
 
179
197
  Build an `APPLIED_PLAN_DETAILS` block from approved or modified recommendations with:
180
198
 
181
199
  - recommendation id
200
+ - approval class and individual approval evidence when required
182
201
  - action
183
202
  - target path
184
203
  - disclosure
@@ -216,7 +235,7 @@ locators/provenance into the apply plan; do not silently re-resolve different
216
235
  sources. Verify cited inputs still exist and remain read-only outside the repo.
217
236
  Local AGENTS/contributing rules stay authoritative; a conflict is `ask_user`
218
237
  and blocks that recommendation pending a fresh analysis/user decision. Cite
219
- sources without copying private contents. This hook adds no restructure action.
238
+ sources without copying private contents.
220
239
 
221
240
  Before the first approved write, initialize `OWNED_OUTPUT_FILES=()`. Append
222
241
  each exact successfully created, modified or removed path at that write,
@@ -235,10 +254,87 @@ For each approved recommendation:
235
254
  - `omit` -> do not encode the item in the docs change
236
255
  - `ask_user` -> require explicit user confirmation before writing
237
256
 
257
+ #### Record an accepted IA
258
+
259
+ Only an approved `record-ia` recommendation authorizes persistence. Before any
260
+ PJM/decision write run `oat pjm doctor --json` in the target repo and inspect
261
+ `adoption.state`; absent/partial adoption routes to `oat pjm init` before the
262
+ record, never silently writes an unmanaged decision. Read the target's
263
+ `.oat/repo/AGENTS.md`, decision conventions and existing decision index; update
264
+ an existing matching record rather than duplicate it. Create a new record with
265
+ `oat decision new "Documentation information architecture" --status accepted
266
+ --context "<approved evidence>"` and its supported `--decision`/`--consequences` options
267
+ (check `--help`). The command owns index generation; never hand-edit the index.
268
+
269
+ Write a short `## Information architecture` section with tracks, organizing
270
+ principle per track, placement rules and verification overlay. For Fumadocs and
271
+ MkDocs put it in the docs-app `AGENTS.md`, preserving existing guidance. For
272
+ Markdown put it in the contributing page; create no docs-root `AGENTS.md`.
273
+ Link the decision and authored section reciprocally. They remain authoritative;
274
+ a conflict with config becomes `ask_user`, never a config-driven rewrite.
275
+
276
+ Mirror the accepted record using shared repo config only:
277
+ `oat config set documentation.ia '<JSON>'`, with exactly `{preset, decision,
278
+ tracks?: [{path, principle}], verification?: 'triad'|'agent-only'|'none'}`.
279
+ `decision` is repo-relative; preserve guidance and unrelated config. For a
280
+ framework surface, separately record the operator's approved sidebar owner via
281
+ `oat config set documentation.navOwner nav-sync` or `hand-authored`. Missing
282
+ ownership stays undeclared and blocks automatic regeneration. Markdown ignores
283
+ navOwner and never runs nav sync. New-scaffold default ownership and preset
284
+ materialization are not implemented by this persistence step.
285
+
286
+ #### Restructure one approved block
287
+
288
+ `restructure` requires `approval: explicit` and one individual approval per
289
+ block before any move. Use the apply-plan block: source→destination map, source
290
+ and destination parent Contents edits, grep-derived inbound references (including
291
+ relative links, anchors and assets), exact rewrite list, and old-URL recovery.
292
+ Search the whole repo for each old path/basename with `rg`; resolve relative
293
+ references from their original file and check them again from their new location.
294
+ Keep links to moved headings working. Do not treat search hits in examples or
295
+ unrelated same-name files as automatic rewrites.
296
+
297
+ Choose recovery supported by the actual deployment: Next static export does
298
+ not support Next config redirects (see [Next static-export unsupported features](https://nextjs.org/docs/app/guides/static-exports#unsupported-features)).
299
+ Use an authored stub at the old route with a relative pointer, or an approved
300
+ archive pointer; a redirect requires verified framework/host support and stays
301
+ manual when it needs app/host config. Never edit `not-found.tsx` through this
302
+ carve-out. Retired pages retain a stub/archive pointer and a parent Contents
303
+ update, never a silent delete. Preserve stub routes in the approved reader map
304
+ where the framework needs them to build.
305
+
306
+ Apply one block as one exact-path implementation commit; do not combine it with
307
+ another block. Validate all rewritten inbound links and old URLs under the
308
+ actual base path. With `navOwner: nav-sync`, run nav sync then nav sync --check
309
+ with the explicit app target. With `hand-authored`, update approved hand-authored
310
+ navigation and compare membership/order against Contents read-only; never run a
311
+ writing nav sync. With undeclared ownership, report `ask_user` before navigation
312
+ writes. Markdown checks files/Contents/links only. Re-run `oat-docs-analyze`
313
+ after each block, preserving residual findings instead of claiming a clean run.
314
+
315
+ #### Individually approved tooling update
316
+
317
+ A `tooling-update` recommendation has `approval: explicit`. Even with individual
318
+ approval, its out-of-Markdown allowance is only these three operations:
319
+
320
+ 1. Bump the docs app's existing `@open-agent-toolkit/docs-*` dependencies to the
321
+ bundled versions using the artifact's exact upgrade command (preserve dependency
322
+ section and package manager; include its resulting lockfile only). Never downgrade
323
+ an installed version: `ahead` or `unverified` requires CLI selection/update or
324
+ manual verification before re-analysis, not a docs-package tooling update.
325
+ 2. Run `oat docs migrate --docs-dir <authored-root> --apply` only for its currently
326
+ supported admonition conversions and injected frontmatter; inspect the diff.
327
+ 3. Run the docs build verifier from the app's existing scripts.
328
+
329
+ Scaffold changes the CLI cannot make (app config, routes, package scripts) are
330
+ `manual`: report the required change and ID without editing those files. This
331
+ allowance does not permit application dependencies, host settings, arbitrary
332
+ migrations or an app-shell rebuild. Other out-of-scope prohibitions remain.
333
+
238
334
  When approved actions involve docs app creation or nav updates:
239
335
 
240
336
  - Use `oat docs init` for scaffolding when appropriate.
241
- - Use `oat docs nav sync` instead of manually editing nav when the CLI helper can generate it. In Fumadocs apps it writes strict `meta.json` files and reports pages no `## Contents` map lists (`unlisted` in `--json`); resolve a reported page through an approved `## Contents` change, never by hand-editing `meta.json`.
337
+ - Use `oat docs nav sync` instead of manually editing nav only when recorded `navOwner: nav-sync` authorizes it. In Fumadocs apps it writes strict `meta.json` files and reports pages no `## Contents` map lists (`unlisted` in `--json`); resolve a reported page through an approved `## Contents` change, never by hand-editing `meta.json`.
242
338
 
243
339
  Negative rules:
244
340
 
@@ -261,7 +357,7 @@ full configured content tree; keep the authored config index unchanged.
261
357
  For framework apps, discover actual scripts and run the smallest relevant
262
358
  verification set based on what changed; these examples apply only when present:
263
359
 
264
- - `oat docs nav sync`
360
+ - `oat docs nav sync --target-dir <docs-app>` then `--check` only for `nav-sync` ownership; hand-authored/undeclared navigation gets read-only Contents membership/order comparison
265
361
  - `pnpm --dir <docs-app> docs:lint` (no-op when no linter is configured)
266
362
  - `pnpm --dir <docs-app> docs:format:check`
267
363
  - `pnpm --dir <docs-app> docs:build`
@@ -270,7 +366,7 @@ If no docs app exists yet, use file-level verification and confirm the structura
270
366
 
271
367
  ### Step 6: Commit and PR
272
368
 
273
- Commit the approved changes:
369
+ Commit the approved changes (for restructure, repeat with one retained identity and exact path list per approved block; exclude already committed blocks from any final aggregate commit and skip an empty aggregate):
274
370
 
275
371
  ```bash
276
372
  OWNED_COMMIT_PATHS=("${OWNED_OUTPUT_FILES[@]}")
@@ -344,6 +440,29 @@ PR creation failed. To create manually:
344
440
 
345
441
  ### Step 7: Update Tracking and Output Summary
346
442
 
443
+ Always emit this structured result, including no-op/unattended runs. Each input
444
+ recommendation ID appears in exactly one outcome; failed verification is a
445
+ failure, never an applied success. Unsupported scaffold work is skipped with
446
+ reason `manual` and its required change. Include individual approval evidence
447
+ in the plan, not invented in this result.
448
+
449
+ ```json
450
+ {
451
+ "analysisArtifact": ".oat/repo/analysis/docs-example.md",
452
+ "approvedRecommendationIds": ["R-001"],
453
+ "applied": ["R-001"],
454
+ "skipped": [
455
+ { "id": "R-002", "reason": "explicit_requires_interactive_approval" }
456
+ ],
457
+ "failed": []
458
+ }
459
+ ```
460
+
461
+ Failed entries use `{ "id": "R-003", "reason": "<verification/error>" }`.
462
+ Report partial writes and stop on a failure; never continue by widening scope.
463
+
464
+ ### Tracking and summary
465
+
347
466
  Update shared tracking:
348
467
 
349
468
  ```bash
@@ -25,7 +25,7 @@ Keep the analysis selection; do not copy private contents or invent missing evid
25
25
 
26
26
  Review the full recommendation set first, then choose a review mode:
27
27
 
28
- - **apply all** — approve the full set as presented
28
+ - **apply all** — approve non-blocked default items; explicit items require individual approval by ID
29
29
  - **apply interactively** — review recommendation by recommendation
30
30
  - **discuss** — pause to talk through the plan before approving
31
31
 
@@ -41,19 +41,21 @@ blocked pending a fresh analysis rather than guessed.
41
41
 
42
42
  ## Recommendations
43
43
 
44
- ### {N}. {Action}: `{target-path}`
45
-
46
- | Field | Value |
47
- | ------------ | ----------------------------------------------------------------- |
48
- | Action | {create / update / move / scaffold / sync-nav} |
49
- | Target | `{target-path}` |
50
- | Rationale | {why this recommendation exists} |
51
- | Source | {finding # / contract gap / nav issue} |
52
- | Evidence | {exact file refs / config / docs that justify the recommendation} |
53
- | Confidence | {high / medium / low} |
54
- | Disclosure | {inline / link_only / omit / ask_user} |
55
- | Link Targets | {path or URL when link_only; otherwise N/A} |
56
- | Helper | `oat docs nav sync` / `oat docs init` / `manual edit` |
44
+ ### {R-NNN}. {Action}: `{target-path}`
45
+
46
+ | Field | Value |
47
+ | ------------ | -------------------------------------------------------------------------------------------------- |
48
+ | ID | {R-NNN; stable within the source artifact} |
49
+ | approval | {explicit / default; never inferred from blanket consent} |
50
+ | Action | {create / update / move / scaffold / sync-nav / record-ia / restructure / tooling-update / manual} |
51
+ | Target | `{target-path}` |
52
+ | Rationale | {why this recommendation exists} |
53
+ | Source | {finding # / contract gap / nav issue} |
54
+ | Evidence | {exact file refs / config / docs that justify the recommendation} |
55
+ | Confidence | {high / medium / low} |
56
+ | Disclosure | {inline / link_only / omit / ask_user} |
57
+ | Link Targets | {path or URL when link_only; otherwise N/A} |
58
+ | Helper | `oat docs nav sync` / `oat docs init` / `manual edit` |
57
59
 
58
60
  **Context:** {1-2 sentences}
59
61
 
@@ -64,6 +66,29 @@ blocked pending a fresh analysis rather than guessed.
64
66
 
65
67
  {Repeat for each recommendation}
66
68
 
69
+ ## Restructure block (one individually approved ID, one exact-path commit)
70
+
71
+ - ID / individual approval evidence: {R-NNN / operator choice, or pending}
72
+ - Source → destination map: {every moved/retired page}
73
+ - Parent Contents edits: {source and destination indexes}
74
+ - Grep-derived inbound rewrites: {command + referring file:line + old/new link,
75
+ including anchors/assets and rewritten links inside moved pages}
76
+ - Old-URL strategy: {verified host redirect, authored stub, or archive pointer;
77
+ static export: no assumed Next redirects}
78
+ - Retired-page recovery: {retained stub/archive pointer + parent Contents entry}
79
+ - Sidebar owner: {nav-sync / hand-authored / undeclared; Markdown: ignored}
80
+ - Verification: {nav-sync write then --check, or read-only membership/order
81
+ comparison; file/link checks; actual base-path old URL; analyze rerun}
82
+ - Exact owned files and commit identity: {list including both rename sides}
83
+
84
+ ## IA recording / tooling limits
85
+
86
+ - Record IA: {adoption.state from target pjm doctor; decision command/path;
87
+ framework AGENTS or Markdown contributing section; shared mirror JSON}
88
+ - Tooling update: {individually approved ID; exact docs-app docs-\* upgrade
89
+ command; supported migrate conversions; existing build verifier}
90
+ - Unsupported app config/routes/scripts: {manual required changes; no edits}
91
+
67
92
  ## Summary of Actions
68
93
 
69
94
  | # | Action | Target | Disclosure | Decision |
@@ -73,6 +98,25 @@ blocked pending a fresh analysis rather than guessed.
73
98
 
74
99
  **Total:** {N} approved, {N} modified, {N} skipped
75
100
 
101
+ ## Structured result
102
+
103
+ ```json
104
+ {
105
+ "analysisArtifact": "{path}",
106
+ "approvedRecommendationIds": ["R-001"],
107
+ "applied": ["R-001"],
108
+ "skipped": [
109
+ { "id": "R-002", "reason": "explicit_requires_interactive_approval" }
110
+ ],
111
+ "failed": []
112
+ }
113
+ ```
114
+
115
+ Every input ID has exactly one outcome. Unattended explicit items are skipped
116
+ regardless of the supplied ID list. Missing/unknown class or ID blocks intake.
117
+ Use reason `manual` with the required change for unsupported scaffold work;
118
+ failed entries carry an ID and error/verification reason.
119
+
76
120
  ## Proceed?
77
121
 
78
122
  Confirm to begin applying the approved documentation changes.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: '1.4.0'
9
+ version: '1.4.2'
10
10
  ---
11
11
 
12
12
  # Docs Bootstrap
@@ -321,7 +321,7 @@ Resolution options:
321
321
  ```
322
322
 
323
323
  - **`repair`** — Fix the existing setup in place rather than replacing it. Delegate to the docs-analysis pack.
324
- - **Allowed mutations (by this sub-procedure):** None directly. The bootstrap skill does not modify existing docs app files. It hands off to `oat-docs-analyze` (read-only audit) and, with user approval, to `oat-docs-apply` (applies approved recommendations).
324
+ - **Allowed mutations (by this sub-procedure):** None directly. The bootstrap skill does not modify existing docs app files. It hands off to `oat-docs-analyze` (read-only audit), then passes the analysis artifact plus approved recommendation IDs to `oat-docs-apply`; explicit items require individual approval.
325
325
  - **Preserved state:** Existing docs app directory, the `documentation` config section, the root `AGENTS.md` `## Documentation` section — all preserved unless analyze surfaces a recommendation and the user approves it via apply.
326
326
  - **Stop conditions:**
327
327
  - Invoke `oat-docs-analyze` and surface its report to the user. If analyze cannot produce meaningful recommendations (e.g., `documentation.index` points at a missing file, or the app directory is empty), **stop the flow before Scaffold Runner**, report what analyze found, and ask the user whether to escalate to `replace`.
@@ -390,9 +390,19 @@ through `oat-docs-analyze --ia`; it does not return to scaffold afterward.
390
390
  `ask_user` with local/external source citations. Non-repo guidance stays read-only
391
391
  and private exemplars are never copied. Cite ordered sources in the proposal
392
392
  and final summary, including the built-in path when it wins.
393
- 6. Carry the proposal to analyze/apply content kickoff. This stage proposes only:
394
- it does not persist an accepted IA, restructure pages or scaffold preset trees.
395
- CLI scaffold output remains the existing starter; those capabilities ship later.
393
+ 6. Obtain explicit approval of the selected IA before persistence. After setup,
394
+ use apply's `record-ia` procedure: target-repo `oat pjm doctor --json` and
395
+ adoption check before `oat decision new`, an Information architecture section
396
+ in the framework docs-app AGENTS.md or Markdown contributing page, and shared
397
+ `documentation.ia` mirror. Preserve existing guidance; the authored record is
398
+ authoritative. If approval/adoption is pending, retain the proposal and report
399
+ it unrecorded. Do not silently initialize PJM. For an existing surface, hand
400
+ off an analysis artifact plus approved recommendation IDs to apply, with
401
+ individual approval for explicit record/restructure/tooling items.
402
+ This IA selection stage does not materialize preset trees or change ownership for an existing app.
403
+ Sidebar ownership is separately chosen for existing framework apps; absent
404
+ remains undeclared, Markdown ignores it, and no automatic nav generation is
405
+ authorized by IA approval alone.
396
406
 
397
407
  ### Step 3: Scaffold Runner
398
408
 
@@ -402,6 +412,10 @@ Print `[3/7] Scaffolding…` at the start of this step.
402
412
 
403
413
  **Precondition:** The Conflict Resolution Contract's "Allowed mutations" have completed and the working-tree state matches what the CLI expects (Step 2's pre-scaffold invariant). If any resolution-triggered mutation is still pending, **do not invoke the CLI** — stop the flow and surface the missing state.
404
414
 
415
+ For an explicitly fresh Fumadocs/MkDocs app, current CLI init writes `documentation.navOwner: nav-sync` and generates navigation after successful scaffold/config. An explicitly selected new app in a repository with prior docs config is fresh creation; preserve the old app's authored files. This does not authorize regeneration of an existing app: keep undeclared/hand-authored ownership untouched and use the existing analyze/apply handoff. IA approval alone never authorizes navigation writes. Markdown and dry runs run no nav sync.
416
+
417
+ Inspect the generated package scripts rather than adding a duplicate patch: Fumadocs `prebuild` and MkDocs `docs:build` run `nav sync --check`, using external `oat` from the app directory with `--target-dir .`, or source-workspace CLI with the explicit quoted repo-relative app. A stale navigation check requires fixing authored Contents and explicitly syncing owned navigation before retrying, not deleting the check or silently regenerating an undeclared owner.
418
+
405
419
  **3a. Assemble CLI flags.**
406
420
 
407
421
  Build the flag list deterministically from the Input Result (Step 2e) and the Capability Detection result (Step 3b). Non-interactive mode is mandatory — the skill owns the interactive flow; the CLI runs headless.
@@ -702,6 +716,8 @@ Narrate each field actually present in their config (skip fields that are absent
702
716
  - **Fumadocs:** this should be the generated app-root manifest, usually `<appRoot>/index.md`, after the successful build ran `oat docs generate-index`. Explain that this machine-shaped file is how tools inspect the full Markdown file tree, and that the authored source map the user edits is a separate file at `<appRoot>/docs/index.md` with its own `## Contents`.
703
717
  - **Fumadocs stale path warning:** if the inspected path still points inside `<appRoot>/docs/` after build verification, do not teach that as normal. Surface it as a warning that `oat docs generate-index` did not update `documentation.index` as expected, then point the user to Section B for the generated/authored split.
704
718
  - **MkDocs:** this should point at the configured MkDocs nav/config surface, usually `<appRoot>/mkdocs.yml` and matching `documentation.config`. Explain that the YAML file contains the generated/derived `nav:` block when `oat docs nav sync` is used, while authored `docs/index.md` and nested `## Contents` sections remain the source maps the user edits.
719
+ - **`documentation.navOwner`** — fresh framework init explicitly sets `nav-sync`; existing absent means undeclared and `hand-authored` stays authored. Never infer write permission from missing ownership. Markdown ignores it.
720
+ - **`documentation.nonReaderPaths`** — if present, content-root-relative bounded globs omit drafts/templates from nav inventory, explicit Contents links, nav checks and manifests; excluded metadata is not rewritten. OAT Fumadocs collections also omit rendering when wired through source config. Pinned MkDocs 1.4.2 still renders these routes; explain the limitation and do not add a plugin or upgrade as a bootstrap repair. `documentation.excludes` stays manifest-only. Do not add exclusions or mutate this setting without an approved content/config change through the existing workflow.
705
721
  - **`documentation.config`** — optional path to the framework configuration, such as `mkdocs.yml` or `next.config.js`. Inspect whichever path is actually configured.
706
722
  - **`documentation.requireForProjectCompletion`** — the opt-in collected in Step 5e. If `true`, `oat-project-complete` will block project completion until the project records `oat_docs_updated: complete` or an explicit `skipped` after the `oat-project-document` prompt. Explain whichever value is set on this project.
707
723
 
@@ -734,11 +750,12 @@ This section explains why tooling works at all — the contract every OAT docs t
734
750
 
735
751
  Narrate:
736
752
 
737
- - **Every directory under `docs/` has an `index.md`.** No exceptions, no `overview.md`, no README-as-index. Missing `index.md`s are the first thing `oat-docs-analyze` flags.
753
+ - **Every non-excluded Markdown-bearing directory under `docs/` has an `index.md`.** Asset-only and non-reader trees are exempt; use no `overview.md` or README-as-index. Missing reader indexes are an analyze finding.
738
754
  - **Every `index.md` has a `## Contents` section.** The section is a plain Markdown bulleted list of links to the direct children of that directory — both subdirectory `index.md`s and leaf pages.
739
755
  - **Link targets use `.md` extensions.** Leaf pages link as `[Title](page.md)`; subdirectories link as `[Section](subdir/index.md)`. The `@open-agent-toolkit/docs-transforms` remark-links plugin normalizes these at build time for Fumadocs routing (`.md` stripped; `dir/index.md` collapsed to `dir`). `.md`-suffixed authored links render correctly **and** let agents follow each link to the target file without path inference — the best of both worlds.
740
756
  - **The `## Contents` section is the machine-readable local map.** For Fumadocs, `oat docs nav sync` reads it to write the committed `meta.json` sidebar files, and agents compare it against the generated app-root manifest. For MkDocs, `oat docs nav sync` reads it to update `mkdocs.yml` `nav:`. `oat-docs-analyze` reads the same authored source to find orphaned pages and stale generated artifacts.
741
- - **Anything not listed in `## Contents` is invisible to the tooling.** Adding a Markdown file is not enough — it must also appear under the parent `index.md`'s `## Contents`.
757
+ - **Contents uses dash links and optional `### <Label>` groups.** Groups become Fumadocs separators or MkDocs nested nav. Empty authored groups and `*`/`+` link bullets are file/line errors; add a dash link/remove the empty heading, or replace the bullet with `-`.
758
+ - **Reader pages must appear in the local Contents map for navigation.** The manifest retains deterministic unlisted fallback entries and flags them; adding a file alone does not put it in the sidebar. Non-reader exclusions take precedence over explicit Contents links.
742
759
 
743
760
  Show the user their own `docs/index.md` `## Contents` as a concrete example (read the file and paste the relevant 5–15 lines). Then note: "That's the pattern. Every directory you create from now on follows the same shape — `.md`-suffixed links, bulleted list, dash-separated summary per entry."
744
761
 
@@ -836,7 +853,13 @@ Delegate — do not re-implement analyze/apply logic here.
836
853
 
837
854
  1. Invoke the `oat-docs-analyze` skill against the scaffolded app. Pass the Inspection Result's `documentation.root` path so analyze targets the right surface. Wait for analyze to complete.
838
855
  2. Surface analyze's report to the user in its native form — do not re-summarize. The user reads it, decides which recommendations to approve.
839
- 3. If the user approves any recommendations, invoke the `oat-docs-apply` skill with the approved subset. Wait for apply to complete.
856
+ 3. Capture the analysis artifact path and approved recommendation IDs, then
857
+ invoke `oat-docs-apply` with exactly that input. Preserve every approval class:
858
+ blanket approval covers only default items; explicit items need individual
859
+ approval by ID, and unattended runs skip/report them. Wait for apply's
860
+ structured applied/skipped-with-reason/failed IDs; report partial/manual work.
861
+ Never pass an unexplained "approved subset" or treat kickoff consent as
862
+ approval of every recommendation.
840
863
  4. Report the outcome back briefly: branch name, PR URL if opened, files changed count.
841
864
 
842
865
  If analyze produces no recommendations (the scaffold is complete and nothing's missing — unlikely on a fresh scaffold but possible), tell the user and skip apply.
@@ -867,6 +890,8 @@ Location: {appRoot}
867
890
  Framework: {framework}
868
891
  IA guidance: {ordered selected locators + explicit/conversation/shared/user/builtin provenance}
869
892
  IA proposal: {candidate recommendation, nearest preset, conflicts or none}
893
+ IA record: {decision + authored section + shared mirror, or pending reason}
894
+ Apply handoff: {artifact path, approved IDs, applied/skipped/failed result or not run}
870
895
  Config: {configPath} (documentation section)
871
896
 
872
897
  Created:
@@ -7,7 +7,7 @@
7
7
  "scripts": {
8
8
  "predev": "fumadocs-mdx && {{GENERATE_INDEX_CMD}}",
9
9
  "dev": "next dev",
10
- "prebuild": "fumadocs-mdx && {{GENERATE_INDEX_CMD}}",
10
+ "prebuild": "{{NAV_SYNC_CHECK_CMD}} && fumadocs-mdx && {{GENERATE_INDEX_CMD}}",
11
11
  "build": "next build",
12
12
  "start": "next start",
13
13
  "docs:lint": "{{DOCS_LINT_SCRIPT}}",
@@ -1,10 +1,15 @@
1
1
  import { createSourceConfig } from '@open-agent-toolkit/docs-config';
2
2
  import { defineConfig, defineDocs } from 'fumadocs-mdx/config';
3
3
 
4
- const sourceConfig = createSourceConfig();
4
+ const sourceConfig = createSourceConfig({
5
+ oatConfigFile: '{{OAT_CONFIG_RELATIVE_PATH}}',
6
+ appRoot: '.',
7
+ });
5
8
 
6
9
  export const docs = defineDocs({
7
10
  dir: sourceConfig.contentDir,
11
+ docs: sourceConfig.docs,
12
+ meta: sourceConfig.meta,
8
13
  });
9
14
 
10
15
  export default defineConfig({
@@ -6,7 +6,7 @@
6
6
  "description": "MkDocs Material documentation for {{SITE_NAME}}.",
7
7
  "scripts": {
8
8
  "docs:dev": "mkdocs serve",
9
- "docs:build": "mkdocs build",
9
+ "docs:build": "{{NAV_SYNC_CHECK_CMD}} && mkdocs build",
10
10
  "docs:setup": "sh ./setup-docs.sh",
11
11
  "docs:lint": "{{DOCS_LINT_SCRIPT}}",
12
12
  "docs:format": "{{DOCS_FORMAT_SCRIPT}}",
@@ -14,6 +14,6 @@
14
14
  "test": "echo 'Documentation tests complete'"
15
15
  },
16
16
  "devDependencies": {
17
- {{DEV_DEPENDENCIES}}
17
+ "@open-agent-toolkit/cli": "{{OAT_CLI_DEP}}"{{DEV_DEPENDENCIES}}
18
18
  }
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAoBzC,OAAO,EAUL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,cAAc,EAQnB,KAAK,UAAU,EAwBhB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAGL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,mCAAmC,EACnC,0BAA0B,EAC3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6KpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kCAAkC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E,2CAA2C,EAAE,CAC3C,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,gDAAgD,EAAE,CAChD,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,6CAA6C,EAAE,CAC7C,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACxE,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,mCAAmC,EAAE,OAAO,mCAAmC,CAAC;IAChF,0BAA0B,EAAE,OAAO,0BAA0B,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA83HD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAqMT"}