@farming-labs/docs 0.1.83 → 0.1.84

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.
@@ -1,6 +1,6 @@
1
1
  import "./reading-time-pKUeloSI.mjs";
2
2
  import { _ as parseGeneratedAgentDocument, h as hashGeneratedAgentContent, m as GENERATED_AGENT_PROVENANCE_VERSION, v as serializeGeneratedAgentDocument } from "./search-B5ze-heM.mjs";
3
- import { D as findDocsMarkdownPage, I as renderDocsMarkdownDocument } from "./robots-DCR-ZFLO.mjs";
3
+ import { D as findDocsMarkdownPage, I as renderDocsMarkdownDocument } from "./robots-WLElbTr1.mjs";
4
4
  import "./index.mjs";
5
5
  import "./sitemap-server-C8Ppk29g.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
@@ -86,7 +86,7 @@ async function main() {
86
86
  const { runMcp } = await import("../mcp-OVgCyHrR.mjs");
87
87
  await runMcp(mcpOptions);
88
88
  } else if (parsedCommand.command === "agent" && subcommand === "compact") {
89
- const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-D97eZuWH.mjs");
89
+ const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-BqsweF-z.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-D97eZuWH.mjs");
99
+ const { printAgentCompactHelp } = await import("../agent-BqsweF-z.mjs");
100
100
  printAgentCompactHelp();
101
101
  process.exit(1);
102
102
  } else if (parsedCommand.command === "doctor") {
103
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-DHUZK-iX.mjs");
103
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-DG6MQTbq.mjs");
104
104
  const doctorOptions = parseDoctorArgs(args.slice(1));
105
105
  if (doctorOptions.help) {
106
106
  printDoctorHelp();
@@ -130,7 +130,7 @@ async function main() {
130
130
  printSitemapGenerateHelp();
131
131
  process.exit(1);
132
132
  } else if (parsedCommand.command === "robots" && subcommand === "generate") {
133
- const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-Div3kkxI.mjs");
133
+ const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-8FR5Gbm_.mjs");
134
134
  const robotsOptions = parseRobotsGenerateArgs(args.slice(2));
135
135
  if (robotsOptions.help) {
136
136
  printRobotsGenerateHelp();
@@ -140,7 +140,7 @@ async function main() {
140
140
  } else if (parsedCommand.command === "robots") {
141
141
  console.error(pc.red(`Unknown robots subcommand: ${subcommand ?? "(missing)"}`));
142
142
  console.error();
143
- const { printRobotsGenerateHelp } = await import("../robots-Div3kkxI.mjs");
143
+ const { printRobotsGenerateHelp } = await import("../robots-8FR5Gbm_.mjs");
144
144
  printRobotsGenerateHelp();
145
145
  process.exit(1);
146
146
  } else if (parsedCommand.command === "upgrade") {
@@ -1,12 +1,12 @@
1
1
  import "./reading-time-pKUeloSI.mjs";
2
2
  import "./search-B5ze-heM.mjs";
3
3
  import { 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-Ccfh6GXO.mjs";
4
- import { C as DEFAULT_SKILL_MD_ROUTE, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, a as analyzeDocsRobotsTxt, b as DEFAULT_MCP_PUBLIC_ROUTE, d as DEFAULT_AGENT_FEEDBACK_ROUTE, g as DEFAULT_LLMS_FULL_TXT_ROUTE, l as resolveDocsRobotsConfig, m as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_ROBOTS_TXT_ROUTE, p as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE } from "./robots-DCR-ZFLO.mjs";
4
+ import { C as DEFAULT_SKILL_MD_ROUTE, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, a as analyzeDocsRobotsTxt, b as DEFAULT_MCP_PUBLIC_ROUTE, d as DEFAULT_AGENT_FEEDBACK_ROUTE, g as DEFAULT_LLMS_FULL_TXT_ROUTE, l as resolveDocsRobotsConfig, m as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_ROBOTS_TXT_ROUTE, p as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE } from "./robots-WLElbTr1.mjs";
5
5
  import "./sitemap-server-C8Ppk29g.mjs";
6
6
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig } from "./mcp.mjs";
7
7
  import "./server.mjs";
8
8
  import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsContentDir, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-BR6CcCfr.mjs";
9
- import { inspectAgentCompactionState, scanDocsPageTargets } from "./agent-D97eZuWH.mjs";
9
+ import { inspectAgentCompactionState, scanDocsPageTargets } from "./agent-BqsweF-z.mjs";
10
10
  import { t as detectFramework } from "./utils-AmYxHDoz.mjs";
11
11
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
12
12
  import path from "node:path";
@@ -739,8 +739,7 @@ async function probeTextRoute(baseUrl, route) {
739
739
  };
740
740
  }
741
741
  }
742
- async function probeRobotsRoute(baseUrl) {
743
- const route = DEFAULT_ROBOTS_TXT_ROUTE;
742
+ async function probeRobotsRoute(baseUrl, route = DEFAULT_ROBOTS_TXT_ROUTE) {
744
743
  const url = joinDoctorUrl(baseUrl, route);
745
744
  try {
746
745
  const response = await fetchWithTimeout(url, { headers: { Accept: "text/plain, */*" } });
@@ -915,6 +914,13 @@ function hostedSitemapRoutes(discoveryBody) {
915
914
  routes: Array.from(new Set(routes))
916
915
  };
917
916
  }
917
+ function hostedRobotsRoute(discoveryBody) {
918
+ const robots = asRecord(asRecord(discoveryBody)?.robots);
919
+ return {
920
+ enabled: robots?.enabled === false ? false : true,
921
+ route: readDiscoveryRoute(robots?.route) ?? DEFAULT_ROBOTS_TXT_ROUTE
922
+ };
923
+ }
918
924
  async function buildHostedAgentChecks(url, pages) {
919
925
  let baseUrl;
920
926
  try {
@@ -935,11 +941,14 @@ async function buildHostedAgentChecks(url, pages) {
935
941
  checks.push(makeCheck("hosted-sitemap", "Hosted sitemap", sitemapPassed === sitemap.length ? "pass" : sitemapPassed > 0 ? "warn" : "fail", sitemapPassed === sitemap.length ? 5 : sitemapPassed > 0 ? 3 : 0, 5, sitemap.map((result) => result.detail).join(" "), sitemapPassed === sitemap.length ? void 0 : `Verify deployed sitemap routes return non-empty text: ${sitemapRoutes.routes.join(", ")}.`));
936
942
  } else if (sitemapRoutes.enabled) checks.push(makeCheck("hosted-sitemap", "Hosted sitemap", "warn", 0, 5, "The hosted discovery spec reports sitemap support but did not expose sitemap routes.", "Check sitemap.xml and sitemap.markdown config so at least one sitemap route is enabled."));
937
943
  else checks.push(makeCheck("hosted-sitemap", "Hosted sitemap", "warn", 0, 5, "The hosted discovery spec reports sitemap routes as disabled.", "Enable sitemap in docs.config when agents and crawlers should discover canonical URLs and freshness metadata."));
938
- const robots = await probeRobotsRoute(baseUrl);
939
- const robotsAnalysis = robots.body ? analyzeDocsRobotsTxt(robots.body) : void 0;
940
- const robotsBlocked = robotsAnalysis?.blocksAgentRoutes || robotsAnalysis?.blocksAiAgents;
941
- const robotsComplete = robotsAnalysis?.hasAgentRoutes && robotsAnalysis?.hasAiPolicy;
942
- checks.push(makeCheck("hosted-robots", "Hosted robots.txt", robots.ok && !robotsBlocked && robotsComplete ? "pass" : robots.ok && !robotsBlocked ? "warn" : "fail", robots.ok && !robotsBlocked && robotsComplete ? 5 : robots.ok && !robotsBlocked ? 3 : 0, 5, robots.ok ? robotsBlocked ? `${DEFAULT_ROBOTS_TXT_ROUTE} is reachable but blocks ${robotsAnalysis?.blocksAiAgents ? "common AI crawlers" : "agent-readable docs routes"}.` : robotsComplete ? `${robots.detail} It advertises agent-readable routes and common AI crawler policy.` : `${robots.detail} It is missing ${robotsAnalysis?.missingRoutes.length ? `agent routes (${robotsAnalysis.missingRoutes.join(", ")})` : "common AI crawler policy"}.` : robots.detail, robots.ok && !robotsBlocked && robotsComplete ? void 0 : "Publish an agent-friendly robots.txt with `docs robots generate`, or append the generated block to the existing file."));
944
+ const robotsRoute = hostedRobotsRoute(discovery.body);
945
+ if (robotsRoute.enabled) {
946
+ const robots = await probeRobotsRoute(baseUrl, robotsRoute.route);
947
+ const robotsAnalysis = robots.body ? analyzeDocsRobotsTxt(robots.body) : void 0;
948
+ const robotsBlocked = robotsAnalysis?.blocksAgentRoutes || robotsAnalysis?.blocksAiAgents;
949
+ const robotsComplete = robotsAnalysis?.hasAgentRoutes && robotsAnalysis?.hasAiPolicy;
950
+ checks.push(makeCheck("hosted-robots", "Hosted robots.txt", robots.ok && !robotsBlocked && robotsComplete ? "pass" : robots.ok && !robotsBlocked ? "warn" : "fail", robots.ok && !robotsBlocked && robotsComplete ? 5 : robots.ok && !robotsBlocked ? 3 : 0, 5, robots.ok ? robotsBlocked ? `${robotsRoute.route} is reachable but blocks ${robotsAnalysis?.blocksAiAgents ? "common AI crawlers" : "agent-readable docs routes"}.` : robotsComplete ? `${robots.detail} It advertises agent-readable routes and common AI crawler policy.` : `${robots.detail} It is missing ${robotsAnalysis?.missingRoutes.length ? `agent routes (${robotsAnalysis.missingRoutes.join(", ")})` : "common AI crawler policy"}.` : robots.detail, robots.ok && !robotsBlocked && robotsComplete ? void 0 : "Publish an agent-friendly robots.txt with `docs robots generate`, or append the generated block to the existing file."));
951
+ } else checks.push(makeCheck("hosted-robots", "Hosted robots.txt", "warn", 0, 5, "The hosted discovery spec reports robots.txt as disabled.", "Enable robots and publish an agent-friendly robots.txt with `docs robots generate`."));
943
952
  const skill = await Promise.all([probeTextRoute(baseUrl, DEFAULT_SKILL_MD_ROUTE), probeTextRoute(baseUrl, DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE)]);
944
953
  const skillPassed = skill.filter((result) => result.ok).length;
945
954
  checks.push(makeCheck("hosted-skill", "Hosted skill.md", skillPassed === skill.length ? "pass" : skillPassed > 0 ? "warn" : "fail", skillPassed === skill.length ? 5 : skillPassed > 0 ? 3 : 0, 5, skill.map((result) => result.detail).join(" "), skillPassed === skill.length ? void 0 : "Verify deployed /skill.md and /.well-known/skill.md routes return non-empty markdown."));
package/dist/index.d.mts CHANGED
@@ -204,6 +204,7 @@ interface DocsAgentDiscoverySpecOptions {
204
204
  feedback?: DocsAgentFeedbackDiscoveryConfig;
205
205
  llms?: DocsLlmsDiscoveryConfig;
206
206
  sitemap?: boolean | DocsSitemapConfig;
207
+ robots?: boolean | DocsRobotsConfig;
207
208
  markdown?: {
208
209
  acceptHeader?: boolean;
209
210
  signatureAgentHeader?: boolean;
@@ -217,6 +218,7 @@ interface DocsSkillDocumentOptions {
217
218
  feedback?: DocsAgentFeedbackDiscoveryConfig;
218
219
  llms?: DocsLlmsDiscoveryConfig;
219
220
  sitemap?: boolean | DocsSitemapConfig;
221
+ robots?: boolean | DocsRobotsConfig;
220
222
  markdown?: {
221
223
  acceptHeader?: boolean;
222
224
  signatureAgentHeader?: boolean;
@@ -274,6 +276,7 @@ declare function renderDocsSkillDocument({
274
276
  feedback,
275
277
  llms,
276
278
  sitemap,
279
+ robots,
277
280
  markdown
278
281
  }: DocsSkillDocumentOptions): string;
279
282
  declare function resolveDocsAgentMdxContent(content: string, audience: "human" | "agent"): string;
@@ -286,6 +289,7 @@ declare function buildDocsAgentDiscoverySpec({
286
289
  feedback,
287
290
  llms,
288
291
  sitemap,
292
+ robots,
289
293
  markdown
290
294
  }: DocsAgentDiscoverySpecOptions): {
291
295
  version: string;
@@ -313,6 +317,7 @@ declare function buildDocsAgentDiscoverySpec({
313
317
  mcp: boolean;
314
318
  search: boolean;
315
319
  sitemap: boolean;
320
+ robots: boolean;
316
321
  agentFeedback: boolean;
317
322
  locales: boolean;
318
323
  };
@@ -362,6 +367,11 @@ declare function buildDocsAgentDiscoverySpec({
362
367
  defaultWellKnownRoute: string;
363
368
  };
364
369
  };
370
+ robots: {
371
+ enabled: boolean;
372
+ route: string;
373
+ defaultRoute: string;
374
+ };
365
375
  search: {
366
376
  enabled: boolean;
367
377
  endpoint: string;
package/dist/index.mjs CHANGED
@@ -2,6 +2,6 @@ import { _ as defineDocs, a as resolveReadingTimeOptions, c as resolveOGImage, d
2
2
  import { A as resolveDocsAnalyticsConfig, C as resolveSidebarFolderIndexBehaviorForPath, D as emitDocsAgentTraceEvent, E as createDocsAgentTraceId, M as createDocsCloudAnalytics, O as emitDocsAnalyticsEvent, S as resolveSidebarFolderIndexBehavior, T as createDocsAgentTraceContext, _ as parseGeneratedAgentDocument, a as createMcpSearchAdapter, b as applySidebarFolderIndexBehavior, c as formatDocsAskAIPackageHints, d as resolveAskAISearchRequestConfig, f as resolveSearchRequestConfig, g as normalizeGeneratedAgentContent, h as hashGeneratedAgentContent, i as createCustomSearchAdapter, j as resolveDocsObservabilityConfig, k as emitDocsObservabilityEvent, l as inferDocsAskAIPackageHints, m as GENERATED_AGENT_PROVENANCE_VERSION, n as buildDocsSearchDocuments, o as createSimpleSearchAdapter, p as GENERATED_AGENT_PROVENANCE_MARKER, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter, t as buildDocsAskAIContext, u as performDocsSearch, v as serializeGeneratedAgentDocument, w as DOCS_AGENT_TRACE_EVENT_TYPES, x as resolvePageSidebarFolderIndexBehavior, y as stripGeneratedAgentProvenance } from "./search-B5ze-heM.mjs";
3
3
  import { n as renderDocsRelatedMarkdownLines, t as normalizeDocsRelated } from "./related-BNj_NdHq.mjs";
4
4
  import { a as buildDocsSitemapManifest, c as renderDocsSitemapMarkdown, d as resolveDocsSitemapRequest, f as toDocsSitemapMarkdownUrl, i as DEFAULT_SITEMAP_XML_ROUTE, l as renderDocsSitemapXml, n as DEFAULT_SITEMAP_MD_ROUTE, o as createDocsSitemapResponse, r as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, s as readDocsSitemapManifestFromContentMap, t as DEFAULT_SITEMAP_MANIFEST_PATH, u as resolveDocsSitemapConfig } from "./sitemap-Ccfh6GXO.mjs";
5
- import { A as isDocsAgentDiscoveryRequest, B as resolveDocsLlmsTxtFormat, C as DEFAULT_SKILL_MD_ROUTE, D as findDocsMarkdownPage, E as buildDocsAgentDiscoverySpec, F as normalizeDocsUrlPath, H as resolveDocsSkillFormat, I as renderDocsMarkdownDocument, L as renderDocsMarkdownNotFound, M as isDocsPublicGetRequest, N as isDocsSkillRequest, O as getDocsMarkdownVaryHeader, P as normalizeDocsPathSegment, R as renderDocsSkillDocument, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, T as DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER, U as toDocsMarkdownUrl, V as resolveDocsMarkdownRequest, _ as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, a as analyzeDocsRobotsTxt, b as DEFAULT_MCP_PUBLIC_ROUTE, c as renderDocsRobotsTxt, d as DEFAULT_AGENT_FEEDBACK_ROUTE, f as DEFAULT_AGENT_SPEC_ROUTE, g as DEFAULT_LLMS_FULL_TXT_ROUTE, h as DEFAULT_DOCS_API_ROUTE, i as DOCS_ROBOTS_GENERATED_BLOCK_START, j as isDocsMcpRequest, k as hasDocsMarkdownSignatureAgent, l as resolveDocsRobotsConfig, m as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_ROBOTS_TXT_ROUTE, o as getDocsRobotsAllowRoutes, p as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, r as DOCS_ROBOTS_GENERATED_BLOCK_END, s as renderDocsRobotsGeneratedBlock, t as DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS, u as upsertDocsRobotsGeneratedBlock, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, x as DEFAULT_MCP_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE, z as resolveDocsAgentMdxContent } from "./robots-DCR-ZFLO.mjs";
5
+ import { A as isDocsAgentDiscoveryRequest, B as resolveDocsLlmsTxtFormat, C as DEFAULT_SKILL_MD_ROUTE, D as findDocsMarkdownPage, E as buildDocsAgentDiscoverySpec, F as normalizeDocsUrlPath, H as resolveDocsSkillFormat, I as renderDocsMarkdownDocument, L as renderDocsMarkdownNotFound, M as isDocsPublicGetRequest, N as isDocsSkillRequest, O as getDocsMarkdownVaryHeader, P as normalizeDocsPathSegment, R as renderDocsSkillDocument, S as DEFAULT_MCP_WELL_KNOWN_ROUTE, T as DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER, U as toDocsMarkdownUrl, V as resolveDocsMarkdownRequest, _ as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, a as analyzeDocsRobotsTxt, b as DEFAULT_MCP_PUBLIC_ROUTE, c as renderDocsRobotsTxt, d as DEFAULT_AGENT_FEEDBACK_ROUTE, f as DEFAULT_AGENT_SPEC_ROUTE, g as DEFAULT_LLMS_FULL_TXT_ROUTE, h as DEFAULT_DOCS_API_ROUTE, i as DOCS_ROBOTS_GENERATED_BLOCK_START, j as isDocsMcpRequest, k as hasDocsMarkdownSignatureAgent, l as resolveDocsRobotsConfig, m as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_ROBOTS_TXT_ROUTE, o as getDocsRobotsAllowRoutes, p as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, r as DOCS_ROBOTS_GENERATED_BLOCK_END, s as renderDocsRobotsGeneratedBlock, t as DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS, u as upsertDocsRobotsGeneratedBlock, v as DEFAULT_LLMS_TXT_ROUTE, w as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, x as DEFAULT_MCP_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE, z as resolveDocsAgentMdxContent } from "./robots-WLElbTr1.mjs";
6
6
 
7
7
  export { DEFAULT_AGENT_FEEDBACK_ROUTE, DEFAULT_AGENT_SPEC_ROUTE, DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, DEFAULT_DOCS_AI_ROBOTS_USER_AGENTS, DEFAULT_DOCS_API_ROUTE, DEFAULT_LLMS_FULL_TXT_ROUTE, DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, DEFAULT_LLMS_TXT_ROUTE, DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE, DEFAULT_MCP_PUBLIC_ROUTE, DEFAULT_MCP_ROUTE, DEFAULT_MCP_WELL_KNOWN_ROUTE, DEFAULT_ROBOTS_TXT_ROUTE, DEFAULT_SITEMAP_MANIFEST_PATH, DEFAULT_SITEMAP_MD_ROUTE, DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, DEFAULT_SITEMAP_XML_ROUTE, DEFAULT_SKILL_MD_ROUTE, DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, DOCS_AGENT_TRACE_EVENT_TYPES, DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER, DOCS_ROBOTS_GENERATED_BLOCK_END, DOCS_ROBOTS_GENERATED_BLOCK_START, GENERATED_AGENT_PROVENANCE_MARKER, GENERATED_AGENT_PROVENANCE_VERSION, analyzeDocsRobotsTxt, applySidebarFolderIndexBehavior, buildDocsAgentDiscoverySpec, buildDocsAskAIContext, buildDocsSearchDocuments, buildDocsSitemapManifest, buildPageOpenGraph, buildPageTwitter, createAlgoliaSearchAdapter, createCustomSearchAdapter, createDocsAgentTraceContext, createDocsAgentTraceId, createDocsCloudAnalytics, createDocsSitemapResponse, createMcpSearchAdapter, createSimpleSearchAdapter, createTheme, createTypesenseSearchAdapter, deepMerge, defineDocs, emitDocsAgentTraceEvent, emitDocsAnalyticsEvent, emitDocsObservabilityEvent, estimateReadingTimeMinutes, extendTheme, findDocsMarkdownPage, formatDocsAskAIPackageHints, getDocsMarkdownVaryHeader, getDocsRobotsAllowRoutes, hasDocsMarkdownSignatureAgent, hashGeneratedAgentContent, inferDocsAskAIPackageHints, isDocsAgentDiscoveryRequest, isDocsMcpRequest, isDocsPublicGetRequest, isDocsSkillRequest, normalizeDocsPathSegment, normalizeDocsRelated, normalizeDocsUrlPath, normalizeGeneratedAgentContent, parseGeneratedAgentDocument, performDocsSearch, readDocsSitemapManifestFromContentMap, renderDocsMarkdownDocument, renderDocsMarkdownNotFound, renderDocsRelatedMarkdownLines, renderDocsRobotsGeneratedBlock, renderDocsRobotsTxt, renderDocsSitemapMarkdown, renderDocsSitemapXml, renderDocsSkillDocument, resolveAskAISearchRequestConfig, resolveChangelogConfig, resolveDocsAgentMdxContent, resolveDocsAnalyticsConfig, resolveDocsI18n, resolveDocsLlmsTxtFormat, resolveDocsLocale, resolveDocsMarkdownRequest, resolveDocsObservabilityConfig, resolveDocsPath, resolveDocsRobotsConfig, resolveDocsSitemapConfig, resolveDocsSitemapRequest, resolveDocsSkillFormat, resolveOGImage, resolvePageReadingTime, resolvePageSidebarFolderIndexBehavior, resolveReadingTimeFromContent, resolveReadingTimeFromSource, resolveReadingTimeOptions, resolveSearchRequestConfig, resolveSidebarFolderIndexBehavior, resolveSidebarFolderIndexBehaviorForPath, resolveTitle, serializeGeneratedAgentDocument, stripGeneratedAgentProvenance, toDocsMarkdownUrl, toDocsSitemapMarkdownUrl, upsertDocsRobotsGeneratedBlock };
@@ -1,4 +1,4 @@
1
- import { i as DOCS_ROBOTS_GENERATED_BLOCK_START, l as resolveDocsRobotsConfig, r as DOCS_ROBOTS_GENERATED_BLOCK_END, s as renderDocsRobotsGeneratedBlock, u as upsertDocsRobotsGeneratedBlock } from "./robots-DCR-ZFLO.mjs";
1
+ import { i as DOCS_ROBOTS_GENERATED_BLOCK_START, l as resolveDocsRobotsConfig, r as DOCS_ROBOTS_GENERATED_BLOCK_END, s as renderDocsRobotsGeneratedBlock, u as upsertDocsRobotsGeneratedBlock } from "./robots-WLElbTr1.mjs";
2
2
  import { d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-BR6CcCfr.mjs";
3
3
  import { t as detectFramework } from "./utils-AmYxHDoz.mjs";
4
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -15,6 +15,7 @@ const DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE = "/.well-known/llms.txt";
15
15
  const DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE = "/.well-known/llms-full.txt";
16
16
  const DEFAULT_SKILL_MD_ROUTE = "/skill.md";
17
17
  const DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE = "/.well-known/skill.md";
18
+ const DEFAULT_AGENT_DISCOVERY_ROBOTS_TXT_ROUTE = "/robots.txt";
18
19
  const DEFAULT_AGENT_FEEDBACK_ROUTE = "/api/docs/agent/feedback";
19
20
  const DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER = "Signature-Agent";
20
21
  function normalizeDocsPathSegment(value) {
@@ -115,7 +116,7 @@ function renderDocsMarkdownNotFound({ entry = "docs", requestedPath, sitemap })
115
116
  }
116
117
  if (sitemapConfig.xml.enabled) lines.push(`- XML sitemap: \`${sitemapConfig.xml.route}\``);
117
118
  } else lines.push(`- Sitemap discovery, if enabled: \`${DEFAULT_SITEMAP_MD_ROUTE}\`, \`${DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE}\`, or \`${DEFAULT_SITEMAP_XML_ROUTE}\``);
118
- lines.push("", "The agent discovery spec is the safest first step because it lists the active markdown, sitemap, search, MCP, and feedback routes for this deployment.");
119
+ 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.");
119
120
  return lines.join("\n");
120
121
  }
121
122
  function findDocsMarkdownPage(entry, pages, requestedPath) {
@@ -134,7 +135,7 @@ function renderDocsMarkdownDocument(page) {
134
135
  lines.push("", page.agentFallbackRawContent ?? page.rawContent ?? page.content);
135
136
  return lines.join("\n");
136
137
  }
137
- function renderDocsSkillDocument({ origin, entry = "docs", search, mcp, feedback, llms, sitemap, markdown }) {
138
+ function renderDocsSkillDocument({ origin, entry = "docs", search, mcp, feedback, llms, sitemap, robots, markdown }) {
138
139
  const normalizedEntry = normalizeDocsPathSegment(entry) || "docs";
139
140
  const siteTitle = compactSkillText(llms?.siteTitle ?? "Documentation");
140
141
  const siteDescription = llms?.siteDescription ? compactSkillText(llms.siteDescription) : void 0;
@@ -142,9 +143,10 @@ function renderDocsSkillDocument({ origin, entry = "docs", search, mcp, feedback
142
143
  const searchEnabled = isSearchEnabled(search);
143
144
  const feedbackEnabled = feedback?.enabled ?? false;
144
145
  const sitemapConfig = resolveDocsSitemapConfig(sitemap);
146
+ const robotsEnabled = isRobotsDiscoveryEnabled(robots);
145
147
  const feedbackRoute = feedback?.route ?? DEFAULT_AGENT_FEEDBACK_ROUTE;
146
148
  const feedbackSchemaRoute = feedback?.schemaRoute ?? `${feedbackRoute}/schema`;
147
- const description = truncateSkillDescription(`Use ${siteTitle} through markdown routes, llms.txt, agent discovery, search, and MCP when available.`);
149
+ const description = truncateSkillDescription(`Use ${siteTitle} through markdown routes, llms.txt, robots.txt, agent discovery, search, and MCP when available.`);
148
150
  const markdownAcceptHeader = markdown?.acceptHeader === false ? null : "text/markdown";
149
151
  const markdownSignatureAgentHeader = markdown?.signatureAgentHeader === false ? null : DOCS_MARKDOWN_SIGNATURE_AGENT_HEADER;
150
152
  const lines = [
@@ -167,9 +169,11 @@ function renderDocsSkillDocument({ origin, entry = "docs", search, mcp, feedback
167
169
  if (sitemapConfig.xml.enabled) lines.push(`- Use ${sitemapConfig.xml.route} to check canonical page freshness.`);
168
170
  if (sitemapConfig.markdown.enabled) lines.push(`- Use ${sitemapConfig.markdown.route} for a semantic docs map.`);
169
171
  }
172
+ if (robotsEnabled) lines.push(`- Check ${DEFAULT_AGENT_DISCOVERY_ROBOTS_TXT_ROUTE} for crawler and AI-agent access policy.`);
170
173
  if (mcp.enabled) lines.push(`- Use ${DEFAULT_MCP_WELL_KNOWN_ROUTE} or ${DEFAULT_MCP_PUBLIC_ROUTE} for MCP tools when your environment supports MCP.`);
171
174
  if (feedbackEnabled) lines.push(`- Read ${feedbackSchemaRoute} before posting agent feedback to ${feedbackRoute}.`);
172
175
  lines.push("", "## Routes", `- Skill document: ${DEFAULT_SKILL_MD_ROUTE}`, `- Skill well-known alias: ${DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE}`, `- Skill API format: ${DEFAULT_DOCS_API_ROUTE}?format=skill`, `- Agent discovery: ${DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE}`, `- Agent discovery fallback: ${DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE}`, `- Markdown root: /${normalizedEntry}.md`, `- Markdown pages: /${normalizedEntry}/{slug}.md`);
176
+ if (robotsEnabled) lines.push(`- Robots policy: ${DEFAULT_AGENT_DISCOVERY_ROBOTS_TXT_ROUTE}`);
173
177
  if (llmsEnabled) lines.push(`- llms.txt: ${DEFAULT_LLMS_TXT_ROUTE}`, `- llms-full.txt: ${DEFAULT_LLMS_FULL_TXT_ROUTE}`, `- llms well-known aliases: ${DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE}, ${DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE}`);
174
178
  if (sitemapConfig.enabled) {
175
179
  if (sitemapConfig.xml.enabled) lines.push(`- Sitemap XML: ${sitemapConfig.xml.route}`);
@@ -226,7 +230,7 @@ function resolveDocsAgentMdxContent(content, audience) {
226
230
  }
227
231
  return output.join("\n").replace(/\n{3,}/g, "\n\n").trim();
228
232
  }
229
- function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, search, mcp, feedback, llms, sitemap, markdown }) {
233
+ function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, search, mcp, feedback, llms, sitemap, robots, markdown }) {
230
234
  const normalizedEntry = normalizeDocsPathSegment(entry) || "docs";
231
235
  const localesEnabled = i18n !== null;
232
236
  const searchEnabled = isSearchEnabled(search);
@@ -234,6 +238,7 @@ function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, sear
234
238
  const feedbackSchemaRoute = feedback?.schemaRoute ?? `${feedbackRoute}/schema`;
235
239
  const llmsEnabled = llms?.enabled ?? true;
236
240
  const sitemapConfig = resolveDocsSitemapConfig(sitemap, { baseUrl: llms?.baseUrl });
241
+ const robotsEnabled = isRobotsDiscoveryEnabled(robots);
237
242
  return {
238
243
  version: "1",
239
244
  name: "@farming-labs/docs",
@@ -260,6 +265,7 @@ function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, sear
260
265
  mcp: mcp.enabled,
261
266
  search: searchEnabled,
262
267
  sitemap: sitemapConfig.enabled,
268
+ robots: robotsEnabled,
263
269
  agentFeedback: feedback?.enabled ?? false,
264
270
  locales: localesEnabled
265
271
  },
@@ -313,6 +319,11 @@ function buildDocsAgentDiscoverySpec({ origin, entry = "docs", i18n = null, sear
313
319
  defaultWellKnownRoute: DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE
314
320
  }
315
321
  },
322
+ robots: {
323
+ enabled: robotsEnabled,
324
+ route: DEFAULT_AGENT_DISCOVERY_ROBOTS_TXT_ROUTE,
325
+ defaultRoute: DEFAULT_AGENT_DISCOVERY_ROBOTS_TXT_ROUTE
326
+ },
316
327
  search: {
317
328
  enabled: searchEnabled,
318
329
  endpoint: `${DEFAULT_DOCS_API_ROUTE}?query={query}`,
@@ -388,6 +399,11 @@ function isSearchEnabled(search) {
388
399
  if (search && typeof search === "object" && search.enabled === false) return false;
389
400
  return true;
390
401
  }
402
+ function isRobotsDiscoveryEnabled(robots) {
403
+ if (robots === false) return false;
404
+ if (robots && typeof robots === "object" && robots.enabled === false) return false;
405
+ return true;
406
+ }
391
407
  function compactSkillText(value) {
392
408
  return value.replace(/\s+/g, " ").trim();
393
409
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.1.83",
3
+ "version": "0.1.84",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",