@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.
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/docs-tooling/add-docs-to-a-repo.md +14 -6
- package/assets/docs/docs-tooling/commands.md +12 -9
- package/assets/docs/docs-tooling/workflows.md +53 -8
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/reference/configuration.md +3 -0
- package/assets/docs/reference/docs-index-contract.md +19 -6
- package/assets/docs/reference/oat-directory-structure.md +13 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-docs-analyze/SKILL.md +106 -6
- package/assets/skills/oat-docs-analyze/references/analysis-artifact-template.md +42 -2
- package/assets/skills/oat-docs-analyze/scripts/package-drift.mjs +129 -0
- package/assets/skills/oat-docs-apply/SKILL.md +131 -12
- package/assets/skills/oat-docs-apply/references/apply-plan-template.md +58 -14
- package/assets/skills/oat-docs-bootstrap/SKILL.md +33 -8
- package/assets/templates/docs-app-fuma/package.json.template +1 -1
- package/assets/templates/docs-app-fuma/source.config.ts +6 -1
- package/assets/templates/docs-app-mkdocs/package.json.template +2 -2
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +67 -9
- package/dist/commands/docs/index-generate/generator.d.ts +4 -34
- package/dist/commands/docs/index-generate/generator.d.ts.map +1 -1
- package/dist/commands/docs/index-generate/generator.js +51 -157
- package/dist/commands/docs/index-generate/index.d.ts +1 -1
- package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
- package/dist/commands/docs/index-generate/index.js +26 -8
- package/dist/commands/docs/init/index.d.ts.map +1 -1
- package/dist/commands/docs/init/index.js +21 -1
- package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
- package/dist/commands/docs/init/scaffold.js +20 -13
- package/dist/commands/docs/nav/contents.d.ts +13 -3
- package/dist/commands/docs/nav/contents.d.ts.map +1 -1
- package/dist/commands/docs/nav/contents.js +85 -24
- package/dist/commands/docs/nav/fumadocs.d.ts +1 -0
- package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -1
- package/dist/commands/docs/nav/fumadocs.js +26 -9
- package/dist/commands/docs/nav/sync.d.ts +2 -0
- package/dist/commands/docs/nav/sync.d.ts.map +1 -1
- package/dist/commands/docs/nav/sync.js +21 -1
- package/dist/commands/docs/shared/exclusions.d.ts +37 -0
- package/dist/commands/docs/shared/exclusions.d.ts.map +1 -0
- package/dist/commands/docs/shared/exclusions.js +161 -0
- package/dist/config/oat-config.d.ts +18 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +64 -3
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +5 -1
- 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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
-
|
|
163
|
-
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
### {
|
|
45
|
-
|
|
46
|
-
| Field | Value
|
|
47
|
-
| ------------ |
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
|
|
|
56
|
-
|
|
|
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.
|
|
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)
|
|
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.
|
|
394
|
-
|
|
395
|
-
|
|
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`.**
|
|
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
|
-
- **
|
|
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.
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
|