@harness-engineering/cli 1.16.0 → 1.18.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 (49) hide show
  1. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +204 -0
  2. package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +52 -0
  3. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +204 -0
  4. package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +52 -0
  5. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +204 -0
  6. package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +52 -0
  7. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +204 -0
  8. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +52 -0
  9. package/dist/agents/skills/package.json +5 -5
  10. package/dist/{agents-md-VYDFPIRW.js → agents-md-DUYNKHJZ.js} +1 -1
  11. package/dist/{architecture-K5HSRBGB.js → architecture-UBO5KKUV.js} +2 -2
  12. package/dist/bin/harness-mcp.js +13 -12
  13. package/dist/bin/harness.js +18 -15
  14. package/dist/{check-phase-gate-5AS6SXL6.js → check-phase-gate-OSHN2AEL.js} +3 -3
  15. package/dist/{chunk-JOP2NDNB.js → chunk-2DMIQ35P.js} +151 -79
  16. package/dist/{chunk-TF6ZLHJV.js → chunk-5FM64G6D.js} +2 -2
  17. package/dist/{chunk-5ZXHMCPL.js → chunk-ABQUCXRE.js} +2 -1
  18. package/dist/{chunk-AV6KMDO5.js → chunk-APNPXLB2.js} +4 -4
  19. package/dist/{chunk-FTMXDOR6.js → chunk-CZZXE6BL.js} +1 -1
  20. package/dist/{chunk-SFRGPAK6.js → chunk-GWXP3JVA.js} +3 -3
  21. package/dist/{chunk-SHYWICGA.js → chunk-OA3MOZGG.js} +22 -22
  22. package/dist/{chunk-RWZPHW4H.js → chunk-OHZVGIPE.js} +9 -9
  23. package/dist/{chunk-C7DTKLPW.js → chunk-QSRRBNLY.js} +8 -8
  24. package/dist/{chunk-QDF7COPQ.js → chunk-TG7IUJ3J.js} +1 -1
  25. package/dist/{chunk-DNDBFIZN.js → chunk-TZIHFNEG.js} +7 -7
  26. package/dist/{chunk-ZJMU7MEV.js → chunk-UX3JHYEA.js} +1 -1
  27. package/dist/{chunk-ALFKNAZW.js → chunk-VF23UTNB.js} +545 -36
  28. package/dist/{chunk-7MJAPE3Z.js → chunk-YLN34N65.js} +1 -0
  29. package/dist/{chunk-OCDDCGDE.js → chunk-ZA2I7S3E.js} +20 -1
  30. package/dist/{ci-workflow-CRWU723U.js → ci-workflow-FJZMNZPT.js} +1 -1
  31. package/dist/{dist-4LPXJYVZ.js → dist-MF5BK5AD.js} +19 -1
  32. package/dist/{dist-B26DFXMP.js → dist-U7EAO6T2.js} +110 -60
  33. package/dist/{docs-4JRHTLUZ.js → docs-WZHW4N4P.js} +3 -3
  34. package/dist/{engine-3G3VIM6L.js → engine-VS6ZJ2VZ.js} +2 -2
  35. package/dist/{entropy-G6CZ2A6P.js → entropy-FCIGJIIT.js} +2 -2
  36. package/dist/{feedback-QYKQ65HB.js → feedback-O3FYTZIE.js} +1 -1
  37. package/dist/{generate-agent-definitions-SAAOAPT4.js → generate-agent-definitions-EYG263XD.js} +1 -1
  38. package/dist/{graph-loader-2M2HXDQI.js → graph-loader-KMHDQYDT.js} +1 -1
  39. package/dist/index.d.ts +70 -11
  40. package/dist/index.js +15 -15
  41. package/dist/{loader-VCOK3PF7.js → loader-B4XWX4K6.js} +1 -1
  42. package/dist/{mcp-YENEPHBW.js → mcp-DVVUODN7.js} +12 -12
  43. package/dist/{performance-UBCFI2UP.js → performance-NMJDV6HF.js} +3 -3
  44. package/dist/{review-pipeline-IQAVCWAX.js → review-pipeline-MSEJWTKM.js} +1 -1
  45. package/dist/{runtime-PYFFIESU.js → runtime-YHVLJNPG.js} +1 -1
  46. package/dist/{security-ZDADTPYW.js → security-HTDKKGMX.js} +1 -1
  47. package/dist/{validate-VRTUHALQ.js → validate-SPSTH2YW.js} +2 -2
  48. package/dist/{validate-cross-check-4Y6NHNK3.js → validate-cross-check-YTDWIMFI.js} +1 -1
  49. package/package.json +21 -21
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  detectEntropyDefinition,
3
3
  handleDetectEntropy
4
- } from "./chunk-AV6KMDO5.js";
4
+ } from "./chunk-APNPXLB2.js";
5
5
  import {
6
6
  checkPerformanceDefinition,
7
7
  getCriticalPathsDefinition,
@@ -11,7 +11,7 @@ import {
11
11
  handleGetPerfBaselines,
12
12
  handleUpdatePerfBaselines,
13
13
  updatePerfBaselinesDefinition
14
- } from "./chunk-DNDBFIZN.js";
14
+ } from "./chunk-TZIHFNEG.js";
15
15
  import {
16
16
  analyzeDiffDefinition,
17
17
  createSelfReviewDefinition,
@@ -19,15 +19,15 @@ import {
19
19
  handleCreateSelfReview,
20
20
  handleRequestPeerReview,
21
21
  requestPeerReviewDefinition
22
- } from "./chunk-RWZPHW4H.js";
22
+ } from "./chunk-OHZVGIPE.js";
23
23
  import {
24
24
  handleRunSecurityScan,
25
25
  runSecurityScanDefinition
26
- } from "./chunk-QDF7COPQ.js";
26
+ } from "./chunk-TG7IUJ3J.js";
27
27
  import {
28
28
  handleRunCodeReview,
29
29
  runCodeReviewDefinition
30
- } from "./chunk-ZJMU7MEV.js";
30
+ } from "./chunk-UX3JHYEA.js";
31
31
  import {
32
32
  GENERATED_HEADER_CLAUDE,
33
33
  GENERATED_HEADER_CODEX,
@@ -40,24 +40,25 @@ import {
40
40
  import {
41
41
  handleValidateProject,
42
42
  validateToolDefinition
43
- } from "./chunk-TF6ZLHJV.js";
43
+ } from "./chunk-5FM64G6D.js";
44
44
  import {
45
45
  loadGraphStore
46
- } from "./chunk-FTMXDOR6.js";
46
+ } from "./chunk-CZZXE6BL.js";
47
47
  import {
48
48
  checkDependenciesDefinition,
49
49
  handleCheckDependencies
50
- } from "./chunk-SFRGPAK6.js";
50
+ } from "./chunk-GWXP3JVA.js";
51
51
  import {
52
52
  resolveProjectConfig
53
53
  } from "./chunk-H7Y5CKTM.js";
54
54
  import {
55
55
  checkDocsDefinition,
56
56
  handleCheckDocs
57
- } from "./chunk-C7DTKLPW.js";
57
+ } from "./chunk-QSRRBNLY.js";
58
58
  import {
59
+ TrackerConfigSchema,
59
60
  resolveConfig
60
- } from "./chunk-OCDDCGDE.js";
61
+ } from "./chunk-ZA2I7S3E.js";
61
62
  import {
62
63
  resultToMcpResponse
63
64
  } from "./chunk-IDZNPTYD.js";
@@ -86,7 +87,7 @@ import {
86
87
  checkTaint,
87
88
  scanForInjection,
88
89
  writeTaint
89
- } from "./chunk-ALFKNAZW.js";
90
+ } from "./chunk-VF23UTNB.js";
90
91
  import {
91
92
  Err,
92
93
  Ok
@@ -553,7 +554,7 @@ ${skippedMsg}`
553
554
  async function handleInitProject(input) {
554
555
  const i = input;
555
556
  try {
556
- const { TemplateEngine } = await import("./engine-3G3VIM6L.js");
557
+ const { TemplateEngine } = await import("./engine-VS6ZJ2VZ.js");
557
558
  const engine = new TemplateEngine(resolveTemplatesDir());
558
559
  const safePath = sanitizePath(i.path);
559
560
  const detected = tryDetectFramework(engine, safePath, i);
@@ -574,7 +575,7 @@ var listPersonasDefinition = {
574
575
  inputSchema: { type: "object", properties: {} }
575
576
  };
576
577
  async function handleListPersonas() {
577
- const { listPersonas } = await import("./loader-VCOK3PF7.js");
578
+ const { listPersonas } = await import("./loader-B4XWX4K6.js");
578
579
  const result = listPersonas(resolvePersonasDir());
579
580
  return resultToMcpResponse(result);
580
581
  }
@@ -598,10 +599,10 @@ async function handleGeneratePersonaArtifacts(input) {
598
599
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.name)) {
599
600
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.name}`)));
600
601
  }
601
- const { loadPersona } = await import("./loader-VCOK3PF7.js");
602
- const { generateRuntime } = await import("./runtime-PYFFIESU.js");
603
- const { generateAgentsMd } = await import("./agents-md-VYDFPIRW.js");
604
- const { generateCIWorkflow } = await import("./ci-workflow-CRWU723U.js");
602
+ const { loadPersona } = await import("./loader-B4XWX4K6.js");
603
+ const { generateRuntime } = await import("./runtime-YHVLJNPG.js");
604
+ const { generateAgentsMd } = await import("./agents-md-DUYNKHJZ.js");
605
+ const { generateCIWorkflow } = await import("./ci-workflow-FJZMNZPT.js");
605
606
  const personasDir = resolvePersonasDir();
606
607
  const filePath = path3.join(personasDir, `${input.name}.yaml`);
607
608
  if (!filePath.startsWith(personasDir)) {
@@ -656,7 +657,7 @@ async function handleRunPersona(input) {
656
657
  if (!/^[a-z0-9][a-z0-9._-]*$/i.test(input.persona)) {
657
658
  return resultToMcpResponse(Err(new Error(`Invalid persona name: ${input.persona}`)));
658
659
  }
659
- const { loadPersona } = await import("./loader-VCOK3PF7.js");
660
+ const { loadPersona } = await import("./loader-B4XWX4K6.js");
660
661
  const { runPersona } = await import("./runner-VMYLHWOC.js");
661
662
  const { executeSkill } = await import("./skill-executor-XEVDGXUM.js");
662
663
  const personasDir = resolvePersonasDir();
@@ -1274,18 +1275,62 @@ async function autoSyncRoadmap(projectPath) {
1274
1275
  try {
1275
1276
  const roadmapFile = path11.join(projectPath, "docs", "roadmap.md");
1276
1277
  if (!fs10.existsSync(roadmapFile)) return;
1277
- const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-4LPXJYVZ.js");
1278
+ const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
1278
1279
  const raw = fs10.readFileSync(roadmapFile, "utf-8");
1279
1280
  const parseResult = parseRoadmap(raw);
1280
1281
  if (!parseResult.ok) return;
1281
1282
  const roadmap = parseResult.value;
1282
1283
  const syncResult = syncRoadmap({ projectPath, roadmap });
1283
- if (!syncResult.ok || syncResult.value.length === 0) return;
1284
+ if (!syncResult.ok || syncResult.value.length === 0) {
1285
+ await triggerExternalSync(projectPath, roadmapFile);
1286
+ return;
1287
+ }
1284
1288
  applySyncChanges(roadmap, syncResult.value);
1285
1289
  fs10.writeFileSync(roadmapFile, serializeRoadmap(roadmap), "utf-8");
1290
+ await triggerExternalSync(projectPath, roadmapFile);
1286
1291
  } catch {
1287
1292
  }
1288
1293
  }
1294
+ async function triggerExternalSync(projectPath, roadmapFile) {
1295
+ try {
1296
+ const trackerConfig = loadTrackerConfig(projectPath);
1297
+ if (!trackerConfig) return;
1298
+ const token = process.env.GITHUB_TOKEN;
1299
+ if (!token) return;
1300
+ const { fullSync, GitHubIssuesSyncAdapter } = await import("./dist-MF5BK5AD.js");
1301
+ const adapter = new GitHubIssuesSyncAdapter({
1302
+ token,
1303
+ config: trackerConfig
1304
+ });
1305
+ const result = await fullSync(roadmapFile, adapter, trackerConfig);
1306
+ if (result.errors.length > 0) {
1307
+ for (const err of result.errors) {
1308
+ console.error(
1309
+ `[roadmap-sync] External sync error for ${err.featureOrId}: ${err.error.message}`
1310
+ );
1311
+ }
1312
+ }
1313
+ } catch (error) {
1314
+ console.error(
1315
+ `[roadmap-sync] External sync failed: ${error instanceof Error ? error.message : String(error)}`
1316
+ );
1317
+ }
1318
+ }
1319
+ function loadTrackerConfig(projectPath) {
1320
+ try {
1321
+ const configPath = path11.join(projectPath, "harness.config.json");
1322
+ if (!fs10.existsSync(configPath)) return null;
1323
+ const raw = fs10.readFileSync(configPath, "utf-8");
1324
+ const config = JSON.parse(raw);
1325
+ const trackerRaw = config.roadmap?.tracker;
1326
+ if (!trackerRaw) return null;
1327
+ const parsed = TrackerConfigSchema.safeParse(trackerRaw);
1328
+ if (!parsed.success) return null;
1329
+ return parsed.data;
1330
+ } catch {
1331
+ return null;
1332
+ }
1333
+ }
1289
1334
 
1290
1335
  // src/mcp/utils.ts
1291
1336
  function mcpError(text) {
@@ -1315,7 +1360,11 @@ var manageStateDefinition = {
1315
1360
  "update_entry_status",
1316
1361
  "read_section",
1317
1362
  "read_sections",
1318
- "archive_session"
1363
+ "archive_session",
1364
+ "task-start",
1365
+ "task-complete",
1366
+ "phase-start",
1367
+ "phase-complete"
1319
1368
  ],
1320
1369
  description: "Action to perform"
1321
1370
  },
@@ -1360,12 +1409,12 @@ var manageStateDefinition = {
1360
1409
  }
1361
1410
  };
1362
1411
  async function handleShow(projectPath, input) {
1363
- const { loadState } = await import("./dist-4LPXJYVZ.js");
1412
+ const { loadState } = await import("./dist-MF5BK5AD.js");
1364
1413
  return resultToMcpResponse(await loadState(projectPath, input.stream, input.session));
1365
1414
  }
1366
1415
  async function handleLearn(projectPath, input) {
1367
1416
  if (!input.learning) return mcpError("Error: learning is required for learn action");
1368
- const { appendLearning } = await import("./dist-4LPXJYVZ.js");
1417
+ const { appendLearning } = await import("./dist-MF5BK5AD.js");
1369
1418
  const result = await appendLearning(
1370
1419
  projectPath,
1371
1420
  input.learning,
@@ -1380,7 +1429,7 @@ async function handleLearn(projectPath, input) {
1380
1429
  async function handleFailure(projectPath, input) {
1381
1430
  if (!input.description) return mcpError("Error: description is required for failure action");
1382
1431
  if (!input.failureType) return mcpError("Error: failureType is required for failure action");
1383
- const { appendFailure } = await import("./dist-4LPXJYVZ.js");
1432
+ const { appendFailure } = await import("./dist-MF5BK5AD.js");
1384
1433
  const result = await appendFailure(
1385
1434
  projectPath,
1386
1435
  input.description,
@@ -1393,24 +1442,24 @@ async function handleFailure(projectPath, input) {
1393
1442
  return resultToMcpResponse(Ok({ recorded: true }));
1394
1443
  }
1395
1444
  async function handleArchive(projectPath, input) {
1396
- const { archiveFailures } = await import("./dist-4LPXJYVZ.js");
1445
+ const { archiveFailures } = await import("./dist-MF5BK5AD.js");
1397
1446
  const result = await archiveFailures(projectPath, input.stream, input.session);
1398
1447
  if (!result.ok) return resultToMcpResponse(result);
1399
1448
  return resultToMcpResponse(Ok({ archived: true }));
1400
1449
  }
1401
1450
  async function handleReset(projectPath, input) {
1402
- const { saveState, DEFAULT_STATE } = await import("./dist-4LPXJYVZ.js");
1451
+ const { saveState, DEFAULT_STATE } = await import("./dist-MF5BK5AD.js");
1403
1452
  const result = await saveState(projectPath, { ...DEFAULT_STATE }, input.stream, input.session);
1404
1453
  if (!result.ok) return resultToMcpResponse(result);
1405
1454
  return resultToMcpResponse(Ok({ reset: true }));
1406
1455
  }
1407
1456
  async function handleGate(projectPath, _input) {
1408
- const { runMechanicalGate } = await import("./dist-4LPXJYVZ.js");
1457
+ const { runMechanicalGate } = await import("./dist-MF5BK5AD.js");
1409
1458
  return resultToMcpResponse(await runMechanicalGate(projectPath));
1410
1459
  }
1411
1460
  async function handleSaveHandoff(projectPath, input) {
1412
1461
  if (!input.handoff) return mcpError("Error: handoff is required for save-handoff action");
1413
- const { saveHandoff } = await import("./dist-4LPXJYVZ.js");
1462
+ const { saveHandoff } = await import("./dist-MF5BK5AD.js");
1414
1463
  const result = await saveHandoff(
1415
1464
  projectPath,
1416
1465
  input.handoff,
@@ -1422,7 +1471,7 @@ async function handleSaveHandoff(projectPath, input) {
1422
1471
  return resultToMcpResponse(Ok({ saved: true }));
1423
1472
  }
1424
1473
  async function handleLoadHandoff(projectPath, input) {
1425
- const { loadHandoff } = await import("./dist-4LPXJYVZ.js");
1474
+ const { loadHandoff } = await import("./dist-MF5BK5AD.js");
1426
1475
  return resultToMcpResponse(await loadHandoff(projectPath, input.stream, input.session));
1427
1476
  }
1428
1477
  async function handleAppendEntry(projectPath, input) {
@@ -1430,7 +1479,7 @@ async function handleAppendEntry(projectPath, input) {
1430
1479
  if (!input.section) return mcpError("Error: section is required for append_entry action");
1431
1480
  if (!input.authorSkill) return mcpError("Error: authorSkill is required for append_entry action");
1432
1481
  if (!input.content) return mcpError("Error: content is required for append_entry action");
1433
- const { appendSessionEntry } = await import("./dist-4LPXJYVZ.js");
1482
+ const { appendSessionEntry } = await import("./dist-MF5BK5AD.js");
1434
1483
  const result = await appendSessionEntry(
1435
1484
  projectPath,
1436
1485
  input.session,
@@ -1446,7 +1495,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
1446
1495
  if (!input.entryId) return mcpError("Error: entryId is required for update_entry_status action");
1447
1496
  if (!input.newStatus)
1448
1497
  return mcpError("Error: newStatus is required for update_entry_status action");
1449
- const { updateSessionEntryStatus } = await import("./dist-4LPXJYVZ.js");
1498
+ const { updateSessionEntryStatus } = await import("./dist-MF5BK5AD.js");
1450
1499
  const result = await updateSessionEntryStatus(
1451
1500
  projectPath,
1452
1501
  input.session,
@@ -1459,7 +1508,7 @@ async function handleUpdateEntryStatus(projectPath, input) {
1459
1508
  async function handleReadSection(projectPath, input) {
1460
1509
  if (!input.session) return mcpError("Error: session is required for read_section action");
1461
1510
  if (!input.section) return mcpError("Error: section is required for read_section action");
1462
- const { readSessionSection } = await import("./dist-4LPXJYVZ.js");
1511
+ const { readSessionSection } = await import("./dist-MF5BK5AD.js");
1463
1512
  const result = await readSessionSection(
1464
1513
  projectPath,
1465
1514
  input.session,
@@ -1469,18 +1518,34 @@ async function handleReadSection(projectPath, input) {
1469
1518
  }
1470
1519
  async function handleReadSections(projectPath, input) {
1471
1520
  if (!input.session) return mcpError("Error: session is required for read_sections action");
1472
- const { readSessionSections } = await import("./dist-4LPXJYVZ.js");
1521
+ const { readSessionSections } = await import("./dist-MF5BK5AD.js");
1473
1522
  const result = await readSessionSections(projectPath, input.session);
1474
1523
  return resultToMcpResponse(result);
1475
1524
  }
1476
1525
  async function handleArchiveSession(projectPath, input) {
1477
1526
  if (!input.session) return mcpError("Error: session is required for archive_session action");
1478
- const { archiveSession } = await import("./dist-4LPXJYVZ.js");
1527
+ const { archiveSession } = await import("./dist-MF5BK5AD.js");
1479
1528
  const result = await archiveSession(projectPath, input.session);
1480
1529
  if (!result.ok) return resultToMcpResponse(result);
1481
1530
  await autoSyncRoadmap(projectPath);
1482
1531
  return resultToMcpResponse(Ok({ archived: true }));
1483
1532
  }
1533
+ async function handleTaskStart(projectPath, _input) {
1534
+ await autoSyncRoadmap(projectPath);
1535
+ return resultToMcpResponse(Ok({ synced: true, trigger: "task-start" }));
1536
+ }
1537
+ async function handleTaskComplete(projectPath, _input) {
1538
+ await autoSyncRoadmap(projectPath);
1539
+ return resultToMcpResponse(Ok({ synced: true, trigger: "task-complete" }));
1540
+ }
1541
+ async function handlePhaseStart(projectPath, _input) {
1542
+ await autoSyncRoadmap(projectPath);
1543
+ return resultToMcpResponse(Ok({ synced: true, trigger: "phase-start" }));
1544
+ }
1545
+ async function handlePhaseComplete(projectPath, _input) {
1546
+ await autoSyncRoadmap(projectPath);
1547
+ return resultToMcpResponse(Ok({ synced: true, trigger: "phase-complete" }));
1548
+ }
1484
1549
  var ACTION_HANDLERS = {
1485
1550
  show: handleShow,
1486
1551
  learn: handleLearn,
@@ -1494,7 +1559,11 @@ var ACTION_HANDLERS = {
1494
1559
  update_entry_status: handleUpdateEntryStatus,
1495
1560
  read_section: handleReadSection,
1496
1561
  read_sections: handleReadSections,
1497
- archive_session: handleArchiveSession
1562
+ archive_session: handleArchiveSession,
1563
+ "task-start": handleTaskStart,
1564
+ "task-complete": handleTaskComplete,
1565
+ "phase-start": handlePhaseStart,
1566
+ "phase-complete": handlePhaseComplete
1498
1567
  };
1499
1568
  async function handleManageState(input) {
1500
1569
  try {
@@ -1519,7 +1588,7 @@ var listStreamsDefinition = {
1519
1588
  };
1520
1589
  async function handleListStreams(input) {
1521
1590
  try {
1522
- const { listStreams, loadStreamIndex } = await import("./dist-4LPXJYVZ.js");
1591
+ const { listStreams, loadStreamIndex } = await import("./dist-MF5BK5AD.js");
1523
1592
  const projectPath = sanitizePath(input.path);
1524
1593
  const indexResult = await loadStreamIndex(projectPath);
1525
1594
  const streamsResult = await listStreams(projectPath);
@@ -1557,7 +1626,7 @@ var checkPhaseGateDefinition = {
1557
1626
  };
1558
1627
  async function handleCheckPhaseGate(input) {
1559
1628
  try {
1560
- const { runCheckPhaseGate } = await import("./check-phase-gate-5AS6SXL6.js");
1629
+ const { runCheckPhaseGate } = await import("./check-phase-gate-OSHN2AEL.js");
1561
1630
  const result = await runCheckPhaseGate({ cwd: sanitizePath(input.path) });
1562
1631
  if (result.ok) {
1563
1632
  return { content: [{ type: "text", text: JSON.stringify(result.value) }] };
@@ -1613,7 +1682,7 @@ async function handleValidateCrossCheck(input) {
1613
1682
  };
1614
1683
  }
1615
1684
  try {
1616
- const { runCrossCheck } = await import("./validate-cross-check-4Y6NHNK3.js");
1685
+ const { runCrossCheck } = await import("./validate-cross-check-YTDWIMFI.js");
1617
1686
  const specsDir = path12.resolve(projectPath, input.specsDir ?? "docs/specs");
1618
1687
  if (!specsDir.startsWith(projectPath)) {
1619
1688
  return {
@@ -2258,7 +2327,7 @@ async function handleGenerateSlashCommands(input) {
2258
2327
  // src/mcp/resources/state.ts
2259
2328
  async function getStateResource(projectRoot) {
2260
2329
  try {
2261
- const { loadState, migrateToStreams } = await import("./dist-4LPXJYVZ.js");
2330
+ const { loadState, migrateToStreams } = await import("./dist-MF5BK5AD.js");
2262
2331
  await migrateToStreams(projectRoot);
2263
2332
  const result = await loadState(projectRoot);
2264
2333
  if (result.ok) {
@@ -2346,7 +2415,7 @@ async function handleQueryGraph(input) {
2346
2415
  const projectPath = sanitizePath(input.path);
2347
2416
  const store = await loadGraphStore(projectPath);
2348
2417
  if (!store) return graphNotFoundError();
2349
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2418
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2350
2419
  const cql = new ContextQL(store);
2351
2420
  const result = cql.execute({
2352
2421
  rootNodeIds: input.rootNodeIds,
@@ -2437,7 +2506,7 @@ async function handleSearchSimilar(input) {
2437
2506
  const projectPath = sanitizePath(input.path);
2438
2507
  const store = await loadGraphStore(projectPath);
2439
2508
  if (!store) return graphNotFoundError();
2440
- const { FusionLayer } = await import("./dist-B26DFXMP.js");
2509
+ const { FusionLayer } = await import("./dist-U7EAO6T2.js");
2441
2510
  const fusion = new FusionLayer(store);
2442
2511
  const results = fusion.search(input.query, input.topK ?? 10);
2443
2512
  if (input.mode === "summary") {
@@ -2492,7 +2561,7 @@ async function handleFindContextFor(input) {
2492
2561
  const projectPath = sanitizePath(input.path);
2493
2562
  const store = await loadGraphStore(projectPath);
2494
2563
  if (!store) return graphNotFoundError();
2495
- const { FusionLayer, ContextQL } = await import("./dist-B26DFXMP.js");
2564
+ const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
2496
2565
  const fusion = new FusionLayer(store);
2497
2566
  const cql = new ContextQL(store);
2498
2567
  const tokenBudget = input.tokenBudget ?? 4e3;
@@ -2588,7 +2657,7 @@ async function handleGetRelationships(input) {
2588
2657
  const projectPath = sanitizePath(input.path);
2589
2658
  const store = await loadGraphStore(projectPath);
2590
2659
  if (!store) return graphNotFoundError();
2591
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2660
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2592
2661
  const cql = new ContextQL(store);
2593
2662
  const direction = input.direction ?? "both";
2594
2663
  const bidirectional = direction === "both" || direction === "inbound";
@@ -2694,7 +2763,7 @@ async function handleGetImpact(input) {
2694
2763
  const projectPath = sanitizePath(input.path);
2695
2764
  const store = await loadGraphStore(projectPath);
2696
2765
  if (!store) return graphNotFoundError();
2697
- const { ContextQL } = await import("./dist-B26DFXMP.js");
2766
+ const { ContextQL } = await import("./dist-U7EAO6T2.js");
2698
2767
  let targetNodeId = input.nodeId;
2699
2768
  if (!targetNodeId && input.filePath) {
2700
2769
  const fileNodes = store.findNodes({ type: "file" });
@@ -2826,7 +2895,7 @@ async function handleIngestSource(input) {
2826
2895
  try {
2827
2896
  const projectPath = sanitizePath(input.path);
2828
2897
  const graphDir = path16.join(projectPath, ".harness", "graph");
2829
- const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-B26DFXMP.js");
2898
+ const { GraphStore, CodeIngestor, TopologicalLinker, KnowledgeIngestor, GitIngestor } = await import("./dist-U7EAO6T2.js");
2830
2899
  const fs16 = await import("fs/promises");
2831
2900
  await fs16.mkdir(graphDir, { recursive: true });
2832
2901
  const store = new GraphStore();
@@ -2901,7 +2970,7 @@ async function handleDetectAnomalies(input) {
2901
2970
  const projectPath = sanitizePath(input.path);
2902
2971
  const store = await loadGraphStore(projectPath);
2903
2972
  if (!store) return graphNotFoundError();
2904
- const { GraphAnomalyAdapter } = await import("./dist-B26DFXMP.js");
2973
+ const { GraphAnomalyAdapter } = await import("./dist-U7EAO6T2.js");
2905
2974
  const adapter = new GraphAnomalyAdapter(store);
2906
2975
  const report = adapter.detect({
2907
2976
  ...input.threshold !== void 0 && { threshold: input.threshold },
@@ -2941,7 +3010,7 @@ async function handleAskGraph(input) {
2941
3010
  const projectPath = sanitizePath(input.path);
2942
3011
  const store = await loadGraphStore(projectPath);
2943
3012
  if (!store) return graphNotFoundError();
2944
- const { askGraph } = await import("./dist-B26DFXMP.js");
3013
+ const { askGraph } = await import("./dist-U7EAO6T2.js");
2945
3014
  const result = await askGraph(store, input.question);
2946
3015
  return {
2947
3016
  content: [{ type: "text", text: JSON.stringify(result) }]
@@ -3077,7 +3146,7 @@ var generateAgentDefinitionsDefinition = {
3077
3146
  }
3078
3147
  };
3079
3148
  async function handleGenerateAgentDefinitions(input) {
3080
- const { generateAgentDefinitions } = await import("./generate-agent-definitions-SAAOAPT4.js");
3149
+ const { generateAgentDefinitions } = await import("./generate-agent-definitions-EYG263XD.js");
3081
3150
  const platforms = input.platform === "all" || !input.platform ? ["claude-code", "gemini-cli"] : [input.platform];
3082
3151
  const results = generateAgentDefinitions({
3083
3152
  platforms: [...platforms],
@@ -3245,7 +3314,10 @@ function handleAdd(projectPath, input, deps) {
3245
3314
  spec: input.spec ?? null,
3246
3315
  plans: input.plans ?? [],
3247
3316
  blockedBy: input.blocked_by ?? [],
3248
- summary: input.summary
3317
+ summary: input.summary,
3318
+ assignee: null,
3319
+ priority: null,
3320
+ externalId: null
3249
3321
  });
3250
3322
  roadmap.frontmatter.lastManualEdit = (/* @__PURE__ */ new Date()).toISOString();
3251
3323
  writeRoadmapFile(projectPath, serializeRoadmap(roadmap));
@@ -3371,7 +3443,7 @@ function handleSync(projectPath, input, deps) {
3371
3443
  }
3372
3444
  async function handleManageRoadmap(input) {
3373
3445
  try {
3374
- const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-4LPXJYVZ.js");
3446
+ const { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges } = await import("./dist-MF5BK5AD.js");
3375
3447
  const { Ok: Ok2 } = await import("./dist-USY2C5JL.js");
3376
3448
  const projectPath = sanitizePath(input.path);
3377
3449
  const deps = { parseRoadmap, serializeRoadmap, syncRoadmap, applySyncChanges, Ok: Ok2 };
@@ -3799,7 +3871,7 @@ async function handleTransition(validInput, projectPath, id) {
3799
3871
  const transition = transitionResult.data;
3800
3872
  const prompt = renderTransition(transition);
3801
3873
  try {
3802
- const { saveHandoff } = await import("./dist-4LPXJYVZ.js");
3874
+ const { saveHandoff } = await import("./dist-MF5BK5AD.js");
3803
3875
  await saveHandoff(
3804
3876
  projectPath,
3805
3877
  {
@@ -3869,7 +3941,7 @@ async function handleEmitInteraction(input) {
3869
3941
  }
3870
3942
  async function recordInteraction(projectPath, id, type, decision, stream) {
3871
3943
  try {
3872
- const { loadState, saveState } = await import("./dist-4LPXJYVZ.js");
3944
+ const { loadState, saveState } = await import("./dist-MF5BK5AD.js");
3873
3945
  const stateResult = await loadState(projectPath, stream);
3874
3946
  if (stateResult.ok) {
3875
3947
  const state = stateResult.value;
@@ -3958,10 +4030,10 @@ async function handleGatherContext(input) {
3958
4030
  input.include ?? ["state", "learnings", "handoff", "graph", "validation"]
3959
4031
  );
3960
4032
  const errors = [];
3961
- const statePromise = includeSet.has("state") ? import("./dist-4LPXJYVZ.js").then(
4033
+ const statePromise = includeSet.has("state") ? import("./dist-MF5BK5AD.js").then(
3962
4034
  (core) => core.loadState(projectPath, void 0, input.session)
3963
4035
  ) : Promise.resolve(null);
3964
- const learningsPromise = includeSet.has("learnings") ? import("./dist-4LPXJYVZ.js").then(
4036
+ const learningsPromise = includeSet.has("learnings") ? import("./dist-MF5BK5AD.js").then(
3965
4037
  (core) => core.loadBudgetedLearnings(projectPath, {
3966
4038
  intent: input.intent,
3967
4039
  tokenBudget: input.learningsBudget ?? 1e3,
@@ -3970,14 +4042,14 @@ async function handleGatherContext(input) {
3970
4042
  ...input.depth !== void 0 && { depth: input.depth }
3971
4043
  })
3972
4044
  ) : Promise.resolve(null);
3973
- const handoffPromise = includeSet.has("handoff") ? import("./dist-4LPXJYVZ.js").then(
4045
+ const handoffPromise = includeSet.has("handoff") ? import("./dist-MF5BK5AD.js").then(
3974
4046
  (core) => core.loadHandoff(projectPath, void 0, input.session)
3975
4047
  ) : Promise.resolve(null);
3976
4048
  const graphPromise = includeSet.has("graph") ? (async () => {
3977
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
4049
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
3978
4050
  const store = await loadGraphStore2(projectPath);
3979
4051
  if (!store) return null;
3980
- const { FusionLayer, ContextQL } = await import("./dist-B26DFXMP.js");
4052
+ const { FusionLayer, ContextQL } = await import("./dist-U7EAO6T2.js");
3981
4053
  const fusion = new FusionLayer(store);
3982
4054
  const cql = new ContextQL(store);
3983
4055
  const tokenBudget = input.tokenBudget ?? 4e3;
@@ -4014,11 +4086,11 @@ async function handleGatherContext(input) {
4014
4086
  context: contextBlocks
4015
4087
  };
4016
4088
  })() : Promise.resolve(null);
4017
- const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-4LPXJYVZ.js").then(
4089
+ const sessionsPromise = includeSet.has("sessions") && input.session ? import("./dist-MF5BK5AD.js").then(
4018
4090
  (core) => core.readSessionSections(projectPath, input.session)
4019
4091
  ) : Promise.resolve(null);
4020
4092
  const shouldIncludeEvents = input.includeEvents !== void 0 ? input.includeEvents : includeSet.has("events") || !!input.session && !input.include;
4021
- const eventsPromise = shouldIncludeEvents ? import("./dist-4LPXJYVZ.js").then(async (core) => {
4093
+ const eventsPromise = shouldIncludeEvents ? import("./dist-MF5BK5AD.js").then(async (core) => {
4022
4094
  const result = await core.loadEvents(projectPath, {
4023
4095
  session: input.session
4024
4096
  });
@@ -4026,7 +4098,7 @@ async function handleGatherContext(input) {
4026
4098
  return core.formatEventTimeline(result.value);
4027
4099
  }) : Promise.resolve(null);
4028
4100
  const validationPromise = includeSet.has("validation") ? (async () => {
4029
- const { handleValidateProject: handleValidateProject2 } = await import("./validate-VRTUHALQ.js");
4101
+ const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
4030
4102
  const result = await handleValidateProject2({ path: projectPath });
4031
4103
  const first = result.content[0];
4032
4104
  return first ? JSON.parse(first.text) : null;
@@ -4120,7 +4192,7 @@ async function handleGatherContext(input) {
4120
4192
  };
4121
4193
  if (input.session) {
4122
4194
  try {
4123
- const core = await import("./dist-4LPXJYVZ.js");
4195
+ const core = await import("./dist-MF5BK5AD.js");
4124
4196
  core.updateSessionIndex(
4125
4197
  projectPath,
4126
4198
  input.session,
@@ -4190,7 +4262,7 @@ async function handleAssessProject(input) {
4190
4262
  let validateResult = null;
4191
4263
  if (checksToRun.has("validate")) {
4192
4264
  try {
4193
- const { handleValidateProject: handleValidateProject2 } = await import("./validate-VRTUHALQ.js");
4265
+ const { handleValidateProject: handleValidateProject2 } = await import("./validate-SPSTH2YW.js");
4194
4266
  const result = await handleValidateProject2({ path: projectPath });
4195
4267
  const first = result.content[0];
4196
4268
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4215,7 +4287,7 @@ async function handleAssessProject(input) {
4215
4287
  parallelChecks.push(
4216
4288
  (async () => {
4217
4289
  try {
4218
- const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-K5HSRBGB.js");
4290
+ const { handleCheckDependencies: handleCheckDependencies2 } = await import("./architecture-UBO5KKUV.js");
4219
4291
  const result = await handleCheckDependencies2({ path: projectPath });
4220
4292
  const first = result.content[0];
4221
4293
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4242,7 +4314,7 @@ async function handleAssessProject(input) {
4242
4314
  parallelChecks.push(
4243
4315
  (async () => {
4244
4316
  try {
4245
- const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-4JRHTLUZ.js");
4317
+ const { handleCheckDocs: handleCheckDocs2 } = await import("./docs-WZHW4N4P.js");
4246
4318
  const result = await handleCheckDocs2({ path: projectPath, scope: "coverage" });
4247
4319
  const first = result.content[0];
4248
4320
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4269,7 +4341,7 @@ async function handleAssessProject(input) {
4269
4341
  parallelChecks.push(
4270
4342
  (async () => {
4271
4343
  try {
4272
- const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-G6CZ2A6P.js");
4344
+ const { handleDetectEntropy: handleDetectEntropy2 } = await import("./entropy-FCIGJIIT.js");
4273
4345
  const result = await handleDetectEntropy2({ path: projectPath, type: "all" });
4274
4346
  const first = result.content[0];
4275
4347
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4296,7 +4368,7 @@ async function handleAssessProject(input) {
4296
4368
  parallelChecks.push(
4297
4369
  (async () => {
4298
4370
  try {
4299
- const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-ZDADTPYW.js");
4371
+ const { handleRunSecurityScan: handleRunSecurityScan2 } = await import("./security-HTDKKGMX.js");
4300
4372
  const result = await handleRunSecurityScan2({ path: projectPath });
4301
4373
  const first = result.content[0];
4302
4374
  const parsed = first ? JSON.parse(first.text) : {};
@@ -4328,7 +4400,7 @@ async function handleAssessProject(input) {
4328
4400
  parallelChecks.push(
4329
4401
  (async () => {
4330
4402
  try {
4331
- const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-UBCFI2UP.js");
4403
+ const { handleCheckPerformance: handleCheckPerformance2 } = await import("./performance-NMJDV6HF.js");
4332
4404
  const result = await handleCheckPerformance2({ path: projectPath });
4333
4405
  if ("isError" in result && result.isError) {
4334
4406
  const msg = result.content[0]?.text ?? "Performance check failed";
@@ -4531,7 +4603,7 @@ async function handleReviewChanges(input) {
4531
4603
  }
4532
4604
  }
4533
4605
  async function runQuickReview(projectPath, diff, diffLines, downgraded) {
4534
- const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-QYKQ65HB.js");
4606
+ const { handleAnalyzeDiff: handleAnalyzeDiff2 } = await import("./feedback-O3FYTZIE.js");
4535
4607
  const result = await handleAnalyzeDiff2({ diff, path: projectPath });
4536
4608
  const firstContent = result.content[0];
4537
4609
  if (!firstContent) throw new Error("Empty analyze_diff response");
@@ -4562,7 +4634,7 @@ function extractFileCount(diffParsed) {
4562
4634
  return files?.length ?? 0;
4563
4635
  }
4564
4636
  async function runStandardReview(projectPath, diff, diffLines, downgraded) {
4565
- const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-QYKQ65HB.js");
4637
+ const { handleAnalyzeDiff: handleAnalyzeDiff2, handleCreateSelfReview: handleCreateSelfReview2 } = await import("./feedback-O3FYTZIE.js");
4566
4638
  const [diffResult, reviewResult] = await Promise.all([
4567
4639
  handleAnalyzeDiff2({ diff, path: projectPath }),
4568
4640
  handleCreateSelfReview2({ path: projectPath, diff })
@@ -4594,7 +4666,7 @@ async function runStandardReview(projectPath, diff, diffLines, downgraded) {
4594
4666
  };
4595
4667
  }
4596
4668
  async function runDeepReview(projectPath, diff, diffLines, _downgraded) {
4597
- const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-IQAVCWAX.js");
4669
+ const { handleRunCodeReview: handleRunCodeReview2 } = await import("./review-pipeline-MSEJWTKM.js");
4598
4670
  const result = await handleRunCodeReview2({ path: projectPath, diff });
4599
4671
  const deepContent = result.content[0];
4600
4672
  if (!deepContent) throw new Error("Empty code review response");
@@ -4665,7 +4737,7 @@ async function handleCheckTaskIndependence(input) {
4665
4737
  try {
4666
4738
  const projectPath = sanitizePath(input.path);
4667
4739
  const store = await loadGraphStore(projectPath);
4668
- const { TaskIndependenceAnalyzer } = await import("./dist-B26DFXMP.js");
4740
+ const { TaskIndependenceAnalyzer } = await import("./dist-U7EAO6T2.js");
4669
4741
  const analyzer = new TaskIndependenceAnalyzer(store ?? void 0);
4670
4742
  const result = analyzer.analyze({
4671
4743
  tasks: input.tasks,
@@ -4753,7 +4825,7 @@ async function handlePredictConflicts(input) {
4753
4825
  try {
4754
4826
  const projectPath = sanitizePath(input.path);
4755
4827
  const store = await loadGraphStore(projectPath);
4756
- const { ConflictPredictor } = await import("./dist-B26DFXMP.js");
4828
+ const { ConflictPredictor } = await import("./dist-U7EAO6T2.js");
4757
4829
  const predictor = new ConflictPredictor(store ?? void 0);
4758
4830
  const result = predictor.predict({
4759
4831
  tasks: input.tasks,
@@ -4859,7 +4931,7 @@ async function handleDetectStaleConstraints(input) {
4859
4931
  isError: true
4860
4932
  };
4861
4933
  }
4862
- const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-2M2HXDQI.js");
4934
+ const { loadGraphStore: loadGraphStore2 } = await import("./graph-loader-KMHDQYDT.js");
4863
4935
  const store = await loadGraphStore2(projectPath);
4864
4936
  if (!store) {
4865
4937
  return {
@@ -4880,7 +4952,7 @@ async function handleDetectStaleConstraints(input) {
4880
4952
  ]
4881
4953
  };
4882
4954
  }
4883
- const { detectStaleConstraints } = await import("./dist-4LPXJYVZ.js");
4955
+ const { detectStaleConstraints } = await import("./dist-MF5BK5AD.js");
4884
4956
  const result = detectStaleConstraints(
4885
4957
  store,
4886
4958
  windowDays,
@@ -5012,7 +5084,7 @@ async function handleCodeOutline(input) {
5012
5084
  };
5013
5085
  }
5014
5086
  try {
5015
- const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-4LPXJYVZ.js");
5087
+ const { getOutline, formatOutline, EXTENSION_MAP } = await import("./dist-MF5BK5AD.js");
5016
5088
  const { stat } = await import("fs/promises");
5017
5089
  const stats = await stat(targetPath).catch(() => null);
5018
5090
  if (stats?.isFile()) {
@@ -5092,7 +5164,7 @@ async function handleCodeSearch(input) {
5092
5164
  };
5093
5165
  }
5094
5166
  try {
5095
- const { searchSymbols } = await import("./dist-4LPXJYVZ.js");
5167
+ const { searchSymbols } = await import("./dist-MF5BK5AD.js");
5096
5168
  const result = await searchSymbols(input.query, directory, input.glob);
5097
5169
  const lines = [`Search: "${result.query}" \u2014 ${result.matches.length} matches`];
5098
5170
  for (const match of result.matches) {
@@ -5161,7 +5233,7 @@ async function handleCodeUnfold(input) {
5161
5233
  }
5162
5234
  try {
5163
5235
  if (input.symbol) {
5164
- const { unfoldSymbol } = await import("./dist-4LPXJYVZ.js");
5236
+ const { unfoldSymbol } = await import("./dist-MF5BK5AD.js");
5165
5237
  const result = await unfoldSymbol(filePath, input.symbol);
5166
5238
  const header = result.warning ? `${result.file}:${result.startLine}-${result.endLine} ${result.warning}
5167
5239
  ` : `${result.file}:${result.startLine}-${result.endLine}
@@ -5169,7 +5241,7 @@ async function handleCodeUnfold(input) {
5169
5241
  return { content: [{ type: "text", text: header + result.content }] };
5170
5242
  }
5171
5243
  if (input.startLine != null && input.endLine != null) {
5172
- const { unfoldRange } = await import("./dist-4LPXJYVZ.js");
5244
+ const { unfoldRange } = await import("./dist-MF5BK5AD.js");
5173
5245
  const result = await unfoldRange(filePath, input.startLine, input.endLine);
5174
5246
  const header = `${result.file}:${result.startLine}-${result.endLine}
5175
5247
  `;
@@ -5384,7 +5456,7 @@ async function appendUpdateNotification(result, resolvedRoot) {
5384
5456
  shouldRunCheck,
5385
5457
  readCheckState,
5386
5458
  spawnBackgroundCheck
5387
- } = await import("./dist-4LPXJYVZ.js");
5459
+ } = await import("./dist-MF5BK5AD.js");
5388
5460
  const { CLI_VERSION } = await import("./version-KFFPOQAX.js");
5389
5461
  const configInterval = readConfigInterval(resolvedRoot);
5390
5462
  const DEFAULT_INTERVAL = 864e5;