@open-agent-toolkit/cli 0.3.12 → 0.3.13

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 (50) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/configuration.md +1 -1
  3. package/assets/docs/cli-utilities/tool-packs.md +4 -1
  4. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +80 -15
  5. package/assets/docs/docs-tooling/commands.md +74 -30
  6. package/assets/docs/docs-tooling/index.md +6 -6
  7. package/assets/docs/docs-tooling/workflows.md +26 -9
  8. package/assets/docs/provider-sync/commands.md +1 -1
  9. package/assets/docs/provider-sync/instruction-sync.md +11 -4
  10. package/assets/docs/reference/cli-reference.md +2 -2
  11. package/assets/docs/reference/docs-index-contract.md +19 -4
  12. package/assets/docs/reference/file-locations.md +3 -1
  13. package/assets/docs/reference/oat-directory-structure.md +23 -21
  14. package/assets/public-package-versions.json +4 -4
  15. package/assets/skills/oat-docs-analyze/SKILL.md +27 -7
  16. package/assets/skills/oat-docs-analyze/references/quality-checklist.md +16 -3
  17. package/assets/skills/oat-docs-apply/SKILL.md +20 -3
  18. package/assets/skills/oat-docs-authoring/SKILL.md +11 -7
  19. package/assets/skills/oat-docs-authoring/references/docs-root-resolution.md +12 -5
  20. package/assets/skills/oat-docs-authoring/references/lifecycle-boundaries.md +7 -7
  21. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +13 -3
  22. package/assets/skills/oat-docs-authoring/references/targeted-authoring-workflow.md +5 -4
  23. package/assets/skills/oat-docs-authoring/references/validation.md +11 -1
  24. package/assets/skills/oat-docs-bootstrap/SKILL.md +31 -8
  25. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +2 -1
  26. package/assets/skills/oat-project-document/SKILL.md +21 -2
  27. package/assets/templates/docs-markdown/contributing.md +35 -0
  28. package/assets/templates/docs-markdown/index.md +18 -0
  29. package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
  30. package/dist/commands/docs/index-generate/index.js +41 -8
  31. package/dist/commands/docs/init/index.d.ts +17 -2
  32. package/dist/commands/docs/init/index.d.ts.map +1 -1
  33. package/dist/commands/docs/init/index.js +194 -14
  34. package/dist/commands/docs/init/markdown.d.ts +39 -0
  35. package/dist/commands/docs/init/markdown.d.ts.map +1 -0
  36. package/dist/commands/docs/init/markdown.js +317 -0
  37. package/dist/commands/docs/init/resolve-options.d.ts +3 -1
  38. package/dist/commands/docs/init/resolve-options.d.ts.map +1 -1
  39. package/dist/commands/docs/init/resolve-options.js +36 -0
  40. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  41. package/dist/commands/docs/init/scaffold.js +11 -0
  42. package/dist/commands/shared/agents-md.d.ts +7 -0
  43. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  44. package/dist/commands/shared/agents-md.js +131 -91
  45. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  46. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  47. package/dist/config/oat-config.d.ts +2 -1
  48. package/dist/config/oat-config.d.ts.map +1 -1
  49. package/dist/config/oat-config.js +4 -2
  50. package/package.json +2 -2
@@ -1,17 +1,17 @@
1
1
  ---
2
2
  name: oat-docs-bootstrap
3
- description: Use when bootstrapping a new OAT docs app in a repo. Guides the user through preflight detection, richer input gathering than the raw CLI, `oat docs init` invocation with gated post-patches for open CLI gaps, build verification, post-scaffold config inspection, and an educational walkthrough. Supports Fumadocs (full path) and MkDocs (lean path with defined minimum contract).
3
+ description: Use when bootstrapping or adopting an OAT documentation surface in a repo. Guides the user through preflight detection, richer input gathering than the raw CLI, `oat docs init` invocation with gated post-patches for open CLI gaps, build verification, post-scaffold config inspection, and an educational walkthrough. Supports plain Markdown (file-level path), Fumadocs (full path), and MkDocs (lean path with defined minimum contract).
4
4
  argument-hint: '<optional-target-dir>'
5
5
  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.2.2
9
+ version: 1.3.1
10
10
  ---
11
11
 
12
12
  # Docs Bootstrap
13
13
 
14
- Bootstrap a docs app in this repo and guide the user through understanding how it works. Wraps `oat docs init` with preflight detection, richer input gathering, gated post-patches for open CLI gaps (FP-11 Turbopack root, FP-12 site-title coherence, FP-13 template content, FP-15 docs-app AGENTS.md, FP-16 `## Contents` link extensions, FP-17 `contributing.md` three-surfaces cleanup), build verification, post-scaffold config inspection, and an educational walkthrough covering the `index.md` + `## Contents` navigation contract, scaffolded agent-instruction surfaces, and the OAT docs ecosystem (`oat-project-document`, `oat-docs-analyze`, `oat-docs-apply`).
14
+ Bootstrap or adopt documentation in this repo and guide the user through understanding how it works. Wraps `oat docs init` with preflight detection, richer input gathering, gated post-patches for open CLI gaps (FP-11 Turbopack root, FP-12 site-title coherence, FP-13 template content, FP-15 docs-app AGENTS.md, FP-16 `## Contents` link extensions, FP-17 `contributing.md` three-surfaces cleanup), build verification, post-scaffold config inspection, and an educational walkthrough covering the `index.md` + `## Contents` navigation contract, scaffolded agent-instruction surfaces, and the OAT docs ecosystem (`oat-project-document`, `oat-docs-analyze`, `oat-docs-apply`).
15
15
 
16
16
  ## Prerequisites
17
17
 
@@ -23,7 +23,7 @@ Bootstrap a docs app in this repo and guide the user through understanding how i
23
23
 
24
24
  **OAT MODE: Docs Bootstrap**
25
25
 
26
- **Purpose:** Turn `oat docs init` scaffolding into a support-rich onboarding experience — preflight, inputs, CLI invocation with gated post-patches, build verification, config inspection, educational walkthrough, and optional content kickoff. Two framework paths: Fumadocs (full) and MkDocs (lean with defined minimum contract).
26
+ **Purpose:** Turn `oat docs init` scaffolding into a support-rich onboarding experience — preflight, inputs, CLI invocation with gated post-patches, build verification, config inspection, educational walkthrough, and optional content kickoff. Three paths: Markdown (authored content without an app), Fumadocs (full), and MkDocs (lean with defined minimum contract).
27
27
 
28
28
  **BLOCKED Activities:**
29
29
 
@@ -110,6 +110,18 @@ OAT ▸ DOCS BOOTSTRAP
110
110
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
111
111
  ```
112
112
 
113
+ ### Markdown path through the seven steps
114
+
115
+ The detailed framework procedures below apply to Fumadocs/MkDocs. When the selected tooling is `markdown`, use this path for Steps 2–7 instead; never run framework post-patches, the FP-15 AGENTS bridge, dependency discovery/install, package/Turbo patches, or a site build. Step 1 remains the shared read-only detector.
116
+
117
+ 1. **Preflight and routing:** Read `documentation.tooling` as either its string form or its legacy object `framework` field. Declared tooling is authoritative: configured Markdown uses `documentation.root` literally, including when it contains a child named `docs`; declared frameworks or unknown stacks are not plain-doc adoption candidates. With no declared tooling, check framework evidence first (`mkdocs.yml`, Fumadocs/Next config and docs-app package scripts/dependencies), then inspect the chosen dedicated content directory for authored `.md`/`.mdx` pages. A repository-root README alone is insufficient; an empty selected directory is fresh setup. For a populated plain tree, lead with **adopt and audit**, **audit only**, or **abort**. Audit only delegates read-only to `oat-docs-analyze` and exits. Adoption requires the explicit user choice and CLI `--adopt`; `--yes` alone never authorizes it. An incompatible declared root/index/tooling requires a user decision, with no silent clearing or retagging. Keep the existing explicitly authorized framework replacement path when a framework is selected.
118
+ 2. **Gather inputs:** Offer “Markdown (plain files), Fumadocs, or MkDocs?” Collect documentation title (`--site-name`), dedicated relative target directory (default `docs` in every repo shape), and optional description. Reuse an existing compatible configured Markdown root. Ask no app/package name, package-manager, site-runtime, or dependency questions. Lint and format default to `none`; describe selected existing repository tools only, without installing them. Validate a nonempty title and a dedicated in-repository target, excluding the repository root and escaping symlinks. Confirm fresh setup or additive adoption, title, root, and audit handoff. `appName` is absent and `conflictResolution` is `adopt`, `audit`, `abort`, or null for this path.
119
+ 3. **Invoke CLI:** Probe `$CLI_CMD docs init --help` and require advertised Markdown/`--adopt` support before invocation; if missing, report the needed CLI update rather than fabricating scaffold files. Run `$CLI_CMD docs init --framework markdown --target-dir <root> --site-name <title> --description <description> --lint none --format none --yes`, adding `--adopt` only for explicit adoption. Pass the selected lint/format values when using existing tools. Never pass app-only flags. An optional `--dry-run` previews file/config/guidance changes without writes; it does not count as a completed bootstrap. Capture terminal/JSON results, exact exit, created/preserved files, config changes, guidance action, and audit advice. `partial`/exit 1 with manual-required or blocked guidance means unresolved guidance; real runs may have created files, whereas dry-runs have only planned files. Report actual state and stop before claiming completion. Other refusals also stop without post-patches. For success, read config back to resolve the actual content root and authored index.
120
+ 4. **Verify files:** Print `[4/7] Verifying files…`. Check config root/index, baseline file existence, nonempty `title`/`description`, useful audience/scope context and populated `## Contents` links resolving to actual sibling pages or child `index.md`s. Honor excludes and asset-only exceptions; preserve local AGENTS instructions. Fresh setup creates only authored `index.md` and `contributing.md` in the target; verify no docs-root AGENTS, app package, framework config, dependencies, or root build changes. Run already documented lint/link/format checks when applicable; otherwise inspect files/links directly. Adoption preserves existing bytes and may leave missing child indexes, metadata, context, or links: record these as audit gaps for analyze/apply rather than repairing them or calling the tree fully conformant. Distinguish successful setup verification from content-conformance findings.
121
+ 5. **Inspect config:** `documentation.tooling` is the string `markdown`; `root` is the literal content directory; `index` is its authored entrypoint, normally `<root>/index.md`. Markdown introduces no `documentation.config`. Preserve unrelated config/excludes/completion settings. Verify deterministic managed root Documentation guidance names that root, Markdown tooling, authored index, and `<root>/contributing.md`; preserve manual/local guidance and surface unresolved disposition. The Step 5e completion opt-in remains available using the docs root rather than an app name, without silently changing an existing value. No nested app-config reconciliation or framework patch inspection applies.
122
+ 6. **Walkthrough:** In short chunks, show actual config and `<root>/index.md`: useful context plus the Contents map, title/description metadata, sibling `page.md` and child `section/index.md` links, exclusions and asset-only exceptions. Explain adding a page/section and updating the nearest authored map without overwriting existing context. Root AGENTS Documentation guidance and `<root>/contributing.md` establish agent/human conventions; a preexisting local AGENTS file remains authoritative, but bootstrap creates none. Authored indexes are edited directly. Optional generated inventories require explicit external output, e.g. `$CLI_CMD docs generate-index --docs-dir <root> --output .oat/docs-manifest.md`; output must stay outside the full configured content root and cannot overwrite the configured authored index even with a narrowed `--docs-dir`. Generation does not repoint `documentation.index`. Markdown bootstrap never generates a manifest automatically. Skip framework deep dives and preview-server/build commands.
123
+ 7. **Audit handoff and summary:** Offer `oat-docs-analyze` against the literal configured root, followed by `oat-docs-apply` only for approved repairs. An adopted incomplete tree needs that audit; config/guidance alone prove no full conformance. Explain `oat-project-document` for source-backed project deltas. Summarize tooling, actual root/authored index, created/preserved files, guidance/config disposition, file-check outcomes, unresolved audit gaps, optional manifest ownership, and exact skill handoff. For dry-run/partial/refusal, label the outcome accordingly rather than printing BOOTSTRAP COMPLETE. No app, install, build, patch, or dev-command fields apply.
124
+
113
125
  ### Step 1: Preflight Detector
114
126
 
115
127
  Inspect the working tree before any mutation. Determine the repo shape, detect existing docs setup, and surface conflicts that require user decisions later. This step is strictly read-only; any fix or prompt flows through the Input Gatherer (Step 2).
@@ -131,6 +143,8 @@ In practice: for Fumadocs, any single-package repo with a target subdirectory is
131
143
 
132
144
  **1b. Detect existing docs setup.**
133
145
 
146
+ Apply the Markdown-path evidence and precedence rules above before classifying a directory. Record selected tooling and whether the chosen target is absent/empty, authored Markdown, or a framework app. An existing empty target is not an existing-app conflict. The same shared detector supports the Markdown route; it does not change general `oat init` detection.
147
+
134
148
  Read (do not modify):
135
149
 
136
150
  - `$REPO_ROOT/.oat/config.json`, extract the `documentation` section if present. Record `configDocumentation` (the parsed object) or `null`.
@@ -202,7 +216,7 @@ If `conflicts[]` is empty, skip conflict handling and go to 2b.
202
216
 
203
217
  Each question includes plain-language context explaining what the value affects. Defaults come from the Preflight Result. Ask sequentially — each answer can inform the next default.
204
218
 
205
- - **Framework.** `"Which docs framework? Fumadocs (Next.js, primary path) or MkDocs (Python, lean path)?"` Default: `fumadocs`.
219
+ - **Framework.** `"Which documentation tooling? Markdown (plain files), Fumadocs (Next.js), or MkDocs (Python)?"` Default: `fumadocs`. Selecting Markdown switches to the Markdown path above before app/site questions.
206
220
  - **Site name.** `"What's the name of the product or project these docs are for?"` Default: `defaults.siteName` (humanized repo name). Explain: "This becomes the display title — what shows up in the site header, browser tab, and page headings. It is **not** the package name." This is the FP-12 workaround — distinct from `appName`.
207
221
  - **Package / app name.** `"What should the docs package be called?"` Default: `defaults.appName`. Explain: "This becomes the `package.json` `name`, the directory name, and the pnpm filter (e.g., `pnpm --filter {appName} dev`). It does **not** show up in the UI."
208
222
  - **Target directory.** `"Where should the docs app live?"` Default: `defaults.targetDir`. Explain: "Relative to repo root. Monorepos typically use `apps/{appName}`; single-package repos use `{appName}` as a subdirectory."
@@ -245,7 +259,7 @@ Record internally for the Scaffold Runner:
245
259
 
246
260
  ```
247
261
  Input Result:
248
- framework: 'fumadocs' | 'mkdocs'
262
+ framework: 'markdown' | 'fumadocs' | 'mkdocs'
249
263
  siteName: string // FP-12 workaround: display title distinct from appName
250
264
  appName: string
251
265
  targetDir: string
@@ -545,7 +559,9 @@ Per-file edits (Fumadocs only — MkDocs has no `layout.tsx`; its title handling
545
559
 
546
560
  Failure handling: if Capability Detection (3b) classified any of these files as `drift`, the patch is already recorded as `refused` in `Scaffold Result.patchesApplied` — skip and move on. Do not re-check drift here.
547
561
 
548
- **FP-15: AGENTS.md write-if-missing.**
562
+ **FP-15: AGENTS.md write-if-missing (Fumadocs/MkDocs only).**
563
+
564
+ Never apply this bridge to Markdown: its root is the content directory and bootstrap must not create a docs-root AGENTS file.
549
565
 
550
566
  Gate: run **only if** `capabilities.agentsMdScaffoldFlag === false` AND `<appRoot>/AGENTS.md` does not exist on disk.
551
567
 
@@ -1128,7 +1144,14 @@ End the skill with the summary. Do not prompt for more input — the user knows
1128
1144
 
1129
1145
  A successful `oat-docs-bootstrap` run satisfies every invariant below. Any failure of an invariant either blocks progression (critical) or is surfaced to the user in the Exit summary with a `suggestedFix` (warning) so the user knows what to address.
1130
1146
 
1131
- **Pipeline invariants:**
1147
+ **Markdown invariants:**
1148
+
1149
+ - Configured tooling controls routing; framework evidence precedes unconfigured plain-tree evidence; README-only and empty directories do not imply adoption.
1150
+ - Fresh/adopt operations use the CLI with literal roots; populated targets require explicit `--adopt`, preserved content remains authoritative, and audit gaps are handed to analyze/apply.
1151
+ - No app questions, installs, site builds, framework patches, automatic manifest, or docs-root AGENTS creation. Authored index/context/Contents/metadata/links and local instructions remain applicable.
1152
+ - Dry-run/partial outcomes report planned or actual state accurately; successful adoption is not a claim of full content conformity.
1153
+
1154
+ **Framework pipeline invariants (Fumadocs/MkDocs):**
1132
1155
 
1133
1156
  - Preflight ran read-only — no files mutated, no config written, no scaffold invoked.
1134
1157
  - Input Gatherer collected the full Input Result (framework, siteName, appName, targetDir, siteDescription, lint, format) plus any `conflictResolution` required by Preflight conflicts; all inputs validated before scaffold.
@@ -1,3 +1,4 @@
1
+ <!-- Framework docs-app bridge only: Fumadocs/MkDocs. Never render this template into a plain Markdown content root; use managed root Documentation guidance and the contributing page there. -->
1
2
  # AGENTS — {{SITE_NAME}}
2
3
 
3
4
  This file tells agents how to work inside `{{APP_DIR}}`, the documentation app for `{{REPO_NAME}}`. It is not bootstrap documentation. If you're looking for how this app was scaffolded, see `docs/getting-started.md` or the root-level `AGENTS.md` section on documentation.
@@ -11,7 +12,7 @@ This file tells agents how to work inside `{{APP_DIR}}`, the documentation app f
11
12
  1. Create the Markdown file under `docs/` at the directory that best matches the page's topic. Every content directory is an `index.md` map — find the right one before picking a path. **Prefer `.md`** for plain content pages; reach for `.mdx` only when the page actually needs embedded JSX (a custom component, an interactive widget, a specialized layout). Plain `.md` is the default because agents, linters, and grep rules all handle it more reliably than `.mdx`.
12
13
  2. Add frontmatter with at minimum `title:` and `description:`. The title drives nav display and page `<title>`; the description drives search previews, social cards, and sibling summaries. Empty descriptions hurt all three.
13
14
  3. Update the nearest `index.md`'s `## Contents` section to include a link to the new page. Use `.md`-suffixed relative links: `[Title](page.md)` for leaf pages, `[Section](subdir/index.md)` for subdirectories. The `@open-agent-toolkit/docs-transforms` remark-links plugin normalizes these for Fumadocs routing at build time (strips `.md`, collapses `dir/index.md` → `dir`), so the suffixed form renders correctly **and** lets agents follow links to the target file without path inference. The `## Contents` section is the machine-readable local map — anything not listed there is effectively invisible to the navigation tooling.
14
- 4. If the new page introduces a new subdirectory, create an `index.md` in that subdirectory with its own `## Contents` section. Every content directory must have an `index.md`.
15
+ 4. If the new page introduces a new subdirectory, create an `index.md` in that subdirectory with its own `## Contents` section. Every Markdown-bearing content directory must have an `index.md`; asset-only directories are exempt. Preserve useful audience/scope context and honor configured excludes and existing local instructions.
15
16
  5. Regenerate the derived navigation artifacts for this framework. For Fumadocs, run `oat docs nav sync` (from the app directory, or with `--target-dir <app-dir>`) so the committed `docs/**/meta.json` sidebar files follow authored `## Contents`, and run the generated-index command (`{{GENERATE_INDEX_CMD}}`) so the app-root `index.md` manifest reflects the current Markdown file tree. Fumadocs nav sync is strict: a page no `## Contents` map lists stays out of the sidebar and is reported, so list the new page rather than editing `meta.json`. For MkDocs, run `oat docs nav sync` or the local equivalent so `mkdocs.yml` `nav:` reflects authored `## Contents`. Derived artifacts never replace the authored `## Contents`; keep authored maps current and compare generated output against them when checking freshness.
16
17
 
17
18
  ## When you need to restructure navigation
@@ -6,7 +6,7 @@ disable-model-invocation: false
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Write, Edit, Bash(git:*), Bash(jq:*), Bash(oat pjm:*), Bash(oat project push:*), Bash(oat project scope:*), Bash(oat tools:*), Glob, Grep, AskUserQuestion, Skill
8
8
  metadata:
9
- version: 1.8.5
9
+ version: 1.8.6
10
10
  ---
11
11
 
12
12
  # Project Documentation Sync
@@ -141,6 +141,14 @@ DOCS_TOOLING=$(oat config get documentation.tooling 2>/dev/null || true)
141
141
  DOCS_CONFIG=$(oat config get documentation.config 2>/dev/null || true)
142
142
  ```
143
143
 
144
+ For `DOCS_TOOLING=markdown`, `$DOCS_ROOT` is the literal configured authored
145
+ content root, even when a child directory is named `docs`; `documentation.index`
146
+ is authored. Preserve context, metadata, Contents, relative `.md` links, excludes
147
+ and existing local instructions. No app package, framework config, nav generation
148
+ or site build is required. Optional external manifests never replace the authored
149
+ index. For framework tooling, resolve the authored source root from config/scripts
150
+ and local guidance before scanning; the configured root can be an app root.
151
+
144
152
  If `$DOCS_ROOT` is empty, attempt auto-detection:
145
153
 
146
154
  1. Look for `mkdocs.yml` — if found, set `DOCS_TOOLING=mkdocs` and infer `DOCS_ROOT` from the `docs_dir` field (or default to `docs/` relative to the mkdocs.yml location), set `DOCS_CONFIG` to the mkdocs.yml path
@@ -503,7 +511,18 @@ Execute the approved documentation updates.
503
511
  - Add a cross-reference in the original file pointing to the new location
504
512
  - If the original had sections that logically separate, use section headings as split boundaries
505
513
 
506
- **Nav structure updates:**
514
+ **Authored maps and derived navigation:**
515
+
516
+ Update the nearest authored `index.md` Contents for added/moved pages and preserve
517
+ useful context. Validate actual relative `.md` destinations and title/description
518
+ metadata, honoring excludes and local guidance. Markdown uses file/link checks
519
+ and existing documented lint/format tools; it does not require site nav/build.
520
+ Regenerate optional external manifests only when locally declared, with explicit
521
+ output outside the full configured Markdown content tree; leave the configured
522
+ authored index intact. For framework apps, regenerate declared navigation/index
523
+ artifacts through local tooling rather than hand-editing generated output.
524
+
525
+ **Framework config updates:**
507
526
 
508
527
  If `$DOCS_CONFIG` exists and new files were created in the docs directory:
509
528
 
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: Contributing to documentation
3
+ description: Authoring conventions, context, and Markdown navigation rules.
4
+ ---
5
+
6
+ # Contributing to documentation
7
+
8
+ Maintain documentation for **{{REPO_NAME}}** as authored Markdown pages. Start
9
+ from the [documentation index](index.md) to understand the intended audience and
10
+ where each topic belongs.
11
+
12
+ ## Structure and context
13
+
14
+ - Give every Markdown-bearing directory an authored `index.md` with useful
15
+ context: purpose, audience, ownership, and how its pages relate.
16
+ - Maintain a populated `## Contents` map. Link sibling pages as `page.md` and
17
+ immediate child directories as `section/index.md`. Link only existing files.
18
+ - Asset-only directories do not need an index.
19
+ - Add `title` and `description` metadata to authored pages. Use relative `.md`
20
+ links so navigation works when reading the repository directly.
21
+ - Preserve existing local instructions and repository-specific guidance.
22
+
23
+ ## Review and verification
24
+
25
+ Use `oat-docs-analyze` to identify content, metadata, and navigation gaps, then
26
+ `oat-docs-apply` for approved repairs. Adoption establishes entrypoints and
27
+ configuration; review the existing tree before treating it as complete.
28
+
29
+ Check relative links, Contents maps, metadata, and context after edits. Selected
30
+ existing tools: lint `{{LINT_MODE}}`, format `{{FORMAT_MODE}}`. Use repository
31
+ checks when available; this setup does not install tools or require a site build.
32
+
33
+ The authored index is not a generated manifest. If an optional inventory is
34
+ needed, run `oat docs generate-index` with an explicit output outside the
35
+ configured content tree and keep the authored entrypoint unchanged.
@@ -0,0 +1,18 @@
1
+ ---
2
+ title: '{{TITLE_METADATA}}'
3
+ description: '{{DESCRIPTION_METADATA}}'
4
+ ---
5
+
6
+ # {{SITE_NAME}}
7
+
8
+ This is the documentation entrypoint for **{{REPO_NAME}}**. Start with this
9
+ Contents map to find guidance and keep this page's context current as the
10
+ repository evolves. Add the repository's purpose, audience, and key workflows
11
+ when authoring its documentation.
12
+
13
+ These pages are authored Markdown. The index belongs to contributors; optional
14
+ generated inventories must live outside this content tree.
15
+
16
+ ## Contents
17
+
18
+ {{CONTENTS}}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/docs/index-generate/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,eAAO,MAAM,uBAAuB,iIAC4F,CAAC;AAuBjI,UAAU,6BAA6B;IACrC,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,aAAa,EAAE,oBAAoB,KAChD,OAAO,CAAC,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,KAAK,MAAM,CAAC;IACrE,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,QAAQ,EAAE,6BAA6B,CAAC;CACzC;AAomBD,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAgCT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/docs/index-generate/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAI5C,eAAO,MAAM,uBAAuB,iIAC4F,CAAC;AAuBjI,UAAU,6BAA6B;IACrC,aAAa,EAAE,CACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,aAAa,EAAE,oBAAoB,KAChD,OAAO,CAAC,OAAO,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,aAAa,EAAE,UAAU,EAAE,KAAK,MAAM,CAAC;IACrE,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,QAAQ,EAAE,6BAA6B,CAAC;CACzC;AAspBD,wBAAgB,8BAA8B,CAC5C,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAgCT"}
@@ -197,7 +197,8 @@ function missingRootError(flag) {
197
197
  * options stay CWD-relative for backward compatibility. `documentation.root`
198
198
  * canonically names the docs **app root** written by `oat docs init`. The
199
199
  * `<root>/docs` preference is compatibility behavior for legacy configs whose
200
- * `root` names a docs *source* directory; `--docs-dir` overrides it.
200
+ * `root` names a docs *source* directory. Explicit Markdown uses the literal
201
+ * configured content root; `--docs-dir` overrides source selection in all modes.
201
202
  */
202
203
  async function resolveIndexGeneratePaths(context, options, deps) {
203
204
  const repoRoot = await deps.resolveRepoRoot(context.cwd);
@@ -206,6 +207,10 @@ async function resolveIndexGeneratePaths(context, options, deps) {
206
207
  const configuredRoot = configuredRootValue
207
208
  ? resolve(repoRoot, configuredRootValue)
208
209
  : null;
210
+ const isMarkdown = trimmed(config.documentation?.tooling)?.toLowerCase() === 'markdown';
211
+ if (isMarkdown && options.output === undefined) {
212
+ throw new CliError('Markdown documentation uses an authored index. Pass --output with a path outside the full configured Markdown content root to generate a separate manifest.', REFUSAL_EXIT_CODE);
213
+ }
209
214
  // Either omitted option needs a usable configured root, so validate it once
210
215
  // up front rather than only on the path that happens to be derived first.
211
216
  if (options.docsDir === undefined || options.output === undefined) {
@@ -226,7 +231,8 @@ async function resolveIndexGeneratePaths(context, options, deps) {
226
231
  docsDir = resolve(context.cwd, options.docsDir);
227
232
  docsDirSource = 'flag';
228
233
  }
229
- else if (await deps.dirExists(join(configuredRoot, 'docs'))) {
234
+ else if (!isMarkdown &&
235
+ (await deps.dirExists(join(configuredRoot, 'docs')))) {
230
236
  docsDir = join(configuredRoot, 'docs');
231
237
  docsDirSource = 'config-docs-subdirectory';
232
238
  }
@@ -263,6 +269,10 @@ async function canonicalizeIndexGeneratePaths(resolved, deps) {
263
269
  const lexicalDocumentationConfig = documentationConfigValue
264
270
  ? resolve(resolved.repoRoot, documentationConfigValue)
265
271
  : null;
272
+ const isMarkdown = trimmed(resolved.config.documentation?.tooling)?.toLowerCase() ===
273
+ 'markdown';
274
+ const indexValue = trimmed(resolved.config.documentation?.index);
275
+ const lexicalAuthoredIndex = isMarkdown && indexValue ? resolve(resolved.repoRoot, indexValue) : null;
266
276
  // Resolution order is load-bearing: the docs directory is canonicalized
267
277
  // first, and the safety checks below compare against its canonical form.
268
278
  return {
@@ -277,11 +287,24 @@ async function canonicalizeIndexGeneratePaths(resolved, deps) {
277
287
  role: { kind: 'output' },
278
288
  origin: resolved.outputPath,
279
289
  }),
280
- // An unusable configured root only makes the config write ineligible; it
281
- // must not fail a run whose paths were both supplied explicitly.
290
+ // Markdown's configured tree is protected independently of --docs-dir.
291
+ // Its canonicalization must fail closed; other modes retain the existing
292
+ // tolerance for unusable config when both paths are explicit.
282
293
  configuredRoot: resolved.configuredRoot
283
- ? await canonicalizeOrNull(resolved.configuredRoot, deps, {
284
- kind: 'other',
294
+ ? isMarkdown
295
+ ? await canonicalize(resolved.configuredRoot, deps, {
296
+ role: { kind: 'docs-dir', derived: true },
297
+ origin: resolved.configuredRoot,
298
+ })
299
+ : await canonicalizeOrNull(resolved.configuredRoot, deps, {
300
+ kind: 'other',
301
+ })
302
+ : null,
303
+ lexicalAuthoredIndex,
304
+ authoredIndex: lexicalAuthoredIndex
305
+ ? await canonicalize(lexicalAuthoredIndex, deps, {
306
+ role: { kind: 'other' },
307
+ origin: lexicalAuthoredIndex,
285
308
  })
286
309
  : null,
287
310
  lexicalDocumentationConfig,
@@ -301,6 +324,16 @@ async function canonicalizeIndexGeneratePaths(resolved, deps) {
301
324
  */
302
325
  async function assertOutputIsSafe(resolved, canonical, deps) {
303
326
  const { docsDir, outputPath, outputIsExplicit } = resolved;
327
+ if (trimmed(resolved.config.documentation?.tooling)?.toLowerCase() ===
328
+ 'markdown' &&
329
+ ((canonical.configuredRoot !== null &&
330
+ isAtOrInside(canonical.configuredRoot, canonical.outputPath)) ||
331
+ (resolved.configuredRoot !== null &&
332
+ isAtOrInside(resolved.configuredRoot, outputPath)) ||
333
+ canonical.outputPath === canonical.authoredIndex ||
334
+ outputPath === canonical.lexicalAuthoredIndex)) {
335
+ throw new CliError(`Refusing to write the generated index to protected Markdown documentation at ${outputPath}: the full configured content root and authored documentation.index must be preserved. Pass --output with a different path outside the Markdown content root.`, REFUSAL_EXIT_CODE);
336
+ }
304
337
  if (isAtOrInside(canonical.docsDir, canonical.outputPath)) {
305
338
  throw new CliError(`Refusing to write the generated index inside the docs directory it indexes: ` +
306
339
  `${outputPath} is inside ${docsDir}. Pass --output with a path outside the docs directory.`, REFUSAL_EXIT_CODE);
@@ -449,8 +482,8 @@ export function createDocsGenerateIndexCommand(overrides = {}) {
449
482
  };
450
483
  return new Command('generate-index')
451
484
  .description('Generate a docs index from markdown files')
452
- .addOption(new Option('--docs-dir <path>', 'Documentation source directory, resolved from the CWD (default: `<documentation.root>/docs` when that directory exists, otherwise `<documentation.root>`)'))
453
- .addOption(new Option('--output <path>', 'Output file path, resolved from the CWD (default: `<documentation.root>/index.md`)'))
485
+ .addOption(new Option('--docs-dir <path>', 'Documentation source directory, resolved from the CWD (default: literal `<documentation.root>` for Markdown; otherwise `<documentation.root>/docs` when that directory exists, or `<documentation.root>`)'))
486
+ .addOption(new Option('--output <path>', 'Output file path, resolved from the CWD (required outside the content root for Markdown; otherwise default: `<documentation.root>/index.md`)'))
454
487
  .addOption(new Option('--exclude <glob>', 'Exclude matching paths, relative to the docs directory (`*` within a segment, `**` across segments, trailing `/` for directories only). Repeatable, and additive to `documentation.excludes`').argParser(collectExclude))
455
488
  .action(async (options, command) => {
456
489
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
@@ -1,5 +1,5 @@
1
1
  import { type CommandContext, type GlobalOptions } from '../../../app/command-context.js';
2
- import { type UpsertSectionResult } from '../../shared/agents-md.js';
2
+ import { type UpsertSectionResult, previewAgentsMdSection } from '../../shared/agents-md.js';
3
3
  import { type PromptContext, type SelectChoice } from '../../shared/shared.prompts.js';
4
4
  import { type OatConfig } from '../../../config/oat-config.js';
5
5
  import { Command } from 'commander';
@@ -8,7 +8,21 @@ import { type RootPackagePatchResult } from './root-package.js';
8
8
  interface DocsInitExecutionResult {
9
9
  createdFiles: string[];
10
10
  appRoot: string;
11
- rootPackagePatch: RootPackagePatchResult;
11
+ rootPackagePatch?: RootPackagePatchResult;
12
+ dryRun?: boolean;
13
+ plannedFiles?: string[];
14
+ preservedFiles?: string[];
15
+ incompleteFiles?: string[];
16
+ auditAdvice?: string[];
17
+ changes?: {
18
+ files: string[];
19
+ config: boolean;
20
+ };
21
+ configStatus?: 'planned' | 'updated' | 'no-change' | 'failed' | 'not-attempted';
22
+ failure?: {
23
+ stage: 'scaffold' | 'config';
24
+ message: string;
25
+ };
12
26
  }
13
27
  interface DocsInitDependencies {
14
28
  buildCommandContext: (options: GlobalOptions) => CommandContext;
@@ -18,6 +32,7 @@ interface DocsInitDependencies {
18
32
  selectWithAbort: <T extends string>(message: string, choices: SelectChoice<T>[], ctx: PromptContext) => Promise<T | null>;
19
33
  runDocsInit: (context: CommandContext, options: DocsInitResolvedOptions, assetsRoot: string) => Promise<DocsInitExecutionResult | void>;
20
34
  upsertAgentsMdSection: (repoRoot: string, key: string, body: string) => Promise<UpsertSectionResult>;
35
+ previewAgentsMdSection: typeof previewAgentsMdSection;
21
36
  readOatConfig: (repoRoot: string) => Promise<OatConfig>;
22
37
  confirmAction: (message: string, ctx: PromptContext) => Promise<boolean>;
23
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/docs/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,mBAAmB,EAIzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAG5C,OAAO,EAIL,KAAK,uBAAuB,EAK7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAexB,UAAU,uBAAuB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C;AAED,UAAU,oBAAoB;IAC5B,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,CAAC;IAC9E,gBAAgB,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,eAAe,EAAE,CAAC,CAAC,SAAS,MAAM,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC1B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,WAAW,EAAE,CACX,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;IAC7C,qBAAqB,EAAE,CACrB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAqGD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAuB7E;AA6JD,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC5C,OAAO,CA6CT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/docs/init/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,mBAAmB,EAGxB,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C,OAAO,EAIL,KAAK,uBAAuB,EAK7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAgBxB,UAAU,uBAAuB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/C,YAAY,CAAC,EACT,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ,GACR,eAAe,CAAC;IACpB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,UAAU,GAAG,QAAQ,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,UAAU,oBAAoB;IAC5B,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,gBAAgB,CAAC,CAAC;IAC9E,gBAAgB,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,eAAe,EAAE,CAAC,CAAC,SAAS,MAAM,EAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC1B,GAAG,EAAE,aAAa,KACf,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,WAAW,EAAE,CACX,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;IAC7C,qBAAqB,EAAE,CACrB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,sBAAsB,EAAE,OAAO,sBAAsB,CAAC;IACtD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1E;AAuLD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAoC7E;AA0QD,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAM,GAC5C,OAAO,CAiET"}