@farming-labs/docs 0.1.89 → 0.1.90

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.
@@ -5,7 +5,7 @@ import "./index.mjs";
5
5
  import "./sitemap-server-DwEPfk13.mjs";
6
6
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
7
7
  import "./server.mjs";
8
- import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, l as readNumberProperty, o as readBooleanProperty, p as resolveDocsContentDir, s as readEnvReferenceProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-BR6CcCfr.mjs";
8
+ import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, l as readNumberProperty, o as readBooleanProperty, p as resolveDocsContentDir, s as readEnvReferenceProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-UI31_wlO.mjs";
9
9
  import matter from "gray-matter";
10
10
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
11
11
  import path from "node:path";
@@ -83,10 +83,10 @@ async function main() {
83
83
  const { dev } = await import("../dev-B5L7k3b6.mjs");
84
84
  await dev(devOptions);
85
85
  } else if (parsedCommand.command === "mcp") {
86
- const { runMcp } = await import("../mcp-RBCFEtoX.mjs");
86
+ const { runMcp } = await import("../mcp-OuciCVEf.mjs");
87
87
  await runMcp(mcpOptions);
88
88
  } else if (parsedCommand.command === "agent" && subcommand === "compact") {
89
- const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-B-CYVd4D.mjs");
89
+ const { compactAgentDocs, parseAgentCompactArgs, printAgentCompactHelp } = await import("../agent-ByVfHy7k.mjs");
90
90
  const agentCompactOptions = parseAgentCompactArgs(args.slice(2));
91
91
  if (agentCompactOptions.help) {
92
92
  printAgentCompactHelp();
@@ -96,11 +96,11 @@ async function main() {
96
96
  } else if (parsedCommand.command === "agent") {
97
97
  console.error(pc.red(`Unknown agent subcommand: ${subcommand ?? "(missing)"}`));
98
98
  console.error();
99
- const { printAgentCompactHelp } = await import("../agent-B-CYVd4D.mjs");
99
+ const { printAgentCompactHelp } = await import("../agent-ByVfHy7k.mjs");
100
100
  printAgentCompactHelp();
101
101
  process.exit(1);
102
102
  } else if (parsedCommand.command === "doctor") {
103
- const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-B8bT0Aol.mjs");
103
+ const { parseDoctorArgs, printDoctorHelp, runDoctor } = await import("../doctor-Zn6h4wkZ.mjs");
104
104
  const doctorOptions = parseDoctorArgs(args.slice(1));
105
105
  if (doctorOptions.help) {
106
106
  printDoctorHelp();
@@ -108,7 +108,7 @@ async function main() {
108
108
  }
109
109
  await runDoctor(doctorOptions);
110
110
  } else if (parsedCommand.command === "search" && subcommand === "sync") {
111
- const { syncSearch } = await import("../search-DrTVZ2XK.mjs");
111
+ const { syncSearch } = await import("../search-CHiEEXZI.mjs");
112
112
  await syncSearch(searchSyncOptions);
113
113
  } else if (parsedCommand.command === "search") {
114
114
  console.error(pc.red(`Unknown search subcommand: ${subcommand ?? "(missing)"}`));
@@ -116,7 +116,7 @@ async function main() {
116
116
  printHelp();
117
117
  process.exit(1);
118
118
  } else if (parsedCommand.command === "sitemap" && subcommand === "generate") {
119
- const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-CEE2vnGz.mjs");
119
+ const { generateSitemap, parseSitemapGenerateArgs, printSitemapGenerateHelp } = await import("../sitemap-Bk9HqW_J.mjs");
120
120
  const sitemapOptions = parseSitemapGenerateArgs(args.slice(2));
121
121
  if (sitemapOptions.help) {
122
122
  printSitemapGenerateHelp();
@@ -126,11 +126,11 @@ async function main() {
126
126
  } else if (parsedCommand.command === "sitemap") {
127
127
  console.error(pc.red(`Unknown sitemap subcommand: ${subcommand ?? "(missing)"}`));
128
128
  console.error();
129
- const { printSitemapGenerateHelp } = await import("../sitemap-CEE2vnGz.mjs");
129
+ const { printSitemapGenerateHelp } = await import("../sitemap-Bk9HqW_J.mjs");
130
130
  printSitemapGenerateHelp();
131
131
  process.exit(1);
132
132
  } else if (parsedCommand.command === "robots" && subcommand === "generate") {
133
- const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-NI6VU8rj.mjs");
133
+ const { generateRobots, parseRobotsGenerateArgs, printRobotsGenerateHelp } = await import("../robots-BHEIUAYm.mjs");
134
134
  const robotsOptions = parseRobotsGenerateArgs(args.slice(2));
135
135
  if (robotsOptions.help) {
136
136
  printRobotsGenerateHelp();
@@ -140,7 +140,7 @@ async function main() {
140
140
  } else if (parsedCommand.command === "robots") {
141
141
  console.error(pc.red(`Unknown robots subcommand: ${subcommand ?? "(missing)"}`));
142
142
  console.error();
143
- const { printRobotsGenerateHelp } = await import("../robots-NI6VU8rj.mjs");
143
+ const { printRobotsGenerateHelp } = await import("../robots-BHEIUAYm.mjs");
144
144
  printRobotsGenerateHelp();
145
145
  process.exit(1);
146
146
  } else if (parsedCommand.command === "upgrade") {
@@ -115,6 +115,34 @@ function extractObjectLiteral(content, key) {
115
115
  const braceEnd = findBalancedBraceEnd(content, braceStart);
116
116
  return braceEnd === -1 ? void 0 : content.slice(braceStart + 1, braceEnd);
117
117
  }
118
+ function stripLeadingPropertyTrivia(content) {
119
+ let current = content;
120
+ while (true) {
121
+ const trimmed = current.replace(/^\s+/, "");
122
+ if (trimmed.startsWith("//")) {
123
+ const lineEnd = trimmed.indexOf("\n");
124
+ current = lineEnd === -1 ? "" : trimmed.slice(lineEnd + 1);
125
+ continue;
126
+ }
127
+ if (trimmed.startsWith("/*")) {
128
+ const blockEnd = trimmed.indexOf("*/");
129
+ current = blockEnd === -1 ? trimmed : trimmed.slice(blockEnd + 2);
130
+ continue;
131
+ }
132
+ return trimmed;
133
+ }
134
+ }
135
+ function extractTopLevelObjectLiteral(content, key) {
136
+ const propertyPattern = new RegExp(`^${escapeRegExp(key)}\\s*:\\s*\\{`);
137
+ for (const property of splitTopLevelProperties(content)) {
138
+ const normalizedProperty = stripLeadingPropertyTrivia(property);
139
+ if (!propertyPattern.test(normalizedProperty)) continue;
140
+ const braceStart = normalizedProperty.indexOf("{");
141
+ if (braceStart === -1) return void 0;
142
+ const braceEnd = findBalancedBraceEnd(normalizedProperty, braceStart);
143
+ return braceEnd === -1 ? void 0 : normalizedProperty.slice(braceStart + 1, braceEnd);
144
+ }
145
+ }
118
146
  function extractTopLevelConfigObject(content) {
119
147
  for (const marker of ["defineDocs(", "export default"]) {
120
148
  const markerIndex = content.indexOf(marker);
@@ -129,7 +157,7 @@ function extractNestedObjectLiteral(content, keys) {
129
157
  if (keys.length === 0) return void 0;
130
158
  let current = extractTopLevelConfigObject(content) ?? content;
131
159
  for (const key of keys) {
132
- const next = extractObjectLiteral(current, key);
160
+ const next = extractTopLevelObjectLiteral(current, key);
133
161
  if (!next) return void 0;
134
162
  current = next;
135
163
  }
@@ -5,8 +5,8 @@ import { C as DEFAULT_MCP_WELL_KNOWN_ROUTE, T as DEFAULT_SKILL_MD_WELL_KNOWN_ROU
5
5
  import "./sitemap-server-DwEPfk13.mjs";
6
6
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig } from "./mcp.mjs";
7
7
  import "./server.mjs";
8
- import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsContentDir, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-BR6CcCfr.mjs";
9
- import { inspectAgentCompactionState, scanDocsPageTargets } from "./agent-B-CYVd4D.mjs";
8
+ import { a as loadProjectEnv, c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsContentDir, r as extractTopLevelConfigObject, t as extractNestedObjectLiteral } from "./config-UI31_wlO.mjs";
9
+ import { inspectAgentCompactionState, scanDocsPageTargets } from "./agent-ByVfHy7k.mjs";
10
10
  import { t as detectFramework } from "./utils-AmYxHDoz.mjs";
11
11
  import { existsSync, lstatSync, readFileSync, readdirSync } from "node:fs";
12
12
  import path from "node:path";
@@ -536,6 +536,12 @@ function percentageScore(score, maxScore) {
536
536
  if (maxScore <= 0) return 0;
537
537
  return Math.round(score / maxScore * 100);
538
538
  }
539
+ function normalizedDoctorScore(score, maxScore) {
540
+ return {
541
+ score: percentageScore(score, maxScore),
542
+ maxScore: 100
543
+ };
544
+ }
539
545
  function formatStatus(status) {
540
546
  if (status === "pass") return pc.green("PASS");
541
547
  if (status === "warn") return pc.yellow("WARN");
@@ -613,7 +619,7 @@ function compactionFreshnessScore(coverage, compactConfigured) {
613
619
  }
614
620
  if (coverage.unknownGeneratedPages > 0) return {
615
621
  status: "pass",
616
- score: compactConfigured ? 4 : 3
622
+ score: compactConfigured ? 5 : 3
617
623
  };
618
624
  if (coverage.freshGeneratedPages > 0) return {
619
625
  status: "pass",
@@ -1092,8 +1098,7 @@ async function inspectAgentReadiness(options = {}) {
1092
1098
  checks.push(makeCheck("compact", "Agent compaction freshness", compactionResult.status, compactionResult.score, 5, `${compactionCoverage.freshGeneratedPages} fresh, ${compactionCoverage.staleGeneratedPages} stale, ${compactionCoverage.modifiedGeneratedPages} modified, ${compactionCoverage.unknownGeneratedPages} unknown, ${compactionCoverage.tokenBudgetMissingPages} token-budget missing, and ${compactionCoverage.otherMissingPages} other missing page${compactionCoverage.otherMissingPages === 1 ? "" : "s"} across compactable docs pages.` + (compactConfigured ? " agent.compact defaults are configured." : " No agent.compact defaults were found in docs config."), compactionResult.recommendation));
1093
1099
  const hosted = options.url ? await buildHostedAgentChecks(options.url, pages) : void 0;
1094
1100
  if (hosted) checks.push(...hosted.checks);
1095
- const score = checks.reduce((total, check) => total + check.score, 0);
1096
- const maxScore = checks.reduce((total, check) => total + check.maxScore, 0);
1101
+ const { score, maxScore } = normalizedDoctorScore(checks.reduce((total, check) => total + check.score, 0), checks.reduce((total, check) => total + check.maxScore, 0));
1097
1102
  return {
1098
1103
  mode: "agent",
1099
1104
  framework,
@@ -1103,7 +1108,7 @@ async function inspectAgentReadiness(options = {}) {
1103
1108
  url: hosted?.baseUrl,
1104
1109
  score,
1105
1110
  maxScore,
1106
- grade: gradeForAgentScore(percentageScore(score, maxScore)),
1111
+ grade: gradeForAgentScore(score),
1107
1112
  checks,
1108
1113
  coverage,
1109
1114
  recommendations: checks.map((check) => check.recommendation).filter((recommendation) => Boolean(recommendation)).slice(0, 3)
@@ -1174,8 +1179,7 @@ async function inspectHumanReadiness(options = {}) {
1174
1179
  checks.push(makeCheck("trust", "Trust signals", trustScore === 10 ? "pass" : "warn", trustScore, 10, githubEnabled && lastUpdatedEnabled ? "Edit links and last-updated metadata are configured." : githubEnabled ? "Edit links are configured, but last-updated metadata is not enabled." : lastUpdatedEnabled ? "Last-updated metadata is enabled, but edit links are not configured." : "Edit links and last-updated metadata are not configured.", trustScore === 10 ? void 0 : "Configure GitHub edit links and/or lastUpdated so readers can trust freshness and find the source of truth faster."));
1175
1180
  checks.push(humanFeedbackEnabled ? makeCheck("feedback", "Reader feedback", "pass", 5, 5, "Built-in page feedback is enabled for the docs site.") : makeCheck("feedback", "Reader feedback", "warn", 0, 5, "Built-in page feedback is not enabled.", "Enable feedback if you want readers to leave quick page-level quality signals without opening an issue."));
1176
1181
  checks.push(readingTimeEnabled ? makeCheck("reading-time", "Reading-time cues", "pass", 5, 5, "Reading time is configured for the docs site.") : makeCheck("reading-time", "Reading-time cues", "warn", 0, 5, "Reading time is not enabled.", "Enable readingTime if you want readers to get a quick effort estimate before they dive into longer pages."));
1177
- const score = checks.reduce((total, check) => total + check.score, 0);
1178
- const maxScore = checks.reduce((total, check) => total + check.maxScore, 0);
1182
+ const { score, maxScore } = normalizedDoctorScore(checks.reduce((total, check) => total + check.score, 0), checks.reduce((total, check) => total + check.maxScore, 0));
1179
1183
  return {
1180
1184
  mode: "human",
1181
1185
  framework,
@@ -1184,7 +1188,7 @@ async function inspectHumanReadiness(options = {}) {
1184
1188
  contentDir,
1185
1189
  score,
1186
1190
  maxScore,
1187
- grade: gradeForHumanScore(percentageScore(score, maxScore)),
1191
+ grade: gradeForHumanScore(score),
1188
1192
  checks,
1189
1193
  coverage,
1190
1194
  recommendations: checks.map((check) => check.recommendation).filter((recommendation) => Boolean(recommendation)).slice(0, 3)
@@ -1193,7 +1197,7 @@ async function inspectHumanReadiness(options = {}) {
1193
1197
  function printAgentDoctorReport(report) {
1194
1198
  console.log(`${pc.bold("@farming-labs/docs doctor")} ${pc.dim("—")} ${pc.bold("agent")}`);
1195
1199
  console.log();
1196
- console.log(`${pc.bold("Score:")} ${pc.cyan(`${report.score}/${report.maxScore}`)} ${pc.dim(`(${report.grade})`)}`);
1200
+ console.log(`${pc.bold("Score:")} ${pc.cyan(`${report.score}%`)} ${pc.dim(`(${report.grade})`)}`);
1197
1201
  console.log(`${pc.bold("Framework:")} ${report.framework} ${pc.dim("•")} ${pc.bold("Entry:")} ${report.entry ?? "docs"} ${pc.dim("•")} ${pc.bold("Content:")} ${report.contentDir ?? "-"}`);
1198
1202
  if (report.url) console.log(`${pc.bold("Hosted URL:")} ${report.url}`);
1199
1203
  console.log(`${pc.bold("Explicit agent-friendly pages:")} ${report.coverage.explicitPages}/${report.coverage.totalPages} pages ${pc.dim(`(${report.coverage.explicitCoverage}%)`)}`);
@@ -1214,7 +1218,7 @@ function printAgentDoctorReport(report) {
1214
1218
  function printHumanDoctorReport(report) {
1215
1219
  console.log(`${pc.bold("@farming-labs/docs doctor")} ${pc.dim("—")} ${pc.bold("site")}`);
1216
1220
  console.log();
1217
- console.log(`${pc.bold("Score:")} ${pc.cyan(`${report.score}/${report.maxScore}`)} ${pc.dim(`(${report.grade})`)}`);
1221
+ console.log(`${pc.bold("Score:")} ${pc.cyan(`${report.score}%`)} ${pc.dim(`(${report.grade})`)}`);
1218
1222
  console.log(`${pc.bold("Framework:")} ${report.framework} ${pc.dim("•")} ${pc.bold("Entry:")} ${report.entry ?? "docs"} ${pc.dim("•")} ${pc.bold("Content:")} ${report.contentDir ?? "-"}`);
1219
1223
  console.log(`${pc.bold("Described pages:")} ${report.coverage.describedPages}/${report.coverage.totalPages} pages ${pc.dim(`(${report.coverage.descriptionCoverage}%)`)}`);
1220
1224
  console.log();
@@ -2,7 +2,7 @@ import "./search-B5ze-heM.mjs";
2
2
  import "./sitemap-server-DwEPfk13.mjs";
3
3
  import { createFilesystemDocsMcpSource, resolveDocsMcpConfig, runDocsMcpStdio } from "./mcp.mjs";
4
4
  import "./server.mjs";
5
- import { c as readNavTitle, f as resolveDocsConfigPath, n as extractObjectLiteral, o as readBooleanProperty, p as resolveDocsContentDir, u as readStringProperty } from "./config-BR6CcCfr.mjs";
5
+ import { c as readNavTitle, f as resolveDocsConfigPath, n as extractObjectLiteral, o as readBooleanProperty, p as resolveDocsContentDir, u as readStringProperty } from "./config-UI31_wlO.mjs";
6
6
  import { readFileSync } from "node:fs";
7
7
 
8
8
  //#region src/cli/mcp.ts
@@ -1,5 +1,5 @@
1
1
  import { i as DOCS_ROBOTS_GENERATED_BLOCK_START, l as resolveDocsRobotsConfig, r as DOCS_ROBOTS_GENERATED_BLOCK_END, s as renderDocsRobotsGeneratedBlock, u as upsertDocsRobotsGeneratedBlock } from "./robots-DR-Gy1Hs.mjs";
2
- import { d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-BR6CcCfr.mjs";
2
+ import { d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-UI31_wlO.mjs";
3
3
  import { t as detectFramework } from "./utils-AmYxHDoz.mjs";
4
4
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
5
  import path from "node:path";
@@ -2,7 +2,7 @@ import { n as buildDocsSearchDocuments, r as createAlgoliaSearchAdapter, s as cr
2
2
  import "./sitemap-server-DwEPfk13.mjs";
3
3
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
4
4
  import "./server.mjs";
5
- import { a as loadProjectEnv, d as readTopLevelStringProperty, f as resolveDocsConfigPath, p as resolveDocsContentDir } from "./config-BR6CcCfr.mjs";
5
+ import { a as loadProjectEnv, d as readTopLevelStringProperty, f as resolveDocsConfigPath, p as resolveDocsContentDir } from "./config-UI31_wlO.mjs";
6
6
  import { readFileSync } from "node:fs";
7
7
  import pc from "picocolors";
8
8
 
@@ -3,7 +3,7 @@ import { a as buildDocsSitemapManifest, c as renderDocsSitemapMarkdown, l as ren
3
3
  import "./sitemap-server-DwEPfk13.mjs";
4
4
  import { createFilesystemDocsMcpSource } from "./mcp.mjs";
5
5
  import "./server.mjs";
6
- import { c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsContentDir, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-BR6CcCfr.mjs";
6
+ import { c as readNavTitle, d as readTopLevelStringProperty, f as resolveDocsConfigPath, i as loadDocsConfigModule, o as readBooleanProperty, p as resolveDocsContentDir, t as extractNestedObjectLiteral, u as readStringProperty } from "./config-UI31_wlO.mjs";
7
7
  import { t as detectFramework } from "./utils-AmYxHDoz.mjs";
8
8
  import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
9
9
  import path from "node:path";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farming-labs/docs",
3
- "version": "0.1.89",
3
+ "version": "0.1.90",
4
4
  "description": "Modern, flexible MDX-based docs framework — core types, config, and CLI",
5
5
  "keywords": [
6
6
  "docs",