@farming-labs/docs 0.1.122 → 0.1.124

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 (33) hide show
  1. package/dist/{agent-Dt6kdGqw.mjs → agent-BS39vnhS.mjs} +6 -3
  2. package/dist/agent-BtZrMCt8.mjs +9 -0
  3. package/dist/agents-BPX4YRPs.mjs +209 -0
  4. package/dist/cli/index.mjs +33 -18
  5. package/dist/codeblocks-RacO12_K.mjs +1494 -0
  6. package/dist/{config-BHRL4R2v.mjs → config-B8wA38OC.mjs} +2 -2
  7. package/dist/{dev-C03tUSTz.mjs → dev-1VFeAWUi.mjs} +2 -2
  8. package/dist/{doctor-DMs3Q0wj.mjs → doctor-B0nFg8oM.mjs} +15 -9
  9. package/dist/{downgrade-Bv7E5LV2.mjs → downgrade-BGANzvQb.mjs} +1 -1
  10. package/dist/index.d.mts +5 -3
  11. package/dist/index.mjs +5 -5
  12. package/dist/{init-_HAuo5Dv.mjs → init-DzQWiVN1.mjs} +1 -1
  13. package/dist/{mcp-DojNlB8t.mjs → mcp-BvERlrP_.mjs} +2 -2
  14. package/dist/mcp.d.mts +1 -1
  15. package/dist/mcp.mjs +69 -8
  16. package/dist/{reading-time-Io7iRZ7S.mjs → reading-time-HpTq-0VB.mjs} +1 -0
  17. package/dist/{review-DEG_UnxV.mjs → review-ClNDYRnn.mjs} +1 -1
  18. package/dist/{robots-tohhTNbU.mjs → robots-B2BfoyVM.mjs} +6 -3
  19. package/dist/{robots-BxZaiGH3.mjs → robots-CNLiZCay.mjs} +3 -3
  20. package/dist/{search-DKpKe0rf.mjs → search-BjyDm30M.mjs} +2 -2
  21. package/dist/{search-DSgDbYBT.d.mts → search-mF8wT9LQ.d.mts} +4 -2
  22. package/dist/server.d.mts +3 -3
  23. package/dist/server.mjs +3 -3
  24. package/dist/{sitemap-CXwYOIIb.mjs → sitemap-BdSdcAmS.mjs} +10 -5
  25. package/dist/{sitemap-CnqcTdQg.mjs → sitemap-CMNj0Pt3.mjs} +4 -2
  26. package/dist/{sitemap-server-DdHzJorR.mjs → sitemap-server-BZHoJHqC.mjs} +1 -1
  27. package/dist/{types-CHD7M60f.d.mts → types-hDUu4K7W.d.mts} +134 -2
  28. package/dist/{upgrade-DrOWQIKI.mjs → upgrade-C7DvvfTR.mjs} +1 -1
  29. package/package.json +2 -1
  30. package/dist/agent-ByXnegrS.mjs +0 -9
  31. package/dist/agents-CpTNRbsh.mjs +0 -795
  32. /package/dist/{package-version-L4GZowaF.mjs → package-version-OrjpmqoR.mjs} +0 -0
  33. /package/dist/{templates-CakZBXK8.mjs → templates-CGaORZOY.mjs} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { n as renderDocsRelatedMarkdownLines } from "./related-BNj_NdHq.mjs";
2
- import { f as resolveDocsSitemapRequest, i as DEFAULT_SITEMAP_XML_ROUTE, n as DEFAULT_SITEMAP_MD_ROUTE, r as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, u as resolveDocsSitemapConfig } from "./sitemap-CnqcTdQg.mjs";
2
+ import { a as DEFAULT_SITEMAP_XML_ROUTE, d as resolveDocsSitemapConfig, i as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, n as DEFAULT_SITEMAP_MD_DOCS_ROUTE, p as resolveDocsSitemapRequest, r as DEFAULT_SITEMAP_MD_ROUTE } from "./sitemap-CMNj0Pt3.mjs";
3
3
 
4
4
  //#region src/agent.ts
5
5
  const DEFAULT_DOCS_API_ROUTE = "/api/docs";
@@ -664,10 +664,11 @@ function renderDocsMarkdownNotFound({ entry = "docs", requestedPath, sitemap })
664
664
  if (sitemapConfig.enabled) {
665
665
  if (sitemapConfig.markdown.enabled) {
666
666
  lines.push(`- Semantic sitemap: \`${sitemapConfig.markdown.route}\``);
667
+ if (sitemapConfig.markdown.docsRoute) lines.push(`- Docs-scoped sitemap alias: \`${sitemapConfig.markdown.docsRoute}\``);
667
668
  lines.push(`- Semantic sitemap well-known alias: \`${sitemapConfig.markdown.wellKnownRoute}\``);
668
669
  }
669
670
  if (sitemapConfig.xml.enabled) lines.push(`- XML sitemap: \`${sitemapConfig.xml.route}\``);
670
- } else lines.push(`- Sitemap discovery, if enabled: \`${DEFAULT_SITEMAP_MD_ROUTE}\`, \`${DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE}\`, or \`${DEFAULT_SITEMAP_XML_ROUTE}\``);
671
+ } else lines.push(`- Sitemap discovery, if enabled: \`${DEFAULT_SITEMAP_MD_ROUTE}\`, \`${DEFAULT_SITEMAP_MD_DOCS_ROUTE}\`, \`${DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE}\`, or \`${DEFAULT_SITEMAP_XML_ROUTE}\``);
671
672
  lines.push("", "The agent discovery spec is the safest first step because it lists the active markdown, sitemap, robots, search, MCP, and feedback routes for this deployment.");
672
673
  return lines.join("\n");
673
674
  }
@@ -780,7 +781,7 @@ function appendDocsOpenApiRouteLines(lines, context) {
780
781
  function appendDocsSitemapRouteLines(lines, context) {
781
782
  if (!context.sitemapConfig.enabled) return;
782
783
  if (context.sitemapConfig.xml.enabled) lines.push(`- Sitemap XML: ${context.sitemapConfig.xml.route}`);
783
- if (context.sitemapConfig.markdown.enabled) lines.push(`- Sitemap Markdown: ${context.sitemapConfig.markdown.route}`, `- Sitemap well-known alias: ${context.sitemapConfig.markdown.wellKnownRoute}`);
784
+ if (context.sitemapConfig.markdown.enabled) lines.push(`- Sitemap Markdown: ${context.sitemapConfig.markdown.route}`, ...context.sitemapConfig.markdown.docsRoute ? [`- Sitemap docs alias: ${context.sitemapConfig.markdown.docsRoute}`] : [], `- Sitemap well-known alias: ${context.sitemapConfig.markdown.wellKnownRoute}`);
784
785
  }
785
786
  function appendDocsMcpRouteLines(lines, context) {
786
787
  if (!context.mcpEnabled) return;
@@ -996,9 +997,11 @@ function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, sear
996
997
  markdown: {
997
998
  enabled: sitemapConfig.markdown.enabled,
998
999
  route: sitemapConfig.markdown.route,
1000
+ docsRoute: sitemapConfig.markdown.docsRoute,
999
1001
  wellKnownRoute: sitemapConfig.markdown.wellKnownRoute,
1000
1002
  api: `${DEFAULT_DOCS_API_ROUTE}?format=sitemap-md`,
1001
1003
  defaultRoute: DEFAULT_SITEMAP_MD_ROUTE,
1004
+ defaultDocsRoute: DEFAULT_SITEMAP_MD_DOCS_ROUTE,
1002
1005
  defaultWellKnownRoute: DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE
1003
1006
  }
1004
1007
  },
@@ -0,0 +1,9 @@
1
+ import "./reading-time-HpTq-0VB.mjs";
2
+ import "./search-BL7o2rXk.mjs";
3
+ import "./agent-BS39vnhS.mjs";
4
+ import "./robots-B2BfoyVM.mjs";
5
+ import "./sitemap-server-BZHoJHqC.mjs";
6
+ import "./config-B8wA38OC.mjs";
7
+ import { a as readPageTokenBudget, i as printAgentCompactHelp, n as inspectAgentCompactionState, o as scanDocsPageTargets, r as parseAgentCompactArgs, t as compactAgentDocs } from "./codeblocks-RacO12_K.mjs";
8
+
9
+ export { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp };
@@ -0,0 +1,209 @@
1
+ import "./search-BL7o2rXk.mjs";
2
+ import { K as resolveDocsAgentFeedbackConfig, V as renderDocsAgentsDocument, a as DEFAULT_AGENT_MD_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, y as DEFAULT_OPENAPI_SCHEMA_ROUTE } from "./agent-BS39vnhS.mjs";
3
+ import { S as resolveApiReferenceConfig } from "./sitemap-server-BZHoJHqC.mjs";
4
+ import { resolveDocsMcpConfig } from "./mcp.mjs";
5
+ import "./server.mjs";
6
+ import { c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-B8wA38OC.mjs";
7
+ import { t as detectFramework } from "./utils-x5EtYWjC.mjs";
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+ import path from "node:path";
10
+ import pc from "picocolors";
11
+
12
+ //#region src/cli/agents.ts
13
+ const AGENTS_GENERATED_MARKER = "<!-- Generated by @farming-labs/docs agents generate. -->";
14
+ function parseInlineFlag(arg) {
15
+ const [rawKey, value] = arg.slice(2).split("=", 2);
16
+ return {
17
+ key: rawKey.trim(),
18
+ value
19
+ };
20
+ }
21
+ function parseAgentsGenerateArgs(argv) {
22
+ const parsed = {};
23
+ for (let index = 0; index < argv.length; index += 1) {
24
+ const arg = argv[index];
25
+ if (arg === "--help" || arg === "-h") {
26
+ parsed.help = true;
27
+ continue;
28
+ }
29
+ if (arg === "--force") {
30
+ parsed.force = true;
31
+ continue;
32
+ }
33
+ if (arg === "--check") {
34
+ parsed.check = true;
35
+ continue;
36
+ }
37
+ if (arg.startsWith("--config=")) {
38
+ const value = parseInlineFlag(arg).value;
39
+ if (!value) throw new Error("Missing value for --config.");
40
+ parsed.configPath = value;
41
+ continue;
42
+ }
43
+ if (arg === "--config") {
44
+ const value = argv[index + 1];
45
+ if (!value || value.startsWith("--")) throw new Error("Missing value for --config.");
46
+ parsed.configPath = value;
47
+ index += 1;
48
+ continue;
49
+ }
50
+ if (arg.startsWith("--path=")) {
51
+ const value = parseInlineFlag(arg).value;
52
+ if (!value) throw new Error("Missing value for --path.");
53
+ parsed.path = value;
54
+ continue;
55
+ }
56
+ if (arg === "--path") {
57
+ const value = argv[index + 1];
58
+ if (!value || value.startsWith("--")) throw new Error("Missing value for --path.");
59
+ parsed.path = value;
60
+ index += 1;
61
+ continue;
62
+ }
63
+ if (!arg.startsWith("--") && !parsed.path) {
64
+ parsed.path = arg;
65
+ continue;
66
+ }
67
+ throw new Error(`Unknown agents generate flag: ${arg}.`);
68
+ }
69
+ return parsed;
70
+ }
71
+ function readTopLevelBooleanProperty(content, key) {
72
+ const match = content.match(new RegExp(`\\b${key}\\b\\s*:\\s*(true|false)`));
73
+ return match ? match[1] === "true" : void 0;
74
+ }
75
+ function readLlmsBaseUrlFromConfig(content, config) {
76
+ if (config?.llmsTxt && typeof config.llmsTxt === "object") return config.llmsTxt.baseUrl;
77
+ const block = extractNestedObjectLiteral(content, ["llmsTxt"]);
78
+ return block ? readStringProperty(block, "baseUrl") : void 0;
79
+ }
80
+ function readSitemapBaseUrlFromConfig(content, config) {
81
+ if (config?.sitemap && typeof config.sitemap === "object") return config.sitemap.baseUrl;
82
+ const block = extractNestedObjectLiteral(content, ["sitemap"]);
83
+ return block ? readStringProperty(block, "baseUrl") : void 0;
84
+ }
85
+ function readRobotsConfigFromStatic(content) {
86
+ const topLevelBoolean = readTopLevelBooleanProperty(content, "robots");
87
+ if (typeof topLevelBoolean === "boolean") return topLevelBoolean;
88
+ const block = extractNestedObjectLiteral(content, ["robots"]);
89
+ if (!block) return void 0;
90
+ return { enabled: readBooleanProperty(block, "enabled") ?? true };
91
+ }
92
+ function resolvePublicDir(rootDir) {
93
+ if (detectFramework(rootDir) === "sveltekit") return path.join(rootDir, "static");
94
+ return path.join(rootDir, "public");
95
+ }
96
+ function resolveAgentsPath(rootDir, options) {
97
+ if (options.path) return path.isAbsolute(options.path) ? options.path : path.resolve(rootDir, options.path);
98
+ return path.join(rootDir, "AGENTS.md");
99
+ }
100
+ function publicFilePath(rootDir, route) {
101
+ return path.join(resolvePublicDir(rootDir), route.replace(/^\/+/, ""));
102
+ }
103
+ function normalizeGeneratedContent(content) {
104
+ return `${AGENTS_GENERATED_MARKER}\n${content.trimEnd()}\n`;
105
+ }
106
+ function normalizeCustomContent(content) {
107
+ return content.endsWith("\n") ? content : `${content}\n`;
108
+ }
109
+ function isManagedAgentsFile(content) {
110
+ return content.includes(AGENTS_GENERATED_MARKER);
111
+ }
112
+ function writeIfNeeded(filePath, content, options) {
113
+ const current = existsSync(filePath) ? readFileSync(filePath, "utf-8") : void 0;
114
+ if (current === content) return "current";
115
+ if (current !== void 0 && !options.force && !isManagedAgentsFile(current)) return "kept";
116
+ if (options.check) return "changed";
117
+ mkdirSync(path.dirname(filePath), { recursive: true });
118
+ writeFileSync(filePath, content, "utf-8");
119
+ return "changed";
120
+ }
121
+ function resolveOpenApiDiscovery(config) {
122
+ const apiReference = resolveApiReferenceConfig(config?.apiReference);
123
+ if (!apiReference.enabled) return { enabled: false };
124
+ return {
125
+ enabled: true,
126
+ url: DEFAULT_OPENAPI_SCHEMA_ROUTE,
127
+ source: apiReference.specUrl ? "configured" : "generated",
128
+ specUrl: apiReference.specUrl,
129
+ apiReferencePath: `/${apiReference.path}`
130
+ };
131
+ }
132
+ async function generateAgents(options = {}) {
133
+ const rootDir = process.cwd();
134
+ const loadedConfigModule = await loadDocsConfigModule(rootDir, options.configPath);
135
+ const configContent = readFileSync(loadedConfigModule?.path ?? resolveDocsConfigPath(rootDir, options.configPath), "utf-8");
136
+ const config = loadedConfigModule?.config;
137
+ const entry = config?.entry ?? readTopLevelStringProperty(configContent, "entry") ?? "docs";
138
+ const siteTitle = typeof config?.nav?.title === "string" ? config.nav.title : readNavTitle(configContent) ?? "Documentation";
139
+ const siteDescription = typeof config?.metadata?.description === "string" ? config.metadata.description : void 0;
140
+ const baseUrl = readLlmsBaseUrlFromConfig(configContent, config) ?? readSitemapBaseUrlFromConfig(configContent, config);
141
+ const llmsTxt = config?.llmsTxt;
142
+ const llmsEnabled = llmsTxt === false ? false : typeof llmsTxt === "object" ? llmsTxt.enabled ?? true : true;
143
+ const llmsConfig = typeof llmsTxt === "object" ? llmsTxt : void 0;
144
+ const robotsInput = config?.robots ?? readRobotsConfigFromStatic(configContent) ?? true;
145
+ const rootAgentsPath = resolveAgentsPath(rootDir, options);
146
+ const generatedContent = normalizeGeneratedContent(renderDocsAgentsDocument({
147
+ origin: baseUrl ?? "http://localhost",
148
+ entry,
149
+ search: config?.search,
150
+ mcp: resolveDocsMcpConfig(config?.mcp),
151
+ feedback: resolveDocsAgentFeedbackConfig(config?.feedback),
152
+ llms: {
153
+ enabled: llmsEnabled,
154
+ baseUrl,
155
+ siteTitle,
156
+ siteDescription,
157
+ maxChars: llmsConfig?.maxChars,
158
+ sections: llmsConfig?.sections
159
+ },
160
+ sitemap: config?.sitemap,
161
+ robots: robotsInput,
162
+ openapi: resolveOpenApiDiscovery(config),
163
+ markdown: { acceptHeader: false }
164
+ }));
165
+ const existingRoot = existsSync(rootAgentsPath) ? readFileSync(rootAgentsPath, "utf-8") : null;
166
+ const sourceContent = existingRoot !== null && !options.force && !isManagedAgentsFile(existingRoot) ? normalizeCustomContent(existingRoot) : generatedContent;
167
+ const writes = [];
168
+ const kept = [];
169
+ const rootStatus = writeIfNeeded(rootAgentsPath, sourceContent, options);
170
+ if (rootStatus === "changed") writes.push(rootAgentsPath);
171
+ if (rootStatus === "kept") kept.push(rootAgentsPath);
172
+ for (const route of [
173
+ DEFAULT_AGENTS_MD_ROUTE,
174
+ DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE,
175
+ DEFAULT_AGENT_MD_ROUTE,
176
+ DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE
177
+ ]) {
178
+ const filePath = publicFilePath(rootDir, route);
179
+ const status = writeIfNeeded(filePath, sourceContent, options);
180
+ if (status === "changed") writes.push(filePath);
181
+ if (status === "kept") kept.push(filePath);
182
+ }
183
+ if (options.check && writes.length > 0) throw new Error("AGENTS.md output is stale. Run `docs agents generate` to update it.");
184
+ const relativeRoot = path.relative(rootDir, rootAgentsPath).replace(/\\/g, "/");
185
+ console.log(writes.length > 0 ? pc.green(`Generated agent instructions at ${relativeRoot}.`) : pc.green(`Agent instructions are current at ${relativeRoot}.`));
186
+ for (const filePath of writes) {
187
+ if (filePath === rootAgentsPath) continue;
188
+ console.log(pc.dim(path.relative(rootDir, filePath).replace(/\\/g, "/")));
189
+ }
190
+ for (const filePath of kept) console.log(pc.yellow(`Kept user-owned ${path.relative(rootDir, filePath).replace(/\\/g, "/")}.`));
191
+ }
192
+ function printAgentsGenerateHelp() {
193
+ console.log(`
194
+ ${pc.bold("docs agents generate")} — Generate AGENTS.md instructions for coding agents.
195
+
196
+ ${pc.dim("Usage:")}
197
+ pnpm exec docs ${pc.cyan("agents generate")} ${pc.dim("[path]")}
198
+
199
+ ${pc.dim("Options:")}
200
+ ${pc.cyan("--path <path>")} Write the root instructions file; defaults to ${pc.dim("AGENTS.md")}
201
+ ${pc.cyan("--force")} Replace existing AGENTS.md/static files
202
+ ${pc.cyan("--check")} Fail if generated output would change
203
+ ${pc.cyan("--config <path>")} Use a custom docs config path instead of ${pc.dim("docs.config.ts[x]")}
204
+ ${pc.cyan("-h, --help")} Show this help message
205
+ `);
206
+ }
207
+
208
+ //#endregion
209
+ export { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp };
@@ -77,16 +77,16 @@ async function main() {
77
77
  searchApiKey: typeof flags["search-api-key"] === "string" ? flags["search-api-key"] : void 0
78
78
  };
79
79
  if (!parsedCommand.command || parsedCommand.command === "init") {
80
- const { init } = await import("../init-_HAuo5Dv.mjs");
80
+ const { init } = await import("../init-DzQWiVN1.mjs");
81
81
  await init(initOptions);
82
82
  } else if (parsedCommand.command === "dev") {
83
- const { dev } = await import("../dev-C03tUSTz.mjs");
83
+ const { dev } = await import("../dev-1VFeAWUi.mjs");
84
84
  await dev(devOptions);
85
85
  } else if (parsedCommand.command === "mcp") {
86
- const { runMcp } = await import("../mcp-DojNlB8t.mjs");
86
+ const { runMcp } = await import("../mcp-BvERlrP_.mjs");
87
87
  await runMcp(mcpOptions);
88
88
  } else if (parsedCommand.command === "agent" && subcommand === "compact") {
89
- const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-ByXnegrS.mjs");
89
+ const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-BtZrMCt8.mjs");
90
90
  const agentCompactOptions = parseAgentCompactArgs(args.slice(2));
91
91
  if (agentCompactOptions.help) {
92
92
  printAgentCompactHelp();
@@ -96,11 +96,11 @@ async function main() {
96
96
  } else if (parsedCommand.command === "agent") {
97
97
  console.error(pc.red(`Unknown agent subcommand: ${subcommand ?? "(missing)"}`));
98
98
  console.error();
99
- const { printAgentCompactHelp } = await import("../agent-ByXnegrS.mjs");
99
+ const { printAgentCompactHelp } = await import("../agent-BtZrMCt8.mjs");
100
100
  printAgentCompactHelp();
101
101
  process.exit(1);
102
102
  } else if (parsedCommand.command === "agents" && subcommand === "generate") {
103
- const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-CpTNRbsh.mjs");
103
+ const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-BPX4YRPs.mjs");
104
104
  const agentsOptions = parseAgentsGenerateArgs(args.slice(2));
105
105
  if (agentsOptions.help) {
106
106
  printAgentsGenerateHelp();
@@ -110,11 +110,11 @@ async function main() {
110
110
  } else if (parsedCommand.command === "agents") {
111
111
  console.error(pc.red(`Unknown agents subcommand: ${subcommand ?? "(missing)"}`));
112
112
  console.error();
113
- const { printAgentsGenerateHelp } = await import("../agents-CpTNRbsh.mjs");
113
+ const { printAgentsGenerateHelp } = await import("../agents-BPX4YRPs.mjs");
114
114
  printAgentsGenerateHelp();
115
115
  process.exit(1);
116
116
  } else if (parsedCommand.command === "doctor") {
117
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-DMs3Q0wj.mjs");
117
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-B0nFg8oM.mjs");
118
118
  const doctorOptions = parseDoctorArgs(args.slice(1));
119
119
  if (doctorOptions.help) {
120
120
  printDoctorHelp();
@@ -122,15 +122,29 @@ async function main() {
122
122
  }
123
123
  await runDoctor(doctorOptions);
124
124
  } else if (parsedCommand.command === "review") {
125
- const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-DEG_UnxV.mjs");
125
+ const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-ClNDYRnn.mjs");
126
126
  const reviewOptions = parseReviewArgs(args.slice(1));
127
127
  if (reviewOptions.help) {
128
128
  printReviewHelp();
129
129
  return;
130
130
  }
131
131
  await runReview(reviewOptions);
132
+ } else if ((parsedCommand.command === "codeblocks" || parsedCommand.command === "code-blocks") && subcommand === "validate") {
133
+ const { parseCodeBlocksValidateArgs, printCodeBlocksValidateHelp, runCodeBlocksValidate } = await import("../codeblocks-RacO12_K.mjs");
134
+ const codeBlocksOptions = parseCodeBlocksValidateArgs(args.slice(2));
135
+ if (codeBlocksOptions.help) {
136
+ printCodeBlocksValidateHelp();
137
+ return;
138
+ }
139
+ await runCodeBlocksValidate(codeBlocksOptions);
140
+ } else if (parsedCommand.command === "codeblocks" || parsedCommand.command === "code-blocks") {
141
+ console.error(pc.red(`Unknown codeblocks subcommand: ${subcommand ?? "(missing)"}`));
142
+ console.error();
143
+ const { printCodeBlocksValidateHelp } = await import("../codeblocks-RacO12_K.mjs");
144
+ printCodeBlocksValidateHelp();
145
+ process.exit(1);
132
146
  } else if (parsedCommand.command === "search" && subcommand === "sync") {
133
- const { syncSearch } = await import("../search-DKpKe0rf.mjs");
147
+ const { syncSearch } = await import("../search-BjyDm30M.mjs");
134
148
  await syncSearch(searchSyncOptions);
135
149
  } else if (parsedCommand.command === "search") {
136
150
  console.error(pc.red(`Unknown search subcommand: ${subcommand ?? "(missing)"}`));
@@ -138,7 +152,7 @@ async function main() {
138
152
  printHelp();
139
153
  process.exit(1);
140
154
  } else if (parsedCommand.command === "sitemap" && subcommand === "generate") {
141
- const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-CXwYOIIb.mjs");
155
+ const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-BdSdcAmS.mjs");
142
156
  const sitemapOptions = parseSitemapGenerateArgs(args.slice(2));
143
157
  if (sitemapOptions.help) {
144
158
  printSitemapGenerateHelp();
@@ -148,11 +162,11 @@ async function main() {
148
162
  } else if (parsedCommand.command === "sitemap") {
149
163
  console.error(pc.red(`Unknown sitemap subcommand: ${subcommand ?? "(missing)"}`));
150
164
  console.error();
151
- const { printSitemapGenerateHelp } = await import("../sitemap-CXwYOIIb.mjs");
165
+ const { printSitemapGenerateHelp } = await import("../sitemap-BdSdcAmS.mjs");
152
166
  printSitemapGenerateHelp();
153
167
  process.exit(1);
154
168
  } else if (parsedCommand.command === "robots" && subcommand === "generate") {
155
- const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-BxZaiGH3.mjs");
169
+ const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-CNLiZCay.mjs");
156
170
  const robotsOptions = parseRobotsGenerateArgs(args.slice(2));
157
171
  if (robotsOptions.help) {
158
172
  printRobotsGenerateHelp();
@@ -162,11 +176,11 @@ async function main() {
162
176
  } else if (parsedCommand.command === "robots") {
163
177
  console.error(pc.red(`Unknown robots subcommand: ${subcommand ?? "(missing)"}`));
164
178
  console.error();
165
- const { printRobotsGenerateHelp } = await import("../robots-BxZaiGH3.mjs");
179
+ const { printRobotsGenerateHelp } = await import("../robots-CNLiZCay.mjs");
166
180
  printRobotsGenerateHelp();
167
181
  process.exit(1);
168
182
  } else if (parsedCommand.command === "downgrade") {
169
- const { downgrade } = await import("../downgrade-Bv7E5LV2.mjs");
183
+ const { downgrade } = await import("../downgrade-BGANzvQb.mjs");
170
184
  const framework = (typeof flags.framework === "string" ? flags.framework : void 0) ?? (args[1] && !args[1].startsWith("--") ? args[1] : void 0);
171
185
  const hasVersionFlag = args.includes("--version") || args.some((arg) => arg.startsWith("--version="));
172
186
  await downgrade({
@@ -174,7 +188,7 @@ async function main() {
174
188
  version: typeof flags.version === "string" ? flags.version : hasVersionFlag ? "" : void 0
175
189
  });
176
190
  } else if (parsedCommand.command === "upgrade") {
177
- const { upgrade } = await import("../upgrade-DrOWQIKI.mjs");
191
+ const { upgrade } = await import("../upgrade-C7DvvfTR.mjs");
178
192
  const framework = (typeof flags.framework === "string" ? flags.framework : void 0) ?? (args[1] && !args[1].startsWith("--") ? args[1] : void 0);
179
193
  const hasVersionFlag = args.includes("--version") || args.some((arg) => arg.startsWith("--version="));
180
194
  const version = typeof flags.version === "string" ? flags.version : hasVersionFlag ? "" : void 0;
@@ -206,6 +220,7 @@ ${pc.dim("Commands:")}
206
220
  ${pc.cyan("agents")} AGENTS.md utilities (${pc.dim("generate")} for static agent instructions)
207
221
  ${pc.cyan("doctor")} Inspect and score agent or reader-facing docs quality
208
222
  ${pc.cyan("review")} Review changed docs files and wire Docs Review CI
223
+ ${pc.cyan("codeblocks")} Validate fenced MDX code blocks (${pc.dim("validate")})
209
224
  ${pc.cyan("mcp")} Run the built-in docs MCP server over stdio
210
225
  ${pc.cyan("robots")} Robots.txt utilities (${pc.dim("generate")} for agent access policy)
211
226
  ${pc.cyan("search")} Search utilities (${pc.dim("sync")} for external indexes)
@@ -286,8 +301,8 @@ ${pc.dim("Options for search sync:")}
286
301
  ${pc.cyan("--search-api-key <key>")} Algolia search key (or use ${pc.dim("ALGOLIA_SEARCH_API_KEY")})
287
302
 
288
303
  ${pc.dim("Options for sitemap generate:")}
289
- ${pc.cyan("sitemap generate")} Generate sitemap manifest and public ${pc.dim("sitemap.xml")}/${pc.dim("sitemap.md")}
290
- ${pc.cyan("--public")} Explicitly write public ${pc.dim("sitemap.xml")} and ${pc.dim("sitemap.md")} files
304
+ ${pc.cyan("sitemap generate")} Generate sitemap manifest and public ${pc.dim("sitemap.xml")}/${pc.dim("sitemap.md")}/${pc.dim("docs/sitemap.md")}
305
+ ${pc.cyan("--public")} Explicitly write public ${pc.dim("sitemap.xml")}, ${pc.dim("sitemap.md")}, and ${pc.dim("docs/sitemap.md")} files
291
306
  ${pc.cyan("--manifest-only")} Only write the internal sitemap manifest
292
307
  ${pc.cyan("--check")} Fail if generated sitemap output is stale
293
308
  ${pc.cyan("--config <path>")} Use a custom docs config path instead of ${pc.dim("docs.config.ts[x]")}