@iloom/cli 0.10.0 → 0.10.2
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.
- package/LICENSE +1 -1
- package/README.md +2 -2
- package/dist/{BranchNamingService-ECJHBB67.js → BranchNamingService-4OP6LOH6.js} +2 -2
- package/dist/ClaudeContextManager-ZKTUVQB2.js +14 -0
- package/dist/ClaudeService-TRWOYQ6O.js +13 -0
- package/dist/{LoomLauncher-L64HHS3T.js → LoomLauncher-FRECYMXS.js} +6 -6
- package/dist/{PromptTemplateManager-DULSVRRE.js → PromptTemplateManager-YOE2SIPG.js} +2 -2
- package/dist/README.md +2 -2
- package/dist/{SettingsManager-BQDQA3FK.js → SettingsManager-FNKCOZMQ.js} +2 -2
- package/dist/{build-5GO3XW26.js → build-VHGEMXBA.js} +6 -6
- package/dist/{chunk-ZW2LKWWE.js → chunk-2VEWSM34.js} +3 -3
- package/dist/{chunk-LXLMMXXY.js → chunk-2YZCWAVZ.js} +17 -12
- package/dist/chunk-2YZCWAVZ.js.map +1 -0
- package/dist/{chunk-UD3WJDIV.js → chunk-3F27M7ZD.js} +11 -774
- package/dist/chunk-3F27M7ZD.js.map +1 -0
- package/dist/chunk-4E7LCFUG.js +24 -0
- package/dist/chunk-4E7LCFUG.js.map +1 -0
- package/dist/{chunk-MNHZB4Z2.js → chunk-4FGEGQW4.js} +3 -3
- package/dist/{chunk-WY4QBK43.js → chunk-63QWFWH3.js} +2 -2
- package/dist/{chunk-YYAKPQBT.js → chunk-7VHJNVLF.js} +19 -9
- package/dist/chunk-7VHJNVLF.js.map +1 -0
- package/dist/chunk-BFHDVFSK.js +651 -0
- package/dist/chunk-BFHDVFSK.js.map +1 -0
- package/dist/{chunk-FB47TIJG.js → chunk-BFLMCE2U.js} +4 -23
- package/dist/chunk-BFLMCE2U.js.map +1 -0
- package/dist/{chunk-SN3SQCFK.js → chunk-BU53XIGY.js} +4 -4
- package/dist/{chunk-SF2P22EE.js → chunk-C6HNNJIV.js} +2 -2
- package/dist/{chunk-5MWV33NN.js → chunk-CVCTIDDK.js} +2 -2
- package/dist/{chunk-ZEWU5PZK.js → chunk-G5V75JD5.js} +2 -2
- package/dist/{chunk-ZHPNZC75.js → chunk-HYGUPUV5.js} +26 -21
- package/dist/chunk-HYGUPUV5.js.map +1 -0
- package/dist/{chunk-VGGST52X.js → chunk-I5T677EA.js} +2 -2
- package/dist/{chunk-VECNX6VX.js → chunk-KIK2ZFAL.js} +2 -2
- package/dist/{chunk-3D7WQM7I.js → chunk-LLHXQS3C.js} +2 -2
- package/dist/{chunk-Y4YZTHZE.js → chunk-LUKXJSRI.js} +2 -2
- package/dist/{chunk-ONQYPICO.js → chunk-PZ5WSR5Z.js} +63 -9
- package/dist/chunk-PZ5WSR5Z.js.map +1 -0
- package/dist/{chunk-J5S7DFYC.js → chunk-QFTDZ5E3.js} +2 -2
- package/dist/chunk-RJ3VBUFK.js +781 -0
- package/dist/chunk-RJ3VBUFK.js.map +1 -0
- package/dist/{chunk-UWGVCXRF.js → chunk-SKSYYBCU.js} +23 -1
- package/dist/chunk-SKSYYBCU.js.map +1 -0
- package/dist/{chunk-JO2LZ6EQ.js → chunk-SWSJWA2S.js} +2 -2
- package/dist/{chunk-4WJNIR5O.js → chunk-UUEW5KWB.js} +1 -1
- package/dist/chunk-UUEW5KWB.js.map +1 -0
- package/dist/{chunk-6EU6TCF6.js → chunk-V3SVMFDQ.js} +5 -5
- package/dist/{chunk-NRSWLOAZ.js → chunk-WXIM2WS7.js} +4 -4
- package/dist/{chunk-RYWFS37M.js → chunk-XE4BDRZD.js} +2 -2
- package/dist/{ignite-CGOV3TD4.js → chunk-ZGM2FE2R.js} +105 -73
- package/dist/chunk-ZGM2FE2R.js.map +1 -0
- package/dist/{claude-P3NQR6IJ.js → claude-LN7OWVNI.js} +2 -2
- package/dist/{cleanup-6UCPVMFG.js → cleanup-4ZM2AJDC.js} +19 -17
- package/dist/{cleanup-6UCPVMFG.js.map → cleanup-4ZM2AJDC.js.map} +1 -1
- package/dist/cli.js +167 -614
- package/dist/cli.js.map +1 -1
- package/dist/{commit-L3EPY5QG.js → commit-4CFLXRZ3.js} +12 -10
- package/dist/commit-4CFLXRZ3.js.map +1 -0
- package/dist/{compile-ZS4HYRX5.js → compile-7ALJHZ4N.js} +6 -6
- package/dist/{contribute-ORDDQGSL.js → contribute-5GKLK3BQ.js} +3 -3
- package/dist/{dev-server-FYZ2AQIH.js → dev-server-7SMIB7OF.js} +8 -8
- package/dist/{feedback-TMBXSCM5.js → feedback-EZWF5CAL.js} +10 -8
- package/dist/{feedback-TMBXSCM5.js.map → feedback-EZWF5CAL.js.map} +1 -1
- package/dist/{git-ET64COO3.js → git-GTLKAZRJ.js} +3 -3
- package/dist/ignite-MQETGFNA.js +34 -0
- package/dist/ignite-MQETGFNA.js.map +1 -0
- package/dist/index.d.ts +113 -18
- package/dist/index.js +180 -15
- package/dist/index.js.map +1 -1
- package/dist/{init-GFQ5W7GK.js → init-ZB2RITW6.js} +8 -8
- package/dist/install-deps-RLSGSHH7.js +43 -0
- package/dist/install-deps-RLSGSHH7.js.map +1 -0
- package/dist/{issues-T4ZZSPEG.js → issues-4UUAQ5K6.js} +3 -3
- package/dist/{lint-6TQXDZ3T.js → lint-AAN2NZWG.js} +6 -6
- package/dist/mcp/harness-server.js +140 -0
- package/dist/mcp/harness-server.js.map +1 -0
- package/dist/mcp/issue-management-server.js +140 -18
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/{open-5QZGXQRF.js → open-FXWW3VI4.js} +8 -8
- package/dist/{plan-U7ZQWLFY.js → plan-D3KSN5MU.js} +338 -36
- package/dist/plan-D3KSN5MU.js.map +1 -0
- package/dist/prompts/CLAUDE.md +2 -2
- package/dist/prompts/init-prompt.txt +102 -27
- package/dist/prompts/issue-prompt.txt +46 -0
- package/dist/prompts/plan-prompt.txt +59 -19
- package/dist/prompts/swarm-orchestrator-prompt.txt +121 -80
- package/dist/{rebase-DWIB77KV.js → rebase-62FDLIH4.js} +17 -8
- package/dist/rebase-62FDLIH4.js.map +1 -0
- package/dist/{recap-MX63HAKV.js → recap-OMBOKJST.js} +6 -6
- package/dist/{run-O3TFNQFC.js → run-BBXLRIZB.js} +8 -8
- package/dist/schema/settings.schema.json +36 -2
- package/dist/{shell-G6VC2CYR.js → shell-RF7LTND5.js} +5 -5
- package/dist/{summary-FWHAX55O.js → summary-YZI25KW4.js} +9 -9
- package/dist/{test-F7JNJZYP.js → test-SGO6I5Z7.js} +6 -6
- package/dist/{test-git-BTAOIUE2.js → test-git-XM4TM65W.js} +3 -3
- package/dist/{test-jira-CHYNV33F.js → test-jira-LDTOYFSD.js} +3 -3
- package/dist/{test-prefix-Q6TFSU6F.js → test-prefix-GBO37XCN.js} +3 -3
- package/dist/{test-webserver-EONCG7E7.js → test-webserver-NZ3JTVLL.js} +5 -5
- package/dist/{vscode-VA5X4P25.js → vscode-6XUGHJKL.js} +5 -5
- package/package.json +1 -1
- package/dist/ClaudeContextManager-QXX6ZFST.js +0 -14
- package/dist/ClaudeService-NJNK2SUH.js +0 -13
- package/dist/chunk-4WJNIR5O.js.map +0 -1
- package/dist/chunk-FB47TIJG.js.map +0 -1
- package/dist/chunk-LXLMMXXY.js.map +0 -1
- package/dist/chunk-ONQYPICO.js.map +0 -1
- package/dist/chunk-UD3WJDIV.js.map +0 -1
- package/dist/chunk-UVD4CZKS.js +0 -101
- package/dist/chunk-UVD4CZKS.js.map +0 -1
- package/dist/chunk-UWGVCXRF.js.map +0 -1
- package/dist/chunk-YYAKPQBT.js.map +0 -1
- package/dist/chunk-ZHPNZC75.js.map +0 -1
- package/dist/commit-L3EPY5QG.js.map +0 -1
- package/dist/ignite-CGOV3TD4.js.map +0 -1
- package/dist/plan-U7ZQWLFY.js.map +0 -1
- package/dist/rebase-DWIB77KV.js.map +0 -1
- /package/dist/{BranchNamingService-ECJHBB67.js.map → BranchNamingService-4OP6LOH6.js.map} +0 -0
- /package/dist/{ClaudeContextManager-QXX6ZFST.js.map → ClaudeContextManager-ZKTUVQB2.js.map} +0 -0
- /package/dist/{ClaudeService-NJNK2SUH.js.map → ClaudeService-TRWOYQ6O.js.map} +0 -0
- /package/dist/{LoomLauncher-L64HHS3T.js.map → LoomLauncher-FRECYMXS.js.map} +0 -0
- /package/dist/{PromptTemplateManager-DULSVRRE.js.map → PromptTemplateManager-YOE2SIPG.js.map} +0 -0
- /package/dist/{SettingsManager-BQDQA3FK.js.map → SettingsManager-FNKCOZMQ.js.map} +0 -0
- /package/dist/{build-5GO3XW26.js.map → build-VHGEMXBA.js.map} +0 -0
- /package/dist/{chunk-ZW2LKWWE.js.map → chunk-2VEWSM34.js.map} +0 -0
- /package/dist/{chunk-MNHZB4Z2.js.map → chunk-4FGEGQW4.js.map} +0 -0
- /package/dist/{chunk-WY4QBK43.js.map → chunk-63QWFWH3.js.map} +0 -0
- /package/dist/{chunk-SN3SQCFK.js.map → chunk-BU53XIGY.js.map} +0 -0
- /package/dist/{chunk-SF2P22EE.js.map → chunk-C6HNNJIV.js.map} +0 -0
- /package/dist/{chunk-5MWV33NN.js.map → chunk-CVCTIDDK.js.map} +0 -0
- /package/dist/{chunk-ZEWU5PZK.js.map → chunk-G5V75JD5.js.map} +0 -0
- /package/dist/{chunk-VGGST52X.js.map → chunk-I5T677EA.js.map} +0 -0
- /package/dist/{chunk-VECNX6VX.js.map → chunk-KIK2ZFAL.js.map} +0 -0
- /package/dist/{chunk-3D7WQM7I.js.map → chunk-LLHXQS3C.js.map} +0 -0
- /package/dist/{chunk-Y4YZTHZE.js.map → chunk-LUKXJSRI.js.map} +0 -0
- /package/dist/{chunk-J5S7DFYC.js.map → chunk-QFTDZ5E3.js.map} +0 -0
- /package/dist/{chunk-JO2LZ6EQ.js.map → chunk-SWSJWA2S.js.map} +0 -0
- /package/dist/{chunk-6EU6TCF6.js.map → chunk-V3SVMFDQ.js.map} +0 -0
- /package/dist/{chunk-NRSWLOAZ.js.map → chunk-WXIM2WS7.js.map} +0 -0
- /package/dist/{chunk-RYWFS37M.js.map → chunk-XE4BDRZD.js.map} +0 -0
- /package/dist/{claude-P3NQR6IJ.js.map → claude-LN7OWVNI.js.map} +0 -0
- /package/dist/{compile-ZS4HYRX5.js.map → compile-7ALJHZ4N.js.map} +0 -0
- /package/dist/{contribute-ORDDQGSL.js.map → contribute-5GKLK3BQ.js.map} +0 -0
- /package/dist/{dev-server-FYZ2AQIH.js.map → dev-server-7SMIB7OF.js.map} +0 -0
- /package/dist/{git-ET64COO3.js.map → git-GTLKAZRJ.js.map} +0 -0
- /package/dist/{init-GFQ5W7GK.js.map → init-ZB2RITW6.js.map} +0 -0
- /package/dist/{issues-T4ZZSPEG.js.map → issues-4UUAQ5K6.js.map} +0 -0
- /package/dist/{lint-6TQXDZ3T.js.map → lint-AAN2NZWG.js.map} +0 -0
- /package/dist/{open-5QZGXQRF.js.map → open-FXWW3VI4.js.map} +0 -0
- /package/dist/{recap-MX63HAKV.js.map → recap-OMBOKJST.js.map} +0 -0
- /package/dist/{run-O3TFNQFC.js.map → run-BBXLRIZB.js.map} +0 -0
- /package/dist/{shell-G6VC2CYR.js.map → shell-RF7LTND5.js.map} +0 -0
- /package/dist/{summary-FWHAX55O.js.map → summary-YZI25KW4.js.map} +0 -0
- /package/dist/{test-F7JNJZYP.js.map → test-SGO6I5Z7.js.map} +0 -0
- /package/dist/{test-git-BTAOIUE2.js.map → test-git-XM4TM65W.js.map} +0 -0
- /package/dist/{test-jira-CHYNV33F.js.map → test-jira-LDTOYFSD.js.map} +0 -0
- /package/dist/{test-prefix-Q6TFSU6F.js.map → test-prefix-GBO37XCN.js.map} +0 -0
- /package/dist/{test-webserver-EONCG7E7.js.map → test-webserver-NZ3JTVLL.js.map} +0 -0
- /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-
|
|
9
|
-
import "./chunk-4232AHNQ.js";
|
|
8
|
+
} from "./chunk-SWSJWA2S.js";
|
|
10
9
|
import {
|
|
11
10
|
getWorkspacePort
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
30
|
-
import "./chunk-YQ57ORTV.js";
|
|
28
|
+
} from "./chunk-SKSYYBCU.js";
|
|
31
29
|
import {
|
|
32
30
|
AgentManager
|
|
33
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-C6HNNJIV.js";
|
|
34
32
|
import {
|
|
35
33
|
launchClaude
|
|
36
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-PZ5WSR5Z.js";
|
|
37
35
|
import {
|
|
38
36
|
PromptTemplateManager,
|
|
39
37
|
buildReviewTemplateVariables
|
|
40
|
-
} from "./chunk-
|
|
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-
|
|
48
|
+
} from "./chunk-4FGEGQW4.js";
|
|
51
49
|
import {
|
|
52
50
|
SettingsManager
|
|
53
|
-
} from "./chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
|
443
|
-
if (
|
|
444
|
-
agents[agentName] = { ...agentConfig, model:
|
|
445
|
-
} else if (
|
|
446
|
-
agents[agentName] = { ...agentConfig, model:
|
|
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 = ((
|
|
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 = ((
|
|
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 = !!((
|
|
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 (((
|
|
708
|
-
const basePort = ((
|
|
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 && ((((
|
|
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 = ((
|
|
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 (((
|
|
805
|
+
if (((_l = this.printOptions) == null ? void 0 : _l.outputFormat) !== void 0) {
|
|
773
806
|
claudeOptions.outputFormat = this.printOptions.outputFormat;
|
|
774
807
|
}
|
|
775
|
-
if (((
|
|
808
|
+
if (((_m = this.printOptions) == null ? void 0 : _m.verbose) !== void 0) {
|
|
776
809
|
claudeOptions.verbose = this.printOptions.verbose;
|
|
777
810
|
}
|
|
778
|
-
if ((
|
|
811
|
+
if ((_n = this.printOptions) == null ? void 0 : _n.json) {
|
|
779
812
|
claudeOptions.jsonMode = "json";
|
|
780
813
|
claudeOptions.outputFormat = "stream-json";
|
|
781
|
-
} else if ((
|
|
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 (((
|
|
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 ((
|
|
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,13 +920,11 @@ var IgniteCommand = class {
|
|
|
887
920
|
}
|
|
888
921
|
} catch (error) {
|
|
889
922
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
890
|
-
if ((
|
|
923
|
+
if ((_r = this.printOptions) == null ? void 0 : _r.json) {
|
|
891
924
|
console.log(JSON.stringify({
|
|
892
925
|
success: false,
|
|
893
926
|
error: errorMessage
|
|
894
927
|
}));
|
|
895
|
-
} else {
|
|
896
|
-
logger.error(`Failed to launch Claude: ${errorMessage}`);
|
|
897
928
|
}
|
|
898
929
|
throw error;
|
|
899
930
|
}
|
|
@@ -995,20 +1026,20 @@ var IgniteCommand = class {
|
|
|
995
1026
|
*
|
|
996
1027
|
* This leverages the same logic as FinishCommand.autoDetectFromCurrentDirectory()
|
|
997
1028
|
*/
|
|
998
|
-
async detectWorkspaceContext() {
|
|
999
|
-
const
|
|
1000
|
-
const currentDir = path4.basename(
|
|
1029
|
+
async detectWorkspaceContext(workspacePath) {
|
|
1030
|
+
const workspacePath_ = workspacePath ?? process.cwd();
|
|
1031
|
+
const currentDir = path4.basename(workspacePath_);
|
|
1001
1032
|
const prPattern = /_pr_(\d+)$/;
|
|
1002
1033
|
const prMatch = currentDir.match(prPattern);
|
|
1003
1034
|
if (prMatch == null ? void 0 : prMatch[1]) {
|
|
1004
1035
|
const prNumber = parseInt(prMatch[1], 10);
|
|
1005
1036
|
logger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`);
|
|
1006
|
-
return this.buildContextForPR(prNumber,
|
|
1037
|
+
return this.buildContextForPR(prNumber, workspacePath_);
|
|
1007
1038
|
}
|
|
1008
1039
|
const issueNumber = extractIssueNumber(currentDir);
|
|
1009
1040
|
if (issueNumber !== null) {
|
|
1010
1041
|
logger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`);
|
|
1011
|
-
return this.buildContextForIssue(issueNumber,
|
|
1042
|
+
return this.buildContextForIssue(issueNumber, workspacePath_);
|
|
1012
1043
|
}
|
|
1013
1044
|
try {
|
|
1014
1045
|
const repoInfo = await this.gitWorktreeManager.getRepoInfo();
|
|
@@ -1017,14 +1048,14 @@ var IgniteCommand = class {
|
|
|
1017
1048
|
const branchIssueNumber = extractIssueNumber(currentBranch);
|
|
1018
1049
|
if (branchIssueNumber !== null) {
|
|
1019
1050
|
logger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`);
|
|
1020
|
-
return this.buildContextForIssue(branchIssueNumber,
|
|
1051
|
+
return this.buildContextForIssue(branchIssueNumber, workspacePath_, currentBranch);
|
|
1021
1052
|
}
|
|
1022
1053
|
}
|
|
1023
1054
|
} catch (error) {
|
|
1024
1055
|
logger.debug("Could not detect from git branch", { error });
|
|
1025
1056
|
}
|
|
1026
1057
|
logger.debug("No specific context detected, using regular workflow");
|
|
1027
|
-
return this.buildContextForRegular(
|
|
1058
|
+
return this.buildContextForRegular(workspacePath_);
|
|
1028
1059
|
}
|
|
1029
1060
|
/**
|
|
1030
1061
|
* Build context for issue workflow
|
|
@@ -1253,7 +1284,7 @@ var IgniteCommand = class {
|
|
|
1253
1284
|
"mcp__recap__set_loom_state",
|
|
1254
1285
|
"mcp__recap__get_loom_state"
|
|
1255
1286
|
];
|
|
1256
|
-
const model = this.settingsManager.getSpinModel(settings);
|
|
1287
|
+
const model = this.settingsManager.getSpinModel(settings, "swarm");
|
|
1257
1288
|
logger.info("Launching swarm orchestrator...");
|
|
1258
1289
|
logger.info(` Model: ${model ?? "default"}`);
|
|
1259
1290
|
logger.info(` Permission mode: bypassPermissions`);
|
|
@@ -1386,8 +1417,9 @@ var IgniteCommand = class {
|
|
|
1386
1417
|
}
|
|
1387
1418
|
}
|
|
1388
1419
|
};
|
|
1420
|
+
|
|
1389
1421
|
export {
|
|
1390
|
-
|
|
1391
|
-
|
|
1422
|
+
WorktreeValidationError,
|
|
1423
|
+
IgniteCommand
|
|
1392
1424
|
};
|
|
1393
|
-
//# sourceMappingURL=
|
|
1425
|
+
//# sourceMappingURL=chunk-ZGM2FE2R.js.map
|