@harness-engineering/cli 1.26.1 → 1.27.1

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 (149) hide show
  1. package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +3 -1
  2. package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +3 -1
  3. package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +4 -0
  4. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +55 -24
  5. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +16 -5
  6. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +21 -6
  7. package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +2 -0
  8. package/dist/agents/skills/claude-code/harness-debugging/SKILL.md +13 -1
  9. package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +4 -0
  10. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +16 -6
  11. package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +2 -0
  12. package/dist/agents/skills/claude-code/harness-integration/SKILL.md +560 -0
  13. package/dist/agents/skills/claude-code/harness-integration/skill.yaml +65 -0
  14. package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +2 -0
  15. package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +4 -0
  16. package/dist/agents/skills/claude-code/harness-perf/SKILL.md +9 -7
  17. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +77 -10
  18. package/dist/agents/skills/claude-code/harness-refactoring/SKILL.md +13 -4
  19. package/dist/agents/skills/claude-code/harness-security-scan/SKILL.md +3 -1
  20. package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +4 -0
  21. package/dist/agents/skills/claude-code/harness-tdd/SKILL.md +5 -2
  22. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +4 -0
  23. package/dist/agents/skills/codex/cleanup-dead-code/SKILL.md +3 -1
  24. package/dist/agents/skills/codex/detect-doc-drift/SKILL.md +3 -1
  25. package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +4 -0
  26. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +55 -24
  27. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +16 -5
  28. package/dist/agents/skills/codex/harness-code-review/SKILL.md +21 -6
  29. package/dist/agents/skills/codex/harness-codebase-cleanup/SKILL.md +2 -0
  30. package/dist/agents/skills/codex/harness-debugging/SKILL.md +13 -1
  31. package/dist/agents/skills/codex/harness-dependency-health/SKILL.md +4 -0
  32. package/dist/agents/skills/codex/harness-execution/SKILL.md +16 -6
  33. package/dist/agents/skills/codex/harness-impact-analysis/SKILL.md +2 -0
  34. package/dist/agents/skills/codex/harness-integration/SKILL.md +560 -0
  35. package/dist/agents/skills/codex/harness-integration/skill.yaml +65 -0
  36. package/dist/agents/skills/codex/harness-integrity/SKILL.md +2 -0
  37. package/dist/agents/skills/codex/harness-onboarding/SKILL.md +4 -0
  38. package/dist/agents/skills/codex/harness-perf/SKILL.md +9 -7
  39. package/dist/agents/skills/codex/harness-planning/SKILL.md +77 -10
  40. package/dist/agents/skills/codex/harness-refactoring/SKILL.md +13 -4
  41. package/dist/agents/skills/codex/harness-security-scan/SKILL.md +3 -1
  42. package/dist/agents/skills/codex/harness-soundness-review/SKILL.md +4 -0
  43. package/dist/agents/skills/codex/harness-tdd/SKILL.md +5 -2
  44. package/dist/agents/skills/codex/harness-verification/SKILL.md +4 -0
  45. package/dist/agents/skills/cursor/cleanup-dead-code/SKILL.md +3 -1
  46. package/dist/agents/skills/cursor/detect-doc-drift/SKILL.md +3 -1
  47. package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +4 -0
  48. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +55 -24
  49. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +16 -5
  50. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +21 -6
  51. package/dist/agents/skills/cursor/harness-codebase-cleanup/SKILL.md +2 -0
  52. package/dist/agents/skills/cursor/harness-debugging/SKILL.md +13 -1
  53. package/dist/agents/skills/cursor/harness-dependency-health/SKILL.md +4 -0
  54. package/dist/agents/skills/cursor/harness-execution/SKILL.md +16 -6
  55. package/dist/agents/skills/cursor/harness-impact-analysis/SKILL.md +2 -0
  56. package/dist/agents/skills/cursor/harness-integration/SKILL.md +560 -0
  57. package/dist/agents/skills/cursor/harness-integration/skill.yaml +65 -0
  58. package/dist/agents/skills/cursor/harness-integrity/SKILL.md +2 -0
  59. package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +4 -0
  60. package/dist/agents/skills/cursor/harness-perf/SKILL.md +9 -7
  61. package/dist/agents/skills/cursor/harness-planning/SKILL.md +77 -10
  62. package/dist/agents/skills/cursor/harness-refactoring/SKILL.md +13 -4
  63. package/dist/agents/skills/cursor/harness-security-scan/SKILL.md +3 -1
  64. package/dist/agents/skills/cursor/harness-soundness-review/SKILL.md +4 -0
  65. package/dist/agents/skills/cursor/harness-tdd/SKILL.md +5 -2
  66. package/dist/agents/skills/cursor/harness-verification/SKILL.md +4 -0
  67. package/dist/agents/skills/gemini-cli/cleanup-dead-code/SKILL.md +3 -1
  68. package/dist/agents/skills/gemini-cli/detect-doc-drift/SKILL.md +3 -1
  69. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +4 -0
  70. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +55 -24
  71. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +16 -5
  72. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +21 -6
  73. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +2 -0
  74. package/dist/agents/skills/gemini-cli/harness-debugging/SKILL.md +13 -1
  75. package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +4 -0
  76. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +16 -6
  77. package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +2 -0
  78. package/dist/agents/skills/gemini-cli/harness-integration/SKILL.md +560 -0
  79. package/dist/agents/skills/gemini-cli/harness-integration/skill.yaml +65 -0
  80. package/dist/agents/skills/gemini-cli/harness-integrity/SKILL.md +2 -0
  81. package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +4 -0
  82. package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +9 -7
  83. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +77 -10
  84. package/dist/agents/skills/gemini-cli/harness-refactoring/SKILL.md +13 -4
  85. package/dist/agents/skills/gemini-cli/harness-security-scan/SKILL.md +3 -1
  86. package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +4 -0
  87. package/dist/agents/skills/gemini-cli/harness-tdd/SKILL.md +5 -2
  88. package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +4 -0
  89. package/dist/{agents-md-VI3HLR7E.js → agents-md-2RN666DE.js} +3 -3
  90. package/dist/{architecture-ZDDKEVID.js → architecture-ZR33YKJB.js} +4 -4
  91. package/dist/{assess-project-Y6W7YDUA.js → assess-project-LLWWEQEV.js} +1 -1
  92. package/dist/bin/harness-mcp.js +17 -16
  93. package/dist/bin/harness.js +27 -26
  94. package/dist/{business-knowledge-6RHYJOB3.js → business-knowledge-EISPR7FU.js} +1 -1
  95. package/dist/{check-phase-gate-CXR3VM22.js → check-phase-gate-ZVG56NT2.js} +4 -4
  96. package/dist/chunk-27AJKSQY.js +107 -0
  97. package/dist/{chunk-DBIX3X4H.js → chunk-2FOLD76X.js} +2 -2
  98. package/dist/{chunk-3AMQYWGT.js → chunk-3AJW7VQ3.js} +2 -2
  99. package/dist/{chunk-FUND5WJR.js → chunk-3XMOWLK3.js} +2 -2
  100. package/dist/{chunk-OLW7BJ5N.js → chunk-776JFSPK.js} +1 -1
  101. package/dist/{chunk-VKS3F46M.js → chunk-A4ETL34H.js} +7 -2
  102. package/dist/{chunk-JV4Y2U5F.js → chunk-BO4AJZRE.js} +1 -1
  103. package/dist/{chunk-WZ7UHPT3.js → chunk-BZZNYHRY.js} +9 -9
  104. package/dist/{chunk-ZN6ROTYP.js → chunk-C7RPQWBG.js} +1 -1
  105. package/dist/{chunk-RAVD7QLY.js → chunk-CJYNZMOP.js} +8 -8
  106. package/dist/{chunk-PNNFCVW4.js → chunk-EGRQHLDM.js} +5 -5
  107. package/dist/{chunk-2BPPS6YQ.js → chunk-EHTUWULH.js} +458 -363
  108. package/dist/{chunk-N6B6RKQQ.js → chunk-EICASBYP.js} +1 -1
  109. package/dist/{chunk-K56DTX7G.js → chunk-F3Y64VNF.js} +6 -6
  110. package/dist/{chunk-ORNEK65Y.js → chunk-FUS4OOGC.js} +1 -1
  111. package/dist/{chunk-2FPUPRCY.js → chunk-GAIOIINV.js} +594 -127
  112. package/dist/{chunk-YC4EYIER.js → chunk-IBTHD2UA.js} +132 -77
  113. package/dist/{chunk-RC5ZY3EV.js → chunk-IOW3MW2K.js} +2 -2
  114. package/dist/{chunk-B66LRB5M.js → chunk-L3Y7L4EG.js} +1 -1
  115. package/dist/{chunk-BK4DJIIY.js → chunk-MGPVA2EM.js} +27 -4
  116. package/dist/{chunk-NY7DTZ6K.js → chunk-Q5DKIL46.js} +3 -3
  117. package/dist/{chunk-TY2ESLVL.js → chunk-SDDQPMZK.js} +1 -1
  118. package/dist/{chunk-7GY6WNEI.js → chunk-SDPHFDQS.js} +1 -1
  119. package/dist/{chunk-56A6OXVA.js → chunk-T7UZOJF4.js} +9 -9
  120. package/dist/{chunk-AMRC4FU2.js → chunk-VCC47EXU.js} +109 -57
  121. package/dist/{chunk-Q3ZLVMQM.js → chunk-XKU37HGH.js} +10 -1
  122. package/dist/{chunk-TSVYBDDE.js → chunk-YZH4I4JO.js} +1 -1
  123. package/dist/{ci-workflow-EW37KVPS.js → ci-workflow-JFOL4YWW.js} +3 -3
  124. package/dist/{dist-NCNAXUFD.js → dist-BZS2XRLG.js} +5 -1
  125. package/dist/{dist-CJDGASPP.js → dist-CPKL5Y2R.js} +2 -2
  126. package/dist/{docs-4XI2FQW2.js → docs-FUTRJQHA.js} +4 -4
  127. package/dist/{engine-4L4CDTHU.js → engine-FB3HCNVT.js} +3 -3
  128. package/dist/{entropy-PBYSIQYS.js → entropy-FIEE4YDA.js} +3 -3
  129. package/dist/{feedback-OTIFW5MK.js → feedback-7EC4T6XG.js} +1 -1
  130. package/dist/{generate-agent-definitions-CZGUXIIN.js → generate-agent-definitions-FOSFADNR.js} +4 -4
  131. package/dist/{graph-loader-RDXSEBD7.js → graph-loader-QEI7SYOQ.js} +1 -1
  132. package/dist/hooks/adoption-tracker.js +36 -8
  133. package/dist/hooks/sentinel-pre.js +3 -2
  134. package/dist/hooks/telemetry-reporter.js +34 -15
  135. package/dist/index-builder-3AOQ3ZII.js +13 -0
  136. package/dist/index.d.ts +15 -0
  137. package/dist/index.js +29 -28
  138. package/dist/{loader-UZOXCWFC.js → loader-HXUOBTYA.js} +3 -3
  139. package/dist/{mcp-GWVVV6LH.js → mcp-NUG4BMKJ.js} +17 -16
  140. package/dist/{performance-5UQPP3XX.js → performance-TYXBCTR7.js} +4 -4
  141. package/dist/{review-pipeline-65V4EO6O.js → review-pipeline-B4WPU6BQ.js} +3 -3
  142. package/dist/{runtime-PXX7HNB3.js → runtime-HQQNOARD.js} +3 -3
  143. package/dist/{scan-WM7XDUF7.js → scan-M4EGDAQ2.js} +1 -1
  144. package/dist/{security-CAYDRZIZ.js → security-25VFLIAO.js} +1 -1
  145. package/dist/templates/orchestrator/harness.orchestrator.md +18 -8
  146. package/dist/{validate-CWGXR7QM.js → validate-EAVGKZQB.js} +4 -4
  147. package/dist/{validate-cross-check-BKCNLZYG.js → validate-cross-check-SPL3H4O5.js} +3 -3
  148. package/package.json +13 -5
  149. package/dist/hooks/profiles.ts +0 -48
@@ -13,13 +13,13 @@ import {
13
13
  NODE_STABILITY,
14
14
  init_dist as init_dist2,
15
15
  queryTraceability
16
- } from "./chunk-2FPUPRCY.js";
16
+ } from "./chunk-GAIOIINV.js";
17
17
  import {
18
18
  __esm,
19
19
  __export
20
20
  } from "./chunk-KFQGP6VL.js";
21
21
 
22
- // ../core/dist/chunk-UWAI34RR.mjs
22
+ // ../core/dist/chunk-H73442AZ.mjs
23
23
  import { z } from "zod";
24
24
  import { createHash } from "crypto";
25
25
  import { minimatch } from "minimatch";
@@ -1734,8 +1734,8 @@ async function toHaveMaxDepDepth(received, maxDepth) {
1734
1734
  };
1735
1735
  }
1736
1736
  var ArchMetricCategorySchema, ViolationSchema, MetricResultSchema, CategoryBaselineSchema, ArchBaselineSchema, CategoryRegressionSchema, ArchDiffResultSchema, ThresholdConfigSchema, ArchConfigSchema, ConstraintRuleSchema, ViolationSnapshotSchema, ViolationHistorySchema, EmergenceConfidenceSchema, EmergentConstraintSuggestionSchema, EmergenceResultSchema, accessAsync, readFileAsync, EXTENSION_BY_LANG, CircularDepsCollector, TypeScriptParser, EXTENSION_MAP, parserCache, initialized, GRAMMAR_MAP, TOP_LEVEL_TYPES, METHOD_TYPES, IDENTIFIER_TYPES, NAME_EXTRACTORS, pythonStrategy, goStrategy, RUST_USE_ARG_TYPES, RUST_PUB_ITEM_TYPES, rustStrategy, JAVA_IMPORT_TYPES, JAVA_EXPORT_TYPES, javaStrategy, STRATEGIES, TreeSitterParser, ParserRegistry, defaultRegistry, LayerViolationCollector, ArchBaselineManager, DEFAULT_THRESHOLDS, FUNCTION_PATTERNS, DECISION_PATTERNS, ComplexityCollector, DEFAULT_THRESHOLDS2, CouplingCollector, ForbiddenImportCollector, ModuleSizeCollector, DepDepthCollector, defaultCollectors, archMatchers;
1737
- var init_chunk_UWAI34RR = __esm({
1738
- "../core/dist/chunk-UWAI34RR.mjs"() {
1737
+ var init_chunk_H73442AZ = __esm({
1738
+ "../core/dist/chunk-H73442AZ.mjs"() {
1739
1739
  "use strict";
1740
1740
  init_dist();
1741
1741
  ArchMetricCategorySchema = z.enum([
@@ -2402,6 +2402,9 @@ var init_chunk_UWAI34RR = __esm({
2402
2402
  };
2403
2403
  }
2404
2404
  }
2405
+ for (const baseline of Object.values(metrics)) {
2406
+ baseline.violationIds = [...new Set(baseline.violationIds)];
2407
+ }
2405
2408
  return {
2406
2409
  version: 1,
2407
2410
  updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -3289,11 +3292,11 @@ import { minimatch as minimatch4 } from "minimatch";
3289
3292
  import { z as z8 } from "zod";
3290
3293
  import * as fs24 from "fs";
3291
3294
  import * as path21 from "path";
3292
- import { readFileSync as readFileSync222, writeFileSync as writeFileSync15, unlinkSync, mkdirSync as mkdirSync14, readdirSync as readdirSync3 } from "fs";
3295
+ import { readFileSync as readFileSync222, writeFileSync as writeFileSync15, unlinkSync as unlinkSync2, mkdirSync as mkdirSync14, readdirSync as readdirSync3 } from "fs";
3293
3296
  import { join as join362, dirname as dirname12 } from "path";
3294
3297
  import { createHash as createHash32 } from "crypto";
3295
3298
  import { z as z9 } from "zod";
3296
- import { readFileSync as readFileSync23, writeFileSync as writeFileSync16, renameSync as renameSync52, mkdirSync as mkdirSync15, existsSync as existsSync332 } from "fs";
3299
+ import { readFileSync as readFileSync23, writeFileSync as writeFileSync16, renameSync as renameSync82, mkdirSync as mkdirSync15, existsSync as existsSync332 } from "fs";
3297
3300
  import { execSync as execSync3 } from "child_process";
3298
3301
  import { randomBytes as randomBytes22 } from "crypto";
3299
3302
  import { join as join372, dirname as dirname13 } from "path";
@@ -6092,45 +6095,54 @@ async function detectDocDrift(snapshot, config, graphDriftData) {
6092
6095
  severity
6093
6096
  });
6094
6097
  }
6095
- function resolveImportToFile(importSource, fromFile, snapshot) {
6098
+ function buildFileIndex(snapshot) {
6099
+ const index = /* @__PURE__ */ new Map();
6100
+ for (const file of snapshot.files) {
6101
+ index.set(file.path, file);
6102
+ }
6103
+ return index;
6104
+ }
6105
+ function resolveImportToFile(importSource, fromFile, snapshot, fileIndex) {
6096
6106
  if (!importSource.startsWith(".")) {
6097
6107
  return null;
6098
6108
  }
6109
+ const hasFile = fileIndex ? (p) => fileIndex.has(p) : (p) => snapshot.files.some((f) => f.path === p);
6099
6110
  const fromDir = dirname6(fromFile);
6100
6111
  let resolved = resolve5(fromDir, importSource);
6101
6112
  if (!resolved.endsWith(".ts") && !resolved.endsWith(".tsx")) {
6102
6113
  const withTs = resolved + ".ts";
6103
- if (snapshot.files.some((f) => f.path === withTs)) {
6114
+ if (hasFile(withTs)) {
6104
6115
  return withTs;
6105
6116
  }
6106
6117
  const withIndex = resolve5(resolved, "index.ts");
6107
- if (snapshot.files.some((f) => f.path === withIndex)) {
6118
+ if (hasFile(withIndex)) {
6108
6119
  return withIndex;
6109
6120
  }
6110
6121
  }
6111
- if (snapshot.files.some((f) => f.path === resolved)) {
6122
+ if (hasFile(resolved)) {
6112
6123
  return resolved;
6113
6124
  }
6114
6125
  return null;
6115
6126
  }
6116
- function enqueueResolved(sources, current, snapshot, visited, queue) {
6127
+ function enqueueResolved(sources, current, snapshot, visited, queue, fileIndex) {
6117
6128
  for (const item of sources) {
6118
6129
  if (!item.source) continue;
6119
- const resolved = resolveImportToFile(item.source, current, snapshot);
6130
+ const resolved = resolveImportToFile(item.source, current, snapshot, fileIndex);
6120
6131
  if (resolved && !visited.has(resolved)) {
6121
6132
  queue.push(resolved);
6122
6133
  }
6123
6134
  }
6124
6135
  }
6125
- function processReachabilityNode(current, snapshot, reachability, visited, queue) {
6136
+ function processReachabilityNode(current, snapshot, reachability, visited, queue, fileIndex) {
6126
6137
  reachability.set(current, true);
6127
- const sourceFile = snapshot.files.find((f) => f.path === current);
6138
+ const sourceFile = fileIndex ? fileIndex.get(current) : snapshot.files.find((f) => f.path === current);
6128
6139
  if (!sourceFile) return;
6129
- enqueueResolved(sourceFile.imports, current, snapshot, visited, queue);
6140
+ enqueueResolved(sourceFile.imports, current, snapshot, visited, queue, fileIndex);
6130
6141
  const reExports = sourceFile.exports.filter((e) => e.isReExport);
6131
- enqueueResolved(reExports, current, snapshot, visited, queue);
6142
+ enqueueResolved(reExports, current, snapshot, visited, queue, fileIndex);
6132
6143
  }
6133
6144
  function buildReachabilityMap(snapshot) {
6145
+ const fileIndex = buildFileIndex(snapshot);
6134
6146
  const reachability = /* @__PURE__ */ new Map();
6135
6147
  for (const file of snapshot.files) {
6136
6148
  reachability.set(file.path, false);
@@ -6141,11 +6153,12 @@ function buildReachabilityMap(snapshot) {
6141
6153
  const current = queue.shift();
6142
6154
  if (visited.has(current)) continue;
6143
6155
  visited.add(current);
6144
- processReachabilityNode(current, snapshot, reachability, visited, queue);
6156
+ processReachabilityNode(current, snapshot, reachability, visited, queue, fileIndex);
6145
6157
  }
6146
6158
  return reachability;
6147
6159
  }
6148
6160
  function buildExportUsageMap(snapshot) {
6161
+ const fileIndex = buildFileIndex(snapshot);
6149
6162
  const usageMap = /* @__PURE__ */ new Map();
6150
6163
  for (const file of snapshot.files) {
6151
6164
  for (const exp of file.exports) {
@@ -6155,9 +6168,9 @@ function buildExportUsageMap(snapshot) {
6155
6168
  }
6156
6169
  for (const file of snapshot.files) {
6157
6170
  for (const imp of file.imports) {
6158
- const resolvedFile = resolveImportToFile(imp.source, file.path, snapshot);
6171
+ const resolvedFile = resolveImportToFile(imp.source, file.path, snapshot, fileIndex);
6159
6172
  if (!resolvedFile) continue;
6160
- const sourceFile = snapshot.files.find((f) => f.path === resolvedFile);
6173
+ const sourceFile = fileIndex.get(resolvedFile);
6161
6174
  if (!sourceFile) continue;
6162
6175
  for (const specifier of imp.specifiers) {
6163
6176
  const matchingExport = sourceFile.exports.find(
@@ -8364,7 +8377,9 @@ async function saveState(projectPath, state, stream, session) {
8364
8377
  const stateDir = dirResult.value;
8365
8378
  const statePath = path8.join(stateDir, STATE_FILE);
8366
8379
  fs11.mkdirSync(stateDir, { recursive: true });
8367
- fs11.writeFileSync(statePath, JSON.stringify(state, null, 2));
8380
+ const tmpPath = statePath + ".tmp";
8381
+ fs11.writeFileSync(tmpPath, JSON.stringify(state, null, 2));
8382
+ fs11.renameSync(tmpPath, statePath);
8368
8383
  return Ok(void 0);
8369
8384
  } catch (error) {
8370
8385
  return Err(
@@ -8463,7 +8478,9 @@ function loadContentHashes(stateDir) {
8463
8478
  }
8464
8479
  function saveContentHashes(stateDir, index) {
8465
8480
  const hashesPath = path9.join(stateDir, CONTENT_HASHES_FILE);
8466
- fs12.writeFileSync(hashesPath, JSON.stringify(index, null, 2) + "\n");
8481
+ const tmpPath = hashesPath + ".tmp";
8482
+ fs12.writeFileSync(tmpPath, JSON.stringify(index, null, 2) + "\n");
8483
+ fs12.renameSync(tmpPath, hashesPath);
8467
8484
  }
8468
8485
  function rebuildContentHashes(stateDir, learningsFile) {
8469
8486
  const learningsPath = path9.join(stateDir, learningsFile);
@@ -8673,6 +8690,34 @@ function checkOverlap(newEntry, existingEntries, options) {
8673
8690
  ...bestScore >= threshold && bestEntry ? { matchedEntry: bestEntry, matchedHash: computeEntryHash(bestEntry) } : {}
8674
8691
  };
8675
8692
  }
8693
+ function sleep(ms) {
8694
+ return new Promise((resolve8) => setTimeout(resolve8, ms));
8695
+ }
8696
+ async function acquireFileLock(lockPath) {
8697
+ for (let attempt = 0; attempt < LOCK_RETRIES; attempt++) {
8698
+ try {
8699
+ const fd = fs14.openSync(
8700
+ lockPath,
8701
+ fs14.constants.O_CREAT | fs14.constants.O_EXCL | fs14.constants.O_WRONLY
8702
+ );
8703
+ fs14.closeSync(fd);
8704
+ return;
8705
+ } catch (err) {
8706
+ const isExist = err instanceof Error && "code" in err && err.code === "EEXIST";
8707
+ if (!isExist) throw err;
8708
+ if (attempt < LOCK_RETRIES - 1) {
8709
+ await sleep(LOCK_BACKOFFS[attempt]);
8710
+ }
8711
+ }
8712
+ }
8713
+ throw new Error(`Failed to acquire lock after ${LOCK_RETRIES} attempts: ${lockPath}`);
8714
+ }
8715
+ function releaseFileLock(lockPath) {
8716
+ try {
8717
+ fs14.unlinkSync(lockPath);
8718
+ } catch {
8719
+ }
8720
+ }
8676
8721
  function loadOrRebuildHashes(stateDir, learningsPath) {
8677
8722
  const hashesPath = path11.join(stateDir, CONTENT_HASHES_FILE);
8678
8723
  if (fs14.existsSync(hashesPath)) {
@@ -8708,52 +8753,58 @@ async function appendLearning(projectPath, learning, skillName, outcome, stream,
8708
8753
  const stateDir = dirResult.value;
8709
8754
  const learningsPath = path11.join(stateDir, LEARNINGS_FILE);
8710
8755
  fs14.mkdirSync(stateDir, { recursive: true });
8711
- const normalizedContent = normalizeLearningContent(learning);
8712
- const contentHash = computeContentHash(normalizedContent);
8713
- const contentHashes = loadOrRebuildHashes(stateDir, learningsPath);
8714
- if (contentHashes[contentHash]) {
8715
- return Ok({ appended: false });
8716
- }
8717
- const timestamp = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
8718
- const bulletLine = formatBulletLine(
8719
- timestamp,
8720
- learning,
8721
- skillName,
8722
- outcome,
8723
- rootCause,
8724
- triedAndFailed
8725
- );
8726
- const fmTags = [];
8727
- if (skillName) fmTags.push(skillName);
8728
- if (outcome) fmTags.push(outcome);
8729
- const hash = crypto3.createHash("sha256").update(bulletLine).digest("hex").slice(0, 8);
8730
- const tagsStr = fmTags.length > 0 ? ` tags:${fmTags.join(",")}` : "";
8731
- const entry = `
8756
+ const lockPath = learningsPath + ".lock";
8757
+ await acquireFileLock(lockPath);
8758
+ try {
8759
+ const normalizedContent = normalizeLearningContent(learning);
8760
+ const contentHash = computeContentHash(normalizedContent);
8761
+ const contentHashes = loadOrRebuildHashes(stateDir, learningsPath);
8762
+ if (contentHashes[contentHash]) {
8763
+ return Ok({ appended: false });
8764
+ }
8765
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
8766
+ const bulletLine = formatBulletLine(
8767
+ timestamp,
8768
+ learning,
8769
+ skillName,
8770
+ outcome,
8771
+ rootCause,
8772
+ triedAndFailed
8773
+ );
8774
+ const fmTags = [];
8775
+ if (skillName) fmTags.push(skillName);
8776
+ if (outcome) fmTags.push(outcome);
8777
+ const hash = crypto3.createHash("sha256").update(bulletLine).digest("hex").slice(0, 8);
8778
+ const tagsStr = fmTags.length > 0 ? ` tags:${fmTags.join(",")}` : "";
8779
+ const entry = `
8732
8780
  <!-- hash:${hash}${tagsStr} -->
8733
8781
  ${bulletLine}
8734
8782
  `;
8735
- let overlapResult;
8736
- let existingLineCount;
8737
- if (!fs14.existsSync(learningsPath)) {
8738
- fs14.writeFileSync(learningsPath, `# Learnings
8783
+ let overlapResult;
8784
+ let existingLineCount;
8785
+ if (!fs14.existsSync(learningsPath)) {
8786
+ fs14.writeFileSync(learningsPath, `# Learnings
8739
8787
  ${entry}`);
8740
- existingLineCount = 1;
8741
- } else {
8742
- const existingContent = fs14.readFileSync(learningsPath, "utf-8");
8743
- const existingEntries = existingContent.split("\n").filter((line) => /^- \*\*\d{4}-\d{2}-\d{2}/.test(line));
8744
- const overlap = checkOverlap(bulletLine, existingEntries);
8745
- if (overlap.score >= 0.7) overlapResult = overlap;
8746
- existingLineCount = existingContent.split("\n").length;
8747
- fs14.appendFileSync(learningsPath, entry);
8748
- }
8749
- const bulletLineNum = existingLineCount + 2;
8750
- contentHashes[contentHash] = { date: timestamp ?? "", line: bulletLineNum };
8751
- saveContentHashes(stateDir, contentHashes);
8752
- invalidateLearningsCacheEntry(learningsPath);
8753
- return Ok({
8754
- appended: true,
8755
- ...overlapResult ? { overlap: overlapResult } : {}
8756
- });
8788
+ existingLineCount = 1;
8789
+ } else {
8790
+ const existingContent = fs14.readFileSync(learningsPath, "utf-8");
8791
+ const existingEntries = existingContent.split("\n").filter((line) => /^- \*\*\d{4}-\d{2}-\d{2}/.test(line));
8792
+ const overlap = checkOverlap(bulletLine, existingEntries);
8793
+ if (overlap.score >= 0.7) overlapResult = overlap;
8794
+ existingLineCount = existingContent.split("\n").length;
8795
+ fs14.appendFileSync(learningsPath, entry);
8796
+ }
8797
+ const bulletLineNum = existingLineCount + 2;
8798
+ contentHashes[contentHash] = { date: timestamp ?? "", line: bulletLineNum };
8799
+ saveContentHashes(stateDir, contentHashes);
8800
+ invalidateLearningsCacheEntry(learningsPath);
8801
+ return Ok({
8802
+ appended: true,
8803
+ ...overlapResult ? { overlap: overlapResult } : {}
8804
+ });
8805
+ } finally {
8806
+ releaseFileLock(lockPath);
8807
+ }
8757
8808
  } catch (error) {
8758
8809
  return Err(
8759
8810
  new Error(
@@ -9181,7 +9232,9 @@ async function saveHandoff(projectPath, handoff, stream, session) {
9181
9232
  const stateDir = dirResult.value;
9182
9233
  const handoffPath = path15.join(stateDir, HANDOFF_FILE);
9183
9234
  fs18.mkdirSync(stateDir, { recursive: true });
9184
- fs18.writeFileSync(handoffPath, JSON.stringify(handoff, null, 2));
9235
+ const tmpPath = handoffPath + ".tmp";
9236
+ fs18.writeFileSync(tmpPath, JSON.stringify(handoff, null, 2));
9237
+ fs18.renameSync(tmpPath, handoffPath);
9185
9238
  return Ok(void 0);
9186
9239
  } catch (error) {
9187
9240
  return Err(
@@ -9895,14 +9948,14 @@ function readTaint(projectRoot, sessionId) {
9895
9948
  state = JSON.parse(content);
9896
9949
  } catch {
9897
9950
  try {
9898
- unlinkSync(filePath);
9951
+ unlinkSync2(filePath);
9899
9952
  } catch {
9900
9953
  }
9901
9954
  return null;
9902
9955
  }
9903
9956
  if (!state.sessionId || !state.taintedAt || !state.expiresAt || !state.findings) {
9904
9957
  try {
9905
- unlinkSync(filePath);
9958
+ unlinkSync2(filePath);
9906
9959
  } catch {
9907
9960
  }
9908
9961
  return null;
@@ -9919,7 +9972,7 @@ function checkTaint(projectRoot, sessionId) {
9919
9972
  if (now >= expiresAt) {
9920
9973
  const filePath = getTaintFilePath(projectRoot, sessionId);
9921
9974
  try {
9922
- unlinkSync(filePath);
9975
+ unlinkSync2(filePath);
9923
9976
  } catch {
9924
9977
  }
9925
9978
  return { tainted: false, expired: true, state };
@@ -9956,7 +10009,7 @@ function clearTaint(projectRoot, sessionId) {
9956
10009
  if (sessionId) {
9957
10010
  const filePath = getTaintFilePath(projectRoot, sessionId);
9958
10011
  try {
9959
- unlinkSync(filePath);
10012
+ unlinkSync2(filePath);
9960
10013
  return 1;
9961
10014
  } catch {
9962
10015
  return 0;
@@ -9969,7 +10022,7 @@ function clearTaint(projectRoot, sessionId) {
9969
10022
  for (const file of files) {
9970
10023
  if (file.startsWith("session-taint-") && file.endsWith(".json")) {
9971
10024
  try {
9972
- unlinkSync(join362(harnessDir, file));
10025
+ unlinkSync2(join362(harnessDir, file));
9973
10026
  count++;
9974
10027
  } catch {
9975
10028
  }
@@ -12700,7 +12753,7 @@ function parseRepoParts(repo) {
12700
12753
  }
12701
12754
  return { owner: parts[0], repo: parts[1] };
12702
12755
  }
12703
- function sleep(ms) {
12756
+ function sleep2(ms) {
12704
12757
  return new Promise((resolve8) => setTimeout(resolve8, ms));
12705
12758
  }
12706
12759
  async function fetchWithRetry(fetchFn, input, init, opts = RETRY_DEFAULTS) {
@@ -12718,7 +12771,7 @@ async function fetchWithRetry(fetchFn, input, init, opts = RETRY_DEFAULTS) {
12718
12771
  } else {
12719
12772
  delayMs = opts.baseDelayMs * Math.pow(2, attempt) + Math.random() * 500;
12720
12773
  }
12721
- await sleep(delayMs);
12774
+ await sleep2(delayMs);
12722
12775
  }
12723
12776
  return lastResponse;
12724
12777
  }
@@ -13947,7 +14000,7 @@ function collectEvents(projectRoot, consent) {
13947
14000
  })
13948
14001
  );
13949
14002
  }
13950
- function sleep2(ms) {
14003
+ function sleep3(ms) {
13951
14004
  return new Promise((resolve8) => setTimeout(resolve8, ms));
13952
14005
  }
13953
14006
  async function send(events, apiKey) {
@@ -13967,14 +14020,14 @@ async function send(events, apiKey) {
13967
14020
  } catch {
13968
14021
  }
13969
14022
  if (attempt < MAX_ATTEMPTS - 1) {
13970
- await sleep2(1e3 * (attempt + 1));
14023
+ await sleep3(1e3 * (attempt + 1));
13971
14024
  }
13972
14025
  }
13973
14026
  }
13974
- var VALID_TYPES, CONVENTIONAL_PATTERN, 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, 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, CODE_BLOCK_LANGUAGES, DEFAULT_DRIFT_CONFIG, FILE_TYPES, EXPORT_TYPES, CONVENTION_DESCRIPTIONS, RULE_CHECKERS, EntropyAnalyzer, readFile42, 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, SKIP_DIRS, SOURCE_EXTENSIONS, FUNCTION_DECL_RE, CONST_DECL_RE, CriticalPathResolver, NoOpTelemetryAdapter, NoOpExecutor, ConsoleSink, feedbackConfig, ChecklistBuilder, AgentActionEmitter, globalEmitter, FileSink, NoOpSink, CategorySnapshotSchema, TimelineSnapshotSchema, TimelineFileSchema, TrendLineSchema, TrendResultSchema, DEFAULT_STABILITY_THRESHOLDS, ALL_CATEGORIES, TimelineManager, ConfidenceTierSchema, RegressionResultSchema, DirectionSchema, CategoryForecastSchema, SpecImpactSignalsSchema, SpecImpactEstimateSchema, ContributingFeatureSchema, AdjustedForecastSchema, PredictionWarningSchema, StabilityForecastSchema, PredictionResultSchema, PredictionOptionsSchema, VALID_STATUSES, EM_DASH, VALID_PRIORITIES, ALL_CATEGORIES2, 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, StreamInfoSchema, StreamIndexSchema, DEFAULT_STREAM_INDEX, 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, EVENTS_FILE, STREAMS_DIR, STREAM_NAME_REGEX, branchCache, BRANCH_CACHE_TTL_MS, STATE_FILES, MAX_CACHE_ENTRIES, learningsCacheMap, WEIGHTS, PROMOTABLE_OUTCOMES, failuresCacheMap, FAILURE_LINE_REGEX, SAFE_GATE_COMMAND, SkillEventSchema, knownHashesCache, EVENT_FORMATTERS, RuleRegistry, DEFAULT_SECURITY_CONFIG, RuleOverrideSchema, SecurityConfigSchema, secretRules, injectionRules, xssRules, cryptoRules, pathTraversalRules, networkRules, deserializationRules, agentConfigRules, mcpRules, insecureDefaultsRules, sharpEdgesRules, nodeRules, expressRules, reactRules, goRules, SecurityScanner, 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, 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, AGENT_DESCRIPTORS, AGENT_RUNNERS, 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, EM_DASH2, STATUS_RANK, RETRY_DEFAULTS, GitHubIssuesSyncAdapter, syncMutex, PRIORITY_RANK, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, 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;
14027
+ var VALID_TYPES, CONVENTIONAL_PATTERN, 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, 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, CODE_BLOCK_LANGUAGES, DEFAULT_DRIFT_CONFIG, FILE_TYPES, EXPORT_TYPES, CONVENTION_DESCRIPTIONS, RULE_CHECKERS, EntropyAnalyzer, readFile42, 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, SKIP_DIRS, SOURCE_EXTENSIONS, FUNCTION_DECL_RE, CONST_DECL_RE, CriticalPathResolver, NoOpTelemetryAdapter, NoOpExecutor, ConsoleSink, feedbackConfig, ChecklistBuilder, AgentActionEmitter, globalEmitter, FileSink, NoOpSink, CategorySnapshotSchema, TimelineSnapshotSchema, TimelineFileSchema, TrendLineSchema, TrendResultSchema, DEFAULT_STABILITY_THRESHOLDS, ALL_CATEGORIES, TimelineManager, ConfidenceTierSchema, RegressionResultSchema, DirectionSchema, CategoryForecastSchema, SpecImpactSignalsSchema, SpecImpactEstimateSchema, ContributingFeatureSchema, AdjustedForecastSchema, PredictionWarningSchema, StabilityForecastSchema, PredictionResultSchema, PredictionOptionsSchema, VALID_STATUSES, EM_DASH, VALID_PRIORITIES, ALL_CATEGORIES2, 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, StreamInfoSchema, StreamIndexSchema, DEFAULT_STREAM_INDEX, 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, EVENTS_FILE, STREAMS_DIR, STREAM_NAME_REGEX, branchCache, BRANCH_CACHE_TTL_MS, STATE_FILES, MAX_CACHE_ENTRIES, learningsCacheMap, WEIGHTS, LOCK_RETRIES, LOCK_BACKOFFS, PROMOTABLE_OUTCOMES, failuresCacheMap, FAILURE_LINE_REGEX, SAFE_GATE_COMMAND, SkillEventSchema, knownHashesCache, EVENT_FORMATTERS, RuleRegistry, DEFAULT_SECURITY_CONFIG, RuleOverrideSchema, SecurityConfigSchema, secretRules, injectionRules, xssRules, cryptoRules, pathTraversalRules, networkRules, deserializationRules, agentConfigRules, mcpRules, insecureDefaultsRules, sharpEdgesRules, nodeRules, expressRules, reactRules, goRules, SecurityScanner, 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, 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, AGENT_DESCRIPTORS, AGENT_RUNNERS, 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, EM_DASH2, STATUS_RANK, RETRY_DEFAULTS, GitHubIssuesSyncAdapter, syncMutex, PRIORITY_RANK, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, 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;
13975
14028
  var init_dist3 = __esm({
13976
14029
  "../core/dist/index.mjs"() {
13977
- init_chunk_UWAI34RR();
14030
+ init_chunk_H73442AZ();
13978
14031
  init_dist();
13979
14032
  init_dist();
13980
14033
  init_dist();
@@ -16319,6 +16372,8 @@ var init_dist3 = __esm({
16319
16372
  temporal: 0.1,
16320
16373
  codeReference: 0.15
16321
16374
  };
16375
+ LOCK_RETRIES = 3;
16376
+ LOCK_BACKOFFS = [50, 100, 200];
16322
16377
  PROMOTABLE_OUTCOMES = ["gotcha", "decision", "observation"];
16323
16378
  failuresCacheMap = /* @__PURE__ */ new Map();
16324
16379
  FAILURE_LINE_REGEX = /^- \*\*(\d{4}-\d{2}-\d{2}) \[skill:([^\]]+)\] \[type:([^\]]+)\]:\*\* (.+)$/;
@@ -17618,7 +17673,7 @@ var init_dist3 = __esm({
17618
17673
  }
17619
17674
  const tmp = this.timelinePath + "." + randomBytes22(4).toString("hex") + ".tmp";
17620
17675
  writeFileSync16(tmp, JSON.stringify(timeline, null, 2));
17621
- renameSync52(tmp, this.timelinePath);
17676
+ renameSync82(tmp, this.timelinePath);
17622
17677
  }
17623
17678
  /**
17624
17679
  * Capture a new snapshot from a scan result.
@@ -18979,7 +19034,7 @@ console.log('Blueprint player initialized.');
18979
19034
  };
18980
19035
  }
18981
19036
  };
18982
- VERSION = "0.21.3";
19037
+ VERSION = "0.23.3";
18983
19038
  POSTHOG_BATCH_URL = "https://app.posthog.com/batch";
18984
19039
  MAX_ATTEMPTS = 3;
18985
19040
  TIMEOUT_MS = 5e3;
@@ -53,12 +53,12 @@ async function findMarkdownFiles(dir) {
53
53
  return results;
54
54
  }
55
55
  function parseFrontmatter(raw) {
56
- const match = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
56
+ const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);
57
57
  if (!match) return null;
58
58
  const yamlBlock = match[1];
59
59
  const body = match[2];
60
60
  const fm = {};
61
- for (const line of yamlBlock.split("\n")) {
61
+ for (const line of yamlBlock.split(/\r?\n/)) {
62
62
  const kvMatch = line.match(/^(\w+):\s*(.+)$/);
63
63
  if (!kvMatch) continue;
64
64
  const key = kvMatch[1];
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YC4EYIER.js";
3
+ } from "./chunk-IBTHD2UA.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-TSVYBDDE.js";
3
+ } from "./chunk-YZH4I4JO.js";
4
4
  import {
5
5
  resultToMcpResponse
6
6
  } from "./chunk-EPUKTTJZ.js";
@@ -38,7 +38,7 @@ async function handleCheckDependencies(input) {
38
38
  const configResult = resolveProjectConfig(projectPath);
39
39
  if (!configResult.ok) return resultToMcpResponse(configResult);
40
40
  try {
41
- const { validateDependencies, TypeScriptParser } = await import("./dist-CJDGASPP.js");
41
+ const { validateDependencies, TypeScriptParser } = await import("./dist-CPKL5Y2R.js");
42
42
  const config = configResult.value;
43
43
  const rawLayers = Array.isArray(config.layers) ? config.layers : [];
44
44
  const layers = rawLayers.map((l) => ({
@@ -47,11 +47,11 @@ async function handleCheckDependencies(input) {
47
47
  allowedDependencies: l.allowedDependencies
48
48
  }));
49
49
  const parser = new TypeScriptParser();
50
- const { loadGraphStore } = await import("./graph-loader-RDXSEBD7.js");
50
+ const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
51
51
  const store = await loadGraphStore(projectPath);
52
52
  let graphDependencyData;
53
53
  if (store) {
54
- const { GraphConstraintAdapter } = await import("./dist-NCNAXUFD.js");
54
+ const { GraphConstraintAdapter } = await import("./dist-BZS2XRLG.js");
55
55
  const adapter = new GraphConstraintAdapter(store);
56
56
  const graphData = adapter.computeDependencyGraph();
57
57
  graphDependencyData = {
@@ -65,6 +65,29 @@ async function handleCheckDependencies(input) {
65
65
  parser,
66
66
  ...graphDependencyData !== void 0 && { graphDependencyData }
67
67
  });
68
+ let designViolations = [];
69
+ if (store) {
70
+ const designTokenNodes = store.findNodes({ type: "design_token" });
71
+ if (designTokenNodes.length > 0) {
72
+ const { DesignConstraintAdapter } = await import("./dist-BZS2XRLG.js");
73
+ const designAdapter = new DesignConstraintAdapter(store);
74
+ const fileNodes = store.findNodes({ type: "file" });
75
+ for (const fileNode of fileNodes) {
76
+ const filePath = fileNode.path ?? fileNode.id;
77
+ if (!/\.(tsx?|jsx?|css|scss|less|vue|svelte)$/.test(filePath)) continue;
78
+ const source = typeof fileNode.metadata?.source === "string" ? fileNode.metadata.source : "";
79
+ if (!source) continue;
80
+ designViolations.push(...designAdapter.checkAll(source, filePath));
81
+ }
82
+ }
83
+ }
84
+ if (result.ok && designViolations.length > 0) {
85
+ const merged = {
86
+ ...result.value,
87
+ designViolations
88
+ };
89
+ return resultToMcpResponse({ ok: true, value: merged });
90
+ }
68
91
  return resultToMcpResponse(result);
69
92
  } catch (error) {
70
93
  return {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-TSVYBDDE.js";
3
+ } from "./chunk-YZH4I4JO.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-CJDGASPP.js");
52
+ const core = await import("./dist-CPKL5Y2R.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-CJDGASPP.js");
71
+ const core = await import("./dist-CPKL5Y2R.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);
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  listPersonas,
6
6
  loadPersona
7
- } from "./chunk-JV4Y2U5F.js";
7
+ } from "./chunk-BO4AJZRE.js";
8
8
  import {
9
9
  GENERATED_HEADER_AGENT,
10
10
  VALID_PLATFORMS,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YC4EYIER.js";
3
+ } from "./chunk-IBTHD2UA.js";
4
4
  import {
5
5
  Ok
6
6
  } from "./chunk-RL4VMEXL.js";
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-VKS3F46M.js";
10
+ } from "./chunk-A4ETL34H.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-YC4EYIER.js";
13
+ } from "./chunk-IBTHD2UA.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-RL4VMEXL.js";
@@ -50,18 +50,18 @@ 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-CJDGASPP.js");
53
+ const { validateKnowledgeMap } = await import("./dist-CPKL5Y2R.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-CJDGASPP.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-CPKL5Y2R.js");
59
59
  const domain2 = input.domain ?? "src";
60
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-RDXSEBD7.js");
60
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-QEI7SYOQ.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
62
62
  let graphCoverage2;
63
63
  if (store2) {
64
- const { Assembler } = await import("./dist-NCNAXUFD.js");
64
+ const { Assembler } = await import("./dist-BZS2XRLG.js");
65
65
  const assembler = new Assembler(store2);
66
66
  const report = assembler.checkCoverage();
67
67
  graphCoverage2 = {
@@ -94,13 +94,13 @@ async function handleCheckDocs(input) {
94
94
  }
95
95
  return resultToMcpResponse(Ok({ coverage, integrity }));
96
96
  }
97
- const { checkDocCoverage } = await import("./dist-CJDGASPP.js");
97
+ const { checkDocCoverage } = await import("./dist-CPKL5Y2R.js");
98
98
  const domain = input.domain ?? "src";
99
- const { loadGraphStore } = await import("./graph-loader-RDXSEBD7.js");
99
+ const { loadGraphStore } = await import("./graph-loader-QEI7SYOQ.js");
100
100
  const store = await loadGraphStore(projectPath);
101
101
  let graphCoverage;
102
102
  if (store) {
103
- const { Assembler } = await import("./dist-NCNAXUFD.js");
103
+ const { Assembler } = await import("./dist-BZS2XRLG.js");
104
104
  const assembler = new Assembler(store);
105
105
  const report = assembler.checkCoverage();
106
106
  graphCoverage = {