@farming-labs/docs 0.1.123 → 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 (27) hide show
  1. package/dist/{agent-cmkIPvWo.mjs → agent-BtZrMCt8.mjs} +3 -3
  2. package/dist/agents-BPX4YRPs.mjs +209 -0
  3. package/dist/cli/index.mjs +31 -16
  4. package/dist/codeblocks-RacO12_K.mjs +1494 -0
  5. package/dist/{config-BHRL4R2v.mjs → config-B8wA38OC.mjs} +2 -2
  6. package/dist/{dev-C03tUSTz.mjs → dev-1VFeAWUi.mjs} +2 -2
  7. package/dist/{doctor-C9wz-4CE.mjs → doctor-B0nFg8oM.mjs} +3 -3
  8. package/dist/{downgrade-Bv7E5LV2.mjs → downgrade-BGANzvQb.mjs} +1 -1
  9. package/dist/index.d.mts +3 -3
  10. package/dist/index.mjs +1 -1
  11. package/dist/{init-_HAuo5Dv.mjs → init-DzQWiVN1.mjs} +1 -1
  12. package/dist/{mcp-veym29Yc.mjs → mcp-BvERlrP_.mjs} +1 -1
  13. package/dist/mcp.d.mts +1 -1
  14. package/dist/mcp.mjs +68 -7
  15. package/dist/{reading-time-Io7iRZ7S.mjs → reading-time-HpTq-0VB.mjs} +1 -0
  16. package/dist/{review-DEG_UnxV.mjs → review-ClNDYRnn.mjs} +1 -1
  17. package/dist/{robots-BkRZN-56.mjs → robots-CNLiZCay.mjs} +1 -1
  18. package/dist/{search-HqdPzNb3.mjs → search-BjyDm30M.mjs} +1 -1
  19. package/dist/{search-XmPPiA0V.d.mts → search-mF8wT9LQ.d.mts} +1 -1
  20. package/dist/server.d.mts +2 -2
  21. package/dist/{sitemap-wtr3w_D2.mjs → sitemap-BdSdcAmS.mjs} +1 -1
  22. package/dist/{types-CLofDwjw.d.mts → types-hDUu4K7W.d.mts} +133 -1
  23. package/dist/{upgrade-DrOWQIKI.mjs → upgrade-C7DvvfTR.mjs} +1 -1
  24. package/package.json +2 -1
  25. package/dist/agents-B3kj54S3.mjs +0 -795
  26. /package/dist/{package-version-L4GZowaF.mjs → package-version-OrjpmqoR.mjs} +0 -0
  27. /package/dist/{templates-CakZBXK8.mjs → templates-CGaORZOY.mjs} +0 -0
@@ -1,9 +1,9 @@
1
- import "./reading-time-Io7iRZ7S.mjs";
1
+ import "./reading-time-HpTq-0VB.mjs";
2
2
  import "./search-BL7o2rXk.mjs";
3
3
  import "./agent-BS39vnhS.mjs";
4
4
  import "./robots-B2BfoyVM.mjs";
5
5
  import "./sitemap-server-BZHoJHqC.mjs";
6
- import "./config-BHRL4R2v.mjs";
7
- import { a as readPageTokenBudget, i as printAgentCompactHelp, n as inspectAgentCompactionState, o as scanDocsPageTargets, r as parseAgentCompactArgs, t as compactAgentDocs } from "./agents-B3kj54S3.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
8
 
9
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-veym29Yc.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-cmkIPvWo.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-cmkIPvWo.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-B3kj54S3.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-B3kj54S3.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-C9wz-4CE.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-HqdPzNb3.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-wtr3w_D2.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-wtr3w_D2.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-BkRZN-56.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-BkRZN-56.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)