@harness-engineering/cli 2.7.1 → 3.0.0

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 (197) hide show
  1. package/dist/agents/personas/adversarial-reviewer.yaml +43 -0
  2. package/dist/agents/personas/frontend-races-reviewer.yaml +54 -0
  3. package/dist/agents/personas/typescript-strict-reviewer.yaml +53 -0
  4. package/dist/agents/skills/CHANGELOG.md +12 -0
  5. package/dist/agents/skills/claude-code/align-design-system/SKILL.md +18 -0
  6. package/dist/agents/skills/claude-code/align-design-system/skill.yaml +3 -0
  7. package/dist/agents/skills/claude-code/harness-audit-harness-strength/SKILL.md +188 -0
  8. package/dist/agents/skills/claude-code/harness-audit-harness-strength/skill.yaml +54 -0
  9. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +2 -0
  10. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +58 -12
  11. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +107 -22
  12. package/dist/agents/skills/claude-code/harness-code-review/references/confidence-rubric.md +45 -0
  13. package/dist/agents/skills/claude-code/harness-code-review/references/risk-keywords.md +40 -0
  14. package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +3 -0
  15. package/dist/agents/skills/claude-code/harness-compound/SKILL.md +7 -4
  16. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +1 -1
  17. package/dist/agents/skills/claude-code/harness-git-workflow/SKILL.md +2 -0
  18. package/dist/agents/skills/claude-code/harness-ideate/SKILL.md +279 -0
  19. package/dist/agents/skills/claude-code/harness-ideate/references/scoring.md +88 -0
  20. package/dist/agents/skills/claude-code/harness-ideate/skill.yaml +66 -0
  21. package/dist/agents/skills/claude-code/harness-knowledge-pipeline/SKILL.md +2 -0
  22. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +14 -4
  23. package/dist/agents/skills/claude-code/harness-pulse/SKILL.md +12 -16
  24. package/dist/agents/skills/claude-code/harness-roadmap/SKILL.md +62 -4
  25. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +36 -6
  26. package/dist/agents/skills/claude-code/harness-strategy/SKILL.md +152 -0
  27. package/dist/agents/skills/claude-code/harness-strategy/references/interview.md +122 -0
  28. package/dist/agents/skills/claude-code/harness-strategy/skill.yaml +54 -0
  29. package/dist/agents/skills/claude-code/harness-test-advisor/SKILL.md +80 -2
  30. package/dist/agents/skills/claude-code/harness-test-advisor/skill.yaml +4 -1
  31. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +86 -18
  32. package/dist/agents/skills/claude-code/initialize-harness-project/skill.yaml +1 -0
  33. package/dist/agents/skills/claude-code/outcome-eval/SKILL.md +97 -0
  34. package/dist/agents/skills/claude-code/outcome-eval/skill.yaml +51 -0
  35. package/dist/agents/skills/codex/align-design-system/SKILL.md +18 -0
  36. package/dist/agents/skills/codex/align-design-system/skill.yaml +3 -0
  37. package/dist/agents/skills/codex/harness-audit-harness-strength/SKILL.md +188 -0
  38. package/dist/agents/skills/codex/harness-audit-harness-strength/skill.yaml +54 -0
  39. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +2 -0
  40. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +58 -12
  41. package/dist/agents/skills/codex/harness-code-review/SKILL.md +107 -22
  42. package/dist/agents/skills/codex/harness-code-review/references/confidence-rubric.md +45 -0
  43. package/dist/agents/skills/codex/harness-code-review/references/risk-keywords.md +40 -0
  44. package/dist/agents/skills/codex/harness-code-review/skill.yaml +3 -0
  45. package/dist/agents/skills/codex/harness-compound/SKILL.md +7 -4
  46. package/dist/agents/skills/codex/harness-execution/SKILL.md +1 -1
  47. package/dist/agents/skills/codex/harness-git-workflow/SKILL.md +2 -0
  48. package/dist/agents/skills/codex/harness-ideate/SKILL.md +279 -0
  49. package/dist/agents/skills/codex/harness-ideate/references/scoring.md +88 -0
  50. package/dist/agents/skills/codex/harness-ideate/skill.yaml +66 -0
  51. package/dist/agents/skills/codex/harness-knowledge-pipeline/SKILL.md +2 -0
  52. package/dist/agents/skills/codex/harness-planning/SKILL.md +14 -4
  53. package/dist/agents/skills/codex/harness-pulse/SKILL.md +12 -16
  54. package/dist/agents/skills/codex/harness-roadmap/SKILL.md +62 -4
  55. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +36 -6
  56. package/dist/agents/skills/codex/harness-strategy/SKILL.md +152 -0
  57. package/dist/agents/skills/codex/harness-strategy/references/interview.md +122 -0
  58. package/dist/agents/skills/codex/harness-strategy/skill.yaml +54 -0
  59. package/dist/agents/skills/codex/harness-test-advisor/SKILL.md +80 -2
  60. package/dist/agents/skills/codex/harness-test-advisor/skill.yaml +4 -1
  61. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +86 -18
  62. package/dist/agents/skills/codex/initialize-harness-project/skill.yaml +1 -0
  63. package/dist/agents/skills/codex/outcome-eval/SKILL.md +97 -0
  64. package/dist/agents/skills/codex/outcome-eval/skill.yaml +51 -0
  65. package/dist/agents/skills/cursor/align-design-system/SKILL.md +18 -0
  66. package/dist/agents/skills/cursor/align-design-system/skill.yaml +3 -0
  67. package/dist/agents/skills/cursor/harness-audit-harness-strength/SKILL.md +188 -0
  68. package/dist/agents/skills/cursor/harness-audit-harness-strength/skill.yaml +54 -0
  69. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +2 -0
  70. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +58 -12
  71. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +107 -22
  72. package/dist/agents/skills/cursor/harness-code-review/references/confidence-rubric.md +45 -0
  73. package/dist/agents/skills/cursor/harness-code-review/references/risk-keywords.md +40 -0
  74. package/dist/agents/skills/cursor/harness-code-review/skill.yaml +3 -0
  75. package/dist/agents/skills/cursor/harness-compound/SKILL.md +7 -4
  76. package/dist/agents/skills/cursor/harness-execution/SKILL.md +1 -1
  77. package/dist/agents/skills/cursor/harness-git-workflow/SKILL.md +2 -0
  78. package/dist/agents/skills/cursor/harness-ideate/SKILL.md +279 -0
  79. package/dist/agents/skills/cursor/harness-ideate/references/scoring.md +88 -0
  80. package/dist/agents/skills/cursor/harness-ideate/skill.yaml +66 -0
  81. package/dist/agents/skills/cursor/harness-knowledge-pipeline/SKILL.md +2 -0
  82. package/dist/agents/skills/cursor/harness-planning/SKILL.md +14 -4
  83. package/dist/agents/skills/cursor/harness-pulse/SKILL.md +12 -16
  84. package/dist/agents/skills/cursor/harness-roadmap/SKILL.md +62 -4
  85. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +36 -6
  86. package/dist/agents/skills/cursor/harness-strategy/SKILL.md +152 -0
  87. package/dist/agents/skills/cursor/harness-strategy/references/interview.md +122 -0
  88. package/dist/agents/skills/cursor/harness-strategy/skill.yaml +54 -0
  89. package/dist/agents/skills/cursor/harness-test-advisor/SKILL.md +80 -2
  90. package/dist/agents/skills/cursor/harness-test-advisor/skill.yaml +4 -1
  91. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +86 -18
  92. package/dist/agents/skills/cursor/initialize-harness-project/skill.yaml +1 -0
  93. package/dist/agents/skills/cursor/outcome-eval/SKILL.md +97 -0
  94. package/dist/agents/skills/cursor/outcome-eval/skill.yaml +51 -0
  95. package/dist/agents/skills/gemini-cli/align-design-system/SKILL.md +18 -0
  96. package/dist/agents/skills/gemini-cli/align-design-system/skill.yaml +3 -0
  97. package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/SKILL.md +188 -0
  98. package/dist/agents/skills/gemini-cli/harness-audit-harness-strength/skill.yaml +54 -0
  99. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +2 -0
  100. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +58 -12
  101. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +107 -22
  102. package/dist/agents/skills/gemini-cli/harness-code-review/references/confidence-rubric.md +45 -0
  103. package/dist/agents/skills/gemini-cli/harness-code-review/references/risk-keywords.md +40 -0
  104. package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +3 -0
  105. package/dist/agents/skills/gemini-cli/harness-compound/SKILL.md +7 -4
  106. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +1 -1
  107. package/dist/agents/skills/gemini-cli/harness-git-workflow/SKILL.md +2 -0
  108. package/dist/agents/skills/gemini-cli/harness-ideate/SKILL.md +279 -0
  109. package/dist/agents/skills/gemini-cli/harness-ideate/references/scoring.md +88 -0
  110. package/dist/agents/skills/gemini-cli/harness-ideate/skill.yaml +66 -0
  111. package/dist/agents/skills/gemini-cli/harness-knowledge-pipeline/SKILL.md +2 -0
  112. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +14 -4
  113. package/dist/agents/skills/gemini-cli/harness-pulse/SKILL.md +12 -16
  114. package/dist/agents/skills/gemini-cli/harness-roadmap/SKILL.md +62 -4
  115. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +36 -6
  116. package/dist/agents/skills/gemini-cli/harness-strategy/SKILL.md +152 -0
  117. package/dist/agents/skills/gemini-cli/harness-strategy/references/interview.md +122 -0
  118. package/dist/agents/skills/gemini-cli/harness-strategy/skill.yaml +54 -0
  119. package/dist/agents/skills/gemini-cli/harness-test-advisor/SKILL.md +80 -2
  120. package/dist/agents/skills/gemini-cli/harness-test-advisor/skill.yaml +4 -1
  121. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +86 -18
  122. package/dist/agents/skills/gemini-cli/initialize-harness-project/skill.yaml +1 -0
  123. package/dist/agents/skills/gemini-cli/outcome-eval/SKILL.md +97 -0
  124. package/dist/agents/skills/gemini-cli/outcome-eval/skill.yaml +51 -0
  125. package/dist/agents/skills/package.json +1 -1
  126. package/dist/agents/skills/tests/harness-strategy.test.ts +145 -0
  127. package/dist/agents/skills/tests/harness-test-advisor.test.ts +94 -0
  128. package/dist/agents-md-XOJE5ETA.js +13 -0
  129. package/dist/analyzer-V633GUHY-MBCQWKDU.js +26 -0
  130. package/dist/{architecture-LUR2I67H.js → architecture-JEZPJ725.js} +6 -6
  131. package/dist/{assess-project-OJWECOP2.js → assess-project-RHXOQNMM.js} +1 -1
  132. package/dist/bin/harness-mcp.js +17 -17
  133. package/dist/bin/harness.js +27 -27
  134. package/dist/{check-phase-gate-HS5KYLRO.js → check-phase-gate-GNDOMS35.js} +6 -6
  135. package/dist/{chunk-6UHDQP2N.js → chunk-2N4OENGE.js} +1 -1
  136. package/dist/{chunk-O2ASYKA6.js → chunk-3ISHDWO7.js} +2 -2
  137. package/dist/{chunk-GGSNWH7P.js → chunk-527G27VI.js} +5 -5
  138. package/dist/{chunk-N5NSSLMU.js → chunk-6WQCLCBO.js} +2 -2
  139. package/dist/{chunk-OH3NXXUY.js → chunk-BDGTZRZ6.js} +11 -1
  140. package/dist/{chunk-Z3TMCCZB.js → chunk-BYVT5LVO.js} +9 -9
  141. package/dist/{chunk-TIH53QXY.js → chunk-CLI4K2CH.js} +1 -1
  142. package/dist/{chunk-VSIRUZQP.js → chunk-DE5U6KOL.js} +2 -2
  143. package/dist/{chunk-FXZI6NJ2.js → chunk-GGKRA7A7.js} +51 -4
  144. package/dist/{chunk-RJ2WEES5.js → chunk-GSP2XIVS.js} +2 -2
  145. package/dist/{chunk-CZPOPMMI.js → chunk-HEIMJJI4.js} +3 -3
  146. package/dist/{chunk-7AF6C5GE.js → chunk-HWTUUQOW.js} +3 -3
  147. package/dist/{chunk-FC4JPM6W.js → chunk-KAJOS3BA.js} +3 -3
  148. package/dist/{chunk-NIVWM7OW.js → chunk-MGUPSE6D.js} +10 -10
  149. package/dist/{chunk-WZY5U6NS.js → chunk-N24HCQA4.js} +3351 -887
  150. package/dist/{chunk-Y4T6ENKQ.js → chunk-N55WOGN3.js} +86 -17
  151. package/dist/{chunk-INBTDBV2.js → chunk-NWLGL3IR.js} +1 -1
  152. package/dist/{chunk-FEKBXX2J.js → chunk-ONCPJGHY.js} +9 -9
  153. package/dist/{chunk-PTHX545Q.js → chunk-PC2R5RUJ.js} +2 -2
  154. package/dist/{chunk-H2ZJOJ7A.js → chunk-PP6ZRL5T.js} +316 -42
  155. package/dist/{chunk-LECXPXS3.js → chunk-QBC7DI4Q.js} +2 -2
  156. package/dist/{chunk-B2VAYLYI.js → chunk-UX3PQKVZ.js} +8 -3
  157. package/dist/{chunk-7PLIWP7U.js → chunk-WWEVS7RO.js} +4409 -743
  158. package/dist/{chunk-LGYXR2KZ.js → chunk-XFU6SB2Q.js} +1122 -689
  159. package/dist/{chunk-KN3EMDZ5.js → chunk-XX4OLNWQ.js} +23 -3
  160. package/dist/{chunk-VI4IS55S.js → chunk-YQSYCBAH.js} +6 -6
  161. package/dist/{chunk-LYIPI2SJ.js → chunk-Z4AWEIBY.js} +6 -6
  162. package/dist/{ci-workflow-MDSTHJOY.js → ci-workflow-ORZ4F45F.js} +5 -5
  163. package/dist/{dist-E3SAAHCM.js → dist-ICW4QUEW.js} +5 -1
  164. package/dist/{dist-72ID44UE.js → dist-LHINSVK4.js} +136 -4
  165. package/dist/{dist-R3TOOPJ7.js → dist-OWHMNL4W.js} +1 -1
  166. package/dist/{docs-2RFOJ6XY.js → docs-AU3DXFFO.js} +6 -6
  167. package/dist/engine-6GPWOYQH.js +13 -0
  168. package/dist/{entropy-3UX6644G.js → entropy-VLKDRMRT.js} +5 -5
  169. package/dist/{feedback-CVCFYND4.js → feedback-YXYY44ZC.js} +1 -1
  170. package/dist/{generate-agent-definitions-HZ3XENWO.js → generate-agent-definitions-XIHQPKG3.js} +6 -6
  171. package/dist/{glob-helper-EX4YZKZO.js → glob-helper-GLZAURJC.js} +1 -1
  172. package/dist/{graph-loader-EIFEOUVI.js → graph-loader-HHXN5FLP.js} +1 -1
  173. package/dist/hooks/cost-tracker.js +29 -6
  174. package/dist/index.d.ts +202 -0
  175. package/dist/index.js +27 -27
  176. package/dist/{loader-6RHWU5FH.js → loader-YAN56MT3.js} +5 -5
  177. package/dist/{mcp-OYR26JDI.js → mcp-RK3SFVYB.js} +17 -17
  178. package/dist/{performance-JJMIRXCH.js → performance-64DPTLLQ.js} +6 -6
  179. package/dist/{review-pipeline-BHQZIXWZ.js → review-pipeline-NENG6LW7.js} +5 -5
  180. package/dist/{runtime-DALTAVTN.js → runtime-FFIIRT2T.js} +5 -5
  181. package/dist/{scan-LYKLM4EQ.js → scan-P7YFKB77.js} +1 -1
  182. package/dist/{security-RMLMYFPB.js → security-3PIBN35B.js} +1 -1
  183. package/dist/templates/basic/harness.config.json.hbs +34 -0
  184. package/dist/templates/ci/README.md +86 -0
  185. package/dist/templates/ci/required-review.ruleset.json +20 -0
  186. package/dist/templates/ci/required-review.yml.hbs +57 -0
  187. package/dist/templates/ci/template.json +5 -0
  188. package/dist/templates/intermediate/harness.config.json.hbs +36 -0
  189. package/dist/templates/orchestrator/harness.orchestrator.md +9 -0
  190. package/dist/{tool-tiers-B7JC2XC3.js → tool-tiers-OKK5FE57.js} +2 -0
  191. package/dist/{validate-R7DZRDFK.js → validate-7IAF2ES3.js} +6 -6
  192. package/dist/validate-cross-check-QPSAOZKD.js +13 -0
  193. package/package.json +8 -8
  194. package/dist/agents-md-FKMKH6ZF.js +0 -13
  195. package/dist/analyzer-H3AHBFSL-KPOPJYRB.js +0 -26
  196. package/dist/engine-BSFKOGPN.js +0 -13
  197. package/dist/validate-cross-check-AUUZFNVL.js +0 -13
@@ -2,12 +2,12 @@ import {
2
2
  Err,
3
3
  Ok,
4
4
  init_dist
5
- } from "./chunk-OH3NXXUY.js";
5
+ } from "./chunk-BDGTZRZ6.js";
6
6
  import {
7
7
  DEFAULT_SKIP_DIRS,
8
8
  init_dist as init_dist2,
9
9
  skipDirGlobs
10
- } from "./chunk-H2ZJOJ7A.js";
10
+ } from "./chunk-PP6ZRL5T.js";
11
11
  import {
12
12
  __esm
13
13
  } from "./chunk-KFQGP6VL.js";
@@ -1605,7 +1605,7 @@ var init_chunk_MUWJHO2S = __esm({
1605
1605
  }
1606
1606
  });
1607
1607
 
1608
- // ../core/dist/chunk-I2JUTTPH.mjs
1608
+ // ../core/dist/chunk-S4DTDJ6J.mjs
1609
1609
  import { resolve as resolve2 } from "path";
1610
1610
  import { minimatch as minimatch2 } from "minimatch";
1611
1611
  import { join, resolve as resolve3 } from "path";
@@ -1882,6 +1882,11 @@ function extractCodeBlocks(content) {
1882
1882
  }
1883
1883
  return blocks;
1884
1884
  }
1885
+ function isLikelySymbolReference(reference) {
1886
+ if (BCP47_LOCALE_RE.test(reference)) return false;
1887
+ if (FILE_REFERENCE_RE.test(reference)) return false;
1888
+ return /^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*(\(.*\))?$/.test(reference);
1889
+ }
1885
1890
  function extractInlineRefs(content) {
1886
1891
  const refs = [];
1887
1892
  const lines = content.split("\n");
@@ -1893,7 +1898,7 @@ function extractInlineRefs(content) {
1893
1898
  while ((match = regex.exec(line)) !== null) {
1894
1899
  const reference = match[1];
1895
1900
  if (reference === void 0) continue;
1896
- if (reference.match(/^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*(\(.*\))?$/)) {
1901
+ if (isLikelySymbolReference(reference)) {
1897
1902
  refs.push({
1898
1903
  reference: reference.replace(/\(.*\)$/, ""),
1899
1904
  // Remove function parens
@@ -2140,6 +2145,10 @@ function findPossibleMatches(reference, exportNames, maxDistance = 5) {
2140
2145
  }
2141
2146
  return matches.sort((a, b) => a.score - b.score).slice(0, 3).map((m) => m.name);
2142
2147
  }
2148
+ function isForwardLookingDoc(docPath, forwardLookingPaths) {
2149
+ const normalized = docPath.replaceAll("\\", "/");
2150
+ return forwardLookingPaths.some((prefix) => normalized.includes(prefix));
2151
+ }
2143
2152
  function checkApiSignatureDrift(snapshot, config) {
2144
2153
  const drifts = [];
2145
2154
  const exportNames = Array.from(snapshot.exportMap.byName.keys());
@@ -2147,6 +2156,9 @@ function checkApiSignatureDrift(snapshot, config) {
2147
2156
  if (config.ignorePatterns.some((p) => ref.reference.match(new RegExp(p)))) {
2148
2157
  continue;
2149
2158
  }
2159
+ if (isForwardLookingDoc(ref.docFile, config.forwardLookingPaths)) {
2160
+ continue;
2161
+ }
2150
2162
  if (!snapshot.exportMap.byName.has(ref.reference)) {
2151
2163
  const possibleMatches = findPossibleMatches(ref.reference, exportNames);
2152
2164
  const confidence = possibleMatches.length > 0 ? "high" : "medium";
@@ -2179,32 +2191,80 @@ function extractFileLinks(content) {
2179
2191
  let match;
2180
2192
  while ((match = linkRegex.exec(line)) !== null) {
2181
2193
  const linkPath = match[2];
2182
- if (linkPath && !linkPath.startsWith("http") && !linkPath.startsWith("#") && (linkPath.includes(".") || linkPath.startsWith(".."))) {
2183
- links.push({ link: linkPath, line: i + 1 });
2184
- }
2194
+ if (!linkPath) continue;
2195
+ if (linkPath.startsWith("http")) continue;
2196
+ if (linkPath.startsWith("#")) continue;
2197
+ if (!linkPath.includes(".") && !linkPath.startsWith("..")) continue;
2198
+ const hashIdx = linkPath.indexOf("#");
2199
+ const filePart = hashIdx === -1 ? linkPath : linkPath.slice(0, hashIdx);
2200
+ const anchorPart = hashIdx === -1 ? void 0 : linkPath.slice(hashIdx + 1);
2201
+ if (!filePart) continue;
2202
+ links.push({
2203
+ raw: linkPath,
2204
+ path: filePart,
2205
+ ...anchorPart ? { anchor: anchorPart } : {},
2206
+ line: i + 1
2207
+ });
2185
2208
  }
2186
2209
  }
2187
2210
  return links;
2188
2211
  }
2212
+ function slugifyHeading(text) {
2213
+ return text.toLowerCase().replace(/[^\w\s-]/g, "").trim().replace(/\s+/g, "-");
2214
+ }
2215
+ async function extractHeadingSlugs(filePath) {
2216
+ const slugs = /* @__PURE__ */ new Set();
2217
+ let content;
2218
+ try {
2219
+ const fs = await import("fs/promises");
2220
+ content = await fs.readFile(filePath, "utf-8");
2221
+ } catch {
2222
+ return slugs;
2223
+ }
2224
+ const headingRe = /^#{1,6}[ \t]+(.+?)[ \t]*#*\s*$/gm;
2225
+ let m;
2226
+ while ((m = headingRe.exec(content)) !== null) {
2227
+ const heading = m[1];
2228
+ if (heading) slugs.add(slugifyHeading(heading));
2229
+ }
2230
+ return slugs;
2231
+ }
2189
2232
  async function checkStructureDrift(snapshot, _config) {
2190
2233
  const drifts = [];
2191
2234
  for (const doc of snapshot.docs) {
2192
2235
  const fileLinks = extractFileLinks(doc.content);
2193
- for (const { link, line } of fileLinks) {
2194
- const resolvedPath = resolve32(dirname2(doc.path), link);
2236
+ for (const link of fileLinks) {
2237
+ const resolvedPath = resolve32(dirname2(doc.path), link.path);
2195
2238
  const exists = await fileExists(resolvedPath);
2196
2239
  if (!exists) {
2197
2240
  drifts.push({
2198
2241
  type: "structure",
2199
2242
  docFile: doc.path,
2200
- line,
2201
- reference: link,
2243
+ line: link.line,
2244
+ reference: link.raw,
2202
2245
  context: "link",
2203
2246
  issue: "NOT_FOUND",
2204
- details: `File "${link}" referenced in documentation does not exist`,
2247
+ details: `File "${link.path}" referenced in documentation does not exist`,
2205
2248
  suggestion: "Update the link or remove the reference",
2206
2249
  confidence: "high"
2207
2250
  });
2251
+ continue;
2252
+ }
2253
+ if (link.anchor && resolvedPath.toLowerCase().endsWith(".md")) {
2254
+ const slugs = await extractHeadingSlugs(resolvedPath);
2255
+ if (slugs.size > 0 && !slugs.has(link.anchor.toLowerCase())) {
2256
+ drifts.push({
2257
+ type: "structure",
2258
+ docFile: doc.path,
2259
+ line: link.line,
2260
+ reference: link.raw,
2261
+ context: "link-anchor",
2262
+ issue: "NOT_FOUND",
2263
+ details: `Anchor "#${link.anchor}" not found in "${link.path}"`,
2264
+ suggestion: "Check the target file for the correct heading slug",
2265
+ confidence: "medium"
2266
+ });
2267
+ }
2208
2268
  }
2209
2269
  }
2210
2270
  }
@@ -3001,9 +3061,9 @@ function generateSuggestions(deadCode, drift, patterns) {
3001
3061
  estimatedEffort
3002
3062
  };
3003
3063
  }
3004
- var TS_HINTS, TS_CONVENTIONS, PYTHON_HINTS, PYTHON_CONVENTIONS, DEFAULT_INCLUDE_PATTERNS, CODE_BLOCK_LANGUAGES, DEFAULT_DRIFT_CONFIG, JS_EXT_FALLBACKS2, FILE_TYPES, EXPORT_TYPES, CONVENTION_DESCRIPTIONS, RULE_CHECKERS, EntropyAnalyzer;
3005
- var init_chunk_I2JUTTPH = __esm({
3006
- "../core/dist/chunk-I2JUTTPH.mjs"() {
3064
+ var TS_HINTS, TS_CONVENTIONS, PYTHON_HINTS, PYTHON_CONVENTIONS, DEFAULT_INCLUDE_PATTERNS, BCP47_LOCALE_RE, FILE_REFERENCE_RE, CODE_BLOCK_LANGUAGES, DEFAULT_FORWARD_LOOKING_PATHS, DEFAULT_DRIFT_CONFIG, JS_EXT_FALLBACKS2, FILE_TYPES, EXPORT_TYPES, CONVENTION_DESCRIPTIONS, RULE_CHECKERS, EntropyAnalyzer;
3065
+ var init_chunk_S4DTDJ6J = __esm({
3066
+ "../core/dist/chunk-S4DTDJ6J.mjs"() {
3007
3067
  "use strict";
3008
3068
  init_chunk_MUWJHO2S();
3009
3069
  init_dist2();
@@ -3034,13 +3094,22 @@ var init_chunk_I2JUTTPH = __esm({
3034
3094
  "**/*.rs",
3035
3095
  "**/*.java"
3036
3096
  ];
3097
+ BCP47_LOCALE_RE = /^[a-z]{2,3}(?:-[A-Z][a-z]{3})?(?:-[A-Z]{2,4})?$/;
3098
+ FILE_REFERENCE_RE = /\.(md|json|toml|yaml|yml|txt|csv|html|xml|jsonl|env|ini|lock|gitignore|sh|sql)$/i;
3037
3099
  CODE_BLOCK_LANGUAGES = /* @__PURE__ */ new Set(["typescript", "ts", "javascript", "js"]);
3100
+ DEFAULT_FORWARD_LOOKING_PATHS = [
3101
+ "docs/architecture/",
3102
+ "docs/decisions/",
3103
+ "docs/proposals/",
3104
+ "docs/adr/"
3105
+ ];
3038
3106
  DEFAULT_DRIFT_CONFIG = {
3039
3107
  docPaths: [],
3040
3108
  checkApiSignatures: true,
3041
3109
  checkExamples: true,
3042
3110
  checkStructure: true,
3043
- ignorePatterns: []
3111
+ ignorePatterns: [],
3112
+ forwardLookingPaths: DEFAULT_FORWARD_LOOKING_PATHS
3044
3113
  };
3045
3114
  JS_EXT_FALLBACKS2 = {
3046
3115
  ".js": [".ts", ".tsx", ".jsx"],
@@ -3333,5 +3402,5 @@ export {
3333
3402
  detectSizeBudgetViolations,
3334
3403
  generateSuggestions,
3335
3404
  EntropyAnalyzer,
3336
- init_chunk_I2JUTTPH
3405
+ init_chunk_S4DTDJ6J
3337
3406
  };
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-PTHX545Q.js";
7
+ } from "./chunk-PC2R5RUJ.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -7,13 +7,13 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-FXZI6NJ2.js";
10
+ } from "./chunk-GGKRA7A7.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-WZY5U6NS.js";
13
+ } from "./chunk-N24HCQA4.js";
14
14
  import {
15
15
  Ok
16
- } from "./chunk-OH3NXXUY.js";
16
+ } from "./chunk-BDGTZRZ6.js";
17
17
 
18
18
  // src/mcp/tools/performance.ts
19
19
  init_dist();
@@ -35,7 +35,7 @@ var checkPerformanceDefinition = {
35
35
  };
36
36
  async function handleCheckPerformance(input) {
37
37
  try {
38
- const { EntropyAnalyzer } = await import("./dist-72ID44UE.js");
38
+ const { EntropyAnalyzer } = await import("./dist-LHINSVK4.js");
39
39
  const typeFilter = input.type ?? "all";
40
40
  const projectPath = sanitizePath(input.path);
41
41
  let entryPoints;
@@ -58,10 +58,10 @@ async function handleCheckPerformance(input) {
58
58
  });
59
59
  let graphOptions;
60
60
  try {
61
- const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
61
+ const { loadGraphStore } = await import("./graph-loader-HHXN5FLP.js");
62
62
  const store = await loadGraphStore(projectPath);
63
63
  if (store) {
64
- const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-R3TOOPJ7.js");
64
+ const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-OWHMNL4W.js");
65
65
  const complexityAdapter = new GraphComplexityAdapter(store);
66
66
  const couplingAdapter = new GraphCouplingAdapter(store);
67
67
  graphOptions = {
@@ -98,7 +98,7 @@ var getPerfBaselinesDefinition = {
98
98
  };
99
99
  async function handleGetPerfBaselines(input) {
100
100
  try {
101
- const { BaselineManager } = await import("./dist-72ID44UE.js");
101
+ const { BaselineManager } = await import("./dist-LHINSVK4.js");
102
102
  const manager = new BaselineManager(sanitizePath(input.path));
103
103
  const baselines = manager.load();
104
104
  return resultToMcpResponse(
@@ -146,7 +146,7 @@ var updatePerfBaselinesDefinition = {
146
146
  };
147
147
  async function handleUpdatePerfBaselines(input) {
148
148
  try {
149
- const { BaselineManager } = await import("./dist-72ID44UE.js");
149
+ const { BaselineManager } = await import("./dist-LHINSVK4.js");
150
150
  const manager = new BaselineManager(sanitizePath(input.path));
151
151
  manager.save(input.results, input.commitHash);
152
152
  const updated = manager.load();
@@ -176,7 +176,7 @@ var getCriticalPathsDefinition = {
176
176
  };
177
177
  async function handleGetCriticalPaths(input) {
178
178
  try {
179
- const { CriticalPathResolver } = await import("./dist-72ID44UE.js");
179
+ const { CriticalPathResolver } = await import("./dist-LHINSVK4.js");
180
180
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
181
181
  const result = await resolver.resolve();
182
182
  return resultToMcpResponse(Ok(result));
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-WZY5U6NS.js";
3
+ } from "./chunk-N24HCQA4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
7
- } from "./chunk-OH3NXXUY.js";
7
+ } from "./chunk-BDGTZRZ6.js";
8
8
 
9
9
  // src/persona/loader.ts
10
10
  init_dist();