@farming-labs/docs 0.2.69 → 0.2.70

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-CXkn2ihX.mjs} +1 -1
  2. package/dist/{agent-BIzynBvk.mjs → agent-MOuft73V.mjs} +2 -2
  3. package/dist/{agent-evals-DZR4J7Iz.mjs → agent-evals-BTh28hl-.mjs} +1 -1
  4. package/dist/{agent-export-C_zd18VF.mjs → agent-export-43XUqLf5.mjs} +7 -7
  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-C16sSxHU.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-WjSas47Z.mjs} +32 -15
  16. package/dist/{golden-evaluations-DK1uqjlo.mjs → golden-evaluations-Cg0braJV.mjs} +1 -1
  17. package/dist/index.d.mts +5 -4
  18. package/dist/index.mjs +8 -7
  19. package/dist/{mcp-YWlNI2d4.mjs → mcp-BDPfedoh.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-BMBvGASC.mjs} +1 -1
  23. package/dist/{reading-time-O8mYgLvH.mjs → reading-time-D0s9Osqw.mjs} +119 -7
  24. package/dist/{review-DdfvxMh2.mjs → review-_0G2gAtx.mjs} +6 -6
  25. package/dist/{robots-CD14j-mU.mjs → robots-DLl9Zizg.mjs} +3 -3
  26. package/dist/{robots-Dz5XeT8F.mjs → robots-DOnLGE0l.mjs} +2 -2
  27. package/dist/{search-DjN1Gfid.mjs → search-B9tkri5i.mjs} +6 -6
  28. package/dist/{search-DBlw9h3P.mjs → search-Boqkxa3T.mjs} +1 -1
  29. package/dist/{search-BBVD0A7O.d.mts → search-CozHzW7v.d.mts} +1 -1
  30. package/dist/server.d.mts +3 -3
  31. package/dist/server.mjs +6 -6
  32. package/dist/{sitemap-B0hlAZ8o.mjs → sitemap-FgXlxHEO.mjs} +6 -6
  33. package/dist/{sitemap-server-DQp8qUKN.mjs → sitemap-server-Bynukz-j.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,4 +1,4 @@
1
- import { F as resolveDocsDiscoveryApiRoute, O as buildDocsApiCatalog, P as isDocsStandardsDiscoveryRequest, S as DOCS_AGENT_MANIFEST_FORMAT, _ as DEFAULT_API_CATALOG_FORMAT, a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, c as DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, j as createDocsStandardsResponse, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, 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";
1
+ import { F as resolveDocsDiscoveryApiRoute, O as buildDocsApiCatalog, P as isDocsStandardsDiscoveryRequest, S as DOCS_AGENT_MANIFEST_FORMAT, _ as DEFAULT_API_CATALOG_FORMAT, a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, c as DEFAULT_AGENT_SKILLS_ARCHIVE_ROUTE_PATTERN, d as DEFAULT_AGENT_SKILLS_ROUTE_PATTERN, j as createDocsStandardsResponse, l as DEFAULT_AGENT_SKILLS_INDEX_FORMAT, 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";
2
2
  import { createProcessor } from "@mdx-js/mdx";
3
3
 
4
4
  //#region src/mcp-auth.ts
@@ -1,5 +1,5 @@
1
- import { Jt as normalizePageAgentFrontmatter, L as findDocsMarkdownPage, Zt as stripGeneratedPageAgentContractMarkdown, tt as renderDocsMarkdownDocument } from "./agent-D2SsSct2.mjs";
2
- import { _ as GENERATED_AGENT_PROVENANCE_VERSION, b as parseGeneratedAgentDocument, v as hashGeneratedAgentContent, x as serializeGeneratedAgentDocument } from "./search-DBlw9h3P.mjs";
1
+ import { Jt as normalizePageAgentFrontmatter, L as findDocsMarkdownPage, Zt as stripGeneratedPageAgentContractMarkdown, tt as renderDocsMarkdownDocument } from "./agent-CXkn2ihX.mjs";
2
+ import { _ as GENERATED_AGENT_PROVENANCE_VERSION, b as parseGeneratedAgentDocument, v as hashGeneratedAgentContent, x as serializeGeneratedAgentDocument } from "./search-Boqkxa3T.mjs";
3
3
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
4
4
  import { _ as resolveDocsContentDir, a as loadDocsConfigModule, c as loadProjectEnv, d as readNavTitle, f as readNumberProperty, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, p as readStringProperty, t as extractNestedObjectLiteral, u as readEnvReferenceProperty } from "./config-Wcdj-D0a.mjs";
5
5
  import { createRequire } from "node:module";
@@ -1,4 +1,4 @@
1
- import { m as findDocsMarkdownSection, p as resolveSearchRequestConfig, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-DBlw9h3P.mjs";
1
+ import { m as findDocsMarkdownSection, p as resolveSearchRequestConfig, t as buildDocsAskAIContext, u as performDocsSearch } from "./search-Boqkxa3T.mjs";
2
2
  import { a as normalizeAgentScopeValues, i as normalizeAgentLocale, n as agentVersionConstraintsOverlap, o as normalizeAgentVersion, r as normalizeAgentFramework, t as agentVersionConstraintMatches } from "./agent-scope-C_U--OZ7.mjs";
3
3
  import { buildDocsMcpContext } from "./mcp.mjs";
4
4
  import { i as validateCodeBlockPlans, n as planCodeBlockTargets, r as resolveDocsCodeBlocksValidateConfig, t as extractCodeBlocksFromMarkdown } from "./code-blocks-DnNVNK2M.mjs";
@@ -1,13 +1,13 @@
1
- import { $ as renderDocsAgentsDocument, At as buildDocsSitemapManifest, Ft as resolveDocsSitemapConfig, Nt as renderDocsSitemapMarkdown, Pt as renderDocsSitemapXml, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, at as resolveDocsAgentFeedbackConfig, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, et as renderDocsLlmsTxt, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, k as buildDocsAgentDiscoverySpec, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, rt as renderDocsSkillDocument, t as DEFAULT_AGENTS_MD_ROUTE, tt as renderDocsMarkdownDocument, v as DEFAULT_LLMS_TXT_ROUTE, vt as toDocsMarkdownUrl, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-D2SsSct2.mjs";
2
- import { D as buildDocsAgentSkillsIndex, E as buildDocsA2AAgentCard, I as resolveDocsPublishedAgentSkill, a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, k as buildDocsLegacySkillsIndex, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-DSVKdQrl.mjs";
3
- import "./search-DBlw9h3P.mjs";
1
+ import { $ as renderDocsAgentsDocument, At as buildDocsSitemapManifest, Ft as resolveDocsSitemapConfig, Nt as renderDocsSitemapMarkdown, Pt as renderDocsSitemapXml, S as DEFAULT_SKILL_MD_WELL_KNOWN_ROUTE, a as DEFAULT_AGENT_MD_ROUTE, at as resolveDocsAgentFeedbackConfig, c as DEFAULT_AGENT_SPEC_WELL_KNOWN_JSON_ROUTE, et as renderDocsLlmsTxt, g as DEFAULT_LLMS_FULL_TXT_WELL_KNOWN_ROUTE, h as DEFAULT_LLMS_FULL_TXT_ROUTE, k as buildDocsAgentDiscoverySpec, l as DEFAULT_AGENT_SPEC_WELL_KNOWN_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, rt as renderDocsSkillDocument, t as DEFAULT_AGENTS_MD_ROUTE, tt as renderDocsMarkdownDocument, v as DEFAULT_LLMS_TXT_ROUTE, vt as toDocsMarkdownUrl, x as DEFAULT_SKILL_MD_ROUTE, y as DEFAULT_LLMS_TXT_WELL_KNOWN_ROUTE } from "./agent-CXkn2ihX.mjs";
2
+ import { D as buildDocsAgentSkillsIndex, E as buildDocsA2AAgentCard, I as resolveDocsPublishedAgentSkill, a as DEFAULT_A2A_AGENT_CARD_ROUTE, b as DEFAULT_LEGACY_SKILLS_INDEX_ROUTE, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX, k as buildDocsLegacySkillsIndex, u as DEFAULT_AGENT_SKILLS_INDEX_ROUTE, x as DEFAULT_LEGACY_SKILLS_ROUTE_PREFIX } from "./standards-discovery-CYfiQE13.mjs";
3
+ import "./search-Boqkxa3T.mjs";
4
4
  import { t as resolveDocsI18n } from "./i18n-CCaFUnAN.mjs";
5
- 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";
6
- import "./sitemap-server-DQp8qUKN.mjs";
7
- import "./agent-evals-DZR4J7Iz.mjs";
5
+ 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-DOnLGE0l.mjs";
6
+ import "./sitemap-server-Bynukz-j.mjs";
7
+ import "./agent-evals-BTh28hl-.mjs";
8
8
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig } from "./mcp.mjs";
9
9
  import "./code-blocks-DnNVNK2M.mjs";
10
- import { t as resolveConfiguredAgentSkills } from "./agent-skills-server-iBfCLPOt.mjs";
10
+ import { t as resolveConfiguredAgentSkills } from "./agent-skills-server-B4u3qy-1.mjs";
11
11
  import "./server.mjs";
12
12
  import { _ as resolveDocsContentDir, a as loadDocsConfigModule, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, m as readTopLevelBooleanProperty, p as readStringProperty, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
13
13
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
@@ -1,4 +1,4 @@
1
- import { I as DocsPublishedAgentSkill } from "./standards-discovery-CQjJ-M2y.mjs";
1
+ import { I as DocsPublishedAgentSkill } from "./standards-discovery-C0CIC4QI.mjs";
2
2
 
3
3
  //#region src/agent-skills-bundle.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { A as buildDocsPublishedAgentSkill, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX } from "./standards-discovery-DSVKdQrl.mjs";
1
+ import { A as buildDocsPublishedAgentSkill, f as DEFAULT_AGENT_SKILLS_ROUTE_PREFIX } from "./standards-discovery-CYfiQE13.mjs";
2
2
  import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync, statSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { createHash } from "node:crypto";
@@ -329,8 +329,10 @@ function publishSkillDocumentSync(skillPath) {
329
329
  const skillDocument = readFileSync(skillPath, "utf8");
330
330
  const skillDocumentBytes = Buffer.byteLength(skillDocument, "utf8");
331
331
  if (skillDocumentBytes > MAX_FILE_BYTES) throw new Error(`Agent Skill SKILL.md exceeds ${MAX_FILE_BYTES} bytes: ${skillPath}`);
332
- const base = buildDocsPublishedAgentSkill(skillDocument, hashBytes(skillDocument));
333
- if (base.name !== path.basename(skillDir)) throw new Error(`Agent Skill frontmatter name "${base.name}" must match its directory "${path.basename(skillDir)}".`);
332
+ const base = buildDocsPublishedAgentSkill(skillDocument, hashBytes(skillDocument), {
333
+ directoryName: path.basename(skillDir),
334
+ source: skillPath
335
+ });
334
336
  const companions = readCompanionFiles(skillDir, base.name, skillDocumentBytes);
335
337
  const files = [...base.files, ...companions].sort(compareSkillFilePath);
336
338
  if (companions.length === 0) return {
@@ -356,8 +358,10 @@ async function publishSkillDocumentAsync(skillPath) {
356
358
  const skillDocument = await readFile(skillPath, "utf8");
357
359
  const skillDocumentBytes = Buffer.byteLength(skillDocument, "utf8");
358
360
  if (skillDocumentBytes > MAX_FILE_BYTES) throw new Error(`Agent Skill SKILL.md exceeds ${MAX_FILE_BYTES} bytes: ${skillPath}`);
359
- const base = buildDocsPublishedAgentSkill(skillDocument, hashBytes(skillDocument));
360
- if (base.name !== path.basename(skillDir)) throw new Error(`Agent Skill frontmatter name "${base.name}" must match its directory "${path.basename(skillDir)}".`);
361
+ const base = buildDocsPublishedAgentSkill(skillDocument, hashBytes(skillDocument), {
362
+ directoryName: path.basename(skillDir),
363
+ source: skillPath
364
+ });
361
365
  const companions = await readCompanionFilesAsync(skillDir, base.name, skillDocumentBytes);
362
366
  const files = [...base.files, ...companions].sort(compareSkillFilePath);
363
367
  if (companions.length === 0) return {
@@ -1,5 +1,5 @@
1
1
  import { $ as DocsAgentSkillsInput } from "./types-BQC05SQm.mjs";
2
- import { I as DocsPublishedAgentSkill } from "./standards-discovery-CQjJ-M2y.mjs";
2
+ import { I as DocsPublishedAgentSkill } from "./standards-discovery-C0CIC4QI.mjs";
3
3
 
4
4
  //#region src/agent-skills-server.d.ts
5
5
  interface ResolveConfiguredAgentSkillsOptions {
@@ -0,0 +1,51 @@
1
+ //#region src/agent-skills-spec.d.ts
2
+ declare const AGENT_SKILL_FRONTMATTER_FIELDS: readonly ["name", "description", "license", "compatibility", "metadata", "allowed-tools"];
3
+ declare const AGENT_SKILL_NAME_MAX_LENGTH = 64;
4
+ declare const AGENT_SKILL_DESCRIPTION_MAX_LENGTH = 1024;
5
+ declare const AGENT_SKILL_COMPATIBILITY_MAX_LENGTH = 500;
6
+ type DocsAgentSkillFrontmatterField = (typeof AGENT_SKILL_FRONTMATTER_FIELDS)[number] | "frontmatter";
7
+ interface DocsAgentSkillFrontmatter {
8
+ name: string;
9
+ description: string;
10
+ license?: string;
11
+ compatibility?: string;
12
+ metadata?: Record<string, string>;
13
+ "allowed-tools"?: string;
14
+ }
15
+ interface DocsAgentSkillFrontmatterIssue {
16
+ code: "missing-frontmatter" | "unclosed-frontmatter" | "invalid-yaml" | "invalid-mapping" | "unexpected-field" | "missing-field" | "invalid-type" | "invalid-length" | "invalid-name" | "directory-mismatch";
17
+ field: DocsAgentSkillFrontmatterField;
18
+ message: string;
19
+ }
20
+ interface DocsAgentSkillFrontmatterValidationOptions {
21
+ /** Parent directory name, when the document came from a skill directory. */
22
+ directoryName?: string;
23
+ /** Human-readable file or generated-document label used in thrown diagnostics. */
24
+ source?: string;
25
+ }
26
+ type DocsAgentSkillFrontmatterValidation = {
27
+ valid: true;
28
+ data: DocsAgentSkillFrontmatter;
29
+ issues: readonly [];
30
+ } | {
31
+ valid: false;
32
+ data: null;
33
+ issues: readonly DocsAgentSkillFrontmatterIssue[];
34
+ };
35
+ /**
36
+ * Check the Agent Skills name grammar after NFKC normalization.
37
+ *
38
+ * The official reference validator accepts Unicode lowercase letters and numbers
39
+ * in addition to the ASCII examples documented by the specification.
40
+ */
41
+ declare function isDocsAgentSkillName(value: unknown): value is string;
42
+ /** Validate one SKILL.md document against the complete Agent Skills frontmatter contract. */
43
+ declare function validateDocsAgentSkillFrontmatter(document: string, options?: DocsAgentSkillFrontmatterValidationOptions): DocsAgentSkillFrontmatterValidation;
44
+ declare class DocsAgentSkillFrontmatterError extends Error {
45
+ readonly issues: readonly DocsAgentSkillFrontmatterIssue[];
46
+ constructor(issues: readonly DocsAgentSkillFrontmatterIssue[], options?: DocsAgentSkillFrontmatterValidationOptions);
47
+ }
48
+ /** Parse valid frontmatter or throw a structured, field-specific validation error. */
49
+ declare function parseDocsAgentSkillFrontmatter(document: string, options?: DocsAgentSkillFrontmatterValidationOptions): DocsAgentSkillFrontmatter;
50
+ //#endregion
51
+ export { AGENT_SKILL_COMPATIBILITY_MAX_LENGTH, AGENT_SKILL_DESCRIPTION_MAX_LENGTH, AGENT_SKILL_FRONTMATTER_FIELDS, AGENT_SKILL_NAME_MAX_LENGTH, DocsAgentSkillFrontmatter, DocsAgentSkillFrontmatterError, DocsAgentSkillFrontmatterField, DocsAgentSkillFrontmatterIssue, DocsAgentSkillFrontmatterValidation, DocsAgentSkillFrontmatterValidationOptions, isDocsAgentSkillName, parseDocsAgentSkillFrontmatter, validateDocsAgentSkillFrontmatter };
@@ -0,0 +1,284 @@
1
+ import { isMap, isScalar, parseDocument } from "yaml";
2
+
3
+ //#region src/agent-skills-spec.ts
4
+ const AGENT_SKILL_FRONTMATTER_FIELDS = [
5
+ "name",
6
+ "description",
7
+ "license",
8
+ "compatibility",
9
+ "metadata",
10
+ "allowed-tools"
11
+ ];
12
+ const AGENT_SKILL_NAME_MAX_LENGTH = 64;
13
+ const AGENT_SKILL_DESCRIPTION_MAX_LENGTH = 1024;
14
+ const AGENT_SKILL_COMPATIBILITY_MAX_LENGTH = 500;
15
+ const AGENT_SKILL_FRONTMATTER_FIELD_SET = new Set(AGENT_SKILL_FRONTMATTER_FIELDS);
16
+ const FRONTMATTER_OPEN_PATTERN = /^---[ \t]*(?:\r?\n)/u;
17
+ const FRONTMATTER_CLOSE_PATTERN = /^---[ \t]*(?:\r?\n|$)/mu;
18
+ const UNICODE_ALPHANUMERIC_PATTERN = /^[\p{L}\p{N}]$/u;
19
+ function characterCount(value) {
20
+ return Array.from(value).length;
21
+ }
22
+ function asRecord(value) {
23
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
24
+ return value;
25
+ }
26
+ function hasOwn(value, field) {
27
+ return Object.prototype.hasOwnProperty.call(value, field);
28
+ }
29
+ function yamlErrorMessage(error) {
30
+ return (error instanceof Error ? error.message : String(error)).trim() || "unknown YAML parser error";
31
+ }
32
+ function findYamlMappingValue(mapping, field) {
33
+ return mapping.items.find((pair) => isScalar(pair.key) && pair.key.value === field)?.value;
34
+ }
35
+ /**
36
+ * Check the Agent Skills name grammar after NFKC normalization.
37
+ *
38
+ * The official reference validator accepts Unicode lowercase letters and numbers
39
+ * in addition to the ASCII examples documented by the specification.
40
+ */
41
+ function isDocsAgentSkillName(value) {
42
+ if (typeof value !== "string") return false;
43
+ const normalized = value.normalize("NFKC");
44
+ const characters = Array.from(normalized);
45
+ return characters.length > 0 && characters.length <= AGENT_SKILL_NAME_MAX_LENGTH && normalized === normalized.toLowerCase() && !normalized.startsWith("-") && !normalized.endsWith("-") && !normalized.includes("--") && characters.every((character) => character === "-" || UNICODE_ALPHANUMERIC_PATTERN.test(character));
46
+ }
47
+ function validateName(data, options, issues) {
48
+ if (!hasOwn(data, "name")) {
49
+ issues.push({
50
+ code: "missing-field",
51
+ field: "name",
52
+ message: "Missing required field in frontmatter: name"
53
+ });
54
+ return null;
55
+ }
56
+ if (typeof data.name !== "string" || data.name.trim().length === 0) {
57
+ issues.push({
58
+ code: "invalid-type",
59
+ field: "name",
60
+ message: "Field 'name' must be a non-empty string"
61
+ });
62
+ return null;
63
+ }
64
+ const name = data.name.normalize("NFKC");
65
+ const length = characterCount(name);
66
+ if (length > AGENT_SKILL_NAME_MAX_LENGTH) issues.push({
67
+ code: "invalid-length",
68
+ field: "name",
69
+ message: `Skill name '${name}' exceeds ${AGENT_SKILL_NAME_MAX_LENGTH} character limit (${length} chars)`
70
+ });
71
+ if (name !== name.toLowerCase()) issues.push({
72
+ code: "invalid-name",
73
+ field: "name",
74
+ message: `Skill name '${name}' must be lowercase`
75
+ });
76
+ if (name.startsWith("-") || name.endsWith("-")) issues.push({
77
+ code: "invalid-name",
78
+ field: "name",
79
+ message: "Skill name cannot start or end with a hyphen"
80
+ });
81
+ if (name.includes("--")) issues.push({
82
+ code: "invalid-name",
83
+ field: "name",
84
+ message: "Skill name cannot contain consecutive hyphens"
85
+ });
86
+ if (!Array.from(name).every((character) => character === "-" || UNICODE_ALPHANUMERIC_PATTERN.test(character))) issues.push({
87
+ code: "invalid-name",
88
+ field: "name",
89
+ message: `Skill name '${name}' contains invalid characters. Only letters, digits, and hyphens are allowed.`
90
+ });
91
+ if (options.directoryName !== void 0 && options.directoryName.normalize("NFKC") !== name) issues.push({
92
+ code: "directory-mismatch",
93
+ field: "name",
94
+ message: `Agent Skill frontmatter name "${name}" must match its directory "${options.directoryName}".`
95
+ });
96
+ return name;
97
+ }
98
+ function validateDescription(data, issues) {
99
+ if (!hasOwn(data, "description")) {
100
+ issues.push({
101
+ code: "missing-field",
102
+ field: "description",
103
+ message: "Missing required field in frontmatter: description"
104
+ });
105
+ return null;
106
+ }
107
+ if (typeof data.description !== "string" || data.description.trim().length === 0) {
108
+ issues.push({
109
+ code: "invalid-type",
110
+ field: "description",
111
+ message: "Field 'description' must be a non-empty string"
112
+ });
113
+ return null;
114
+ }
115
+ const length = characterCount(data.description);
116
+ if (length > AGENT_SKILL_DESCRIPTION_MAX_LENGTH) issues.push({
117
+ code: "invalid-length",
118
+ field: "description",
119
+ message: `Description exceeds ${AGENT_SKILL_DESCRIPTION_MAX_LENGTH} character limit (${length} chars)`
120
+ });
121
+ return data.description;
122
+ }
123
+ function validateOptionalFields(data, frontmatter, issues) {
124
+ const result = {};
125
+ if (hasOwn(data, "license")) if (typeof data.license !== "string") issues.push({
126
+ code: "invalid-type",
127
+ field: "license",
128
+ message: "Field 'license' must be a string"
129
+ });
130
+ else result.license = data.license;
131
+ if (hasOwn(data, "compatibility")) if (typeof data.compatibility !== "string") issues.push({
132
+ code: "invalid-type",
133
+ field: "compatibility",
134
+ message: "Field 'compatibility' must be a string"
135
+ });
136
+ else {
137
+ const length = characterCount(data.compatibility);
138
+ if (data.compatibility.trim().length === 0) issues.push({
139
+ code: "invalid-length",
140
+ field: "compatibility",
141
+ message: "Field 'compatibility' must contain at least 1 character"
142
+ });
143
+ else if (length > AGENT_SKILL_COMPATIBILITY_MAX_LENGTH) issues.push({
144
+ code: "invalid-length",
145
+ field: "compatibility",
146
+ message: `Compatibility exceeds ${AGENT_SKILL_COMPATIBILITY_MAX_LENGTH} character limit (${length} chars)`
147
+ });
148
+ result.compatibility = data.compatibility;
149
+ }
150
+ if (hasOwn(data, "metadata")) {
151
+ const metadataNode = findYamlMappingValue(frontmatter, "metadata");
152
+ const metadata = asRecord(data.metadata);
153
+ if (!isMap(metadataNode) || !metadata) issues.push({
154
+ code: "invalid-type",
155
+ field: "metadata",
156
+ message: "Field 'metadata' must be a mapping from string keys to string values"
157
+ });
158
+ else {
159
+ if (metadataNode.items.some((pair) => !isScalar(pair.key) || typeof pair.key.value !== "string")) issues.push({
160
+ code: "invalid-type",
161
+ field: "metadata",
162
+ message: "Field 'metadata' keys must be strings"
163
+ });
164
+ const invalidKeys = Object.keys(metadata).filter((key) => typeof metadata[key] !== "string").sort();
165
+ for (const key of invalidKeys) issues.push({
166
+ code: "invalid-type",
167
+ field: "metadata",
168
+ message: `Field 'metadata.${key}' must be a string`
169
+ });
170
+ result.metadata = Object.fromEntries(Object.entries(metadata).filter((entry) => {
171
+ return typeof entry[1] === "string";
172
+ }));
173
+ }
174
+ }
175
+ if (hasOwn(data, "allowed-tools")) if (typeof data["allowed-tools"] !== "string") issues.push({
176
+ code: "invalid-type",
177
+ field: "allowed-tools",
178
+ message: "Field 'allowed-tools' must be a space-separated string"
179
+ });
180
+ else result["allowed-tools"] = data["allowed-tools"];
181
+ return result;
182
+ }
183
+ /** Validate one SKILL.md document against the complete Agent Skills frontmatter contract. */
184
+ function validateDocsAgentSkillFrontmatter(document, options = {}) {
185
+ const issues = [];
186
+ const opening = document.match(FRONTMATTER_OPEN_PATTERN);
187
+ if (!opening) return {
188
+ valid: false,
189
+ data: null,
190
+ issues: [{
191
+ code: "missing-frontmatter",
192
+ field: "frontmatter",
193
+ message: "SKILL.md must start with YAML frontmatter (---)"
194
+ }]
195
+ };
196
+ const remainder = document.slice(opening[0].length);
197
+ const closing = FRONTMATTER_CLOSE_PATTERN.exec(remainder);
198
+ if (!closing) return {
199
+ valid: false,
200
+ data: null,
201
+ issues: [{
202
+ code: "unclosed-frontmatter",
203
+ field: "frontmatter",
204
+ message: "SKILL.md frontmatter not properly closed with ---"
205
+ }]
206
+ };
207
+ let data;
208
+ let frontmatter;
209
+ try {
210
+ const parsed = parseDocument(remainder.slice(0, closing.index), { uniqueKeys: true });
211
+ if (parsed.errors.length > 0) throw parsed.errors[0];
212
+ if (!isMap(parsed.contents)) return {
213
+ valid: false,
214
+ data: null,
215
+ issues: [{
216
+ code: "invalid-mapping",
217
+ field: "frontmatter",
218
+ message: "SKILL.md frontmatter must be a YAML mapping"
219
+ }]
220
+ };
221
+ frontmatter = parsed.contents;
222
+ data = asRecord(parsed.toJS());
223
+ } catch (error) {
224
+ return {
225
+ valid: false,
226
+ data: null,
227
+ issues: [{
228
+ code: "invalid-yaml",
229
+ field: "frontmatter",
230
+ message: `Invalid YAML in frontmatter: ${yamlErrorMessage(error)}`
231
+ }]
232
+ };
233
+ }
234
+ if (!data) return {
235
+ valid: false,
236
+ data: null,
237
+ issues: [{
238
+ code: "invalid-mapping",
239
+ field: "frontmatter",
240
+ message: "SKILL.md frontmatter must be a YAML mapping"
241
+ }]
242
+ };
243
+ const unexpectedFields = Object.keys(data).filter((field) => !AGENT_SKILL_FRONTMATTER_FIELD_SET.has(field)).sort();
244
+ if (unexpectedFields.length > 0) issues.push({
245
+ code: "unexpected-field",
246
+ field: "frontmatter",
247
+ message: `Unexpected fields in frontmatter: ${unexpectedFields.join(", ")}. Only ${JSON.stringify([...AGENT_SKILL_FRONTMATTER_FIELDS])} are allowed.`
248
+ });
249
+ const name = validateName(data, options, issues);
250
+ const description = validateDescription(data, issues);
251
+ const optionalFields = validateOptionalFields(data, frontmatter, issues);
252
+ if (issues.length > 0 || name === null || description === null) return {
253
+ valid: false,
254
+ data: null,
255
+ issues
256
+ };
257
+ return {
258
+ valid: true,
259
+ data: {
260
+ name,
261
+ description,
262
+ ...optionalFields
263
+ },
264
+ issues: []
265
+ };
266
+ }
267
+ var DocsAgentSkillFrontmatterError = class extends Error {
268
+ issues;
269
+ constructor(issues, options = {}) {
270
+ const source = options.source ? ` in ${options.source}` : "";
271
+ super(`Invalid Agent Skill frontmatter${source}:\n${issues.map((issue) => `- ${issue.message}`).join("\n")}`);
272
+ this.name = "DocsAgentSkillFrontmatterError";
273
+ this.issues = issues;
274
+ }
275
+ };
276
+ /** Parse valid frontmatter or throw a structured, field-specific validation error. */
277
+ function parseDocsAgentSkillFrontmatter(document, options = {}) {
278
+ const validation = validateDocsAgentSkillFrontmatter(document, options);
279
+ if (!validation.valid) throw new DocsAgentSkillFrontmatterError(validation.issues, options);
280
+ return validation.data;
281
+ }
282
+
283
+ //#endregion
284
+ export { AGENT_SKILL_COMPATIBILITY_MAX_LENGTH, AGENT_SKILL_DESCRIPTION_MAX_LENGTH, AGENT_SKILL_FRONTMATTER_FIELDS, AGENT_SKILL_NAME_MAX_LENGTH, DocsAgentSkillFrontmatterError, isDocsAgentSkillName, parseDocsAgentSkillFrontmatter, validateDocsAgentSkillFrontmatter };
@@ -1,6 +1,6 @@
1
1
  import { $ as DocsAgentSkillsInput } from "./types-BQC05SQm.mjs";
2
- import { I as DocsPublishedAgentSkill } from "./standards-discovery-CQjJ-M2y.mjs";
3
- import { t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-DJXdK_hS.mjs";
2
+ import { I as DocsPublishedAgentSkill } from "./standards-discovery-C0CIC4QI.mjs";
3
+ import { t as ResolveConfiguredAgentSkillsOptions } from "./agent-skills-server-DTwblsLu.mjs";
4
4
 
5
5
  //#region src/agent-skills-vite.d.ts
6
6
  declare const DOCS_AGENT_SKILLS_BUNDLE_MODULE = "@farming-labs/docs/agent-skills-bundle";
@@ -1,5 +1,5 @@
1
- import "./standards-discovery-DSVKdQrl.mjs";
2
- import { t as resolveConfiguredAgentSkills } from "./agent-skills-server-iBfCLPOt.mjs";
1
+ import "./standards-discovery-CYfiQE13.mjs";
2
+ import { t as resolveConfiguredAgentSkills } from "./agent-skills-server-B4u3qy-1.mjs";
3
3
 
4
4
  //#region src/agent-skills-vite.ts
5
5
  const DOCS_AGENT_SKILLS_BUNDLE_MODULE = "@farming-labs/docs/agent-skills-bundle";
@@ -1,11 +1,11 @@
1
- import { $ as renderDocsAgentsDocument, a as DEFAULT_AGENT_MD_ROUTE, at as resolveDocsAgentFeedbackConfig, b as DEFAULT_OPENAPI_SCHEMA_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE } from "./agent-D2SsSct2.mjs";
2
- import "./standards-discovery-DSVKdQrl.mjs";
3
- import "./search-DBlw9h3P.mjs";
4
- import { S as resolveApiReferenceConfig } from "./sitemap-server-DQp8qUKN.mjs";
5
- import "./agent-evals-DZR4J7Iz.mjs";
1
+ import { $ as renderDocsAgentsDocument, a as DEFAULT_AGENT_MD_ROUTE, at as resolveDocsAgentFeedbackConfig, b as DEFAULT_OPENAPI_SCHEMA_ROUTE, n as DEFAULT_AGENTS_MD_WELL_KNOWN_ROUTE, o as DEFAULT_AGENT_MD_WELL_KNOWN_ROUTE, t as DEFAULT_AGENTS_MD_ROUTE } from "./agent-CXkn2ihX.mjs";
2
+ import "./standards-discovery-CYfiQE13.mjs";
3
+ import "./search-Boqkxa3T.mjs";
4
+ import { S as resolveApiReferenceConfig } from "./sitemap-server-Bynukz-j.mjs";
5
+ import "./agent-evals-BTh28hl-.mjs";
6
6
  import { resolveDocsMcpConfig } 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 { 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";
@@ -139,10 +139,10 @@ async function main() {
139
139
  printCloudHelp();
140
140
  process.exit(1);
141
141
  } else if (parsedCommand.command === "mcp") {
142
- const { runMcp } = await import("../mcp-YWlNI2d4.mjs");
142
+ const { runMcp } = await import("../mcp-BDPfedoh.mjs");
143
143
  await runMcp(mcpOptions);
144
144
  } else if (parsedCommand.command === "agent" && subcommand === "compact") {
145
- const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-BIzynBvk.mjs").then((n) => n.t);
145
+ const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-MOuft73V.mjs").then((n) => n.t);
146
146
  const agentCompactOptions = parseAgentCompactArgs(args.slice(2));
147
147
  if (agentCompactOptions.help) {
148
148
  printAgentCompactHelp();
@@ -150,7 +150,7 @@ async function main() {
150
150
  }
151
151
  await compactAgentDocs(agentCompactOptions);
152
152
  } else if (parsedCommand.command === "agent" && subcommand === "export") {
153
- const { exportAgentBundle, parseAgentExportArgs, printAgentExportHelp } = await import("../agent-export-C_zd18VF.mjs");
153
+ const { exportAgentBundle, parseAgentExportArgs, printAgentExportHelp } = await import("../agent-export-43XUqLf5.mjs");
154
154
  const agentExportOptions = parseAgentExportArgs(args.slice(2));
155
155
  if (agentExportOptions.help) {
156
156
  printAgentExportHelp();
@@ -160,13 +160,13 @@ async function main() {
160
160
  } else if (parsedCommand.command === "agent") {
161
161
  console.error(pc.red(`Unknown agent subcommand: ${subcommand ?? "(missing)"}`));
162
162
  console.error();
163
- const { printAgentCompactHelp } = await import("../agent-BIzynBvk.mjs").then((n) => n.t);
164
- const { printAgentExportHelp } = await import("../agent-export-C_zd18VF.mjs");
163
+ const { printAgentCompactHelp } = await import("../agent-MOuft73V.mjs").then((n) => n.t);
164
+ const { printAgentExportHelp } = await import("../agent-export-43XUqLf5.mjs");
165
165
  printAgentCompactHelp();
166
166
  printAgentExportHelp();
167
167
  process.exit(1);
168
168
  } else if (parsedCommand.command === "agents" && subcommand === "generate") {
169
- const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-BR5tSkbq.mjs");
169
+ const { generateAgents, parseAgentsGenerateArgs, printAgentsGenerateHelp } = await import("../agents-C16sSxHU.mjs");
170
170
  const agentsOptions = parseAgentsGenerateArgs(args.slice(2));
171
171
  if (agentsOptions.help) {
172
172
  printAgentsGenerateHelp();
@@ -176,11 +176,11 @@ async function main() {
176
176
  } else if (parsedCommand.command === "agents") {
177
177
  console.error(pc.red(`Unknown agents subcommand: ${subcommand ?? "(missing)"}`));
178
178
  console.error();
179
- const { printAgentsGenerateHelp } = await import("../agents-BR5tSkbq.mjs");
179
+ const { printAgentsGenerateHelp } = await import("../agents-C16sSxHU.mjs");
180
180
  printAgentsGenerateHelp();
181
181
  process.exit(1);
182
182
  } else if (parsedCommand.command === "doctor") {
183
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-CVhU0YKo.mjs");
183
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-WjSas47Z.mjs");
184
184
  const doctorOptions = parseDoctorArgs(args.slice(1));
185
185
  if (doctorOptions.help) {
186
186
  printDoctorHelp();
@@ -188,7 +188,7 @@ async function main() {
188
188
  }
189
189
  await runDoctor(doctorOptions);
190
190
  } else if (parsedCommand.command === "review") {
191
- const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-DdfvxMh2.mjs");
191
+ const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-_0G2gAtx.mjs");
192
192
  const reviewOptions = parseReviewArgs(args.slice(1));
193
193
  if (reviewOptions.help) {
194
194
  printReviewHelp();
@@ -210,7 +210,7 @@ async function main() {
210
210
  printCodeBlocksValidateHelp();
211
211
  process.exit(1);
212
212
  } else if (parsedCommand.command === "search" && subcommand === "sync") {
213
- const { syncSearch } = await import("../search-DjN1Gfid.mjs");
213
+ const { syncSearch } = await import("../search-B9tkri5i.mjs");
214
214
  await syncSearch(searchSyncOptions);
215
215
  } else if (parsedCommand.command === "search") {
216
216
  console.error(pc.red(`Unknown search subcommand: ${subcommand ?? "(missing)"}`));
@@ -218,7 +218,7 @@ async function main() {
218
218
  printHelp();
219
219
  process.exit(1);
220
220
  } else if (parsedCommand.command === "sitemap" && subcommand === "generate") {
221
- const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-B0hlAZ8o.mjs");
221
+ const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-FgXlxHEO.mjs");
222
222
  const sitemapOptions = parseSitemapGenerateArgs(args.slice(2));
223
223
  if (sitemapOptions.help) {
224
224
  printSitemapGenerateHelp();
@@ -228,11 +228,11 @@ async function main() {
228
228
  } else if (parsedCommand.command === "sitemap") {
229
229
  console.error(pc.red(`Unknown sitemap subcommand: ${subcommand ?? "(missing)"}`));
230
230
  console.error();
231
- const { printSitemapGenerateHelp } = await import("../sitemap-B0hlAZ8o.mjs");
231
+ const { printSitemapGenerateHelp } = await import("../sitemap-FgXlxHEO.mjs");
232
232
  printSitemapGenerateHelp();
233
233
  process.exit(1);
234
234
  } else if (parsedCommand.command === "robots" && subcommand === "generate") {
235
- const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-CD14j-mU.mjs");
235
+ const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-DLl9Zizg.mjs");
236
236
  const robotsOptions = parseRobotsGenerateArgs(args.slice(2));
237
237
  if (robotsOptions.help) {
238
238
  printRobotsGenerateHelp();
@@ -242,7 +242,7 @@ async function main() {
242
242
  } else if (parsedCommand.command === "robots") {
243
243
  console.error(pc.red(`Unknown robots subcommand: ${subcommand ?? "(missing)"}`));
244
244
  console.error();
245
- const { printRobotsGenerateHelp } = await import("../robots-CD14j-mU.mjs");
245
+ const { printRobotsGenerateHelp } = await import("../robots-DLl9Zizg.mjs");
246
246
  printRobotsGenerateHelp();
247
247
  process.exit(1);
248
248
  } else if (parsedCommand.command === "downgrade") {
@@ -1,5 +1,5 @@
1
1
  import { at as DocsAnalyticsEventInput, it as DocsAnalyticsEvent, rt as DocsAnalyticsConfig } from "./types-BQC05SQm.mjs";
2
- import { n as DocsCloudAskAIResponseOptions, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-BD1SeVZv.mjs";
2
+ import { n as DocsCloudAskAIResponseOptions, t as DocsCloudAskAIConfig } from "./cloud-ask-ai-BfnX18rI.mjs";
3
3
 
4
4
  //#region src/docs-cloud-server.d.ts
5
5
  type DocsCloudRuntimeValue<T = string> = T | undefined | null | (() => T | undefined | null);