@harness-engineering/cli 4.0.1 → 4.1.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 (64) hide show
  1. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +9 -8
  2. package/dist/agents/skills/claude-code/pre-merge-brief/SKILL.md +86 -0
  3. package/dist/agents/skills/claude-code/pre-merge-brief/skill.yaml +67 -0
  4. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +9 -8
  5. package/dist/agents/skills/codex/pre-merge-brief/SKILL.md +86 -0
  6. package/dist/agents/skills/codex/pre-merge-brief/skill.yaml +67 -0
  7. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +9 -8
  8. package/dist/agents/skills/cursor/pre-merge-brief/SKILL.md +86 -0
  9. package/dist/agents/skills/cursor/pre-merge-brief/skill.yaml +67 -0
  10. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +9 -8
  11. package/dist/agents/skills/gemini-cli/pre-merge-brief/SKILL.md +86 -0
  12. package/dist/agents/skills/gemini-cli/pre-merge-brief/skill.yaml +67 -0
  13. package/dist/{agents-md-VJLYEH2S.js → agents-md-7L4PKKOM.js} +3 -3
  14. package/dist/analyzer-XRCV63KC-HLTEIKAJ.js +26 -0
  15. package/dist/{architecture-YQH2NYXY.js → architecture-RCHFDI7E.js} +4 -4
  16. package/dist/{assess-project-KOTAPAHD.js → assess-project-YUDPNRS6.js} +5 -3
  17. package/dist/bin/harness-mcp.js +14 -14
  18. package/dist/bin/harness.js +24 -24
  19. package/dist/{check-phase-gate-CHU2E3OU.js → check-phase-gate-56GS3A72.js} +4 -4
  20. package/dist/{chunk-JPVOI7GP.js → chunk-4SKWGVYD.js} +2 -2
  21. package/dist/{chunk-GHBFNLV2.js → chunk-ABRYIEWJ.js} +923 -614
  22. package/dist/{chunk-36GQREOE.js → chunk-AU4YPEIE.js} +3 -3
  23. package/dist/{chunk-OQ6KOQEV.js → chunk-DGVT4DBI.js} +3 -3
  24. package/dist/{chunk-I3CGCZJF.js → chunk-GLHLXTKC.js} +5 -5
  25. package/dist/{chunk-4VXFZSYF.js → chunk-GSYBGOY3.js} +1 -1
  26. package/dist/{chunk-UWVMJEUJ.js → chunk-IGWJRAJT.js} +1 -1
  27. package/dist/{chunk-YANR2RL7.js → chunk-N4AI2WFH.js} +1 -1
  28. package/dist/{chunk-5RSXUAMN.js → chunk-NCMJXBEO.js} +1 -1
  29. package/dist/{chunk-SEA2PFVI.js → chunk-OZSKLJQW.js} +1 -1
  30. package/dist/{chunk-AX5KGRM6.js → chunk-P4NA5OQX.js} +1 -1
  31. package/dist/{chunk-7PJCK7UE.js → chunk-RY2U77OY.js} +6 -6
  32. package/dist/{chunk-6SCYTIF4.js → chunk-RZQZXWEL.js} +32 -7
  33. package/dist/{chunk-MMLQPHZ5.js → chunk-UACYZCW4.js} +31 -13
  34. package/dist/{chunk-T746REAE.js → chunk-VG4G3R2V.js} +1 -1
  35. package/dist/{chunk-7TIJXWG3.js → chunk-XW5XVVMI.js} +2 -2
  36. package/dist/{chunk-E5EW5HVJ.js → chunk-XZNCONFG.js} +1 -1
  37. package/dist/{chunk-SDMV4QHM.js → chunk-Y33P35U3.js} +24 -6
  38. package/dist/{chunk-XAVMTAUT.js → chunk-Y5HPJMTM.js} +18 -2
  39. package/dist/{chunk-6YFHUIGT.js → chunk-YJYUJSWK.js} +58 -20
  40. package/dist/{chunk-AAUY53CC.js → chunk-YWRPQZL7.js} +1 -1
  41. package/dist/{chunk-M7F2PPN3.js → chunk-YXOPQEFZ.js} +2 -2
  42. package/dist/{chunk-RG3TNIUB.js → chunk-Z4XWWNYX.js} +86 -86
  43. package/dist/{chunk-EYMOPFSD.js → chunk-ZU6T7W3U.js} +2 -2
  44. package/dist/{ci-workflow-HO4WKGNG.js → ci-workflow-TFAA5BK7.js} +3 -3
  45. package/dist/{dist-6D2F2J57.js → dist-MCTEX5QH.js} +4 -2
  46. package/dist/{docs-FP47JONV.js → docs-BBMAN3CY.js} +4 -4
  47. package/dist/{engine-YUA6IYOG.js → engine-R2YH74AL.js} +3 -3
  48. package/dist/{entropy-DBW2INZU.js → entropy-5UP5N6AF.js} +6 -3
  49. package/dist/{feedback-BPHADTRQ.js → feedback-6MDCCFZL.js} +1 -1
  50. package/dist/{generate-agent-definitions-KPVGBGDY.js → generate-agent-definitions-KKAN5DB5.js} +4 -4
  51. package/dist/hooks/sentinel-pre.js +15 -138
  52. package/dist/index.d.ts +61 -0
  53. package/dist/index.js +24 -24
  54. package/dist/{loader-QOJQ6NZM.js → loader-2WT2ZE2T.js} +3 -3
  55. package/dist/{mcp-ZPX6O767.js → mcp-5V4LPMB3.js} +14 -14
  56. package/dist/{performance-FXYTGJGQ.js → performance-2N3CFXLR.js} +4 -4
  57. package/dist/{review-pipeline-2TFQ5OAE.js → review-pipeline-XZIGBU3Q.js} +3 -3
  58. package/dist/{runtime-XK6ZCHKE.js → runtime-POME3GTR.js} +3 -3
  59. package/dist/{security-4W2P5ZGI.js → security-QLJLMSIW.js} +1 -1
  60. package/dist/{state-events-ECQAIZLU.js → state-events-YY5KBZTC.js} +3 -3
  61. package/dist/{validate-64KTEGIE.js → validate-VZORVK43.js} +4 -4
  62. package/dist/{validate-cross-check-J5PVGICB.js → validate-cross-check-OYKEDCST.js} +3 -3
  63. package/package.json +5 -4
  64. package/dist/analyzer-V633GUHY-OV335HGM.js +0 -26
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-SEA2PFVI.js";
3
+ } from "./chunk-OZSKLJQW.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
@@ -49,7 +49,7 @@ async function handleValidateProject(input) {
49
49
  checks.config = "pass";
50
50
  const config = configResult.value;
51
51
  try {
52
- const core = await import("./dist-6D2F2J57.js");
52
+ const core = await import("./dist-MCTEX5QH.js");
53
53
  if (typeof core.validateFileStructure === "function" && Array.isArray(config.conventions)) {
54
54
  const conventions = config.conventions;
55
55
  const structureResult = await core.validateFileStructure(projectPath, conventions);
@@ -68,7 +68,7 @@ async function handleValidateProject(input) {
68
68
  } catch {
69
69
  }
70
70
  try {
71
- const core = await import("./dist-6D2F2J57.js");
71
+ const core = await import("./dist-MCTEX5QH.js");
72
72
  if (typeof core.validateAgentsMap === "function") {
73
73
  const agentsMapPath = path.join(projectPath, "AGENTS.md");
74
74
  const agentsResult = await core.validateAgentsMap(agentsMapPath);
@@ -33,7 +33,7 @@ var createSelfReviewDefinition = {
33
33
  };
34
34
  async function handleCreateSelfReview(input) {
35
35
  try {
36
- const { parseDiff, createSelfReview } = await import("./dist-6D2F2J57.js");
36
+ const { parseDiff, createSelfReview } = await import("./dist-MCTEX5QH.js");
37
37
  const parseResult = parseDiff(input.diff);
38
38
  if (!parseResult.ok) {
39
39
  return resultToMcpResponse(parseResult);
@@ -119,7 +119,7 @@ var analyzeDiffDefinition = {
119
119
  };
120
120
  async function handleAnalyzeDiff(input) {
121
121
  try {
122
- const { parseDiff, analyzeDiff } = await import("./dist-6D2F2J57.js");
122
+ const { parseDiff, analyzeDiff } = await import("./dist-MCTEX5QH.js");
123
123
  const parseResult = parseDiff(input.diff);
124
124
  if (!parseResult.ok) {
125
125
  return resultToMcpResponse(parseResult);
@@ -195,7 +195,7 @@ var requestPeerReviewDefinition = {
195
195
  };
196
196
  async function handleRequestPeerReview(input) {
197
197
  try {
198
- const { parseDiff, requestPeerReview } = await import("./dist-6D2F2J57.js");
198
+ const { parseDiff, requestPeerReview } = await import("./dist-MCTEX5QH.js");
199
199
  const parseResult = parseDiff(input.diff);
200
200
  if (!parseResult.ok) {
201
201
  return resultToMcpResponse(parseResult);
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-XAVMTAUT.js";
10
+ } from "./chunk-Y5HPJMTM.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-MMLQPHZ5.js";
13
+ } from "./chunk-UACYZCW4.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-BDGTZRZ6.js";
@@ -50,12 +50,12 @@ async function handleCheckDocs(input) {
50
50
  const projectPath = sanitizePath(input.path);
51
51
  const scope = input.scope ?? "coverage";
52
52
  if (scope === "integrity") {
53
- const { validateKnowledgeMap } = await import("./dist-6D2F2J57.js");
53
+ const { validateKnowledgeMap } = await import("./dist-MCTEX5QH.js");
54
54
  const result2 = await validateKnowledgeMap(projectPath);
55
55
  return resultToMcpResponse(result2);
56
56
  }
57
57
  if (scope === "all") {
58
- const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-6D2F2J57.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-MCTEX5QH.js");
59
59
  const domain2 = input.domain ?? "src";
60
60
  const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-STFGYKZH.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
@@ -94,7 +94,7 @@ async function handleCheckDocs(input) {
94
94
  }
95
95
  return resultToMcpResponse(Ok({ coverage, integrity }));
96
96
  }
97
- const { checkDocCoverage } = await import("./dist-6D2F2J57.js");
97
+ const { checkDocCoverage } = await import("./dist-MCTEX5QH.js");
98
98
  const domain = input.domain ?? "src";
99
99
  const { loadGraphStore } = await import("./graph-loader-STFGYKZH.js");
100
100
  const store = await loadGraphStore(projectPath);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Ok
6
6
  } from "./chunk-BDGTZRZ6.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KET4QQZB.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-MMLQPHZ5.js";
6
+ } from "./chunk-UACYZCW4.js";
7
7
  import {
8
8
  Err,
9
9
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-XAVMTAUT.js";
10
+ } from "./chunk-Y5HPJMTM.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-MMLQPHZ5.js";
13
+ } from "./chunk-UACYZCW4.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-BDGTZRZ6.js";
@@ -35,7 +35,7 @@ var checkPerformanceDefinition = {
35
35
  };
36
36
  async function handleCheckPerformance(input) {
37
37
  try {
38
- const { EntropyAnalyzer } = await import("./dist-6D2F2J57.js");
38
+ const { EntropyAnalyzer } = await import("./dist-MCTEX5QH.js");
39
39
  const typeFilter = input.type ?? "all";
40
40
  const projectPath = sanitizePath(input.path);
41
41
  let entryPoints;
@@ -98,7 +98,7 @@ var getPerfBaselinesDefinition = {
98
98
  };
99
99
  async function handleGetPerfBaselines(input) {
100
100
  try {
101
- const { BaselineManager } = await import("./dist-6D2F2J57.js");
101
+ const { BaselineManager } = await import("./dist-MCTEX5QH.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-6D2F2J57.js");
149
+ const { BaselineManager } = await import("./dist-MCTEX5QH.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-6D2F2J57.js");
179
+ const { CriticalPathResolver } = await import("./dist-MCTEX5QH.js");
180
180
  const resolver = new CriticalPathResolver(sanitizePath(input.path));
181
181
  const result = await resolver.resolve();
182
182
  return resultToMcpResponse(Ok(result));
@@ -6,6 +6,29 @@ import {
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
7
 
8
8
  // src/mcp/tools/assess-project.ts
9
+ import * as fs from "fs";
10
+ import * as path from "path";
11
+ var TURBO_LINT = { command: "npx", args: ["turbo", "run", "lint", "--force"] };
12
+ function resolveLintCommand(projectPath) {
13
+ let linter;
14
+ try {
15
+ const raw = fs.readFileSync(path.join(projectPath, "harness.config.json"), "utf-8");
16
+ const config = JSON.parse(raw);
17
+ linter = config.tooling?.linter ?? config.template?.tooling?.linter;
18
+ } catch {
19
+ return TURBO_LINT;
20
+ }
21
+ switch (linter) {
22
+ case "ruff":
23
+ return { command: "ruff", args: ["check", "."] };
24
+ case "golangci-lint":
25
+ return { command: "golangci-lint", args: ["run"] };
26
+ case "clippy":
27
+ return { command: "cargo", args: ["clippy"] };
28
+ default:
29
+ return TURBO_LINT;
30
+ }
31
+ }
9
32
  var assessProjectDefinition = {
10
33
  name: "assess_project",
11
34
  description: "Run all project health checks in parallel and return a unified report. Checks: validate, dependencies, docs, entropy, security, performance, lint.",
@@ -75,7 +98,7 @@ async function handleAssessProject(input) {
75
98
  let validateResult = null;
76
99
  if (checksToRun.has("validate")) {
77
100
  try {
78
- const { handleValidateProject } = await import("./validate-64KTEGIE.js");
101
+ const { handleValidateProject } = await import("./validate-VZORVK43.js");
79
102
  const result = await handleValidateProject({ path: projectPath });
80
103
  const out = parseToolResponse(result, "validate");
81
104
  if ("error" in out) {
@@ -104,7 +127,7 @@ async function handleAssessProject(input) {
104
127
  parallelChecks.push(
105
128
  (async () => {
106
129
  try {
107
- const { handleCheckDependencies } = await import("./architecture-YQH2NYXY.js");
130
+ const { handleCheckDependencies } = await import("./architecture-RCHFDI7E.js");
108
131
  const result = await handleCheckDependencies({ path: projectPath });
109
132
  const out = parseToolResponse(result, "deps");
110
133
  if ("error" in out) return out.error;
@@ -132,7 +155,7 @@ async function handleAssessProject(input) {
132
155
  parallelChecks.push(
133
156
  (async () => {
134
157
  try {
135
- const { handleCheckDocs } = await import("./docs-FP47JONV.js");
158
+ const { handleCheckDocs } = await import("./docs-BBMAN3CY.js");
136
159
  const result = await handleCheckDocs({ path: projectPath, scope: "coverage" });
137
160
  const out = parseToolResponse(result, "docs");
138
161
  if ("error" in out) return out.error;
@@ -160,7 +183,7 @@ async function handleAssessProject(input) {
160
183
  parallelChecks.push(
161
184
  (async () => {
162
185
  try {
163
- const { handleDetectEntropy } = await import("./entropy-DBW2INZU.js");
186
+ const { handleDetectEntropy } = await import("./entropy-5UP5N6AF.js");
164
187
  const result = await handleDetectEntropy({ path: projectPath, type: "all" });
165
188
  const out = parseToolResponse(result, "entropy");
166
189
  if ("error" in out) return out.error;
@@ -191,7 +214,7 @@ async function handleAssessProject(input) {
191
214
  parallelChecks.push(
192
215
  (async () => {
193
216
  try {
194
- const { handleRunSecurityScan } = await import("./security-4W2P5ZGI.js");
217
+ const { handleRunSecurityScan } = await import("./security-QLJLMSIW.js");
195
218
  const result = await handleRunSecurityScan({ path: projectPath });
196
219
  const out = parseToolResponse(result, "security");
197
220
  if ("error" in out) return out.error;
@@ -224,7 +247,7 @@ async function handleAssessProject(input) {
224
247
  parallelChecks.push(
225
248
  (async () => {
226
249
  try {
227
- const { handleCheckPerformance } = await import("./performance-FXYTGJGQ.js");
250
+ const { handleCheckPerformance } = await import("./performance-2N3CFXLR.js");
228
251
  const result = await handleCheckPerformance({ path: projectPath });
229
252
  if ("isError" in result && result.isError) {
230
253
  const msg = result.content[0]?.text ?? "Performance check failed";
@@ -266,7 +289,8 @@ async function handleAssessProject(input) {
266
289
  (async () => {
267
290
  try {
268
291
  const { execFileSync } = await import("child_process");
269
- const output = execFileSync("npx", ["turbo", "run", "lint", "--force"], {
292
+ const { command, args } = resolveLintCommand(projectPath);
293
+ const output = execFileSync(command, args, {
270
294
  cwd: projectPath,
271
295
  encoding: "utf-8",
272
296
  timeout: 6e4,
@@ -324,6 +348,7 @@ async function handleAssessProject(input) {
324
348
  }
325
349
 
326
350
  export {
351
+ resolveLintCommand,
327
352
  assessProjectDefinition,
328
353
  parseToolResponse,
329
354
  handleAssessProject
@@ -22,8 +22,8 @@ import {
22
22
  getDefaultRegistry,
23
23
  getOutline,
24
24
  getParser,
25
- init_chunk_MUWJHO2S,
26
- init_chunk_S4DTDJ6J,
25
+ init_chunk_IHRT6II2,
26
+ init_chunk_JZ7UO3OF,
27
27
  parseFile,
28
28
  parseSize,
29
29
  readFileContent,
@@ -31,7 +31,7 @@ import {
31
31
  resetParserCache,
32
32
  resolveFileToLayer,
33
33
  validateDependencies
34
- } from "./chunk-6YFHUIGT.js";
34
+ } from "./chunk-YJYUJSWK.js";
35
35
  import {
36
36
  AuthAuditEntrySchema,
37
37
  AuthTokenPublicSchema,
@@ -123,7 +123,7 @@ import {
123
123
  __export
124
124
  } from "./chunk-KFQGP6VL.js";
125
125
 
126
- // ../core/dist/chunk-FYTJQ2ZY.mjs
126
+ // ../core/dist/chunk-OFA2AAZK.mjs
127
127
  import { createHash } from "crypto";
128
128
  import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "fs";
129
129
  import { randomBytes } from "crypto";
@@ -759,10 +759,10 @@ async function toHaveMaxDepDepth(received, maxDepth) {
759
759
  };
760
760
  }
761
761
  var CircularDepsCollector, LayerViolationCollector, ArchBaselineManager, ComplexityCollector, CouplingCollector, ForbiddenImportCollector, ModuleSizeCollector, DepDepthCollector, defaultCollectors, archMatchers;
762
- var init_chunk_FYTJQ2ZY = __esm({
763
- "../core/dist/chunk-FYTJQ2ZY.mjs"() {
762
+ var init_chunk_OFA2AAZK = __esm({
763
+ "../core/dist/chunk-OFA2AAZK.mjs"() {
764
764
  "use strict";
765
- init_chunk_MUWJHO2S();
765
+ init_chunk_JZ7UO3OF();
766
766
  init_chunk_IIEDD47I();
767
767
  init_dist2();
768
768
  init_dist2();
@@ -1718,6 +1718,7 @@ __export(dist_exports, {
1718
1718
  parseManifest: () => parseManifest,
1719
1719
  parseMeta: () => parseMeta,
1720
1720
  parseProtectedRegions: () => parseProtectedRegions,
1721
+ parseReferencedIssues: () => parseReferencedIssues,
1721
1722
  parseRoadmap: () => parseRoadmap,
1722
1723
  parseSections: () => parseSections,
1723
1724
  parseSecurityConfig: () => parseSecurityConfig,
@@ -8970,10 +8971,12 @@ async function runEntropyCheck(projectRoot, config) {
8970
8971
  const entropyConfig = config.entropy || {};
8971
8972
  const perfConfig = config.performance || {};
8972
8973
  const entryPoints = entropyConfig.entryPoints ?? perfConfig.entryPoints;
8974
+ const driftConfig = entropyConfig.drift;
8973
8975
  const analyzer = new EntropyAnalyzer({
8974
8976
  rootDir: projectRoot,
8975
8977
  ...entryPoints ? { entryPoints } : {},
8976
- analyze: { drift: true, deadCode: true, patterns: false }
8978
+ ...driftConfig?.docPaths ? { docPaths: driftConfig.docPaths } : {},
8979
+ analyze: { drift: driftConfig ?? true, deadCode: true, patterns: false }
8977
8980
  });
8978
8981
  const result = await analyzer.analyze();
8979
8982
  if (!result.ok) {
@@ -12722,6 +12725,20 @@ async function fetchWithRetry(fetchFn, input, init, opts = RETRY_DEFAULTS) {
12722
12725
  }
12723
12726
  return lastResponse;
12724
12727
  }
12728
+ function parseReferencedIssues(text) {
12729
+ if (!text) return [];
12730
+ const re = /(?:[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+)?#(\d+)/g;
12731
+ const seen = /* @__PURE__ */ new Set();
12732
+ const out = [];
12733
+ for (const m of text.matchAll(re)) {
12734
+ const n = Number.parseInt(m[1], 10);
12735
+ if (Number.isInteger(n) && n > 0 && !seen.has(n)) {
12736
+ seen.add(n);
12737
+ out.push(n);
12738
+ }
12739
+ }
12740
+ return out;
12741
+ }
12725
12742
  function isValidTrackerShape(tracker) {
12726
12743
  if (!tracker || typeof tracker !== "object") return false;
12727
12744
  const t = tracker;
@@ -15133,7 +15150,7 @@ function arrayLen(arr) {
15133
15150
  return Array.isArray(arr) ? arr.length : 0;
15134
15151
  }
15135
15152
  async function gatherEntropyBlock(projectPath) {
15136
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-V633GUHY-OV335HGM.js");
15153
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-XRCV63KC-HLTEIKAJ.js");
15137
15154
  const analyzer = new EntropyAnalyzer2({
15138
15155
  rootDir: projectPath,
15139
15156
  include: ["src/**/*.ts", "src/**/*.tsx", "packages/*/src/**/*.ts"],
@@ -16049,9 +16066,9 @@ function writeStrategyDoc(doc, opts) {
16049
16066
  var WHATWG_BAD_PORTS, BAD_PORT_SET, VALID_TYPES, CONVENTIONAL_PATTERN, LOOKBACK_PATTERN, PulseDbSourceSchema, PulseSourcesSchema, PulseConfigSchema, KNOWN_SECTION_NAMES, ISO_DATE, PLACEHOLDER_INLINE, REQUIRED, ALLOWED, StrategyFrontmatterSchema, StrategySectionSchema, StrategyDocSchema, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ALL_SOLUTION_CATEGORIES, ISO_DATE2, BugTrackSchema, KnowledgeTrackSchema, BaseFrontmatter, SolutionDocFrontmatterSchema, TRACK_CATEGORIES, DEFAULT_AGNIX_TIMEOUT_MS, HARNESS_AGNIX_DISABLE, HARNESS_AGNIX_BIN, CLAUDE_MD_WARN_BYTES, CLAUDE_MD_ERROR_BYTES, CONTEXT_FILES, MIN_DESCRIPTION_LENGTH, SETTINGS_PATHS, KNOWN_HOOK_EVENTS, MCP_SETTINGS_FILES, REQUIRED_SECTIONS, SETTINGS_FILES, KNOWN_AGNIX_TOOLS, ROADMAP_READ_ALLOWLIST, ROADMAP_MD, DYNAMIC_ROADMAP_IO, KEBAB_CASE, TICKET_ID, DEFAULT_SECTIONS, DEFAULT_RATIOS, NODE_TYPE_TO_CATEGORY, SECTION_LEVEL_MAP, DEFAULT_LEVEL, DEFAULT_BUDGET, DEFAULT_LOADER_CONFIG, LEVEL_FRACTIONS, PHASE_PRIORITIES, ManifestSchema, BundleConstraintsSchema, BundleSchema, ContributionsSchema, LockfilePackageSchema, LockfileSchema, SharableLayerSchema, SharableForbiddenImportSchema, SharableBoundaryConfigSchema, SharableSecurityRulesSchema, VALID_SCOPES, LINE_PATTERN, START_PATTERN, END_PATTERN, readFile72, writeFile32, unlink22, mkdir22, copyFile2, DEFAULT_FIX_CONFIG, EXPORT_TYPE_KEYWORD, ALWAYS_UNSAFE_TYPES, idCounter, DEAD_CODE_FIX_ACTIONS, MustExportRuleSchema, MustExportDefaultRuleSchema, NoExportRuleSchema, MustImportRuleSchema, NoImportRuleSchema, NamingRuleSchema, MaxExportsRuleSchema, MaxLinesRuleSchema, RequireJSDocRuleSchema, RuleSchema, ConfigPatternSchema, PatternConfigSchema, DriftConfigSchema, DeadCodeConfigSchema, EntropyConfigSchema, BaselineManager, BenchmarkRunner, RegressionDetector, SOURCE_EXTENSIONS, FUNCTION_DECL_RE, CONST_DECL_RE, CriticalPathResolver, NoOpTelemetryAdapter, NoOpExecutor, ConsoleSink, feedbackConfig, ChecklistBuilder, AgentActionEmitter, globalEmitter, FileSink, NoOpSink, ConfidenceTierSchema, RegressionResultSchema, DirectionSchema, CategoryForecastSchema, SpecImpactSignalsSchema, SpecImpactEstimateSchema, ContributingFeatureSchema, AdjustedForecastSchema, PredictionWarningSchema, StabilityForecastSchema, PredictionResultSchema, PredictionOptionsSchema, VALID_STATUSES, EM_DASH, VALID_PRIORITIES, EM_DASH2, H3_NAME, FRONTMATTER, STATUS_RANK, META_FILE, ShardStore, MonolithStore, ALL_CATEGORIES, DIRECTION_THRESHOLD, PredictionEngine, DEFAULT_COEFFICIENTS, SpecImpactEstimator, EMPTY_HISTORY, ViolationHistoryManager, NORMALIZERS, MAX_SAMPLES, DEFAULT_WINDOW_WEEKS, DEFAULT_MIN_OCCURRENCES, FailureEntrySchema, HandoffSchema, GateCheckSchema, GateResultSchema, GateConfigSchema, HarnessStateSchema, DEFAULT_STATE, HARNESS_DIR, STATE_FILE, LEARNINGS_FILE, FAILURES_FILE, HANDOFF_FILE, GATE_CONFIG_FILE, INDEX_FILE, SESSIONS_DIR, SESSION_INDEX_FILE, SUMMARY_FILE, SESSION_STATE_FILE, ARCHIVE_DIR, CONTENT_HASHES_FILE, StreamInfoSchema, StreamIndexSchema, DEFAULT_STREAM_INDEX, EVENT_LOG_FILE, EVENT_BLOBS_DIR, MAX_LINE_BYTES, BLOB_REF_KEY, SNAPSHOT_FILE, STREAMS_DIR, STREAM_NAME_REGEX, branchCache, BRANCH_CACHE_TTL_MS, STATE_FILES, STATE_DIRS, MAX_CACHE_ENTRIES, learningsCacheMap, WEIGHTS, LOCK_RETRIES, LOCK_BACKOFFS, PROMOTABLE_OUTCOMES, failuresCacheMap, FAILURE_LINE_REGEX, SAFE_GATE_COMMAND, event_sourcing_exports, ScopeSchema, envelopeShape, StateImportedPayload, DecisionRecordedPayload, PositionSetPayload, BlockerOpenedPayload, BlockerResolvedPayload, ProgressSetPayload, SessionSummarizedPayload, LANES, LaneSchema, TaskRegisteredPayload, LaneTransitionedPayload, UserInputCapturedPayload, ApprovalRequestedPayload, ApprovalResolvedPayload, EventSchema, BlobRefSchema, StoredEventSchema, cached, localCounters, CORE_HANDLERS, KIND_LABEL, MATERIALIZE_DEBOUNCE_MS, pendingTimers, inflightMaterializes, ensured, TERMINAL_LANES, NON_TERMINAL, TABLE, RuleRegistry, DEFAULT_SECURITY_CONFIG, RuleOverrideSchema, SecurityConfigSchema, secretRules, injectionRules, xssRules, cryptoRules, pathTraversalRules, networkRules, deserializationRules, agentConfigRules, mcpRules, insecureDefaultsRules, sharpEdgesRules, nodeRules, expressRules, reactRules, goRules, SecurityScanner, OSV_ENDPOINT, DEFAULT_CACHE_DIR, DEFAULT_TTL_HOURS, hiddenUnicodePatterns, reRolingPatterns, permissionEscalationPatterns, encodedPayloadPatterns, indirectInjectionPatterns, contextManipulationPatterns, socialEngineeringPatterns, suspiciousPatterns, ALL_PATTERNS, DESTRUCTIVE_BASH, TAINT_DURATION_MS, DEFAULT_SESSION_ID, SecurityCategorySnapshotSchema, SupplyChainSnapshotSchema, SecurityTimelineSnapshotSchema, FindingLifecycleSchema, SecurityTimelineFileSchema, DirectionSchema2, SecurityTrendLineSchema, TrendAttributionSchema, SecurityTrendResultSchema, TimeToFixStatsSchema, TimeToFixResultSchema, EMPTY_SUPPLY_CHAIN, SecurityTimelineManager, ALL_CHECKS, STATUS_ICONS, CINotifier, ExclusionSet, PREFIX_PATTERNS, TEST_FILE_PATTERN, MD_FILE_PATTERN, ALL_DOMAINS, SECURITY_PATTERNS, JS_EXT_FALLBACKS, SEVERITY_RANK, SEVERITY_ORDER, SEVERITY_LABELS, VALIDATED_BY_RANK, VALIDATION_SCORES, DOMAIN_BASELINES, FACTOR_WEIGHTS, EVIDENCE_SATURATION, CORROBORATED_AGREEMENT, STANDALONE_AGREEMENT, AGREEMENT_LINE_GAP, COMPLIANCE_DESCRIPTOR, EXPORT_RE, BUG_DETECTION_DESCRIPTOR, SECURITY_DESCRIPTOR, EVAL_PATTERN, SECRET_PATTERNS, SQL_CONCAT_PATTERN, SHELL_EXEC_PATTERN, ARCHITECTURE_DESCRIPTOR, LARGE_FILE_THRESHOLD, VIOLATION_FILE_RE, LEARNINGS_DESCRIPTOR, RELEVANCE_THRESHOLD, ADVERSARIAL_DESCRIPTOR, UNVERIFIED_INPUT_PATTERN, PROMISE_NO_REJECT_PATTERN, UNGUARDED_OPTIONAL_CALL, COMPOSE_NO_AWAIT, FETCH_NO_TIMEOUT, TYPESCRIPT_STRICT_DESCRIPTOR, EXPLICIT_ANY_PATTERN, TS_IGNORE_PATTERN, UNSAFE_AS_UNKNOWN, NON_NULL_ASSERTION, VAGUE_HELPER_NAME, FRONTEND_RACES_DESCRIPTOR, AGENT_DESCRIPTORS, CONDITIONAL_SUBAGENT_DESCRIPTORS, AGENT_RUNNERS, SUBAGENT_ORDER, RISK_KEYWORDS, EXCLUDED_PATH_PATTERNS, ASYNC_UI_SIGNALS, WORD_BOUNDARY, DOWNGRADE_MAP, DEFAULT_PROVIDER_TIERS, SMALL_SUGGESTION_LINE_LIMIT, FILE_LINE_RANGE_PATTERN, FILE_LINE_PATTERN, FILE_ONLY_PATTERN, SECURITY_SENSITIVE_PATH, MIGRATION_PATH, TEST_PATH, CONFIG_PATH, STAGE_DOMAINS, CI_REVIEW_VERDICT_SCHEMA_VERSION, CI_RUNNERS, CI_ASSESSMENTS, CI_REVIEW_DOMAINS, ReviewFindingSchema, CiReviewVerdictSchema, VERDICT_MAP, RUNNER_PRESETS, VERDICT_MAP2, DEFAULT_EXEC_TIMEOUT_MS, DEFAULT_EXEC_MAX_STDOUT_BYTES, STDERR_CAP_BYTES, STDERR_TAIL_BYTES, defaultExecFile, EMPTY_TIER, EM_DASH3, DEFAULT_MILESTONE, MAX_CLOSEST_MATCHES, MACHINE_ASSIGNEE_PATTERNS, EXTERNAL_ID_RE, RETRY_DEFAULTS, GitHubIssuesSyncAdapter, syncMutex, PRIORITY_RANK, PRIORITY_RANK2, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, ConflictError, DEFAULTS, GitHubHttp, ETagStore, START_MARKER, END_MARKER, SERIALIZER_FIELDS, GitHubIssuesTrackerAdapter, LINEAR_ENDPOINT, EXTERNAL_PREFIX, HISTORY_MARKER, ISSUE_FIELDS, LinearTrackerAdapter, migrate_exports, HASH_RE, DEFAULT_CATCH_ALL, DEFAULT_INTAKE, DEFAULT_MAX_ACTIVE, InteractionTypeSchema, QuestionSchema, ConfirmationSchema, TransitionSchema, EmitInteractionInputSchema, ProjectScanner, SHELL_TEMPLATE, STYLES, SCRIPTS, MockLLMService, llmService, ContentPipeline, BlueprintGenerator, TOKENS_PER_MILLION, fallback_default, LITELLM_PRICING_URL, CACHE_TTL_MS, STALENESS_WARNING_DAYS, MICRODOLLARS_PER_DOLLAR, TOKENS_PER_MILLION2, StructuralStrategy, DEFAULT_TOKEN_BUDGET, CHARS_PER_TOKEN, TRUNCATION_MARKER, TruncationStrategy, CompactionPipeline, STABILITY_LOOKUP, TIER_ORDER, AnthropicCacheAdapter, TIER_ORDER2, OpenAICacheAdapter, TIER_ORDER3, CACHED_CONTENT_MARKER, GeminiCacheAdapter, VERSION, POSTHOG_BATCH_URL, MAX_ATTEMPTS, TIMEOUT_MS, DEFAULT_CAPACITY, CacheMetricsRecorder, RETRY_BACKOFFS_MS, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_BATCH_SIZE, defaultFetch, defaultWarn, OTLPExporter, SERVICE_NAME_ATTR, SpanKind, ModeSchema, SeveritySchema, TierSchema, StrengthFindingSchema, HarnessConfigSubsetSchema, HookFileSchema, ProjectContextSchema, AuditSummarySchema, AuditResultSchema, SEVERITY_WEIGHTS, clamp, HOOK_SCRIPT_TOKEN, NEVER_BLOCKS, ALWAYS_EXIT_ZERO, EXIT_ZERO_LINE, NONZERO_EXIT, GATE, ERREXIT, strength001NonblockingHooks, BASELINE_REWRITE, strength002Autobaseline, SKIP_RE, strength003SkipList, strength004EmptyThresholds, INIT_SKILL_PATH, DEFAULT_BASIC, strength005LowestTier, AUTO_PATTERN, COMMENT_LINE, NAME_VALUE_LINE, PAT_GATING, REVIEW_SIGNAL, strength006AutoapproveBaseline, CHECK_KEYS, SIGNAL_REGISTRY, HEALTH_SIGNAL_NAMES, CHECK_SIGNAL_MAP, SIGNAL_CATEGORY_MAP, strength007SnapshotSignalMismatch, ALL_RULES, HarnessStrengthAuditor, MAX_TOP_AFFECTED, CompoundLockHeldError, KNOWN_CATEGORIES, ProposalNotFoundError, ProposalConflictError, ALLOWED_FIELD_KEYS, PII_TOKENS, PII_FIELD_DENYLIST, PII_LINE_RE, ALLOWED_SET, PulseAdapterAlreadyRegisteredError, REGISTRY, MOCK_ADAPTER_NAME, ALLOWED_FIELD_SET, adapter, LOOKBACK_RE, MAX_LINES, INLINE_TEMPLATE, TRUNCATION_MARKER2, execFileAsync, FIX_RE, EMPTY_REPO_RE, execFileAsync2, TRACK_CATEGORIES2, STOPWORDS, KEYWORD_TO_CATEGORY, SECTION_ORDER, FILENAME;
16050
16067
  var init_dist3 = __esm({
16051
16068
  "../core/dist/index.mjs"() {
16052
- init_chunk_FYTJQ2ZY();
16053
- init_chunk_S4DTDJ6J();
16054
- init_chunk_MUWJHO2S();
16069
+ init_chunk_OFA2AAZK();
16070
+ init_chunk_IHRT6II2();
16071
+ init_chunk_JZ7UO3OF();
16055
16072
  init_chunk_XKLVJIPL();
16056
16073
  init_chunk_IIEDD47I();
16057
16074
  init_chunk_7P6ASYW6();
@@ -17179,7 +17196,7 @@ var init_dist3 = __esm({
17179
17196
  check: "Context validation",
17180
17197
  passed: graphData.graphExists && graphData.nodeCount > 0,
17181
17198
  severity: "info",
17182
- details: graphData.graphExists ? `Graph loaded: ${graphData.nodeCount} nodes, ${graphData.edgeCount} edges` : "No graph available \u2014 run harness scan to build the knowledge graph"
17199
+ details: graphData.graphExists ? `Graph loaded: ${graphData.nodeCount} nodes, ${graphData.edgeCount} edges` : "No graph available \u2014 run harness graph scan to build the knowledge graph"
17183
17200
  }) : void 0
17184
17201
  )
17185
17202
  );
@@ -23565,6 +23582,7 @@ export {
23565
23582
  parseExternalId,
23566
23583
  buildExternalId,
23567
23584
  GitHubIssuesSyncAdapter,
23585
+ parseReferencedIssues,
23568
23586
  loadTrackerSyncConfig,
23569
23587
  reconcileDoneFromClosedIssues,
23570
23588
  syncToExternal,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MMLQPHZ5.js";
3
+ } from "./chunk-UACYZCW4.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-Y6SUQC32.js";
4
4
  import {
5
5
  resolveConfig
6
- } from "./chunk-XAVMTAUT.js";
6
+ } from "./chunk-Y5HPJMTM.js";
7
7
  import {
8
8
  logger
9
9
  } from "./chunk-EBJQ6N4M.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-3WGJMBKH.js";
13
13
  import {
14
14
  init_dist
15
- } from "./chunk-MMLQPHZ5.js";
15
+ } from "./chunk-UACYZCW4.js";
16
16
  import {
17
17
  Ok
18
18
  } from "./chunk-BDGTZRZ6.js";
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-5RSXUAMN.js";
7
+ } from "./chunk-NCMJXBEO.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -4,15 +4,26 @@ import {
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
+ import {
8
+ findConfigFile,
9
+ loadConfig
10
+ } from "./chunk-Y5HPJMTM.js";
7
11
  import {
8
12
  init_dist
9
- } from "./chunk-MMLQPHZ5.js";
13
+ } from "./chunk-UACYZCW4.js";
10
14
  import {
11
15
  Ok
12
16
  } from "./chunk-BDGTZRZ6.js";
13
17
 
14
18
  // src/mcp/tools/entropy.ts
15
19
  init_dist();
20
+ function loadEntropyConfig(projectPath) {
21
+ const configFile = findConfigFile(projectPath);
22
+ if (!configFile.ok) return void 0;
23
+ const loaded = loadConfig(configFile.value);
24
+ if (!loaded.ok) return void 0;
25
+ return loaded.value.entropy;
26
+ }
16
27
  async function loadEntropyGraphOptions(projectPath) {
17
28
  const { loadGraphStore } = await import("./graph-loader-STFGYKZH.js");
18
29
  const store = await loadGraphStore(projectPath);
@@ -127,17 +138,24 @@ function buildSummaryResponse(report) {
127
138
  }
128
139
  async function handleDetectEntropy(input) {
129
140
  try {
130
- const { EntropyAnalyzer } = await import("./dist-6D2F2J57.js");
141
+ const { EntropyAnalyzer } = await import("./dist-MCTEX5QH.js");
131
142
  const typeFilter = input.type ?? "all";
143
+ const projectPath = sanitizePath(input.path);
144
+ const entropy = loadEntropyConfig(projectPath);
145
+ const driftConfig = entropy?.drift;
146
+ const driftEnabled = typeFilter === "all" || typeFilter === "drift";
132
147
  const analyzer = new EntropyAnalyzer({
133
- rootDir: sanitizePath(input.path),
148
+ rootDir: projectPath,
149
+ ...entropy?.entryPoints && { entryPoints: entropy.entryPoints },
150
+ ...entropy?.excludePatterns && { exclude: entropy.excludePatterns },
151
+ ...driftConfig?.docPaths && { docPaths: driftConfig.docPaths },
134
152
  analyze: {
135
- drift: typeFilter === "all" || typeFilter === "drift",
153
+ drift: driftEnabled ? driftConfig ?? true : false,
136
154
  deadCode: typeFilter === "all" || typeFilter === "dead-code",
137
155
  patterns: typeFilter === "all" || typeFilter === "patterns"
138
156
  }
139
157
  });
140
- const graphOptions = await loadEntropyGraphOptions(sanitizePath(input.path));
158
+ const graphOptions = await loadEntropyGraphOptions(projectPath);
141
159
  const result = await analyzer.analyze(graphOptions);
142
160
  if (input.mode === "summary" && result.ok && !input.autoFix) {
143
161
  return buildSummaryResponse(result.value);
@@ -146,7 +164,7 @@ async function handleDetectEntropy(input) {
146
164
  return resultToMcpResponse(result);
147
165
  }
148
166
  if (!result.ok) return resultToMcpResponse(result);
149
- const { createFixes, applyFixes, generateSuggestions } = await import("./dist-6D2F2J57.js");
167
+ const { createFixes, applyFixes, generateSuggestions } = await import("./dist-MCTEX5QH.js");
150
168
  const report = result.value;
151
169
  const deadCode = report.deadCode;
152
170
  const fixTypesConfig = input.fixTypes ? { fixTypes: input.fixTypes } : void 0;
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-3WGJMBKH.js";
8
8
  import {
9
9
  init_dist as init_dist2
10
- } from "./chunk-MMLQPHZ5.js";
10
+ } from "./chunk-UACYZCW4.js";
11
11
  import {
12
12
  Err,
13
13
  Ok
@@ -72,13 +72,29 @@ var AgentConfigSchema = z.object({
72
72
  /** Routing rules for orchestrator agent dispatch. */
73
73
  routing: RoutingConfigSchema.optional()
74
74
  });
75
+ var DriftConfigSchema = z.object({
76
+ /** Glob patterns for docs to scan for drift (default: docs/**, README) */
77
+ docPaths: z.array(z.string()).optional(),
78
+ /** Flag doc references to code symbols that no longer exist (default: true) */
79
+ checkApiSignatures: z.boolean().optional(),
80
+ /** Check fenced code examples against the codebase (default: true) */
81
+ checkExamples: z.boolean().optional(),
82
+ /** Check documented structure against the filesystem (default: true) */
83
+ checkStructure: z.boolean().optional(),
84
+ /** Regexes matched against a reference to exclude it from drift reporting */
85
+ ignorePatterns: z.array(z.string()).optional(),
86
+ /** Doc-path prefixes whose symbols describe intended future code (ADRs, proposals) */
87
+ forwardLookingPaths: z.array(z.string()).optional()
88
+ });
75
89
  var EntropyConfigSchema = z.object({
76
90
  /** Explicit entry points for reachability analysis (overrides auto-detection) */
77
91
  entryPoints: z.array(z.string()).optional(),
78
92
  /** Patterns to exclude from entropy analysis */
79
93
  excludePatterns: z.array(z.string()).default([...skipDirGlobs(), "**/*.test.ts"]),
80
94
  /** Whether to automatically attempt to fix simple entropy issues */
81
- autoFix: z.boolean().default(false)
95
+ autoFix: z.boolean().default(false),
96
+ /** Documentation-drift detection tuning (scope/disable individual checks) */
97
+ drift: DriftConfigSchema.optional()
82
98
  });
83
99
  var PhaseGateMappingSchema = z.object({
84
100
  /** Pattern for implementation files */