@open-agent-toolkit/cli 0.3.32 → 0.3.34
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/contributing/documentation.md +1 -0
- package/assets/docs/docs-tooling/check.md +35 -11
- package/assets/docs/docs-tooling/commands.md +20 -2
- package/assets/docs/reference/cli-reference.md +2 -2
- package/assets/docs/reference/config-and-local-state.md +1 -1
- package/assets/docs/reference/configuration.md +1 -1
- package/assets/docs/reference/docs-index-contract.md +3 -2
- package/assets/docs/reference/oat-directory-structure.md +1 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-docs-analyze/SKILL.md +35 -11
- package/assets/skills/oat-docs-analyze/references/analysis-artifact-template.md +2 -2
- package/assets/skills/oat-docs-analyze/references/quality-checklist.md +3 -1
- package/assets/skills/oat-docs-analyze/scripts/package-drift.mjs +303 -30
- package/assets/skills/oat-docs-apply/SKILL.md +3 -1
- package/assets/skills/oat-docs-authoring/SKILL.md +1 -1
- package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +6 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +42 -9
- package/dist/commands/docs/check/check.d.ts.map +1 -1
- package/dist/commands/docs/check/check.js +1 -0
- package/dist/commands/docs/check/checker.d.ts +2 -0
- package/dist/commands/docs/check/checker.d.ts.map +1 -1
- package/dist/commands/docs/check/checker.js +6 -1
- package/dist/commands/docs/check/commands.d.ts.map +1 -1
- package/dist/commands/docs/check/commands.js +74 -30
- package/dist/commands/docs/check/files.d.ts +2 -0
- package/dist/commands/docs/check/files.d.ts.map +1 -1
- package/dist/commands/docs/check/files.js +16 -0
- package/dist/commands/docs/check/navigation.d.ts +11 -1
- package/dist/commands/docs/check/navigation.d.ts.map +1 -1
- package/dist/commands/docs/check/navigation.js +40 -69
- package/dist/commands/docs/check/reader-rules.d.ts.map +1 -1
- package/dist/commands/docs/check/reader-rules.js +12 -9
- package/dist/commands/docs/nav/contents.d.ts +50 -2
- package/dist/commands/docs/nav/contents.d.ts.map +1 -1
- package/dist/commands/docs/nav/contents.js +137 -14
- package/dist/commands/docs/nav/fumadocs.d.ts +29 -0
- package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -1
- package/dist/commands/docs/nav/fumadocs.js +16 -41
- package/dist/commands/docs/nav/membership.d.ts +37 -0
- package/dist/commands/docs/nav/membership.d.ts.map +1 -0
- package/dist/commands/docs/nav/membership.js +474 -0
- package/dist/commands/docs/nav/sync.d.ts +26 -2
- package/dist/commands/docs/nav/sync.d.ts.map +1 -1
- package/dist/commands/docs/nav/sync.js +160 -43
- package/package.json +3 -3
|
@@ -13,6 +13,7 @@ Documentation should ship with the code it explains. This page covers the core d
|
|
|
13
13
|
- Each `index.md` must include a `## Contents` section.
|
|
14
14
|
- The `## Contents` section is the machine-readable local map for sibling pages and child directories.
|
|
15
15
|
- Use `.md`-suffixed relative links in `## Contents`: `[Page](page.md)` for leaf pages and `[Section](subdir/index.md)` for child directories.
|
|
16
|
+
- A directory whose `index.md` is its only reader page, with no child sections, may instead list same-page heading anchors (`[Setup](#setup)`) as an in-page table of contents; anywhere else, Contents links must target pages or sections.
|
|
16
17
|
- Fumadocs and MkDocs share this authored contract, but they regenerate different artifacts.
|
|
17
18
|
|
|
18
19
|
Within Contents, use dash-only link bullets with optional descriptions. A `### Label` introduces a group containing at least one authored entry; entries before the first group stay ungrouped. `*`/`+` link bullets and empty groups produce file/line errors. The map ends at the next level-two heading, and fenced examples are ignored. A self-index link retains landing-page behavior. Missing Contents retains deterministic manifest fallback, while strict nav still requires maps and reports unlisted reader pages.
|
|
@@ -17,7 +17,13 @@ oat docs check --rule description h1 --rule links --json
|
|
|
17
17
|
|
|
18
18
|
Omitted targets use `documentation.root`, then the existing `docs` fallback.
|
|
19
19
|
Framework app roots resolve to their content directory. A literal Markdown root
|
|
20
|
-
stays literal even with a child named `docs`.
|
|
20
|
+
stays literal even with a child named `docs`. The checker never reads
|
|
21
|
+
`node_modules` or hidden directories such as `.git` and `.oat`. An explicit
|
|
22
|
+
target other than the configured root is checked without the configured policy;
|
|
23
|
+
the text output prints a notice that says so and names the mode. Targeting a
|
|
24
|
+
configured framework app's `docs/` content directory checks it as Markdown and
|
|
25
|
+
skips navigation, so the notice suggests the app root instead. Notices never
|
|
26
|
+
appear in `--json` output. Paths in findings are deterministic,
|
|
21
27
|
content-root-relative POSIX paths; physical line locations are included when
|
|
22
28
|
available, including nested supported tabs. No sidebar or default manifest is
|
|
23
29
|
required for Markdown.
|
|
@@ -47,9 +53,23 @@ Fix the authored page, its local Contents map and inbound links together. For
|
|
|
47
53
|
owned generated navigation, run `oat docs nav sync`, then rerun the checker.
|
|
48
54
|
Hand-authored or undeclared navigation is compared for membership/order without
|
|
49
55
|
requiring generated display labels, title fields or YAML formatting; do not
|
|
50
|
-
silently regenerate it.
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
silently regenerate it. A page listed in Contents must be reachable from some
|
|
57
|
+
sidebar entry: its own folder's `pages`, a rest entry, a borrow from another
|
|
58
|
+
folder such as `"../install"`, a root-relative link item to its URL, or the
|
|
59
|
+
folder's `pagesIndex` (a page path, or a link to the folder's own URL). The
|
|
60
|
+
docs root never shows its own index in the sidebar, so a root `pagesIndex` does
|
|
61
|
+
not count; list `index` or link to `/`. Folders with `root` set get no implicit
|
|
62
|
+
index either. Only
|
|
63
|
+
folders the sidebar attaches from the docs root count: a link to a folder's URL
|
|
64
|
+
reaches its landing page, not its other pages. A `"...name"` extraction inlines a folder's
|
|
65
|
+
index and pages and never names a page. Every
|
|
66
|
+
`pages` or `nav` entry must name an existing page or folder, and listed pages keep
|
|
67
|
+
their Contents order. Separators and their labels, MkDocs section labels and
|
|
68
|
+
nesting, link items, rest entries and borrowed pages are presentation and are
|
|
69
|
+
not compared. Messages name the mismatch: a missing reader page or folder, a
|
|
70
|
+
missing target, or an order difference with both orders. Missing optional
|
|
71
|
+
Fumadocs metadata, metadata objects without `pages`, and absent MkDocs `nav`
|
|
72
|
+
skip comparison. Present `pages` must be an array of strings. Implicit Fumadocs order is not
|
|
53
73
|
compared. Nav-sync ownership retains its existing strict read-only freshness check. Generated inventories are separate: regenerate configured output
|
|
54
74
|
and check its Git diff after the build. A build that rewrites the inventory does
|
|
55
75
|
not prove the committed copy was fresh.
|
|
@@ -71,22 +91,22 @@ recursive tabs participate.
|
|
|
71
91
|
|
|
72
92
|
| Rule ID | Default behavior |
|
|
73
93
|
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
74
|
-
| `directory-index` | Error for a reader-bearing directory without `index.md` and a nonempty dash-bullet Contents map, invalid map grammar or unresolved strict Contents target. Ancestors of reader pages participate.
|
|
94
|
+
| `directory-index` | Error for a reader-bearing directory without `index.md` and a nonempty dash-bullet Contents map, invalid map grammar or unresolved strict Contents target. Ancestors of reader pages participate. A same-page anchor such as `#setup` is not a Contents target, except in an index-only leaf. |
|
|
75
95
|
| `root-width` | Flat root Contents links warn above `rootWarn: 10`, error above `rootError: 14`. Real groups exempt the width. |
|
|
76
96
|
| `contents-width` | Ungrouped Contents links warn above `contentsWarn: 10`, error above `contentsError: 15`. `catalog: true` or the recognized OAT generated-index marker exempts only this width rule. |
|
|
77
|
-
| `leaf-size` | Direct reader pages include index. A leaf has no reader-bearing child directory
|
|
97
|
+
| `leaf-size` | Direct reader pages include index. A leaf has no reader-bearing child directory. An index-only leaf (its `index.md` is the only reader page) warns: it renders as a single-page section, so flattening it is a suggestion. Two total pages warn. |
|
|
78
98
|
| `folder-size` | Direct reader pages including index warn above `folderWarn: 12`, error above `folderError: 20`, unless the index has real groups. |
|
|
79
99
|
| `depth` | Content root is depth 0; warn at `depthWarn: 4`, error at `depthError: 5`. |
|
|
80
100
|
| `page-length` | Warn above `pageLines: 500` physical source lines. Explicit `type: reference` or `reference`/`references` path segments use `referenceLines: 1000` and warn above `referenceH3: 40` real H3 headings. No default length error limit. `line` is the first physical line past the line limit, or the first H3 past the heading limit. |
|
|
81
101
|
| `frontmatter` | Unreadable source, invalid YAML or a non-mapping frontmatter document errors. Read failures use relative paths and safe error codes; invalid metadata skips description validation while independent body checks continue at physical positions. |
|
|
82
102
|
| `description` | Missing/empty frontmatter description errors; character lengths below `descriptionMin: 40` or above `descriptionMax: 160` warn. |
|
|
83
103
|
| `h1` | Error unless each page has exactly one real H1. |
|
|
84
|
-
| `links` | Error for unresolved in-root source links/anchors. No network checking. Ordinary escaping links are provenance warnings and their targets are not read. Contents links retain stricter local-map rules.
|
|
104
|
+
| `links` | Error for unresolved in-root source links/anchors. No network checking. Ordinary escaping links are provenance warnings and their targets are not read. Contents links retain stricter local-map rules; the same-page anchors an index-only leaf may list in Contents are checked here, against that page's headings. |
|
|
85
105
|
| `contents-description` | Error for descriptions ending in an ellipsis/truncation. |
|
|
86
106
|
| `overview` | Warn below `overviewWords: 10` before Contents. |
|
|
87
107
|
| `contents-separator` | Warn when Contents descriptions mix separators in a tree. |
|
|
88
|
-
| `navigation` | Error for explicit navigation drift
|
|
89
|
-
| `commands` | Error for missing literal contributor scripts;
|
|
108
|
+
| `navigation` | Error for explicit navigation drift. Nav-sync freshness stays strict; hand-authored/undeclared compare membership and order only (separators, labels, links and borrows are not compared), and absent optional meta/pages/nav skips comparison. Markdown skips it. |
|
|
109
|
+
| `commands` | Error for missing literal contributor scripts; framework app targets try the app package first, then the repository root. Implicit pnpm shorthand also accepts installed package/workspace `.bin` entries. Explicit pnpm run/npm run stays script-only; unresolved context errors; echo scripts warn. |
|
|
90
110
|
| `mermaid` | Parse every real Mermaid fence using the pinned Mermaid parser. Invalid syntax errors. |
|
|
91
111
|
| `diagram-pairs` | Diagram light/dark SVG siblings and both page references are required. Conventional diagram paths and explicit paired references participate; ordinary logos are not diagrams. |
|
|
92
112
|
| `diagram-accessibility` | Mermaid missing `accTitle`/`accDescr` warns. SVGs require `role="img"`, nonempty title/desc. Rendered diagrams without page-visible explanatory text or an associated long description warn. |
|
|
@@ -103,8 +123,12 @@ focused maps. `documentation.nonReaderPaths` uses the existing
|
|
|
103
123
|
|
|
104
124
|
Literal pnpm script and npm run examples in `contributing.md`/`.mdx` and
|
|
105
125
|
`contributing/**` are checked against package manifests. Each code block starts
|
|
106
|
-
at the repository root.
|
|
107
|
-
|
|
126
|
+
at the repository root. For a framework app target with its own `package.json`,
|
|
127
|
+
it also starts at the app root, which is tried first: a script defined by the app
|
|
128
|
+
resolves there, a script only the repository root defines still resolves, and a
|
|
129
|
+
missing script names both manifests. Markdown targets use the repository root
|
|
130
|
+
only. Use executable `cd`, `-w`/`--workspace-root`, `--dir` or literal `--filter`
|
|
131
|
+
selection to establish another context. Prose such as “from
|
|
108
132
|
the app directory” alone does not change it. Built-in package-manager commands
|
|
109
133
|
and illustrative placeholders are recognized; commands are never run.
|
|
110
134
|
|
|
@@ -297,10 +297,28 @@ site nav generation. Framework apps generate navigation as follows:
|
|
|
297
297
|
generated `meta.json` files.
|
|
298
298
|
|
|
299
299
|
Use `--check` in builds and CI. It computes the same navigation, writes
|
|
300
|
-
nothing, and exits 1 when any generated file would change or, for
|
|
301
|
-
any page or folder is unlisted
|
|
300
|
+
nothing, and exits 1 when any generated file is missing or would change or, for
|
|
301
|
+
Fumadocs, any page or folder is unlisted. It names each one and separates
|
|
302
|
+
missing files from differing ones (`stale`, `missing` and `unlisted` in
|
|
302
303
|
`--json`). Fresh Fumadocs `prebuild` and MkDocs `docs:build` scripts run it with explicit app selection, preserving external `oat` versus source-workspace CLI commands and quoting paths with spaces. This repository's `apps/oat-docs` `prebuild` also runs it, so `pnpm build:docs` fails on stale navigation.
|
|
303
304
|
|
|
305
|
+
Without `--target-dir`, the command uses the configured `documentation.root`,
|
|
306
|
+
like `oat docs check`, and falls back to the current directory only when no root
|
|
307
|
+
is configured. With `documentation.tooling: markdown` it exits 1 and says nav
|
|
308
|
+
sync does not apply: Markdown Contents maps are the navigation, so validate
|
|
309
|
+
them with `oat docs check`.
|
|
310
|
+
|
|
311
|
+
The command reads `documentation.navOwner` when the target is the configured root:
|
|
312
|
+
|
|
313
|
+
| Owner | Writing run | `--check` |
|
|
314
|
+
| --------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
315
|
+
| `nav-sync` | Regenerates navigation. | Strict: generated files must match. |
|
|
316
|
+
| `hand-authored` | Refuses with exit 1 and writes nothing. Edit the navigation directly or change the owner. | Membership and order only, as in [`oat docs check`](check.md#results-and-repair): every Contents page reachable, no entry naming a missing page, listed pages in Contents order. |
|
|
317
|
+
| undeclared | Regenerates navigation and warns you to declare an owner. | Strict, with the same warning. |
|
|
318
|
+
|
|
319
|
+
Fresh `oat docs init` framework scaffolds declare `nav-sync` and run their first
|
|
320
|
+
sync directly, so they are unaffected.
|
|
321
|
+
|
|
304
322
|
Shared `documentation.nonReaderPaths` uses the exclusion grammar above, relative to the configured content root. Navigation inventory, explicit Contents links, `--check` and manifests omit matches; excluded metadata is never cleaned or rewritten. An unrelated explicit target does not inherit the setting. `documentation.excludes` stays manifest-only. OAT Fumadocs source collections omit non-readers from rendering too; pinned MkDocs 1.4.2 omits them from nav/manifest but still renders their routes (no rendering-exclusion support).
|
|
305
323
|
|
|
306
324
|
Fumadocs apps also regenerate the root markdown manifest with
|
|
@@ -237,7 +237,7 @@ Notable commands introduced in the current CLI surface:
|
|
|
237
237
|
- `--local` — write to or remove from `.oat/config.local.json` (per-developer repo state, gitignored)
|
|
238
238
|
- `--user` — write to or remove from `~/.oat/config.json` (user-level fallback, applies across all repos)
|
|
239
239
|
|
|
240
|
-
When no flag is passed, the CLI picks a sensible default per key type: structural keys (`projects.root`, `documentation.*`, etc.) go to shared, state keys (`activeProject`, etc.) go to local, workflow preferences (`workflow.*`) go to local. Pass at most one flag — the command rejects multiple surface flags. `documentation.guidance` is shared by default and also accepts `--user`; use a path/URL string or a JSON string array, not a comma-separated list. `documentation.ia` accepts the [recorded IA JSON shape](configuration.md#shared-repo-config-you-will-touch-most-often) and `documentation.navOwner` accepts `nav-sync` or `hand-authored`; both are shared-only. Unset owner means undeclared, and Markdown ignores it. IA is an atomic value in get/dump, not a set of separately configurable child keys. `documentation.nonReaderPaths` is also shared-only and
|
|
240
|
+
When no flag is passed, the CLI picks a sensible default per key type: structural keys (`projects.root`, `documentation.*`, etc.) go to shared, state keys (`activeProject`, etc.) go to local, workflow preferences (`workflow.*`) go to local. Pass at most one flag — the command rejects multiple surface flags. `documentation.guidance` is shared by default and also accepts `--user`; use a path/URL string or a JSON string array, not a comma-separated list. `documentation.ia` accepts the [recorded IA JSON shape](configuration.md#shared-repo-config-you-will-touch-most-often) and `documentation.navOwner` accepts `nav-sync` or `hand-authored`; both are shared-only. Unset owner means undeclared, and Markdown ignores it. IA is an atomic value in get/dump, not a set of separately configurable child keys. `documentation.nonReaderPaths` is also shared-only and takes a comma-separated glob list or a JSON string array on `set` (other input starting with `[` or `{` is rejected), stored as an array; empty clears it. `documentation.excludes` accepts the same two forms. It omits matching reader paths from nav/check/manifest and supported Fumadocs collections, while `documentation.excludes` remains manifest-only. See [non-reader configuration](configuration.md#shared-repo-config-you-will-touch-most-often).
|
|
241
241
|
|
|
242
242
|
Per-key restrictions apply identically to `set` and `unset`: structural keys can only be written at shared scope, most state keys can only be written at local scope (`activeIdea` is the exception — it accepts both local and user), and workflow preference keys accept any non-auto surface. Legacy `autoReviewAtCheckpoints` remains shared-only; prefer `workflow.autoReviewAtHillCheckpoints`.
|
|
243
243
|
|
|
@@ -247,7 +247,7 @@ Remote settings under `pjm.remote.*` remain shared-only. Removing a mutable leaf
|
|
|
247
247
|
|
|
248
248
|
`unset` refuses six classes of key, each with exit code 1:
|
|
249
249
|
|
|
250
|
-
- **Unknown keys**,
|
|
250
|
+
- **Unknown keys**, meaning keys outside the `oat config` catalog. These are not removable by any `oat config` command.
|
|
251
251
|
- **Lifecycle state** (`activeProject`, `lastPausedProject`) — cleared with `oat config set <key> ''` instead.
|
|
252
252
|
- **Pack intent** (`tools.*`) — removed with `oat tools remove --pack <pack> --scope project`, which also removes the installed pack files. Clearing the intent alone would leave them behind.
|
|
253
253
|
- **Aggregate read views** (`workflow.dispatchCeiling`, `workflow.dispatchCeiling.providers`) — these are assembled for `get` from the leaf keys and are not stored as such. Unset `workflow.dispatchCeiling.preset` or `workflow.dispatchCeiling.providers.<provider>` instead.
|
|
@@ -131,7 +131,7 @@ Use `oat config` for repo runtime config inspection and supported key mutation.
|
|
|
131
131
|
|
|
132
132
|
- `oat config get <key>` - read one resolved config value
|
|
133
133
|
- `oat config set <key> <value>` - update a supported shared, repo-local, or user key according to per-key restrictions
|
|
134
|
-
- `oat config unset <key>` - remove a supported key from one surface, with the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. Pruning removes any parent object the removal empties, and the resolved value falls back to the next surface or the built-in default. A key the surface does not hold reports an already-unset outcome and exits 0; `--json` adds a `removed` boolean that distinguishes that no-op from a real removal. Five classes are refused with exit 1: unknown keys
|
|
134
|
+
- `oat config unset <key>` - remove a supported key from one surface, with the same `--shared`/`--local`/`--user` flags and per-key restrictions as `set`. Pruning removes any parent object the removal empties, and the resolved value falls back to the next surface or the built-in default. A key the surface does not hold reports an already-unset outcome and exits 0; `--json` adds a `removed` boolean that distinguishes that no-op from a real removal. Five classes are refused with exit 1: unknown keys, lifecycle state (`activeProject`, `lastPausedProject`, cleared with `oat config set <key> ''`), pack intent (`tools.*`, removed with `oat tools remove --pack <pack> --scope project`), the aggregate read views `workflow.dispatchCeiling` and `workflow.dispatchCeiling.providers`, and environment-shadowed keys with nothing stored on the target surface. See [CLI Reference](cli-reference.md#oat-config-surface-flags) for the full contract
|
|
135
135
|
- `oat config list` - show the resolved command-surface values with source information
|
|
136
136
|
- `oat config dump --json` - emit the full merged config payload with per-key source attribution, suitable for automation and debugging
|
|
137
137
|
- `oat config describe` - list supported config surfaces and keys across shared repo, repo-local, user, and sync/provider config
|
|
@@ -97,7 +97,7 @@ Common keys in `.oat/config.json`:
|
|
|
97
97
|
- `documentation.ia` — shared repository-only mirror of the accepted authored IA. Set JSON with required `preset` (one of the `oat docs init --ia-preset` IDs: `product-engineering-qa`, `consumer-maintainer`, `domain-engineering`, `task-type`, `toolkit-cli` or `flat-small`; the matching approved label, such as `Flat Small`, is accepted as an exact alias) and repo-relative `decision`, optional `tracks: [{path, principle}]`, and optional `verification: "triad" | "agent-only" | "none"`. The decision record plus Information architecture section in framework docs-app `AGENTS.md` or Markdown contributing page remain authoritative. Use `oat config set documentation.ia '{"preset":"flat-small","decision":".oat/repo/reference/decisions/DR-example.md","verification":"none"}'`; unset removes the mirror only. Invalid shapes, unknown presets and absolute, URL or `..` paths are rejected, both when set and when stored config is read: from 0.3.32 a stored unknown preset makes config-reading commands fail until repaired with `oat config set documentation.ia '<JSON>'` or `oat config unset documentation.ia --shared`; the CLI does not check that the decision file exists, and analyze reports a missing record as `ask_user`; neither `--user` nor `--local` is supported.
|
|
98
98
|
- `documentation.navOwner` — shared `nav-sync | hand-authored`, independent of recorded IA, for Fumadocs/MkDocs only. Set with `oat config set documentation.navOwner hand-authored`. Absent is undeclared (`get --json` reports null/default), never implied nav-sync; analyze asks the operator and no automatic regeneration is authorized. Markdown ignores this field. Fresh Fumadocs/MkDocs init explicitly seeds nav-sync and generates navigation after scaffold/config succeeds. Existing apps are not regenerated through bootstrap; explicit nav-sync commands retain their behavior.
|
|
99
99
|
- `documentation.guidance` — advisory Markdown IA source paths/URLs, as a string or ordered non-empty string array. Repo config overrides user config; explicit skill input overrides both. Absent values use the installed `authoring-docs` IA reference. Use `oat config set documentation.guidance ./docs/ia/index.md` or `oat config set documentation.guidance '["~/guidance/index.md","https://example.com/docs/index.md"]' --user`. Arrays retain order; commas in paths are literal. `--local` is unsupported. `get --json` reports `shared`, `user`, or `default` provenance; `unset` reveals the next tier. Only locators are stored, with unrelated config fields preserved. Sources stay read-only, external packs have `index.md` and `## Contents`, and local AGENTS/contributing rules remain authoritative. Conflicts become `ask_user`. See [IA selection](../docs-tooling/workflows.md#ia-selection-and-guidance).
|
|
100
|
-
- `documentation.nonReaderPaths` — shared repository-only array of content-root-relative globs for drafts/templates. Set with `oat config set documentation.nonReaderPaths 'templates/,drafts/**'`; empty value clears and `unset` removes it. Entries are trimmed/de-duplicated; non-arrays, empty or non-string entries are rejected. Local/user writes are refused. The [bounded grammar](../docs-tooling/commands.md#exclusion-patterns) matches nav inventory, explicit Contents targets, nav checks and manifests only for the configured app/content root; excluded metadata is not rewritten. Fumadocs source collections also exclude rendering when wired through OAT source config. Pinned MkDocs 1.4.2 still renders excluded pages as routes; only nav/manifest exclusion is supported.
|
|
100
|
+
- `documentation.nonReaderPaths` — shared repository-only array of content-root-relative globs for drafts/templates. Set with `oat config set documentation.nonReaderPaths 'templates/,drafts/**'` or a JSON string array such as `'["**/AGENTS.md"]'`; other JSON-looking input is rejected; empty value clears and `unset` removes it. Entries are trimmed/de-duplicated; non-arrays, empty or non-string entries are rejected. Local/user writes are refused. The [bounded grammar](../docs-tooling/commands.md#exclusion-patterns) matches nav inventory, explicit Contents targets, nav checks and manifests only for the configured app/content root; excluded metadata is not rewritten. Fumadocs source collections also exclude rendering when wired through OAT source config. Pinned MkDocs 1.4.2 still renders excluded pages as routes; only nav/manifest exclusion is supported.
|
|
101
101
|
- `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
|
|
102
102
|
- `documentation.check` — shared checker policy: stable rule severities, named numeric thresholds, reason-bearing bounded path/rule exceptions, ticket/milestone regex patterns and optional diagram base ref. Set/get/dump/unset preserve and validate the object. See [Check Documentation](../docs-tooling/check.md#configure-narrow-policy) for exact fields/defaults and repair commands.
|
|
103
103
|
- `documentation.requireForProjectCompletion` — whether docs sync is a completion gate
|
|
@@ -39,6 +39,7 @@ Notes:
|
|
|
39
39
|
- A group with no authored entries is an error with its file and line; add a dash link or remove the empty heading. A `*` or `+` link bullet is also an error with file and line; replace it with `-`.
|
|
40
40
|
- Child directories should link to their `index.md`.
|
|
41
41
|
- Leaf pages should link to their `.md` filename.
|
|
42
|
+
- An index-only leaf, a directory whose `index.md` is its only reader page and that has no child sections, may list same-page heading anchors such as `[Setup](#setup)` as an in-page table of contents. Each must be a valid Markdown link; a destination Markdown renders as plain text, such as `(#set up)`, is an error. Nav sync adds no navigation entry for them, `oat docs check` reports an anchor whose heading does not exist, and the `leaf-size` rule warns that the section could be flattened. In any other directory a same-page anchor in Contents is an error: link a page or section instead.
|
|
42
43
|
- Prose outside `## Contents` is ignored by nav generation and remains freeform; it can explain scope, reader paths, or migration status.
|
|
43
44
|
|
|
44
45
|
## Plain Markdown Ownership
|
|
@@ -90,7 +91,7 @@ Fumadocs generated behavior:
|
|
|
90
91
|
- Existing files are compared by meaning, not bytes, so a second run with no docs changes writes nothing, even after a formatter rewrites the files.
|
|
91
92
|
- `.md` and `.mdx` pages can both be listed; each appears in `pages` by its file name without the extension.
|
|
92
93
|
|
|
93
|
-
`oat docs nav sync --check` computes the same result and writes nothing. It exits 1 when a `meta.json` file would change or a page or folder is unlisted, and names each one. In this app, `prebuild` runs it, so `pnpm build:docs` fails until the `## Contents` maps and the committed `meta.json` files agree.
|
|
94
|
+
`oat docs nav sync --check` computes the same result and writes nothing. It exits 1 when a `meta.json` file is missing or would change, or a page or folder is unlisted, and names each one, listing missing files separately. In this app, `prebuild` runs it, so `pnpm build:docs` fails until the `## Contents` maps and the committed `meta.json` files agree.
|
|
94
95
|
|
|
95
96
|
## MkDocs Nav Sync
|
|
96
97
|
|
|
@@ -109,7 +110,7 @@ Shared `documentation.nonReaderPaths` declares drafts/templates outside the read
|
|
|
109
110
|
|
|
110
111
|
Fumadocs collections also omit matching pages and metadata when `defineDocs` uses OAT's `docs` and `meta` source options with an explicit repository config path. The pinned MkDocs 1.4.2 has no configurable rendering exclusion: these pages leave navigation and manifests but still render as routes. This setting is not a way to keep private content out of a MkDocs site.
|
|
111
112
|
|
|
112
|
-
Fresh Fumadocs/MkDocs init explicitly writes `documentation.navOwner: nav-sync` and generates navigation after scaffold/config succeeds. Their generated `prebuild` / `docs:build` scripts run `nav sync --check`. Existing hand-authored or undeclared surfaces are preserved through bootstrap and use analyze/apply to choose ownership; absence never implies permission to regenerate. Markdown has no sidebar or nav sync.
|
|
113
|
+
Fresh Fumadocs/MkDocs init explicitly writes `documentation.navOwner: nav-sync` and generates navigation after scaffold/config succeeds. Their generated `prebuild` / `docs:build` scripts run `nav sync --check`. Existing hand-authored or undeclared surfaces are preserved through bootstrap and use analyze/apply to choose ownership; absence never implies permission to regenerate. With `hand-authored`, the writing `oat docs nav sync` refuses and `--check` compares membership and order only; an undeclared owner gets a warning to declare one. Markdown has no sidebar or nav sync.
|
|
113
114
|
|
|
114
115
|
## Generated-file boundaries
|
|
115
116
|
|
|
@@ -146,7 +146,7 @@ Current schema keys:
|
|
|
146
146
|
| `archive.awsProfile` | `string` | - | Optional AWS named profile forwarded as `AWS_PROFILE` to every `aws` invocation in archive flows (`oat-project-complete` S3 sync, `oat repo archive sync`). Overrides ambient shell `AWS_PROFILE` / `AWS_DEFAULT_PROFILE` when set. |
|
|
147
147
|
| `archive.awsRegion` | `string` | - | Optional AWS region forwarded as `AWS_REGION` to every `aws` invocation in archive flows. Overrides ambient shell `AWS_REGION` / `AWS_DEFAULT_REGION` when set. |
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
`documentation.*` keys are managed via `oat config get/set` and are set automatically by `oat docs init`, including `documentation.index`, which `oat docs generate-index` also updates for the Fumadocs manifest transition.
|
|
150
150
|
The `git.defaultBranch` key is auto-detected during `oat init` and can be overridden via `oat config set git.defaultBranch <branch>`.
|
|
151
151
|
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.
|
|
152
152
|
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).
|
|
@@ -6,7 +6,7 @@ disable-model-invocation: true
|
|
|
6
6
|
user-invocable: true
|
|
7
7
|
allowed-tools: Read, Write, Bash(git:*), Bash(oat config:*), Bash(oat docs nav sync --check:*), Bash(oat docs check:*), Bash(oat docs literals:*), Bash(pnpm:*), Bash(bash:*), Bash(jq:*), Bash(node:*), Bash(command -v:*), Bash(sed:*), Bash(npm root -g:*), Bash(test:*), Bash(oat --version), Bash(mkdir:*), Bash(date:*), Bash(echo:*), Bash(cd:*), Bash(pwd:*), Glob, Grep, AskUserQuestion, Task
|
|
8
8
|
metadata:
|
|
9
|
-
version: '1.
|
|
9
|
+
version: '1.9.1'
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Docs Analysis
|
|
@@ -599,9 +599,14 @@ For a Fumadocs app with recorded `navOwner: nav-sync`, compare generated
|
|
|
599
599
|
|
|
600
600
|
For `hand-authored` or undeclared Fumadocs navigation, compare current meta.json
|
|
601
601
|
membership/order with Contents without assuming strict generator output; do not
|
|
602
|
-
flag rest entries merely because they are hand-authored.
|
|
603
|
-
|
|
604
|
-
|
|
602
|
+
flag rest entries merely because they are hand-authored. `oat docs check` runs
|
|
603
|
+
this comparison for both: a Contents page must be reachable (listed, shown by a
|
|
604
|
+
rest entry, borrowed by another folder or linked by URL), every pages entry must
|
|
605
|
+
name an existing page or folder, and listed pages keep Contents order.
|
|
606
|
+
Separators, labels, link items and borrowed pages are not compared. For
|
|
607
|
+
`hand-authored`, `oat docs nav sync --check` uses the same comparison and the
|
|
608
|
+
writing form refuses to run. Report missing reader routes and differences with
|
|
609
|
+
local ownership evidence; recommend no automatic regeneration. For nav-sync-owned MkDocs, use the same explicit-target read-only
|
|
605
610
|
`oat docs nav sync --check --target-dir <docs-app-dir>`.
|
|
606
611
|
|
|
607
612
|
If `mkdocs.yml` exists:
|
|
@@ -651,9 +656,14 @@ test "$(node "$OAT_INSTALLED_ENTRY" --version)" = "$(oat --version)" &&
|
|
|
651
656
|
node "$SKILL_DIR/scripts/package-drift.mjs" --app "<docs-app-dir>" --versions "$OAT_INSTALLED_ROOT/assets/public-package-versions.json"
|
|
652
657
|
```
|
|
653
658
|
|
|
654
|
-
Never substitute registry latest or this target repo's package version.
|
|
655
|
-
|
|
656
|
-
|
|
659
|
+
Never substitute registry latest or this target repo's package version. The
|
|
660
|
+
helper finds installed packages with Node's lookup: the app's `node_modules`,
|
|
661
|
+
then each ancestor's, so hoisted installs (pnpm `node-linker=hoisted`, npm or yarn
|
|
662
|
+
workspaces) resolve. A docs directory without `package.json` (Markdown) returns
|
|
663
|
+
`applicable: false` with exit 0. Missing bundle metadata, missing installed
|
|
664
|
+
packages, or non-orderable versions (including prereleases) mean unverified,
|
|
665
|
+
never an upgrade; each `unverified` row carries a `reason` (for example, not
|
|
666
|
+
installed: run the app's install first, then re-run the helper). The helper compares stable numeric
|
|
657
667
|
version components: older installed packages are `drift`; equal versions are
|
|
658
668
|
`current`; newer installed packages are `ahead`, with no upgrade command. For
|
|
659
669
|
`ahead`, report that the running CLI is stale and ask the operator to update or
|
|
@@ -661,10 +671,24 @@ select the intended CLI installation before re-analysis; do not recommend a docs
|
|
|
661
671
|
package downgrade. `unverified` also has no package command and needs manual
|
|
662
672
|
verification. Neither status authorizes a tooling update.
|
|
663
673
|
|
|
664
|
-
The helper reports declared and installed versions,
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
674
|
+
The helper reports declared and installed versions, the installed manifest path
|
|
675
|
+
and target versions, and an `upgradeCommand` only for `drift`. The command pins
|
|
676
|
+
the `packageManager` of the app or its nearest ancestor (`npx --yes pnpm@<version>`,
|
|
677
|
+
which works without Corepack; `corepack pnpm@<version>` is equivalent where
|
|
678
|
+
Corepack is installed) and adds
|
|
679
|
+
`--ignore-workspace` for a nested app that the ancestor `pnpm-workspace.yaml`
|
|
680
|
+
`packages` globs do not include (its own lockfile alone does not make it
|
|
681
|
+
standalone). The output's `workspace` field reports `member`, `standalone`,
|
|
682
|
+
`root` or `undetermined`; for `undetermined` (glob syntax the helper does not
|
|
683
|
+
evaluate) the command omits `--ignore-workspace` and `reason` asks you to
|
|
684
|
+
confirm membership with `pnpm -r ls` first. Run it as given: a global pnpm of another major can rewrite the app's
|
|
685
|
+
`pnpm-workspace.yaml` settings and leave `node_modules` linked to a different
|
|
686
|
+
store version (`ERR_PNPM_UNEXPECTED_STORE`); recover by reinstalling with the
|
|
687
|
+
pinned version, not by switching managers. Without a `packageManager`, the
|
|
688
|
+
command uses bare `pnpm`; confirm its version matches the lockfile before
|
|
689
|
+
running it. When `packageManager` names another manager, the row has no command
|
|
690
|
+
and its `reason` asks for the equivalent add command; translate it preserving
|
|
691
|
+
package, exact target and dependency section. Cite the manifest, installed package path, bundle path and
|
|
668
692
|
exact command. Report older docs-package drift and older app-local CLI drift
|
|
669
693
|
together as one `tooling-update`, `approval: explicit`, listing each drifting
|
|
670
694
|
package's exact command in its own dependency section; apply's approved tooling
|
|
@@ -56,10 +56,10 @@ stable recommendation ID with `approval: explicit`. Docs-package drift and
|
|
|
56
56
|
app-local `@open-agent-toolkit/cli` drift share one `tooling-update` ID, each row
|
|
57
57
|
keeping its own dependency section in its command; apply then regenerates the
|
|
58
58
|
manifest with the upgraded app-local CLI. `current` needs no tooling
|
|
59
|
-
recommendation
|
|
59
|
+
recommendation and has no command. For `ahead`, select
|
|
60
60
|
or update the intended CLI installation, then re-analyze; do not recommend a docs
|
|
61
61
|
package downgrade. `unverified` requires manual verification before a package
|
|
62
|
-
recommendation.
|
|
62
|
+
recommendation; record the helper's `reason` (for example, not installed).
|
|
63
63
|
|
|
64
64
|
Unsupported app config/routes/scripts: {manual changes required; never automatic}.
|
|
65
65
|
|
|
@@ -15,7 +15,9 @@ Use this checklist when evaluating a docs surface.
|
|
|
15
15
|
- Parent `## Contents` maps include immediate child directories that contain
|
|
16
16
|
docs.
|
|
17
17
|
- Single-page directories still expose a useful `index.md` entrypoint or local
|
|
18
|
-
section map.
|
|
18
|
+
section map. An index-only leaf may list same-page heading anchors in
|
|
19
|
+
`## Contents`; treat it as a flattening suggestion (`leaf-size` warning), not
|
|
20
|
+
a broken map.
|
|
19
21
|
- Asset-only directories are exempt when they contain no Markdown content and
|
|
20
22
|
are not linked as navigable docs sections.
|
|
21
23
|
- `overview.md` is not used as the directory entrypoint.
|