@farming-labs/docs 0.2.50 → 0.2.53

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 (44) hide show
  1. package/dist/agent-2t4kZLGo.mjs +10 -0
  2. package/dist/{agent-CaOBIVFy.mjs → agent-BMxMpEa0.mjs} +194 -22
  3. package/dist/agent-contract-b0akaPcg.mjs +573 -0
  4. package/dist/agent-export--X9Go-wj.mjs +853 -0
  5. package/dist/{agents-DjhjZaNP.mjs → agents-CW-zTNKP.mjs} +6 -5
  6. package/dist/cli/index.mjs +43 -28
  7. package/dist/client/react.d.mts +1 -1
  8. package/dist/{cloud-ask-ai-DcMe6xOf.d.mts → cloud-ask-ai-CMzYVzVX.d.mts} +1 -1
  9. package/dist/{cloud-C_Ok9rC5.mjs → cloud-zs0qAnKJ.mjs} +3 -3
  10. package/dist/{codeblocks-z9iT794h.mjs → codeblocks-DWM4IJPL.mjs} +9 -12
  11. package/dist/{dev-Tm9Ss4D6.mjs → dev-DFeVU2Ui.mjs} +2 -2
  12. package/dist/docs-cloud-server.d.mts +2 -2
  13. package/dist/docs-cloud-server.mjs +1 -1
  14. package/dist/{doctor-O9o9kjN8.mjs → doctor-CkM5tKdD.mjs} +36 -24
  15. package/dist/{downgrade-CYEaOctn.mjs → downgrade-Dj_KXV11.mjs} +2 -2
  16. package/dist/i18n-CAlj1ADU.mjs +40 -0
  17. package/dist/index.d.mts +139 -3
  18. package/dist/index.mjs +7 -5
  19. package/dist/{init-Ch5On0zm.mjs → init-Cmz-oqnp.mjs} +3 -3
  20. package/dist/{mcp-DuCPNHS-.mjs → mcp-B4Q1PN93.mjs} +9 -5
  21. package/dist/mcp.d.mts +102 -4
  22. package/dist/mcp.mjs +1446 -66
  23. package/dist/{package-version-C8PigBZk.mjs → package-version-DxnTZH4m.mjs} +1 -1
  24. package/dist/{reading-time-CPAy1SWO.mjs → reading-time-BuK2YL23.mjs} +278 -33
  25. package/dist/{review-lm3dt7yy.mjs → review-BEsbm0l2.mjs} +38 -3
  26. package/dist/{robots-DV7u4Ire.mjs → robots-BOwkq9du.mjs} +5 -4
  27. package/dist/{robots-XVPs9lVz.mjs → robots-C6uQG-fS.mjs} +1 -1
  28. package/dist/{search-BWuU70B0.mjs → search-CJNLkdjX.mjs} +174 -79
  29. package/dist/{search-DFEhf9-s.d.mts → search-CTu6Bvq-.d.mts} +3 -1
  30. package/dist/{search-B6nEkx86.mjs → search-CtAXkk_J.mjs} +5 -4
  31. package/dist/server.d.mts +5 -5
  32. package/dist/server.mjs +8 -7
  33. package/dist/{sitemap-BEiKy4Iy.mjs → sitemap-OPb8EdNe.mjs} +6 -5
  34. package/dist/{sitemap-server-xEHtDUDB.mjs → sitemap-server-DnilMEiZ.mjs} +1 -1
  35. package/dist/{templates-uaauJcTO.mjs → templates-Bty9M6lA.mjs} +11 -5
  36. package/dist/{types-XqGLsmOD.d.mts → types-CdKu8KmO.d.mts} +118 -2
  37. package/dist/{upgrade-DzQtpgJM.mjs → upgrade-BNdBB9tQ.mjs} +2 -2
  38. package/package.json +1 -1
  39. package/dist/agent-DXDOMJBw.mjs +0 -9
  40. /package/dist/{cloud-ask-ai-Cl-xaV8j.mjs → cloud-ask-ai-BFlx8VMO.mjs} +0 -0
  41. /package/dist/{config-tiQCZ46q.mjs → config-DhIyFsy9.mjs} +0 -0
  42. /package/dist/{errors-CW1LnxaQ.mjs → errors-BxfYhp1L.mjs} +0 -0
  43. /package/dist/{review-B7goPYUb.mjs → review-BHdy75TE.mjs} +0 -0
  44. /package/dist/{utils-D-xTRNuh.mjs → utils-CMZTjRQT.mjs} +0 -0
@@ -1,10 +1,11 @@
1
- import { $ as renderDocsAgentsDocument, C as DEFAULT_OPENAPI_SCHEMA_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, it as resolveDocsAgentFeedbackConfig, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE } from "./agent-CaOBIVFy.mjs";
2
- import "./search-BWuU70B0.mjs";
3
- import { S as resolveApiReferenceConfig } from "./sitemap-server-xEHtDUDB.mjs";
1
+ import "./agent-contract-b0akaPcg.mjs";
2
+ import { C as DEFAULT_OPENAPI_SCHEMA_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, st as resolveDocsAgentFeedbackConfig, t as DEFAULT_AGENTS_MD_ROUTE, tt as renderDocsAgentsDocument } from "./agent-BMxMpEa0.mjs";
3
+ import "./search-CJNLkdjX.mjs";
4
+ import { S as resolveApiReferenceConfig } from "./sitemap-server-DnilMEiZ.mjs";
4
5
  import { resolveDocsMcpConfig } from "./mcp.mjs";
5
6
  import "./server.mjs";
6
- import { c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsConfigPath, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-tiQCZ46q.mjs";
7
- import { t as detectFramework } from "./utils-D-xTRNuh.mjs";
7
+ import { c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsConfigPath, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-DhIyFsy9.mjs";
8
+ import { t as detectFramework } from "./utils-CMZTjRQT.mjs";
8
9
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
10
  import path from "node:path";
10
11
  import pc from "picocolors";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as wasCliErrorReported, r as shouldPrintStackTrace, t as formatCliError } from "../errors-CW1LnxaQ.mjs";
2
+ import { i as wasCliErrorReported, r as shouldPrintStackTrace, t as formatCliError } from "../errors-BxfYhp1L.mjs";
3
3
  import pc from "picocolors";
4
4
 
5
5
  //#region src/cli/index.ts
@@ -105,57 +105,67 @@ async function main() {
105
105
  ]
106
106
  };
107
107
  if (!parsedCommand.command || parsedCommand.command === "init") {
108
- const { init } = await import("../init-Ch5On0zm.mjs");
108
+ const { init } = await import("../init-Cmz-oqnp.mjs");
109
109
  await init(initOptions);
110
110
  } else if (parsedCommand.command === "dev") {
111
- const { dev } = await import("../dev-Tm9Ss4D6.mjs");
111
+ const { dev } = await import("../dev-DFeVU2Ui.mjs");
112
112
  await dev(devOptions);
113
113
  } else if (parsedCommand.command === "deploy") {
114
- const { runCloudDeploy } = await import("../cloud-C_Ok9rC5.mjs");
114
+ const { runCloudDeploy } = await import("../cloud-zs0qAnKJ.mjs");
115
115
  await runCloudDeploy(cloudOptions);
116
116
  } else if (parsedCommand.command === "preview") {
117
- const { runCloudPreview } = await import("../cloud-C_Ok9rC5.mjs");
117
+ const { runCloudPreview } = await import("../cloud-zs0qAnKJ.mjs");
118
118
  await runCloudPreview(cloudOptions);
119
119
  } else if (parsedCommand.command === "cloud" && subcommand === "deploy") {
120
- const { runCloudDeploy } = await import("../cloud-C_Ok9rC5.mjs");
120
+ const { runCloudDeploy } = await import("../cloud-zs0qAnKJ.mjs");
121
121
  await runCloudDeploy(cloudOptions);
122
122
  } else if (parsedCommand.command === "cloud" && subcommand === "preview") {
123
- const { runCloudPreview } = await import("../cloud-C_Ok9rC5.mjs");
123
+ const { runCloudPreview } = await import("../cloud-zs0qAnKJ.mjs");
124
124
  await runCloudPreview(cloudOptions);
125
125
  } else if (parsedCommand.command === "cloud" && subcommand === "init") {
126
- const { runCloudInit } = await import("../cloud-C_Ok9rC5.mjs");
126
+ const { runCloudInit } = await import("../cloud-zs0qAnKJ.mjs");
127
127
  await runCloudInit(cloudOptions);
128
128
  } else if (parsedCommand.command === "cloud" && subcommand === "sync") {
129
- const { syncCloudConfig } = await import("../cloud-C_Ok9rC5.mjs");
129
+ const { syncCloudConfig } = await import("../cloud-zs0qAnKJ.mjs");
130
130
  await syncCloudConfig(cloudOptions);
131
131
  } else if (parsedCommand.command === "cloud" && subcommand === "check") {
132
- const { runCloudCheck } = await import("../cloud-C_Ok9rC5.mjs");
132
+ const { runCloudCheck } = await import("../cloud-zs0qAnKJ.mjs");
133
133
  await runCloudCheck(cloudOptions);
134
134
  } else if (parsedCommand.command === "cloud") {
135
135
  console.error(pc.red(`Unknown cloud subcommand: ${subcommand ?? "(missing)"}`));
136
136
  console.error();
137
- const { printCloudHelp } = await import("../cloud-C_Ok9rC5.mjs");
137
+ const { printCloudHelp } = await import("../cloud-zs0qAnKJ.mjs");
138
138
  printCloudHelp();
139
139
  process.exit(1);
140
140
  } else if (parsedCommand.command === "mcp") {
141
- const { runMcp } = await import("../mcp-DuCPNHS-.mjs");
141
+ const { runMcp } = await import("../mcp-B4Q1PN93.mjs");
142
142
  await runMcp(mcpOptions);
143
143
  } else if (parsedCommand.command === "agent" && subcommand === "compact") {
144
- const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-DXDOMJBw.mjs");
144
+ const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-2t4kZLGo.mjs");
145
145
  const agentCompactOptions = parseAgentCompactArgs(args.slice(2));
146
146
  if (agentCompactOptions.help) {
147
147
  printAgentCompactHelp();
148
148
  return;
149
149
  }
150
150
  await compactAgentDocs(agentCompactOptions);
151
+ } else if (parsedCommand.command === "agent" && subcommand === "export") {
152
+ const { exportAgentBundle, parseAgentExportArgs, printAgentExportHelp } = await import("../agent-export--X9Go-wj.mjs");
153
+ const agentExportOptions = parseAgentExportArgs(args.slice(2));
154
+ if (agentExportOptions.help) {
155
+ printAgentExportHelp();
156
+ return;
157
+ }
158
+ await exportAgentBundle(agentExportOptions);
151
159
  } else if (parsedCommand.command === "agent") {
152
160
  console.error(pc.red(`Unknown agent subcommand: ${subcommand ?? "(missing)"}`));
153
161
  console.error();
154
- const { printAgentCompactHelp } = await import("../agent-DXDOMJBw.mjs");
162
+ const { printAgentCompactHelp } = await import("../agent-2t4kZLGo.mjs");
163
+ const { printAgentExportHelp } = await import("../agent-export--X9Go-wj.mjs");
155
164
  printAgentCompactHelp();
165
+ printAgentExportHelp();
156
166
  process.exit(1);
157
167
  } else if (parsedCommand.command === "agents" && subcommand === "generate") {
158
- const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-DjhjZaNP.mjs");
168
+ const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-CW-zTNKP.mjs");
159
169
  const agentsOptions = parseAgentsGenerateArgs(args.slice(2));
160
170
  if (agentsOptions.help) {
161
171
  printAgentsGenerateHelp();
@@ -165,11 +175,11 @@ async function main() {
165
175
  } else if (parsedCommand.command === "agents") {
166
176
  console.error(pc.red(`Unknown agents subcommand: ${subcommand ?? "(missing)"}`));
167
177
  console.error();
168
- const { printAgentsGenerateHelp } = await import("../agents-DjhjZaNP.mjs");
178
+ const { printAgentsGenerateHelp } = await import("../agents-CW-zTNKP.mjs");
169
179
  printAgentsGenerateHelp();
170
180
  process.exit(1);
171
181
  } else if (parsedCommand.command === "doctor") {
172
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-O9o9kjN8.mjs");
182
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-CkM5tKdD.mjs");
173
183
  const doctorOptions = parseDoctorArgs(args.slice(1));
174
184
  if (doctorOptions.help) {
175
185
  printDoctorHelp();
@@ -177,7 +187,7 @@ async function main() {
177
187
  }
178
188
  await runDoctor(doctorOptions);
179
189
  } else if (parsedCommand.command === "review") {
180
- const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-lm3dt7yy.mjs");
190
+ const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-BEsbm0l2.mjs");
181
191
  const reviewOptions = parseReviewArgs(args.slice(1));
182
192
  if (reviewOptions.help) {
183
193
  printReviewHelp();
@@ -185,7 +195,7 @@ async function main() {
185
195
  }
186
196
  await runReview(reviewOptions);
187
197
  } else if ((parsedCommand.command === "codeblocks" || parsedCommand.command === "code-blocks") && subcommand === "validate") {
188
- const { parseCodeBlocksValidateArgs, printCodeBlocksValidateHelp, runCodeBlocksValidate } = await import("../codeblocks-z9iT794h.mjs");
198
+ const { parseCodeBlocksValidateArgs, printCodeBlocksValidateHelp, runCodeBlocksValidate } = await import("../codeblocks-DWM4IJPL.mjs");
189
199
  const codeBlocksOptions = parseCodeBlocksValidateArgs(args.slice(2));
190
200
  if (codeBlocksOptions.help) {
191
201
  printCodeBlocksValidateHelp();
@@ -195,11 +205,11 @@ async function main() {
195
205
  } else if (parsedCommand.command === "codeblocks" || parsedCommand.command === "code-blocks") {
196
206
  console.error(pc.red(`Unknown codeblocks subcommand: ${subcommand ?? "(missing)"}`));
197
207
  console.error();
198
- const { printCodeBlocksValidateHelp } = await import("../codeblocks-z9iT794h.mjs");
208
+ const { printCodeBlocksValidateHelp } = await import("../codeblocks-DWM4IJPL.mjs");
199
209
  printCodeBlocksValidateHelp();
200
210
  process.exit(1);
201
211
  } else if (parsedCommand.command === "search" && subcommand === "sync") {
202
- const { syncSearch } = await import("../search-B6nEkx86.mjs");
212
+ const { syncSearch } = await import("../search-CtAXkk_J.mjs");
203
213
  await syncSearch(searchSyncOptions);
204
214
  } else if (parsedCommand.command === "search") {
205
215
  console.error(pc.red(`Unknown search subcommand: ${subcommand ?? "(missing)"}`));
@@ -207,7 +217,7 @@ async function main() {
207
217
  printHelp();
208
218
  process.exit(1);
209
219
  } else if (parsedCommand.command === "sitemap" && subcommand === "generate") {
210
- const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-BEiKy4Iy.mjs");
220
+ const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-OPb8EdNe.mjs");
211
221
  const sitemapOptions = parseSitemapGenerateArgs(args.slice(2));
212
222
  if (sitemapOptions.help) {
213
223
  printSitemapGenerateHelp();
@@ -217,11 +227,11 @@ async function main() {
217
227
  } else if (parsedCommand.command === "sitemap") {
218
228
  console.error(pc.red(`Unknown sitemap subcommand: ${subcommand ?? "(missing)"}`));
219
229
  console.error();
220
- const { printSitemapGenerateHelp } = await import("../sitemap-BEiKy4Iy.mjs");
230
+ const { printSitemapGenerateHelp } = await import("../sitemap-OPb8EdNe.mjs");
221
231
  printSitemapGenerateHelp();
222
232
  process.exit(1);
223
233
  } else if (parsedCommand.command === "robots" && subcommand === "generate") {
224
- const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-DV7u4Ire.mjs");
234
+ const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-BOwkq9du.mjs");
225
235
  const robotsOptions = parseRobotsGenerateArgs(args.slice(2));
226
236
  if (robotsOptions.help) {
227
237
  printRobotsGenerateHelp();
@@ -231,11 +241,11 @@ async function main() {
231
241
  } else if (parsedCommand.command === "robots") {
232
242
  console.error(pc.red(`Unknown robots subcommand: ${subcommand ?? "(missing)"}`));
233
243
  console.error();
234
- const { printRobotsGenerateHelp } = await import("../robots-DV7u4Ire.mjs");
244
+ const { printRobotsGenerateHelp } = await import("../robots-BOwkq9du.mjs");
235
245
  printRobotsGenerateHelp();
236
246
  process.exit(1);
237
247
  } else if (parsedCommand.command === "downgrade") {
238
- const { downgrade } = await import("../downgrade-CYEaOctn.mjs");
248
+ const { downgrade } = await import("../downgrade-Dj_KXV11.mjs");
239
249
  const framework = (typeof flags.framework === "string" ? flags.framework : void 0) ?? (args[1] && !args[1].startsWith("--") ? args[1] : void 0);
240
250
  const hasVersionFlag = args.includes("--version") || args.some((arg) => arg.startsWith("--version="));
241
251
  await downgrade({
@@ -244,7 +254,7 @@ async function main() {
244
254
  dryRun: flags["dry-run"] === true
245
255
  });
246
256
  } else if (parsedCommand.command === "upgrade") {
247
- const { upgrade } = await import("../upgrade-DzQtpgJM.mjs");
257
+ const { upgrade } = await import("../upgrade-BNdBB9tQ.mjs");
248
258
  const framework = (typeof flags.framework === "string" ? flags.framework : void 0) ?? (args[1] && !args[1].startsWith("--") ? args[1] : void 0);
249
259
  const hasVersionFlag = args.includes("--version") || args.some((arg) => arg.startsWith("--version="));
250
260
  const version = typeof flags.version === "string" ? flags.version : hasVersionFlag ? "" : void 0;
@@ -276,7 +286,7 @@ ${pc.dim("Commands:")}
276
286
  ${pc.cyan("deploy")} Sync cloud config and deploy hosted preview docs
277
287
  ${pc.cyan("preview")} Alias for ${pc.cyan("deploy")}
278
288
  ${pc.cyan("cloud")} Docs Cloud utilities (${pc.dim("init")}, ${pc.dim("check")}, ${pc.dim("deploy")}, ${pc.dim("preview")}, ${pc.dim("sync")})
279
- ${pc.cyan("agent")} Agent utilities (${pc.dim("compact")} to generate sibling agent.md files)
289
+ ${pc.cyan("agent")} Agent utilities (${pc.dim("compact")} page context, ${pc.dim("export")} static bundles)
280
290
  ${pc.cyan("agents")} AGENTS.md utilities (${pc.dim("generate")} for static agent instructions)
281
291
  ${pc.cyan("doctor")} Inspect and score agent or reader-facing docs quality
282
292
  ${pc.cyan("review")} Review changed docs files and wire Docs Review CI
@@ -346,6 +356,11 @@ ${pc.dim("Options for agent compact:")}
346
356
  ${pc.cyan("--aggressiveness <0-1>")} Compression intensity for compacted output
347
357
  ${pc.cyan("--dry-run")} Resolve and compress pages without writing files
348
358
 
359
+ ${pc.dim("Options for agent export:")}
360
+ ${pc.cyan("agent export --public")} Export page Markdown, llms.txt, discovery, skills, AGENTS, sitemaps, robots, and a SHA-256 manifest
361
+ ${pc.cyan("agent export --check")} Fail when the static Agent Bundle is stale
362
+ ${pc.cyan("--config <path>")} Use a custom docs config path instead of ${pc.dim("docs.config.ts[x]")}
363
+
349
364
  ${pc.dim("Options for doctor:")}
350
365
  ${pc.cyan("doctor")} Score the current docs app for agent-readiness
351
366
  ${pc.cyan("doctor --agent")} Same as ${pc.cyan("doctor")}; explicit agent scoring mode
@@ -1,4 +1,4 @@
1
- import { v as DocsAnalyticsConfig } from "../types-XqGLsmOD.mjs";
1
+ import { v as DocsAnalyticsConfig } from "../types-CdKu8KmO.mjs";
2
2
  import { ReactNode } from "react";
3
3
 
4
4
  //#region src/docs-cloud-client.d.ts
@@ -1,4 +1,4 @@
1
- import { M as DocsCloudConfig, t as AIConfig, v as DocsAnalyticsConfig } from "./types-XqGLsmOD.mjs";
1
+ import { M as DocsCloudConfig, t as AIConfig, v as DocsAnalyticsConfig } from "./types-CdKu8KmO.mjs";
2
2
 
3
3
  //#region src/cloud-ask-ai.d.ts
4
4
  interface DocsCloudAskAIConfig {
@@ -1,6 +1,6 @@
1
- import { n as markCliErrorReported } from "./errors-CW1LnxaQ.mjs";
2
- import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelBooleanProperty, f as readTopLevelStringProperty, i as loadDocsConfigModule, m as resolveDocsContentDir, p as resolveDocsConfigPath, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-tiQCZ46q.mjs";
3
- import { i as detectPackageManagerFromProject, t as detectFramework } from "./utils-D-xTRNuh.mjs";
1
+ import { n as markCliErrorReported } from "./errors-BxfYhp1L.mjs";
2
+ import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelBooleanProperty, f as readTopLevelStringProperty, i as loadDocsConfigModule, m as resolveDocsContentDir, p as resolveDocsConfigPath, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-DhIyFsy9.mjs";
3
+ import { i as detectPackageManagerFromProject, t as detectFramework } from "./utils-CMZTjRQT.mjs";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
6
  import pc from "picocolors";
@@ -1,9 +1,10 @@
1
- import { I as findDocsMarkdownPage, tt as renderDocsMarkdownDocument } from "./agent-CaOBIVFy.mjs";
2
- import { _ as parseGeneratedAgentDocument, h as hashGeneratedAgentContent, m as GENERATED_AGENT_PROVENANCE_VERSION, v as serializeGeneratedAgentDocument } from "./search-BWuU70B0.mjs";
1
+ import { a as normalizePageAgentFrontmatter, c as stripGeneratedPageAgentContractMarkdown } from "./agent-contract-b0akaPcg.mjs";
2
+ import { R as findDocsMarkdownPage, rt as renderDocsMarkdownDocument } from "./agent-BMxMpEa0.mjs";
3
+ import { _ as hashGeneratedAgentContent, b as serializeGeneratedAgentDocument, g as GENERATED_AGENT_PROVENANCE_VERSION, y as parseGeneratedAgentDocument } from "./search-CJNLkdjX.mjs";
3
4
  import "./index.mjs";
4
5
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
5
6
  import "./server.mjs";
6
- import { a as loadProjectEnv, c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, l as readNumberProperty, m as resolveDocsContentDir, o as readBooleanProperty, p as resolveDocsConfigPath, s as readEnvReferenceProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-tiQCZ46q.mjs";
7
+ import { a as loadProjectEnv, c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, l as readNumberProperty, m as resolveDocsContentDir, o as readBooleanProperty, p as resolveDocsConfigPath, s as readEnvReferenceProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-DhIyFsy9.mjs";
7
8
  import matter from "gray-matter";
8
9
  import { existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
9
10
  import path from "node:path";
@@ -290,13 +291,9 @@ function mergeAgentCompactOptions(defaults, overrides) {
290
291
  ...Object.fromEntries(Object.entries(overrides).filter(([, value]) => value !== void 0))
291
292
  };
292
293
  }
293
- function normalizeTokenBudget(value) {
294
- if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
295
- return Math.max(1, Math.ceil(value));
296
- }
297
294
  function readPageTokenBudget(pagePath) {
298
295
  const { data } = matter(readFileSync(pagePath, "utf-8"));
299
- return normalizeTokenBudget(data.agent?.tokenBudget);
296
+ return normalizePageAgentFrontmatter(data.agent)?.tokenBudget;
300
297
  }
301
298
  function buildCompactionSettingsHash(options) {
302
299
  return hashGeneratedAgentContent(JSON.stringify({
@@ -317,14 +314,14 @@ function buildPageOptions(defaults, pagePath) {
317
314
  };
318
315
  }
319
316
  function buildResolvedPageSourceDocument(page) {
320
- return renderDocsMarkdownDocument({
317
+ return stripGeneratedPageAgentContractMarkdown(renderDocsMarkdownDocument({
321
318
  ...page,
322
319
  agentRawContent: void 0
323
- });
320
+ }));
324
321
  }
325
322
  function buildAgentSourceDocument(page) {
326
- if (typeof page.agentRawContent === "string") return page.agentRawContent;
327
- return renderDocsMarkdownDocument(page);
323
+ if (typeof page.agentRawContent === "string") return stripGeneratedPageAgentContractMarkdown(page.agentRawContent);
324
+ return stripGeneratedPageAgentContractMarkdown(renderDocsMarkdownDocument(page));
328
325
  }
329
326
  function readCurrentAgentDocument(target) {
330
327
  if (!target.hasAgentFile || !existsSync(target.agentPath)) return void 0;
@@ -1,5 +1,5 @@
1
- import { i as detectPackageManagerFromProject } from "./utils-D-xTRNuh.mjs";
2
- import { K as rootLayoutTemplate, W as postcssConfigTemplate, g as docsLayoutTemplate, v as globalCssTemplate, yt as tsconfigTemplate } from "./templates-uaauJcTO.mjs";
1
+ import { i as detectPackageManagerFromProject } from "./utils-CMZTjRQT.mjs";
2
+ import { K as rootLayoutTemplate, W as postcssConfigTemplate, g as docsLayoutTemplate, v as globalCssTemplate, yt as tsconfigTemplate } from "./templates-Bty9M6lA.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import pc from "picocolors";
@@ -1,5 +1,5 @@
1
- import { b as DocsAnalyticsEventInput, v as DocsAnalyticsConfig, y as DocsAnalyticsEvent } from "./types-XqGLsmOD.mjs";
2
- import { n as DocsCloudAskAIResponseOptions, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-DcMe6xOf.mjs";
1
+ import { b as DocsAnalyticsEventInput, v as DocsAnalyticsConfig, y as DocsAnalyticsEvent } from "./types-CdKu8KmO.mjs";
2
+ import { n as DocsCloudAskAIResponseOptions, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-CMzYVzVX.mjs";
3
3
 
4
4
  //#region src/docs-cloud-server.d.ts
5
5
  type DocsCloudRuntimeValue<T = string> = T | undefined | null | (() => T | undefined | null);
@@ -1,5 +1,5 @@
1
1
  import { n as sendDocsCloudAnalyticsEvent } from "./cloud-analytics-Dlk_byos.mjs";
2
- import { t as createDocsCloudAskAIResponse } from "./cloud-ask-ai-Cl-xaV8j.mjs";
2
+ import { t as createDocsCloudAskAIResponse } from "./cloud-ask-ai-BFlx8VMO.mjs";
3
3
 
4
4
  //#region src/docs-cloud-server.ts
5
5
  const DEFAULT_DOCS_CLOUD_API_BASE_URL = "https://api.farming-labs.dev";
@@ -1,13 +1,14 @@
1
- import "./reading-time-CPAy1SWO.mjs";
2
- import { Ct as DEFAULT_SITEMAP_XML_ROUTE, P as buildDocsMcpEndpointCandidates, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, St as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, T as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, b as DEFAULT_MCP_PUBLIC_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, kt as resolveDocsSitemapConfig, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_ROUTE, xt as DEFAULT_SITEMAP_MD_ROUTE } from "./agent-CaOBIVFy.mjs";
3
- import "./search-BWuU70B0.mjs";
4
- import { a as analyzeDocsRobotsTxt, n as DEFAULT_ROBOTS_TXT_ROUTE, u as resolveDocsRobotsConfig } from "./robots-XVPs9lVz.mjs";
5
- import "./sitemap-server-xEHtDUDB.mjs";
1
+ import "./reading-time-BuK2YL23.mjs";
2
+ import "./agent-contract-b0akaPcg.mjs";
3
+ import { Et as DEFAULT_SITEMAP_XML_ROUTE, F as buildDocsMcpEndpointCandidates, Mt as resolveDocsSitemapConfig, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, T as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, Tt as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, b as DEFAULT_MCP_PUBLIC_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_ROUTE, wt as DEFAULT_SITEMAP_MD_ROUTE } from "./agent-BMxMpEa0.mjs";
4
+ import "./search-CJNLkdjX.mjs";
5
+ import { a as analyzeDocsRobotsTxt, n as DEFAULT_ROBOTS_TXT_ROUTE, u as resolveDocsRobotsConfig } from "./robots-C6uQG-fS.mjs";
6
+ import "./sitemap-server-DnilMEiZ.mjs";
6
7
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig } from "./mcp.mjs";
7
8
  import "./server.mjs";
8
- import { a as loadProjectEnv, c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, m as resolveDocsContentDir, o as readBooleanProperty, p as resolveDocsConfigPath, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-tiQCZ46q.mjs";
9
- import { t as detectFramework } from "./utils-D-xTRNuh.mjs";
10
- import { n as inspectAgentCompactionState, o as scanDocsPageTargets, t as compactAgentDocs } from "./codeblocks-z9iT794h.mjs";
9
+ import { a as loadProjectEnv, c as readNavTitle, f as readTopLevelStringProperty, i as loadDocsConfigModule, m as resolveDocsContentDir, o as readBooleanProperty, p as resolveDocsConfigPath, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-DhIyFsy9.mjs";
10
+ import { t as detectFramework } from "./utils-CMZTjRQT.mjs";
11
+ import { n as inspectAgentCompactionState, o as scanDocsPageTargets, t as compactAgentDocs } from "./codeblocks-DWM4IJPL.mjs";
11
12
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
12
13
  import path from "node:path";
13
14
  import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js";
@@ -962,7 +963,7 @@ async function postMcpJson(baseUrl, route, body, sessionId) {
962
963
  body: JSON.stringify(body)
963
964
  });
964
965
  }
965
- async function probeMcpRoute(baseUrl, route) {
966
+ async function probeMcpRoute(baseUrl, route, expectedTools) {
966
967
  try {
967
968
  const initializeResponse = await postMcpJson(baseUrl, route, {
968
969
  jsonrpc: "2.0",
@@ -1008,15 +1009,7 @@ async function probeMcpRoute(baseUrl, route) {
1008
1009
  };
1009
1010
  const tools = toolsPayload.result?.tools;
1010
1011
  const toolNames = Array.isArray(tools) ? tools.map((tool) => tool.name).filter((name) => typeof name === "string") : [];
1011
- const missingTools = [
1012
- "list_docs",
1013
- "list_pages",
1014
- "get_navigation",
1015
- "search_docs",
1016
- "read_page",
1017
- "get_code_examples",
1018
- "get_config_schema"
1019
- ].filter((tool) => !toolNames.includes(tool));
1012
+ const missingTools = expectedTools.filter((tool) => !toolNames.includes(tool));
1020
1013
  if (missingTools.length > 0) return {
1021
1014
  ok: false,
1022
1015
  detail: `${route} connected but is missing tools: ${missingTools.join(", ")}.`
@@ -1032,10 +1025,10 @@ async function probeMcpRoute(baseUrl, route) {
1032
1025
  };
1033
1026
  }
1034
1027
  }
1035
- async function probeMcpRouteCandidates(baseUrl, routes) {
1028
+ async function probeMcpRouteCandidates(baseUrl, routes, expectedTools) {
1036
1029
  const candidates = buildDocsMcpEndpointCandidates(baseUrl, routes);
1037
1030
  const probes = await Promise.all(candidates.map(async (candidate) => {
1038
- const probe = await probeMcpRoute(candidate.baseUrl, candidate.route);
1031
+ const probe = await probeMcpRoute(candidate.baseUrl, candidate.route, expectedTools);
1039
1032
  return {
1040
1033
  ...probe,
1041
1034
  detail: `${candidate.label}: ${probe.detail}`
@@ -1085,6 +1078,22 @@ function hostedMcpRoutes(discoveryBody) {
1085
1078
  if (declaredRoutes.length > 0) return Array.from(new Set(declaredRoutes));
1086
1079
  return Array.from(new Set([readDiscoveryRoute(mcp?.publicEndpoint) ?? DEFAULT_MCP_PUBLIC_ROUTE, readDiscoveryRoute(mcp?.wellKnownEndpoint) ?? DEFAULT_MCP_WELL_KNOWN_ROUTE]));
1087
1080
  }
1081
+ const MCP_DISCOVERY_TOOL_NAMES = [
1082
+ ["listDocs", "list_docs"],
1083
+ ["listPages", "list_pages"],
1084
+ ["listTasks", "list_tasks"],
1085
+ ["readTask", "read_task"],
1086
+ ["getNavigation", "get_navigation"],
1087
+ ["searchDocs", "search_docs"],
1088
+ ["readPage", "read_page"],
1089
+ ["getCodeExamples", "get_code_examples"],
1090
+ ["getConfigSchema", "get_config_schema"],
1091
+ ["getContext", "get_context"]
1092
+ ];
1093
+ function hostedMcpExpectedTools(discoveryBody) {
1094
+ const tools = asRecord(asRecord(asRecord(discoveryBody)?.mcp)?.tools);
1095
+ return MCP_DISCOVERY_TOOL_NAMES.filter(([flag]) => tools?.[flag] !== false).map(([, name]) => name);
1096
+ }
1088
1097
  function hostedCapability(discoveryBody, key) {
1089
1098
  const root = asRecord(discoveryBody);
1090
1099
  const capability = asRecord(root?.capabilities)?.[key];
@@ -1226,10 +1235,13 @@ async function buildHostedAgentChecks(url, pages) {
1226
1235
  const markdownAlternateScore = hostedSurfaceScore(htmlPageProbes, (probe) => probe.hasMarkdownAlternate);
1227
1236
  const markdownRoutesEnabled = hostedCapability(discovery.body, "markdownRoutes");
1228
1237
  checks.push(makeCheck("hosted-markdown-alternate", "Hosted markdown alternate links", markdownRoutesEnabled === false ? "warn" : markdownAlternateScore.status, markdownRoutesEnabled === false ? 0 : markdownAlternateScore.score, 5, markdownRoutesEnabled === false ? "The hosted discovery spec reports markdown routes as disabled." : markdownAlternateScore.total > 0 ? `${markdownAlternateScore.passed}/${markdownAlternateScore.total} sampled hosted docs pages include <link rel="alternate" type="text/markdown"> pointing to .md routes.` : "No hosted docs pages were available to verify markdown alternate links.", markdownRoutesEnabled === false || markdownAlternateScore.status === "pass" ? void 0 : "Add a text/markdown alternate link in each docs page head, usually through `alternates.types['text/markdown']`, so agents can discover the page markdown URL from HTML."));
1229
- const mcp = await probeMcpRouteCandidates(baseUrl, hostedMcpRoutes(discovery.body));
1230
- const mcpPassed = mcp.probes.filter((result) => result.ok).length;
1231
- const mcpDetailProbes = mcpPassed > 0 ? mcp.probes.filter((result) => result.ok) : mcp.probes;
1232
- checks.push(makeCheck("hosted-mcp", "Hosted MCP handshake", mcpPassed > 0 ? "pass" : "fail", mcpPassed > 0 ? 10 : 0, 10, mcpDetailProbes.map((result) => result.detail).join(" "), mcpPassed > 0 ? void 0 : `Verify one of ${mcp.labels.join(" or ")} supports Streamable HTTP initialize and tools/list.`));
1238
+ if (hostedCapability(discovery.body, "mcp") === false) checks.push(makeCheck("hosted-mcp", "Hosted MCP handshake", "warn", 0, 10, "The hosted discovery spec reports MCP as disabled.", "Enable MCP when agents should use structured list/search/read tools."));
1239
+ else {
1240
+ const mcp = await probeMcpRouteCandidates(baseUrl, hostedMcpRoutes(discovery.body), hostedMcpExpectedTools(discovery.body));
1241
+ const mcpPassed = mcp.probes.filter((result) => result.ok).length;
1242
+ const mcpDetailProbes = mcpPassed > 0 ? mcp.probes.filter((result) => result.ok) : mcp.probes;
1243
+ checks.push(makeCheck("hosted-mcp", "Hosted MCP handshake", mcpPassed > 0 ? "pass" : "fail", mcpPassed > 0 ? 10 : 0, 10, mcpDetailProbes.map((result) => result.detail).join(" "), mcpPassed > 0 ? void 0 : `Verify one of ${mcp.labels.join(" or ")} supports Streamable HTTP initialize and tools/list.`));
1244
+ }
1233
1245
  return {
1234
1246
  baseUrl,
1235
1247
  checks
@@ -1,5 +1,5 @@
1
- import { c as fileExists, o as exec, s as execOutput } from "./utils-D-xTRNuh.mjs";
2
- import { a as getPackagesForFramework, c as resolveDocsPackageManager, l as validateUpgradeVersion, r as buildDocsPackageInstallCommand, s as resolveDocsPackageFramework } from "./package-version-C8PigBZk.mjs";
1
+ import { c as fileExists, o as exec, s as execOutput } from "./utils-CMZTjRQT.mjs";
2
+ import { a as getPackagesForFramework, c as resolveDocsPackageManager, l as validateUpgradeVersion, r as buildDocsPackageInstallCommand, s as resolveDocsPackageFramework } from "./package-version-DxnTZH4m.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import pc from "picocolors";
@@ -0,0 +1,40 @@
1
+ //#region src/i18n.ts
2
+ function normalizeSegment(value) {
3
+ return value.replace(/^\/+|\/+$/g, "");
4
+ }
5
+ function splitSegments(value) {
6
+ const cleaned = normalizeSegment(value);
7
+ return cleaned ? cleaned.split("/").filter(Boolean) : [];
8
+ }
9
+ function resolveDocsI18n(config) {
10
+ if (!config || !Array.isArray(config.locales)) return null;
11
+ const locales = Array.from(new Set(config.locales.map((l) => l.trim()).filter(Boolean)));
12
+ if (locales.length === 0) return null;
13
+ return {
14
+ locales,
15
+ defaultLocale: config.defaultLocale && locales.includes(config.defaultLocale) ? config.defaultLocale : locales[0]
16
+ };
17
+ }
18
+ function resolveDocsLocale(searchParams, i18n) {
19
+ if (!i18n) return void 0;
20
+ const raw = searchParams.get("lang") ?? searchParams.get("locale");
21
+ if (!raw) return void 0;
22
+ if (i18n.locales.includes(raw)) return raw;
23
+ return i18n.defaultLocale;
24
+ }
25
+ function resolveDocsPath(pathname, entry) {
26
+ const entryBase = normalizeSegment(entry || "docs") || "docs";
27
+ const entryParts = splitSegments(entryBase);
28
+ const pathParts = splitSegments(pathname);
29
+ let rest = pathParts;
30
+ if (entryParts.length > 0) {
31
+ if (pathParts.slice(0, entryParts.length).join("/") === entryParts.join("/")) rest = pathParts.slice(entryParts.length);
32
+ }
33
+ return {
34
+ slug: rest.join("/"),
35
+ entryPath: entryBase
36
+ };
37
+ }
38
+
39
+ //#endregion
40
+ export { resolveDocsLocale as n, resolveDocsPath as r, resolveDocsI18n as t };