@iloom/cli 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +2 -2
  3. package/dist/{BranchNamingService-ECJHBB67.js → BranchNamingService-25KSZAEM.js} +2 -2
  4. package/dist/ClaudeContextManager-66GR4BGM.js +14 -0
  5. package/dist/ClaudeService-7KM5NA5Z.js +13 -0
  6. package/dist/{LoomLauncher-L64HHS3T.js → LoomLauncher-TDLZSYG2.js} +6 -6
  7. package/dist/{PromptTemplateManager-DULSVRRE.js → PromptTemplateManager-YOE2SIPG.js} +2 -2
  8. package/dist/README.md +2 -2
  9. package/dist/{SettingsManager-BQDQA3FK.js → SettingsManager-FNKCOZMQ.js} +2 -2
  10. package/dist/{build-5GO3XW26.js → build-VHGEMXBA.js} +6 -6
  11. package/dist/chunk-4E7LCFUG.js +24 -0
  12. package/dist/chunk-4E7LCFUG.js.map +1 -0
  13. package/dist/{chunk-MNHZB4Z2.js → chunk-4FGEGQW4.js} +3 -3
  14. package/dist/{chunk-LXLMMXXY.js → chunk-5FJWO4IT.js} +17 -12
  15. package/dist/chunk-5FJWO4IT.js.map +1 -0
  16. package/dist/{chunk-ZHPNZC75.js → chunk-5RPBYK5Q.js} +26 -21
  17. package/dist/chunk-5RPBYK5Q.js.map +1 -0
  18. package/dist/{chunk-WY4QBK43.js → chunk-63QWFWH3.js} +2 -2
  19. package/dist/{chunk-YYAKPQBT.js → chunk-7VHJNVLF.js} +19 -9
  20. package/dist/chunk-7VHJNVLF.js.map +1 -0
  21. package/dist/{chunk-SF2P22EE.js → chunk-C6HNNJIV.js} +2 -2
  22. package/dist/{chunk-5MWV33NN.js → chunk-CVCTIDDK.js} +2 -2
  23. package/dist/{chunk-RYWFS37M.js → chunk-E6KOWMKA.js} +2 -2
  24. package/dist/{chunk-6EU6TCF6.js → chunk-EVPZFV3K.js} +5 -5
  25. package/dist/{chunk-ZEWU5PZK.js → chunk-G5V75JD5.js} +2 -2
  26. package/dist/chunk-GRISNU6G.js +651 -0
  27. package/dist/chunk-GRISNU6G.js.map +1 -0
  28. package/dist/{chunk-VGGST52X.js → chunk-I5T677EA.js} +2 -2
  29. package/dist/{chunk-VECNX6VX.js → chunk-KIK2ZFAL.js} +2 -2
  30. package/dist/{chunk-FB47TIJG.js → chunk-KKV5WH5M.js} +4 -23
  31. package/dist/chunk-KKV5WH5M.js.map +1 -0
  32. package/dist/{chunk-ZW2LKWWE.js → chunk-KVHIAWVT.js} +3 -3
  33. package/dist/{chunk-3D7WQM7I.js → chunk-LLHXQS3C.js} +2 -2
  34. package/dist/{chunk-Y4YZTHZE.js → chunk-LUKXJSRI.js} +2 -2
  35. package/dist/{ignite-CGOV3TD4.js → chunk-OTGH2HRS.js} +105 -71
  36. package/dist/chunk-OTGH2HRS.js.map +1 -0
  37. package/dist/{chunk-J5S7DFYC.js → chunk-QVLPWNE3.js} +2 -2
  38. package/dist/chunk-RJ3VBUFK.js +781 -0
  39. package/dist/chunk-RJ3VBUFK.js.map +1 -0
  40. package/dist/{chunk-SN3SQCFK.js → chunk-S7PZA6IV.js} +4 -4
  41. package/dist/{chunk-UWGVCXRF.js → chunk-SKSYYBCU.js} +23 -1
  42. package/dist/chunk-SKSYYBCU.js.map +1 -0
  43. package/dist/{chunk-JO2LZ6EQ.js → chunk-SWSJWA2S.js} +2 -2
  44. package/dist/{chunk-ONQYPICO.js → chunk-UR5DGNUO.js} +60 -6
  45. package/dist/chunk-UR5DGNUO.js.map +1 -0
  46. package/dist/{chunk-4WJNIR5O.js → chunk-UUEW5KWB.js} +1 -1
  47. package/dist/chunk-UUEW5KWB.js.map +1 -0
  48. package/dist/{chunk-NRSWLOAZ.js → chunk-WXIM2WS7.js} +4 -4
  49. package/dist/{chunk-UD3WJDIV.js → chunk-ZNMPGMHY.js} +11 -774
  50. package/dist/chunk-ZNMPGMHY.js.map +1 -0
  51. package/dist/{claude-P3NQR6IJ.js → claude-7GGEWVEM.js} +2 -2
  52. package/dist/{cleanup-6UCPVMFG.js → cleanup-6PVAC4NI.js} +19 -17
  53. package/dist/{cleanup-6UCPVMFG.js.map → cleanup-6PVAC4NI.js.map} +1 -1
  54. package/dist/cli.js +154 -614
  55. package/dist/cli.js.map +1 -1
  56. package/dist/{commit-L3EPY5QG.js → commit-FZR5XDQG.js} +12 -10
  57. package/dist/commit-FZR5XDQG.js.map +1 -0
  58. package/dist/{compile-ZS4HYRX5.js → compile-7ALJHZ4N.js} +6 -6
  59. package/dist/{contribute-ORDDQGSL.js → contribute-5GKLK3BQ.js} +3 -3
  60. package/dist/{dev-server-FYZ2AQIH.js → dev-server-7SMIB7OF.js} +8 -8
  61. package/dist/{feedback-TMBXSCM5.js → feedback-G2GJFN2F.js} +10 -8
  62. package/dist/{feedback-TMBXSCM5.js.map → feedback-G2GJFN2F.js.map} +1 -1
  63. package/dist/{git-ET64COO3.js → git-GTLKAZRJ.js} +3 -3
  64. package/dist/ignite-H2O5Y5A2.js +34 -0
  65. package/dist/ignite-H2O5Y5A2.js.map +1 -0
  66. package/dist/index.d.ts +113 -18
  67. package/dist/index.js +177 -12
  68. package/dist/index.js.map +1 -1
  69. package/dist/{init-GFQ5W7GK.js → init-32YOKXRL.js} +8 -8
  70. package/dist/{issues-T4ZZSPEG.js → issues-4UUAQ5K6.js} +3 -3
  71. package/dist/{lint-6TQXDZ3T.js → lint-AAN2NZWG.js} +6 -6
  72. package/dist/mcp/harness-server.js +140 -0
  73. package/dist/mcp/harness-server.js.map +1 -0
  74. package/dist/mcp/issue-management-server.js +140 -18
  75. package/dist/mcp/issue-management-server.js.map +1 -1
  76. package/dist/{open-5QZGXQRF.js → open-FXWW3VI4.js} +8 -8
  77. package/dist/{plan-U7ZQWLFY.js → plan-RQ5FPIGF.js} +338 -36
  78. package/dist/plan-RQ5FPIGF.js.map +1 -0
  79. package/dist/prompts/CLAUDE.md +2 -2
  80. package/dist/prompts/init-prompt.txt +102 -27
  81. package/dist/prompts/issue-prompt.txt +46 -0
  82. package/dist/prompts/plan-prompt.txt +59 -19
  83. package/dist/prompts/swarm-orchestrator-prompt.txt +107 -80
  84. package/dist/{rebase-DWIB77KV.js → rebase-6NVLX5V7.js} +17 -8
  85. package/dist/rebase-6NVLX5V7.js.map +1 -0
  86. package/dist/{recap-MX63HAKV.js → recap-OMBOKJST.js} +6 -6
  87. package/dist/{run-O3TFNQFC.js → run-BBXLRIZB.js} +8 -8
  88. package/dist/schema/settings.schema.json +36 -2
  89. package/dist/{shell-G6VC2CYR.js → shell-RF7LTND5.js} +5 -5
  90. package/dist/{summary-FWHAX55O.js → summary-WTQZ7XG2.js} +9 -9
  91. package/dist/{test-F7JNJZYP.js → test-SGO6I5Z7.js} +6 -6
  92. package/dist/{test-git-BTAOIUE2.js → test-git-XM4TM65W.js} +3 -3
  93. package/dist/{test-jira-CHYNV33F.js → test-jira-LDTOYFSD.js} +3 -3
  94. package/dist/{test-prefix-Q6TFSU6F.js → test-prefix-GBO37XCN.js} +3 -3
  95. package/dist/{test-webserver-EONCG7E7.js → test-webserver-NZ3JTVLL.js} +5 -5
  96. package/dist/{vscode-VA5X4P25.js → vscode-6XUGHJKL.js} +5 -5
  97. package/package.json +1 -1
  98. package/dist/ClaudeContextManager-QXX6ZFST.js +0 -14
  99. package/dist/ClaudeService-NJNK2SUH.js +0 -13
  100. package/dist/chunk-4WJNIR5O.js.map +0 -1
  101. package/dist/chunk-FB47TIJG.js.map +0 -1
  102. package/dist/chunk-LXLMMXXY.js.map +0 -1
  103. package/dist/chunk-ONQYPICO.js.map +0 -1
  104. package/dist/chunk-UD3WJDIV.js.map +0 -1
  105. package/dist/chunk-UVD4CZKS.js +0 -101
  106. package/dist/chunk-UVD4CZKS.js.map +0 -1
  107. package/dist/chunk-UWGVCXRF.js.map +0 -1
  108. package/dist/chunk-YYAKPQBT.js.map +0 -1
  109. package/dist/chunk-ZHPNZC75.js.map +0 -1
  110. package/dist/commit-L3EPY5QG.js.map +0 -1
  111. package/dist/ignite-CGOV3TD4.js.map +0 -1
  112. package/dist/plan-U7ZQWLFY.js.map +0 -1
  113. package/dist/rebase-DWIB77KV.js.map +0 -1
  114. /package/dist/{BranchNamingService-ECJHBB67.js.map → BranchNamingService-25KSZAEM.js.map} +0 -0
  115. /package/dist/{ClaudeContextManager-QXX6ZFST.js.map → ClaudeContextManager-66GR4BGM.js.map} +0 -0
  116. /package/dist/{ClaudeService-NJNK2SUH.js.map → ClaudeService-7KM5NA5Z.js.map} +0 -0
  117. /package/dist/{LoomLauncher-L64HHS3T.js.map → LoomLauncher-TDLZSYG2.js.map} +0 -0
  118. /package/dist/{PromptTemplateManager-DULSVRRE.js.map → PromptTemplateManager-YOE2SIPG.js.map} +0 -0
  119. /package/dist/{SettingsManager-BQDQA3FK.js.map → SettingsManager-FNKCOZMQ.js.map} +0 -0
  120. /package/dist/{build-5GO3XW26.js.map → build-VHGEMXBA.js.map} +0 -0
  121. /package/dist/{chunk-MNHZB4Z2.js.map → chunk-4FGEGQW4.js.map} +0 -0
  122. /package/dist/{chunk-WY4QBK43.js.map → chunk-63QWFWH3.js.map} +0 -0
  123. /package/dist/{chunk-SF2P22EE.js.map → chunk-C6HNNJIV.js.map} +0 -0
  124. /package/dist/{chunk-5MWV33NN.js.map → chunk-CVCTIDDK.js.map} +0 -0
  125. /package/dist/{chunk-RYWFS37M.js.map → chunk-E6KOWMKA.js.map} +0 -0
  126. /package/dist/{chunk-6EU6TCF6.js.map → chunk-EVPZFV3K.js.map} +0 -0
  127. /package/dist/{chunk-ZEWU5PZK.js.map → chunk-G5V75JD5.js.map} +0 -0
  128. /package/dist/{chunk-VGGST52X.js.map → chunk-I5T677EA.js.map} +0 -0
  129. /package/dist/{chunk-VECNX6VX.js.map → chunk-KIK2ZFAL.js.map} +0 -0
  130. /package/dist/{chunk-ZW2LKWWE.js.map → chunk-KVHIAWVT.js.map} +0 -0
  131. /package/dist/{chunk-3D7WQM7I.js.map → chunk-LLHXQS3C.js.map} +0 -0
  132. /package/dist/{chunk-Y4YZTHZE.js.map → chunk-LUKXJSRI.js.map} +0 -0
  133. /package/dist/{chunk-J5S7DFYC.js.map → chunk-QVLPWNE3.js.map} +0 -0
  134. /package/dist/{chunk-SN3SQCFK.js.map → chunk-S7PZA6IV.js.map} +0 -0
  135. /package/dist/{chunk-JO2LZ6EQ.js.map → chunk-SWSJWA2S.js.map} +0 -0
  136. /package/dist/{chunk-NRSWLOAZ.js.map → chunk-WXIM2WS7.js.map} +0 -0
  137. /package/dist/{claude-P3NQR6IJ.js.map → claude-7GGEWVEM.js.map} +0 -0
  138. /package/dist/{compile-ZS4HYRX5.js.map → compile-7ALJHZ4N.js.map} +0 -0
  139. /package/dist/{contribute-ORDDQGSL.js.map → contribute-5GKLK3BQ.js.map} +0 -0
  140. /package/dist/{dev-server-FYZ2AQIH.js.map → dev-server-7SMIB7OF.js.map} +0 -0
  141. /package/dist/{git-ET64COO3.js.map → git-GTLKAZRJ.js.map} +0 -0
  142. /package/dist/{init-GFQ5W7GK.js.map → init-32YOKXRL.js.map} +0 -0
  143. /package/dist/{issues-T4ZZSPEG.js.map → issues-4UUAQ5K6.js.map} +0 -0
  144. /package/dist/{lint-6TQXDZ3T.js.map → lint-AAN2NZWG.js.map} +0 -0
  145. /package/dist/{open-5QZGXQRF.js.map → open-FXWW3VI4.js.map} +0 -0
  146. /package/dist/{recap-MX63HAKV.js.map → recap-OMBOKJST.js.map} +0 -0
  147. /package/dist/{run-O3TFNQFC.js.map → run-BBXLRIZB.js.map} +0 -0
  148. /package/dist/{shell-G6VC2CYR.js.map → shell-RF7LTND5.js.map} +0 -0
  149. /package/dist/{summary-FWHAX55O.js.map → summary-WTQZ7XG2.js.map} +0 -0
  150. /package/dist/{test-F7JNJZYP.js.map → test-SGO6I5Z7.js.map} +0 -0
  151. /package/dist/{test-git-BTAOIUE2.js.map → test-git-XM4TM65W.js.map} +0 -0
  152. /package/dist/{test-jira-CHYNV33F.js.map → test-jira-LDTOYFSD.js.map} +0 -0
  153. /package/dist/{test-prefix-Q6TFSU6F.js.map → test-prefix-GBO37XCN.js.map} +0 -0
  154. /package/dist/{test-webserver-EONCG7E7.js.map → test-webserver-NZ3JTVLL.js.map} +0 -0
  155. /package/dist/{vscode-VA5X4P25.js.map → vscode-6XUGHJKL.js.map} +0 -0
@@ -5,11 +5,10 @@ import {
5
5
  } from "./chunk-QZWEJVWV.js";
6
6
  import {
7
7
  IssueManagementProviderFactory
8
- } from "./chunk-JO2LZ6EQ.js";
9
- import "./chunk-4232AHNQ.js";
8
+ } from "./chunk-SWSJWA2S.js";
10
9
  import {
11
10
  getWorkspacePort
12
- } from "./chunk-3D7WQM7I.js";
11
+ } from "./chunk-LLHXQS3C.js";
13
12
  import {
14
13
  installDependencies
15
14
  } from "./chunk-WWKOVDWC.js";
@@ -18,7 +17,7 @@ import {
18
17
  } from "./chunk-RSYT7MVI.js";
19
18
  import {
20
19
  GitWorktreeManager
21
- } from "./chunk-VGGST52X.js";
20
+ } from "./chunk-I5T677EA.js";
22
21
  import {
23
22
  FirstRunManager
24
23
  } from "./chunk-Q7POFB5Q.js";
@@ -26,18 +25,17 @@ import {
26
25
  generateAndWriteMcpConfigFile,
27
26
  generateIssueManagementMcpConfig,
28
27
  generateRecapMcpConfig
29
- } from "./chunk-UWGVCXRF.js";
30
- import "./chunk-YQ57ORTV.js";
28
+ } from "./chunk-SKSYYBCU.js";
31
29
  import {
32
30
  AgentManager
33
- } from "./chunk-SF2P22EE.js";
31
+ } from "./chunk-C6HNNJIV.js";
34
32
  import {
35
33
  launchClaude
36
- } from "./chunk-ONQYPICO.js";
34
+ } from "./chunk-UR5DGNUO.js";
37
35
  import {
38
36
  PromptTemplateManager,
39
37
  buildReviewTemplateVariables
40
- } from "./chunk-4WJNIR5O.js";
38
+ } from "./chunk-UUEW5KWB.js";
41
39
  import {
42
40
  extractSettingsOverrides
43
41
  } from "./chunk-GYCR2LOU.js";
@@ -47,24 +45,20 @@ import {
47
45
  generateWorktreePath,
48
46
  getWorktreeRoot,
49
47
  isValidGitRepo
50
- } from "./chunk-MNHZB4Z2.js";
48
+ } from "./chunk-4FGEGQW4.js";
51
49
  import {
52
50
  SettingsManager
53
- } from "./chunk-YYAKPQBT.js";
51
+ } from "./chunk-7VHJNVLF.js";
54
52
  import {
55
53
  MetadataManager
56
54
  } from "./chunk-KB64WNBZ.js";
57
55
  import {
58
56
  IssueTrackerFactory
59
57
  } from "./chunk-UKBAJ2QQ.js";
60
- import "./chunk-HEXKPKCK.js";
61
- import "./chunk-KXDRI47U.js";
62
- import "./chunk-VG45TUYK.js";
63
58
  import {
64
59
  getLogger,
65
60
  withLogger
66
61
  } from "./chunk-6MLEBAYZ.js";
67
- import "./chunk-7JDMYTFZ.js";
68
62
  import {
69
63
  createStderrLogger,
70
64
  logger
@@ -308,8 +302,7 @@ var SwarmSetupService = class {
308
302
  * @returns Array of results for each child worktree creation
309
303
  */
310
304
  async createChildWorktrees(childIssues, epicBranch, epicWorktreePath, mainWorktreePath, epicIssueNumber, issueTrackerName, settings) {
311
- const results = [];
312
- for (const child of childIssues) {
305
+ return Promise.all(childIssues.map(async (child) => {
313
306
  try {
314
307
  const rawId = child.number.replace(/^#/, "");
315
308
  const safeId = rawId.replace(/[^a-zA-Z0-9-_]/g, "-");
@@ -393,27 +386,26 @@ var SwarmSetupService = class {
393
386
  `Failed to install dependencies in child worktree ${child.number}: ${error instanceof Error ? error.message : "Unknown error"}`
394
387
  );
395
388
  }
396
- results.push({
389
+ getLogger().success(`Created child worktree for ${child.number}`);
390
+ return {
397
391
  issueId: rawId,
398
392
  worktreePath: childWorktreePath,
399
393
  branch: childBranch,
400
394
  success: true
401
- });
402
- getLogger().success(`Created child worktree for ${child.number}`);
395
+ };
403
396
  } catch (error) {
404
397
  const rawId = child.number.replace(/^#/, "");
405
398
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
406
399
  getLogger().warn(`Failed to create child worktree for ${child.number}: ${errorMessage}`);
407
- results.push({
400
+ return {
408
401
  issueId: rawId,
409
402
  worktreePath: "",
410
403
  branch: "",
411
404
  success: false,
412
405
  error: errorMessage
413
- });
406
+ };
414
407
  }
415
- }
416
- return results;
408
+ }));
417
409
  }
418
410
  /**
419
411
  * Render swarm-mode agent templates to the epic worktree's .claude/agents/ directory.
@@ -432,20 +424,21 @@ var SwarmSetupService = class {
432
424
  SWARM_MODE: true
433
425
  };
434
426
  const agents = await this.agentManager.loadAgents(settings, templateVariables);
435
- const swarmWorkerSettings = (_a = settings == null ? void 0 : settings.agents) == null ? void 0 : _a["iloom-swarm-worker"];
436
- const swarmAgentOverrides = swarmWorkerSettings == null ? void 0 : swarmWorkerSettings.agents;
437
- const swarmWorkerModel = swarmWorkerSettings == null ? void 0 : swarmWorkerSettings.model;
438
- const swarmAgentDefaults = {
439
- "iloom-issue-implementer": "sonnet"
427
+ const defaultSwarmModels = {
428
+ "iloom-issue-analyzer": "opus",
429
+ "iloom-issue-analyze-and-plan": "opus",
430
+ "iloom-issue-planner": "sonnet",
431
+ "iloom-issue-implementer": "sonnet",
432
+ "iloom-issue-enhancer": "sonnet",
433
+ "iloom-code-reviewer": "sonnet",
434
+ "iloom-issue-complexity-evaluator": "haiku"
440
435
  };
441
436
  for (const [agentName, agentConfig] of Object.entries(agents)) {
442
- const swarmOverrideModel = (_b = swarmAgentOverrides == null ? void 0 : swarmAgentOverrides[agentName]) == null ? void 0 : _b.model;
443
- if (swarmOverrideModel) {
444
- agents[agentName] = { ...agentConfig, model: swarmOverrideModel };
445
- } else if (swarmWorkerModel) {
446
- agents[agentName] = { ...agentConfig, model: swarmWorkerModel };
447
- } else if (swarmAgentDefaults[agentName]) {
448
- agents[agentName] = { ...agentConfig, model: swarmAgentDefaults[agentName] };
437
+ const userSwarmModel = (_b = (_a = settings == null ? void 0 : settings.agents) == null ? void 0 : _a[agentName]) == null ? void 0 : _b.swarmModel;
438
+ if (userSwarmModel) {
439
+ agents[agentName] = { ...agentConfig, model: userSwarmModel };
440
+ } else if (defaultSwarmModels[agentName]) {
441
+ agents[agentName] = { ...agentConfig, model: defaultSwarmModels[agentName] };
449
442
  }
450
443
  }
451
444
  const renderedFiles = [];
@@ -478,7 +471,7 @@ var SwarmSetupService = class {
478
471
  * worktree path, body) is provided per-child via the Task prompt from the orchestrator.
479
472
  */
480
473
  async renderSwarmWorkerAgent(epicWorktreePath, agentMetadata) {
481
- var _a, _b, _c;
474
+ var _a, _b, _c, _d, _e;
482
475
  const agentsDir = path2.join(epicWorktreePath, ".claude", "agents");
483
476
  const agentOutputPath = path2.join(agentsDir, "iloom-swarm-worker.md");
484
477
  await fs2.ensureDir(agentsDir);
@@ -486,16 +479,19 @@ var SwarmSetupService = class {
486
479
  const settings = await this.settingsManager.loadSettings();
487
480
  const providerType = ((_a = settings == null ? void 0 : settings.issueManagement) == null ? void 0 : _a.provider) ?? "github";
488
481
  const issuePrefix = IssueManagementProviderFactory.create(providerType, settings ?? void 0).issuePrefix;
482
+ const subAgentTimeoutMinutes = ((_c = (_b = settings == null ? void 0 : settings.agents) == null ? void 0 : _b["iloom-swarm-worker"]) == null ? void 0 : _c.subAgentTimeout) ?? 10;
483
+ const subAgentTimeoutMs = subAgentTimeoutMinutes * 60 * 1e3;
489
484
  const variables = {
490
485
  SWARM_MODE: true,
491
486
  ONE_SHOT_MODE: true,
492
487
  EPIC_WORKTREE_PATH: epicWorktreePath,
493
488
  ISSUE_PREFIX: issuePrefix,
489
+ SWARM_SUB_AGENT_TIMEOUT_MS: subAgentTimeoutMs,
494
490
  ...agentMetadata && { SWARM_AGENT_METADATA: JSON.stringify(agentMetadata) },
495
491
  ...buildReviewTemplateVariables(settings == null ? void 0 : settings.agents)
496
492
  };
497
493
  const agentBody = await this.templateManager.getPrompt("issue", variables);
498
- const workerModel = ((_c = (_b = settings == null ? void 0 : settings.agents) == null ? void 0 : _b["iloom-swarm-worker"]) == null ? void 0 : _c.model) ?? "sonnet";
494
+ const workerModel = ((_e = (_d = settings == null ? void 0 : settings.agents) == null ? void 0 : _d["iloom-swarm-worker"]) == null ? void 0 : _e.model) ?? "opus";
499
495
  const frontmatter = [
500
496
  "---",
501
497
  "name: iloom-swarm-worker",
@@ -517,6 +513,33 @@ ${agentBody}
517
513
  return false;
518
514
  }
519
515
  }
516
+ /**
517
+ * Copy .claude/agents/ from the epic worktree to each child worktree.
518
+ *
519
+ * Child workers need local access to agent files (used via --append-system-prompt-file).
520
+ * Without this copy, child worktrees lack the rendered agent files since they only
521
+ * exist in the epic worktree after renderSwarmAgents/renderSwarmWorkerAgent.
522
+ */
523
+ async copyAgentsToChildWorktrees(epicWorktreePath, childWorktrees) {
524
+ const sourceDir = path2.join(epicWorktreePath, ".claude", "agents");
525
+ if (!await fs2.pathExists(sourceDir)) {
526
+ getLogger().warn("No .claude/agents/ directory in epic worktree to copy");
527
+ return;
528
+ }
529
+ const successfulChildren = childWorktrees.filter((c) => c.success);
530
+ await Promise.all(successfulChildren.map(async (child) => {
531
+ try {
532
+ const targetDir = path2.join(child.worktreePath, ".claude", "agents");
533
+ await fs2.copy(sourceDir, targetDir, { overwrite: true });
534
+ getLogger().debug(`Copied .claude/agents/ to ${child.worktreePath}`);
535
+ } catch (error) {
536
+ getLogger().warn(
537
+ `Failed to copy agents to child worktree ${child.issueId}: ${error instanceof Error ? error.message : "Unknown error"}`
538
+ );
539
+ }
540
+ }));
541
+ getLogger().success(`Copied agents to ${successfulChildren.length} child worktrees`);
542
+ }
520
543
  /**
521
544
  * Run the full swarm setup: child worktrees, agents, and worker agent.
522
545
  *
@@ -537,6 +560,7 @@ ${agentBody}
537
560
  epicWorktreePath,
538
561
  agentMetadata
539
562
  );
563
+ await this.copyAgentsToChildWorktrees(epicWorktreePath, childWorktrees);
540
564
  const successCount = childWorktrees.filter((c) => c.success).length;
541
565
  const failCount = childWorktrees.filter((c) => !c.success).length;
542
566
  getLogger().success(
@@ -616,10 +640,11 @@ var IgniteCommand = class {
616
640
  }
617
641
  /**
618
642
  * Validate that we're not running from the main worktree
643
+ * @param workspacePath - Optional explicit workspace path; defaults to process.cwd()
619
644
  * @throws WorktreeValidationError if running from main worktree
620
645
  */
621
- async validateNotMainWorktree() {
622
- const currentDir = process.cwd();
646
+ async validateNotMainWorktree(workspacePath) {
647
+ const currentDir = workspacePath ?? process.cwd();
623
648
  const isGitRepo = await isValidGitRepo(currentDir);
624
649
  if (!isGitRepo) {
625
650
  return;
@@ -645,25 +670,27 @@ var IgniteCommand = class {
645
670
  * Main entry point for spin command
646
671
  * @param oneShot - One-shot automation mode
647
672
  * @param printOptions - Print mode options for headless/CI execution
673
+ * @param skipCleanup - Skip cleanup after execution
674
+ * @param workspacePath - Optional explicit workspace path for programmatic invocation (avoids process.chdir())
648
675
  */
649
- async execute(oneShot, printOptions, skipCleanup) {
676
+ async execute(oneShot, printOptions, skipCleanup, workspacePath) {
650
677
  var _a, _b;
651
678
  this.printOptions = printOptions;
652
679
  const isJsonMode = (((_a = this.printOptions) == null ? void 0 : _a.json) ?? false) || (((_b = this.printOptions) == null ? void 0 : _b.jsonStream) ?? false);
653
680
  if (isJsonMode) {
654
681
  const jsonLogger = createStderrLogger();
655
- return withLogger(jsonLogger, () => this.executeInternal(oneShot, skipCleanup));
682
+ return withLogger(jsonLogger, () => this.executeInternal(oneShot, skipCleanup, workspacePath));
656
683
  }
657
- return this.executeInternal(oneShot, skipCleanup);
684
+ return this.executeInternal(oneShot, skipCleanup, workspacePath);
658
685
  }
659
686
  /**
660
687
  * Internal execution method (separated for withLogger wrapping)
661
688
  */
662
- async executeInternal(oneShot, skipCleanup) {
663
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
689
+ async executeInternal(oneShot, skipCleanup, workspacePath) {
690
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;
664
691
  process.env.ILOOM = "1";
665
692
  try {
666
- await this.validateNotMainWorktree();
693
+ await this.validateNotMainWorktree(workspacePath);
667
694
  } catch (error) {
668
695
  if (error instanceof WorktreeValidationError) {
669
696
  logger.error(error.message);
@@ -679,7 +706,7 @@ var IgniteCommand = class {
679
706
  logger.success("Welcome to iloom! Preparing first-time experience...");
680
707
  }
681
708
  await this.hookManager.installHooks();
682
- const context = await this.detectWorkspaceContext();
709
+ const context = await this.detectWorkspaceContext(workspacePath);
683
710
  logger.debug("Auto-detected workspace context", { context });
684
711
  this.logDetectedContext(context);
685
712
  logger.info("\u{1F4DD} Loading prompt template and preparing Claude...");
@@ -687,15 +714,21 @@ var IgniteCommand = class {
687
714
  const metadata = await metadataManager.readMetadata(context.workspacePath);
688
715
  const draftPrNumber = (metadata == null ? void 0 : metadata.draftPrNumber) ?? void 0;
689
716
  const draftPrUrl = draftPrNumber && ((_a = metadata == null ? void 0 : metadata.prUrls) == null ? void 0 : _a[String(draftPrNumber)]) ? metadata.prUrls[String(draftPrNumber)] : void 0;
717
+ if (((_b = metadata == null ? void 0 : metadata.parentLoom) == null ? void 0 : _b.type) === "epic" && metadata.issueType !== "epic") {
718
+ throw new WorktreeValidationError(
719
+ "Cannot run il spin in a child worktree of an epic loom. The swarm orchestrator manages agent execution for these issues.",
720
+ "Run il spin from the parent epic worktree instead to launch the swarm orchestrator."
721
+ );
722
+ }
690
723
  const storedOneShot = (metadata == null ? void 0 : metadata.oneShot) ?? "default";
691
- const isHeadlessForOneShot = ((_b = this.printOptions) == null ? void 0 : _b.print) ?? false;
724
+ const isHeadlessForOneShot = ((_c = this.printOptions) == null ? void 0 : _c.print) ?? false;
692
725
  const effectiveOneShot = isHeadlessForOneShot ? "noReview" : oneShot ?? storedOneShot;
693
726
  if (!this.settings) {
694
727
  const cliOverrides = extractSettingsOverrides();
695
728
  this.settings = await this.settingsManager.loadSettings(void 0, cliOverrides);
696
729
  }
697
730
  try {
698
- const hasNeon = !!((_d = (_c = this.settings) == null ? void 0 : _c.databaseProviders) == null ? void 0 : _d.neon);
731
+ const hasNeon = !!((_e = (_d = this.settings) == null ? void 0 : _d.databaseProviders) == null ? void 0 : _e.neon);
699
732
  const language = await detectProjectLanguage(context.workspacePath);
700
733
  TelemetryService.getInstance().track("session.started", {
701
734
  has_neon: hasNeon,
@@ -704,8 +737,8 @@ var IgniteCommand = class {
704
737
  } catch (error) {
705
738
  logger.debug(`Telemetry session.started tracking failed: ${error instanceof Error ? error.message : error}`);
706
739
  }
707
- if (((_e = metadata == null ? void 0 : metadata.capabilities) == null ? void 0 : _e.includes("web")) && context.branchName) {
708
- const basePort = ((_h = (_g = (_f = this.settings) == null ? void 0 : _f.capabilities) == null ? void 0 : _g.web) == null ? void 0 : _h.basePort) ?? 3e3;
740
+ if (((_f = metadata == null ? void 0 : metadata.capabilities) == null ? void 0 : _f.includes("web")) && context.branchName) {
741
+ const basePort = ((_i = (_h = (_g = this.settings) == null ? void 0 : _g.capabilities) == null ? void 0 : _h.web) == null ? void 0 : _i.basePort) ?? 3e3;
709
742
  context.port = await getWorkspacePort({
710
743
  basePort,
711
744
  worktreePath: context.workspacePath,
@@ -713,7 +746,7 @@ var IgniteCommand = class {
713
746
  });
714
747
  logger.info(`\u{1F310} Development server port: ${context.port}`);
715
748
  }
716
- const isEpicLoom = metadata && metadata.issue_numbers.length > 0 && ((((_i = metadata.childIssues) == null ? void 0 : _i.length) ?? 0) > 0 || metadata.issueType === "epic");
749
+ const isEpicLoom = metadata && metadata.issue_numbers.length > 0 && ((((_j = metadata.childIssues) == null ? void 0 : _j.length) ?? 0) > 0 || metadata.issueType === "epic");
717
750
  if (isEpicLoom && this.settings) {
718
751
  await this.fetchAndStoreEpicChildData(metadataManager, metadata, context.workspacePath, this.settings);
719
752
  }
@@ -753,7 +786,7 @@ var IgniteCommand = class {
753
786
  throw new Error("No session ID found in loom metadata. This loom may need to be recreated with `il start`.");
754
787
  }
755
788
  logger.debug("Using session ID from metadata", { sessionId });
756
- const isHeadless = ((_j = this.printOptions) == null ? void 0 : _j.print) ?? false;
789
+ const isHeadless = ((_k = this.printOptions) == null ? void 0 : _k.print) ?? false;
757
790
  const claudeOptions = {
758
791
  headless: isHeadless,
759
792
  addDir: context.workspacePath,
@@ -769,16 +802,16 @@ var IgniteCommand = class {
769
802
  if (permissionMode !== void 0 && permissionMode !== "default") {
770
803
  claudeOptions.permissionMode = permissionMode;
771
804
  }
772
- if (((_k = this.printOptions) == null ? void 0 : _k.outputFormat) !== void 0) {
805
+ if (((_l = this.printOptions) == null ? void 0 : _l.outputFormat) !== void 0) {
773
806
  claudeOptions.outputFormat = this.printOptions.outputFormat;
774
807
  }
775
- if (((_l = this.printOptions) == null ? void 0 : _l.verbose) !== void 0) {
808
+ if (((_m = this.printOptions) == null ? void 0 : _m.verbose) !== void 0) {
776
809
  claudeOptions.verbose = this.printOptions.verbose;
777
810
  }
778
- if ((_m = this.printOptions) == null ? void 0 : _m.json) {
811
+ if ((_n = this.printOptions) == null ? void 0 : _n.json) {
779
812
  claudeOptions.jsonMode = "json";
780
813
  claudeOptions.outputFormat = "stream-json";
781
- } else if ((_n = this.printOptions) == null ? void 0 : _n.jsonStream) {
814
+ } else if ((_o = this.printOptions) == null ? void 0 : _o.jsonStream) {
782
815
  claudeOptions.jsonMode = "stream";
783
816
  claudeOptions.outputFormat = "stream-json";
784
817
  }
@@ -842,7 +875,7 @@ var IgniteCommand = class {
842
875
  }
843
876
  let agents;
844
877
  try {
845
- if (((_o = this.settings) == null ? void 0 : _o.agents) && Object.keys(this.settings.agents).length > 0) {
878
+ if (((_p = this.settings) == null ? void 0 : _p.agents) && Object.keys(this.settings.agents).length > 0) {
846
879
  logger.debug("Loaded project settings", {
847
880
  agentOverrides: Object.keys(this.settings.agents)
848
881
  });
@@ -876,7 +909,7 @@ var IgniteCommand = class {
876
909
  ...disallowedTools && { disallowedTools },
877
910
  ...agents && { agents }
878
911
  });
879
- if ((_p = this.printOptions) == null ? void 0 : _p.json) {
912
+ if ((_q = this.printOptions) == null ? void 0 : _q.json) {
880
913
  console.log(JSON.stringify({
881
914
  success: true,
882
915
  output: claudeResult ?? ""
@@ -887,7 +920,7 @@ var IgniteCommand = class {
887
920
  }
888
921
  } catch (error) {
889
922
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
890
- if ((_q = this.printOptions) == null ? void 0 : _q.json) {
923
+ if ((_r = this.printOptions) == null ? void 0 : _r.json) {
891
924
  console.log(JSON.stringify({
892
925
  success: false,
893
926
  error: errorMessage
@@ -995,20 +1028,20 @@ var IgniteCommand = class {
995
1028
  *
996
1029
  * This leverages the same logic as FinishCommand.autoDetectFromCurrentDirectory()
997
1030
  */
998
- async detectWorkspaceContext() {
999
- const workspacePath = process.cwd();
1000
- const currentDir = path4.basename(workspacePath);
1031
+ async detectWorkspaceContext(workspacePath) {
1032
+ const workspacePath_ = workspacePath ?? process.cwd();
1033
+ const currentDir = path4.basename(workspacePath_);
1001
1034
  const prPattern = /_pr_(\d+)$/;
1002
1035
  const prMatch = currentDir.match(prPattern);
1003
1036
  if (prMatch == null ? void 0 : prMatch[1]) {
1004
1037
  const prNumber = parseInt(prMatch[1], 10);
1005
1038
  logger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`);
1006
- return this.buildContextForPR(prNumber, workspacePath);
1039
+ return this.buildContextForPR(prNumber, workspacePath_);
1007
1040
  }
1008
1041
  const issueNumber = extractIssueNumber(currentDir);
1009
1042
  if (issueNumber !== null) {
1010
1043
  logger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`);
1011
- return this.buildContextForIssue(issueNumber, workspacePath);
1044
+ return this.buildContextForIssue(issueNumber, workspacePath_);
1012
1045
  }
1013
1046
  try {
1014
1047
  const repoInfo = await this.gitWorktreeManager.getRepoInfo();
@@ -1017,14 +1050,14 @@ var IgniteCommand = class {
1017
1050
  const branchIssueNumber = extractIssueNumber(currentBranch);
1018
1051
  if (branchIssueNumber !== null) {
1019
1052
  logger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`);
1020
- return this.buildContextForIssue(branchIssueNumber, workspacePath, currentBranch);
1053
+ return this.buildContextForIssue(branchIssueNumber, workspacePath_, currentBranch);
1021
1054
  }
1022
1055
  }
1023
1056
  } catch (error) {
1024
1057
  logger.debug("Could not detect from git branch", { error });
1025
1058
  }
1026
1059
  logger.debug("No specific context detected, using regular workflow");
1027
- return this.buildContextForRegular(workspacePath);
1060
+ return this.buildContextForRegular(workspacePath_);
1028
1061
  }
1029
1062
  /**
1030
1063
  * Build context for issue workflow
@@ -1253,7 +1286,7 @@ var IgniteCommand = class {
1253
1286
  "mcp__recap__set_loom_state",
1254
1287
  "mcp__recap__get_loom_state"
1255
1288
  ];
1256
- const model = this.settingsManager.getSpinModel(settings);
1289
+ const model = this.settingsManager.getSpinModel(settings, "swarm");
1257
1290
  logger.info("Launching swarm orchestrator...");
1258
1291
  logger.info(` Model: ${model ?? "default"}`);
1259
1292
  logger.info(` Permission mode: bypassPermissions`);
@@ -1386,8 +1419,9 @@ var IgniteCommand = class {
1386
1419
  }
1387
1420
  }
1388
1421
  };
1422
+
1389
1423
  export {
1390
- IgniteCommand,
1391
- WorktreeValidationError
1424
+ WorktreeValidationError,
1425
+ IgniteCommand
1392
1426
  };
1393
- //# sourceMappingURL=ignite-CGOV3TD4.js.map
1427
+ //# sourceMappingURL=chunk-OTGH2HRS.js.map