@open-agent-toolkit/cli 0.3.12 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +1 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/contributing/index.md +14 -1
  4. package/assets/docs/contributing/skills.md +64 -2
  5. package/assets/docs/contributing/smoke-testing.md +3 -3
  6. package/assets/docs/contributing/updating-model-guidance.md +2 -2
  7. package/assets/docs/contributing/verifying-cursor-pins.md +1 -1
  8. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +112 -15
  9. package/assets/docs/docs-tooling/agent-instructions.md +131 -0
  10. package/assets/docs/docs-tooling/commands.md +74 -30
  11. package/assets/docs/docs-tooling/index.md +7 -6
  12. package/assets/docs/docs-tooling/meta.json +1 -1
  13. package/assets/docs/docs-tooling/workflows.md +357 -11
  14. package/assets/docs/{cli-utilities → getting-started}/bootstrap.md +60 -5
  15. package/assets/docs/{guide → getting-started}/concepts.md +28 -10
  16. package/assets/docs/getting-started/index.md +68 -0
  17. package/assets/docs/getting-started/meta.json +4 -0
  18. package/assets/docs/getting-started/quickstart.md +174 -0
  19. package/assets/docs/{cli-utilities → getting-started}/tool-packs.md +146 -15
  20. package/assets/docs/index.md +47 -48
  21. package/assets/docs/meta.json +6 -7
  22. package/assets/docs/provider-sync/commands.md +26 -3
  23. package/assets/docs/provider-sync/config.md +60 -1
  24. package/assets/docs/provider-sync/index.md +31 -15
  25. package/assets/docs/provider-sync/instruction-sync.md +43 -5
  26. package/assets/docs/provider-sync/manifest-and-drift.md +85 -0
  27. package/assets/docs/provider-sync/meta.json +1 -0
  28. package/assets/docs/provider-sync/pilot-with-a-team.md +236 -0
  29. package/assets/docs/provider-sync/scope-and-surface.md +37 -3
  30. package/assets/docs/reference/cli-reference.md +34 -34
  31. package/assets/docs/{cli-utilities → reference}/config-and-local-state.md +25 -9
  32. package/assets/docs/{cli-utilities → reference}/configuration.md +151 -34
  33. package/assets/docs/reference/docs-index-contract.md +19 -4
  34. package/assets/docs/reference/file-locations.md +7 -2
  35. package/assets/docs/reference/index.md +13 -1
  36. package/assets/docs/reference/meta.json +7 -1
  37. package/assets/docs/reference/oat-directory-structure.md +24 -22
  38. package/assets/docs/{workflows/projects/artifacts.md → reference/project-artifacts.md} +4 -4
  39. package/assets/docs/{workflows/projects/state-machine.md → reference/project-state-machine.md} +1 -1
  40. package/assets/docs/{workflows/projects/repo-analysis.md → reference/repository-pr-comments.md} +2 -2
  41. package/assets/docs/reference/troubleshooting.md +125 -10
  42. package/assets/docs/reference/what-oat-writes.md +410 -0
  43. package/assets/docs/skills/brainstorm.md +77 -0
  44. package/assets/docs/skills/diagnostics.md +56 -0
  45. package/assets/docs/{workflows/skills → skills}/explainer-kit.md +121 -0
  46. package/assets/docs/skills/index.md +416 -0
  47. package/assets/docs/{workflows/skills → skills}/meta.json +4 -2
  48. package/assets/docs/{workflows/skills → skills}/recon.md +49 -0
  49. package/assets/docs/skills/repo-improve.md +254 -0
  50. package/assets/docs/skills/research.md +237 -0
  51. package/assets/docs/skills/session-closeout.md +61 -0
  52. package/assets/docs/workflows/advanced/autonomy.md +344 -0
  53. package/assets/docs/workflows/{projects → advanced}/cursor-cloud.md +69 -1
  54. package/assets/docs/workflows/{projects → advanced}/dispatch-ceiling.md +163 -18
  55. package/assets/docs/workflows/{projects → advanced}/evidence-layers.md +1 -1
  56. package/assets/docs/workflows/advanced/index.md +19 -0
  57. package/assets/docs/workflows/advanced/meta.json +13 -0
  58. package/assets/docs/workflows/{projects → advanced}/orchestration-model.md +63 -4
  59. package/assets/docs/workflows/{projects → advanced}/programmatic-execution.md +4 -4
  60. package/assets/docs/{cli-utilities → workflows/advanced}/workflow-gates.md +162 -8
  61. package/assets/docs/workflows/advanced/worktree-bootstrap.md +83 -0
  62. package/assets/docs/workflows/approvals-and-automation.md +261 -0
  63. package/assets/docs/workflows/backlog-and-planning/backlog-lifecycle.md +348 -0
  64. package/assets/docs/workflows/backlog-and-planning/index.md +13 -0
  65. package/assets/docs/workflows/backlog-and-planning/meta.json +4 -0
  66. package/assets/docs/workflows/backlog-and-planning/remote-project-management.md +303 -0
  67. package/assets/docs/workflows/choose-workflow.md +114 -0
  68. package/assets/docs/workflows/ideas/index.md +3 -3
  69. package/assets/docs/workflows/ideas/lifecycle.md +218 -1
  70. package/assets/docs/workflows/index.md +11 -62
  71. package/assets/docs/workflows/meta.json +10 -2
  72. package/assets/docs/workflows/projects/closeout/closeout-skills.md +538 -0
  73. package/assets/docs/workflows/projects/closeout/index.md +14 -0
  74. package/assets/docs/workflows/projects/closeout/meta.json +4 -0
  75. package/assets/docs/workflows/projects/{pr-flow.md → closeout/pr-flow.md} +1 -1
  76. package/assets/docs/workflows/projects/{retro.md → closeout/retro.md} +1 -1
  77. package/assets/docs/workflows/projects/execution/execution-skills.md +258 -0
  78. package/assets/docs/workflows/projects/{implementation-execution.md → execution/implementation-execution.md} +8 -8
  79. package/assets/docs/workflows/projects/execution/index.md +15 -0
  80. package/assets/docs/workflows/projects/execution/meta.json +9 -0
  81. package/assets/docs/workflows/projects/execution/picking-up-projects.md +376 -0
  82. package/assets/docs/{cli-utilities → workflows/projects/execution}/project-log.md +1 -1
  83. package/assets/docs/workflows/projects/index.md +38 -49
  84. package/assets/docs/workflows/projects/lifecycle.md +47 -11
  85. package/assets/docs/workflows/projects/meta.json +2 -23
  86. package/assets/docs/workflows/projects/{design-modes.md → planning/design-modes.md} +29 -0
  87. package/assets/docs/workflows/projects/planning/hill-checkpoints.md +167 -0
  88. package/assets/docs/workflows/projects/planning/index.md +16 -0
  89. package/assets/docs/workflows/projects/planning/meta.json +10 -0
  90. package/assets/docs/workflows/projects/planning/planning-skills.md +381 -0
  91. package/assets/docs/workflows/projects/{splitting.md → planning/splitting.md} +3 -3
  92. package/assets/docs/workflows/projects/planning/starting-projects.md +511 -0
  93. package/assets/docs/workflows/projects/{reviews.md → reviews/index.md} +51 -5
  94. package/assets/docs/workflows/projects/reviews/meta.json +4 -0
  95. package/assets/docs/workflows/projects/reviews/review-flavors.md +643 -0
  96. package/assets/docs/workflows/projects/{reviewing-oat-prs.md → reviews/reviewing-oat-prs.md} +3 -3
  97. package/assets/docs/workflows/waves/index.md +12 -0
  98. package/assets/docs/workflows/waves/meta.json +4 -0
  99. package/assets/docs/workflows/waves/wave-workflows.md +206 -0
  100. package/assets/public-package-versions.json +4 -4
  101. package/assets/skills/oat-docs/SKILL.md +19 -19
  102. package/assets/skills/oat-docs-analyze/SKILL.md +27 -7
  103. package/assets/skills/oat-docs-analyze/references/quality-checklist.md +16 -3
  104. package/assets/skills/oat-docs-apply/SKILL.md +20 -3
  105. package/assets/skills/oat-docs-authoring/SKILL.md +11 -7
  106. package/assets/skills/oat-docs-authoring/references/docs-root-resolution.md +12 -5
  107. package/assets/skills/oat-docs-authoring/references/lifecycle-boundaries.md +7 -7
  108. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +13 -3
  109. package/assets/skills/oat-docs-authoring/references/targeted-authoring-workflow.md +5 -4
  110. package/assets/skills/oat-docs-authoring/references/validation.md +11 -1
  111. package/assets/skills/oat-docs-bootstrap/SKILL.md +31 -8
  112. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +2 -1
  113. package/assets/skills/oat-doctor/SKILL.md +25 -25
  114. package/assets/skills/oat-project-document/SKILL.md +21 -2
  115. package/assets/templates/docs-markdown/contributing.md +35 -0
  116. package/assets/templates/docs-markdown/index.md +18 -0
  117. package/dist/commands/docs/index-generate/index.d.ts.map +1 -1
  118. package/dist/commands/docs/index-generate/index.js +41 -8
  119. package/dist/commands/docs/init/index.d.ts +17 -2
  120. package/dist/commands/docs/init/index.d.ts.map +1 -1
  121. package/dist/commands/docs/init/index.js +194 -14
  122. package/dist/commands/docs/init/markdown.d.ts +39 -0
  123. package/dist/commands/docs/init/markdown.d.ts.map +1 -0
  124. package/dist/commands/docs/init/markdown.js +317 -0
  125. package/dist/commands/docs/init/resolve-options.d.ts +3 -1
  126. package/dist/commands/docs/init/resolve-options.d.ts.map +1 -1
  127. package/dist/commands/docs/init/resolve-options.js +36 -0
  128. package/dist/commands/docs/init/scaffold.d.ts.map +1 -1
  129. package/dist/commands/docs/init/scaffold.js +11 -0
  130. package/dist/commands/shared/agents-md.d.ts +7 -0
  131. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  132. package/dist/commands/shared/agents-md.js +131 -91
  133. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  134. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  135. package/dist/config/oat-config.d.ts +2 -1
  136. package/dist/config/oat-config.d.ts.map +1 -1
  137. package/dist/config/oat-config.js +4 -2
  138. package/package.json +2 -2
  139. package/assets/docs/cli-utilities/backlog-lifecycle.md +0 -80
  140. package/assets/docs/cli-utilities/index.md +0 -74
  141. package/assets/docs/cli-utilities/meta.json +0 -13
  142. package/assets/docs/cli-utilities/remote-project-management.md +0 -191
  143. package/assets/docs/guide/index.md +0 -31
  144. package/assets/docs/guide/meta.json +0 -4
  145. package/assets/docs/quickstart.md +0 -88
  146. package/assets/docs/workflows/projects/autonomy.md +0 -196
  147. package/assets/docs/workflows/projects/hill-checkpoints.md +0 -93
  148. package/assets/docs/workflows/projects/picking-up-projects.md +0 -124
  149. package/assets/docs/workflows/projects/review-flavors.md +0 -138
  150. package/assets/docs/workflows/skills/index.md +0 -184
  151. package/assets/docs/workflows/skills/repo-improve.md +0 -89
  152. package/assets/docs/workflows/wave-workflows.md +0 -77
@@ -1,12 +1,13 @@
1
1
  import { join } from 'node:path';
2
2
  import { buildCommandContext, } from '../../../app/command-context.js';
3
- import { formatAgentsMdGuidanceResult, formatAgentsMdMutationFailure, upsertAgentsMdSection, } from '../../shared/agents-md.js';
3
+ import { formatAgentsMdGuidanceResult, formatAgentsMdMutationFailure, previewAgentsMdSection, upsertAgentsMdSection, } from '../../shared/agents-md.js';
4
4
  import { confirmAction, inputWithDefault, selectWithAbort, } from '../../shared/shared.prompts.js';
5
5
  import { readGlobalOptions } from '../../shared/shared.utils.js';
6
6
  import { readOatConfig, writeOatConfig, } from '../../../config/oat-config.js';
7
7
  import { resolveAssetsRoot } from '../../../fs/assets.js';
8
8
  import { Command, Option } from 'commander';
9
9
  import { buildDocsCommands } from './docs-commands.js';
10
+ import { applyMarkdownDocsPlan, MarkdownDocsWriteError, planMarkdownDocs, validateMarkdownConfig, validateMarkdownTarget, } from './markdown.js';
10
11
  import { DEFAULT_DOCS_REPO_SHAPE_DEPENDENCIES, detectDocsRepoShape, getDefaultDocsAppName, resolveDocsInitOptions, } from './resolve-options.js';
11
12
  import { patchRootPackageJson, } from './root-package.js';
12
13
  import { scaffoldDocsApp } from './scaffold.js';
@@ -52,6 +53,84 @@ const DEFAULT_DEPENDENCIES = {
52
53
  inputWithDefault,
53
54
  selectWithAbort,
54
55
  runDocsInit: async (context, options, assetsRoot) => {
56
+ if (options.framework === 'markdown') {
57
+ const config = await readOatConfig(context.cwd);
58
+ const plan = await planMarkdownDocs({
59
+ ...options,
60
+ assetsRoot,
61
+ documentation: config.documentation,
62
+ });
63
+ const report = {
64
+ appRoot: plan.appRoot,
65
+ createdFiles: [],
66
+ preservedFiles: plan.preservedFiles,
67
+ auditAdvice: plan.auditAdvice,
68
+ changes: {
69
+ files: plan.files.map(({ name }) => name),
70
+ config: plan.configChanged,
71
+ },
72
+ configStatus: plan.configChanged ? 'planned' : 'no-change',
73
+ };
74
+ if (context.dryRun) {
75
+ return {
76
+ ...report,
77
+ dryRun: true,
78
+ plannedFiles: plan.files.map(({ name }) => name),
79
+ };
80
+ }
81
+ try {
82
+ const result = await applyMarkdownDocsPlan(plan);
83
+ report.createdFiles = result.createdFiles;
84
+ report.preservedFiles = result.preservedFiles;
85
+ }
86
+ catch (error) {
87
+ if (!(error instanceof MarkdownDocsWriteError))
88
+ throw error;
89
+ return {
90
+ ...report,
91
+ ...error.result,
92
+ configStatus: 'not-attempted',
93
+ changes: { files: error.result.createdFiles, config: false },
94
+ failure: { stage: 'scaffold', message: error.message },
95
+ };
96
+ }
97
+ if (plan.configChanged) {
98
+ try {
99
+ // Re-read after scaffolding so unrelated concurrent config edits survive.
100
+ const latest = await readOatConfig(context.cwd);
101
+ validateMarkdownConfig(context.cwd, plan.targetDir, latest.documentation);
102
+ latest.documentation = {
103
+ ...latest.documentation,
104
+ root: plan.targetDir,
105
+ tooling: 'markdown',
106
+ index: `${plan.targetDir}/index.md`,
107
+ };
108
+ await writeOatConfig(context.cwd, latest);
109
+ report.configStatus = 'updated';
110
+ }
111
+ catch (error) {
112
+ return {
113
+ ...report,
114
+ configStatus: 'failed',
115
+ changes: { files: report.createdFiles, config: false },
116
+ failure: {
117
+ stage: 'config',
118
+ message: error instanceof Error ? error.message : String(error),
119
+ },
120
+ };
121
+ }
122
+ }
123
+ report.changes = {
124
+ files: report.createdFiles,
125
+ config: report.configStatus === 'updated',
126
+ };
127
+ if (!context.json) {
128
+ context.logger.info(`Markdown docs at ${plan.targetDir}: ${report.createdFiles.length} baseline file(s) created, ${report.preservedFiles?.length ?? 0} preserved.`);
129
+ for (const advice of plan.auditAdvice)
130
+ context.logger.info(advice);
131
+ }
132
+ return report;
133
+ }
55
134
  const result = await scaffoldDocsApp({
56
135
  assetsRoot,
57
136
  ...options,
@@ -75,7 +154,8 @@ const DEFAULT_DEPENDENCIES = {
75
154
  context.logger.info(` App name: ${options.appName}`);
76
155
  context.logger.info(` Lint: ${options.lint}`);
77
156
  context.logger.info(` Format: ${options.format}`);
78
- logRootPackagePatch(context, rootPackagePatch);
157
+ if (rootPackagePatch)
158
+ logRootPackagePatch(context, rootPackagePatch);
79
159
  }
80
160
  return {
81
161
  createdFiles: result.createdFiles,
@@ -84,12 +164,14 @@ const DEFAULT_DEPENDENCIES = {
84
164
  };
85
165
  },
86
166
  upsertAgentsMdSection,
167
+ previewAgentsMdSection,
87
168
  readOatConfig,
88
169
  confirmAction,
89
170
  };
90
171
  const FRAMEWORK_LABELS = {
91
172
  fumadocs: 'Fumadocs (Next.js + MDX)',
92
173
  mkdocs: 'MkDocs (Python)',
174
+ markdown: 'Markdown',
93
175
  };
94
176
  /**
95
177
  * The AGENTS.md `## Documentation` section for a freshly scaffolded app.
@@ -103,6 +185,19 @@ const FRAMEWORK_LABELS = {
103
185
  * `documentation.index` is the nav YAML the Config bullet already names.
104
186
  */
105
187
  export function buildDocsSectionBody(options) {
188
+ if (options.framework === 'markdown') {
189
+ return [
190
+ '## Documentation',
191
+ '',
192
+ `- **Docs root:** \`${options.targetDir}\``,
193
+ '- **Tooling:** Markdown',
194
+ `- **Authored index:** \`${options.targetDir}/index.md\``,
195
+ `- **Contributing:** \`${options.targetDir}/contributing.md\``,
196
+ '',
197
+ 'Keep authored context, title/description metadata, and Contents maps with relative Markdown links current. Preserve local instructions; asset-only directories are exempt from indexes.',
198
+ 'Use `oat-docs-analyze` to audit gaps and `oat-docs-apply` for approved repairs. Optional generated inventories belong outside the content tree and do not replace the authored index.',
199
+ ].join('\n');
200
+ }
106
201
  const lines = [
107
202
  '## Documentation',
108
203
  '',
@@ -130,6 +225,7 @@ async function runDocsInitCommand(context, options, dependencies) {
130
225
  interactive: context.interactive,
131
226
  acceptDefaults: options.yes ?? false,
132
227
  providedFramework: options.framework,
228
+ providedAdopt: options.adopt,
133
229
  providedAppName: options.appName,
134
230
  providedSiteName: options.siteName,
135
231
  providedTargetDir: options.targetDir,
@@ -147,8 +243,25 @@ async function runDocsInitCommand(context, options, dependencies) {
147
243
  process.exitCode = 0;
148
244
  return;
149
245
  }
246
+ if (context.dryRun && resolved.framework !== 'markdown') {
247
+ throw new Error('--dry-run applies only to --framework markdown.');
248
+ }
249
+ if (options.adopt && resolved.framework !== 'markdown') {
250
+ throw new Error('--adopt applies only to --framework markdown.');
251
+ }
252
+ const inapplicableOptions = [];
150
253
  const existingConfig = await dependencies.readOatConfig(context.cwd);
151
- if (existingConfig.documentation?.root) {
254
+ if (resolved.framework === 'markdown') {
255
+ resolved.targetDir = await validateMarkdownTarget(context.cwd, resolved.targetDir);
256
+ validateMarkdownConfig(context.cwd, resolved.targetDir, existingConfig.documentation);
257
+ if (options.appName !== undefined)
258
+ inapplicableOptions.push('--app-name');
259
+ if (options.rootPatch === false)
260
+ inapplicableOptions.push('--no-root-patch');
261
+ if (!context.json && inapplicableOptions.length)
262
+ context.logger.warn(`Inapplicable to Markdown: ${inapplicableOptions.join(', ')}. No app or package changes will be made.`);
263
+ }
264
+ else if (existingConfig.documentation?.root) {
152
265
  const configDesc = `root: ${existingConfig.documentation.root}, tooling: ${existingConfig.documentation.tooling ?? 'unknown'}`;
153
266
  if (context.json) {
154
267
  // JSON mode: include warning in output, proceed only with --yes
@@ -175,21 +288,78 @@ async function runDocsInitCommand(context, options, dependencies) {
175
288
  }
176
289
  const assetsRoot = await dependencies.resolveAssetsRoot();
177
290
  const scaffold = await dependencies.runDocsInit(context, resolved, assetsRoot);
291
+ if (scaffold?.failure) {
292
+ if (context.json) {
293
+ context.logger.json({
294
+ status: 'partial',
295
+ ...resolved,
296
+ ...scaffold,
297
+ scaffold: {
298
+ status: scaffold.failure.stage === 'scaffold' ? 'partial' : 'complete',
299
+ targetDir: resolved.targetDir,
300
+ createdFiles: scaffold.createdFiles,
301
+ },
302
+ guidance: { action: 'not-attempted' },
303
+ });
304
+ }
305
+ else {
306
+ context.logger.warn(`Markdown setup is partial: ${scaffold.failure.stage} failed: ${scaffold.failure.message}`);
307
+ context.logger.info(`Created baseline files: ${scaffold.createdFiles.join(', ') || 'none'}. Configuration: ${scaffold.configStatus}. Guidance was not attempted; preserve created content when retrying with --adopt.`);
308
+ if (scaffold.incompleteFiles?.length) {
309
+ context.logger.warn(`Baseline files requiring inspection: ${scaffold.incompleteFiles.join(', ')}. Automatic cleanup could not be completed; inspect or repair these paths before retrying. Adoption preserves existing files.`);
310
+ }
311
+ }
312
+ process.exitCode = 1;
313
+ return;
314
+ }
178
315
  const sectionBody = buildDocsSectionBody(resolved);
179
316
  let sectionResult;
180
317
  try {
181
- sectionResult = await dependencies.upsertAgentsMdSection(context.cwd, 'docs', sectionBody);
318
+ sectionResult =
319
+ resolved.framework === 'markdown' && context.dryRun
320
+ ? await dependencies.previewAgentsMdSection(context.cwd, 'docs', sectionBody)
321
+ : await dependencies.upsertAgentsMdSection(context.cwd, 'docs', sectionBody);
182
322
  }
183
323
  catch (error) {
184
- throw new Error(formatAgentsMdMutationFailure(error), { cause: error });
324
+ if (resolved.framework !== 'markdown')
325
+ throw new Error(formatAgentsMdMutationFailure(error), { cause: error });
326
+ sectionResult = {
327
+ action: 'blocked',
328
+ blocked: {
329
+ code: 'blocked',
330
+ target: 'AGENTS.md',
331
+ reason: formatAgentsMdMutationFailure(error),
332
+ action: 'Review root guidance and retry.',
333
+ },
334
+ };
335
+ }
336
+ const markdownDetails = resolved.framework === 'markdown'
337
+ ? {
338
+ ...resolved,
339
+ ...scaffold,
340
+ dryRun: context.dryRun,
341
+ inapplicableOptions,
342
+ changes: {
343
+ ...scaffold?.changes,
344
+ guidance: sectionResult.action !== 'no-change',
345
+ },
346
+ }
347
+ : {};
348
+ if (resolved.framework === 'markdown' && context.dryRun && !context.json) {
349
+ context.logger.info(`Dry run: ${scaffold?.plannedFiles?.length ?? 0} planned baseline file(s); configuration ${scaffold?.configStatus}; guidance ${sectionResult.action}. No changes were written.`);
350
+ for (const advice of scaffold?.auditAdvice ?? [])
351
+ context.logger.info(advice);
185
352
  }
186
353
  if (sectionResult.action === 'manual-required' ||
187
354
  sectionResult.action === 'blocked') {
188
355
  if (context.json) {
189
356
  context.logger.json({
190
357
  status: 'partial',
358
+ ...markdownDetails,
191
359
  scaffold: {
192
- status: 'complete',
360
+ status: resolved.framework === 'markdown' && context.dryRun
361
+ ? 'planned'
362
+ : 'complete',
193
363
  targetDir: resolved.targetDir,
194
364
  framework: resolved.framework,
195
365
  },
@@ -197,7 +367,7 @@ async function runDocsInitCommand(context, options, dependencies) {
197
367
  });
198
368
  }
199
369
  else {
200
- context.logger.warn(`Docs scaffold completed; AGENTS.md guidance is ${sectionResult.action}.`);
370
+ context.logger.warn(`${resolved.framework === 'markdown' && context.dryRun ? 'Docs scaffold planned' : 'Docs scaffold completed'}; AGENTS.md guidance is ${sectionResult.action}.`);
201
371
  for (const line of formatAgentsMdGuidanceResult(sectionResult)) {
202
372
  context.logger.info(line);
203
373
  }
@@ -211,14 +381,21 @@ async function runDocsInitCommand(context, options, dependencies) {
211
381
  ...resolved,
212
382
  ...scaffold,
213
383
  guidance: sectionResult,
384
+ ...markdownDetails,
214
385
  });
215
386
  }
216
387
  else if (sectionResult.action !== 'no-change') {
217
- context.logger.info(`AGENTS.md docs section ${sectionResult.action}.`);
388
+ context.logger.info(`AGENTS.md docs section ${resolved.framework === 'markdown' && context.dryRun ? 'planned: ' : ''}${sectionResult.action}.`);
218
389
  }
219
390
  if (!context.json) {
220
391
  context.logger.info('');
221
392
  context.logger.info('Next steps:');
393
+ if (resolved.framework === 'markdown') {
394
+ context.logger.info(` Read ${resolved.targetDir}/index.md and ${resolved.targetDir}/contributing.md.`);
395
+ context.logger.info(' Use oat-docs-analyze to audit documentation and oat-docs-apply for approved repairs.');
396
+ process.exitCode = 0;
397
+ return;
398
+ }
222
399
  const commands = buildDocsCommands(resolved.repoShape, resolved.targetDir, resolved.appName);
223
400
  context.logger.info(` ${commands.install}`);
224
401
  context.logger.info(` ${commands.dev}`);
@@ -250,15 +427,16 @@ export function createDocsInitCommand(overrides = {}) {
250
427
  ...overrides,
251
428
  };
252
429
  return new Command('init')
253
- .description('Scaffold an OAT docs app')
430
+ .description('Bootstrap an OAT docs app or authored Markdown documentation')
254
431
  .addOption(new Option('--framework <framework>', 'Documentation framework').choices([
255
432
  'fumadocs',
256
433
  'mkdocs',
434
+ 'markdown',
257
435
  ]))
258
- .addOption(new Option('--app-name <name>', 'Docs app name'))
259
- .addOption(new Option('--site-name <name>', 'Display title (distinct from --app-name)'))
260
- .addOption(new Option('--target-dir <path>', 'Target directory for the docs app'))
261
- .addOption(new Option('--description <text>', 'Site description'))
436
+ .addOption(new Option('--app-name <name>', 'Docs app name (inapplicable to Markdown)'))
437
+ .addOption(new Option('--site-name <name>', 'Site display title or Markdown documentation title'))
438
+ .addOption(new Option('--target-dir <path>', 'Docs directory (Markdown defaults to docs; requires a dedicated directory)'))
439
+ .addOption(new Option('--description <text>', 'Documentation description'))
262
440
  .addOption(new Option('--lint <mode>', 'Markdown lint mode').choices([
263
441
  'none',
264
442
  'markdownlint-cli2',
@@ -267,7 +445,9 @@ export function createDocsInitCommand(overrides = {}) {
267
445
  'oxfmt',
268
446
  'none',
269
447
  ]))
270
- .option('--no-root-patch', 'Skip patching the consumer root package.json')
448
+ .option('--no-root-patch', 'Skip root package.json patch (inapplicable to Markdown)')
449
+ .option('--adopt', 'Add missing baseline files to existing Markdown docs; preserve authored content (Markdown only)')
450
+ .option('--dry-run', 'Preview Markdown files, config, and guidance without writes (Markdown only)')
271
451
  .option('--yes', 'Accept defaults without prompting')
272
452
  .action(async (options, command) => {
273
453
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
@@ -0,0 +1,39 @@
1
+ import type { OatDocumentationConfig } from '../../../config/oat-config.js';
2
+ import { type DocsInitResolvedOptions } from './resolve-options.js';
3
+ /** Validate a dedicated Markdown root, including existing symlink ancestors. */
4
+ export declare function validateMarkdownTarget(repoRoot: string, targetDir: string): Promise<string>;
5
+ export interface MarkdownDocsOptions extends DocsInitResolvedOptions {
6
+ assetsRoot: string;
7
+ documentation?: OatDocumentationConfig;
8
+ }
9
+ export interface MarkdownDocsPlan {
10
+ repoRoot: string;
11
+ targetDir: string;
12
+ appRoot: string;
13
+ files: {
14
+ name: string;
15
+ content: string;
16
+ }[];
17
+ preservedFiles: string[];
18
+ auditAdvice: string[];
19
+ documentationConfig: OatDocumentationConfig;
20
+ configChanged: boolean;
21
+ }
22
+ export interface MarkdownDocsResult {
23
+ appRoot: string;
24
+ createdFiles: string[];
25
+ incompleteFiles: string[];
26
+ preservedFiles: string[];
27
+ auditAdvice: string[];
28
+ documentationConfig: OatDocumentationConfig;
29
+ }
30
+ export declare class MarkdownDocsWriteError extends Error {
31
+ readonly result: MarkdownDocsResult;
32
+ constructor(message: string, result: MarkdownDocsResult, cause: unknown);
33
+ }
34
+ export declare function validateMarkdownConfig(repoRoot: string, targetDir: string, declared?: OatDocumentationConfig): void;
35
+ /** Read-only inspection used by both adoption and CLI dry-run. */
36
+ export declare function planMarkdownDocs(options: MarkdownDocsOptions): Promise<MarkdownDocsPlan>;
37
+ /** Adds missing baseline files exclusively; config is persisted by the caller. */
38
+ export declare function applyMarkdownDocsPlan(plan: MarkdownDocsPlan): Promise<MarkdownDocsResult>;
39
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../../src/commands/docs/init/markdown.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAKjE,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAE3B,gFAAgF;AAChF,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAsBD,MAAM,WAAW,mBAAoB,SAAQ,uBAAuB;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB,EAAE,sBAAsB,CAAC;IAC5C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB,EAAE,sBAAsB,CAAC;CAC7C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,MAAM,EAAE,kBAAkB;IAFrC,YACE,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,kBAAkB,EACnC,KAAK,EAAE,OAAO,EAGf;CACF;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,sBAAsB,GAChC,IAAI,CAeN;AA6JD,kEAAkE;AAClE,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA2E3B;AAED,kFAAkF;AAClF,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CA8E7B"}