@harness-engineering/cli 2.1.0 → 2.2.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 (50) hide show
  1. package/dist/agents/skills/claude-code/initialize-harness-project/SKILL.md +168 -13
  2. package/dist/agents/skills/codex/initialize-harness-project/SKILL.md +168 -13
  3. package/dist/agents/skills/cursor/initialize-harness-project/SKILL.md +168 -13
  4. package/dist/agents/skills/gemini-cli/initialize-harness-project/SKILL.md +168 -13
  5. package/dist/{agents-md-XCAWON2D.js → agents-md-L4X4MOWT.js} +2 -2
  6. package/dist/{architecture-KERHEEQZ.js → architecture-WJRIYQ45.js} +3 -3
  7. package/dist/{assess-project-NPYA3UVI.js → assess-project-PHC2HO3V.js} +1 -1
  8. package/dist/bin/harness-mcp.js +13 -13
  9. package/dist/bin/harness.js +22 -22
  10. package/dist/{check-phase-gate-GE5ALEEU.js → check-phase-gate-646KY67H.js} +3 -3
  11. package/dist/{chunk-IIX5OJES.js → chunk-224XKVLP.js} +1 -1
  12. package/dist/{chunk-UWIOBHZL.js → chunk-2QPHCR22.js} +5 -5
  13. package/dist/{chunk-URLDPALI.js → chunk-2ZURBWEV.js} +3 -3
  14. package/dist/{chunk-EFA4OEEN.js → chunk-36X7TRUI.js} +2 -2
  15. package/dist/{chunk-HBQ3BK2E.js → chunk-4HKVZO7R.js} +1 -1
  16. package/dist/{chunk-OXFFN3FD.js → chunk-CPYL6LJR.js} +1 -1
  17. package/dist/{chunk-WW6AUOA3.js → chunk-E7W3YOXL.js} +2 -2
  18. package/dist/{chunk-FQAJAM54.js → chunk-GOOTYTTV.js} +71 -29
  19. package/dist/{chunk-D5FE4L2O.js → chunk-JPWICLXQ.js} +1 -1
  20. package/dist/{chunk-MAFI6UWT.js → chunk-K4WRQTEF.js} +137 -39
  21. package/dist/{chunk-M4C3ZIGL.js → chunk-KV7A5OZT.js} +3 -3
  22. package/dist/{chunk-T7MNLCUD.js → chunk-L2IDE7WS.js} +122 -76
  23. package/dist/{chunk-4FVHBBPY.js → chunk-LO7ZLV7S.js} +1 -1
  24. package/dist/{chunk-GCYGGQFM.js → chunk-OJMO4JBQ.js} +61 -6
  25. package/dist/{chunk-PCX4GPNT.js → chunk-QTUPHTTK.js} +1 -1
  26. package/dist/{chunk-AEFZJ543.js → chunk-TNZYQTEE.js} +1 -1
  27. package/dist/{chunk-DRD7LLFC.js → chunk-VJQLUS5I.js} +1 -1
  28. package/dist/{chunk-LY2TY6NE.js → chunk-VKDBM3RX.js} +3 -3
  29. package/dist/{chunk-FBQYKH7R.js → chunk-W4AFGFFB.js} +2 -2
  30. package/dist/{chunk-YBGVZQQE.js → chunk-YLOAQZLA.js} +2 -2
  31. package/dist/{chunk-GHPWBWUW.js → chunk-YLTRFZAT.js} +6 -6
  32. package/dist/{chunk-RCHXBL2M.js → chunk-YWD6WXXM.js} +6 -6
  33. package/dist/{ci-workflow-A2E2RTOP.js → ci-workflow-TOS5X527.js} +2 -2
  34. package/dist/{dist-K22DQUYY.js → dist-6RT2AVYU.js} +1 -1
  35. package/dist/{docs-GXJOFVCF.js → docs-HOJMQYDZ.js} +3 -3
  36. package/dist/{engine-JBUIA2XO.js → engine-D6UYH6DB.js} +2 -2
  37. package/dist/{entropy-Y7LUT4BZ.js → entropy-LZ4IDGZR.js} +2 -2
  38. package/dist/{feedback-BHOBVKI3.js → feedback-WV7EQVK7.js} +1 -1
  39. package/dist/{generate-agent-definitions-VL3ZVR32.js → generate-agent-definitions-GFNXJCBY.js} +3 -3
  40. package/dist/index.d.ts +17 -8
  41. package/dist/index.js +22 -22
  42. package/dist/{loader-WCKVMDYR.js → loader-Z23JTXIZ.js} +2 -2
  43. package/dist/{mcp-FA2CKHFY.js → mcp-JDJGELGD.js} +13 -13
  44. package/dist/{performance-NISUL5AA.js → performance-7ATLHTQU.js} +3 -3
  45. package/dist/{review-pipeline-CHE5LJ5D.js → review-pipeline-COBGGXHJ.js} +2 -2
  46. package/dist/{runtime-3SKKEVPF.js → runtime-KCBNQUXK.js} +2 -2
  47. package/dist/{security-MF54MY3P.js → security-MAPRIFQT.js} +1 -1
  48. package/dist/{validate-SIWFNTXI.js → validate-74XTQR7Q.js} +3 -3
  49. package/dist/{validate-cross-check-GBX7B7CQ.js → validate-cross-check-MI5MZ7MB.js} +2 -2
  50. package/package.json +4 -4
@@ -3,43 +3,43 @@ import {
3
3
  createProgram,
4
4
  installCommandTelemetry,
5
5
  printFirstRunWelcome
6
- } from "../chunk-FQAJAM54.js";
7
- import "../chunk-AEFZJ543.js";
8
- import "../chunk-HBQ3BK2E.js";
9
- import "../chunk-D5FE4L2O.js";
10
- import "../chunk-PCX4GPNT.js";
11
- import "../chunk-IIX5OJES.js";
6
+ } from "../chunk-GOOTYTTV.js";
7
+ import "../chunk-TNZYQTEE.js";
8
+ import "../chunk-4HKVZO7R.js";
9
+ import "../chunk-JPWICLXQ.js";
10
+ import "../chunk-QTUPHTTK.js";
11
+ import "../chunk-224XKVLP.js";
12
12
  import "../chunk-CQ553GZO.js";
13
13
  import "../chunk-GISMXMVL.js";
14
14
  import "../chunk-WWACIIBA.js";
15
15
  import "../chunk-TEFCFC4H.js";
16
- import "../chunk-WW6AUOA3.js";
17
- import "../chunk-GCYGGQFM.js";
16
+ import "../chunk-E7W3YOXL.js";
17
+ import "../chunk-OJMO4JBQ.js";
18
18
  import "../chunk-KET4QQZB.js";
19
- import "../chunk-DRD7LLFC.js";
19
+ import "../chunk-VJQLUS5I.js";
20
20
  import "../chunk-YG4ZBGEH.js";
21
21
  import {
22
22
  dispatchSkillsFromGit
23
- } from "../chunk-T7MNLCUD.js";
24
- import "../chunk-EFA4OEEN.js";
25
- import "../chunk-RCHXBL2M.js";
23
+ } from "../chunk-L2IDE7WS.js";
24
+ import "../chunk-36X7TRUI.js";
25
+ import "../chunk-YWD6WXXM.js";
26
26
  import "../chunk-IOW3MW2K.js";
27
- import "../chunk-URLDPALI.js";
28
- import "../chunk-FBQYKH7R.js";
27
+ import "../chunk-2ZURBWEV.js";
28
+ import "../chunk-W4AFGFFB.js";
29
29
  import "../chunk-KTWKW6KJ.js";
30
- import "../chunk-LY2TY6NE.js";
31
- import "../chunk-YBGVZQQE.js";
32
- import "../chunk-OXFFN3FD.js";
33
- import "../chunk-UWIOBHZL.js";
34
- import "../chunk-M4C3ZIGL.js";
35
- import "../chunk-GHPWBWUW.js";
30
+ import "../chunk-VKDBM3RX.js";
31
+ import "../chunk-YLOAQZLA.js";
32
+ import "../chunk-CPYL6LJR.js";
33
+ import "../chunk-2QPHCR22.js";
34
+ import "../chunk-KV7A5OZT.js";
35
+ import "../chunk-YLTRFZAT.js";
36
36
  import "../chunk-EPUKTTJZ.js";
37
37
  import "../chunk-W6Y7ZW3Y.js";
38
38
  import "../chunk-27AJKSQY.js";
39
39
  import {
40
40
  findConfigFile,
41
41
  loadConfig
42
- } from "../chunk-4FVHBBPY.js";
42
+ } from "../chunk-LO7ZLV7S.js";
43
43
  import "../chunk-3ISINLYT.js";
44
44
  import "../chunk-6B6UN6SG.js";
45
45
  import "../chunk-ZCZD7FHU.js";
@@ -53,7 +53,7 @@ import {
53
53
  readCheckState,
54
54
  shouldRunCheck,
55
55
  spawnBackgroundCheck
56
- } from "../chunk-MAFI6UWT.js";
56
+ } from "../chunk-K4WRQTEF.js";
57
57
  import "../chunk-RL4VMEXL.js";
58
58
  import "../chunk-BMM3GXV6.js";
59
59
  import "../chunk-ZP5E7YET.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  createCheckPhaseGateCommand,
3
3
  runCheckPhaseGate
4
- } from "./chunk-WW6AUOA3.js";
5
- import "./chunk-4FVHBBPY.js";
4
+ } from "./chunk-E7W3YOXL.js";
5
+ import "./chunk-LO7ZLV7S.js";
6
6
  import "./chunk-ZCZD7FHU.js";
7
- import "./chunk-MAFI6UWT.js";
7
+ import "./chunk-K4WRQTEF.js";
8
8
  import "./chunk-RL4VMEXL.js";
9
9
  import "./chunk-BMM3GXV6.js";
10
10
  import "./chunk-EBJQ6N4M.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MAFI6UWT.js";
3
+ } from "./chunk-K4WRQTEF.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  findConfigFile,
9
9
  loadConfig
10
- } from "./chunk-4FVHBBPY.js";
10
+ } from "./chunk-LO7ZLV7S.js";
11
11
  import {
12
12
  init_dist
13
- } from "./chunk-MAFI6UWT.js";
13
+ } from "./chunk-K4WRQTEF.js";
14
14
  import {
15
15
  Ok
16
16
  } from "./chunk-RL4VMEXL.js";
@@ -50,12 +50,12 @@ async function handleCheckDocs(input) {
50
50
  const projectPath = sanitizePath(input.path);
51
51
  const scope = input.scope ?? "coverage";
52
52
  if (scope === "integrity") {
53
- const { validateKnowledgeMap } = await import("./dist-K22DQUYY.js");
53
+ const { validateKnowledgeMap } = await import("./dist-6RT2AVYU.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-K22DQUYY.js");
58
+ const { checkDocCoverage: checkDocCoverage2, validateKnowledgeMap } = await import("./dist-6RT2AVYU.js");
59
59
  const domain2 = input.domain ?? "src";
60
60
  const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-5MKHAJJF.js");
61
61
  const store2 = await loadGraphStore2(projectPath);
@@ -94,7 +94,7 @@ async function handleCheckDocs(input) {
94
94
  }
95
95
  return resultToMcpResponse(Ok({ coverage, integrity }));
96
96
  }
97
- const { checkDocCoverage } = await import("./dist-K22DQUYY.js");
97
+ const { checkDocCoverage } = await import("./dist-6RT2AVYU.js");
98
98
  const domain = input.domain ?? "src";
99
99
  const { loadGraphStore } = await import("./graph-loader-5MKHAJJF.js");
100
100
  const store = await loadGraphStore(projectPath);
@@ -33,7 +33,7 @@ var createSelfReviewDefinition = {
33
33
  };
34
34
  async function handleCreateSelfReview(input) {
35
35
  try {
36
- const { parseDiff, createSelfReview } = await import("./dist-K22DQUYY.js");
36
+ const { parseDiff, createSelfReview } = await import("./dist-6RT2AVYU.js");
37
37
  const parseResult = parseDiff(input.diff);
38
38
  if (!parseResult.ok) {
39
39
  return resultToMcpResponse(parseResult);
@@ -119,7 +119,7 @@ var analyzeDiffDefinition = {
119
119
  };
120
120
  async function handleAnalyzeDiff(input) {
121
121
  try {
122
- const { parseDiff, analyzeDiff } = await import("./dist-K22DQUYY.js");
122
+ const { parseDiff, analyzeDiff } = await import("./dist-6RT2AVYU.js");
123
123
  const parseResult = parseDiff(input.diff);
124
124
  if (!parseResult.ok) {
125
125
  return resultToMcpResponse(parseResult);
@@ -195,7 +195,7 @@ var requestPeerReviewDefinition = {
195
195
  };
196
196
  async function handleRequestPeerReview(input) {
197
197
  try {
198
- const { parseDiff, requestPeerReview } = await import("./dist-K22DQUYY.js");
198
+ const { parseDiff, requestPeerReview } = await import("./dist-6RT2AVYU.js");
199
199
  const parseResult = parseDiff(input.diff);
200
200
  if (!parseResult.ok) {
201
201
  return resultToMcpResponse(parseResult);
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  init_dist,
6
6
  paginate
7
- } from "./chunk-MAFI6UWT.js";
7
+ } from "./chunk-K4WRQTEF.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-K22DQUYY.js");
82
+ const { parseDiff, runReviewPipeline } = await import("./dist-6RT2AVYU.js");
83
83
  const parseResult = parseDiff(input.diff);
84
84
  if (!parseResult.ok) {
85
85
  return {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MAFI6UWT.js";
3
+ } from "./chunk-K4WRQTEF.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MAFI6UWT.js";
3
+ } from "./chunk-K4WRQTEF.js";
4
4
  import {
5
5
  Err,
6
6
  Ok
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  resolveConfig
3
- } from "./chunk-4FVHBBPY.js";
3
+ } from "./chunk-LO7ZLV7S.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-MAFI6UWT.js";
6
+ } from "./chunk-K4WRQTEF.js";
7
7
  import {
8
8
  Ok
9
9
  } from "./chunk-RL4VMEXL.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  generateRuntime
3
- } from "./chunk-AEFZJ543.js";
3
+ } from "./chunk-TNZYQTEE.js";
4
4
  import {
5
5
  generateAgentsMd
6
- } from "./chunk-HBQ3BK2E.js";
6
+ } from "./chunk-4HKVZO7R.js";
7
7
  import {
8
8
  generateCIWorkflow
9
- } from "./chunk-D5FE4L2O.js";
9
+ } from "./chunk-JPWICLXQ.js";
10
10
  import {
11
11
  TemplateEngine
12
- } from "./chunk-IIX5OJES.js";
12
+ } from "./chunk-224XKVLP.js";
13
13
  import {
14
14
  generate,
15
15
  validate
@@ -28,18 +28,18 @@ import {
28
28
  OutputMode,
29
29
  createCheckPhaseGateCommand,
30
30
  findFiles
31
- } from "./chunk-WW6AUOA3.js";
31
+ } from "./chunk-E7W3YOXL.js";
32
32
  import {
33
33
  createGenerateAgentDefinitionsCommand,
34
34
  generateAgentDefinitions
35
- } from "./chunk-GCYGGQFM.js";
35
+ } from "./chunk-OJMO4JBQ.js";
36
36
  import {
37
37
  toKebabCase
38
38
  } from "./chunk-KET4QQZB.js";
39
39
  import {
40
40
  listPersonas,
41
41
  loadPersona
42
- } from "./chunk-DRD7LLFC.js";
42
+ } from "./chunk-VJQLUS5I.js";
43
43
  import {
44
44
  createScanCommand,
45
45
  loadIngestOptions
@@ -57,7 +57,7 @@ import {
57
57
  loadCachedSnapshot,
58
58
  persistToolingConfig,
59
59
  recommend
60
- } from "./chunk-T7MNLCUD.js";
60
+ } from "./chunk-L2IDE7WS.js";
61
61
  import {
62
62
  loadGraphStore
63
63
  } from "./chunk-KTWKW6KJ.js";
@@ -67,7 +67,7 @@ import {
67
67
  import {
68
68
  findConfigFile,
69
69
  resolveConfig
70
- } from "./chunk-4FVHBBPY.js";
70
+ } from "./chunk-LO7ZLV7S.js";
71
71
  import {
72
72
  VALID_PLATFORMS
73
73
  } from "./chunk-3ISINLYT.js";
@@ -164,7 +164,7 @@ import {
164
164
  validateSolutionsDir,
165
165
  writeConfig,
166
166
  writeLockfile
167
- } from "./chunk-MAFI6UWT.js";
167
+ } from "./chunk-K4WRQTEF.js";
168
168
  import {
169
169
  Err,
170
170
  Ok
@@ -378,7 +378,7 @@ function registerSkillsCommand(adoption) {
378
378
  const globalOpts = cmd.optsWithGlobals();
379
379
  const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
380
380
  const cwd = process.cwd();
381
- const { readAdoptionRecords, aggregateBySkill } = await import("./dist-K22DQUYY.js");
381
+ const { readAdoptionRecords, aggregateBySkill } = await import("./dist-6RT2AVYU.js");
382
382
  const records = readAdoptionRecords(cwd);
383
383
  if (records.length === 0) {
384
384
  if (globalOpts.json) {
@@ -414,7 +414,7 @@ function registerRecentCommand(adoption) {
414
414
  const globalOpts = cmd.optsWithGlobals();
415
415
  const limit = Math.max(parseInt(opts.limit, 10) || 20, 1);
416
416
  const cwd = process.cwd();
417
- const { readAdoptionRecords } = await import("./dist-K22DQUYY.js");
417
+ const { readAdoptionRecords } = await import("./dist-6RT2AVYU.js");
418
418
  const records = readAdoptionRecords(cwd);
419
419
  if (records.length === 0) {
420
420
  if (globalOpts.json) {
@@ -492,7 +492,7 @@ function registerSkillCommand(adoption) {
492
492
  adoption.command("skill <name>").description("Show detail for a specific skill").action(async (name, _opts, cmd) => {
493
493
  const globalOpts = cmd.optsWithGlobals();
494
494
  const cwd = process.cwd();
495
- const { readAdoptionRecords, aggregateBySkill } = await import("./dist-K22DQUYY.js");
495
+ const { readAdoptionRecords, aggregateBySkill } = await import("./dist-6RT2AVYU.js");
496
496
  const records = readAdoptionRecords(cwd);
497
497
  const skillRecords = records.filter((r) => r.skill === name);
498
498
  if (skillRecords.length === 0) {
@@ -968,8 +968,7 @@ async function runCheckArch(options) {
968
968
  const manager = new ArchBaselineManager(cwd, archConfig.baselinePath);
969
969
  if (options.updateBaseline) {
970
970
  const commitHash = getCommitHash(cwd);
971
- const baseline2 = manager.capture(results, commitHash);
972
- manager.save(baseline2);
971
+ manager.update(results, commitHash);
973
972
  return Ok({
974
973
  passed: true,
975
974
  mode: "baseline",
@@ -2411,6 +2410,22 @@ function writeMcpEntry(filePath, name, entry) {
2411
2410
  config.mcpServers[name] = entry;
2412
2411
  writeJson(filePath, config);
2413
2412
  }
2413
+ function readOpencodeConfig(filePath) {
2414
+ const config = readJsonSafe(filePath);
2415
+ if (!config) return { mcp: {} };
2416
+ if (!config.mcp) config.mcp = {};
2417
+ return config;
2418
+ }
2419
+ function writeOpencodeMcpEntry(filePath, name, entry) {
2420
+ const config = readOpencodeConfig(filePath);
2421
+ config.mcp[name] = {
2422
+ type: "local",
2423
+ command: [entry.command, ...entry.args ?? []],
2424
+ enabled: true,
2425
+ ...entry.env ? { environment: entry.env } : {}
2426
+ };
2427
+ writeJson(filePath, config);
2428
+ }
2414
2429
  function removeMcpEntry(filePath, name) {
2415
2430
  if (!fs6.existsSync(filePath)) return;
2416
2431
  const config = readMcpConfig(filePath);
@@ -4107,6 +4122,16 @@ function setupMcp(cwd, client) {
4107
4122
  configured.push("Cursor");
4108
4123
  }
4109
4124
  }
4125
+ if (client === "all" || client === "opencode") {
4126
+ const configPath = path26.join(cwd, "opencode.json");
4127
+ const existing = readJsonFile(configPath);
4128
+ if (existing?.mcp?.["harness"]) {
4129
+ skipped.push("OpenCode");
4130
+ } else {
4131
+ writeOpencodeMcpEntry(configPath, "harness", { command: "harness", args: ["mcp"] });
4132
+ configured.push("OpenCode");
4133
+ }
4134
+ }
4110
4135
  return { configured, skipped, trustedFolder };
4111
4136
  }
4112
4137
  async function resolveCursorWithPicker(cwd, pick) {
@@ -4156,7 +4181,11 @@ function printMcpResult(configured, skipped, trustedFolder) {
4156
4181
  console.log("");
4157
4182
  }
4158
4183
  function createSetupMcpCommand() {
4159
- return new Command34("setup-mcp").description("Configure MCP server for AI agent integration").option("--client <client>", "Client to configure (claude, gemini, codex, cursor, all)", "all").option("--pick", "Launch interactive tool picker (Cursor only)").option("--yes", "Bypass interactive picker and use curated 25-tool set (Cursor only)").action(async (opts, cmd) => {
4184
+ return new Command34("setup-mcp").description("Configure MCP server for AI agent integration").option(
4185
+ "--client <client>",
4186
+ "Client to configure (claude, gemini, codex, cursor, opencode, all)",
4187
+ "all"
4188
+ ).option("--pick", "Launch interactive tool picker (Cursor only)").option("--yes", "Bypass interactive picker and use curated 25-tool set (Cursor only)").action(async (opts, cmd) => {
4160
4189
  const globalOpts = cmd.optsWithGlobals();
4161
4190
  const cwd = process.cwd();
4162
4191
  let configured;
@@ -5776,7 +5805,7 @@ function createMcpCommand() {
5776
5805
  parseBudget
5777
5806
  ).action(async (opts) => {
5778
5807
  const [{ startServer: startServer2, getToolDefinitions: getToolDefinitions2 }, { selectTier }] = await Promise.all([
5779
- import("./mcp-FA2CKHFY.js"),
5808
+ import("./mcp-JDJGELGD.js"),
5780
5809
  import("./tool-tiers-7QGZ3FKY.js")
5781
5810
  ]);
5782
5811
  if (opts.tools && opts.tools.length > 0) {
@@ -6267,7 +6296,7 @@ function registerBenchCommand(perf) {
6267
6296
  perf.command("bench [glob]").description("Run benchmarks via vitest bench").action(async (glob2, _opts, cmd) => {
6268
6297
  const globalOpts = cmd.optsWithGlobals();
6269
6298
  const cwd = process.cwd();
6270
- const { BenchmarkRunner } = await import("./dist-K22DQUYY.js");
6299
+ const { BenchmarkRunner } = await import("./dist-6RT2AVYU.js");
6271
6300
  const runner = new BenchmarkRunner();
6272
6301
  const benchFiles = runner.discover(cwd, glob2);
6273
6302
  if (benchFiles.length === 0) {
@@ -6331,7 +6360,7 @@ async function runBaselinesShow(globalOpts) {
6331
6360
  }
6332
6361
  async function runBaselinesUpdate(globalOpts) {
6333
6362
  const cwd = process.cwd();
6334
- const { BenchmarkRunner } = await import("./dist-K22DQUYY.js");
6363
+ const { BenchmarkRunner } = await import("./dist-6RT2AVYU.js");
6335
6364
  const runner = new BenchmarkRunner();
6336
6365
  const manager = new BaselineManager(cwd);
6337
6366
  logger.info("Running benchmarks to update baselines...");
@@ -6372,7 +6401,7 @@ function registerReportCommand(perf) {
6372
6401
  perf.command("report").description("Full performance report with metrics, trends, and hotspots").action(async (_opts, cmd) => {
6373
6402
  const globalOpts = cmd.optsWithGlobals();
6374
6403
  const cwd = process.cwd();
6375
- const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-K22DQUYY.js");
6404
+ const { EntropyAnalyzer: EntropyAnalyzer2 } = await import("./dist-6RT2AVYU.js");
6376
6405
  const analyzer = new EntropyAnalyzer2({
6377
6406
  rootDir: path42.resolve(cwd),
6378
6407
  analyze: { complexity: true, coupling: true }
@@ -6763,7 +6792,7 @@ async function runPublishAnalyses(opts) {
6763
6792
  const nameToExternalId = buildNameToExternalIdMap(projectPath);
6764
6793
  if (!nameToExternalId) return process.exit(1);
6765
6794
  const { AnalysisArchive } = await import("@harness-engineering/orchestrator");
6766
- const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-K22DQUYY.js");
6795
+ const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-6RT2AVYU.js");
6767
6796
  const archive = new AnalysisArchive(path44.join(projectPath, ".harness", "analyses"));
6768
6797
  const analyses = await archive.list();
6769
6798
  if (analyses.length === 0) {
@@ -7303,7 +7332,13 @@ async function runMcpSetup(cwd) {
7303
7332
  configTarget: ".gemini/settings.json"
7304
7333
  },
7305
7334
  { name: "Codex CLI", dir: ".codex", client: "codex", configTarget: ".codex/config.toml" },
7306
- { name: "Cursor", dir: ".cursor", client: "cursor", configTarget: ".cursor/mcp.json" }
7335
+ { name: "Cursor", dir: ".cursor", client: "cursor", configTarget: ".cursor/mcp.json" },
7336
+ {
7337
+ name: "OpenCode",
7338
+ dir: path47.join(".config", "opencode"),
7339
+ client: "opencode",
7340
+ configTarget: "opencode.json"
7341
+ }
7307
7342
  ];
7308
7343
  for (const { name, dir, client, configTarget } of clients) {
7309
7344
  if (!detectClient(dir)) {
@@ -7351,6 +7386,13 @@ function configureTier0Integrations(cwd) {
7351
7386
  }
7352
7387
  }
7353
7388
  }
7389
+ const opencodePath = path47.join(cwd, "opencode.json");
7390
+ const opencodeGlobalDir = path47.join(os7.homedir(), ".config", "opencode");
7391
+ if (fs29.existsSync(opencodePath) || fs29.existsSync(opencodeGlobalDir)) {
7392
+ for (const integration of tier0) {
7393
+ writeOpencodeMcpEntry(opencodePath, integration.name, integration.mcpConfig);
7394
+ }
7395
+ }
7354
7396
  if (added.length === 0) {
7355
7397
  return { status: "pass", message: "Tier 0 MCP integrations already configured" };
7356
7398
  }
@@ -8908,7 +8950,7 @@ async function runSyncAnalyses(opts) {
8908
8950
  return;
8909
8951
  }
8910
8952
  const { AnalysisArchive, loadPublishedIndex: loadPublishedIndex2, savePublishedIndex: savePublishedIndex2 } = await import("@harness-engineering/orchestrator");
8911
- const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-K22DQUYY.js");
8953
+ const { GitHubIssuesSyncAdapter: GitHubIssuesSyncAdapter2 } = await import("./dist-6RT2AVYU.js");
8912
8954
  const adapter = new GitHubIssuesSyncAdapter2({ token, config: trackerConfig });
8913
8955
  const archive = new AnalysisArchive(path60.join(projectPath, ".harness", "analyses"));
8914
8956
  const publishedIndex = loadPublishedIndex2(projectPath);
@@ -9854,7 +9896,7 @@ function createUpdateCommand() {
9854
9896
  // src/commands/usage.ts
9855
9897
  import { Command as Command88 } from "commander";
9856
9898
  async function loadAndPriceRecords(cwd, includeClaudeSessions = false) {
9857
- const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-K22DQUYY.js");
9899
+ const { readCostRecords, loadPricingData, calculateCost, parseCCRecords } = await import("./dist-6RT2AVYU.js");
9858
9900
  const records = readCostRecords(cwd);
9859
9901
  if (includeClaudeSessions) {
9860
9902
  const ccRecords = parseCCRecords();
@@ -9947,7 +9989,7 @@ function registerDailyCommand(usage) {
9947
9989
  else logger.info("No usage data found. Run some harness sessions first.");
9948
9990
  return;
9949
9991
  }
9950
- const { aggregateByDay } = await import("./dist-K22DQUYY.js");
9992
+ const { aggregateByDay } = await import("./dist-6RT2AVYU.js");
9951
9993
  const limited = aggregateByDay(records).slice(0, days);
9952
9994
  if (globalOpts.json) {
9953
9995
  console.log(
@@ -9976,7 +10018,7 @@ function registerSessionsCommand(usage) {
9976
10018
  }
9977
10019
  return;
9978
10020
  }
9979
- const { aggregateBySession } = await import("./dist-K22DQUYY.js");
10021
+ const { aggregateBySession } = await import("./dist-6RT2AVYU.js");
9980
10022
  const sessionData = aggregateBySession(records);
9981
10023
  const limited = sessionData.slice(0, limit);
9982
10024
  if (globalOpts.json) {
@@ -10056,7 +10098,7 @@ function registerSessionCommand(usage) {
10056
10098
  cwd,
10057
10099
  globalOpts.includeClaudeSessions
10058
10100
  );
10059
- const { aggregateBySession } = await import("./dist-K22DQUYY.js");
10101
+ const { aggregateBySession } = await import("./dist-6RT2AVYU.js");
10060
10102
  const sessionData = aggregateBySession(records);
10061
10103
  const match = sessionData.find((s) => s.sessionId === id);
10062
10104
  if (!match) {
@@ -10091,7 +10133,7 @@ function registerLatestCommand(usage) {
10091
10133
  }
10092
10134
  return;
10093
10135
  }
10094
- const { aggregateBySession } = await import("./dist-K22DQUYY.js");
10136
+ const { aggregateBySession } = await import("./dist-6RT2AVYU.js");
10095
10137
  const sessionData = aggregateBySession(records);
10096
10138
  const latest = sessionData[0];
10097
10139
  if (!latest) {
@@ -10243,7 +10285,7 @@ function resolveValidateMode(globalOpts) {
10243
10285
  return OutputMode.TEXT;
10244
10286
  }
10245
10287
  async function printCrossCheckWarnings(mode) {
10246
- const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-GBX7B7CQ.js");
10288
+ const { runCrossCheck: runCrossCheck2 } = await import("./validate-cross-check-MI5MZ7MB.js");
10247
10289
  const cwd = process.cwd();
10248
10290
  const crossResult = await runCrossCheck2({
10249
10291
  specsDir: path64.join(cwd, "docs", "specs"),
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  init_dist
3
- } from "./chunk-MAFI6UWT.js";
3
+ } from "./chunk-K4WRQTEF.js";
4
4
  import {
5
5
  Err,
6
6
  Ok