@farming-labs/docs 0.2.69 → 0.2.71

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 (37) hide show
  1. package/dist/{agent-D2SsSct2.mjs → agent-FIyl4-Oa.mjs} +510 -11
  2. package/dist/{agent-BIzynBvk.mjs → agent-bof3qzKZ.mjs} +2 -2
  3. package/dist/{agent-evals-DZR4J7Iz.mjs → agent-evals-Cr9TAkmB.mjs} +2 -1
  4. package/dist/{agent-export-C_zd18VF.mjs → agent-export-7Ws4KqDE.mjs} +11 -8
  5. package/dist/agent-skills-bundle.d.mts +1 -1
  6. package/dist/{agent-skills-server-iBfCLPOt.mjs → agent-skills-server-B4u3qy-1.mjs} +9 -5
  7. package/dist/{agent-skills-server-DJXdK_hS.d.mts → agent-skills-server-DTwblsLu.d.mts} +1 -1
  8. package/dist/agent-skills-spec.d.mts +51 -0
  9. package/dist/agent-skills-spec.mjs +284 -0
  10. package/dist/agent-skills-vite.d.mts +2 -2
  11. package/dist/agent-skills-vite.mjs +2 -2
  12. package/dist/{agents-BR5tSkbq.mjs → agents-Be2ntaFr.mjs} +6 -6
  13. package/dist/cli/index.mjs +14 -14
  14. package/dist/docs-cloud-server.d.mts +1 -1
  15. package/dist/{doctor-CVhU0YKo.mjs → doctor-DoPAofVP.mjs} +32 -15
  16. package/dist/{golden-evaluations-DK1uqjlo.mjs → golden-evaluations-CPGGnXOV.mjs} +1 -1
  17. package/dist/index.d.mts +84 -6
  18. package/dist/index.mjs +8 -7
  19. package/dist/{mcp-YWlNI2d4.mjs → mcp-BLynUzE7.mjs} +6 -6
  20. package/dist/mcp.d.mts +1 -1
  21. package/dist/mcp.mjs +3 -3
  22. package/dist/{metadata-CNjcFhQN.mjs → metadata-bw8k-9x-.mjs} +1 -1
  23. package/dist/{reading-time-O8mYgLvH.mjs → reading-time-DtNegNiq.mjs} +119 -7
  24. package/dist/{review-DdfvxMh2.mjs → review-NFnYbMRI.mjs} +6 -6
  25. package/dist/{robots-CD14j-mU.mjs → robots-B3e-aWPy.mjs} +3 -3
  26. package/dist/{robots-Dz5XeT8F.mjs → robots-DOqBwQw8.mjs} +2 -2
  27. package/dist/{search-BBVD0A7O.d.mts → search-CozHzW7v.d.mts} +1 -1
  28. package/dist/{search-DjN1Gfid.mjs → search-DOGUUZvs.mjs} +6 -6
  29. package/dist/{search-DBlw9h3P.mjs → search-x5O0-9X3.mjs} +2 -142
  30. package/dist/server.d.mts +3 -3
  31. package/dist/server.mjs +6 -6
  32. package/dist/{sitemap-B0hlAZ8o.mjs → sitemap-BpMKdDUd.mjs} +6 -6
  33. package/dist/{sitemap-server-DQp8qUKN.mjs → sitemap-server-D_hayOp6.mjs} +1 -1
  34. package/dist/{standards-discovery-DSVKdQrl.mjs → standards-discovery-CYfiQE13.mjs} +8 -31
  35. package/package.json +7 -1
  36. /package/dist/{cloud-ask-ai-BD1SeVZv.d.mts → cloud-ask-ai-BfnX18rI.d.mts} +0 -0
  37. /package/dist/{standards-discovery-CQjJ-M2y.d.mts → standards-discovery-C0CIC4QI.d.mts} +0 -0
@@ -1,6 +1,7 @@
1
- import { Dt as DEFAULT_SITEMAP_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, f as DEFAULT_DOCS_CONFIG_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, kt as DEFAULT_SITEMAP_XML_ROUTE, m as DEFAULT_DOCS_DIAGNOSTICS_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE } from "./agent-D2SsSct2.mjs";
2
- import { C as DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE, S as DOCS_AGENT_MANIFEST_FORMAT, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, n as API_CATALOG_MEDIA_TYPE, r as API_CATALOG_PROFILE_URI, t as AGENT_SKILLS_DISCOVERY_SCHEMA_URI, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, w as DOCS_AGENT_MANIFEST_SCHEMA_URI } from "./standards-discovery-DSVKdQrl.mjs";
3
- import { n as DEFAULT_ROBOTS_TXT_ROUTE } from "./robots-Dz5XeT8F.mjs";
1
+ import { Ft as DEFAULT_SITEMAP_XML_ROUTE, Nt as DEFAULT_SITEMAP_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, f as DEFAULT_DOCS_CONFIG_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, i as DEFAULT_AGENT_FEEDBACK_ROUTE, m as DEFAULT_DOCS_DIAGNOSTICS_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, un as DEFAULT_MCP_WELL_KNOWN_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE } from "./agent-FIyl4-Oa.mjs";
2
+ import { isDocsAgentSkillName, validateDocsAgentSkillFrontmatter } from "./agent-skills-spec.mjs";
3
+ import { C as DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE, S as DOCS_AGENT_MANIFEST_FORMAT, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, n as API_CATALOG_MEDIA_TYPE, r as API_CATALOG_PROFILE_URI, t as AGENT_SKILLS_DISCOVERY_SCHEMA_URI, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, w as DOCS_AGENT_MANIFEST_SCHEMA_URI } from "./standards-discovery-CYfiQE13.mjs";
4
+ import { n as DEFAULT_ROBOTS_TXT_ROUTE } from "./robots-DOqBwQw8.mjs";
4
5
  import matter from "gray-matter";
5
6
 
6
7
  //#region src/define-docs.ts
@@ -160,6 +161,91 @@ function extendTheme(baseTheme, extensions) {
160
161
  return deepMerge(baseTheme, extensions);
161
162
  }
162
163
 
164
+ //#endregion
165
+ //#region src/agent-skills-archive.ts
166
+ const TAR_BLOCK_BYTES = 512;
167
+ const TAR_NAME_BYTES = 100;
168
+ const TAR_PREFIX_OFFSET = 345;
169
+ const TAR_PREFIX_BYTES = 155;
170
+ const AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES = 10 * 1024 * 1024;
171
+ const AGENT_SKILL_DOCUMENT_MAX_BYTES = 1024 * 1024;
172
+ function isZeroBlock(block) {
173
+ return block.every((byte) => byte === 0);
174
+ }
175
+ function readTarText(header, offset, length, field) {
176
+ const bytes = header.subarray(offset, offset + length);
177
+ const terminator = bytes.indexOf(0);
178
+ const value = terminator < 0 ? bytes : bytes.subarray(0, terminator);
179
+ try {
180
+ return new TextDecoder("utf-8", { fatal: true }).decode(value);
181
+ } catch {
182
+ throw new Error(`Agent Skill archive has invalid UTF-8 in its ${field}.`);
183
+ }
184
+ }
185
+ function readTarOctal(header, offset, length, field) {
186
+ const value = readTarText(header, offset, length, field).trim();
187
+ if (!/^[0-7]+$/u.test(value)) throw new Error(`Agent Skill archive has an invalid ${field}.`);
188
+ const parsed = Number.parseInt(value, 8);
189
+ if (!Number.isSafeInteger(parsed) || parsed < 0) throw new Error(`Agent Skill archive has an unsafe ${field}.`);
190
+ return parsed;
191
+ }
192
+ function validateTarChecksum(header) {
193
+ const expected = readTarOctal(header, 148, 8, "header checksum");
194
+ if (header.reduce((sum, byte, index) => {
195
+ return sum + (index >= 148 && index < 156 ? 32 : byte);
196
+ }, 0) !== expected) throw new Error("Agent Skill archive has an invalid tar header checksum.");
197
+ }
198
+ /**
199
+ * Extract the root SKILL.md from an uncompressed Agent Skill tar archive.
200
+ *
201
+ * Only the regular-file payload is returned; duplicate, oversized, malformed,
202
+ * or non-UTF-8 documents are rejected before frontmatter validation.
203
+ */
204
+ function readAgentSkillDocumentFromTar(archive) {
205
+ if (archive.byteLength > AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES) throw new Error(`Agent Skill archive exceeds ${AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES} uncompressed bytes.`);
206
+ let skillDocument;
207
+ let offset = 0;
208
+ let foundEndOfArchive = false;
209
+ while (offset < archive.byteLength) {
210
+ if (offset + TAR_BLOCK_BYTES > archive.byteLength) throw new Error("Agent Skill archive contains a truncated tar header.");
211
+ const header = archive.subarray(offset, offset + TAR_BLOCK_BYTES);
212
+ if (isZeroBlock(header)) {
213
+ const secondZeroBlockStart = offset + TAR_BLOCK_BYTES;
214
+ const secondZeroBlockEnd = secondZeroBlockStart + TAR_BLOCK_BYTES;
215
+ if (secondZeroBlockEnd > archive.byteLength) throw new Error("Agent Skill archive contains a truncated end-of-archive marker.");
216
+ if (!isZeroBlock(archive.subarray(secondZeroBlockStart, secondZeroBlockEnd))) throw new Error("Agent Skill archive is missing the second end-of-archive block.");
217
+ if (!archive.subarray(secondZeroBlockEnd).every((byte) => byte === 0)) throw new Error("Agent Skill archive contains non-zero bytes after its end marker.");
218
+ foundEndOfArchive = true;
219
+ break;
220
+ }
221
+ validateTarChecksum(header);
222
+ const name = readTarText(header, 0, TAR_NAME_BYTES, "file name");
223
+ const prefix = readTarText(header, TAR_PREFIX_OFFSET, TAR_PREFIX_BYTES, "file prefix");
224
+ const path = prefix ? `${prefix}/${name}` : name;
225
+ const size = readTarOctal(header, 124, 12, "file size");
226
+ const contentStart = offset + TAR_BLOCK_BYTES;
227
+ const contentEnd = contentStart + size;
228
+ if (contentEnd > archive.byteLength) throw new Error(`Agent Skill archive entry ${JSON.stringify(path)} is truncated.`);
229
+ const typeFlag = header[156];
230
+ if (path === "SKILL.md") {
231
+ if (typeFlag !== 0 && typeFlag !== "0".charCodeAt(0)) throw new Error("Agent Skill archive root SKILL.md must be a regular file.");
232
+ if (skillDocument) throw new Error("Agent Skill archive contains more than one root SKILL.md.");
233
+ if (size > AGENT_SKILL_DOCUMENT_MAX_BYTES) throw new Error(`Agent Skill archive SKILL.md exceeds ${AGENT_SKILL_DOCUMENT_MAX_BYTES} bytes.`);
234
+ skillDocument = archive.subarray(contentStart, contentEnd);
235
+ }
236
+ const nextOffset = contentStart + Math.ceil(size / TAR_BLOCK_BYTES) * TAR_BLOCK_BYTES;
237
+ if (nextOffset > archive.byteLength) throw new Error(`Agent Skill archive entry ${JSON.stringify(path)} has truncated padding.`);
238
+ offset = nextOffset;
239
+ }
240
+ if (!foundEndOfArchive) throw new Error("Agent Skill archive is missing its end-of-archive marker.");
241
+ if (!skillDocument) throw new Error("Agent Skill archive does not contain a root SKILL.md.");
242
+ try {
243
+ return new TextDecoder("utf-8", { fatal: true }).decode(skillDocument);
244
+ } catch {
245
+ throw new Error("Agent Skill archive SKILL.md is not valid UTF-8.");
246
+ }
247
+ }
248
+
163
249
  //#endregion
164
250
  //#region src/http-link.ts
165
251
  /** Split an HTTP list without treating delimiters inside quotes or URI references as separators. */
@@ -242,7 +328,7 @@ function httpLinkHeaderHasTargetRelation(header, href, rel, responseUrl) {
242
328
 
243
329
  //#endregion
244
330
  //#region src/agent-conformance.ts
245
- const DOCS_AGENT_CONTRACT_VERSION = "1.2";
331
+ const DOCS_AGENT_CONTRACT_VERSION = "1.3";
246
332
  function normalizeOrigin(value) {
247
333
  return value.replace(/\/+$/, "");
248
334
  }
@@ -636,6 +722,24 @@ async function sha256Content(content) {
636
722
  const digest = await globalThis.crypto.subtle.digest("SHA-256", content);
637
723
  return [...new Uint8Array(digest)].map((value) => value.toString(16).padStart(2, "0")).join("");
638
724
  }
725
+ async function decompressAgentSkillArchive(content) {
726
+ if (typeof DecompressionStream !== "function") throw new Error("gzip decompression is unavailable in this runtime");
727
+ const stream = new Blob([content]).stream().pipeThrough(new DecompressionStream("gzip"));
728
+ const chunks = [];
729
+ let totalBytes = 0;
730
+ for await (const chunk of stream) {
731
+ totalBytes += chunk.byteLength;
732
+ if (totalBytes > AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES) throw new Error(`archive exceeds ${AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES} uncompressed bytes`);
733
+ chunks.push(chunk);
734
+ }
735
+ const archive = new Uint8Array(new ArrayBuffer(totalBytes));
736
+ let offset = 0;
737
+ for (const chunk of chunks) {
738
+ archive.set(chunk, offset);
739
+ offset += chunk.byteLength;
740
+ }
741
+ return archive;
742
+ }
639
743
  async function validateAgentSkillsIndex(content, indexUrl, handle) {
640
744
  const issues = [];
641
745
  let parsed;
@@ -658,7 +762,7 @@ async function validateAgentSkillsIndex(content, indexUrl, handle) {
658
762
  const description = skill?.description;
659
763
  const artifactRoute = skill?.url;
660
764
  const digest = skill?.digest;
661
- if (!isNonEmptyString(name) || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(name) || name.length > 64 || skill?.type !== "skill-md" && skill?.type !== "archive" || !isNonEmptyString(description) || description.length > 1024 || !isNonEmptyString(artifactRoute) || typeof digest !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(digest)) {
765
+ if (!isNonEmptyString(name) || !isDocsAgentSkillName(name) || skill?.type !== "skill-md" && skill?.type !== "archive" || !isNonEmptyString(description) || Array.from(description).length > 1024 || !isNonEmptyString(artifactRoute) || typeof digest !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(digest)) {
662
766
  issues.push("Agent Skills index contained an invalid skill entry");
663
767
  continue;
664
768
  }
@@ -674,11 +778,12 @@ async function validateAgentSkillsIndex(content, indexUrl, handle) {
674
778
  issues.push(`Agent Skills artifact URL for ${JSON.stringify(name)} was invalid`);
675
779
  continue;
676
780
  }
677
- const expectedPath = skill.type === "archive" ? `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${name}.tar.gz` : `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${name}/SKILL.md`;
781
+ const expectedPath = skill.type === "archive" ? `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${encodeURIComponent(name)}.tar.gz` : `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${encodeURIComponent(name)}/SKILL.md`;
678
782
  if (artifactUrl.origin !== origin || !artifactUrl.pathname.endsWith(expectedPath)) {
679
783
  issues.push(`Agent Skills artifact URL for ${JSON.stringify(name)} did not resolve to same-origin ${expectedPath}`);
680
784
  continue;
681
785
  }
786
+ let skillDocument = null;
682
787
  try {
683
788
  const response = await handle(new Request(artifactUrl), "agent-skill");
684
789
  const artifact = new Uint8Array(await response.arrayBuffer());
@@ -687,9 +792,16 @@ async function validateAgentSkillsIndex(content, indexUrl, handle) {
687
792
  if (!matchesContentType(contentType, [skill.type === "archive" ? "application/gzip" : "text/markdown"])) issues.push(`Agent Skills artifact ${JSON.stringify(artifactRoute)} returned content-type ${contentType || "<missing>"}`);
688
793
  const actualDigest = `sha256:${await sha256Content(artifact)}`;
689
794
  if (actualDigest !== digest) issues.push(`Agent Skills artifact ${JSON.stringify(artifactRoute)} digest ${actualDigest} did not match ${digest}`);
795
+ if (skill.type === "skill-md") skillDocument = new TextDecoder("utf-8", { fatal: true }).decode(artifact);
796
+ else skillDocument = readAgentSkillDocumentFromTar(await decompressAgentSkillArchive(artifact));
690
797
  } catch (error) {
691
798
  issues.push(`Agent Skills artifact ${JSON.stringify(artifactRoute)} failed: ${error instanceof Error ? error.message : String(error)}`);
692
799
  }
800
+ if (skillDocument !== null) {
801
+ const validation = validateDocsAgentSkillFrontmatter(skillDocument, { directoryName: name });
802
+ if (!validation.valid) issues.push(`Agent Skill ${JSON.stringify(name)} has invalid SKILL.md frontmatter: ${validation.issues.map((issue) => issue.message).join("; ")}`);
803
+ else if (validation.data.description !== description) issues.push(`Agent Skill ${JSON.stringify(name)} SKILL.md description does not match the discovery index`);
804
+ }
693
805
  }
694
806
  return issues;
695
807
  }
@@ -797,4 +909,4 @@ function resolveReadingTimeFromSource(source, wordsPerMinute, options) {
797
909
  }
798
910
 
799
911
  //#endregion
800
- export { resolveReadingTimeOptions as a, runDocsAgentConformance as c, extendTheme as d, deepMerge as f, resolveReadingTimeFromSource as i, httpLinkHeaderHasTargetRelation as l, defineDocs as m, resolvePageReadingTime as n, DOCS_AGENT_CONTRACT_VERSION as o, resolveChangelogConfig as p, resolveReadingTimeFromContent as r, createDocsAgentContractCases as s, estimateReadingTimeMinutes as t, createTheme as u };
912
+ export { resolveReadingTimeOptions as a, runDocsAgentConformance as c, readAgentSkillDocumentFromTar as d, createTheme as f, defineDocs as g, resolveChangelogConfig as h, resolveReadingTimeFromSource as i, httpLinkHeaderHasTargetRelation as l, deepMerge as m, resolvePageReadingTime as n, DOCS_AGENT_CONTRACT_VERSION as o, extendTheme as p, resolveReadingTimeFromContent as r, createDocsAgentContractCases as s, estimateReadingTimeMinutes as t, AGENT_SKILL_ARCHIVE_MAX_UNCOMPRESSED_BYTES as u };
@@ -1,13 +1,13 @@
1
- import { Ht as PAGE_AGENT_CONTRACT_FIELDS, Jt as normalizePageAgentFrontmatter, Kt as getPageAgentFrontmatterIssues, T as DOCS_CONFIG_MAP_TOP_LEVEL_KEYS, bt as findDocsAudienceMdxIssues, in as getDocsMcpProtectedResourceMetadataRoutes, j as buildDocsConfigMap, k as buildDocsAgentDiscoverySpec, qt as hasStructuredPageAgentContract } from "./agent-D2SsSct2.mjs";
2
- import { F as resolveDocsDiscoveryApiRoute, _ as DEFAULT_API_CATALOG_FORMAT, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, h as DEFAULT_AGENT_SKILL_FORMAT, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE } from "./standards-discovery-DSVKdQrl.mjs";
3
- import { d as resolveAskAISearchRequestConfig } from "./search-DBlw9h3P.mjs";
4
- import { a as resolveDocsMetadataBaseUrl } from "./metadata-CNjcFhQN.mjs";
5
- import { c as resolveDocsReviewConfig, o as ensureDocsReviewWorkflow, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-DZR4J7Iz.mjs";
1
+ import { A as buildDocsAgentDiscoverySpec, Et as findDocsAudienceMdxIssues, M as buildDocsConfigMap, T as DOCS_CONFIG_MAP_TOP_LEVEL_KEYS, Xt as PAGE_AGENT_CONTRACT_FIELDS, en as getPageAgentFrontmatterIssues, fn as getDocsMcpProtectedResourceMetadataRoutes, nn as normalizePageAgentFrontmatter, tn as hasStructuredPageAgentContract } from "./agent-FIyl4-Oa.mjs";
2
+ import { F as resolveDocsDiscoveryApiRoute, _ as DEFAULT_API_CATALOG_FORMAT, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, h as DEFAULT_AGENT_SKILL_FORMAT, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE } from "./standards-discovery-CYfiQE13.mjs";
3
+ import { d as resolveAskAISearchRequestConfig } from "./search-x5O0-9X3.mjs";
4
+ import { a as resolveDocsMetadataBaseUrl } from "./metadata-bw8k-9x-.mjs";
5
+ import { c as resolveDocsReviewConfig, o as ensureDocsReviewWorkflow, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-Cr9TAkmB.mjs";
6
6
  import { createFilesystemDocsMcpSource, getDocsConfigSchema, resolveDocsMcpConfig } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
8
  import { _ as resolveDocsContentDir, g as resolveDocsConfigPath, h as readTopLevelStringProperty, s as loadDocsConfigModuleResultWithProjectEnv } from "./config-Wcdj-D0a.mjs";
9
9
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
10
- import { a as extractAgentBlocks, i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-DK1uqjlo.mjs";
10
+ import { a as extractAgentBlocks, i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-CPGGnXOV.mjs";
11
11
  import matter from "gray-matter";
12
12
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
13
13
  import path from "node:path";
@@ -1,6 +1,6 @@
1
- import "./agent-D2SsSct2.mjs";
2
- import "./standards-discovery-DSVKdQrl.mjs";
3
- import { c as renderDocsRobotsGeneratedBlock, f as upsertDocsRobotsGeneratedBlock, i as DOCS_ROBOTS_GENERATED_BLOCK_START, r as DOCS_ROBOTS_GENERATED_BLOCK_END, u as resolveDocsRobotsConfig } from "./robots-Dz5XeT8F.mjs";
1
+ import "./agent-FIyl4-Oa.mjs";
2
+ import "./standards-discovery-CYfiQE13.mjs";
3
+ import { c as renderDocsRobotsGeneratedBlock, f as upsertDocsRobotsGeneratedBlock, i as DOCS_ROBOTS_GENERATED_BLOCK_START, r as DOCS_ROBOTS_GENERATED_BLOCK_END, u as resolveDocsRobotsConfig } from "./robots-DOqBwQw8.mjs";
4
4
  import { a as loadDocsConfigModule, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, m as readTopLevelBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
5
5
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
6
6
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
@@ -1,5 +1,5 @@
1
- import { Ft as resolveDocsSitemapConfig, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, X as normalizeDocsPathSegment, a as DEFAULT_AGENT_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, en as DEFAULT_MCP_PUBLIC_ROUTE, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, nn as DEFAULT_MCP_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-D2SsSct2.mjs";
2
- import { a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-DSVKdQrl.mjs";
1
+ import { S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, Vt as resolveDocsSitemapConfig, a as DEFAULT_AGENT_MD_ROUTE, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, cn as DEFAULT_MCP_PUBLIC_ROUTE, et as normalizeDocsPathSegment, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE, un as DEFAULT_MCP_WELL_KNOWN_ROUTE, v as DEFAULT_LLMS_TXT_ROUTE, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-FIyl4-Oa.mjs";
2
+ import { a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, v as DEFAULT_API_CATALOG_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-CYfiQE13.mjs";
3
3
 
4
4
  //#region src/robots.ts
5
5
  const DEFAULT_ROBOTS_TXT_ROUTE = "/robots.txt";
@@ -1,5 +1,5 @@
1
1
  import { $n as ResolvedDocsRelatedLink, Fn as OpenDocsProvider, Jt as DocsObservabilityEventInput, Kt as DocsObservabilityConfig, Mn as McpDocsSearchConfig, Rn as OpenDocsTarget, at as DocsAnalyticsEventInput, cn as DocsSearchConfig, et as DocsAgentTraceEventInput, f as CustomDocsSearchConfig, fn as DocsSearchResult, hn as DocsSitemapConfig, ht as DocsAskAIMcpConfig, in as DocsSearchAdapter, it as DocsAnalyticsEvent, ln as DocsSearchDocument, lr as TypesenseDocsSearchConfig, mn as DocsSearchSourcePage, on as DocsSearchAdapterFactory, qt as DocsObservabilityEvent, r as AlgoliaDocsSearchConfig, rt as DocsAnalyticsConfig, sn as DocsSearchChunkingConfig } from "./types-BQC05SQm.mjs";
2
- import { F as DocsDiscoveryApiRouteOptions } from "./standards-discovery-CQjJ-M2y.mjs";
2
+ import { F as DocsDiscoveryApiRouteOptions } from "./standards-discovery-C0CIC4QI.mjs";
3
3
 
4
4
  //#region src/analytics.d.ts
5
5
  declare const DOCS_AGENT_TRACE_EVENT_TYPES: readonly ["run.start", "run.end", "run.error", "user.input", "prompt.build", "retrieval.query", "retrieval.result", "retrieval.error", "model.call", "model.response", "model.stream", "model.error", "tool.call", "tool.result", "tool.error", "retry", "timeout", "error", "agent.final"];
@@ -1,11 +1,11 @@
1
- import "./agent-D2SsSct2.mjs";
2
- import "./standards-discovery-DSVKdQrl.mjs";
3
- import { n as buildDocsSearchDocuments, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter } from "./search-DBlw9h3P.mjs";
4
- import "./sitemap-server-DQp8qUKN.mjs";
5
- import "./agent-evals-DZR4J7Iz.mjs";
1
+ import "./agent-FIyl4-Oa.mjs";
2
+ import "./standards-discovery-CYfiQE13.mjs";
3
+ import { n as buildDocsSearchDocuments, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter } from "./search-x5O0-9X3.mjs";
4
+ import "./sitemap-server-D_hayOp6.mjs";
5
+ import "./agent-evals-Cr9TAkmB.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
- import "./agent-skills-server-iBfCLPOt.mjs";
8
+ import "./agent-skills-server-B4u3qy-1.mjs";
9
9
  import "./server.mjs";
10
10
  import { _ as resolveDocsContentDir, c as loadProjectEnv, g as resolveDocsConfigPath, h as readTopLevelStringProperty } from "./config-Wcdj-D0a.mjs";
11
11
  import { readFileSync } from "node:fs";
@@ -1,4 +1,4 @@
1
- import { H as isDocsAgentDiscoveryRequest, J as isDocsSkillRequest, Qt as upsertPageAgentContractMarkdown, U as isDocsAgentsRequest, Vt as PAGE_AGENT_CONTRACT_END_MARKER, Wt as PAGE_AGENT_CONTRACT_START_MARKER, Yt as renderPageAgentContractMarkdown, at as resolveDocsAgentFeedbackConfig, gt as resolveDocsSkillFormat, lt as resolveDocsLlmsTxtRequest, ot as resolveDocsAgentFeedbackRequest, pt as resolveDocsMarkdownRequest, st as resolveDocsAgentsFormat, wt as resolveDocsAudienceMdxContent } from "./agent-D2SsSct2.mjs";
1
+ import { At as resolveDocsAudienceMdxContent, G as isDocsAgentDiscoveryRequest, Gt as findDocsMarkdownSection, K as isDocsAgentsRequest, Kt as parseDocsMarkdownSections, Q as isDocsSkillRequest, Qt as PAGE_AGENT_CONTRACT_START_MARKER, Yt as PAGE_AGENT_CONTRACT_END_MARKER, _t as resolveDocsMarkdownRequest, dt as resolveDocsAgentsFormat, lt as resolveDocsAgentFeedbackConfig, on as upsertPageAgentContractMarkdown, pt as resolveDocsLlmsTxtRequest, rn as renderPageAgentContractMarkdown, ut as resolveDocsAgentFeedbackRequest, xt as resolveDocsSkillFormat } from "./agent-FIyl4-Oa.mjs";
2
2
 
3
3
  //#region src/telemetry.ts
4
4
  const DOCS_PACKAGE_NAME = "@farming-labs/docs";
@@ -457,146 +457,6 @@ function serializeGeneratedAgentDocument(content, provenance) {
457
457
  ].join("\n")}\n`;
458
458
  }
459
459
 
460
- //#endregion
461
- //#region src/markdown-sections.ts
462
- const HTML_ENTITIES = {
463
- amp: "&",
464
- apos: "'",
465
- gt: ">",
466
- lt: "<",
467
- nbsp: " ",
468
- quot: "\""
469
- };
470
- /**
471
- * Reduce inline Markdown in a heading to the visible label used by search and anchors.
472
- * This intentionally covers the common inline constructs without adding a Markdown parser
473
- * dependency to the runtime package.
474
- */
475
- function cleanDocsMarkdownHeadingLabel(value) {
476
- return value.replace(/!\[([^\]]*)\]\([^)]*\)/gu, "$1").replace(/\[([^\]]+)\]\([^)]*\)/gu, "$1").replace(/!\[([^\]]*)\]\[[^\]]*\]/gu, "$1").replace(/\[([^\]]+)\]\[[^\]]*\]/gu, "$1").replace(/<((?:https?:\/\/|mailto:)[^>]+)>/giu, "$1").replace(/<[^>]+>/gu, "").replace(/`+([^`]*?)`+/gu, "$1").replace(/\\([!"#$%&'()*+,\-./:;<=>?@[\]^_`{|}~])/gu, "$1").replace(/[*_~]/gu, "").replace(/&(#(?:x[0-9a-f]+|\d+)|[a-z]+);/giu, (_match, entity) => {
477
- if (entity.startsWith("#x") || entity.startsWith("#X")) {
478
- const codePoint = Number.parseInt(entity.slice(2), 16);
479
- return Number.isSafeInteger(codePoint) && codePoint >= 0 && codePoint <= 1114111 ? String.fromCodePoint(codePoint) : _match;
480
- }
481
- if (entity.startsWith("#")) {
482
- const codePoint = Number.parseInt(entity.slice(1), 10);
483
- return Number.isSafeInteger(codePoint) && codePoint >= 0 && codePoint <= 1114111 ? String.fromCodePoint(codePoint) : _match;
484
- }
485
- return HTML_ENTITIES[entity.toLowerCase()] ?? _match;
486
- }).replace(/\s+/gu, " ").trim();
487
- }
488
- /** Keep anchors aligned with the framework's existing ASCII heading-slug behavior. */
489
- function slugifyDocsMarkdownHeading(value) {
490
- return cleanDocsMarkdownHeadingLabel(value).toLowerCase().replace(/[`'"‘’“”]/gu, "").replace(/&/gu, " and ").replace(/[^a-z0-9\s-]/gu, "").replace(/\s+/gu, "-").replace(/-+/gu, "-").replace(/^-|-$/gu, "");
491
- }
492
- function readOpeningFence(line) {
493
- const match = line.match(/^ {0,3}(`{3,}|~{3,})/u);
494
- if (!match) return void 0;
495
- return {
496
- marker: match[1][0],
497
- length: match[1].length
498
- };
499
- }
500
- function isClosingFence(line, fence) {
501
- const marker = fence.marker === "`" ? "`" : "~";
502
- const match = line.match(new RegExp(`^ {0,3}(${marker}{${fence.length},})[\\t ]*$`, "u"));
503
- return Boolean(match);
504
- }
505
- function readAtxHeading(line) {
506
- const match = line.match(/^ {0,3}(#{1,6})(?:[\t ]+|$)(.*)$/u);
507
- if (!match) return void 0;
508
- return {
509
- title: cleanDocsMarkdownHeadingLabel(match[2].replace(/[\t ]+#+[\t ]*$/u, "").trim()),
510
- level: match[1].length
511
- };
512
- }
513
- function readSetextLevel(line) {
514
- const match = line.match(/^ {0,3}(=+|-+)[\t ]*$/u);
515
- if (!match) return void 0;
516
- return match[1][0] === "=" ? 1 : 2;
517
- }
518
- function normalizeDocsSectionSelector(value) {
519
- let selector = value.trim();
520
- const hashIndex = selector.lastIndexOf("#");
521
- if (hashIndex >= 0) selector = selector.slice(hashIndex + 1);
522
- try {
523
- selector = decodeURIComponent(selector);
524
- } catch {}
525
- return cleanDocsMarkdownHeadingLabel(selector.replace(/^#+/u, "")).toLowerCase();
526
- }
527
- /**
528
- * Parse heading sections once for search, Ask AI hydration, and MCP tools.
529
- * Supports CommonMark ATX indentation, Setext headings, fenced-code exclusion,
530
- * visible inline labels, and stable duplicate anchors.
531
- */
532
- function parseDocsMarkdownSections(markdown) {
533
- const lines = markdown.split("\n");
534
- const headings = [];
535
- const headingCounts = /* @__PURE__ */ new Map();
536
- let openFence;
537
- let setextCandidate;
538
- const pushHeading = (title, level, start) => {
539
- const baseAnchor = slugifyDocsMarkdownHeading(title) || `section-${headings.length}`;
540
- const seen = headingCounts.get(baseAnchor) ?? 0;
541
- headingCounts.set(baseAnchor, seen + 1);
542
- headings.push({
543
- title,
544
- anchor: seen === 0 ? baseAnchor : `${baseAnchor}-${seen}`,
545
- level,
546
- start
547
- });
548
- };
549
- for (let index = 0; index < lines.length; index += 1) {
550
- const line = lines[index];
551
- if (openFence) {
552
- if (isClosingFence(line, openFence)) openFence = void 0;
553
- setextCandidate = void 0;
554
- continue;
555
- }
556
- const openingFence = readOpeningFence(line);
557
- if (openingFence) {
558
- openFence = openingFence;
559
- setextCandidate = void 0;
560
- continue;
561
- }
562
- const setextLevel = readSetextLevel(line);
563
- if (setextLevel && setextCandidate?.index === index - 1) {
564
- const title = cleanDocsMarkdownHeadingLabel(setextCandidate.value.trim());
565
- if (title) pushHeading(title, setextLevel, setextCandidate.index);
566
- setextCandidate = void 0;
567
- continue;
568
- }
569
- const atxHeading = readAtxHeading(line);
570
- if (atxHeading) {
571
- pushHeading(atxHeading.title, atxHeading.level, index);
572
- setextCandidate = void 0;
573
- continue;
574
- }
575
- if (!line.trim() || /^ {4}|^\t/u.test(line)) {
576
- setextCandidate = void 0;
577
- continue;
578
- }
579
- setextCandidate = {
580
- index,
581
- value: line
582
- };
583
- }
584
- return headings.map((heading, index) => {
585
- const end = headings.slice(index + 1).find((candidate) => candidate.level <= heading.level)?.start ?? lines.length;
586
- return {
587
- title: heading.title,
588
- anchor: heading.anchor,
589
- level: heading.level,
590
- content: lines.slice(heading.start, end).join("\n").trim()
591
- };
592
- });
593
- }
594
- function findDocsMarkdownSection(markdown, requestedSection) {
595
- const selector = normalizeDocsSectionSelector(requestedSection);
596
- if (!selector) return void 0;
597
- return parseDocsMarkdownSections(markdown).find((section) => normalizeDocsSectionSelector(section.title) === selector || section.anchor === selector);
598
- }
599
-
600
460
  //#endregion
601
461
  //#region src/search.ts
602
462
  const DEFAULT_SEARCH_LIMIT = 10;
@@ -1823,4 +1683,4 @@ function createCustomSearchAdapter(adapter) {
1823
1683
  }
1824
1684
 
1825
1685
  //#endregion
1826
- export { emitDocsTelemetryProjectEvent as A, applySidebarFolderIndexBehavior as C, emitDocsTelemetryAgentSurfaceEvent as D, resolveSidebarFolderIndexBehaviorForPath as E, resolveDocsTelemetryConfig as F, inferDocsTelemetryAgentSurface as M, isLocalDocsTelemetryOrigin as N, emitDocsTelemetryEvent as O, normalizeDocsTelemetryOrigin as P, stripGeneratedAgentProvenance as S, resolveSidebarFolderIndexBehavior as T, GENERATED_AGENT_PROVENANCE_VERSION as _, createMcpSearchAdapter as a, parseGeneratedAgentDocument as b, formatDocsAskAIPackageHints as c, resolveAskAISearchRequestConfig as d, resolveDocsSearchAudience as f, GENERATED_AGENT_PROVENANCE_MARKER as g, parseDocsMarkdownSections as h, createCustomSearchAdapter as i, getDocsTelemetryFeatures as j, emitDocsTelemetryMcpToolEvent as k, inferDocsAskAIPackageHints as l, findDocsMarkdownSection as m, buildDocsSearchDocuments as n, createSimpleSearchAdapter as o, resolveSearchRequestConfig as p, createAlgoliaSearchAdapter as r, createTypesenseSearchAdapter as s, buildDocsAskAIContext as t, performDocsSearch as u, hashGeneratedAgentContent as v, resolvePageSidebarFolderIndexBehavior as w, serializeGeneratedAgentDocument as x, normalizeGeneratedAgentContent as y };
1686
+ export { inferDocsTelemetryAgentSurface as A, resolveSidebarFolderIndexBehavior as C, emitDocsTelemetryMcpToolEvent as D, emitDocsTelemetryEvent as E, normalizeDocsTelemetryOrigin as M, resolveDocsTelemetryConfig as N, emitDocsTelemetryProjectEvent as O, resolvePageSidebarFolderIndexBehavior as S, emitDocsTelemetryAgentSurfaceEvent as T, normalizeGeneratedAgentContent as _, createMcpSearchAdapter as a, stripGeneratedAgentProvenance as b, formatDocsAskAIPackageHints as c, resolveAskAISearchRequestConfig as d, resolveDocsSearchAudience as f, hashGeneratedAgentContent as g, GENERATED_AGENT_PROVENANCE_VERSION as h, createCustomSearchAdapter as i, isLocalDocsTelemetryOrigin as j, getDocsTelemetryFeatures as k, inferDocsAskAIPackageHints as l, GENERATED_AGENT_PROVENANCE_MARKER as m, buildDocsSearchDocuments as n, createSimpleSearchAdapter as o, resolveSearchRequestConfig as p, createAlgoliaSearchAdapter as r, createTypesenseSearchAdapter as s, buildDocsAskAIContext as t, performDocsSearch as u, parseGeneratedAgentDocument as v, resolveSidebarFolderIndexBehaviorForPath as w, applySidebarFolderIndexBehavior as x, serializeGeneratedAgentDocument as y };
package/dist/server.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { $t as DocsReviewRulesConfig, B as DocsAgentEvaluationSourceReference, Ct as DocsCodeBlocksPlannerProvider, Et as DocsCodeBlocksValidateConfig, F as DocsAgentEvaluationAnswerInput, H as DocsAgentEvaluationTaskInput, I as DocsAgentEvaluationAnswerProvider, J as DocsAgentGoldenExpectedExample, Jt as DocsObservabilityEventInput, K as DocsAgentGoldenAnswerExpectation, Kt as DocsObservabilityConfig, L as DocsAgentEvaluationAnswerRequest, Mn as McpDocsSearchConfig, Qt as DocsReviewConfig, R as DocsAgentEvaluationAnswerResult, V as DocsAgentEvaluationSurface, X as DocsAgentGoldenTaskExpectation, Y as DocsAgentGoldenTask, Z as DocsAgentGoldenTaskFilters, Zt as DocsReviewCiMode, a as ApiReferenceRenderer, an as DocsSearchAdapterContext, at as DocsAnalyticsEventInput, cn as DocsSearchConfig, dn as DocsSearchQuery, dt as DocsAskAIFeedbackConfig, et as DocsAgentTraceEventInput, fn as DocsSearchResult, ft as DocsAskAIFeedbackData, hn as DocsSitemapConfig, ht as DocsAskAIMcpConfig, in as DocsSearchAdapter, it as DocsAnalyticsEvent, kt as DocsConfig, ln as DocsSearchDocument, mn as DocsSearchSourcePage, mt as DocsAskAIFeedbackValue, nt as DocsAgentTraceStatus, on as DocsSearchAdapterFactory, pt as DocsAskAIFeedbackMessage, q as DocsAgentGoldenExampleVerification, qt as DocsObservabilityEvent, rt as DocsAnalyticsConfig, tt as DocsAgentTraceEventType, z as DocsAgentEvaluationAnswerRunner } from "./types-BQC05SQm.mjs";
2
- import { n as resolveConfiguredAgentSkills, r as resolveConfiguredAgentSkillsSync, t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-DJXdK_hS.mjs";
2
+ import { n as resolveConfiguredAgentSkills, r as resolveConfiguredAgentSkillsSync, t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-DTwblsLu.mjs";
3
3
  import { renderDocsAgentSkillsBundle } from "./agent-skills-vite.mjs";
4
- import { i as isDocsCloudAskAIProvider, n as DocsCloudAskAIResponseOptions, r as createDocsCloudAskAIResponse, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-BD1SeVZv.mjs";
4
+ import { i as isDocsCloudAskAIProvider, n as DocsCloudAskAIResponseOptions, r as createDocsCloudAskAIResponse, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-BfnX18rI.mjs";
5
5
  import { DocsCloudAskAIOptions, DocsCloudPublicConfig, DocsCloudRouteHandlerOptions, DocsCloudRouteHandlers, DocsCloudRuntimeEnv, DocsCloudRuntimeValue, DocsCloudServer, DocsCloudServerOptions, DocsCloudTrackEventOptions, createDocsCloudRouteHandler, createDocsCloudServer } from "./docs-cloud-server.mjs";
6
- import { A as resolveDocsSitemapPageLastmod, B as SerializedOpenDocsProvider, C as DocsSitemapResolvedConfig, D as renderDocsSitemapMarkdown, E as readDocsSitemapManifestFromContentMap, F as DEFAULT_OPEN_DOCS_TARGET, G as serializeDocsIcon, H as parsePromptStringArray, I as DEFAULT_PROMPT_PROVIDER_TEMPLATES, J as serializeOpenDocsProviders, K as serializeDocsIconRegistry, L as PromptAction, M as toDocsSitemapMarkdownUrl, N as DEFAULT_OPEN_DOCS_PROMPT, O as renderDocsSitemapXml, P as DEFAULT_OPEN_DOCS_PROVIDER_IDS, R as PromptProviderChoice, S as DocsSitemapPageInput, T as createDocsSitemapResponse, U as resolvePromptProviderChoices, V as normalizePromptProviderName, W as sanitizePromptText, _ as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, a as createMcpSearchAdapter, at as createDocsAgentTraceContext, b as DocsSitemapManifest, c as formatDocsAskAIPackageHints, ct as emitDocsAnalyticsEvent, d as resolveAskAISearchRequestConfig, dt as resolveDocsAnalyticsConfig, f as resolveDocsSearchAudience, ft as resolveDocsObservabilityConfig, g as DEFAULT_SITEMAP_MD_ROUTE, h as DEFAULT_SITEMAP_MD_DOCS_ROUTE, i as createCustomSearchAdapter, it as ResolvedDocsObservabilityConfig, j as resolveDocsSitemapRequest, k as resolveDocsSitemapConfig, l as inferDocsAskAIPackageHints, lt as emitDocsObservabilityEvent, m as DEFAULT_SITEMAP_MANIFEST_PATH, n as buildDocsSearchDocuments, nt as DocsAgentTraceContext, o as createSimpleSearchAdapter, ot as createDocsAgentTraceId, p as resolveSearchRequestConfig, q as serializeOpenDocsProvider, r as createAlgoliaSearchAdapter, rt as ResolvedDocsAnalyticsConfig, s as createTypesenseSearchAdapter, st as emitDocsAgentTraceEvent, t as buildDocsAskAIContext, tt as DOCS_AGENT_TRACE_EVENT_TYPES, u as performDocsSearch, ut as getDocsRequestAnalyticsProperties, v as DEFAULT_SITEMAP_XML_ROUTE, w as buildDocsSitemapManifest, x as DocsSitemapManifestPage, y as DocsSitemapFormat, z as SerializeOpenDocsProviderOptions } from "./search-BBVD0A7O.mjs";
6
+ import { A as resolveDocsSitemapPageLastmod, B as SerializedOpenDocsProvider, C as DocsSitemapResolvedConfig, D as renderDocsSitemapMarkdown, E as readDocsSitemapManifestFromContentMap, F as DEFAULT_OPEN_DOCS_TARGET, G as serializeDocsIcon, H as parsePromptStringArray, I as DEFAULT_PROMPT_PROVIDER_TEMPLATES, J as serializeOpenDocsProviders, K as serializeDocsIconRegistry, L as PromptAction, M as toDocsSitemapMarkdownUrl, N as DEFAULT_OPEN_DOCS_PROMPT, O as renderDocsSitemapXml, P as DEFAULT_OPEN_DOCS_PROVIDER_IDS, R as PromptProviderChoice, S as DocsSitemapPageInput, T as createDocsSitemapResponse, U as resolvePromptProviderChoices, V as normalizePromptProviderName, W as sanitizePromptText, _ as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, a as createMcpSearchAdapter, at as createDocsAgentTraceContext, b as DocsSitemapManifest, c as formatDocsAskAIPackageHints, ct as emitDocsAnalyticsEvent, d as resolveAskAISearchRequestConfig, dt as resolveDocsAnalyticsConfig, f as resolveDocsSearchAudience, ft as resolveDocsObservabilityConfig, g as DEFAULT_SITEMAP_MD_ROUTE, h as DEFAULT_SITEMAP_MD_DOCS_ROUTE, i as createCustomSearchAdapter, it as ResolvedDocsObservabilityConfig, j as resolveDocsSitemapRequest, k as resolveDocsSitemapConfig, l as inferDocsAskAIPackageHints, lt as emitDocsObservabilityEvent, m as DEFAULT_SITEMAP_MANIFEST_PATH, n as buildDocsSearchDocuments, nt as DocsAgentTraceContext, o as createSimpleSearchAdapter, ot as createDocsAgentTraceId, p as resolveSearchRequestConfig, q as serializeOpenDocsProvider, r as createAlgoliaSearchAdapter, rt as ResolvedDocsAnalyticsConfig, s as createTypesenseSearchAdapter, st as emitDocsAgentTraceEvent, t as buildDocsAskAIContext, tt as DOCS_AGENT_TRACE_EVENT_TYPES, u as performDocsSearch, ut as getDocsRequestAnalyticsProperties, v as DEFAULT_SITEMAP_XML_ROUTE, w as buildDocsSitemapManifest, x as DocsSitemapManifestPage, y as DocsSitemapFormat, z as SerializeOpenDocsProviderOptions } from "./search-CozHzW7v.mjs";
7
7
  import { CreateDocsMcpServerOptions, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, DocsMcpAgentContractSummary, DocsMcpCodeExample, DocsMcpConfigSchema, DocsMcpConfigSchemaOption, DocsMcpContextResult, DocsMcpContextSource, DocsMcpDocsList, DocsMcpDocsPageSummary, DocsMcpDocsSection, DocsMcpHttpHandlers, DocsMcpNavigationNode, DocsMcpNavigationTree, DocsMcpPage, DocsMcpRequestContext, DocsMcpResolvedConfig, DocsMcpResolvedCorsConfig, DocsMcpResolvedProtectedResourceConfig, DocsMcpResolvedSecurityConfig, DocsMcpSource, DocsMcpTaskSummary, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, normalizeDocsMcpRoute, resolveDocsMcpConfig, runDocsMcpStdio } from "./mcp.mjs";
8
8
 
9
9
  //#region src/code-group-mdx.d.ts
package/dist/server.mjs CHANGED
@@ -1,14 +1,14 @@
1
1
  import { a as emitDocsAnalyticsEvent, c as resolveDocsAnalyticsConfig, i as emitDocsAgentTraceEvent, l as resolveDocsObservabilityConfig, n as createDocsAgentTraceContext, o as emitDocsObservabilityEvent, r as createDocsAgentTraceId, s as getDocsRequestAnalyticsProperties, t as DOCS_AGENT_TRACE_EVENT_TYPES } from "./analytics-Bx44lg6d.mjs";
2
- import { At as buildDocsSitemapManifest, Dt as DEFAULT_SITEMAP_MD_ROUTE, Et as DEFAULT_SITEMAP_MD_DOCS_ROUTE, Ft as resolveDocsSitemapConfig, It as resolveDocsSitemapPageLastmod, Lt as resolveDocsSitemapRequest, Mt as readDocsSitemapManifestFromContentMap, Nt as renderDocsSitemapMarkdown, Ot as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, Pt as renderDocsSitemapXml, Rt as toDocsSitemapMarkdownUrl, Tt as DEFAULT_SITEMAP_MANIFEST_PATH, jt as createDocsSitemapResponse, kt as DEFAULT_SITEMAP_XML_ROUTE } from "./agent-D2SsSct2.mjs";
3
- import "./standards-discovery-DSVKdQrl.mjs";
4
- import { a as createMcpSearchAdapter, c as formatDocsAskAIPackageHints, d as resolveAskAISearchRequestConfig, f as resolveDocsSearchAudience, i as createCustomSearchAdapter, l as inferDocsAskAIPackageHints, n as buildDocsSearchDocuments, o as createSimpleSearchAdapter, p as resolveSearchRequestConfig, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-DBlw9h3P.mjs";
5
- import { C as resolveApiReferenceOpenApiDiscovery, S as resolveApiReferenceConfig, T as remarkCodeGroup, _ as buildApiReferenceOpenApiDocument, a as DEFAULT_PROMPT_PROVIDER_TEMPLATES, b as buildApiReferenceScalarCss, c as resolvePromptProviderChoices, d as serializeDocsIconRegistry, f as serializeOpenDocsProvider, g as buildApiReferenceHtmlDocumentAsync, h as buildApiReferenceHtmlDocument, i as DEFAULT_OPEN_DOCS_TARGET, l as sanitizePromptText, m as DEFAULT_API_REFERENCE_OPENAPI_ROUTE, n as DEFAULT_OPEN_DOCS_PROMPT, o as normalizePromptProviderName, p as serializeOpenDocsProviders, r as DEFAULT_OPEN_DOCS_PROVIDER_IDS, s as parsePromptStringArray, t as readDocsSitemapManifest, u as serializeDocsIcon, v as buildApiReferenceOpenApiDocumentAsync, w as resolveApiReferenceRenderer, x as isApiReferenceOpenApiRequest, y as buildApiReferencePageTitle } from "./sitemap-server-DQp8qUKN.mjs";
6
- import { a as buildDocsReviewWorkflowPathFilters, c as resolveDocsReviewConfig, i as buildDocsReviewWorkflow, n as DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, o as ensureDocsReviewWorkflow, r as DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-DZR4J7Iz.mjs";
2
+ import { Bt as renderDocsSitemapXml, Ft as DEFAULT_SITEMAP_XML_ROUTE, Ht as resolveDocsSitemapPageLastmod, It as buildDocsSitemapManifest, Lt as createDocsSitemapResponse, Mt as DEFAULT_SITEMAP_MD_DOCS_ROUTE, Nt as DEFAULT_SITEMAP_MD_ROUTE, Pt as DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, Rt as readDocsSitemapManifestFromContentMap, Ut as resolveDocsSitemapRequest, Vt as resolveDocsSitemapConfig, Wt as toDocsSitemapMarkdownUrl, jt as DEFAULT_SITEMAP_MANIFEST_PATH, zt as renderDocsSitemapMarkdown } from "./agent-FIyl4-Oa.mjs";
3
+ import "./standards-discovery-CYfiQE13.mjs";
4
+ import { a as createMcpSearchAdapter, c as formatDocsAskAIPackageHints, d as resolveAskAISearchRequestConfig, f as resolveDocsSearchAudience, i as createCustomSearchAdapter, l as inferDocsAskAIPackageHints, n as buildDocsSearchDocuments, o as createSimpleSearchAdapter, p as resolveSearchRequestConfig, r as createAlgoliaSearchAdapter, s as createTypesenseSearchAdapter, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-x5O0-9X3.mjs";
5
+ import { C as resolveApiReferenceOpenApiDiscovery, S as resolveApiReferenceConfig, T as remarkCodeGroup, _ as buildApiReferenceOpenApiDocument, a as DEFAULT_PROMPT_PROVIDER_TEMPLATES, b as buildApiReferenceScalarCss, c as resolvePromptProviderChoices, d as serializeDocsIconRegistry, f as serializeOpenDocsProvider, g as buildApiReferenceHtmlDocumentAsync, h as buildApiReferenceHtmlDocument, i as DEFAULT_OPEN_DOCS_TARGET, l as sanitizePromptText, m as DEFAULT_API_REFERENCE_OPENAPI_ROUTE, n as DEFAULT_OPEN_DOCS_PROMPT, o as normalizePromptProviderName, p as serializeOpenDocsProviders, r as DEFAULT_OPEN_DOCS_PROVIDER_IDS, s as parsePromptStringArray, t as readDocsSitemapManifest, u as serializeDocsIcon, v as buildApiReferenceOpenApiDocumentAsync, w as resolveApiReferenceRenderer, x as isApiReferenceOpenApiRequest, y as buildApiReferencePageTitle } from "./sitemap-server-D_hayOp6.mjs";
6
+ import { a as buildDocsReviewWorkflowPathFilters, c as resolveDocsReviewConfig, i as buildDocsReviewWorkflow, n as DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, o as ensureDocsReviewWorkflow, r as DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, s as readDocsReviewConfigFromSource, t as runDocsGoldenTasks } from "./agent-evals-Cr9TAkmB.mjs";
7
7
  import { DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DOCS_CONFIG_SCHEMA_OPTIONS, createDocsMcpHttpHandler, createDocsMcpServer, createFilesystemDocsMcpSource, getDocsConfigSchema, normalizeDocsMcpRoute, resolveDocsMcpConfig, runDocsMcpStdio } from "./mcp.mjs";
8
8
  import { n as isDocsCloudAskAIProvider, t as createDocsCloudAskAIResponse } from "./cloud-ask-ai-sbpjOR2K.mjs";
9
9
  import { createDocsCloudRouteHandler, createDocsCloudServer } from "./docs-cloud-server.mjs";
10
10
  import "./code-blocks-DnNVNK2M.mjs";
11
- import { n as resolveConfiguredAgentSkillsSync, t as resolveConfiguredAgentSkills } from "./agent-skills-server-iBfCLPOt.mjs";
11
+ import { n as resolveConfiguredAgentSkillsSync, t as resolveConfiguredAgentSkills } from "./agent-skills-server-B4u3qy-1.mjs";
12
12
  import { renderDocsAgentSkillsBundle } from "./agent-skills-vite.mjs";
13
13
 
14
14
  export { DEFAULT_API_REFERENCE_OPENAPI_ROUTE, DEFAULT_DOCS_MCP_CORS_ALLOWED_HEADERS, DEFAULT_DOCS_MCP_CORS_EXPOSED_HEADERS, DEFAULT_DOCS_MCP_CORS_MAX_AGE_SECONDS, DEFAULT_DOCS_MCP_MAX_BODY_BYTES, DEFAULT_DOCS_REVIEW_SCORE_THRESHOLD, DEFAULT_DOCS_REVIEW_WORKFLOW_PATH, DEFAULT_OPEN_DOCS_PROMPT, DEFAULT_OPEN_DOCS_PROVIDER_IDS, DEFAULT_OPEN_DOCS_TARGET, DEFAULT_PROMPT_PROVIDER_TEMPLATES, DEFAULT_SITEMAP_MANIFEST_PATH, DEFAULT_SITEMAP_MD_DOCS_ROUTE, DEFAULT_SITEMAP_MD_ROUTE, DEFAULT_SITEMAP_MD_WELL_KNOWN_ROUTE, DEFAULT_SITEMAP_XML_ROUTE, DOCS_AGENT_TRACE_EVENT_TYPES, DOCS_CONFIG_SCHEMA_OPTIONS, buildApiReferenceHtmlDocument, buildApiReferenceHtmlDocumentAsync, buildApiReferenceOpenApiDocument, buildApiReferenceOpenApiDocumentAsync, buildApiReferencePageTitle, buildApiReferenceScalarCss, buildDocsAskAIContext, buildDocsReviewWorkflow, buildDocsReviewWorkflowPathFilters, buildDocsSearchDocuments, buildDocsSitemapManifest, createAlgoliaSearchAdapter, createCustomSearchAdapter, createDocsAgentTraceContext, createDocsAgentTraceId, createDocsCloudAskAIResponse, createDocsCloudRouteHandler, createDocsCloudServer, createDocsMcpHttpHandler, createDocsMcpServer, createDocsSitemapResponse, createFilesystemDocsMcpSource, createMcpSearchAdapter, createSimpleSearchAdapter, createTypesenseSearchAdapter, emitDocsAgentTraceEvent, emitDocsAnalyticsEvent, emitDocsObservabilityEvent, ensureDocsReviewWorkflow, formatDocsAskAIPackageHints, getDocsConfigSchema, getDocsRequestAnalyticsProperties, inferDocsAskAIPackageHints, isApiReferenceOpenApiRequest, isDocsCloudAskAIProvider, normalizeDocsMcpRoute, normalizePromptProviderName, parsePromptStringArray, performDocsSearch, readDocsReviewConfigFromSource, readDocsSitemapManifest, readDocsSitemapManifestFromContentMap, remarkCodeGroup, renderDocsAgentSkillsBundle, renderDocsSitemapMarkdown, renderDocsSitemapXml, resolveApiReferenceConfig, resolveApiReferenceOpenApiDiscovery, resolveApiReferenceRenderer, resolveAskAISearchRequestConfig, resolveConfiguredAgentSkills, resolveConfiguredAgentSkillsSync, resolveDocsAnalyticsConfig, resolveDocsMcpConfig, resolveDocsObservabilityConfig, resolveDocsReviewConfig, resolveDocsSearchAudience, resolveDocsSitemapConfig, resolveDocsSitemapPageLastmod, resolveDocsSitemapRequest, resolvePromptProviderChoices, resolveSearchRequestConfig, runDocsGoldenTasks, runDocsMcpStdio, sanitizePromptText, serializeDocsIcon, serializeDocsIconRegistry, serializeOpenDocsProvider, serializeOpenDocsProviders, toDocsSitemapMarkdownUrl };
@@ -1,11 +1,11 @@
1
- import { At as buildDocsSitemapManifest, Ft as resolveDocsSitemapConfig, Nt as renderDocsSitemapMarkdown, Pt as renderDocsSitemapXml } from "./agent-D2SsSct2.mjs";
2
- import "./standards-discovery-DSVKdQrl.mjs";
3
- import "./search-DBlw9h3P.mjs";
4
- import "./sitemap-server-DQp8qUKN.mjs";
5
- import "./agent-evals-DZR4J7Iz.mjs";
1
+ import { Bt as renderDocsSitemapXml, It as buildDocsSitemapManifest, Vt as resolveDocsSitemapConfig, zt as renderDocsSitemapMarkdown } from "./agent-FIyl4-Oa.mjs";
2
+ import "./standards-discovery-CYfiQE13.mjs";
3
+ import "./search-x5O0-9X3.mjs";
4
+ import "./sitemap-server-D_hayOp6.mjs";
5
+ import "./agent-evals-Cr9TAkmB.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
7
7
  import "./code-blocks-DnNVNK2M.mjs";
8
- import "./agent-skills-server-iBfCLPOt.mjs";
8
+ import "./agent-skills-server-B4u3qy-1.mjs";
9
9
  import "./server.mjs";
10
10
  import { _ as resolveDocsContentDir, a as loadDocsConfigModule, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
11
11
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
@@ -1,4 +1,4 @@
1
- import { Ft as resolveDocsSitemapConfig } from "./agent-D2SsSct2.mjs";
1
+ import { Vt as resolveDocsSitemapConfig } from "./agent-FIyl4-Oa.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
4
4
  import path, { basename, join, relative } from "node:path";
@@ -1,4 +1,4 @@
1
- import matter from "gray-matter";
1
+ import { parseDocsAgentSkillFrontmatter, validateDocsAgentSkillFrontmatter } from "./agent-skills-spec.mjs";
2
2
 
3
3
  //#region src/standards-discovery.ts
4
4
  const DEFAULT_API_CATALOG_ROUTE = "/.well-known/api-catalog";
@@ -27,9 +27,6 @@ const DOCS_AGENT_MANIFEST_SCHEMA_URI = "https://docs.farming-labs.dev/schema/age
27
27
  const DOCS_AGENT_MANIFEST_SCHEMA_MEDIA_TYPE = "application/schema+json";
28
28
  const DEFAULT_DOCS_API_ROUTE = "/api/docs";
29
29
  const DEFAULT_AGENT_MANIFEST_ROUTE = "/.well-known/agent.json";
30
- const AGENT_SKILL_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
31
- const AGENT_SKILL_NAME_MAX_LENGTH = 64;
32
- const AGENT_SKILL_DESCRIPTION_MAX_LENGTH = 1024;
33
30
  const DISCOVERY_CACHE_CONTROL = "public, max-age=0, s-maxage=3600";
34
31
  const LEGACY_A2A_PROTOCOL_VERSION = "0.3";
35
32
  function normalizeDocsRoute(value) {
@@ -125,22 +122,6 @@ function buildDocsApiCatalog(options) {
125
122
  }
126
123
  return { linkset };
127
124
  }
128
- function readAgentSkillFrontmatter(document) {
129
- const normalized = document.startsWith("") ? document.slice(1) : document;
130
- let data;
131
- try {
132
- data = matter(normalized).data;
133
- } catch {
134
- return null;
135
- }
136
- const name = typeof data.name === "string" ? data.name.trim() : "";
137
- const description = typeof data.description === "string" ? data.description.trim() : "";
138
- if (!name || name.length > AGENT_SKILL_NAME_MAX_LENGTH || !AGENT_SKILL_NAME_PATTERN.test(name) || !description || description.length > AGENT_SKILL_DESCRIPTION_MAX_LENGTH) return null;
139
- return {
140
- name,
141
- description
142
- };
143
- }
144
125
  function toDiscoveryBytes(content) {
145
126
  if (typeof content === "string") return new TextEncoder().encode(content);
146
127
  const bytes = new Uint8Array(new ArrayBuffer(content.byteLength));
@@ -161,14 +142,14 @@ function createDocsPublishedAgentSkill(content, metadata, sha256) {
161
142
  name: metadata.name,
162
143
  type: "skill-md",
163
144
  description: metadata.description,
164
- url: `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${metadata.name}/SKILL.md`,
145
+ url: `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${encodeURIComponent(metadata.name)}/SKILL.md`,
165
146
  digest: `sha256:${sha256}`,
166
147
  content,
167
148
  sha256,
168
149
  skillDocument: content,
169
150
  files: [{
170
151
  path: "SKILL.md",
171
- url: `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${metadata.name}/SKILL.md`,
152
+ url: `${DEFAULT_AGENT_SKILLS_ROUTE_PREFIX}/${encodeURIComponent(metadata.name)}/SKILL.md`,
172
153
  mediaType: "text/markdown",
173
154
  content,
174
155
  sha256,
@@ -177,20 +158,16 @@ function createDocsPublishedAgentSkill(content, metadata, sha256) {
177
158
  };
178
159
  }
179
160
  /** Build a published skill from an exact SKILL.md document and its precomputed SHA-256. */
180
- function buildDocsPublishedAgentSkill(document, sha256) {
181
- const metadata = readAgentSkillFrontmatter(document);
182
- if (!metadata) throw new Error("The generated Agent Skills fallback must contain valid name and description frontmatter.");
161
+ function buildDocsPublishedAgentSkill(document, sha256, options = {}) {
162
+ const metadata = parseDocsAgentSkillFrontmatter(document, options);
183
163
  if (!/^[a-f0-9]{64}$/.test(sha256)) throw new Error("Agent Skill SHA-256 must be a lowercase 64-character hexadecimal digest.");
184
164
  return createDocsPublishedAgentSkill(document, metadata, sha256);
185
165
  }
186
166
  /** Select a valid public skill and hash the exact bytes returned by its standards route. */
187
167
  async function resolveDocsPublishedAgentSkill({ preferredDocument, fallbackDocument }) {
188
- const preferredMetadata = preferredDocument ? readAgentSkillFrontmatter(preferredDocument) : null;
189
- const fallbackMetadata = readAgentSkillFrontmatter(fallbackDocument);
190
- const content = preferredMetadata ? preferredDocument : fallbackDocument;
191
- const metadata = preferredMetadata ?? fallbackMetadata;
192
- if (!metadata) throw new Error("The generated Agent Skills fallback must contain valid name and description frontmatter.");
193
- return createDocsPublishedAgentSkill(content, metadata, await sha256DocsDiscoveryContent(content));
168
+ const preferredValidation = preferredDocument ? validateDocsAgentSkillFrontmatter(preferredDocument) : null;
169
+ const content = preferredValidation?.valid ? preferredDocument : fallbackDocument;
170
+ return createDocsPublishedAgentSkill(content, preferredValidation?.valid ? preferredValidation.data : parseDocsAgentSkillFrontmatter(fallbackDocument, { source: "generated Agent Skills fallback" }), await sha256DocsDiscoveryContent(content));
194
171
  }
195
172
  function buildDocsAgentSkillsIndex(skills) {
196
173
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.2.69",
3
+ "version": "0.2.71",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",
@@ -35,6 +35,11 @@
35
35
  "import": "./dist/agent-skills-bundle.mjs",
36
36
  "default": "./dist/agent-skills-bundle.mjs"
37
37
  },
38
+ "./agent-skills": {
39
+ "types": "./dist/agent-skills-spec.d.mts",
40
+ "import": "./dist/agent-skills-spec.mjs",
41
+ "default": "./dist/agent-skills-spec.mjs"
42
+ },
38
43
  "./vite": {
39
44
  "types": "./dist/agent-skills-vite.d.mts",
40
45
  "import": "./dist/agent-skills-vite.mjs",
@@ -65,6 +70,7 @@
65
70
  "gray-matter": "^4.0.3",
66
71
  "jiti": "^2.7.0",
67
72
  "picocolors": "^1.1.1",
73
+ "yaml": "^2.8.2",
68
74
  "zod": "^4.3.6"
69
75
  },
70
76
  "peerDependencies": {