@harness-engineering/cli 3.0.0 → 3.1.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 (58) hide show
  1. package/dist/agents/skills/claude-code/harness-execution/SKILL.md +35 -0
  2. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +33 -44
  3. package/dist/agents/skills/codex/harness-execution/SKILL.md +35 -0
  4. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +33 -44
  5. package/dist/agents/skills/cursor/harness-execution/SKILL.md +35 -0
  6. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +33 -44
  7. package/dist/agents/skills/gemini-cli/harness-execution/SKILL.md +35 -0
  8. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +33 -44
  9. package/dist/{agents-md-XOJE5ETA.js → agents-md-YYCLGMBF.js} +2 -2
  10. package/dist/{architecture-JEZPJ725.js → architecture-5KPP4ID4.js} +3 -3
  11. package/dist/{assess-project-RHXOQNMM.js → assess-project-B6ENHUAU.js} +1 -1
  12. package/dist/bin/harness-mcp.js +13 -13
  13. package/dist/bin/harness.js +22 -22
  14. package/dist/{check-phase-gate-GNDOMS35.js → check-phase-gate-REG3HWYC.js} +3 -3
  15. package/dist/{chunk-N24HCQA4.js → chunk-A65QO5KN.js} +132 -46
  16. package/dist/{chunk-UX3PQKVZ.js → chunk-BXKNWSG4.js} +1 -1
  17. package/dist/{chunk-XX4OLNWQ.js → chunk-C2ZGWMTN.js} +2 -2
  18. package/dist/{chunk-HEIMJJI4.js → chunk-DNX35Q5K.js} +2 -2
  19. package/dist/{chunk-BYVT5LVO.js → chunk-ERZCC5VH.js} +3 -3
  20. package/dist/{chunk-XFU6SB2Q.js → chunk-FL5SLUKZ.js} +62 -27
  21. package/dist/{chunk-NWLGL3IR.js → chunk-FUH4J43G.js} +1 -1
  22. package/dist/{chunk-MGUPSE6D.js → chunk-HIPBU2Q4.js} +5 -5
  23. package/dist/{chunk-3ISHDWO7.js → chunk-IF3JK3G5.js} +1 -1
  24. package/dist/{chunk-KAJOS3BA.js → chunk-LMZ2JTNP.js} +2 -2
  25. package/dist/{chunk-527G27VI.js → chunk-OQFEFVIN.js} +2 -2
  26. package/dist/{chunk-Z4AWEIBY.js → chunk-PZX2Y3RV.js} +3 -3
  27. package/dist/{chunk-ONCPJGHY.js → chunk-RGQXHCCH.js} +6 -6
  28. package/dist/{chunk-QBC7DI4Q.js → chunk-TCVQVHEF.js} +1 -1
  29. package/dist/{chunk-PC2R5RUJ.js → chunk-TE5YHHHZ.js} +1 -1
  30. package/dist/{chunk-HWTUUQOW.js → chunk-UBTMPO5H.js} +3 -3
  31. package/dist/{chunk-GSP2XIVS.js → chunk-XEOSSKIB.js} +1 -1
  32. package/dist/{chunk-DE5U6KOL.js → chunk-XZ2Q4UTW.js} +1 -1
  33. package/dist/{chunk-YQSYCBAH.js → chunk-YF3AY6KS.js} +6 -6
  34. package/dist/{chunk-GGKRA7A7.js → chunk-YQAFKOOL.js} +1 -1
  35. package/dist/{chunk-WWEVS7RO.js → chunk-ZOUJP3EY.js} +106 -80
  36. package/dist/{chunk-6WQCLCBO.js → chunk-ZRKFDE6M.js} +1 -1
  37. package/dist/{ci-workflow-ORZ4F45F.js → ci-workflow-JEYYCBOC.js} +2 -2
  38. package/dist/{dist-LHINSVK4.js → dist-3HW4LCHE.js} +15 -1
  39. package/dist/{docs-AU3DXFFO.js → docs-YRMW7UED.js} +3 -3
  40. package/dist/{engine-6GPWOYQH.js → engine-E7H5U3AC.js} +2 -2
  41. package/dist/{entropy-VLKDRMRT.js → entropy-3JBKCGJJ.js} +2 -2
  42. package/dist/{feedback-YXYY44ZC.js → feedback-U6VJ6AUJ.js} +1 -1
  43. package/dist/{generate-agent-definitions-XIHQPKG3.js → generate-agent-definitions-S2FRZF4Y.js} +3 -3
  44. package/dist/hooks/format-check.js +202 -0
  45. package/dist/hooks/quality-warner.js +32 -0
  46. package/dist/hooks/strict-quality-gate.js +48 -0
  47. package/dist/index.d.ts +8 -8
  48. package/dist/index.js +22 -22
  49. package/dist/{loader-YAN56MT3.js → loader-RGQJYERV.js} +2 -2
  50. package/dist/{mcp-RK3SFVYB.js → mcp-NDTFZXWF.js} +13 -13
  51. package/dist/{performance-64DPTLLQ.js → performance-FPWKC4CN.js} +3 -3
  52. package/dist/{review-pipeline-NENG6LW7.js → review-pipeline-WUHG7PHO.js} +2 -2
  53. package/dist/{runtime-FFIIRT2T.js → runtime-Q3ORD7LW.js} +2 -2
  54. package/dist/{security-3PIBN35B.js → security-JDHTRBGC.js} +1 -1
  55. package/dist/{validate-7IAF2ES3.js → validate-G3LKBOYA.js} +3 -3
  56. package/dist/{validate-cross-check-QPSAOZKD.js → validate-cross-check-4ITA72DF.js} +2 -2
  57. package/package.json +8 -8
  58. package/dist/hooks/quality-gate.js +0 -131
@@ -3,20 +3,20 @@ import {
3
3
  handleGetSecurityTrends,
4
4
  handleRunSecurityScan,
5
5
  runSecurityScanDefinition
6
- } from "./chunk-HEIMJJI4.js";
6
+ } from "./chunk-DNX35Q5K.js";
7
7
  import {
8
8
  handleRunCodeReview,
9
9
  runCodeReviewDefinition,
10
10
  sortFindingsBySeverity
11
- } from "./chunk-XX4OLNWQ.js";
11
+ } from "./chunk-C2ZGWMTN.js";
12
12
  import {
13
13
  assessProjectDefinition,
14
14
  handleAssessProject
15
- } from "./chunk-YQSYCBAH.js";
15
+ } from "./chunk-YF3AY6KS.js";
16
16
  import {
17
17
  detectEntropyDefinition,
18
18
  handleDetectEntropy
19
- } from "./chunk-Z4AWEIBY.js";
19
+ } from "./chunk-PZX2Y3RV.js";
20
20
  import {
21
21
  checkPerformanceDefinition,
22
22
  getCriticalPathsDefinition,
@@ -26,7 +26,7 @@ import {
26
26
  handleGetPerfBaselines,
27
27
  handleUpdatePerfBaselines,
28
28
  updatePerfBaselinesDefinition
29
- } from "./chunk-ONCPJGHY.js";
29
+ } from "./chunk-RGQXHCCH.js";
30
30
  import {
31
31
  getBusinessKnowledgeResource
32
32
  } from "./chunk-IOW3MW2K.js";
@@ -37,7 +37,7 @@ import {
37
37
  handleCreateSelfReview,
38
38
  handleRequestPeerReview,
39
39
  requestPeerReviewDefinition
40
- } from "./chunk-BYVT5LVO.js";
40
+ } from "./chunk-ERZCC5VH.js";
41
41
  import {
42
42
  GENERATED_HEADER_CLAUDE,
43
43
  GENERATED_HEADER_CODEX,
@@ -53,18 +53,18 @@ import {
53
53
  import {
54
54
  handleValidateProject,
55
55
  validateToolDefinition
56
- } from "./chunk-HWTUUQOW.js";
56
+ } from "./chunk-UBTMPO5H.js";
57
57
  import {
58
58
  checkDependenciesDefinition,
59
59
  handleCheckDependencies
60
- } from "./chunk-527G27VI.js";
60
+ } from "./chunk-OQFEFVIN.js";
61
61
  import {
62
62
  resolveProjectConfig
63
- } from "./chunk-DE5U6KOL.js";
63
+ } from "./chunk-XZ2Q4UTW.js";
64
64
  import {
65
65
  checkDocsDefinition,
66
66
  handleCheckDocs
67
- } from "./chunk-MGUPSE6D.js";
67
+ } from "./chunk-HIPBU2Q4.js";
68
68
  import {
69
69
  resultToMcpResponse
70
70
  } from "./chunk-RC3OI5NK.js";
@@ -90,7 +90,7 @@ import {
90
90
  findConfigFile,
91
91
  loadConfig,
92
92
  resolveConfig
93
- } from "./chunk-GGKRA7A7.js";
93
+ } from "./chunk-YQAFKOOL.js";
94
94
  import {
95
95
  logger
96
96
  } from "./chunk-EBJQ6N4M.js";
@@ -121,7 +121,7 @@ import {
121
121
  scanForInjection,
122
122
  serializeEnvelope,
123
123
  writeTaint
124
- } from "./chunk-N24HCQA4.js";
124
+ } from "./chunk-A65QO5KN.js";
125
125
  import {
126
126
  Err,
127
127
  INDEXED_FILE_KINDS,
@@ -738,7 +738,7 @@ async function handleInsightsSummary(input) {
738
738
  const skip = Array.isArray(input.skip) ? input.skip.filter(
739
739
  (k) => typeof k === "string" && INSIGHTS_KEYS.includes(k)
740
740
  ) : void 0;
741
- const { composeInsights } = await import("./dist-LHINSVK4.js");
741
+ const { composeInsights } = await import("./dist-3HW4LCHE.js");
742
742
  const report = await composeInsights(projectPath, {
743
743
  ...skip && skip.length > 0 && { skip }
744
744
  });
@@ -914,7 +914,7 @@ ${skippedMsg}`
914
914
  async function handleInitProject(input) {
915
915
  const i = input;
916
916
  try {
917
- const { TemplateEngine } = await import("./engine-6GPWOYQH.js");
917
+ const { TemplateEngine } = await import("./engine-E7H5U3AC.js");
918
918
  const engine = new TemplateEngine(resolveTemplatesDir());
919
919
  const safePath = sanitizePath(i.path);
920
920
  const detected = tryDetectFramework(engine, safePath, i);
@@ -936,7 +936,7 @@ var listPersonasDefinition = {
936
936
  inputSchema: { type: "object", properties: {} }
937
937
  };
938
938
  async function handleListPersonas() {
939
- const { listPersonas } = await import("./loader-YAN56MT3.js");
939
+ const { listPersonas } = await import("./loader-RGQJYERV.js");
940
940
  const result = listPersonas(resolvePersonasDir());
941
941
  return resultToMcpResponse(result);
942
942
  }
@@ -960,10 +960,10 @@ async function handleGeneratePersonaArtifacts(input) {
960
960
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.name)) {
961
961
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.name}`)));
962
962
  }
963
- const { loadPersona } = await import("./loader-YAN56MT3.js");
964
- const { generateRuntime } = await import("./runtime-FFIIRT2T.js");
965
- const { generateAgentsMd } = await import("./agents-md-XOJE5ETA.js");
966
- const { generateCIWorkflow } = await import("./ci-workflow-ORZ4F45F.js");
963
+ const { loadPersona } = await import("./loader-RGQJYERV.js");
964
+ const { generateRuntime } = await import("./runtime-Q3ORD7LW.js");
965
+ const { generateAgentsMd } = await import("./agents-md-YYCLGMBF.js");
966
+ const { generateCIWorkflow } = await import("./ci-workflow-JEYYCBOC.js");
967
967
  const personasDir = resolvePersonasDir();
968
968
  const filePath = path4.join(personasDir, `${input.name}.yaml`);
969
969
  if (!filePath.startsWith(personasDir)) {
@@ -1018,7 +1018,7 @@ async function handleRunPersona(input) {
1018
1018
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.persona)) {
1019
1019
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.persona}`)));
1020
1020
  }
1021
- const { loadPersona } = await import("./loader-YAN56MT3.js");
1021
+ const { loadPersona } = await import("./loader-RGQJYERV.js");
1022
1022
  const { runPersona } = await import("./runner-AAEF2TXY.js");
1023
1023
  const { executeSkill } = await import("./skill-executor-MOCUIAYS.js");
1024
1024
  const personasDir = resolvePersonasDir();
@@ -1463,7 +1463,7 @@ function loadOrGenerateProfile(projectRoot) {
1463
1463
  // src/mcp/tools/event-emitter.ts
1464
1464
  async function emitSkillEvent(projectPath, event) {
1465
1465
  try {
1466
- const { emitEvent } = await import("./dist-LHINSVK4.js");
1466
+ const { emitEvent } = await import("./dist-3HW4LCHE.js");
1467
1467
  await emitEvent(projectPath, event);
1468
1468
  } catch {
1469
1469
  }
@@ -1735,7 +1735,7 @@ async function autoSyncRoadmap(projectPath) {
1735
1735
  try {
1736
1736
  const roadmapFile = path11.join(projectPath, "docs", "roadmap.md");
1737
1737
  if (!fs10.existsSync(roadmapFile)) return;
1738
- const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-LHINSVK4.js");
1738
+ const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-3HW4LCHE.js");
1739
1739
  const raw = fs10.readFileSync(roadmapFile, "utf-8");
1740
1740
  const parseResult = parseRoadmap(raw);
1741
1741
  if (!parseResult.ok) return;
@@ -1765,7 +1765,7 @@ async function triggerExternalSync(projectPath, roadmapFile) {
1765
1765
  console.warn("[roadmap-sync] GITHUB_TOKEN not found \u2014 external sync skipped");
1766
1766
  return;
1767
1767
  }
1768
- const { fullSync, GitHubIssuesSyncAdapter } = await import("./dist-LHINSVK4.js");
1768
+ const { fullSync, GitHubIssuesSyncAdapter } = await import("./dist-3HW4LCHE.js");
1769
1769
  const adapter = new GitHubIssuesSyncAdapter({
1770
1770
  token,
1771
1771
  config: trackerConfig
@@ -1862,12 +1862,12 @@ var manageStateDefinition = {
1862
1862
  }
1863
1863
  };
1864
1864
  async function handleShow(projectPath, input) {
1865
- const { loadState } = await import("./dist-LHINSVK4.js");
1865
+ const { loadState } = await import("./dist-3HW4LCHE.js");
1866
1866
  return resultToMcpResponse(await loadState(projectPath, input.stream, input.session));
1867
1867
  }
1868
1868
  async function handleLearn(projectPath, input) {
1869
1869
  if (!input.learning) return mcpError("Error: learning is required for learn action");
1870
- const { appendLearning } = await import("./dist-LHINSVK4.js");
1870
+ const { appendLearning } = await import("./dist-3HW4LCHE.js");
1871
1871
  const result = await appendLearning(
1872
1872
  projectPath,
1873
1873
  input.learning,
@@ -1882,7 +1882,7 @@ async function handleLearn(projectPath, input) {
1882
1882
  async function handleFailure(projectPath, input) {
1883
1883
  if (!input.description) return mcpError("Error: description is required for failure action");
1884
1884
  if (!input.failureType) return mcpError("Error: failureType is required for failure action");
1885
- const { appendFailure } = await import("./dist-LHINSVK4.js");
1885
+ const { appendFailure } = await import("./dist-3HW4LCHE.js");
1886
1886
  const result = await appendFailure(
1887
1887
  projectPath,
1888
1888
  input.description,
@@ -1901,19 +1901,19 @@ async function handleFailure(projectPath, input) {
1901
1901
  return resultToMcpResponse(Ok({ recorded: true }));
1902
1902
  }
1903
1903
  async function handleArchive(projectPath, input) {
1904
- const { archiveFailures } = await import("./dist-LHINSVK4.js");
1904
+ const { archiveFailures } = await import("./dist-3HW4LCHE.js");
1905
1905
  const result = await archiveFailures(projectPath, input.stream, input.session);
1906
1906
  if (!result.ok) return resultToMcpResponse(result);
1907
1907
  return resultToMcpResponse(Ok({ archived: true }));
1908
1908
  }
1909
1909
  async function handleReset(projectPath, input) {
1910
- const { saveState, DEFAULT_STATE } = await import("./dist-LHINSVK4.js");
1910
+ const { saveState, DEFAULT_STATE } = await import("./dist-3HW4LCHE.js");
1911
1911
  const result = await saveState(projectPath, { ...DEFAULT_STATE }, input.stream, input.session);
1912
1912
  if (!result.ok) return resultToMcpResponse(result);
1913
1913
  return resultToMcpResponse(Ok({ reset: true }));
1914
1914
  }
1915
1915
  async function handleGate(projectPath, input) {
1916
- const { runMechanicalGate } = await import("./dist-LHINSVK4.js");
1916
+ const { runMechanicalGate } = await import("./dist-3HW4LCHE.js");
1917
1917
  const result = await runMechanicalGate(projectPath);
1918
1918
  if (result.ok) {
1919
1919
  await emitSkillEvent(projectPath, {
@@ -1933,7 +1933,7 @@ async function handleGate(projectPath, input) {
1933
1933
  }
1934
1934
  async function handleSaveHandoff(projectPath, input) {
1935
1935
  if (!input.handoff) return mcpError("Error: handoff is required for save-handoff action");
1936
- const { saveHandoff } = await import("./dist-LHINSVK4.js");
1936
+ const { saveHandoff } = await import("./dist-3HW4LCHE.js");
1937
1937
  const result = await saveHandoff(
1938
1938
  projectPath,
1939
1939
  input.handoff,
@@ -1955,7 +1955,7 @@ async function handleSaveHandoff(projectPath, input) {
1955
1955
  return resultToMcpResponse(Ok({ saved: true }));
1956
1956
  }
1957
1957
  async function handleLoadHandoff(projectPath, input) {
1958
- const { loadHandoff } = await import("./dist-LHINSVK4.js");
1958
+ const { loadHandoff } = await import("./dist-3HW4LCHE.js");
1959
1959
  return resultToMcpResponse(await loadHandoff(projectPath, input.stream, input.session));
1960
1960
  }
1961
1961
  async function handleAppendEntry(projectPath, input) {
@@ -1963,7 +1963,7 @@ async function handleAppendEntry(projectPath, input) {
1963
1963
  if (!input.authorSkill) return mcpError("Error: authorSkill is required for append_entry action");
1964
1964
  if (!input.content) return mcpError("Error: content is required for append_entry action");
1965
1965
  if (input.session) {
1966
- const { appendSessionEntry } = await import("./dist-LHINSVK4.js");
1966
+ const { appendSessionEntry } = await import("./dist-3HW4LCHE.js");
1967
1967
  const result = await appendSessionEntry(
1968
1968
  projectPath,
1969
1969
  input.session,
@@ -1976,7 +1976,7 @@ async function handleAppendEntry(projectPath, input) {
1976
1976
  if (input.section !== "decisions") {
1977
1977
  return mcpError("Error: session is required for non-decisions sections");
1978
1978
  }
1979
- const { loadState, saveState } = await import("./dist-LHINSVK4.js");
1979
+ const { loadState, saveState } = await import("./dist-3HW4LCHE.js");
1980
1980
  const lr = await loadState(projectPath, input.stream);
1981
1981
  if (!lr.ok) return resultToMcpResponse(lr);
1982
1982
  lr.value.decisions.push({
@@ -1994,7 +1994,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
1994
1994
  if (!input.entryId) return mcpError("Error: entryId is required for update_entry_status action");
1995
1995
  if (!input.newStatus)
1996
1996
  return mcpError("Error: newStatus is required for update_entry_status action");
1997
- const { updateSessionEntryStatus } = await import("./dist-LHINSVK4.js");
1997
+ const { updateSessionEntryStatus } = await import("./dist-3HW4LCHE.js");
1998
1998
  const result = await updateSessionEntryStatus(
1999
1999
  projectPath,
2000
2000
  input.session,
@@ -2007,7 +2007,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
2007
2007
  async function handleReadSection(projectPath, input) {
2008
2008
  if (!input.session) return mcpError("Error: session is required for read_section action");
2009
2009
  if (!input.section) return mcpError("Error: section is required for read_section action");
2010
- const { readSessionSection } = await import("./dist-LHINSVK4.js");
2010
+ const { readSessionSection } = await import("./dist-3HW4LCHE.js");
2011
2011
  const result = await readSessionSection(
2012
2012
  projectPath,
2013
2013
  input.session,
@@ -2017,13 +2017,13 @@ async function handleReadSection(projectPath, input) {
2017
2017
  }
2018
2018
  async function handleReadSections(projectPath, input) {
2019
2019
  if (!input.session) return mcpError("Error: session is required for read_sections action");
2020
- const { readSessionSections } = await import("./dist-LHINSVK4.js");
2020
+ const { readSessionSections } = await import("./dist-3HW4LCHE.js");
2021
2021
  const result = await readSessionSections(projectPath, input.session);
2022
2022
  return resultToMcpResponse(result);
2023
2023
  }
2024
2024
  async function handleArchiveSession(projectPath, input) {
2025
2025
  if (!input.session) return mcpError("Error: session is required for archive_session action");
2026
- const { archiveSession } = await import("./dist-LHINSVK4.js");
2026
+ const { archiveSession } = await import("./dist-3HW4LCHE.js");
2027
2027
  const { buildArchiveHooks } = await import("@harness-engineering/orchestrator");
2028
2028
  const hooks = buildArchiveHooks({ projectPath });
2029
2029
  const result = await archiveSession(projectPath, input.session, { hooks });
@@ -2105,7 +2105,7 @@ var listStreamsDefinition = {
2105
2105
  };
2106
2106
  async function handleListStreams(input) {
2107
2107
  try {
2108
- const { listStreams, loadStreamIndex } = await import("./dist-LHINSVK4.js");
2108
+ const { listStreams, loadStreamIndex } = await import("./dist-3HW4LCHE.js");
2109
2109
  const projectPath = sanitizePath(input.path);
2110
2110
  const indexResult = await loadStreamIndex(projectPath);
2111
2111
  const streamsResult = await listStreams(projectPath);
@@ -2143,7 +2143,7 @@ var checkPhaseGateDefinition = {
2143
2143
  };
2144
2144
  async function handleCheckPhaseGate(input) {
2145
2145
  try {
2146
- const { runCheckPhaseGate } = await import("./check-phase-gate-GNDOMS35.js");
2146
+ const { runCheckPhaseGate } = await import("./check-phase-gate-REG3HWYC.js");
2147
2147
  const result = await runCheckPhaseGate({ cwd: sanitizePath(input.path) });
2148
2148
  if (result.ok) {
2149
2149
  return { content: [{ type: "text", text: JSON.stringify(result.value) }] };
@@ -2199,7 +2199,7 @@ async function handleValidateCrossCheck(input) {
2199
2199
  };
2200
2200
  }
2201
2201
  try {
2202
- const { runCrossCheck } = await import("./validate-cross-check-QPSAOZKD.js");
2202
+ const { runCrossCheck } = await import("./validate-cross-check-4ITA72DF.js");
2203
2203
  const specsDir = path12.resolve(projectPath, input.specsDir ?? "docs/specs");
2204
2204
  if (!specsDir.startsWith(projectPath)) {
2205
2205
  return {
@@ -3022,7 +3022,7 @@ async function handleGenerateSlashCommands(input) {
3022
3022
  // src/mcp/resources/state.ts
3023
3023
  async function getStateResource(projectRoot) {
3024
3024
  try {
3025
- const { loadState, migrateToStreams } = await import("./dist-LHINSVK4.js");
3025
+ const { loadState, migrateToStreams } = await import("./dist-3HW4LCHE.js");
3026
3026
  await migrateToStreams(projectRoot);
3027
3027
  const result = await loadState(projectRoot);
3028
3028
  if (result.ok) {
@@ -4042,7 +4042,7 @@ var generateAgentDefinitionsDefinition = {
4042
4042
  }
4043
4043
  };
4044
4044
  async function handleGenerateAgentDefinitions(input) {
4045
- const { generateAgentDefinitions } = await import("./generate-agent-definitions-XIHQPKG3.js");
4045
+ const { generateAgentDefinitions } = await import("./generate-agent-definitions-S2FRZF4Y.js");
4046
4046
  const platforms = input.platform === "all" || !input.platform ? ["claude-code", "gemini-cli"] : [input.platform];
4047
4047
  const results = generateAgentDefinitions({
4048
4048
  platforms: [...platforms],
@@ -4482,6 +4482,18 @@ function handleAdd2(projectPath, input, deps) {
4482
4482
  writeRoadmapFile(projectPath, serializeRoadmap(roadmap));
4483
4483
  return resultToMcpResponse(Ok2(roadmap));
4484
4484
  }
4485
+ function claimRefusedResponse(featureName, roadmap, currentAssignee) {
4486
+ const message = `Claim refused: "${featureName}" is already in-progress under ${currentAssignee ?? "another owner"} (first-claim-wins). Release it first to hand off.`;
4487
+ return {
4488
+ content: [
4489
+ {
4490
+ type: "text",
4491
+ text: JSON.stringify({ ...roadmap, claimed: false, message })
4492
+ }
4493
+ ],
4494
+ isError: true
4495
+ };
4496
+ }
4485
4497
  function handleUpdate2(projectPath, input, deps) {
4486
4498
  const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges, Ok: Ok2 } = deps;
4487
4499
  if (!input.feature) {
@@ -4499,13 +4511,21 @@ function handleUpdate2(projectPath, input, deps) {
4499
4511
  for (const m of roadmap.milestones) {
4500
4512
  const feature = m.features.find((f) => f.name.toLowerCase() === input.feature.toLowerCase());
4501
4513
  if (feature) {
4502
- if (input.status) feature.status = input.status;
4514
+ const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
4515
+ if (input.status) deps.setStatus(roadmap, feature, input.status, date);
4503
4516
  if (input.summary !== void 0) feature.summary = input.summary;
4504
4517
  if (input.spec !== void 0) feature.spec = input.spec || null;
4505
4518
  if (input.plans !== void 0) feature.plans = input.plans;
4506
4519
  if (input.blocked_by !== void 0) feature.blockedBy = input.blocked_by;
4507
4520
  if (input.assignee !== void 0) {
4508
- deps.assignFeature(roadmap, feature, input.assignee, (/* @__PURE__ */ new Date()).toISOString().slice(0, 10));
4521
+ if (input.assignee) {
4522
+ deps.claim(roadmap, feature, input.assignee, date);
4523
+ if (feature.assignee !== input.assignee) {
4524
+ return claimRefusedResponse(input.feature, roadmap, feature.assignee);
4525
+ }
4526
+ } else {
4527
+ deps.release(roadmap, feature, date);
4528
+ }
4509
4529
  }
4510
4530
  found = true;
4511
4531
  break;
@@ -4739,9 +4759,12 @@ async function handleManageRoadmap(input) {
4739
4759
  syncRoadmap,
4740
4760
  applySyncChanges,
4741
4761
  assignFeature,
4762
+ setStatus,
4763
+ claim,
4764
+ release,
4742
4765
  promoteFeature,
4743
4766
  groomRoadmap
4744
- } = await import("./dist-LHINSVK4.js");
4767
+ } = await import("./dist-3HW4LCHE.js");
4745
4768
  const { Ok: Ok2 } = await import("./dist-ICW4QUEW.js");
4746
4769
  const projectPath = projectPathPre;
4747
4770
  const deps = {
@@ -4750,6 +4773,9 @@ async function handleManageRoadmap(input) {
4750
4773
  syncRoadmap,
4751
4774
  applySyncChanges,
4752
4775
  assignFeature,
4776
+ setStatus,
4777
+ claim,
4778
+ release,
4753
4779
  promoteFeature,
4754
4780
  groomRoadmap,
4755
4781
  Ok: Ok2
@@ -5182,7 +5208,7 @@ async function handleTransition(validInput, projectPath, id) {
5182
5208
  const transition = transitionResult.data;
5183
5209
  const prompt = renderTransition(transition);
5184
5210
  try {
5185
- const { saveHandoff } = await import("./dist-LHINSVK4.js");
5211
+ const { saveHandoff } = await import("./dist-3HW4LCHE.js");
5186
5212
  await saveHandoff(
5187
5213
  projectPath,
5188
5214
  {
@@ -5263,7 +5289,7 @@ async function handleEmitInteraction(input) {
5263
5289
  }
5264
5290
  async function recordInteraction(projectPath, id, type, decision, stream) {
5265
5291
  try {
5266
- const { loadState, saveState } = await import("./dist-LHINSVK4.js");
5292
+ const { loadState, saveState } = await import("./dist-3HW4LCHE.js");
5267
5293
  const stateResult = await loadState(projectPath, stream);
5268
5294
  if (stateResult.ok) {
5269
5295
  const state = stateResult.value;
@@ -5424,10 +5450,10 @@ async function handleGatherContext(input) {
5424
5450
  input.include ?? ["state", "learnings", "handoff", "graph", "validation", "businessKnowledge"]
5425
5451
  );
5426
5452
  const errors = [];
5427
- const statePromise = includeSet.has("state") ? import("./dist-LHINSVK4.js").then(
5453
+ const statePromise = includeSet.has("state") ? import("./dist-3HW4LCHE.js").then(
5428
5454
  (core) => core.loadState(projectPath, void 0, input.session)
5429
5455
  ) : Promise.resolve(null);
5430
- const learningsPromise = includeSet.has("learnings") ? import("./dist-LHINSVK4.js").then(
5456
+ const learningsPromise = includeSet.has("learnings") ? import("./dist-3HW4LCHE.js").then(
5431
5457
  (core) => core.loadBudgetedLearnings(projectPath, {
5432
5458
  intent: input.intent,
5433
5459
  tokenBudget: input.learningsBudget ?? 1e3,
@@ -5436,7 +5462,7 @@ async function handleGatherContext(input) {
5436
5462
  ...input.depth !== void 0 && { depth: input.depth }
5437
5463
  })
5438
5464
  ) : Promise.resolve(null);
5439
- const handoffPromise = includeSet.has("handoff") ? import("./dist-LHINSVK4.js").then(
5465
+ const handoffPromise = includeSet.has("handoff") ? import("./dist-3HW4LCHE.js").then(
5440
5466
  (core) => core.loadHandoff(projectPath, void 0, input.session)
5441
5467
  ) : Promise.resolve(null);
5442
5468
  const graphPromise = includeSet.has("graph") ? (async () => {
@@ -5480,11 +5506,11 @@ async function handleGatherContext(input) {
5480
5506
  context: contextBlocks
5481
5507
  };
5482
5508
  })() : Promise.resolve(null);
5483
- const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-LHINSVK4.js").then(
5509
+ const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-3HW4LCHE.js").then(
5484
5510
  (core) => core.readSessionSections(projectPath, input.session)
5485
5511
  ) : Promise.resolve(null);
5486
5512
  const shouldIncludeEvents = input.includeEvents !== void 0 ? input.includeEvents : includeSet.has("events") || !!input.session && !input.include;
5487
- const eventsPromise = shouldIncludeEvents ? import("./dist-LHINSVK4.js").then(async (core) => {
5513
+ const eventsPromise = shouldIncludeEvents ? import("./dist-3HW4LCHE.js").then(async (core) => {
5488
5514
  const result = await core.loadEvents(projectPath, {
5489
5515
  session: input.session
5490
5516
  });
@@ -5492,7 +5518,7 @@ async function handleGatherContext(input) {
5492
5518
  return core.formatEventTimeline(result.value);
5493
5519
  }) : Promise.resolve(null);
5494
5520
  const validationPromise = includeSet.has("validation") ? (async () => {
5495
- const { handleValidateProject: handleValidateProject2 } = await import("./validate-7IAF2ES3.js");
5521
+ const { handleValidateProject: handleValidateProject2 } = await import("./validate-G3LKBOYA.js");
5496
5522
  const result = await handleValidateProject2({ path: projectPath });
5497
5523
  const first = result.content[0];
5498
5524
  return first ? JSON.parse(first.text) : null;
@@ -5595,7 +5621,7 @@ async function handleGatherContext(input) {
5595
5621
  };
5596
5622
  if (input.session) {
5597
5623
  try {
5598
- const core = await import("./dist-LHINSVK4.js");
5624
+ const core = await import("./dist-3HW4LCHE.js");
5599
5625
  core.updateSessionIndex(
5600
5626
  projectPath,
5601
5627
  input.session,
@@ -5793,7 +5819,7 @@ async function handleReviewChanges(input) {
5793
5819
  }
5794
5820
  }
5795
5821
  async function runQuickReview(projectPath, diff, diffLines, downgraded, offset, limit) {
5796
- const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-YXYY44ZC.js");
5822
+ const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-U6VJ6AUJ.js");
5797
5823
  const result = await handleAnalyzeDiff2({ diff, path: projectPath });
5798
5824
  const firstContent = result.content[0];
5799
5825
  if (!firstContent) throw new Error("Empty analyze_diff response");
@@ -5828,7 +5854,7 @@ function extractFileCount(diffParsed) {
5828
5854
  return files?.length ?? 0;
5829
5855
  }
5830
5856
  async function runStandardReview(projectPath, diff, diffLines, downgraded, offset, limit) {
5831
- const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-YXYY44ZC.js");
5857
+ const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-U6VJ6AUJ.js");
5832
5858
  const [diffResult, reviewResult] = await Promise.all([
5833
5859
  handleAnalyzeDiff2({ diff, path: projectPath }),
5834
5860
  handleCreateSelfReview2({ path: projectPath, diff })
@@ -5863,7 +5889,7 @@ async function runStandardReview(projectPath, diff, diffLines, downgraded, offse
5863
5889
  };
5864
5890
  }
5865
5891
  async function runDeepReview(projectPath, diff, diffLines, _downgraded, offset, limit) {
5866
- const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-NENG6LW7.js");
5892
+ const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-WUHG7PHO.js");
5867
5893
  const result = await handleRunCodeReview2({
5868
5894
  path: projectPath,
5869
5895
  diff,
@@ -6158,7 +6184,7 @@ async function handleDetectStaleConstraints(input) {
6158
6184
  ]
6159
6185
  };
6160
6186
  }
6161
- const { detectStaleConstraints } = await import("./dist-LHINSVK4.js");
6187
+ const { detectStaleConstraints } = await import("./dist-3HW4LCHE.js");
6162
6188
  const result = detectStaleConstraints(
6163
6189
  store,
6164
6190
  windowDays,
@@ -6288,10 +6314,10 @@ function countCriticalFindings(securityData) {
6288
6314
  return findings.filter((f) => f.severity === "error").length;
6289
6315
  }
6290
6316
  async function runHealthChecks(projectPath) {
6291
- const { handleAssessProject: handleAssessProject2 } = await import("./assess-project-RHXOQNMM.js");
6292
- const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-JEZPJ725.js");
6293
- const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-VLKDRMRT.js");
6294
- const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-3PIBN35B.js");
6317
+ const { handleAssessProject: handleAssessProject2 } = await import("./assess-project-B6ENHUAU.js");
6318
+ const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-5KPP4ID4.js");
6319
+ const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-3JBKCGJJ.js");
6320
+ const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-JDHTRBGC.js");
6295
6321
  const [assessResult, depsResult, entropyResult, securityResult] = await Promise.all([
6296
6322
  handleAssessProject2({
6297
6323
  path: projectPath,
@@ -7134,7 +7160,7 @@ async function handleGetDecayTrends(input) {
7134
7160
  };
7135
7161
  }
7136
7162
  try {
7137
- const core = await import("./dist-LHINSVK4.js");
7163
+ const core = await import("./dist-3HW4LCHE.js");
7138
7164
  const { TimelineManager } = core;
7139
7165
  const manager = new TimelineManager(projectPath);
7140
7166
  const timeline = manager.load();
@@ -7269,7 +7295,7 @@ async function handleCodeOutline(input) {
7269
7295
  };
7270
7296
  }
7271
7297
  try {
7272
- const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-LHINSVK4.js");
7298
+ const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-3HW4LCHE.js");
7273
7299
  const { stat } = await import("fs/promises");
7274
7300
  const stats = await stat(targetPath).catch(() => null);
7275
7301
  if (stats?.isFile()) {
@@ -7288,7 +7314,7 @@ async function handleCodeOutline(input) {
7288
7314
  })
7289
7315
  );
7290
7316
  fileStats.sort((a, b) => b.mtimeMs - a.mtimeMs);
7291
- const { paginate: paginate2 } = await import("./dist-LHINSVK4.js");
7317
+ const { paginate: paginate2 } = await import("./dist-3HW4LCHE.js");
7292
7318
  const paged = paginate2(fileStats, input.offset ?? 0, input.limit ?? 30);
7293
7319
  const results = [];
7294
7320
  for (const entry of paged.items) {
@@ -7361,7 +7387,7 @@ async function handleCodeSearch(input) {
7361
7387
  };
7362
7388
  }
7363
7389
  try {
7364
- const { searchSymbols } = await import("./dist-LHINSVK4.js");
7390
+ const { searchSymbols } = await import("./dist-3HW4LCHE.js");
7365
7391
  const result = await searchSymbols(input.query, directory, input.glob);
7366
7392
  const lines = [`Search: "${result.query}" \u2014 ${result.matches.length} matches`];
7367
7393
  for (const match of result.matches) {
@@ -7430,7 +7456,7 @@ async function handleCodeUnfold(input) {
7430
7456
  }
7431
7457
  try {
7432
7458
  if (input.symbol) {
7433
- const { unfoldSymbol } = await import("./dist-LHINSVK4.js");
7459
+ const { unfoldSymbol } = await import("./dist-3HW4LCHE.js");
7434
7460
  const result = await unfoldSymbol(filePath, input.symbol);
7435
7461
  const header = result.warning ? `${result.file}:${result.startLine}-${result.endLine} ${result.warning}
7436
7462
  ` : `${result.file}:${result.startLine}-${result.endLine}
@@ -7438,7 +7464,7 @@ async function handleCodeUnfold(input) {
7438
7464
  return { content: [{ type: "text", text: header + result.content }] };
7439
7465
  }
7440
7466
  if (input.startLine != null && input.endLine != null) {
7441
- const { unfoldRange } = await import("./dist-LHINSVK4.js");
7467
+ const { unfoldRange } = await import("./dist-3HW4LCHE.js");
7442
7468
  const result = await unfoldRange(filePath, input.startLine, input.endLine);
7443
7469
  const header = `${result.file}:${result.startLine}-${result.endLine}
7444
7470
  `;
@@ -7623,7 +7649,7 @@ async function handlePredictFailures(input) {
7623
7649
  };
7624
7650
  }
7625
7651
  try {
7626
- const core = await import("./dist-LHINSVK4.js");
7652
+ const core = await import("./dist-3HW4LCHE.js");
7627
7653
  const { TimelineManager, PredictionEngine, SpecImpactEstimator } = core;
7628
7654
  const manager = new TimelineManager(projectPath);
7629
7655
  const includeRoadmap = input.includeRoadmap !== false;
@@ -8732,7 +8758,7 @@ async function handleDetectConstraintEmergence(input) {
8732
8758
  }
8733
8759
  const nodePath = await import("path");
8734
8760
  const historyPath = nodePath.resolve(projectPath, ".harness/arch/violation-history.json");
8735
- const { ViolationHistoryManager, detectEmergentConstraints } = await import("./dist-LHINSVK4.js");
8761
+ const { ViolationHistoryManager, detectEmergentConstraints } = await import("./dist-3HW4LCHE.js");
8736
8762
  const manager = new ViolationHistoryManager(historyPath);
8737
8763
  const history = manager.load();
8738
8764
  const options = { windowWeeks, minOccurrences };
@@ -8820,7 +8846,7 @@ async function handleRunCIChecks(input) {
8820
8846
  };
8821
8847
  }
8822
8848
  try {
8823
- const { runCIChecks } = await import("./dist-LHINSVK4.js");
8849
+ const { runCIChecks } = await import("./dist-3HW4LCHE.js");
8824
8850
  const skip = input.checks ? VALID_CHECKS.filter((c) => !input.checks.includes(c)) : [];
8825
8851
  const result = await runCIChecks({
8826
8852
  projectRoot: projectPath,
@@ -8882,7 +8908,7 @@ async function handleGenerateBlueprint(input) {
8882
8908
  };
8883
8909
  }
8884
8910
  try {
8885
- const { ProjectScanner } = await import("./dist-LHINSVK4.js");
8911
+ const { ProjectScanner } = await import("./dist-3HW4LCHE.js");
8886
8912
  const scanner = new ProjectScanner(projectPath);
8887
8913
  const data = await scanner.scan();
8888
8914
  return {
@@ -9081,7 +9107,7 @@ async function handleEmitSkillProposal(input) {
9081
9107
  let createProposal;
9082
9108
  let ProposalConflictError;
9083
9109
  try {
9084
- const core = await import("./dist-LHINSVK4.js");
9110
+ const core = await import("./dist-3HW4LCHE.js");
9085
9111
  createProposal = core.createProposal;
9086
9112
  ProposalConflictError = core.ProposalConflictError;
9087
9113
  } catch (err2) {
@@ -18890,7 +18916,7 @@ async function handleValidateStrategy(input) {
18890
18916
  } catch (error) {
18891
18917
  return mcpError2(error instanceof Error ? error.message : String(error));
18892
18918
  }
18893
- const { validateStrategy } = await import("./dist-LHINSVK4.js");
18919
+ const { validateStrategy } = await import("./dist-3HW4LCHE.js");
18894
18920
  const result = await validateStrategy(projectPath);
18895
18921
  if (!result.ok) {
18896
18922
  return mcpJson({ present: true, valid: false, error: result.error.message });
@@ -18915,7 +18941,7 @@ async function handleReadStrategy(input) {
18915
18941
  } catch (error) {
18916
18942
  return mcpError2(error instanceof Error ? error.message : String(error));
18917
18943
  }
18918
- const core = await import("./dist-LHINSVK4.js");
18944
+ const core = await import("./dist-3HW4LCHE.js");
18919
18945
  const validation = await core.validateStrategy(projectPath);
18920
18946
  if (!validation.ok) {
18921
18947
  return mcpJson({ present: true, valid: false, error: validation.error.message });
@@ -18967,7 +18993,7 @@ async function handleWriteStrategy(input) {
18967
18993
  } catch (error) {
18968
18994
  return mcpError2(error instanceof Error ? error.message : String(error));
18969
18995
  }
18970
- const core = await import("./dist-LHINSVK4.js");
18996
+ const core = await import("./dist-3HW4LCHE.js");
18971
18997
  try {
18972
18998
  core.writeStrategyDoc(input.doc, {
18973
18999
  cwd: projectPath,
@@ -19011,7 +19037,7 @@ async function handleSeedPulseFromStrategy(input) {
19011
19037
  } catch (error) {
19012
19038
  return mcpError3(error instanceof Error ? error.message : String(error));
19013
19039
  }
19014
- const core = await import("./dist-LHINSVK4.js");
19040
+ const core = await import("./dist-3HW4LCHE.js");
19015
19041
  const seed = core.seedFromStrategy({ cwd: projectPath });
19016
19042
  return mcpJson2(seed);
19017
19043
  }
@@ -19046,7 +19072,7 @@ async function handleWritePulseConfig(input) {
19046
19072
  return mcpError3(error instanceof Error ? error.message : String(error));
19047
19073
  }
19048
19074
  const resolvedConfigPath = input.configPath !== void 0 ? path53.isAbsolute(input.configPath) ? input.configPath : path53.join(projectPath, input.configPath) : path53.join(projectPath, "harness.config.json");
19049
- const core = await import("./dist-LHINSVK4.js");
19075
+ const core = await import("./dist-3HW4LCHE.js");
19050
19076
  try {
19051
19077
  core.writePulseConfig(input.config, {
19052
19078
  configPath: resolvedConfigPath,
@@ -19095,7 +19121,7 @@ async function handleAcquireCompoundLock(input) {
19095
19121
  } catch (error) {
19096
19122
  return mcpError4(error instanceof Error ? error.message : String(error));
19097
19123
  }
19098
- const core = await import("./dist-LHINSVK4.js");
19124
+ const core = await import("./dist-3HW4LCHE.js");
19099
19125
  try {
19100
19126
  const handle = core.acquireCompoundLock(
19101
19127
  input.category,
@@ -19457,7 +19483,7 @@ async function appendUpdateNotification(result, resolvedRoot) {
19457
19483
  shouldRunCheck,
19458
19484
  readCheckState,
19459
19485
  spawnBackgroundCheck
19460
- } = await import("./dist-LHINSVK4.js");
19486
+ } = await import("./dist-3HW4LCHE.js");
19461
19487
  const { CLI_VERSION } = await import("./version-CUI434OP.js");
19462
19488
  const configInterval = readConfigInterval(resolvedRoot);
19463
19489
  const DEFAULT_INTERVAL = 864e5;
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KET4QQZB.js";
4
4
  import {
5
5
  init_dist
6
- } from "./chunk-N24HCQA4.js";
6
+ } from "./chunk-A65QO5KN.js";
7
7
  import {
8
8
  Err,
9
9
  Ok