@harness-engineering/cli 2.6.1 → 2.7.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 (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 +244 -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 +244 -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 +244 -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 +244 -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-FKMKH6ZF.js} +4 -4
  102. package/dist/{analyzer-VY6DJVOU-4AHIJLNS.js → analyzer-H3AHBFSL-KPOPJYRB.js} +8 -8
  103. package/dist/{architecture-CXAVNB5X.js → architecture-LUR2I67H.js} +6 -6
  104. package/dist/{assess-project-M626SSPN.js → assess-project-OJWECOP2.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-HS5KYLRO.js} +5 -5
  108. package/dist/{chunk-5XLLIYYL.js → chunk-6UHDQP2N.js} +1 -1
  109. package/dist/{chunk-I6K43QQS.js → chunk-7AF6C5GE.js} +3 -3
  110. package/dist/{chunk-372MGNTI.js → chunk-7PLIWP7U.js} +6899 -133
  111. package/dist/{chunk-VUCGB2KH.js → chunk-B2VAYLYI.js} +1 -1
  112. package/dist/{chunk-HFOB2MPQ.js → chunk-CZPOPMMI.js} +3 -3
  113. package/dist/{chunk-43M3RLFQ.js → chunk-FC4JPM6W.js} +2 -2
  114. package/dist/{chunk-6AX6R3LM.js → chunk-FEKBXX2J.js} +9 -9
  115. package/dist/{chunk-VTTNIZJL.js → chunk-FXZI6NJ2.js} +131 -6
  116. package/dist/{chunk-5JNSFYZU.js → chunk-GGSNWH7P.js} +6 -6
  117. package/dist/{chunk-BCFDGOMA.js → chunk-H2ZJOJ7A.js} +81 -1
  118. package/dist/{chunk-PFZEADQM.js → chunk-INBTDBV2.js} +79 -2
  119. package/dist/{chunk-Q6ZR2L6Q.js → chunk-KN3EMDZ5.js} +2 -2
  120. package/dist/{chunk-JFZOWO7D.js → chunk-LECXPXS3.js} +1 -1
  121. package/dist/{chunk-CQOMVZDC.js → chunk-LGYXR2KZ.js} +2237 -604
  122. package/dist/{chunk-QOKMDDBJ.js → chunk-LYIPI2SJ.js} +6 -6
  123. package/dist/{chunk-L5BCZ5XS.js → chunk-N5NSSLMU.js} +1 -1
  124. package/dist/{chunk-GWE5LL3R.js → chunk-NIVWM7OW.js} +10 -10
  125. package/dist/{chunk-24KCOJJG.js → chunk-O2ASYKA6.js} +1 -1
  126. package/dist/{chunk-K246XQ2L.js → chunk-PTHX545Q.js} +1 -1
  127. package/dist/{chunk-EPUKTTJZ.js → chunk-RC3OI5NK.js} +5 -1
  128. package/dist/{chunk-YP7I25SL.js → chunk-RJ2WEES5.js} +1 -1
  129. package/dist/{chunk-5FDBXUFW.js → chunk-TIH53QXY.js} +1 -1
  130. package/dist/{chunk-OA6SWTU4.js → chunk-VI4IS55S.js} +11 -8
  131. package/dist/{chunk-GWF2OILZ.js → chunk-VSIRUZQP.js} +1 -1
  132. package/dist/{chunk-YYRQCQPZ.js → chunk-WZY5U6NS.js} +178 -109
  133. package/dist/{chunk-SZEFU6XC.js → chunk-Y4T6ENKQ.js} +9 -9
  134. package/dist/{chunk-HMW3VKUF.js → chunk-Z3TMCCZB.js} +10 -10
  135. package/dist/{ci-workflow-3JNDZQYD.js → ci-workflow-MDSTHJOY.js} +4 -4
  136. package/dist/{dist-OHDQBTSO.js → dist-72ID44UE.js} +3 -3
  137. package/dist/{dist-QPWXPCPL.js → dist-R3TOOPJ7.js} +1 -1
  138. package/dist/{docs-5RYMDHN3.js → docs-2RFOJ6XY.js} +6 -6
  139. package/dist/{engine-GKGT5ULT.js → engine-BSFKOGPN.js} +4 -4
  140. package/dist/{entropy-DQTAPSSE.js → entropy-3UX6644G.js} +5 -5
  141. package/dist/{feedback-WH6XPQJS.js → feedback-CVCFYND4.js} +2 -2
  142. package/dist/{generate-agent-definitions-SZA4QIHN.js → generate-agent-definitions-HZ3XENWO.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 +1012 -12
  146. package/dist/index.js +27 -27
  147. package/dist/{loader-BNKGM23C.js → loader-6RHWU5FH.js} +4 -4
  148. package/dist/{mcp-YKKPWUMH.js → mcp-OYR26JDI.js} +17 -17
  149. package/dist/{performance-54TMJOEU.js → performance-JJMIRXCH.js} +6 -6
  150. package/dist/{review-pipeline-OTDDVPNY.js → review-pipeline-BHQZIXWZ.js} +4 -4
  151. package/dist/{runtime-W5THSNAL.js → runtime-DALTAVTN.js} +4 -4
  152. package/dist/{scan-4PPP6ZXT.js → scan-LYKLM4EQ.js} +1 -1
  153. package/dist/{security-27HW7CYT.js → security-RMLMYFPB.js} +1 -1
  154. package/dist/{validate-QRVCD4GP.js → validate-R7DZRDFK.js} +5 -5
  155. package/dist/{validate-cross-check-BUAGBAPO.js → validate-cross-check-AUUZFNVL.js} +4 -4
  156. package/package.json +8 -7
@@ -22,7 +22,7 @@ import {
22
22
  getDefaultRegistry,
23
23
  getOutline,
24
24
  getParser,
25
- init_chunk_BTUDWWB4,
25
+ init_chunk_I2JUTTPH,
26
26
  init_chunk_MUWJHO2S,
27
27
  parseFile,
28
28
  parseSize,
@@ -31,7 +31,7 @@ import {
31
31
  resetParserCache,
32
32
  resolveFileToLayer,
33
33
  validateDependencies
34
- } from "./chunk-SZEFU6XC.js";
34
+ } from "./chunk-Y4T6ENKQ.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-H3AHBFSL-KPOPJYRB.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,11 +13201,11 @@ 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();
13144
- init_chunk_BTUDWWB4();
13208
+ init_chunk_I2JUTTPH();
13145
13209
  init_chunk_MUWJHO2S();
13146
13210
  init_chunk_XKLVJIPL();
13147
13211
  init_chunk_IIEDD47I();
@@ -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";
@@ -7,7 +7,7 @@ import {
7
7
  DEFAULT_SKIP_DIRS,
8
8
  init_dist as init_dist2,
9
9
  skipDirGlobs
10
- } from "./chunk-BCFDGOMA.js";
10
+ } from "./chunk-H2ZJOJ7A.js";
11
11
  import {
12
12
  __esm
13
13
  } from "./chunk-KFQGP6VL.js";
@@ -1605,7 +1605,7 @@ var init_chunk_MUWJHO2S = __esm({
1605
1605
  }
1606
1606
  });
1607
1607
 
1608
- // ../core/dist/chunk-BTUDWWB4.mjs
1608
+ // ../core/dist/chunk-I2JUTTPH.mjs
1609
1609
  import { resolve as resolve2 } from "path";
1610
1610
  import { minimatch as minimatch2 } from "minimatch";
1611
1611
  import { join, resolve as resolve3 } from "path";
@@ -2968,15 +2968,15 @@ function generatePatternSuggestions(report) {
2968
2968
  return suggestions;
2969
2969
  }
2970
2970
  function generateSuggestions(deadCode, drift, patterns) {
2971
- const suggestions = [];
2971
+ let suggestions = [];
2972
2972
  if (deadCode) {
2973
- suggestions.push(...generateDeadCodeSuggestions(deadCode));
2973
+ suggestions = suggestions.concat(generateDeadCodeSuggestions(deadCode));
2974
2974
  }
2975
2975
  if (drift) {
2976
- suggestions.push(...generateDriftSuggestions(drift));
2976
+ suggestions = suggestions.concat(generateDriftSuggestions(drift));
2977
2977
  }
2978
2978
  if (patterns) {
2979
- suggestions.push(...generatePatternSuggestions(patterns));
2979
+ suggestions = suggestions.concat(generatePatternSuggestions(patterns));
2980
2980
  }
2981
2981
  const priorityOrder = { high: 0, medium: 1, low: 2 };
2982
2982
  suggestions.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
@@ -3002,8 +3002,8 @@ function generateSuggestions(deadCode, drift, patterns) {
3002
3002
  };
3003
3003
  }
3004
3004
  var TS_HINTS, TS_CONVENTIONS, PYTHON_HINTS, PYTHON_CONVENTIONS, DEFAULT_INCLUDE_PATTERNS, CODE_BLOCK_LANGUAGES, DEFAULT_DRIFT_CONFIG, JS_EXT_FALLBACKS2, FILE_TYPES, EXPORT_TYPES, CONVENTION_DESCRIPTIONS, RULE_CHECKERS, EntropyAnalyzer;
3005
- var init_chunk_BTUDWWB4 = __esm({
3006
- "../core/dist/chunk-BTUDWWB4.mjs"() {
3005
+ var init_chunk_I2JUTTPH = __esm({
3006
+ "../core/dist/chunk-I2JUTTPH.mjs"() {
3007
3007
  "use strict";
3008
3008
  init_chunk_MUWJHO2S();
3009
3009
  init_dist2();
@@ -3333,5 +3333,5 @@ export {
3333
3333
  detectSizeBudgetViolations,
3334
3334
  generateSuggestions,
3335
3335
  EntropyAnalyzer,
3336
- init_chunk_BTUDWWB4
3336
+ init_chunk_I2JUTTPH
3337
3337
  };
@@ -1,6 +1,6 @@
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";
@@ -33,7 +33,7 @@ var createSelfReviewDefinition = {
33
33
  };
34
34
  async function handleCreateSelfReview(input) {
35
35
  try {
36
- const { parseDiff, createSelfReview } = await import("./dist-OHDQBTSO.js");
36
+ const { parseDiff, createSelfReview } = await import("./dist-72ID44UE.js");
37
37
  const parseResult = parseDiff(input.diff);
38
38
  if (!parseResult.ok) {
39
39
  return resultToMcpResponse(parseResult);
@@ -53,11 +53,11 @@ async function handleCreateSelfReview(input) {
53
53
  ...input.maxFileCount !== void 0 ? { maxChangedFiles: input.maxFileCount } : {}
54
54
  }
55
55
  };
56
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
56
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
57
57
  const store = await loadGraphStore(projectPath);
58
58
  let graphData;
59
59
  if (store) {
60
- const { GraphFeedbackAdapter } = await import("./dist-QPWXPCPL.js");
60
+ const { GraphFeedbackAdapter } = await import("./dist-R3TOOPJ7.js");
61
61
  const adapter = new GraphFeedbackAdapter(store);
62
62
  const changedFiles = parseResult.value.files.map((f) => f.path);
63
63
  const impact = adapter.computeImpactData(changedFiles);
@@ -119,7 +119,7 @@ var analyzeDiffDefinition = {
119
119
  };
120
120
  async function handleAnalyzeDiff(input) {
121
121
  try {
122
- const { parseDiff, analyzeDiff } = await import("./dist-OHDQBTSO.js");
122
+ const { parseDiff, analyzeDiff } = await import("./dist-72ID44UE.js");
123
123
  const parseResult = parseDiff(input.diff);
124
124
  if (!parseResult.ok) {
125
125
  return resultToMcpResponse(parseResult);
@@ -139,10 +139,10 @@ async function handleAnalyzeDiff(input) {
139
139
  let graphImpactData;
140
140
  if (input.path) {
141
141
  try {
142
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
142
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
143
143
  const store = await loadGraphStore(sanitizePath(input.path));
144
144
  if (store) {
145
- const { GraphFeedbackAdapter } = await import("./dist-QPWXPCPL.js");
145
+ const { GraphFeedbackAdapter } = await import("./dist-R3TOOPJ7.js");
146
146
  const adapter = new GraphFeedbackAdapter(store);
147
147
  const changedFiles = parseResult.value.files.map((f) => f.path);
148
148
  const impact = adapter.computeImpactData(changedFiles);
@@ -195,7 +195,7 @@ var requestPeerReviewDefinition = {
195
195
  };
196
196
  async function handleRequestPeerReview(input) {
197
197
  try {
198
- const { parseDiff, requestPeerReview } = await import("./dist-OHDQBTSO.js");
198
+ const { parseDiff, requestPeerReview } = await import("./dist-72ID44UE.js");
199
199
  const parseResult = parseDiff(input.diff);
200
200
  if (!parseResult.ok) {
201
201
  return resultToMcpResponse(parseResult);
@@ -206,10 +206,10 @@ async function handleRequestPeerReview(input) {
206
206
  ...input.context ? { metadata: { context: input.context } } : {}
207
207
  };
208
208
  try {
209
- const { loadGraphStore } = await import("./graph-loader-EQBOIHFZ.js");
209
+ const { loadGraphStore } = await import("./graph-loader-EIFEOUVI.js");
210
210
  const store = await loadGraphStore(sanitizePath(input.path));
211
211
  if (store) {
212
- const { GraphFeedbackAdapter } = await import("./dist-QPWXPCPL.js");
212
+ const { GraphFeedbackAdapter } = await import("./dist-R3TOOPJ7.js");
213
213
  const adapter = new GraphFeedbackAdapter(store);
214
214
  const changedFiles = parseResult.value.files.map((f) => f.path);
215
215
  const impactData = adapter.computeImpactData(changedFiles);
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  generateCIWorkflow
3
- } from "./chunk-YP7I25SL.js";
4
- import "./chunk-YYRQCQPZ.js";
5
- import "./chunk-SZEFU6XC.js";
3
+ } from "./chunk-RJ2WEES5.js";
4
+ import "./chunk-WZY5U6NS.js";
5
+ import "./chunk-Y4T6ENKQ.js";
6
6
  import "./chunk-OH3NXXUY.js";
7
- import "./chunk-BCFDGOMA.js";
7
+ import "./chunk-H2ZJOJ7A.js";
8
8
  import "./chunk-QCLOIUMX.js";
9
9
  import "./chunk-XARGEOJV.js";
10
10
  import "./chunk-KFQGP6VL.js";
@@ -417,7 +417,7 @@ import {
417
417
  writeSessionSummary,
418
418
  writeTaint,
419
419
  xssRules
420
- } from "./chunk-YYRQCQPZ.js";
420
+ } from "./chunk-WZY5U6NS.js";
421
421
  import {
422
422
  EXTENSION_MAP,
423
423
  EntropyAnalyzer,
@@ -443,7 +443,7 @@ import {
443
443
  resetParserCache,
444
444
  resolveFileToLayer,
445
445
  validateDependencies
446
- } from "./chunk-SZEFU6XC.js";
446
+ } from "./chunk-Y4T6ENKQ.js";
447
447
  import {
448
448
  AuthAuditEntrySchema,
449
449
  AuthTokenPublicSchema,
@@ -489,7 +489,7 @@ import {
489
489
  isErr,
490
490
  isOk
491
491
  } from "./chunk-OH3NXXUY.js";
492
- import "./chunk-BCFDGOMA.js";
492
+ import "./chunk-H2ZJOJ7A.js";
493
493
  import {
494
494
  ArchBaselineSchema,
495
495
  ArchConfigSchema,
@@ -80,7 +80,7 @@ import {
80
80
  resolveSkipDirs,
81
81
  saveGraph,
82
82
  skipDirGlobs
83
- } from "./chunk-BCFDGOMA.js";
83
+ } from "./chunk-H2ZJOJ7A.js";
84
84
  import "./chunk-KFQGP6VL.js";
85
85
  init_dist();
86
86
  export {