@harness-engineering/cli 2.6.0 → 2.7.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 (156) hide show
  1. package/dist/agents/skills/claude-code/align-design-system/SKILL.md +174 -0
  2. package/dist/agents/skills/claude-code/align-design-system/skill.yaml +57 -0
  3. package/dist/agents/skills/claude-code/audit-brand-compliance/SKILL.md +189 -0
  4. package/dist/agents/skills/claude-code/audit-brand-compliance/skill.yaml +50 -0
  5. package/dist/agents/skills/claude-code/audit-component-anatomy/SKILL.md +181 -0
  6. package/dist/agents/skills/claude-code/audit-component-anatomy/skill.yaml +51 -0
  7. package/dist/agents/skills/claude-code/copy-craft/SKILL.md +192 -0
  8. package/dist/agents/skills/claude-code/copy-craft/skill.yaml +52 -0
  9. package/dist/agents/skills/claude-code/detect-design-drift/SKILL.md +139 -0
  10. package/dist/agents/skills/claude-code/detect-design-drift/skill.yaml +50 -0
  11. package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +10 -0
  12. package/dist/agents/skills/claude-code/harness-design-craft/SKILL.md +212 -0
  13. package/dist/agents/skills/claude-code/harness-design-craft/skill.yaml +57 -0
  14. package/dist/agents/skills/claude-code/harness-design-pipeline/SKILL.md +266 -0
  15. package/dist/agents/skills/claude-code/harness-design-pipeline/skill.yaml +70 -0
  16. package/dist/agents/skills/claude-code/knowledge-craft/SKILL.md +180 -0
  17. package/dist/agents/skills/claude-code/knowledge-craft/skill.yaml +49 -0
  18. package/dist/agents/skills/claude-code/naming-craft/SKILL.md +172 -0
  19. package/dist/agents/skills/claude-code/naming-craft/skill.yaml +51 -0
  20. package/dist/agents/skills/claude-code/security-craft/SKILL.md +205 -0
  21. package/dist/agents/skills/claude-code/security-craft/skill.yaml +58 -0
  22. package/dist/agents/skills/claude-code/spec-craft/SKILL.md +184 -0
  23. package/dist/agents/skills/claude-code/spec-craft/skill.yaml +55 -0
  24. package/dist/agents/skills/claude-code/test-craft/SKILL.md +212 -0
  25. package/dist/agents/skills/claude-code/test-craft/skill.yaml +58 -0
  26. package/dist/agents/skills/codex/align-design-system/SKILL.md +174 -0
  27. package/dist/agents/skills/codex/align-design-system/skill.yaml +57 -0
  28. package/dist/agents/skills/codex/audit-brand-compliance/SKILL.md +189 -0
  29. package/dist/agents/skills/codex/audit-brand-compliance/skill.yaml +50 -0
  30. package/dist/agents/skills/codex/audit-component-anatomy/SKILL.md +181 -0
  31. package/dist/agents/skills/codex/audit-component-anatomy/skill.yaml +51 -0
  32. package/dist/agents/skills/codex/copy-craft/SKILL.md +192 -0
  33. package/dist/agents/skills/codex/copy-craft/skill.yaml +52 -0
  34. package/dist/agents/skills/codex/detect-design-drift/SKILL.md +139 -0
  35. package/dist/agents/skills/codex/detect-design-drift/skill.yaml +50 -0
  36. package/dist/agents/skills/codex/harness-accessibility/SKILL.md +10 -0
  37. package/dist/agents/skills/codex/harness-design-craft/SKILL.md +212 -0
  38. package/dist/agents/skills/codex/harness-design-craft/skill.yaml +57 -0
  39. package/dist/agents/skills/codex/harness-design-pipeline/SKILL.md +266 -0
  40. package/dist/agents/skills/codex/harness-design-pipeline/skill.yaml +70 -0
  41. package/dist/agents/skills/codex/knowledge-craft/SKILL.md +180 -0
  42. package/dist/agents/skills/codex/knowledge-craft/skill.yaml +49 -0
  43. package/dist/agents/skills/codex/naming-craft/SKILL.md +172 -0
  44. package/dist/agents/skills/codex/naming-craft/skill.yaml +51 -0
  45. package/dist/agents/skills/codex/security-craft/SKILL.md +205 -0
  46. package/dist/agents/skills/codex/security-craft/skill.yaml +58 -0
  47. package/dist/agents/skills/codex/spec-craft/SKILL.md +184 -0
  48. package/dist/agents/skills/codex/spec-craft/skill.yaml +55 -0
  49. package/dist/agents/skills/codex/test-craft/SKILL.md +212 -0
  50. package/dist/agents/skills/codex/test-craft/skill.yaml +58 -0
  51. package/dist/agents/skills/cursor/align-design-system/SKILL.md +174 -0
  52. package/dist/agents/skills/cursor/align-design-system/skill.yaml +57 -0
  53. package/dist/agents/skills/cursor/audit-brand-compliance/SKILL.md +189 -0
  54. package/dist/agents/skills/cursor/audit-brand-compliance/skill.yaml +50 -0
  55. package/dist/agents/skills/cursor/audit-component-anatomy/SKILL.md +181 -0
  56. package/dist/agents/skills/cursor/audit-component-anatomy/skill.yaml +51 -0
  57. package/dist/agents/skills/cursor/copy-craft/SKILL.md +192 -0
  58. package/dist/agents/skills/cursor/copy-craft/skill.yaml +52 -0
  59. package/dist/agents/skills/cursor/detect-design-drift/SKILL.md +139 -0
  60. package/dist/agents/skills/cursor/detect-design-drift/skill.yaml +50 -0
  61. package/dist/agents/skills/cursor/harness-accessibility/SKILL.md +10 -0
  62. package/dist/agents/skills/cursor/harness-design-craft/SKILL.md +212 -0
  63. package/dist/agents/skills/cursor/harness-design-craft/skill.yaml +57 -0
  64. package/dist/agents/skills/cursor/harness-design-pipeline/SKILL.md +266 -0
  65. package/dist/agents/skills/cursor/harness-design-pipeline/skill.yaml +70 -0
  66. package/dist/agents/skills/cursor/knowledge-craft/SKILL.md +180 -0
  67. package/dist/agents/skills/cursor/knowledge-craft/skill.yaml +49 -0
  68. package/dist/agents/skills/cursor/naming-craft/SKILL.md +172 -0
  69. package/dist/agents/skills/cursor/naming-craft/skill.yaml +51 -0
  70. package/dist/agents/skills/cursor/security-craft/SKILL.md +205 -0
  71. package/dist/agents/skills/cursor/security-craft/skill.yaml +58 -0
  72. package/dist/agents/skills/cursor/spec-craft/SKILL.md +184 -0
  73. package/dist/agents/skills/cursor/spec-craft/skill.yaml +55 -0
  74. package/dist/agents/skills/cursor/test-craft/SKILL.md +212 -0
  75. package/dist/agents/skills/cursor/test-craft/skill.yaml +58 -0
  76. package/dist/agents/skills/gemini-cli/align-design-system/SKILL.md +174 -0
  77. package/dist/agents/skills/gemini-cli/align-design-system/skill.yaml +57 -0
  78. package/dist/agents/skills/gemini-cli/audit-brand-compliance/SKILL.md +189 -0
  79. package/dist/agents/skills/gemini-cli/audit-brand-compliance/skill.yaml +50 -0
  80. package/dist/agents/skills/gemini-cli/audit-component-anatomy/SKILL.md +181 -0
  81. package/dist/agents/skills/gemini-cli/audit-component-anatomy/skill.yaml +51 -0
  82. package/dist/agents/skills/gemini-cli/copy-craft/SKILL.md +192 -0
  83. package/dist/agents/skills/gemini-cli/copy-craft/skill.yaml +52 -0
  84. package/dist/agents/skills/gemini-cli/detect-design-drift/SKILL.md +139 -0
  85. package/dist/agents/skills/gemini-cli/detect-design-drift/skill.yaml +50 -0
  86. package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +10 -0
  87. package/dist/agents/skills/gemini-cli/harness-design-craft/SKILL.md +212 -0
  88. package/dist/agents/skills/gemini-cli/harness-design-craft/skill.yaml +57 -0
  89. package/dist/agents/skills/gemini-cli/harness-design-pipeline/SKILL.md +266 -0
  90. package/dist/agents/skills/gemini-cli/harness-design-pipeline/skill.yaml +70 -0
  91. package/dist/agents/skills/gemini-cli/knowledge-craft/SKILL.md +180 -0
  92. package/dist/agents/skills/gemini-cli/knowledge-craft/skill.yaml +49 -0
  93. package/dist/agents/skills/gemini-cli/naming-craft/SKILL.md +172 -0
  94. package/dist/agents/skills/gemini-cli/naming-craft/skill.yaml +51 -0
  95. package/dist/agents/skills/gemini-cli/security-craft/SKILL.md +205 -0
  96. package/dist/agents/skills/gemini-cli/security-craft/skill.yaml +58 -0
  97. package/dist/agents/skills/gemini-cli/spec-craft/SKILL.md +184 -0
  98. package/dist/agents/skills/gemini-cli/spec-craft/skill.yaml +55 -0
  99. package/dist/agents/skills/gemini-cli/test-craft/SKILL.md +212 -0
  100. package/dist/agents/skills/gemini-cli/test-craft/skill.yaml +58 -0
  101. package/dist/{agents-md-2JUQ4FE2.js → agents-md-267R2NUJ.js} +4 -4
  102. package/dist/{analyzer-VY6DJVOU-4AHIJLNS.js → analyzer-VY6DJVOU-WYKV3TTW.js} +2 -2
  103. package/dist/{architecture-CXAVNB5X.js → architecture-ZTEHGIHD.js} +6 -6
  104. package/dist/{assess-project-M626SSPN.js → assess-project-OKDW3YSK.js} +2 -1
  105. package/dist/bin/harness-mcp.js +17 -17
  106. package/dist/bin/harness.js +27 -27
  107. package/dist/{check-phase-gate-XMU6LLUQ.js → check-phase-gate-YJWFDW66.js} +5 -5
  108. package/dist/{chunk-ORNMAYHB.js → chunk-4EGPFB7V.js} +6196 -125
  109. package/dist/{chunk-HFOB2MPQ.js → chunk-67RP7MLR.js} +3 -3
  110. package/dist/{chunk-5JNSFYZU.js → chunk-6T5AYG5S.js} +6 -6
  111. package/dist/{chunk-5XLLIYYL.js → chunk-6UHDQP2N.js} +1 -1
  112. package/dist/{chunk-YP7I25SL.js → chunk-B3B64OPD.js} +1 -1
  113. package/dist/{chunk-VTTNIZJL.js → chunk-B4OLYXZ4.js} +93 -3
  114. package/dist/{chunk-6AX6R3LM.js → chunk-CXAHK5PJ.js} +9 -9
  115. package/dist/{chunk-BCFDGOMA.js → chunk-H2ZJOJ7A.js} +81 -1
  116. package/dist/{chunk-NX6A24DS.js → chunk-HLPY3RHE.js} +1641 -292
  117. package/dist/{chunk-Q6ZR2L6Q.js → chunk-HMMSWRWR.js} +2 -2
  118. package/dist/{chunk-YYRQCQPZ.js → chunk-IY2TZLY5.js} +176 -107
  119. package/dist/{chunk-I6K43QQS.js → chunk-MQG7FHXX.js} +3 -3
  120. package/dist/{chunk-43M3RLFQ.js → chunk-OLTVDPA2.js} +2 -2
  121. package/dist/{chunk-JFZOWO7D.js → chunk-OQE6ME2Z.js} +1 -1
  122. package/dist/{chunk-GWE5LL3R.js → chunk-P7EO7USC.js} +10 -10
  123. package/dist/{chunk-24KCOJJG.js → chunk-PARV3G2F.js} +1 -1
  124. package/dist/{chunk-QOKMDDBJ.js → chunk-QUPC37UB.js} +6 -6
  125. package/dist/{chunk-EPUKTTJZ.js → chunk-RC3OI5NK.js} +5 -1
  126. package/dist/{chunk-L5BCZ5XS.js → chunk-S7GEONXL.js} +1 -1
  127. package/dist/{chunk-5FDBXUFW.js → chunk-TIH53QXY.js} +1 -1
  128. package/dist/{chunk-OA6SWTU4.js → chunk-TIZ3L6CU.js} +11 -8
  129. package/dist/{chunk-GWF2OILZ.js → chunk-VG6UK6G6.js} +1 -1
  130. package/dist/{chunk-SZEFU6XC.js → chunk-W3PDVZ4I.js} +1 -1
  131. package/dist/{chunk-HYTRDAHV.js → chunk-WOXR6I3R.js} +3 -1
  132. package/dist/{chunk-K246XQ2L.js → chunk-XTIPZUPR.js} +1 -1
  133. package/dist/{chunk-HMW3VKUF.js → chunk-Z2GUITAS.js} +10 -10
  134. package/dist/{chunk-PFZEADQM.js → chunk-ZKA3TGYS.js} +79 -2
  135. package/dist/{ci-workflow-3JNDZQYD.js → ci-workflow-YGTQTNVC.js} +4 -4
  136. package/dist/{dist-QPWXPCPL.js → dist-R3TOOPJ7.js} +1 -1
  137. package/dist/{dist-OHDQBTSO.js → dist-XIJWWQ5N.js} +3 -3
  138. package/dist/{docs-5RYMDHN3.js → docs-KCTLXK2G.js} +6 -6
  139. package/dist/{engine-KZ3PPUYE.js → engine-J64WPH5K.js} +4 -4
  140. package/dist/{entropy-DQTAPSSE.js → entropy-M27JUL3V.js} +5 -5
  141. package/dist/{feedback-WH6XPQJS.js → feedback-W25QO3OL.js} +2 -2
  142. package/dist/{generate-agent-definitions-SZA4QIHN.js → generate-agent-definitions-RNMU5U5R.js} +5 -5
  143. package/dist/{glob-helper-XE2UGEOV.js → glob-helper-EX4YZKZO.js} +1 -1
  144. package/dist/{graph-loader-EQBOIHFZ.js → graph-loader-EIFEOUVI.js} +1 -1
  145. package/dist/index.d.ts +587 -6
  146. package/dist/index.js +27 -27
  147. package/dist/{loader-BNKGM23C.js → loader-HZKJ5ABV.js} +4 -4
  148. package/dist/{mcp-GZH4EYGD.js → mcp-NEAPIDTT.js} +17 -17
  149. package/dist/{performance-54TMJOEU.js → performance-3AVQUDRG.js} +6 -6
  150. package/dist/{review-pipeline-OTDDVPNY.js → review-pipeline-KA7SGUXJ.js} +4 -4
  151. package/dist/{runtime-W5THSNAL.js → runtime-IP6FVV5M.js} +4 -4
  152. package/dist/{scan-4PPP6ZXT.js → scan-LYKLM4EQ.js} +1 -1
  153. package/dist/{security-27HW7CYT.js → security-EAR4FJWI.js} +1 -1
  154. package/dist/{validate-QRVCD4GP.js → validate-EVH3UXIC.js} +5 -5
  155. package/dist/{validate-cross-check-BUAGBAPO.js → validate-cross-check-SNE3SQOB.js} +4 -4
  156. package/package.json +8 -7
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-YYRQCQPZ.js";
7
+ } from "./chunk-IY2TZLY5.js";
8
8
 
9
9
  // src/mcp/tools/review-pipeline.ts
10
10
  init_dist();
@@ -79,7 +79,7 @@ var runCodeReviewDefinition = {
79
79
  };
80
80
  async function handleRunCodeReview(input) {
81
81
  try {
82
- const { parseDiff, runReviewPipeline } = await import("./dist-OHDQBTSO.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-XIJWWQ5N.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -31,7 +31,7 @@ import {
31
31
  resetParserCache,
32
32
  resolveFileToLayer,
33
33
  validateDependencies
34
- } from "./chunk-SZEFU6XC.js";
34
+ } from "./chunk-W3PDVZ4I.js";
35
35
  import {
36
36
  AuthAuditEntrySchema,
37
37
  AuthTokenPublicSchema,
@@ -85,7 +85,7 @@ import {
85
85
  init_dist as init_dist2,
86
86
  queryTraceability,
87
87
  skipDirGlobs
88
- } from "./chunk-BCFDGOMA.js";
88
+ } from "./chunk-H2ZJOJ7A.js";
89
89
  import {
90
90
  ArchBaselineSchema,
91
91
  ArchConfigSchema,
@@ -3311,25 +3311,8 @@ function validateBranchName(branchName, config) {
3311
3311
  }
3312
3312
  if (config.enforceKebabCase) {
3313
3313
  for (const part of slug.split("/")) {
3314
- const ticketMatch = part.match(TICKET_ID);
3315
- if (ticketMatch) {
3316
- const rest = ticketMatch[2];
3317
- if (rest && !KEBAB_CASE.test(rest)) {
3318
- return {
3319
- valid: false,
3320
- branchName,
3321
- message: `Branch slug part "${part}" does not follow kebab-case after the ticket ID.`,
3322
- suggestion: `Ensure the description after "${ticketMatch[1]}" uses kebab-case (lowercase, single hyphens, no leading/trailing hyphen).`
3323
- };
3324
- }
3325
- } else if (!KEBAB_CASE.test(part)) {
3326
- return {
3327
- valid: false,
3328
- branchName,
3329
- message: `Branch slug part "${part}" must be in kebab-case (lowercase, single hyphens, no leading/trailing hyphen).`,
3330
- suggestion: `Change "${part}" to match the convention.`
3331
- };
3332
- }
3314
+ const kebabFailure = validateKebabSlugPart(part, branchName);
3315
+ if (kebabFailure) return kebabFailure;
3333
3316
  }
3334
3317
  }
3335
3318
  if (typeof config.maxLength === "number" && config.maxLength > 0 && slug.length > config.maxLength) {
@@ -3342,6 +3325,26 @@ function validateBranchName(branchName, config) {
3342
3325
  }
3343
3326
  return { valid: true, branchName };
3344
3327
  }
3328
+ function validateKebabSlugPart(part, branchName) {
3329
+ const ticketMatch = part.match(TICKET_ID);
3330
+ if (ticketMatch) {
3331
+ const rest = ticketMatch[2];
3332
+ if (!rest || KEBAB_CASE.test(rest)) return null;
3333
+ return {
3334
+ valid: false,
3335
+ branchName,
3336
+ message: `Branch slug part "${part}" does not follow kebab-case after the ticket ID.`,
3337
+ suggestion: `Ensure the description after "${ticketMatch[1]}" uses kebab-case (lowercase, single hyphens, no leading/trailing hyphen).`
3338
+ };
3339
+ }
3340
+ if (KEBAB_CASE.test(part)) return null;
3341
+ return {
3342
+ valid: false,
3343
+ branchName,
3344
+ message: `Branch slug part "${part}" must be in kebab-case (lowercase, single hyphens, no leading/trailing hyphen).`,
3345
+ suggestion: `Change "${part}" to match the convention.`
3346
+ };
3347
+ }
3345
3348
  function determineImportance(filePath) {
3346
3349
  const name = basename2(filePath).toLowerCase();
3347
3350
  if (name === "index.ts" || name === "index.js" || name === "main.ts") {
@@ -4811,7 +4814,7 @@ function arrayLen(arr) {
4811
4814
  return Array.isArray(arr) ? arr.length : 0;
4812
4815
  }
4813
4816
  async function gatherEntropyBlock(projectPath) {
4814
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-VY6DJVOU-4AHIJLNS.js");
4817
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./analyzer-VY6DJVOU-WYKV3TTW.js");
4815
4818
  const analyzer = new EntropyAnalyzer2({
4816
4819
  rootDir: projectPath,
4817
4820
  include: ["src/**/*.ts", "src/**/*.tsx", "packages/*/src/**/*.ts"],
@@ -4832,15 +4835,20 @@ async function gatherDecayBlock(projectPath) {
4832
4835
  const { TimelineManager: TimelineManager2 } = await import("./timeline-manager-FPYKJRHR-VVX7CSGW.js");
4833
4836
  const mgr = new TimelineManager2(projectPath);
4834
4837
  const trends = mgr.trends();
4835
- const recentBumps = arrayLen(trends.recentSnapshots);
4836
- const affected = Array.isArray(trends.topAffected) ? trends.topAffected : [];
4837
- const topAffected = [];
4838
+ return {
4839
+ recentBumps: arrayLen(trends.recentSnapshots),
4840
+ topAffected: collectTopAffectedLabels(trends.topAffected)
4841
+ };
4842
+ }
4843
+ function collectTopAffectedLabels(affected) {
4844
+ if (!Array.isArray(affected)) return [];
4845
+ const out = [];
4838
4846
  for (const node of affected) {
4839
4847
  const label = node.id ?? node.name;
4840
- if (typeof label === "string" && label.length > 0) topAffected.push(label);
4841
- if (topAffected.length >= 5) break;
4848
+ if (typeof label === "string" && label.length > 0) out.push(label);
4849
+ if (out.length >= MAX_TOP_AFFECTED) break;
4842
4850
  }
4843
- return { recentBumps, topAffected };
4851
+ return out;
4844
4852
  }
4845
4853
  async function gatherAttentionBlock(projectPath) {
4846
4854
  const sessionsDir = path4.join(projectPath, ".harness", "sessions");
@@ -11070,13 +11078,20 @@ function arraysEqual2(a, b) {
11070
11078
  }
11071
11079
  function metaFromFeatureFields(src) {
11072
11080
  const meta = {};
11073
- if (src.spec !== void 0 && src.spec !== null) meta.spec = src.spec;
11074
- if (src.plans && src.plans.length > 0) meta.plan = src.plans[0];
11075
- if (src.blockedBy && src.blockedBy.length > 0) meta.blocked_by = src.blockedBy;
11076
- if (src.priority !== void 0 && src.priority !== null) meta.priority = src.priority;
11077
- if (src.milestone !== void 0 && src.milestone !== null) meta.milestone = src.milestone;
11081
+ assignNonNullish(meta, "spec", src.spec);
11082
+ if (hasItems(src.plans)) meta.plan = src.plans[0];
11083
+ if (hasItems(src.blockedBy)) meta.blocked_by = src.blockedBy;
11084
+ assignNonNullish(meta, "priority", src.priority);
11085
+ assignNonNullish(meta, "milestone", src.milestone);
11078
11086
  return meta;
11079
11087
  }
11088
+ function assignNonNullish(meta, key, value) {
11089
+ if (value === void 0 || value === null) return;
11090
+ meta[key] = value;
11091
+ }
11092
+ function hasItems(arr) {
11093
+ return Array.isArray(arr) && arr.length > 0;
11094
+ }
11080
11095
  function buildCreateMeta(feature) {
11081
11096
  return metaFromFeatureFields(feature);
11082
11097
  }
@@ -11289,33 +11304,42 @@ function featureToNewInput(feature, milestone) {
11289
11304
  return input;
11290
11305
  }
11291
11306
  function metaToPatch(feature, expected) {
11292
- const patch = {};
11293
- patch.summary = feature.summary;
11294
- if (expected.spec !== void 0) patch.spec = expected.spec ?? null;
11295
- if (expected.plan !== void 0 && expected.plan != null) patch.plans = [expected.plan];
11296
- if (expected.blocked_by !== void 0) patch.blockedBy = expected.blocked_by ?? [];
11297
- if (expected.priority !== void 0) patch.priority = expected.priority ?? null;
11298
- if (expected.milestone !== void 0) patch.milestone = expected.milestone ?? null;
11307
+ const patch = { summary: feature.summary };
11308
+ assignIfPresent(patch, "spec", expected.spec, null);
11309
+ if (expected.plan != null) patch.plans = [expected.plan];
11310
+ assignIfPresent(patch, "blockedBy", expected.blocked_by, []);
11311
+ assignIfPresent(patch, "priority", expected.priority, null);
11312
+ assignIfPresent(patch, "milestone", expected.milestone, null);
11299
11313
  return patch;
11300
11314
  }
11315
+ function assignIfPresent(patch, key, value, fallback2) {
11316
+ if (value === void 0) return;
11317
+ patch[key] = value ?? fallback2;
11318
+ }
11301
11319
  function formatDiff(actual, expected) {
11302
- const keys = /* @__PURE__ */ new Set();
11303
- const collect = (m) => {
11304
- for (const k of Object.keys(m)) {
11305
- const v = m[k];
11306
- if (v !== void 0 && v !== null && !(Array.isArray(v) && v.length === 0)) keys.add(k);
11307
- }
11308
- };
11309
- collect(actual);
11310
- collect(expected);
11320
+ const keys = collectPresentKeys(actual, expected);
11311
11321
  const changed = [];
11312
- for (const key of [...keys].sort()) {
11322
+ for (const key of keys) {
11313
11323
  const a = actual[key];
11314
11324
  const e = expected[key];
11315
11325
  if (JSON.stringify(a ?? null) !== JSON.stringify(e ?? null)) changed.push(key);
11316
11326
  }
11317
11327
  return changed.join(",");
11318
11328
  }
11329
+ function hasMeaningfulValue(value) {
11330
+ if (value === void 0 || value === null) return false;
11331
+ if (Array.isArray(value) && value.length === 0) return false;
11332
+ return true;
11333
+ }
11334
+ function collectPresentKeys(...metas) {
11335
+ const keys = /* @__PURE__ */ new Set();
11336
+ for (const m of metas) {
11337
+ for (const [k, v] of Object.entries(m)) {
11338
+ if (hasMeaningfulValue(v)) keys.add(k);
11339
+ }
11340
+ }
11341
+ return [...keys].sort();
11342
+ }
11319
11343
  function mapAction(action) {
11320
11344
  switch (action) {
11321
11345
  case "assigned":
@@ -12464,23 +12488,56 @@ async function send(events, apiKey) {
12464
12488
  function toUnixNanoString(ns) {
12465
12489
  return ns.toString(10);
12466
12490
  }
12491
+ function encodeAttributeValue(value) {
12492
+ if (typeof value === "string") return { stringValue: value };
12493
+ if (typeof value === "boolean") return { boolValue: value };
12494
+ if (typeof value === "number") {
12495
+ return Number.isInteger(value) ? { intValue: String(value) } : { doubleValue: value };
12496
+ }
12497
+ return null;
12498
+ }
12499
+ function resolveOTLPOptions(opts) {
12500
+ const {
12501
+ endpoint,
12502
+ enabled = true,
12503
+ headers = {},
12504
+ flushIntervalMs = DEFAULT_FLUSH_INTERVAL_MS,
12505
+ batchSize = DEFAULT_BATCH_SIZE,
12506
+ fetchImpl = defaultFetch,
12507
+ warn = defaultWarn
12508
+ } = opts;
12509
+ return {
12510
+ endpoint,
12511
+ enabled,
12512
+ headers: { "Content-Type": "application/json", ...headers },
12513
+ flushIntervalMs,
12514
+ batchSize,
12515
+ fetchImpl,
12516
+ warn
12517
+ };
12518
+ }
12467
12519
  function attributesToOTLP(attrs) {
12468
12520
  const out = [];
12469
12521
  for (const [key, value] of Object.entries(attrs)) {
12470
- if (typeof value === "string") {
12471
- out.push({ key, value: { stringValue: value } });
12472
- } else if (typeof value === "boolean") {
12473
- out.push({ key, value: { boolValue: value } });
12474
- } else if (typeof value === "number") {
12475
- if (Number.isInteger(value)) {
12476
- out.push({ key, value: { intValue: String(value) } });
12477
- } else {
12478
- out.push({ key, value: { doubleValue: value } });
12479
- }
12480
- }
12522
+ const encoded = encodeAttributeValue(value);
12523
+ if (encoded) out.push({ key, value: encoded });
12481
12524
  }
12482
12525
  return out;
12483
12526
  }
12527
+ function spanToOTLP(s) {
12528
+ const span = {
12529
+ traceId: s.traceId,
12530
+ spanId: s.spanId,
12531
+ name: s.name,
12532
+ kind: s.kind,
12533
+ startTimeUnixNano: toUnixNanoString(s.startTimeNs),
12534
+ endTimeUnixNano: toUnixNanoString(s.endTimeNs),
12535
+ attributes: attributesToOTLP(s.attributes)
12536
+ };
12537
+ if (s.parentSpanId !== void 0) span["parentSpanId"] = s.parentSpanId;
12538
+ if (s.statusCode !== void 0) span["status"] = { code: s.statusCode };
12539
+ return span;
12540
+ }
12484
12541
  function acquireCompoundLock(category, opts = {}) {
12485
12542
  if (!KNOWN_CATEGORIES.has(category)) {
12486
12543
  throw new Error(
@@ -12542,15 +12599,22 @@ function readHolderPid(lockPath) {
12542
12599
  return -1;
12543
12600
  }
12544
12601
  }
12545
- function isSanitizedResult(value) {
12546
- if (!value || typeof value !== "object") return false;
12547
- const v = value;
12548
- if (!v.fields || typeof v.fields !== "object") return false;
12549
- for (const k of Object.keys(v.fields)) {
12602
+ function isObject(value) {
12603
+ return Boolean(value) && typeof value === "object";
12604
+ }
12605
+ function hasAllowedFieldKeys(fields) {
12606
+ for (const k of Object.keys(fields)) {
12550
12607
  if (!ALLOWED_SET.has(k)) return false;
12551
12608
  if (PII_FIELD_DENYLIST.test(k)) return false;
12552
12609
  }
12553
- if (!v.distributions || typeof v.distributions !== "object") return false;
12610
+ return true;
12611
+ }
12612
+ function isSanitizedResult(value) {
12613
+ if (!isObject(value)) return false;
12614
+ const { fields, distributions } = value;
12615
+ if (!isObject(fields)) return false;
12616
+ if (!hasAllowedFieldKeys(fields)) return false;
12617
+ if (!isObject(distributions)) return false;
12554
12618
  return true;
12555
12619
  }
12556
12620
  function assertSanitized(value) {
@@ -13137,7 +13201,7 @@ function deriveSkillUsage(projectRoot, skillName, windowDays = 30) {
13137
13201
  if (lastUsed) stats.lastUsed = lastUsed;
13138
13202
  return stats;
13139
13203
  }
13140
- var WHATWG_BAD_PORTS, BAD_PORT_SET, VALID_TYPES, CONVENTIONAL_PATTERN, LOOKBACK_PATTERN, PulseDbSourceSchema, PulseSourcesSchema, PulseConfigSchema, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ALL_SOLUTION_CATEGORIES, ISO_DATE, 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, 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, readFile62, 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, 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, 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, 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, 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, PRIORITY_RANK2, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, ConflictError, DEFAULTS, GitHubHttp, ETagStore, START_MARKER, END_MARKER, SERIALIZER_FIELDS, GitHubIssuesTrackerAdapter, migrate_exports, HASH_RE, 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, OTLPExporter, SpanKind, CompoundLockHeldError, KNOWN_CATEGORIES, 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, ProposalNotFoundError, ProposalConflictError;
13204
+ var WHATWG_BAD_PORTS, BAD_PORT_SET, VALID_TYPES, CONVENTIONAL_PATTERN, LOOKBACK_PATTERN, PulseDbSourceSchema, PulseSourcesSchema, PulseConfigSchema, BUG_TRACK_CATEGORIES, KNOWLEDGE_TRACK_CATEGORIES, ALL_SOLUTION_CATEGORIES, ISO_DATE, 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, 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, readFile62, 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, MAX_TOP_AFFECTED, 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, 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, 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, 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, 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, PRIORITY_RANK2, POSITION_WEIGHT, DEPENDENTS_WEIGHT, AFFINITY_WEIGHT, ConflictError, DEFAULTS, GitHubHttp, ETagStore, START_MARKER, END_MARKER, SERIALIZER_FIELDS, GitHubIssuesTrackerAdapter, migrate_exports, HASH_RE, 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, CompoundLockHeldError, KNOWN_CATEGORIES, 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, ProposalNotFoundError, ProposalConflictError;
13141
13205
  var init_dist3 = __esm({
13142
13206
  "../core/dist/index.mjs"() {
13143
13207
  init_chunk_FYTJQ2ZY();
@@ -13688,6 +13752,7 @@ var init_dist3 = __esm({
13688
13752
  exclude: z4.array(z4.string()).optional(),
13689
13753
  docPaths: z4.array(z4.string()).optional()
13690
13754
  });
13755
+ MAX_TOP_AFFECTED = 5;
13691
13756
  BaselineManager = class {
13692
13757
  baselinesPath;
13693
13758
  constructor(projectRoot) {
@@ -16068,11 +16133,20 @@ var init_dist3 = __esm({
16068
16133
  }
16069
16134
  return null;
16070
16135
  }
16071
- /** Scan a single line against a resolved rule; push any findings into the array. */
16072
- scanLineForRule(rule, resolved, line, lineNumber, filePath, findings) {
16073
- const suppressionMatch = parseHarnessIgnore(line, rule.id);
16136
+ /**
16137
+ * Scan a single line against a resolved rule; push any findings into the array.
16138
+ *
16139
+ * Suppression check is two-pass: same line first (trailing-comment style), then the previous
16140
+ * line (the dominant convention: `// harness-ignore` on the line above the flagged code).
16141
+ * Without the prior-line check, every multi-line statement annotated using the over-the-top
16142
+ * convention would slip through and re-trigger the finding.
16143
+ */
16144
+ scanLineForRule(rule, resolved, line, lineNumber, filePath, findings, priorLine) {
16145
+ const sameLineMatch = parseHarnessIgnore(line, rule.id);
16146
+ const priorLineMatch = !sameLineMatch && priorLine !== void 0 ? parseHarnessIgnore(priorLine, rule.id) : null;
16147
+ const suppressionMatch = sameLineMatch ?? priorLineMatch;
16074
16148
  if (suppressionMatch) {
16075
- if (!suppressionMatch.justification) {
16149
+ if (!suppressionMatch.justification && sameLineMatch !== null) {
16076
16150
  findings.push(this.buildSuppressionFinding(rule, filePath, lineNumber, line));
16077
16151
  }
16078
16152
  return;
@@ -16096,7 +16170,15 @@ var init_dist3 = __esm({
16096
16170
  );
16097
16171
  if (resolved === "off") continue;
16098
16172
  for (let i = 0; i < lines.length; i++) {
16099
- this.scanLineForRule(rule, resolved, lines[i] ?? "", startLine + i, filePath, findings);
16173
+ this.scanLineForRule(
16174
+ rule,
16175
+ resolved,
16176
+ lines[i] ?? "",
16177
+ startLine + i,
16178
+ filePath,
16179
+ findings,
16180
+ i > 0 ? lines[i - 1] : void 0
16181
+ );
16100
16182
  }
16101
16183
  }
16102
16184
  return findings;
@@ -18500,6 +18582,10 @@ console.log('Blueprint player initialized.');
18500
18582
  }
18501
18583
  };
18502
18584
  RETRY_BACKOFFS_MS = [1e3, 2e3, 4e3];
18585
+ DEFAULT_FLUSH_INTERVAL_MS = 2e3;
18586
+ DEFAULT_BATCH_SIZE = 64;
18587
+ defaultFetch = (...args) => globalThis.fetch(...args);
18588
+ defaultWarn = (...args) => console.warn(...args);
18503
18589
  OTLPExporter = class {
18504
18590
  endpoint;
18505
18591
  enabled;
@@ -18512,13 +18598,14 @@ console.log('Blueprint player initialized.');
18512
18598
  timer = null;
18513
18599
  inFlightFlushes = /* @__PURE__ */ new Set();
18514
18600
  constructor(opts) {
18515
- this.endpoint = opts.endpoint;
18516
- this.enabled = opts.enabled !== false;
18517
- this.headers = { "Content-Type": "application/json", ...opts.headers ?? {} };
18518
- this.flushIntervalMs = opts.flushIntervalMs ?? 2e3;
18519
- this.batchSize = opts.batchSize ?? 64;
18520
- this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
18521
- this.warn = opts.warn ?? ((...a) => console.warn(...a));
18601
+ const resolved = resolveOTLPOptions(opts);
18602
+ this.endpoint = resolved.endpoint;
18603
+ this.enabled = resolved.enabled;
18604
+ this.headers = resolved.headers;
18605
+ this.flushIntervalMs = resolved.flushIntervalMs;
18606
+ this.batchSize = resolved.batchSize;
18607
+ this.fetchImpl = resolved.fetchImpl;
18608
+ this.warn = resolved.warn;
18522
18609
  }
18523
18610
  /**
18524
18611
  * O(1) buffer push. When `enabled === false` this is a no-op. If the
@@ -18601,36 +18688,18 @@ console.log('Blueprint player initialized.');
18601
18688
  * tests; not part of the supported API surface.
18602
18689
  */
18603
18690
  spansToOTLPJSON(spans) {
18604
- return {
18605
- resourceSpans: [
18606
- {
18607
- resource: {
18608
- attributes: [{ key: "service.name", value: { stringValue: "harness" } }]
18609
- },
18610
- scopeSpans: [
18611
- {
18612
- scope: { name: "harness" },
18613
- spans: spans.map((s) => {
18614
- const span = {
18615
- traceId: s.traceId,
18616
- spanId: s.spanId,
18617
- name: s.name,
18618
- kind: s.kind,
18619
- startTimeUnixNano: toUnixNanoString(s.startTimeNs),
18620
- endTimeUnixNano: toUnixNanoString(s.endTimeNs),
18621
- attributes: attributesToOTLP(s.attributes)
18622
- };
18623
- if (s.parentSpanId !== void 0) span["parentSpanId"] = s.parentSpanId;
18624
- if (s.statusCode !== void 0) span["status"] = { code: s.statusCode };
18625
- return span;
18626
- })
18627
- }
18628
- ]
18629
- }
18630
- ]
18691
+ const scopeSpan = {
18692
+ scope: { name: "harness" },
18693
+ spans: spans.map(spanToOTLP)
18694
+ };
18695
+ const resourceSpan = {
18696
+ resource: { attributes: SERVICE_NAME_ATTR },
18697
+ scopeSpans: [scopeSpan]
18631
18698
  };
18699
+ return { resourceSpans: [resourceSpan] };
18632
18700
  }
18633
18701
  };
18702
+ SERVICE_NAME_ATTR = [{ key: "service.name", value: { stringValue: "harness" } }];
18634
18703
  SpanKind = /* @__PURE__ */ ((SpanKind2) => {
18635
18704
  SpanKind2[SpanKind2["INTERNAL"] = 1] = "INTERNAL";
18636
18705
  SpanKind2[SpanKind2["SERVER"] = 2] = "SERVER";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveProjectConfig
3
- } from "./chunk-GWF2OILZ.js";
3
+ } from "./chunk-VG6UK6G6.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-OHDQBTSO.js");
52
+ const core = await import("./dist-XIJWWQ5N.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-OHDQBTSO.js");
71
+ const core = await import("./dist-XIJWWQ5N.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);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-VTTNIZJL.js";
3
+ } from "./chunk-B4OLYXZ4.js";
4
4
  import {
5
5
  logger
6
6
  } from "./chunk-EBJQ6N4M.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-3WGJMBKH.js";
10
10
  import {
11
11
  init_dist
12
- } from "./chunk-YYRQCQPZ.js";
12
+ } from "./chunk-IY2TZLY5.js";
13
13
  import {
14
14
  Ok
15
15
  } from "./chunk-OH3NXXUY.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YYRQCQPZ.js";
3
+ } from "./chunk-IY2TZLY5.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  resultToMcpResponse
3
- } from "./chunk-EPUKTTJZ.js";
3
+ } from "./chunk-RC3OI5NK.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-VTTNIZJL.js";
10
+ } from "./chunk-B4OLYXZ4.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-YYRQCQPZ.js";
13
+ } from "./chunk-IY2TZLY5.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-OH3NXXUY.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-OHDQBTSO.js");
53
+ const { validateKnowledgeMap } = await import("./dist-XIJWWQ5N.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-OHDQBTSO.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-XIJWWQ5N.js");
59
59
  const domain2 = input.domain ?? "src";
60
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-EQBOIHFZ.js");
60
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-EIFEOUVI.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
62
62
  let graphCoverage2;
63
63
  if (store2) {
64
- const { Assembler } = await import("./dist-QPWXPCPL.js");
64
+ const { Assembler } = await import("./dist-R3TOOPJ7.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-OHDQBTSO.js");
97
+ const { checkDocCoverage } = await import("./dist-XIJWWQ5N.js");
98
98
  const domain = input.domain ?? "src";
99
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
99
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
100
100
  const store = await loadGraphStore(projectPath);
101
101
  let graphCoverage;
102
102
  if (store) {
103
- const { Assembler } = await import("./dist-QPWXPCPL.js");
103
+ const { Assembler } = await import("./dist-R3TOOPJ7.js");
104
104
  const assembler = new Assembler(store);
105
105
  const report = assembler.checkCoverage();
106
106
  graphCoverage = {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YYRQCQPZ.js";
3
+ } from "./chunk-IY2TZLY5.js";
4
4
  import {
5
5
  Ok
6
6
  } from "./chunk-OH3NXXUY.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  resultToMcpResponse
3
- } from "./chunk-EPUKTTJZ.js";
3
+ } from "./chunk-RC3OI5NK.js";
4
4
  import {
5
5
  sanitizePath
6
6
  } from "./chunk-W6Y7ZW3Y.js";
7
7
  import {
8
8
  init_dist
9
- } from "./chunk-YYRQCQPZ.js";
9
+ } from "./chunk-IY2TZLY5.js";
10
10
  import {
11
11
  Ok
12
12
  } from "./chunk-OH3NXXUY.js";
@@ -14,10 +14,10 @@ import {
14
14
  // src/mcp/tools/entropy.ts
15
15
  init_dist();
16
16
  async function loadEntropyGraphOptions(projectPath) {
17
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
17
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
18
18
  const store = await loadGraphStore(projectPath);
19
19
  if (!store) return void 0;
20
- const { GraphEntropyAdapter } = await import("./dist-QPWXPCPL.js");
20
+ const { GraphEntropyAdapter } = await import("./dist-R3TOOPJ7.js");
21
21
  const adapter = new GraphEntropyAdapter(store);
22
22
  const driftData = adapter.computeDriftData();
23
23
  const deadCodeData = adapter.computeDeadCodeData();
@@ -127,7 +127,7 @@ function buildSummaryResponse(report) {
127
127
  }
128
128
  async function handleDetectEntropy(input) {
129
129
  try {
130
- const { EntropyAnalyzer } = await import("./dist-OHDQBTSO.js");
130
+ const { EntropyAnalyzer } = await import("./dist-XIJWWQ5N.js");
131
131
  const typeFilter = input.type ?? "all";
132
132
  const analyzer = new EntropyAnalyzer({
133
133
  rootDir: sanitizePath(input.path),
@@ -146,7 +146,7 @@ async function handleDetectEntropy(input) {
146
146
  return resultToMcpResponse(result);
147
147
  }
148
148
  if (!result.ok) return resultToMcpResponse(result);
149
- const { createFixes, applyFixes, generateSuggestions } = await import("./dist-OHDQBTSO.js");
149
+ const { createFixes, applyFixes, generateSuggestions } = await import("./dist-XIJWWQ5N.js");
150
150
  const report = result.value;
151
151
  const deadCode = report.deadCode;
152
152
  const fixTypesConfig = input.fixTypes ? { fixTypes: input.fixTypes } : void 0;
@@ -1,11 +1,14 @@
1
1
  // src/mcp/utils/result-adapter.ts
2
+ function bigIntSafeReplacer(_key, value) {
3
+ return typeof value === "bigint" ? value.toString() : value;
4
+ }
2
5
  function resultToMcpResponse(result) {
3
6
  if (result.ok) {
4
7
  return {
5
8
  content: [
6
9
  {
7
10
  type: "text",
8
- text: typeof result.value === "string" ? result.value : JSON.stringify(result.value)
11
+ text: typeof result.value === "string" ? result.value : JSON.stringify(result.value, bigIntSafeReplacer)
9
12
  }
10
13
  ]
11
14
  };
@@ -17,5 +20,6 @@ function resultToMcpResponse(result) {
17
20
  }
18
21
 
19
22
  export {
23
+ bigIntSafeReplacer,
20
24
  resultToMcpResponse
21
25
  };