@farming-labs/docs 0.2.63 → 0.2.65

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.
@@ -106,10 +106,10 @@ async function main() {
106
106
  ]
107
107
  };
108
108
  if (!parsedCommand.command || parsedCommand.command === "init") {
109
- const { init } = await import("../init-CQY0Woe3.mjs");
109
+ const { init } = await import("../init-DAkI0Lkf.mjs");
110
110
  await init(initOptions);
111
111
  } else if (parsedCommand.command === "dev") {
112
- const { dev } = await import("../dev-Cmy6DtdF.mjs");
112
+ const { dev } = await import("../dev-Cc1cFFj-.mjs");
113
113
  await dev(devOptions);
114
114
  } else if (parsedCommand.command === "deploy") {
115
115
  const { runCloudDeploy } = await import("../cloud-pdNC-tyj.mjs");
@@ -180,7 +180,7 @@ async function main() {
180
180
  printAgentsGenerateHelp();
181
181
  process.exit(1);
182
182
  } else if (parsedCommand.command === "doctor") {
183
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-CJqtzKZT.mjs");
183
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-DtGYZ41i.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-Fndl5brR.mjs");
191
+ const { parseReviewArgs, printReviewHelp, runReview } = await import("../review-CLoHTywU.mjs");
192
192
  const reviewOptions = parseReviewArgs(args.slice(1));
193
193
  if (reviewOptions.help) {
194
194
  printReviewHelp();
@@ -1,5 +1,5 @@
1
1
  import { i as detectPackageManagerFromProject } from "./utils-DpiIioYb.mjs";
2
- import { Ct as tsconfigTemplate, Y as rootLayoutTemplate, g as docsLayoutTemplate, q as postcssConfigTemplate, v as globalCssTemplate } from "./templates-Bq_P7ctv.mjs";
2
+ import { Ct as tsconfigTemplate, Y as rootLayoutTemplate, g as docsLayoutTemplate, q as postcssConfigTemplate, v as globalCssTemplate } from "./templates-C6avM0U3.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import { spawn } from "node:child_process";
@@ -71,7 +71,7 @@ const DEFAULT_API_REFERENCE_ROOT = "api-reference";
71
71
  const DEFAULT_MANAGED_OPENAPI_ENDPOINT = "/api/docs/openapi";
72
72
  const DEFAULT_THEME_PRESET = "default";
73
73
  const DEFAULT_POLL_INTERVAL_MS = 750;
74
- const DEFAULT_NEXT_VERSION = "16.2.3";
74
+ const DEFAULT_NEXT_VERSION = "16.2.11";
75
75
  const DEFAULT_REACT_VERSION = "^19.2.0";
76
76
  const DEFAULT_TAILWIND_VERSION = "^4.1.18";
77
77
  const DEFAULT_POSTCSS_VERSION = "^8.5.6";
@@ -13,7 +13,7 @@ import "./agent-skills-server-DraIb6FV.mjs";
13
13
  import "./server.mjs";
14
14
  import { _ as resolveDocsContentDir, d as readNavTitle, g as resolveDocsConfigPath, h as readTopLevelStringProperty, l as readBooleanProperty, r as extractTopLevelConfigObject, s as loadDocsConfigModuleResultWithProjectEnv, t as extractNestedObjectLiteral } from "./config-Wcdj-D0a.mjs";
15
15
  import { t as detectFramework } from "./utils-DpiIioYb.mjs";
16
- import { i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-Dsvh0etV.mjs";
16
+ import { i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-Dj-9Eo3v.mjs";
17
17
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
18
18
  import path from "node:path";
19
19
  import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js";
@@ -210,6 +210,94 @@ const PACKAGE_MANAGER_OPTIONS_WITH_VALUES = new Set([
210
210
  "-F",
211
211
  "-w"
212
212
  ]);
213
+ const CURL_OPTIONS_WITH_VALUES = new Set([
214
+ "--cacert",
215
+ "--cert",
216
+ "--connect-timeout",
217
+ "--data",
218
+ "--data-ascii",
219
+ "--data-binary",
220
+ "--data-raw",
221
+ "--data-urlencode",
222
+ "--form",
223
+ "--header",
224
+ "--json",
225
+ "--key",
226
+ "--max-time",
227
+ "--output",
228
+ "--request",
229
+ "--resolve",
230
+ "--retry",
231
+ "--retry-delay",
232
+ "--url",
233
+ "--user",
234
+ "--user-agent"
235
+ ]);
236
+ const CURL_OPTIONS_WITHOUT_VALUES = new Set([
237
+ "--compressed",
238
+ "--fail",
239
+ "--fail-with-body",
240
+ "--head",
241
+ "--include",
242
+ "--insecure",
243
+ "--location",
244
+ "--show-error",
245
+ "--silent",
246
+ "--verbose"
247
+ ]);
248
+ const CURL_SHORT_OPTIONS_WITH_VALUES = new Set([
249
+ "A",
250
+ "d",
251
+ "F",
252
+ "H",
253
+ "o",
254
+ "u",
255
+ "X"
256
+ ]);
257
+ const CURL_SHORT_OPTIONS_WITHOUT_VALUES = new Set([
258
+ "f",
259
+ "I",
260
+ "i",
261
+ "k",
262
+ "L",
263
+ "s",
264
+ "S",
265
+ "v"
266
+ ]);
267
+ const TEST_UNARY_OPERATORS = new Set([
268
+ "-b",
269
+ "-c",
270
+ "-d",
271
+ "-e",
272
+ "-f",
273
+ "-g",
274
+ "-h",
275
+ "-L",
276
+ "-n",
277
+ "-p",
278
+ "-r",
279
+ "-S",
280
+ "-s",
281
+ "-t",
282
+ "-u",
283
+ "-w",
284
+ "-x",
285
+ "-z"
286
+ ]);
287
+ const TEST_BINARY_OPERATORS = new Set([
288
+ "=",
289
+ "==",
290
+ "!=",
291
+ "-ef",
292
+ "-eq",
293
+ "-ge",
294
+ "-gt",
295
+ "-le",
296
+ "-lt",
297
+ "-ne",
298
+ "-nt",
299
+ "-ot"
300
+ ]);
213
301
  function isAgentContextVisible(scopes) {
214
302
  return scopes.every((scope) => scope.only === void 0 || scope.only === "agent");
215
303
  }
@@ -274,7 +362,8 @@ function analyzeAgentUsefulness(options) {
274
362
  const rootDir = path.resolve(options.rootDir);
275
363
  const packageManager = options.packageManager ?? detectPackageManager(rootDir);
276
364
  const knownDocsCommands = new Set([...DEFAULT_DOCS_COMMANDS, ...options.knownDocsCommands ?? []]);
277
- const packageManifests = readProjectPackageManifests(rootDir);
365
+ const workspaceRoot = findEnclosingWorkspaceRoot(rootDir);
366
+ const packageManifests = readProjectPackageManifests(workspaceRoot);
278
367
  const pages = options.pages.map((page) => analyzePage(page));
279
368
  const findings = [];
280
369
  const unhealthyCommandKeys = /* @__PURE__ */ new Set();
@@ -345,7 +434,8 @@ function analyzeAgentUsefulness(options) {
345
434
  rootDir,
346
435
  packageManager,
347
436
  knownDocsCommands,
348
- packageManifests
437
+ packageManifests,
438
+ workspaceRoot
349
439
  });
350
440
  if (commandAnalysis.status === "unhealthy") unhealthyCommandKeys.add(commandKey);
351
441
  if (commandAnalysis.status === "unverified") unverifiedCommandKeys.add(commandKey);
@@ -620,6 +710,14 @@ function analyzeCommand(options) {
620
710
  }));
621
711
  return commandAnalysis(findings);
622
712
  }
713
+ if (hasUnsupportedShellControlSyntax(executableCommand)) {
714
+ findings.push(commandFinding(options, {
715
+ code: "command-unverified",
716
+ severity: "suggestion",
717
+ message: "Compound commands, redirections, and shell expansions are not executed or inferred; this command is unverified."
718
+ }));
719
+ return commandAnalysis(findings);
720
+ }
623
721
  const tokens = tokenizeShellCommand(executableCommand);
624
722
  const commandPackageManager = readCommandPackageManager(tokens);
625
723
  const expectedPackageManager = options.command.packageManagerHint ?? (options.command.source === "contract" ? options.packageManager : void 0);
@@ -629,7 +727,7 @@ function analyzeCommand(options) {
629
727
  message: `Command uses ${commandPackageManager}, but ${expectedPackageManager} is expected for this project or code block.`
630
728
  }));
631
729
  const workspaceSelection = readWorkspaceSelection(tokens, commandPackageManager);
632
- const workspaceResolution = resolveWorkspaceSelection(workspaceSelection, options.packageManifests, options.rootDir);
730
+ const workspaceResolution = resolveWorkspaceSelection(workspaceSelection, options.packageManifests, options.rootDir, options.workspaceRoot);
633
731
  if (workspaceResolution.status === "unresolved") {
634
732
  const selectors = workspaceSelection.selectors.length ? workspaceSelection.selectors.join(", ") : "all workspaces";
635
733
  findings.push(commandFinding(options, {
@@ -660,7 +758,7 @@ function analyzeCommand(options) {
660
758
  severity: "error",
661
759
  message: `Command references an unknown docs CLI command: docs ${docsCommand}`
662
760
  }));
663
- if (isStaticallyKnownPackageManagerCommand(tokens) || isVersionProbe(tokens)) verificationEstablished = true;
761
+ if (isStaticallyKnownPackageManagerCommand(tokens) || isVersionProbe(tokens) || isStaticallyValidCurlCommand(tokens) || isStaticallyValidShellBuiltin(tokens, resolvedCwd, options.rootDir) || isStaticallyValidAgentToolCommand(tokens)) verificationEstablished = true;
664
762
  if (!verificationEstablished && findings.length === 0) findings.push(commandFinding(options, {
665
763
  code: "command-unverified",
666
764
  severity: "suggestion",
@@ -894,9 +992,74 @@ function detectPackageManager(rootDir) {
894
992
  const declared = typeof packageJson?.packageManager === "string" ? packageJson.packageManager : "";
895
993
  return /^(npm|pnpm|yarn|bun)@/.exec(declared)?.[1];
896
994
  }
995
+ function findEnclosingWorkspaceRoot(startDir) {
996
+ const repositoryBoundary = findNearestGitBoundary(startDir);
997
+ let current = startDir;
998
+ let traversed = 0;
999
+ while (true) {
1000
+ if (existsSync(path.join(current, "pnpm-workspace.yaml")) || existsSync(path.join(current, "pnpm-workspace.yml"))) return current;
1001
+ const workspaces = readJsonFile(path.join(current, "package.json"))?.workspaces;
1002
+ if (Array.isArray(workspaces) || workspaces !== null && typeof workspaces === "object" && !Array.isArray(workspaces)) return current;
1003
+ if (current === repositoryBoundary || !repositoryBoundary && traversed >= 12) return startDir;
1004
+ const parent = path.dirname(current);
1005
+ if (parent === current) return startDir;
1006
+ current = parent;
1007
+ traversed += 1;
1008
+ }
1009
+ }
1010
+ function findNearestGitBoundary(startDir) {
1011
+ let current = startDir;
1012
+ while (true) {
1013
+ if (existsSync(path.join(current, ".git"))) return current;
1014
+ const parent = path.dirname(current);
1015
+ if (parent === current) return void 0;
1016
+ current = parent;
1017
+ }
1018
+ }
897
1019
  function normalizeShellCommand(command) {
898
1020
  return command.trim().replace(/^\$\s*/, "");
899
1021
  }
1022
+ function hasUnsupportedShellControlSyntax(command) {
1023
+ let quote;
1024
+ let escaped = false;
1025
+ for (let index = 0; index < command.length; index += 1) {
1026
+ const character = command[index] ?? "";
1027
+ if (escaped) {
1028
+ escaped = false;
1029
+ continue;
1030
+ }
1031
+ if (character === "\\") {
1032
+ escaped = true;
1033
+ continue;
1034
+ }
1035
+ if (quote) {
1036
+ if (character === quote) quote = void 0;
1037
+ continue;
1038
+ }
1039
+ if (character === "'" || character === "\"") {
1040
+ quote = character;
1041
+ continue;
1042
+ }
1043
+ if (character === "<") {
1044
+ const placeholder = /^<[A-Za-z0-9._-]+>/.exec(command.slice(index))?.[0];
1045
+ if (placeholder) {
1046
+ index += placeholder.length - 1;
1047
+ continue;
1048
+ }
1049
+ }
1050
+ if ([
1051
+ "&",
1052
+ "|",
1053
+ ";",
1054
+ "<",
1055
+ ">",
1056
+ "`",
1057
+ "\n",
1058
+ "\r"
1059
+ ].includes(character) || character === "$" && command[index + 1] === "(") return true;
1060
+ }
1061
+ return Boolean(quote || escaped);
1062
+ }
900
1063
  function tokenizeShellCommand(command) {
901
1064
  return command.match(/"[^"]*"|'[^']*'|[^\s]+/g)?.map(stripShellQuotes) ?? [];
902
1065
  }
@@ -1071,7 +1234,126 @@ function isVersionProbe(tokens) {
1071
1234
  "yarn"
1072
1235
  ].includes(tokens[0] ?? "") && ["--version", "-v"].includes(tokens[1] ?? "");
1073
1236
  }
1074
- function resolveWorkspaceSelection(selection, manifests, rootDir) {
1237
+ function isStaticallyValidCurlCommand(tokens) {
1238
+ if (tokens[0] !== "curl") return false;
1239
+ let urls = 0;
1240
+ let parseOptions = true;
1241
+ for (let index = 1; index < tokens.length; index += 1) {
1242
+ const token = tokens[index] ?? "";
1243
+ if (parseOptions && token === "--") {
1244
+ parseOptions = false;
1245
+ continue;
1246
+ }
1247
+ if (parseOptions && token.startsWith("--")) {
1248
+ const equalsIndex = token.indexOf("=");
1249
+ const option = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;
1250
+ const inlineValue = equalsIndex >= 0 ? token.slice(equalsIndex + 1) : void 0;
1251
+ if (CURL_OPTIONS_WITHOUT_VALUES.has(option)) {
1252
+ if (inlineValue !== void 0) return false;
1253
+ continue;
1254
+ }
1255
+ if (!CURL_OPTIONS_WITH_VALUES.has(option)) return false;
1256
+ const value = inlineValue ?? tokens[index + 1];
1257
+ if (!value || !inlineValue && value.startsWith("-")) return false;
1258
+ if (inlineValue === void 0) index += 1;
1259
+ if (!isValidCurlOptionValue(option, value)) return false;
1260
+ if (option === "--url") urls += 1;
1261
+ continue;
1262
+ }
1263
+ if (parseOptions && token.startsWith("-") && token !== "-") {
1264
+ const shortOptions = token.slice(1);
1265
+ if (!shortOptions) return false;
1266
+ let consumed = false;
1267
+ for (let offset = 0; offset < shortOptions.length; offset += 1) {
1268
+ const option = shortOptions[offset] ?? "";
1269
+ if (CURL_SHORT_OPTIONS_WITHOUT_VALUES.has(option)) continue;
1270
+ if (!CURL_SHORT_OPTIONS_WITH_VALUES.has(option)) return false;
1271
+ const inlineValue = shortOptions.slice(offset + 1);
1272
+ const value = inlineValue || tokens[index + 1];
1273
+ if (!value || !inlineValue && value.startsWith("-")) return false;
1274
+ if (!inlineValue) index += 1;
1275
+ if (!isValidCurlOptionValue(`-${option}`, value)) return false;
1276
+ consumed = true;
1277
+ break;
1278
+ }
1279
+ if (consumed || [...shortOptions].every((item) => CURL_SHORT_OPTIONS_WITHOUT_VALUES.has(item))) continue;
1280
+ return false;
1281
+ }
1282
+ if (!isHttpUrl(token)) return false;
1283
+ urls += 1;
1284
+ }
1285
+ return urls > 0;
1286
+ }
1287
+ function isValidCurlOptionValue(option, value) {
1288
+ if (option === "--url") return isHttpUrl(value);
1289
+ if (option === "--request" || option === "-X") return /^[A-Z]+$/i.test(value);
1290
+ if (option === "--header" || option === "-H") return /^[^:\s][^:]*:\s*.*$/.test(value);
1291
+ if (option === "--connect-timeout" || option === "--max-time") return /^\d+(?:\.\d+)?$/.test(value);
1292
+ if (option === "--retry" || option === "--retry-delay") return /^\d+$/.test(value);
1293
+ return value.length > 0;
1294
+ }
1295
+ function isHttpUrl(value) {
1296
+ try {
1297
+ const url = new URL(value);
1298
+ return (url.protocol === "http:" || url.protocol === "https:") && Boolean(url.hostname);
1299
+ } catch {
1300
+ return false;
1301
+ }
1302
+ }
1303
+ function isStaticallyValidShellBuiltin(tokens, cwd, rootDir) {
1304
+ const command = tokens[0];
1305
+ const args = tokens.slice(1);
1306
+ if (command === "echo") return true;
1307
+ if (command === "printf") return args.length > 0;
1308
+ if (command === "pwd") return args.every((argument) => argument === "-L" || argument === "-P");
1309
+ if (command === "export" || command === "unset") {
1310
+ if (args.length === 0) return false;
1311
+ return args.every((argument) => command === "export" ? /^[A-Za-z_][A-Za-z0-9_]*(?:=.*)?$/.test(argument) : /^[A-Za-z_][A-Za-z0-9_]*$/.test(argument));
1312
+ }
1313
+ if (command === "test") return isValidTestExpression(args);
1314
+ if (command === "[") return args.at(-1) === "]" && isValidTestExpression(args.slice(0, -1));
1315
+ if (command !== "cd" || args.length !== 1) return false;
1316
+ const target = args[0] ?? "";
1317
+ if (!target || target === "-" || path.isAbsolute(target) || /[$*?[\]{}]/.test(target)) return false;
1318
+ return isPathInside(rootDir, path.resolve(cwd, target));
1319
+ }
1320
+ function isValidTestExpression(args) {
1321
+ if (args[0] === "!") return args.length > 1 && isValidTestExpression(args.slice(1));
1322
+ if (args.length === 1) return true;
1323
+ if (args.length === 2) return TEST_UNARY_OPERATORS.has(args[0] ?? "");
1324
+ return args.length === 3 && TEST_BINARY_OPERATORS.has(args[1] ?? "");
1325
+ }
1326
+ function isStaticallyValidAgentToolCommand(tokens) {
1327
+ return isStaticallyValidSkillsCommand(tokens) || isStaticallyValidClaudeMcpCommand(tokens);
1328
+ }
1329
+ function isStaticallyValidSkillsCommand(tokens) {
1330
+ const invocation = unwrapDownloadRunner(tokens);
1331
+ if (!invocation || !/^skills(?:@(?:latest|\d+(?:\.\d+){0,2}))?$/.test(invocation[0] ?? "")) return false;
1332
+ if (invocation.length !== 3 || invocation[1] !== "add") return false;
1333
+ const source = invocation[2] ?? "";
1334
+ if (/^https:\/\/(?:www\.)?github\.com\/[^/\s]+\/[^/\s]+(?:\.git)?(?:#[^\s]+)?$/.test(source)) return true;
1335
+ return /^@?[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:#[A-Za-z0-9._/-]+)?$/.test(source);
1336
+ }
1337
+ function unwrapDownloadRunner(tokens) {
1338
+ const runner = tokens[0];
1339
+ if (runner === "skills") return tokens;
1340
+ if (runner === "npx" || runner === "pnpx" || runner === "bunx") return tokens.slice(1);
1341
+ if (runner === "npm" && tokens[1] === "exec" && tokens[2] === "--") return tokens.slice(3);
1342
+ if ((runner === "pnpm" || runner === "yarn" || runner === "bun") && ["dlx", "x"].includes(tokens[1] ?? "")) return tokens.slice(2);
1343
+ }
1344
+ function isStaticallyValidClaudeMcpCommand(tokens) {
1345
+ if (tokens.length !== 5 || tokens[0] !== "claude" || tokens[1] !== "mcp" || tokens[2] !== "add-json" || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(tokens[3] ?? "")) return false;
1346
+ try {
1347
+ const config = JSON.parse(tokens[4] ?? "");
1348
+ if (!config || typeof config !== "object" || Array.isArray(config)) return false;
1349
+ if (config.type === "http" || config.type === "sse") return typeof config.url === "string" && isHttpUrl(config.url);
1350
+ if (config.type !== "stdio" || typeof config.command !== "string" || !config.command.trim()) return false;
1351
+ return config.args === void 0 || Array.isArray(config.args) && config.args.every((argument) => typeof argument === "string");
1352
+ } catch {
1353
+ return false;
1354
+ }
1355
+ }
1356
+ function resolveWorkspaceSelection(selection, manifests, rootDir, workspaceRoot) {
1075
1357
  if (!selection.requested) return {
1076
1358
  status: "none",
1077
1359
  manifests: []
@@ -1092,8 +1374,8 @@ function resolveWorkspaceSelection(selection, manifests, rootDir) {
1092
1374
  resolved.push(namedManifest);
1093
1375
  continue;
1094
1376
  }
1095
- const selectorPath = path.resolve(rootDir, selector);
1096
- const pathManifest = [...manifests.values()].find((manifest) => path.resolve(manifest.directory) === selectorPath);
1377
+ const selectorPaths = Array.from(new Set([path.resolve(rootDir, selector), path.resolve(workspaceRoot, selector)]));
1378
+ const pathManifest = [...manifests.values()].find((manifest) => selectorPaths.includes(path.resolve(manifest.directory)));
1097
1379
  if (!pathManifest) return {
1098
1380
  status: "unresolved",
1099
1381
  manifests: []
@@ -1,5 +1,5 @@
1
1
  import { a as devInstallCommand, c as fileExists, d as readFileSafe, f as spawnAndWaitFor, i as detectPackageManagerFromProject, l as formatPackageManagerDetection, n as detectGlobalCssFiles, o as exec, p as writeFileSafe, r as detectNextAppDir, t as detectFramework, u as installCommand } from "./utils-DpiIioYb.mjs";
2
- import { $ as svelteDocsLayoutServerTemplate, A as injectTanstackVitePlugins, B as nuxtGlobalCssTemplate, C as injectDocsAgentSkillsVitePlugin, Ct as tsconfigTemplate, D as injectSvelteCssImport, E as injectRootProviderIntoLayout, F as nextLocaleDocPageTemplate, G as nuxtServerDocsPublicMiddlewareTemplate, H as nuxtQuickstartPageTemplate, I as nextLocalizedPageTemplate, J as quickstartPageTemplate, K as nuxtWelcomePageTemplate, L as nuxtConfigTemplate, M as nextApiReferencePageTemplate, N as nextConfigMergedTemplate, O as injectSvelteDocsPublicHook, P as nextConfigTemplate, Q as svelteDocsConfigTemplate, R as nuxtDocsConfigTemplate, S as injectCssImport, St as tanstackWelcomePageTemplate, T as injectNuxtCssImport, U as nuxtServerApiDocsRouteTemplate, V as nuxtInstallationPageTemplate, W as nuxtServerApiReferenceRouteTemplate, X as svelteApiReferenceRouteTemplate, Y as rootLayoutTemplate, Z as svelteDocsApiRouteTemplate, _ as getAstroAdapterPkg, _t as tanstackDocsServerTemplate, a as astroDocsIndexTemplate, at as svelteInstallationPageTemplate, b as injectAstroCssImport, bt as tanstackRootRouteTemplate, c as astroDocsServerTemplate, ct as svelteViteConfigTemplate, d as astroQuickstartPageTemplate, dt as tanstackApiReferenceRouteTemplate, et as svelteDocsLayoutTemplate, f as astroWelcomePageTemplate, ft as tanstackDocsCatchAllRouteTemplate, g as docsLayoutTemplate, gt as tanstackDocsPublicRouteTemplate, h as docsConfigTemplate, ht as tanstackDocsIndexRouteTemplate, i as astroDocsConfigTemplate, it as svelteGlobalCssTemplate, j as installationPageTemplate, k as injectTanstackRootProviderIntoRoute, l as astroGlobalCssTemplate, lt as svelteWelcomePageTemplate, m as customThemeTsTemplate, mt as tanstackDocsFunctionsTemplate, n as astroApiRouteTemplate, nt as svelteDocsPublicHookTemplate, o as astroDocsMiddlewareTemplate, ot as svelteQuickstartPageTemplate, p as customThemeCssTemplate, pt as tanstackDocsConfigTemplate, q as postcssConfigTemplate, r as astroConfigTemplate, rt as svelteDocsServerTemplate, s as astroDocsPageTemplate, st as svelteRootLayoutTemplate, t as astroApiReferenceRouteTemplate, tt as svelteDocsPageTemplate, u as astroInstallationPageTemplate, ut as tanstackApiDocsRouteTemplate, v as globalCssTemplate, vt as tanstackInstallationPageTemplate, w as injectNuxtAgentSkillsPlugin, wt as welcomePageTemplate, x as injectAstroDocsMiddleware, xt as tanstackViteConfigTemplate, y as injectAstroAgentSkillsPlugin, yt as tanstackQuickstartPageTemplate, z as nuxtDocsPageTemplate } from "./templates-Bq_P7ctv.mjs";
2
+ import { $ as svelteDocsLayoutServerTemplate, A as injectTanstackVitePlugins, B as nuxtGlobalCssTemplate, C as injectDocsAgentSkillsVitePlugin, Ct as tsconfigTemplate, D as injectSvelteCssImport, E as injectRootProviderIntoLayout, F as nextLocaleDocPageTemplate, G as nuxtServerDocsPublicMiddlewareTemplate, H as nuxtQuickstartPageTemplate, I as nextLocalizedPageTemplate, J as quickstartPageTemplate, K as nuxtWelcomePageTemplate, L as nuxtConfigTemplate, M as nextApiReferencePageTemplate, N as nextConfigMergedTemplate, O as injectSvelteDocsPublicHook, P as nextConfigTemplate, Q as svelteDocsConfigTemplate, R as nuxtDocsConfigTemplate, S as injectCssImport, St as tanstackWelcomePageTemplate, T as injectNuxtCssImport, U as nuxtServerApiDocsRouteTemplate, V as nuxtInstallationPageTemplate, W as nuxtServerApiReferenceRouteTemplate, X as svelteApiReferenceRouteTemplate, Y as rootLayoutTemplate, Z as svelteDocsApiRouteTemplate, _ as getAstroAdapterPkg, _t as tanstackDocsServerTemplate, a as astroDocsIndexTemplate, at as svelteInstallationPageTemplate, b as injectAstroCssImport, bt as tanstackRootRouteTemplate, c as astroDocsServerTemplate, ct as svelteViteConfigTemplate, d as astroQuickstartPageTemplate, dt as tanstackApiReferenceRouteTemplate, et as svelteDocsLayoutTemplate, f as astroWelcomePageTemplate, ft as tanstackDocsCatchAllRouteTemplate, g as docsLayoutTemplate, gt as tanstackDocsPublicRouteTemplate, h as docsConfigTemplate, ht as tanstackDocsIndexRouteTemplate, i as astroDocsConfigTemplate, it as svelteGlobalCssTemplate, j as installationPageTemplate, k as injectTanstackRootProviderIntoRoute, l as astroGlobalCssTemplate, lt as svelteWelcomePageTemplate, m as customThemeTsTemplate, mt as tanstackDocsFunctionsTemplate, n as astroApiRouteTemplate, nt as svelteDocsPublicHookTemplate, o as astroDocsMiddlewareTemplate, ot as svelteQuickstartPageTemplate, p as customThemeCssTemplate, pt as tanstackDocsConfigTemplate, q as postcssConfigTemplate, r as astroConfigTemplate, rt as svelteDocsServerTemplate, s as astroDocsPageTemplate, st as svelteRootLayoutTemplate, t as astroApiReferenceRouteTemplate, tt as svelteDocsPageTemplate, u as astroInstallationPageTemplate, ut as tanstackApiDocsRouteTemplate, v as globalCssTemplate, vt as tanstackInstallationPageTemplate, w as injectNuxtAgentSkillsPlugin, wt as welcomePageTemplate, x as injectAstroDocsMiddleware, xt as tanstackViteConfigTemplate, y as injectAstroAgentSkillsPlugin, yt as tanstackQuickstartPageTemplate, z as nuxtDocsPageTemplate } from "./templates-C6avM0U3.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import pc from "picocolors";
@@ -7,7 +7,7 @@ import { createFilesystemDocsMcpSource, getDocsConfigSchema, resolveDocsMcpConfi
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-Dsvh0etV.mjs";
10
+ import { a as extractAgentBlocks, i as createAgentUsefulnessPagesFromMcp, n as analyzeAgentSurfaceDrift, r as analyzeAgentUsefulness, t as resolveGoldenEvaluationInput } from "./golden-evaluations-Dj-9Eo3v.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";
@@ -831,6 +831,13 @@ export const Route = createFileRoute("${entryUrl}/$")({
831
831
  }
832
832
  return undefined;
833
833
  },
834
+ HEAD: async ({ request }) => {
835
+ const url = new URL(request.url);
836
+ if (isDocsPublicGetRequest(${JSON.stringify(opts.entry)}, url, request, { sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
837
+ return docsServer.HEAD({ request });
838
+ }
839
+ return undefined;
840
+ },
834
841
  },
835
842
  },
836
843
  loader: async ({ location }) => {
@@ -871,13 +878,28 @@ function DocsCatchAllPage() {
871
878
  function tanstackApiDocsRouteTemplate(useAlias, filePath) {
872
879
  return `\
873
880
  import { createFileRoute } from "@tanstack/react-router";
881
+ import { isDocsStandardsDiscoveryRequest } from "@farming-labs/docs";
874
882
  import { docsServer } from "${useAlias ? "@/lib/docs.server" : relativeImport(filePath, "src/lib/docs.server.ts")}";
883
+ import docsConfig from "${tanstackDocsConfigImport(filePath)}";
884
+
885
+ async function handleUnsupportedDocsMethod(request: Request) {
886
+ const url = new URL(request.url);
887
+ if (isDocsStandardsDiscoveryRequest(url, { apiRoute: docsConfig.cloud?.apiRoute })) {
888
+ return docsServer.GET({ request });
889
+ }
890
+ return new Response("Method Not Allowed", {
891
+ status: 405,
892
+ headers: { Allow: "GET, HEAD, POST" },
893
+ });
894
+ }
875
895
 
876
896
  export const Route = createFileRoute("/api/docs")({
877
897
  server: {
878
898
  handlers: {
879
899
  GET: async ({ request }) => docsServer.GET({ request }),
900
+ HEAD: async ({ request }) => docsServer.HEAD({ request }),
880
901
  POST: async ({ request }) => docsServer.POST({ request }),
902
+ ANY: async ({ request }) => handleUnsupportedDocsMethod(request),
881
903
  },
882
904
  },
883
905
  });
@@ -886,7 +908,7 @@ export const Route = createFileRoute("/api/docs")({
886
908
  function tanstackDocsPublicRouteTemplate(useAlias, filePath, entry) {
887
909
  return `\
888
910
  import { createFileRoute } from "@tanstack/react-router";
889
- import { isDocsMcpRequest, isDocsPublicGetRequest } from "@farming-labs/docs";
911
+ import { isDocsMcpRequest, isDocsPublicGetRequest, isDocsStandardsDiscoveryRequest } from "@farming-labs/docs";
890
912
  import { docsServer } from "${useAlias ? "@/lib/docs.server" : relativeImport(filePath, "src/lib/docs.server.ts")}";
891
913
  import docsConfig from "${tanstackDocsConfigImport(filePath)}";
892
914
 
@@ -907,10 +929,16 @@ async function handlePublicDocsRequest(request: Request) {
907
929
  });
908
930
  }
909
931
 
910
- if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, url, request, { sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
932
+ if (isDocsStandardsDiscoveryRequest(url, { apiRoute: docsConfig.cloud?.apiRoute })) {
933
+ if (method === "HEAD") return docsServer.HEAD({ request });
934
+ if (method === "POST") return docsServer.POST({ request });
911
935
  return docsServer.GET({ request });
912
936
  }
913
937
 
938
+ if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, url, request, { apiRoute: docsConfig.cloud?.apiRoute, sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
939
+ return method === "HEAD" ? docsServer.HEAD({ request }) : docsServer.GET({ request });
940
+ }
941
+
914
942
  return new Response("Not Found", { status: 404 });
915
943
  }
916
944
 
@@ -918,9 +946,11 @@ export const Route = createFileRoute("/$")({
918
946
  server: {
919
947
  handlers: {
920
948
  GET: async ({ request }) => handlePublicDocsRequest(request),
949
+ HEAD: async ({ request }) => handlePublicDocsRequest(request),
921
950
  POST: async ({ request }) => handlePublicDocsRequest(request),
922
951
  DELETE: async ({ request }) => handlePublicDocsRequest(request),
923
952
  OPTIONS: async ({ request }) => handlePublicDocsRequest(request),
953
+ ANY: async ({ request }) => handlePublicDocsRequest(request),
924
954
  },
925
955
  },
926
956
  });
@@ -1288,7 +1318,7 @@ const contentFiles = import.meta.glob(["/${cfg.entry ?? "docs"}/**/*.{md,mdx,svx
1288
1318
  eager: true,
1289
1319
  }) as Record<string, string>;
1290
1320
 
1291
- export const { load, GET, POST, MCP } = createDocsServer({
1321
+ export const { load, GET, HEAD, POST, MCP } = createDocsServer({
1292
1322
  ...config,
1293
1323
  _preloadedContent: contentFiles,
1294
1324
  _preloadedAgentSkills: bundledAgentSkills,
@@ -1336,16 +1366,16 @@ export const GET = createSvelteApiReference(config);
1336
1366
  }
1337
1367
  function svelteDocsApiRouteTemplate(filePath, useAlias) {
1338
1368
  return `\
1339
- export { GET, POST } from "${svelteRouteServerImport(filePath, useAlias)}";
1369
+ export { GET, HEAD, POST } from "${svelteRouteServerImport(filePath, useAlias)}";
1340
1370
  `;
1341
1371
  }
1342
1372
  function svelteDocsPublicHookTemplate(filePath, useAlias) {
1343
1373
  const serverImport = svelteRouteServerImport(filePath, useAlias);
1344
1374
  return `\
1345
- import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest } from "@farming-labs/docs";
1375
+ import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest, isDocsStandardsDiscoveryRequest } from "@farming-labs/docs";
1346
1376
  import type { Handle } from "@sveltejs/kit";
1347
1377
  import config from "${svelteRouteConfigImport(filePath, useAlias)}";
1348
- import { GET, MCP } from "${serverImport}";
1378
+ import { GET, HEAD, POST, MCP } from "${serverImport}";
1349
1379
 
1350
1380
  const docsEntry = config.entry ?? "docs";
1351
1381
 
@@ -1363,13 +1393,21 @@ export const handle: Handle = async ({ event, resolve }) => {
1363
1393
  });
1364
1394
  }
1365
1395
 
1366
- if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(event.url, config.llmsTxt, docsEntry)) {
1396
+ if (isDocsStandardsDiscoveryRequest(event.url, { apiRoute: config.cloud?.apiRoute })) {
1397
+ if (method === "HEAD") return HEAD({ url: event.url, request: event.request });
1398
+ if (method === "POST") return POST({ url: event.url, request: event.request });
1399
+ return GET({ url: event.url, request: event.request });
1400
+ }
1401
+
1402
+ if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(event.url, config.llmsTxt, docsEntry, { apiRoute: config.cloud?.apiRoute })) {
1367
1403
  const nativeResponse = await resolve(event);
1368
1404
  if (nativeResponse.status !== 404) return nativeResponse;
1369
1405
  }
1370
1406
 
1371
- if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, event.url, event.request, { sitemap: config.sitemap, llms: config.llmsTxt, robots: config.robots })) {
1372
- return GET({ url: event.url, request: event.request });
1407
+ if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, event.url, event.request, { apiRoute: config.cloud?.apiRoute, sitemap: config.sitemap, llms: config.llmsTxt, robots: config.robots })) {
1408
+ return method === "HEAD"
1409
+ ? HEAD({ url: event.url, request: event.request })
1410
+ : GET({ url: event.url, request: event.request });
1373
1411
  }
1374
1412
 
1375
1413
  return resolve(event);
@@ -1394,11 +1432,11 @@ function injectSvelteDocsPublicHook(content, filePath, useAlias) {
1394
1432
  break;
1395
1433
  }
1396
1434
  const imports = [
1397
- "import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest } from \"@farming-labs/docs\";",
1435
+ "import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest, isDocsStandardsDiscoveryRequest } from \"@farming-labs/docs\";",
1398
1436
  ...next.includes("Handle") ? [] : ["import type { Handle } from \"@sveltejs/kit\";"],
1399
1437
  ...hasExistingHandle && !next.includes("sequence") ? ["import { sequence } from \"@sveltejs/kit/hooks\";"] : [],
1400
1438
  `import docsConfig from "${configImport}";`,
1401
- `import { GET as docsGET, MCP as docsMCP } from "${serverImport}";`
1439
+ `import { GET as docsGET, HEAD as docsHEAD, POST as docsPOST, MCP as docsMCP } from "${serverImport}";`
1402
1440
  ];
1403
1441
  const docsHandle = `\
1404
1442
  const docsEntry = docsConfig.entry ?? "docs";
@@ -1417,13 +1455,21 @@ const docsPublicHandle: Handle = async ({ event, resolve }) => {
1417
1455
  });
1418
1456
  }
1419
1457
 
1420
- if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(event.url, docsConfig.llmsTxt, docsEntry)) {
1458
+ if (isDocsStandardsDiscoveryRequest(event.url, { apiRoute: docsConfig.cloud?.apiRoute })) {
1459
+ if (method === "HEAD") return docsHEAD({ url: event.url, request: event.request });
1460
+ if (method === "POST") return docsPOST({ url: event.url, request: event.request });
1461
+ return docsGET({ url: event.url, request: event.request });
1462
+ }
1463
+
1464
+ if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(event.url, docsConfig.llmsTxt, docsEntry, { apiRoute: docsConfig.cloud?.apiRoute })) {
1421
1465
  const nativeResponse = await resolve(event);
1422
1466
  if (nativeResponse.status !== 404) return nativeResponse;
1423
1467
  }
1424
1468
 
1425
- if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, event.url, event.request, { sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
1426
- return docsGET({ url: event.url, request: event.request });
1469
+ if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, event.url, event.request, { apiRoute: docsConfig.cloud?.apiRoute, sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
1470
+ return method === "HEAD"
1471
+ ? docsHEAD({ url: event.url, request: event.request })
1472
+ : docsGET({ url: event.url, request: event.request });
1427
1473
  }
1428
1474
 
1429
1475
  return resolve(event);
@@ -1706,7 +1752,7 @@ const contentFiles = import.meta.glob(["/${cfg.entry ?? "docs"}/**/*.{md,mdx}",
1706
1752
  eager: true,
1707
1753
  }) as Record<string, string>;
1708
1754
 
1709
- export const { load, GET, POST, MCP } = createDocsServer({
1755
+ export const { load, GET, HEAD, POST, MCP } = createDocsServer({
1710
1756
  ...config,
1711
1757
  _preloadedContent: contentFiles,
1712
1758
  _preloadedAgentSkills: bundledAgentSkills,
@@ -1827,12 +1873,16 @@ const data = await load(Astro.url.pathname);
1827
1873
  function astroApiRouteTemplate(cfg) {
1828
1874
  return `\
1829
1875
  import type { APIRoute } from "astro";
1830
- import { GET as docsGET, POST as docsPOST } from "${astroPageServerImport(cfg.useAlias, 2)}";
1876
+ import { GET as docsGET, HEAD as docsHEAD, POST as docsPOST } from "${astroPageServerImport(cfg.useAlias, 2)}";
1831
1877
 
1832
1878
  export const GET: APIRoute = async ({ request }) => {
1833
1879
  return docsGET({ request });
1834
1880
  };
1835
1881
 
1882
+ export const HEAD: APIRoute = async ({ request }) => {
1883
+ return docsHEAD({ request });
1884
+ };
1885
+
1836
1886
  export const POST: APIRoute = async ({ request }) => {
1837
1887
  return docsPOST({ request });
1838
1888
  };
@@ -1841,10 +1891,10 @@ export const POST: APIRoute = async ({ request }) => {
1841
1891
  function astroDocsMiddlewareTemplate(filePath, useAlias) {
1842
1892
  const serverImport = astroRouteServerImport(filePath, useAlias);
1843
1893
  return `\
1844
- import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest } from "@farming-labs/docs";
1894
+ import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest, isDocsStandardsDiscoveryRequest } from "@farming-labs/docs";
1845
1895
  import type { MiddlewareHandler } from "astro";
1846
1896
  import config from "${astroRouteConfigImport(filePath, useAlias)}";
1847
- import { GET, MCP } from "${serverImport}";
1897
+ import { GET, HEAD, POST, MCP } from "${serverImport}";
1848
1898
 
1849
1899
  const docsEntry = config.entry ?? "docs";
1850
1900
 
@@ -1862,13 +1912,21 @@ export const onRequest: MiddlewareHandler = async (context, next) => {
1862
1912
  });
1863
1913
  }
1864
1914
 
1865
- if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(context.url, config.llmsTxt, docsEntry)) {
1915
+ if (isDocsStandardsDiscoveryRequest(context.url, { apiRoute: config.cloud?.apiRoute })) {
1916
+ if (method === "HEAD") return HEAD({ request: context.request });
1917
+ if (method === "POST") return POST({ request: context.request });
1918
+ return GET({ request: context.request });
1919
+ }
1920
+
1921
+ if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(context.url, config.llmsTxt, docsEntry, { apiRoute: config.cloud?.apiRoute })) {
1866
1922
  const nativeResponse = await next();
1867
1923
  if (nativeResponse.status !== 404) return nativeResponse;
1868
1924
  }
1869
1925
 
1870
- if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, context.url, context.request, { sitemap: config.sitemap, llms: config.llmsTxt, robots: config.robots })) {
1871
- return GET({ request: context.request });
1926
+ if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, context.url, context.request, { apiRoute: config.cloud?.apiRoute, sitemap: config.sitemap, llms: config.llmsTxt, robots: config.robots })) {
1927
+ return method === "HEAD"
1928
+ ? HEAD({ request: context.request })
1929
+ : GET({ request: context.request });
1872
1930
  }
1873
1931
 
1874
1932
  return next();
@@ -1893,11 +1951,11 @@ function injectAstroDocsMiddleware(content, filePath, useAlias) {
1893
1951
  break;
1894
1952
  }
1895
1953
  const imports = [
1896
- "import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest } from \"@farming-labs/docs\";",
1954
+ "import { isDocsLlmsTxtPublicRequest, isDocsMcpRequest, isDocsPublicGetRequest, isDocsStandardsDiscoveryRequest } from \"@farming-labs/docs\";",
1897
1955
  ...next.includes("MiddlewareHandler") ? [] : ["import type { MiddlewareHandler } from \"astro\";"],
1898
1956
  ...hasExistingMiddleware && !next.includes("sequence") ? ["import { sequence } from \"astro:middleware\";"] : [],
1899
1957
  `import docsConfig from "${configImport}";`,
1900
- `import { GET as docsGET, MCP as docsMCP } from "${serverImport}";`
1958
+ `import { GET as docsGET, HEAD as docsHEAD, POST as docsPOST, MCP as docsMCP } from "${serverImport}";`
1901
1959
  ];
1902
1960
  const docsMiddleware = `\
1903
1961
  const docsEntry = docsConfig.entry ?? "docs";
@@ -1916,13 +1974,21 @@ const docsPublicMiddleware: MiddlewareHandler = async (context, next) => {
1916
1974
  });
1917
1975
  }
1918
1976
 
1919
- if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(context.url, docsConfig.llmsTxt, docsEntry)) {
1977
+ if (isDocsStandardsDiscoveryRequest(context.url, { apiRoute: docsConfig.cloud?.apiRoute })) {
1978
+ if (method === "HEAD") return docsHEAD({ request: context.request });
1979
+ if (method === "POST") return docsPOST({ request: context.request });
1980
+ return docsGET({ request: context.request });
1981
+ }
1982
+
1983
+ if ((method === "GET" || method === "HEAD") && isDocsLlmsTxtPublicRequest(context.url, docsConfig.llmsTxt, docsEntry, { apiRoute: docsConfig.cloud?.apiRoute })) {
1920
1984
  const nativeResponse = await next();
1921
1985
  if (nativeResponse.status !== 404) return nativeResponse;
1922
1986
  }
1923
1987
 
1924
- if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, context.url, context.request, { sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
1925
- return docsGET({ request: context.request });
1988
+ if ((method === "GET" || method === "HEAD") && isDocsPublicGetRequest(docsEntry, context.url, context.request, { apiRoute: docsConfig.cloud?.apiRoute, sitemap: docsConfig.sitemap, llms: docsConfig.llmsTxt, robots: docsConfig.robots })) {
1989
+ return method === "HEAD"
1990
+ ? docsHEAD({ request: context.request })
1991
+ : docsGET({ request: context.request });
1926
1992
  }
1927
1993
 
1928
1994
  return next();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.2.63",
3
+ "version": "0.2.65",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",