@harness-engineering/cli 1.26.1 → 1.27.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 (149) hide show
  1. package/dist/agents/skills/claude-code/cleanup-dead-code/SKILL.md +3 -1
  2. package/dist/agents/skills/claude-code/detect-doc-drift/SKILL.md +3 -1
  3. package/dist/agents/skills/claude-code/harness-architecture-advisor/SKILL.md +4 -0
  4. package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +55 -24
  5. package/dist/agents/skills/claude-code/harness-brainstorming/SKILL.md +16 -5
  6. package/dist/agents/skills/claude-code/harness-code-review/SKILL.md +21 -6
  7. package/dist/agents/skills/claude-code/harness-codebase-cleanup/SKILL.md +2 -0
  8. package/dist/agents/skills/claude-code/harness-debugging/SKILL.md +13 -1
  9. package/dist/agents/skills/claude-code/harness-dependency-health/SKILL.md +4 -0
  10. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +16 -6
  11. package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +2 -0
  12. package/dist/agents/skills/claude-code/harness-integration/SKILL.md +560 -0
  13. package/dist/agents/skills/claude-code/harness-integration/skill.yaml +65 -0
  14. package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +2 -0
  15. package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +4 -0
  16. package/dist/agents/skills/claude-code/harness-perf/SKILL.md +9 -7
  17. package/dist/agents/skills/claude-code/harness-planning/SKILL.md +77 -10
  18. package/dist/agents/skills/claude-code/harness-refactoring/SKILL.md +13 -4
  19. package/dist/agents/skills/claude-code/harness-security-scan/SKILL.md +3 -1
  20. package/dist/agents/skills/claude-code/harness-soundness-review/SKILL.md +4 -0
  21. package/dist/agents/skills/claude-code/harness-tdd/SKILL.md +5 -2
  22. package/dist/agents/skills/claude-code/harness-verification/SKILL.md +4 -0
  23. package/dist/agents/skills/codex/cleanup-dead-code/SKILL.md +3 -1
  24. package/dist/agents/skills/codex/detect-doc-drift/SKILL.md +3 -1
  25. package/dist/agents/skills/codex/harness-architecture-advisor/SKILL.md +4 -0
  26. package/dist/agents/skills/codex/harness-autopilot/SKILL.md +55 -24
  27. package/dist/agents/skills/codex/harness-brainstorming/SKILL.md +16 -5
  28. package/dist/agents/skills/codex/harness-code-review/SKILL.md +21 -6
  29. package/dist/agents/skills/codex/harness-codebase-cleanup/SKILL.md +2 -0
  30. package/dist/agents/skills/codex/harness-debugging/SKILL.md +13 -1
  31. package/dist/agents/skills/codex/harness-dependency-health/SKILL.md +4 -0
  32. package/dist/agents/skills/codex/harness-execution/SKILL.md +16 -6
  33. package/dist/agents/skills/codex/harness-impact-analysis/SKILL.md +2 -0
  34. package/dist/agents/skills/codex/harness-integration/SKILL.md +560 -0
  35. package/dist/agents/skills/codex/harness-integration/skill.yaml +65 -0
  36. package/dist/agents/skills/codex/harness-integrity/SKILL.md +2 -0
  37. package/dist/agents/skills/codex/harness-onboarding/SKILL.md +4 -0
  38. package/dist/agents/skills/codex/harness-perf/SKILL.md +9 -7
  39. package/dist/agents/skills/codex/harness-planning/SKILL.md +77 -10
  40. package/dist/agents/skills/codex/harness-refactoring/SKILL.md +13 -4
  41. package/dist/agents/skills/codex/harness-security-scan/SKILL.md +3 -1
  42. package/dist/agents/skills/codex/harness-soundness-review/SKILL.md +4 -0
  43. package/dist/agents/skills/codex/harness-tdd/SKILL.md +5 -2
  44. package/dist/agents/skills/codex/harness-verification/SKILL.md +4 -0
  45. package/dist/agents/skills/cursor/cleanup-dead-code/SKILL.md +3 -1
  46. package/dist/agents/skills/cursor/detect-doc-drift/SKILL.md +3 -1
  47. package/dist/agents/skills/cursor/harness-architecture-advisor/SKILL.md +4 -0
  48. package/dist/agents/skills/cursor/harness-autopilot/SKILL.md +55 -24
  49. package/dist/agents/skills/cursor/harness-brainstorming/SKILL.md +16 -5
  50. package/dist/agents/skills/cursor/harness-code-review/SKILL.md +21 -6
  51. package/dist/agents/skills/cursor/harness-codebase-cleanup/SKILL.md +2 -0
  52. package/dist/agents/skills/cursor/harness-debugging/SKILL.md +13 -1
  53. package/dist/agents/skills/cursor/harness-dependency-health/SKILL.md +4 -0
  54. package/dist/agents/skills/cursor/harness-execution/SKILL.md +16 -6
  55. package/dist/agents/skills/cursor/harness-impact-analysis/SKILL.md +2 -0
  56. package/dist/agents/skills/cursor/harness-integration/SKILL.md +560 -0
  57. package/dist/agents/skills/cursor/harness-integration/skill.yaml +65 -0
  58. package/dist/agents/skills/cursor/harness-integrity/SKILL.md +2 -0
  59. package/dist/agents/skills/cursor/harness-onboarding/SKILL.md +4 -0
  60. package/dist/agents/skills/cursor/harness-perf/SKILL.md +9 -7
  61. package/dist/agents/skills/cursor/harness-planning/SKILL.md +77 -10
  62. package/dist/agents/skills/cursor/harness-refactoring/SKILL.md +13 -4
  63. package/dist/agents/skills/cursor/harness-security-scan/SKILL.md +3 -1
  64. package/dist/agents/skills/cursor/harness-soundness-review/SKILL.md +4 -0
  65. package/dist/agents/skills/cursor/harness-tdd/SKILL.md +5 -2
  66. package/dist/agents/skills/cursor/harness-verification/SKILL.md +4 -0
  67. package/dist/agents/skills/gemini-cli/cleanup-dead-code/SKILL.md +3 -1
  68. package/dist/agents/skills/gemini-cli/detect-doc-drift/SKILL.md +3 -1
  69. package/dist/agents/skills/gemini-cli/harness-architecture-advisor/SKILL.md +4 -0
  70. package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +55 -24
  71. package/dist/agents/skills/gemini-cli/harness-brainstorming/SKILL.md +16 -5
  72. package/dist/agents/skills/gemini-cli/harness-code-review/SKILL.md +21 -6
  73. package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/SKILL.md +2 -0
  74. package/dist/agents/skills/gemini-cli/harness-debugging/SKILL.md +13 -1
  75. package/dist/agents/skills/gemini-cli/harness-dependency-health/SKILL.md +4 -0
  76. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +16 -6
  77. package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +2 -0
  78. package/dist/agents/skills/gemini-cli/harness-integration/SKILL.md +560 -0
  79. package/dist/agents/skills/gemini-cli/harness-integration/skill.yaml +65 -0
  80. package/dist/agents/skills/gemini-cli/harness-integrity/SKILL.md +2 -0
  81. package/dist/agents/skills/gemini-cli/harness-onboarding/SKILL.md +4 -0
  82. package/dist/agents/skills/gemini-cli/harness-perf/SKILL.md +9 -7
  83. package/dist/agents/skills/gemini-cli/harness-planning/SKILL.md +77 -10
  84. package/dist/agents/skills/gemini-cli/harness-refactoring/SKILL.md +13 -4
  85. package/dist/agents/skills/gemini-cli/harness-security-scan/SKILL.md +3 -1
  86. package/dist/agents/skills/gemini-cli/harness-soundness-review/SKILL.md +4 -0
  87. package/dist/agents/skills/gemini-cli/harness-tdd/SKILL.md +5 -2
  88. package/dist/agents/skills/gemini-cli/harness-verification/SKILL.md +4 -0
  89. package/dist/{agents-md-VI3HLR7E.js → agents-md-2RN666DE.js} +3 -3
  90. package/dist/{architecture-ZDDKEVID.js → architecture-ZR33YKJB.js} +4 -4
  91. package/dist/{assess-project-Y6W7YDUA.js → assess-project-LLWWEQEV.js} +1 -1
  92. package/dist/bin/harness-mcp.js +17 -16
  93. package/dist/bin/harness.js +27 -26
  94. package/dist/{business-knowledge-6RHYJOB3.js → business-knowledge-EISPR7FU.js} +1 -1
  95. package/dist/{check-phase-gate-CXR3VM22.js → check-phase-gate-ZVG56NT2.js} +4 -4
  96. package/dist/chunk-27AJKSQY.js +107 -0
  97. package/dist/{chunk-DBIX3X4H.js → chunk-2FOLD76X.js} +2 -2
  98. package/dist/{chunk-3AMQYWGT.js → chunk-3AJW7VQ3.js} +2 -2
  99. package/dist/{chunk-FUND5WJR.js → chunk-3XMOWLK3.js} +2 -2
  100. package/dist/{chunk-OLW7BJ5N.js → chunk-776JFSPK.js} +1 -1
  101. package/dist/{chunk-VKS3F46M.js → chunk-A4ETL34H.js} +7 -2
  102. package/dist/{chunk-JV4Y2U5F.js → chunk-BO4AJZRE.js} +1 -1
  103. package/dist/{chunk-WZ7UHPT3.js → chunk-BZZNYHRY.js} +9 -9
  104. package/dist/{chunk-ZN6ROTYP.js → chunk-C7RPQWBG.js} +1 -1
  105. package/dist/{chunk-RAVD7QLY.js → chunk-CJYNZMOP.js} +8 -8
  106. package/dist/{chunk-PNNFCVW4.js → chunk-EGRQHLDM.js} +5 -5
  107. package/dist/{chunk-N6B6RKQQ.js → chunk-EICASBYP.js} +1 -1
  108. package/dist/{chunk-K56DTX7G.js → chunk-F3Y64VNF.js} +6 -6
  109. package/dist/{chunk-ORNEK65Y.js → chunk-FUS4OOGC.js} +1 -1
  110. package/dist/{chunk-2FPUPRCY.js → chunk-GAIOIINV.js} +594 -127
  111. package/dist/{chunk-YC4EYIER.js → chunk-IBTHD2UA.js} +132 -77
  112. package/dist/{chunk-RC5ZY3EV.js → chunk-IOW3MW2K.js} +2 -2
  113. package/dist/{chunk-B66LRB5M.js → chunk-L3Y7L4EG.js} +1 -1
  114. package/dist/{chunk-BK4DJIIY.js → chunk-MGPVA2EM.js} +27 -4
  115. package/dist/{chunk-NY7DTZ6K.js → chunk-Q5DKIL46.js} +3 -3
  116. package/dist/{chunk-Q3ZLVMQM.js → chunk-QTXW5TIS.js} +1 -1
  117. package/dist/{chunk-AMRC4FU2.js → chunk-SA57FVGX.js} +92 -55
  118. package/dist/{chunk-TY2ESLVL.js → chunk-SDDQPMZK.js} +1 -1
  119. package/dist/{chunk-7GY6WNEI.js → chunk-SDPHFDQS.js} +1 -1
  120. package/dist/{chunk-56A6OXVA.js → chunk-T7UZOJF4.js} +9 -9
  121. package/dist/{chunk-2BPPS6YQ.js → chunk-TCMVZ3B7.js} +457 -362
  122. package/dist/{chunk-TSVYBDDE.js → chunk-YZH4I4JO.js} +1 -1
  123. package/dist/{ci-workflow-EW37KVPS.js → ci-workflow-JFOL4YWW.js} +3 -3
  124. package/dist/{dist-NCNAXUFD.js → dist-BZS2XRLG.js} +5 -1
  125. package/dist/{dist-CJDGASPP.js → dist-CPKL5Y2R.js} +2 -2
  126. package/dist/{docs-4XI2FQW2.js → docs-FUTRJQHA.js} +4 -4
  127. package/dist/{engine-4L4CDTHU.js → engine-FB3HCNVT.js} +3 -3
  128. package/dist/{entropy-PBYSIQYS.js → entropy-FIEE4YDA.js} +3 -3
  129. package/dist/{feedback-OTIFW5MK.js → feedback-7EC4T6XG.js} +1 -1
  130. package/dist/{generate-agent-definitions-CZGUXIIN.js → generate-agent-definitions-FOSFADNR.js} +4 -4
  131. package/dist/{graph-loader-RDXSEBD7.js → graph-loader-QEI7SYOQ.js} +1 -1
  132. package/dist/hooks/adoption-tracker.js +36 -8
  133. package/dist/hooks/sentinel-pre.js +3 -2
  134. package/dist/hooks/telemetry-reporter.js +34 -15
  135. package/dist/index-builder-3AOQ3ZII.js +13 -0
  136. package/dist/index.d.ts +15 -0
  137. package/dist/index.js +29 -28
  138. package/dist/{loader-UZOXCWFC.js → loader-HXUOBTYA.js} +3 -3
  139. package/dist/{mcp-GWVVV6LH.js → mcp-ICXMTAD3.js} +17 -16
  140. package/dist/{performance-5UQPP3XX.js → performance-TYXBCTR7.js} +4 -4
  141. package/dist/{review-pipeline-65V4EO6O.js → review-pipeline-B4WPU6BQ.js} +3 -3
  142. package/dist/{runtime-PXX7HNB3.js → runtime-HQQNOARD.js} +3 -3
  143. package/dist/{scan-WM7XDUF7.js → scan-TX55R6QS.js} +1 -1
  144. package/dist/{security-CAYDRZIZ.js → security-25VFLIAO.js} +1 -1
  145. package/dist/templates/orchestrator/harness.orchestrator.md +18 -8
  146. package/dist/{validate-CWGXR7QM.js → validate-EAVGKZQB.js} +4 -4
  147. package/dist/{validate-cross-check-BKCNLZYG.js → validate-cross-check-SPL3H4O5.js} +3 -3
  148. package/package.json +13 -5
  149. package/dist/hooks/profiles.ts +0 -48
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-YC4EYIER.js";
3
+ } from "./chunk-IBTHD2UA.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  generateCIWorkflow
3
- } from "./chunk-ORNEK65Y.js";
4
- import "./chunk-YC4EYIER.js";
3
+ } from "./chunk-FUS4OOGC.js";
4
+ import "./chunk-IBTHD2UA.js";
5
5
  import "./chunk-RL4VMEXL.js";
6
- import "./chunk-2FPUPRCY.js";
6
+ import "./chunk-GAIOIINV.js";
7
7
  import "./chunk-KFQGP6VL.js";
8
8
  export {
9
9
  generateCIWorkflow
@@ -14,6 +14,7 @@ import {
14
14
  ContradictionDetector,
15
15
  CoverageScorer,
16
16
  D2Parser,
17
+ DecisionIngestor,
17
18
  DesignConstraintAdapter,
18
19
  DesignIngestor,
19
20
  DiagramParser,
@@ -38,6 +39,7 @@ import {
38
39
  ImageAnalysisExtractor,
39
40
  IntentClassifier,
40
41
  JiraConnector,
42
+ KnowledgeDocMaterializer,
41
43
  KnowledgeIngestor,
42
44
  KnowledgePipelineRunner,
43
45
  KnowledgeStagingAggregator,
@@ -71,7 +73,7 @@ import {
71
73
  project,
72
74
  queryTraceability,
73
75
  saveGraph
74
- } from "./chunk-2FPUPRCY.js";
76
+ } from "./chunk-GAIOIINV.js";
75
77
  import "./chunk-KFQGP6VL.js";
76
78
  init_dist();
77
79
  export {
@@ -90,6 +92,7 @@ export {
90
92
  ContradictionDetector,
91
93
  CoverageScorer,
92
94
  D2Parser,
95
+ DecisionIngestor,
93
96
  DesignConstraintAdapter,
94
97
  DesignIngestor,
95
98
  DiagramParser,
@@ -114,6 +117,7 @@ export {
114
117
  ImageAnalysisExtractor,
115
118
  IntentClassifier,
116
119
  JiraConnector,
120
+ KnowledgeDocMaterializer,
117
121
  KnowledgeIngestor,
118
122
  KnowledgePipelineRunner,
119
123
  KnowledgeStagingAggregator,
@@ -395,7 +395,7 @@ import {
395
395
  writeSessionSummary,
396
396
  writeTaint,
397
397
  xssRules
398
- } from "./chunk-YC4EYIER.js";
398
+ } from "./chunk-IBTHD2UA.js";
399
399
  import {
400
400
  DEFAULT_SKILL_CONTEXT_BUDGET,
401
401
  Err,
@@ -405,7 +405,7 @@ import {
405
405
  isErr,
406
406
  isOk
407
407
  } from "./chunk-RL4VMEXL.js";
408
- import "./chunk-2FPUPRCY.js";
408
+ import "./chunk-GAIOIINV.js";
409
409
  import "./chunk-KFQGP6VL.js";
410
410
  init_dist();
411
411
  export {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  checkDocsDefinition,
3
3
  handleCheckDocs
4
- } from "./chunk-56A6OXVA.js";
4
+ } from "./chunk-T7UZOJF4.js";
5
5
  import "./chunk-EPUKTTJZ.js";
6
6
  import "./chunk-W6Y7ZW3Y.js";
7
- import "./chunk-VKS3F46M.js";
8
- import "./chunk-YC4EYIER.js";
7
+ import "./chunk-A4ETL34H.js";
8
+ import "./chunk-IBTHD2UA.js";
9
9
  import "./chunk-RL4VMEXL.js";
10
- import "./chunk-2FPUPRCY.js";
10
+ import "./chunk-GAIOIINV.js";
11
11
  import "./chunk-3WGJMBKH.js";
12
12
  import "./chunk-KFQGP6VL.js";
13
13
  export {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  TemplateEngine
3
- } from "./chunk-B66LRB5M.js";
4
- import "./chunk-YC4EYIER.js";
3
+ } from "./chunk-L3Y7L4EG.js";
4
+ import "./chunk-IBTHD2UA.js";
5
5
  import "./chunk-RL4VMEXL.js";
6
- import "./chunk-2FPUPRCY.js";
6
+ import "./chunk-GAIOIINV.js";
7
7
  import "./chunk-KFQGP6VL.js";
8
8
  export {
9
9
  TemplateEngine
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  detectEntropyDefinition,
3
3
  handleDetectEntropy
4
- } from "./chunk-PNNFCVW4.js";
4
+ } from "./chunk-EGRQHLDM.js";
5
5
  import "./chunk-EPUKTTJZ.js";
6
6
  import "./chunk-W6Y7ZW3Y.js";
7
- import "./chunk-YC4EYIER.js";
7
+ import "./chunk-IBTHD2UA.js";
8
8
  import "./chunk-RL4VMEXL.js";
9
- import "./chunk-2FPUPRCY.js";
9
+ import "./chunk-GAIOIINV.js";
10
10
  import "./chunk-KFQGP6VL.js";
11
11
  export {
12
12
  detectEntropyDefinition,
@@ -5,7 +5,7 @@ import {
5
5
  handleCreateSelfReview,
6
6
  handleRequestPeerReview,
7
7
  requestPeerReviewDefinition
8
- } from "./chunk-WZ7UHPT3.js";
8
+ } from "./chunk-BZZNYHRY.js";
9
9
  import "./chunk-EPUKTTJZ.js";
10
10
  import "./chunk-W6Y7ZW3Y.js";
11
11
  import "./chunk-KFQGP6VL.js";
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  createGenerateAgentDefinitionsCommand,
3
3
  generateAgentDefinitions
4
- } from "./chunk-TY2ESLVL.js";
4
+ } from "./chunk-SDDQPMZK.js";
5
5
  import "./chunk-KET4QQZB.js";
6
- import "./chunk-JV4Y2U5F.js";
6
+ import "./chunk-BO4AJZRE.js";
7
7
  import "./chunk-3ISINLYT.js";
8
8
  import "./chunk-6B6UN6SG.js";
9
- import "./chunk-YC4EYIER.js";
9
+ import "./chunk-IBTHD2UA.js";
10
10
  import "./chunk-RL4VMEXL.js";
11
- import "./chunk-2FPUPRCY.js";
11
+ import "./chunk-GAIOIINV.js";
12
12
  import "./chunk-3WGJMBKH.js";
13
13
  import "./chunk-KFQGP6VL.js";
14
14
  export {
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  clearGraphStoreCache,
3
3
  loadGraphStore
4
- } from "./chunk-OLW7BJ5N.js";
4
+ } from "./chunk-776JFSPK.js";
5
5
  import "./chunk-KFQGP6VL.js";
6
6
  export {
7
7
  clearGraphStoreCache,
@@ -4,10 +4,12 @@
4
4
  // appends SkillInvocationRecord entries to .harness/metrics/adoption.jsonl.
5
5
  // Exit codes: 0 = allow (always, log-only hook)
6
6
 
7
- import { readFileSync, mkdirSync, appendFileSync, existsSync } from 'node:fs';
7
+ import { readFileSync, writeFileSync, mkdirSync, appendFileSync, existsSync } from 'node:fs';
8
8
  import { join } from 'node:path';
9
9
  import process from 'node:process';
10
10
 
11
+ const ADOPTION_CURSOR_FILE = '.adoption-cursor';
12
+
11
13
  /** Read and parse a JSON file, returning null on any error. */
12
14
  function readJsonSafe(filePath) {
13
15
  try {
@@ -25,17 +27,27 @@ function isAdoptionEnabled(cwd) {
25
27
  return true;
26
28
  }
27
29
 
28
- /** Parse events.jsonl into an array of event objects. Skips malformed lines. */
29
- function parseEventsFile(eventsPath) {
30
- let raw;
30
+ /** Read the cursor offset for events.jsonl processing. */
31
+ function readEventsCursor(cwd) {
31
32
  try {
32
- raw = readFileSync(eventsPath, 'utf-8');
33
+ const data = JSON.parse(readFileSync(join(cwd, '.harness', 'metrics', ADOPTION_CURSOR_FILE), 'utf-8'));
34
+ return typeof data.offset === 'number' ? data.offset : 0;
33
35
  } catch {
34
- return [];
36
+ return 0;
35
37
  }
38
+ }
36
39
 
40
+ /** Save the cursor offset after processing events. */
41
+ function writeEventsCursor(cwd, offset) {
42
+ const metricsDir = join(cwd, '.harness', 'metrics');
43
+ mkdirSync(metricsDir, { recursive: true });
44
+ writeFileSync(join(metricsDir, ADOPTION_CURSOR_FILE), JSON.stringify({ offset }) + '\n');
45
+ }
46
+
47
+ /** Parse events from a content string. Skips malformed lines. */
48
+ function parseEventsContent(content) {
37
49
  const events = [];
38
- const lines = raw.split('\n');
50
+ const lines = content.split('\n');
39
51
  for (const line of lines) {
40
52
  const trimmed = line.trim();
41
53
  if (!trimmed) continue;
@@ -135,11 +147,24 @@ function main() {
135
147
  process.exit(0);
136
148
  }
137
149
 
138
- const allEvents = parseEventsFile(eventsPath);
150
+ const fullContent = readFileSync(eventsPath, 'utf-8');
151
+ const cursor = readEventsCursor(cwd);
152
+ // If file shrank (was manually reset), reprocess from start
153
+ const effectiveCursor = cursor > fullContent.length ? 0 : cursor;
154
+ const newContent = fullContent.slice(effectiveCursor);
155
+
156
+ if (!newContent.trim()) {
157
+ process.stderr.write('[adoption-tracker] No new events since last run — skipping\n');
158
+ process.exit(0);
159
+ }
160
+
161
+ const allEvents = parseEventsContent(newContent);
139
162
  // Filter to relevant event types
140
163
  const relevantEvents = allEvents.filter((e) => RELEVANT_TYPES.has(e.type));
141
164
  if (relevantEvents.length === 0) {
142
165
  process.stderr.write('[adoption-tracker] No relevant skill events — skipping\n');
166
+ // Still advance cursor past non-relevant events
167
+ writeEventsCursor(cwd, fullContent.length);
143
168
  process.exit(0);
144
169
  }
145
170
 
@@ -176,6 +201,9 @@ function main() {
176
201
  written++;
177
202
  }
178
203
 
204
+ // Advance cursor past processed events
205
+ writeEventsCursor(cwd, fullContent.length);
206
+
179
207
  process.stderr.write(
180
208
  `[adoption-tracker] Wrote ${written} adoption record(s) for session ${sessionId}\n`
181
209
  );
@@ -75,8 +75,9 @@ function inlineScan(text) {
75
75
  if (/(?:auto[- ]?approve|--no-verify|--dangerously-skip-permissions)/i.test(line)) {
76
76
  findings.push({ severity: 'high', ruleId: 'INJ-PERM-003', match: line.trim(), line: i + 1 });
77
77
  }
78
- // HIGH: INJ-ENC-001 — Suspicious base64
79
- if (/(?<!Bearer\s)(?<![:])(?<![A-Za-z0-9/])(?!eyJ)(?:[A-Za-z0-9+/]{4}){7,}(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?(?![A-Za-z0-9/])/.test(line)) {
78
+ // HIGH: INJ-ENC-001 — Suspicious base64 (skip lines that look like file paths or CLI commands)
79
+ if (!/^[\s]*(?:cd |git |node |pnpm |npm |\/|packages\/|agents\/|src\/)/.test(line) &&
80
+ /(?<!Bearer\s)(?<![:])(?<![A-Za-z0-9/])(?!eyJ)(?:[A-Za-z0-9+/]{4}){7,}(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?(?![A-Za-z0-9/])/.test(line)) {
80
81
  findings.push({ severity: 'high', ruleId: 'INJ-ENC-001', match: line.trim(), line: i + 1 });
81
82
  }
82
83
  // MEDIUM: INJ-CTX-001 — System prompt claims
@@ -98,19 +98,43 @@ function getOrCreateInstallId(cwd) {
98
98
  return id;
99
99
  }
100
100
 
101
+ // --- Cursor ---
102
+
103
+ const TELEMETRY_CURSOR_FILE = '.telemetry-cursor';
104
+
105
+ function readCursor(cwd) {
106
+ try {
107
+ const data = JSON.parse(readFileSync(join(cwd, '.harness', 'metrics', TELEMETRY_CURSOR_FILE), 'utf-8'));
108
+ return typeof data.offset === 'number' ? data.offset : 0;
109
+ } catch {
110
+ return 0;
111
+ }
112
+ }
113
+
114
+ function writeCursor(cwd, offset) {
115
+ const metricsDir = join(cwd, '.harness', 'metrics');
116
+ mkdirSync(metricsDir, { recursive: true });
117
+ writeFileSync(join(metricsDir, TELEMETRY_CURSOR_FILE), JSON.stringify({ offset }) + '\n');
118
+ }
119
+
101
120
  // --- Collector ---
102
121
 
103
- function readAdoptionRecords(cwd) {
122
+ function readNewAdoptionRecords(cwd) {
104
123
  const adoptionFile = join(cwd, '.harness', 'metrics', 'adoption.jsonl');
105
124
  let raw;
106
125
  try {
107
126
  raw = readFileSync(adoptionFile, 'utf-8');
108
127
  } catch {
109
- return [];
128
+ return { records: [], newOffset: 0 };
110
129
  }
111
130
 
131
+ const cursor = readCursor(cwd);
132
+ // If file shrank (was manually reset), reprocess from start
133
+ const effectiveCursor = cursor > raw.length ? 0 : cursor;
134
+ const newContent = raw.slice(effectiveCursor);
135
+
112
136
  const records = [];
113
- for (const line of raw.split('\n')) {
137
+ for (const line of newContent.split('\n')) {
114
138
  const trimmed = line.trim();
115
139
  if (!trimmed) continue;
116
140
  try {
@@ -128,11 +152,10 @@ function readAdoptionRecords(cwd) {
128
152
  // Skip malformed lines
129
153
  }
130
154
  }
131
- return records;
155
+ return { records, newOffset: raw.length };
132
156
  }
133
157
 
134
- function collectEvents(cwd, consent) {
135
- const records = readAdoptionRecords(cwd);
158
+ function collectEvents(cwd, records, consent) {
136
159
  if (records.length === 0) return [];
137
160
 
138
161
  const { installId, identity } = consent;
@@ -242,21 +265,17 @@ async function main() {
242
265
  // Show first-run notice (before sending, so user sees it even if send fails)
243
266
  showFirstRunNotice(cwd);
244
267
 
245
- const events = collectEvents(cwd, consent);
268
+ const { records, newOffset } = readNewAdoptionRecords(cwd);
269
+ const events = collectEvents(cwd, records, consent);
246
270
  if (events.length === 0) {
247
- process.stderr.write('[telemetry-reporter] No adoption records to report\n');
271
+ process.stderr.write('[telemetry-reporter] No new adoption records to report\n');
248
272
  process.exit(0);
249
273
  }
250
274
 
251
275
  await sendEvents(events);
252
276
 
253
- // Truncate adoption.jsonl after successful send to prevent re-sending
254
- const adoptionFile = join(cwd, '.harness', 'metrics', 'adoption.jsonl');
255
- try {
256
- writeFileSync(adoptionFile, '', 'utf-8');
257
- } catch {
258
- // Non-fatal — records may be re-sent next session
259
- }
277
+ // Advance cursor past sent records (adoption.jsonl is preserved for CLI reads)
278
+ writeCursor(cwd, newOffset);
260
279
 
261
280
  process.stderr.write(`[telemetry-reporter] Sent ${events.length} telemetry event(s)\n`);
262
281
  process.exit(0);
@@ -0,0 +1,13 @@
1
+ import {
2
+ buildIndex,
3
+ computeSkillsDirHash,
4
+ loadOrRebuildIndex
5
+ } from "./chunk-27AJKSQY.js";
6
+ import "./chunk-6B6UN6SG.js";
7
+ import "./chunk-HIK6OEUF.js";
8
+ import "./chunk-KFQGP6VL.js";
9
+ export {
10
+ buildIndex,
11
+ computeSkillsDirHash,
12
+ loadOrRebuildIndex
13
+ };
package/dist/index.d.ts CHANGED
@@ -848,6 +848,15 @@ declare const HarnessConfigSchema: z.ZodObject<{
848
848
  }>>;
849
849
  /** How often (in ms) to check for CLI updates */
850
850
  updateCheckInterval: z.ZodOptional<z.ZodNumber>;
851
+ /** Graph ingest and connector settings */
852
+ graph: z.ZodOptional<z.ZodObject<{
853
+ /** Per-connector configuration (keyed by connector name: jira, slack, ci, confluence, figma, miro) */
854
+ connectors: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
855
+ }, "strip", z.ZodTypeAny, {
856
+ connectors: Record<string, Record<string, unknown>>;
857
+ }, {
858
+ connectors?: Record<string, Record<string, unknown>> | undefined;
859
+ }>>;
851
860
  }, "strip", z.ZodTypeAny, {
852
861
  version: 1;
853
862
  rootDir: string;
@@ -992,6 +1001,9 @@ declare const HarnessConfigSchema: z.ZodObject<{
992
1001
  enabled: boolean;
993
1002
  } | undefined;
994
1003
  updateCheckInterval?: number | undefined;
1004
+ graph?: {
1005
+ connectors: Record<string, Record<string, unknown>>;
1006
+ } | undefined;
995
1007
  }, {
996
1008
  version: 1;
997
1009
  name?: string | undefined;
@@ -1136,6 +1148,9 @@ declare const HarnessConfigSchema: z.ZodObject<{
1136
1148
  enabled?: boolean | undefined;
1137
1149
  } | undefined;
1138
1150
  updateCheckInterval?: number | undefined;
1151
+ graph?: {
1152
+ connectors?: Record<string, Record<string, unknown>> | undefined;
1153
+ } | undefined;
1139
1154
  }>;
1140
1155
  /**
1141
1156
  * Type representing the full Harness configuration.
package/dist/index.js CHANGED
@@ -12,23 +12,23 @@ import {
12
12
  runSnapshotCapture,
13
13
  runUninstall,
14
14
  runUninstallConstraints
15
- } from "./chunk-AMRC4FU2.js";
15
+ } from "./chunk-SA57FVGX.js";
16
+ import {
17
+ generateRuntime
18
+ } from "./chunk-EICASBYP.js";
16
19
  import {
17
20
  generateAgentsMd
18
- } from "./chunk-ZN6ROTYP.js";
21
+ } from "./chunk-C7RPQWBG.js";
19
22
  import {
20
23
  generateCIWorkflow
21
- } from "./chunk-ORNEK65Y.js";
24
+ } from "./chunk-FUS4OOGC.js";
22
25
  import {
23
26
  runCrossCheck
24
- } from "./chunk-7GY6WNEI.js";
27
+ } from "./chunk-SDPHFDQS.js";
25
28
  import {
26
29
  TemplateEngine
27
- } from "./chunk-B66LRB5M.js";
30
+ } from "./chunk-L3Y7L4EG.js";
28
31
  import "./chunk-CQ553GZO.js";
29
- import {
30
- generateRuntime
31
- } from "./chunk-N6B6RKQQ.js";
32
32
  import {
33
33
  detectTrigger,
34
34
  runPersona
@@ -43,7 +43,7 @@ import {
43
43
  OutputFormatter,
44
44
  OutputMode,
45
45
  runCheckPhaseGate
46
- } from "./chunk-FUND5WJR.js";
46
+ } from "./chunk-3XMOWLK3.js";
47
47
  import {
48
48
  AGENT_DESCRIPTIONS,
49
49
  DEFAULT_TOOLS,
@@ -52,46 +52,47 @@ import {
52
52
  generateAgentDefinitions,
53
53
  renderClaudeCodeAgent,
54
54
  renderGeminiAgent
55
- } from "./chunk-TY2ESLVL.js";
55
+ } from "./chunk-SDDQPMZK.js";
56
56
  import "./chunk-KET4QQZB.js";
57
57
  import {
58
58
  listPersonas,
59
59
  loadPersona
60
- } from "./chunk-JV4Y2U5F.js";
60
+ } from "./chunk-BO4AJZRE.js";
61
61
  import {
62
62
  runScan
63
- } from "./chunk-Q3ZLVMQM.js";
63
+ } from "./chunk-QTXW5TIS.js";
64
64
  import {
65
65
  createHarnessServer,
66
66
  generateSlashCommands,
67
67
  getToolDefinitions,
68
68
  startServer
69
- } from "./chunk-2BPPS6YQ.js";
70
- import "./chunk-K56DTX7G.js";
71
- import "./chunk-RC5ZY3EV.js";
72
- import "./chunk-WZ7UHPT3.js";
73
- import "./chunk-3AMQYWGT.js";
74
- import "./chunk-DBIX3X4H.js";
75
- import "./chunk-NY7DTZ6K.js";
76
- import "./chunk-BK4DJIIY.js";
77
- import "./chunk-TSVYBDDE.js";
78
- import "./chunk-56A6OXVA.js";
79
- import "./chunk-PNNFCVW4.js";
80
- import "./chunk-RAVD7QLY.js";
69
+ } from "./chunk-TCMVZ3B7.js";
70
+ import "./chunk-2FOLD76X.js";
71
+ import "./chunk-F3Y64VNF.js";
72
+ import "./chunk-IOW3MW2K.js";
73
+ import "./chunk-BZZNYHRY.js";
74
+ import "./chunk-3AJW7VQ3.js";
75
+ import "./chunk-776JFSPK.js";
76
+ import "./chunk-Q5DKIL46.js";
77
+ import "./chunk-MGPVA2EM.js";
78
+ import "./chunk-YZH4I4JO.js";
79
+ import "./chunk-T7UZOJF4.js";
80
+ import "./chunk-EGRQHLDM.js";
81
+ import "./chunk-CJYNZMOP.js";
81
82
  import "./chunk-EPUKTTJZ.js";
82
83
  import "./chunk-W6Y7ZW3Y.js";
84
+ import "./chunk-27AJKSQY.js";
83
85
  import {
84
86
  findConfigFile,
85
87
  loadConfig,
86
88
  resolveConfig
87
- } from "./chunk-VKS3F46M.js";
89
+ } from "./chunk-A4ETL34H.js";
88
90
  import "./chunk-3ISINLYT.js";
89
91
  import "./chunk-6B6UN6SG.js";
90
- import "./chunk-OLW7BJ5N.js";
91
92
  import "./chunk-BM3PWGXQ.js";
92
- import "./chunk-YC4EYIER.js";
93
+ import "./chunk-IBTHD2UA.js";
93
94
  import "./chunk-RL4VMEXL.js";
94
- import "./chunk-2FPUPRCY.js";
95
+ import "./chunk-GAIOIINV.js";
95
96
  import {
96
97
  generateSkillFiles
97
98
  } from "./chunk-ZP5E7YET.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  listPersonas,
3
3
  loadPersona
4
- } from "./chunk-JV4Y2U5F.js";
5
- import "./chunk-YC4EYIER.js";
4
+ } from "./chunk-BO4AJZRE.js";
5
+ import "./chunk-IBTHD2UA.js";
6
6
  import "./chunk-RL4VMEXL.js";
7
- import "./chunk-2FPUPRCY.js";
7
+ import "./chunk-GAIOIINV.js";
8
8
  import "./chunk-KFQGP6VL.js";
9
9
  export {
10
10
  listPersonas,
@@ -2,31 +2,32 @@ import {
2
2
  createHarnessServer,
3
3
  getToolDefinitions,
4
4
  startServer
5
- } from "./chunk-2BPPS6YQ.js";
6
- import "./chunk-K56DTX7G.js";
7
- import "./chunk-RC5ZY3EV.js";
8
- import "./chunk-WZ7UHPT3.js";
9
- import "./chunk-3AMQYWGT.js";
10
- import "./chunk-DBIX3X4H.js";
11
- import "./chunk-NY7DTZ6K.js";
12
- import "./chunk-BK4DJIIY.js";
5
+ } from "./chunk-TCMVZ3B7.js";
6
+ import "./chunk-2FOLD76X.js";
7
+ import "./chunk-F3Y64VNF.js";
8
+ import "./chunk-IOW3MW2K.js";
9
+ import "./chunk-BZZNYHRY.js";
10
+ import "./chunk-3AJW7VQ3.js";
11
+ import "./chunk-776JFSPK.js";
12
+ import "./chunk-Q5DKIL46.js";
13
+ import "./chunk-MGPVA2EM.js";
13
14
  import {
14
15
  resolveProjectConfig
15
- } from "./chunk-TSVYBDDE.js";
16
- import "./chunk-56A6OXVA.js";
17
- import "./chunk-PNNFCVW4.js";
18
- import "./chunk-RAVD7QLY.js";
16
+ } from "./chunk-YZH4I4JO.js";
17
+ import "./chunk-T7UZOJF4.js";
18
+ import "./chunk-EGRQHLDM.js";
19
+ import "./chunk-CJYNZMOP.js";
19
20
  import {
20
21
  resultToMcpResponse
21
22
  } from "./chunk-EPUKTTJZ.js";
22
23
  import "./chunk-W6Y7ZW3Y.js";
23
- import "./chunk-VKS3F46M.js";
24
+ import "./chunk-27AJKSQY.js";
25
+ import "./chunk-A4ETL34H.js";
24
26
  import "./chunk-3ISINLYT.js";
25
27
  import "./chunk-6B6UN6SG.js";
26
- import "./chunk-OLW7BJ5N.js";
27
- import "./chunk-YC4EYIER.js";
28
+ import "./chunk-IBTHD2UA.js";
28
29
  import "./chunk-RL4VMEXL.js";
29
- import "./chunk-2FPUPRCY.js";
30
+ import "./chunk-GAIOIINV.js";
30
31
  import "./chunk-HIK6OEUF.js";
31
32
  import "./chunk-EBJQ6N4M.js";
32
33
  import "./chunk-3WGJMBKH.js";
@@ -7,13 +7,13 @@ import {
7
7
  handleGetPerfBaselines,
8
8
  handleUpdatePerfBaselines,
9
9
  updatePerfBaselinesDefinition
10
- } from "./chunk-RAVD7QLY.js";
10
+ } from "./chunk-CJYNZMOP.js";
11
11
  import "./chunk-EPUKTTJZ.js";
12
12
  import "./chunk-W6Y7ZW3Y.js";
13
- import "./chunk-VKS3F46M.js";
14
- import "./chunk-YC4EYIER.js";
13
+ import "./chunk-A4ETL34H.js";
14
+ import "./chunk-IBTHD2UA.js";
15
15
  import "./chunk-RL4VMEXL.js";
16
- import "./chunk-2FPUPRCY.js";
16
+ import "./chunk-GAIOIINV.js";
17
17
  import "./chunk-3WGJMBKH.js";
18
18
  import "./chunk-KFQGP6VL.js";
19
19
  export {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  handleRunCodeReview,
3
3
  runCodeReviewDefinition
4
- } from "./chunk-DBIX3X4H.js";
4
+ } from "./chunk-2FOLD76X.js";
5
5
  import "./chunk-W6Y7ZW3Y.js";
6
- import "./chunk-YC4EYIER.js";
6
+ import "./chunk-IBTHD2UA.js";
7
7
  import "./chunk-RL4VMEXL.js";
8
- import "./chunk-2FPUPRCY.js";
8
+ import "./chunk-GAIOIINV.js";
9
9
  import "./chunk-KFQGP6VL.js";
10
10
  export {
11
11
  handleRunCodeReview,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  generateRuntime
3
- } from "./chunk-N6B6RKQQ.js";
3
+ } from "./chunk-EICASBYP.js";
4
4
  import "./chunk-KET4QQZB.js";
5
- import "./chunk-YC4EYIER.js";
5
+ import "./chunk-IBTHD2UA.js";
6
6
  import "./chunk-RL4VMEXL.js";
7
- import "./chunk-2FPUPRCY.js";
7
+ import "./chunk-GAIOIINV.js";
8
8
  import "./chunk-KFQGP6VL.js";
9
9
  export {
10
10
  generateRuntime
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createScanCommand,
3
3
  runScan
4
- } from "./chunk-Q3ZLVMQM.js";
4
+ } from "./chunk-QTXW5TIS.js";
5
5
  import "./chunk-KFQGP6VL.js";
6
6
  export {
7
7
  createScanCommand,
@@ -3,7 +3,7 @@ import {
3
3
  handleGetSecurityTrends,
4
4
  handleRunSecurityScan,
5
5
  runSecurityScanDefinition
6
- } from "./chunk-3AMQYWGT.js";
6
+ } from "./chunk-3AJW7VQ3.js";
7
7
  import "./chunk-W6Y7ZW3Y.js";
8
8
  import "./chunk-KFQGP6VL.js";
9
9
  export {