@iloom/cli 0.7.6 → 0.8.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.
- package/LICENSE +1 -1
- package/README.md +32 -3
- package/dist/{ClaudeContextManager-Y2YJC6BU.js → ClaudeContextManager-RDP6CLK6.js} +5 -5
- package/dist/{ClaudeService-NDVFQRKC.js → ClaudeService-FKPOQRA4.js} +4 -4
- package/dist/GitHubService-ACZVNTJE.js +12 -0
- package/dist/{LoomLauncher-U2B3VHPC.js → LoomLauncher-NHZMEVTQ.js} +5 -5
- package/dist/{MetadataManager-XJ2YB762.js → MetadataManager-W3C54UYT.js} +2 -2
- package/dist/{PRManager-7F3AAY66.js → PRManager-H4TUZTZL.js} +5 -5
- package/dist/{PromptTemplateManager-7L3HJQQU.js → PromptTemplateManager-OUYDHOPI.js} +2 -2
- package/dist/README.md +32 -3
- package/dist/{SettingsManager-YU4VYPTW.js → SettingsManager-VCVLL32H.js} +4 -2
- package/dist/{SettingsMigrationManager-KZKDG66H.js → SettingsMigrationManager-LEBMJP3B.js} +3 -3
- package/dist/agents/iloom-code-reviewer.md +735 -0
- package/dist/agents/iloom-framework-detector.md +1 -1
- package/dist/agents/iloom-issue-analyze-and-plan.md +2 -2
- package/dist/agents/iloom-issue-analyzer.md +2 -2
- package/dist/agents/iloom-issue-complexity-evaluator.md +1 -1
- package/dist/agents/iloom-issue-enhancer.md +2 -2
- package/dist/agents/iloom-issue-implementer.md +3 -3
- package/dist/agents/iloom-issue-planner.md +2 -2
- package/dist/{build-HQ5HGA3T.js → build-H4DK3DMQ.js} +7 -7
- package/dist/{chunk-N7FVXZNI.js → chunk-4BSXZ5YZ.js} +31 -9
- package/dist/chunk-4BSXZ5YZ.js.map +1 -0
- package/dist/{chunk-VYKKWU36.js → chunk-4KGRPHM6.js} +3 -3
- package/dist/{chunk-CFQVOTHO.js → chunk-52MVUK5V.js} +2 -2
- package/dist/{chunk-TIYJEEVO.js → chunk-66QOCD5N.js} +1 -1
- package/dist/chunk-66QOCD5N.js.map +1 -0
- package/dist/chunk-7JDMYTFZ.js +251 -0
- package/dist/chunk-7JDMYTFZ.js.map +1 -0
- package/dist/{chunk-7LSSNB7Y.js → chunk-7ZEHSSUP.js} +2 -2
- package/dist/chunk-A4UQY3M2.js +75 -0
- package/dist/chunk-A4UQY3M2.js.map +1 -0
- package/dist/{chunk-ELJKYFSH.js → chunk-BCQDYAOJ.js} +4 -4
- package/dist/{chunk-F2PWIRV4.js → chunk-BYUMEDDD.js} +2 -2
- package/dist/{chunk-CAXFWFV6.js → chunk-ECP77QGE.js} +4 -4
- package/dist/{chunk-6YAMWLCP.js → chunk-EQOFNPEY.js} +3 -3
- package/dist/{chunk-ZA575VLF.js → chunk-GDS2HXSW.js} +4 -4
- package/dist/{chunk-UDRZY65Y.js → chunk-HSGZW3ID.js} +2 -2
- package/dist/{chunk-WFQ5CLTR.js → chunk-IWIIOFEB.js} +56 -5
- package/dist/chunk-IWIIOFEB.js.map +1 -0
- package/dist/{chunk-VWGKGNJP.js → chunk-KBEIQP4G.js} +3 -1
- package/dist/chunk-KBEIQP4G.js.map +1 -0
- package/dist/{chunk-ETY2SBW5.js → chunk-NR64HNF7.js} +17 -15
- package/dist/chunk-NR64HNF7.js.map +1 -0
- package/dist/{chunk-WT4UGBE2.js → chunk-PBSHQVCT.js} +5 -5
- package/dist/{chunk-64HCHVJM.js → chunk-PLI3JQWT.js} +2 -2
- package/dist/{chunk-USJSNHGG.js → chunk-PVW6JE7E.js} +3 -3
- package/dist/{chunk-HBJITKSZ.js → chunk-RNBIISBZ.js} +161 -3
- package/dist/chunk-RNBIISBZ.js.map +1 -0
- package/dist/{chunk-C7YW5IMS.js → chunk-RODL2HVY.js} +17 -6
- package/dist/{chunk-C7YW5IMS.js.map → chunk-RODL2HVY.js.map} +1 -1
- package/dist/{chunk-3K3WY3BN.js → chunk-SC6X5EBG.js} +4 -4
- package/dist/{chunk-NEPH2O4C.js → chunk-SSASIBDJ.js} +3 -3
- package/dist/{chunk-GCPAZSGV.js → chunk-THS5L54H.js} +150 -3
- package/dist/chunk-THS5L54H.js.map +1 -0
- package/dist/{chunk-5V74K5ZA.js → chunk-TVH67KEO.js} +25 -2
- package/dist/chunk-TVH67KEO.js.map +1 -0
- package/dist/{chunk-NPEMVE27.js → chunk-UDZCTLD6.js} +115 -3
- package/dist/chunk-UDZCTLD6.js.map +1 -0
- package/dist/{chunk-ENMTWE74.js → chunk-VZYSM7N7.js} +2 -2
- package/dist/{chunk-WZYBHD7P.js → chunk-XHNACIHO.js} +2 -2
- package/dist/{chunk-XAMBIVXE.js → chunk-XJHQVOT6.js} +2 -2
- package/dist/{chunk-O36JLYNW.js → chunk-XU5A6BWA.js} +4 -7
- package/dist/chunk-XU5A6BWA.js.map +1 -0
- package/dist/{cleanup-IO4KV2DL.js → cleanup-OGE7V7AD.js} +16 -16
- package/dist/cli.js +317 -164
- package/dist/cli.js.map +1 -1
- package/dist/{commit-3ULFKXNB.js → commit-534QIRHY.js} +10 -10
- package/dist/{compile-CT7IR7O2.js → compile-ZOAODFN2.js} +7 -7
- package/dist/{contribute-GXKOIA42.js → contribute-7USRBWRM.js} +6 -6
- package/dist/{dev-server-OAP3RZC6.js → dev-server-TYYJM3XA.js} +9 -9
- package/dist/{feedback-ZLAX3BVL.js → feedback-HZVLOTQJ.js} +9 -9
- package/dist/{git-ENLT2VNI.js → git-GUNOPP4Q.js} +4 -4
- package/dist/hooks/iloom-hook.js +75 -3
- package/dist/{ignite-HA2OJF6Z.js → ignite-ZO7SGUKP.js} +85 -25
- package/dist/ignite-ZO7SGUKP.js.map +1 -0
- package/dist/index.d.ts +85 -2
- package/dist/index.js +133 -73
- package/dist/index.js.map +1 -1
- package/dist/init-MZBIXQ7V.js +21 -0
- package/dist/{lint-HAVU4U34.js → lint-MDVUV3W2.js} +7 -7
- package/dist/mcp/issue-management-server.js +569 -2
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/{neon-helpers-3KBC4A3Y.js → neon-helpers-VVFFTLXE.js} +3 -3
- package/dist/{open-IN3LUZXX.js → open-2LPZ7XXW.js} +9 -9
- package/dist/plan-PIME6UNY.js +371 -0
- package/dist/plan-PIME6UNY.js.map +1 -0
- package/dist/{projects-CTRTTMSK.js → projects-325GEEGJ.js} +2 -2
- package/dist/{prompt-3SAZYRUN.js → prompt-ONNPSNKM.js} +2 -2
- package/dist/prompts/init-prompt.txt +83 -3
- package/dist/prompts/issue-prompt.txt +51 -3
- package/dist/prompts/plan-prompt.txt +435 -0
- package/dist/prompts/pr-prompt.txt +38 -0
- package/dist/prompts/regular-prompt.txt +53 -3
- package/dist/{rebase-RLEVFHWN.js → rebase-7YS3N274.js} +6 -6
- package/dist/{recap-ZKGHZCX6.js → recap-GSXFEOD6.js} +6 -6
- package/dist/{run-QEIS2EH2.js → run-XPGCMFFO.js} +9 -9
- package/dist/schema/settings.schema.json +57 -1
- package/dist/{shell-2NNSIU34.js → shell-2SPM3Z5O.js} +6 -6
- package/dist/{summary-MPOOQIOX.js → summary-C5VVSJAJ.js} +11 -11
- package/dist/{test-75WAA6DU.js → test-N2725YRI.js} +7 -7
- package/dist/{test-git-E2BLXR6M.js → test-git-ZPSPA2TP.js} +4 -4
- package/dist/{test-prefix-A7JGGYAA.js → test-prefix-6DLB2BHE.js} +4 -4
- package/dist/{test-webserver-J6SMNLU2.js → test-webserver-XLJ2TZFP.js} +6 -6
- package/package.json +1 -1
- package/dist/GitHubService-O7U4UQ7N.js +0 -12
- package/dist/agents/iloom-issue-reviewer.md +0 -139
- package/dist/chunk-5V74K5ZA.js.map +0 -1
- package/dist/chunk-ETY2SBW5.js.map +0 -1
- package/dist/chunk-GCPAZSGV.js.map +0 -1
- package/dist/chunk-HBJITKSZ.js.map +0 -1
- package/dist/chunk-N7FVXZNI.js.map +0 -1
- package/dist/chunk-NPEMVE27.js.map +0 -1
- package/dist/chunk-O36JLYNW.js.map +0 -1
- package/dist/chunk-TIYJEEVO.js.map +0 -1
- package/dist/chunk-VWGKGNJP.js.map +0 -1
- package/dist/chunk-WFQ5CLTR.js.map +0 -1
- package/dist/chunk-ZX3GTM7O.js +0 -119
- package/dist/chunk-ZX3GTM7O.js.map +0 -1
- package/dist/ignite-HA2OJF6Z.js.map +0 -1
- package/dist/init-S6IEGRSX.js +0 -21
- /package/dist/{ClaudeContextManager-Y2YJC6BU.js.map → ClaudeContextManager-RDP6CLK6.js.map} +0 -0
- /package/dist/{ClaudeService-NDVFQRKC.js.map → ClaudeService-FKPOQRA4.js.map} +0 -0
- /package/dist/{GitHubService-O7U4UQ7N.js.map → GitHubService-ACZVNTJE.js.map} +0 -0
- /package/dist/{LoomLauncher-U2B3VHPC.js.map → LoomLauncher-NHZMEVTQ.js.map} +0 -0
- /package/dist/{MetadataManager-XJ2YB762.js.map → MetadataManager-W3C54UYT.js.map} +0 -0
- /package/dist/{PRManager-7F3AAY66.js.map → PRManager-H4TUZTZL.js.map} +0 -0
- /package/dist/{PromptTemplateManager-7L3HJQQU.js.map → PromptTemplateManager-OUYDHOPI.js.map} +0 -0
- /package/dist/{SettingsManager-YU4VYPTW.js.map → SettingsManager-VCVLL32H.js.map} +0 -0
- /package/dist/{SettingsMigrationManager-KZKDG66H.js.map → SettingsMigrationManager-LEBMJP3B.js.map} +0 -0
- /package/dist/{build-HQ5HGA3T.js.map → build-H4DK3DMQ.js.map} +0 -0
- /package/dist/{chunk-VYKKWU36.js.map → chunk-4KGRPHM6.js.map} +0 -0
- /package/dist/{chunk-CFQVOTHO.js.map → chunk-52MVUK5V.js.map} +0 -0
- /package/dist/{chunk-7LSSNB7Y.js.map → chunk-7ZEHSSUP.js.map} +0 -0
- /package/dist/{chunk-ELJKYFSH.js.map → chunk-BCQDYAOJ.js.map} +0 -0
- /package/dist/{chunk-F2PWIRV4.js.map → chunk-BYUMEDDD.js.map} +0 -0
- /package/dist/{chunk-CAXFWFV6.js.map → chunk-ECP77QGE.js.map} +0 -0
- /package/dist/{chunk-6YAMWLCP.js.map → chunk-EQOFNPEY.js.map} +0 -0
- /package/dist/{chunk-ZA575VLF.js.map → chunk-GDS2HXSW.js.map} +0 -0
- /package/dist/{chunk-UDRZY65Y.js.map → chunk-HSGZW3ID.js.map} +0 -0
- /package/dist/{chunk-WT4UGBE2.js.map → chunk-PBSHQVCT.js.map} +0 -0
- /package/dist/{chunk-64HCHVJM.js.map → chunk-PLI3JQWT.js.map} +0 -0
- /package/dist/{chunk-USJSNHGG.js.map → chunk-PVW6JE7E.js.map} +0 -0
- /package/dist/{chunk-3K3WY3BN.js.map → chunk-SC6X5EBG.js.map} +0 -0
- /package/dist/{chunk-NEPH2O4C.js.map → chunk-SSASIBDJ.js.map} +0 -0
- /package/dist/{chunk-ENMTWE74.js.map → chunk-VZYSM7N7.js.map} +0 -0
- /package/dist/{chunk-WZYBHD7P.js.map → chunk-XHNACIHO.js.map} +0 -0
- /package/dist/{chunk-XAMBIVXE.js.map → chunk-XJHQVOT6.js.map} +0 -0
- /package/dist/{cleanup-IO4KV2DL.js.map → cleanup-OGE7V7AD.js.map} +0 -0
- /package/dist/{commit-3ULFKXNB.js.map → commit-534QIRHY.js.map} +0 -0
- /package/dist/{compile-CT7IR7O2.js.map → compile-ZOAODFN2.js.map} +0 -0
- /package/dist/{contribute-GXKOIA42.js.map → contribute-7USRBWRM.js.map} +0 -0
- /package/dist/{dev-server-OAP3RZC6.js.map → dev-server-TYYJM3XA.js.map} +0 -0
- /package/dist/{feedback-ZLAX3BVL.js.map → feedback-HZVLOTQJ.js.map} +0 -0
- /package/dist/{git-ENLT2VNI.js.map → git-GUNOPP4Q.js.map} +0 -0
- /package/dist/{init-S6IEGRSX.js.map → init-MZBIXQ7V.js.map} +0 -0
- /package/dist/{lint-HAVU4U34.js.map → lint-MDVUV3W2.js.map} +0 -0
- /package/dist/{neon-helpers-3KBC4A3Y.js.map → neon-helpers-VVFFTLXE.js.map} +0 -0
- /package/dist/{open-IN3LUZXX.js.map → open-2LPZ7XXW.js.map} +0 -0
- /package/dist/{projects-CTRTTMSK.js.map → projects-325GEEGJ.js.map} +0 -0
- /package/dist/{prompt-3SAZYRUN.js.map → prompt-ONNPSNKM.js.map} +0 -0
- /package/dist/{rebase-RLEVFHWN.js.map → rebase-7YS3N274.js.map} +0 -0
- /package/dist/{recap-ZKGHZCX6.js.map → recap-GSXFEOD6.js.map} +0 -0
- /package/dist/{run-QEIS2EH2.js.map → run-XPGCMFFO.js.map} +0 -0
- /package/dist/{shell-2NNSIU34.js.map → shell-2SPM3Z5O.js.map} +0 -0
- /package/dist/{summary-MPOOQIOX.js.map → summary-C5VVSJAJ.js.map} +0 -0
- /package/dist/{test-75WAA6DU.js.map → test-N2725YRI.js.map} +0 -0
- /package/dist/{test-git-E2BLXR6M.js.map → test-git-ZPSPA2TP.js.map} +0 -0
- /package/dist/{test-prefix-A7JGGYAA.js.map → test-prefix-6DLB2BHE.js.map} +0 -0
- /package/dist/{test-webserver-J6SMNLU2.js.map → test-webserver-XLJ2TZFP.js.map} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SessionSummaryService
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-PBSHQVCT.js";
|
|
5
5
|
import "./chunk-NXMDEL3F.js";
|
|
6
6
|
import {
|
|
7
7
|
CLIIsolationManager,
|
|
@@ -9,65 +9,69 @@ import {
|
|
|
9
9
|
EnvironmentManager,
|
|
10
10
|
LoomManager,
|
|
11
11
|
ResourceCleanup
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NR64HNF7.js";
|
|
13
|
+
import {
|
|
14
|
+
launchFirstRunSetup,
|
|
15
|
+
needsFirstRunSetup
|
|
16
|
+
} from "./chunk-A4UQY3M2.js";
|
|
13
17
|
import {
|
|
14
18
|
BuildRunner,
|
|
15
19
|
MergeManager
|
|
16
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-ECP77QGE.js";
|
|
17
21
|
import {
|
|
18
22
|
IssueTrackerFactory
|
|
19
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-SC6X5EBG.js";
|
|
20
24
|
import {
|
|
21
25
|
ProcessManager
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
26
|
+
} from "./chunk-XHNACIHO.js";
|
|
27
|
+
import "./chunk-52MVUK5V.js";
|
|
24
28
|
import {
|
|
25
|
-
IdentifierParser
|
|
26
|
-
|
|
29
|
+
IdentifierParser,
|
|
30
|
+
matchIssueIdentifier
|
|
31
|
+
} from "./chunk-TVH67KEO.js";
|
|
27
32
|
import {
|
|
28
33
|
createNeonProviderFromSettings
|
|
29
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-7ZEHSSUP.js";
|
|
30
35
|
import {
|
|
31
|
-
InitCommand,
|
|
32
36
|
ShellCompletion
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import
|
|
35
|
-
|
|
36
|
-
} from "./chunk-Q7POFB5Q.js";
|
|
37
|
-
import "./chunk-F2PWIRV4.js";
|
|
37
|
+
} from "./chunk-RODL2HVY.js";
|
|
38
|
+
import "./chunk-Q7POFB5Q.js";
|
|
39
|
+
import "./chunk-BYUMEDDD.js";
|
|
38
40
|
import {
|
|
39
41
|
IssueEnhancementService,
|
|
40
42
|
capitalizeFirstLetter
|
|
41
|
-
} from "./chunk-
|
|
42
|
-
import "./chunk-
|
|
43
|
+
} from "./chunk-4KGRPHM6.js";
|
|
44
|
+
import "./chunk-XJHQVOT6.js";
|
|
43
45
|
import {
|
|
44
46
|
ProjectCapabilityDetector
|
|
45
47
|
} from "./chunk-7GLZVDPQ.js";
|
|
46
48
|
import {
|
|
47
49
|
AgentManager
|
|
48
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-4BSXZ5YZ.js";
|
|
49
51
|
import {
|
|
50
52
|
CommitManager,
|
|
51
53
|
UserAbortedCommitError,
|
|
52
54
|
ValidationRunner
|
|
53
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-SSASIBDJ.js";
|
|
54
56
|
import {
|
|
55
57
|
installDependencies
|
|
56
58
|
} from "./chunk-RD7I2Q2F.js";
|
|
57
59
|
import {
|
|
58
60
|
GitWorktreeManager
|
|
59
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-HSGZW3ID.js";
|
|
60
62
|
import "./chunk-XPKN3QWY.js";
|
|
61
63
|
import {
|
|
62
64
|
PRManager
|
|
63
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-EQOFNPEY.js";
|
|
64
66
|
import {
|
|
65
67
|
openBrowser
|
|
66
68
|
} from "./chunk-YETJNRQM.js";
|
|
67
69
|
import {
|
|
68
70
|
IssueManagementProviderFactory
|
|
69
|
-
} from "./chunk-
|
|
70
|
-
import
|
|
71
|
+
} from "./chunk-UDZCTLD6.js";
|
|
72
|
+
import {
|
|
73
|
+
getLinearChildIssues
|
|
74
|
+
} from "./chunk-RNBIISBZ.js";
|
|
71
75
|
import {
|
|
72
76
|
getConfiguredRepoFromSettings,
|
|
73
77
|
hasMultipleRemotes
|
|
@@ -79,9 +83,9 @@ import {
|
|
|
79
83
|
} from "./chunk-O7VL5N6S.js";
|
|
80
84
|
import {
|
|
81
85
|
ClaudeContextManager
|
|
82
|
-
} from "./chunk-
|
|
83
|
-
import "./chunk-
|
|
84
|
-
import "./chunk-
|
|
86
|
+
} from "./chunk-PLI3JQWT.js";
|
|
87
|
+
import "./chunk-XU5A6BWA.js";
|
|
88
|
+
import "./chunk-66QOCD5N.js";
|
|
85
89
|
import {
|
|
86
90
|
extractSettingsOverrides
|
|
87
91
|
} from "./chunk-GYCR2LOU.js";
|
|
@@ -95,27 +99,28 @@ import {
|
|
|
95
99
|
findMainWorktreePathWithSettings,
|
|
96
100
|
findPlaceholderCommitSha,
|
|
97
101
|
getMergeTargetBranch,
|
|
98
|
-
getRepoRoot,
|
|
99
102
|
isPlaceholderCommit,
|
|
100
103
|
isValidGitRepo,
|
|
101
104
|
pushBranchToRemote,
|
|
102
105
|
removePlaceholderCommitFromHead,
|
|
103
106
|
removePlaceholderCommitFromHistory
|
|
104
|
-
} from "./chunk-
|
|
107
|
+
} from "./chunk-GDS2HXSW.js";
|
|
105
108
|
import {
|
|
106
109
|
SettingsManager
|
|
107
|
-
} from "./chunk-
|
|
110
|
+
} from "./chunk-IWIIOFEB.js";
|
|
108
111
|
import {
|
|
109
112
|
MetadataManager
|
|
110
|
-
} from "./chunk-
|
|
113
|
+
} from "./chunk-KBEIQP4G.js";
|
|
111
114
|
import {
|
|
112
115
|
GitHubService
|
|
113
|
-
} from "./chunk-
|
|
114
|
-
import
|
|
116
|
+
} from "./chunk-PVW6JE7E.js";
|
|
117
|
+
import {
|
|
118
|
+
getSubIssues
|
|
119
|
+
} from "./chunk-THS5L54H.js";
|
|
115
120
|
import {
|
|
116
121
|
promptConfirmation,
|
|
117
122
|
waitForKeypress
|
|
118
|
-
} from "./chunk-
|
|
123
|
+
} from "./chunk-7JDMYTFZ.js";
|
|
119
124
|
import "./chunk-433MOLAU.js";
|
|
120
125
|
import "./chunk-IGKPPACU.js";
|
|
121
126
|
import {
|
|
@@ -132,65 +137,7 @@ import {
|
|
|
132
137
|
import { program, Option } from "commander";
|
|
133
138
|
|
|
134
139
|
// src/commands/start.ts
|
|
135
|
-
import path2 from "path";
|
|
136
|
-
|
|
137
|
-
// src/utils/first-run-setup.ts
|
|
138
|
-
import { existsSync } from "fs";
|
|
139
|
-
import { readFile } from "fs/promises";
|
|
140
140
|
import path from "path";
|
|
141
|
-
async function getProjectRoot() {
|
|
142
|
-
const repoRoot = await getRepoRoot();
|
|
143
|
-
if (repoRoot) {
|
|
144
|
-
logger.debug(`getProjectRoot: Using git repo root: ${repoRoot}`);
|
|
145
|
-
return repoRoot;
|
|
146
|
-
}
|
|
147
|
-
const cwd = process.cwd();
|
|
148
|
-
logger.debug(`getProjectRoot: Not in git repo, using cwd: ${cwd}`);
|
|
149
|
-
return cwd;
|
|
150
|
-
}
|
|
151
|
-
async function needsFirstRunSetup() {
|
|
152
|
-
const projectRoot = await getProjectRoot();
|
|
153
|
-
const firstRunManager = new FirstRunManager();
|
|
154
|
-
const isConfigured = await firstRunManager.isProjectConfigured(projectRoot);
|
|
155
|
-
if (isConfigured) {
|
|
156
|
-
logger.debug("needsFirstRunSetup: Project is tracked as configured globally");
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
const iloomDir = path.join(projectRoot, ".iloom");
|
|
160
|
-
if (!existsSync(iloomDir)) {
|
|
161
|
-
return true;
|
|
162
|
-
}
|
|
163
|
-
const settingsPath = path.join(iloomDir, "settings.json");
|
|
164
|
-
const settingsLocalPath = path.join(iloomDir, "settings.local.json");
|
|
165
|
-
const hasSettings = await hasNonEmptySettings(settingsPath);
|
|
166
|
-
const hasLocalSettings = await hasNonEmptySettings(settingsLocalPath);
|
|
167
|
-
return !hasSettings && !hasLocalSettings;
|
|
168
|
-
}
|
|
169
|
-
async function hasNonEmptySettings(filePath) {
|
|
170
|
-
if (!existsSync(filePath)) return false;
|
|
171
|
-
try {
|
|
172
|
-
const content = await readFile(filePath, "utf-8");
|
|
173
|
-
const parsed = JSON.parse(content);
|
|
174
|
-
return Object.keys(parsed).length > 0;
|
|
175
|
-
} catch {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
async function launchFirstRunSetup() {
|
|
180
|
-
logger.info("First-time project setup detected.");
|
|
181
|
-
logger.info(
|
|
182
|
-
"iloom will now launch an interactive configuration session with Claude."
|
|
183
|
-
);
|
|
184
|
-
const { waitForKeypress: waitForKeypress2 } = await import("./prompt-3SAZYRUN.js");
|
|
185
|
-
await waitForKeypress2("Press any key to start configuration...");
|
|
186
|
-
const initCommand = new InitCommand();
|
|
187
|
-
await initCommand.execute(
|
|
188
|
-
"Help me configure iloom settings for this project. This is my first time using iloom here. Note: Your iloom command will execute once we are done with configuration changes."
|
|
189
|
-
);
|
|
190
|
-
logger.info("Configuration complete! Continuing with your original command...");
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// src/commands/start.ts
|
|
194
141
|
var StartCommand = class {
|
|
195
142
|
constructor(issueTracker, loomManager, _agentManager, settingsManager) {
|
|
196
143
|
this.loomManager = null;
|
|
@@ -278,7 +225,7 @@ var StartCommand = class {
|
|
|
278
225
|
const parsed = await this.parseInput(input.identifier, repo);
|
|
279
226
|
await this.validateInput(parsed, repo);
|
|
280
227
|
if (parentLoom) {
|
|
281
|
-
const { isInteractiveEnvironment, promptConfirmation: promptConfirmation2 } = await import("./prompt-
|
|
228
|
+
const { isInteractiveEnvironment, promptConfirmation: promptConfirmation2 } = await import("./prompt-ONNPSNKM.js");
|
|
282
229
|
const parentDisplay = parentLoom.type === "issue" ? `issue #${parentLoom.identifier}` : parentLoom.type === "pr" ? `PR #${parentLoom.identifier}` : `branch ${parentLoom.identifier}`;
|
|
283
230
|
if (input.options.childLoom === true) {
|
|
284
231
|
getLogger().info(`Creating as child loom of ${parentDisplay} (--child-loom flag)`);
|
|
@@ -326,7 +273,7 @@ var StartCommand = class {
|
|
|
326
273
|
if (isJsonMode) {
|
|
327
274
|
throw new Error("JSON mode does not support bypassPermissions confirmation prompt");
|
|
328
275
|
}
|
|
329
|
-
const { promptConfirmation: promptConfirmation2 } = await import("./prompt-
|
|
276
|
+
const { promptConfirmation: promptConfirmation2 } = await import("./prompt-ONNPSNKM.js");
|
|
330
277
|
const confirmed = await promptConfirmation2(
|
|
331
278
|
"WARNING: bypassPermissions mode will allow Claude to execute all tool calls without confirmation. This can be dangerous. Do you want to proceed?"
|
|
332
279
|
);
|
|
@@ -423,9 +370,8 @@ var StartCommand = class {
|
|
|
423
370
|
originalInput: trimmedIdentifier
|
|
424
371
|
};
|
|
425
372
|
}
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
if (linearMatch == null ? void 0 : linearMatch[1]) {
|
|
373
|
+
const identifierMatch = matchIssueIdentifier(trimmedIdentifier);
|
|
374
|
+
if (identifierMatch.type === "linear" && identifierMatch.identifier) {
|
|
429
375
|
const detection = await this.issueTracker.detectInputType(
|
|
430
376
|
trimmedIdentifier,
|
|
431
377
|
repo
|
|
@@ -439,13 +385,11 @@ var StartCommand = class {
|
|
|
439
385
|
};
|
|
440
386
|
}
|
|
441
387
|
throw new Error(
|
|
442
|
-
`Could not find Linear issue ${
|
|
388
|
+
`Could not find Linear issue ${identifierMatch.identifier}`
|
|
443
389
|
);
|
|
444
390
|
}
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
if (numericMatch == null ? void 0 : numericMatch[1]) {
|
|
448
|
-
const number = parseInt(numericMatch[1], 10);
|
|
391
|
+
if (identifierMatch.type === "numeric" && identifierMatch.identifier) {
|
|
392
|
+
const number = parseInt(identifierMatch.identifier, 10);
|
|
449
393
|
if (this.issueTracker.supportsPullRequests) {
|
|
450
394
|
const detection = await this.issueTracker.detectInputType(
|
|
451
395
|
trimmedIdentifier,
|
|
@@ -582,7 +526,7 @@ var StartCommand = class {
|
|
|
582
526
|
if (loom.path === mainWorktreePath) {
|
|
583
527
|
return false;
|
|
584
528
|
}
|
|
585
|
-
return cwd === loom.path || cwd.startsWith(loom.path +
|
|
529
|
+
return cwd === loom.path || cwd.startsWith(loom.path + path.sep);
|
|
586
530
|
});
|
|
587
531
|
if (!parentLoom) {
|
|
588
532
|
return null;
|
|
@@ -778,7 +722,7 @@ var EnhanceCommand = class {
|
|
|
778
722
|
};
|
|
779
723
|
|
|
780
724
|
// src/commands/finish.ts
|
|
781
|
-
import
|
|
725
|
+
import path2 from "path";
|
|
782
726
|
var FinishCommand = class {
|
|
783
727
|
constructor(issueTracker, gitWorktreeManager, validationRunner, commitManager, mergeManager, identifierParser, resourceCleanup, buildRunner, settingsManager, loomManager) {
|
|
784
728
|
const envResult = loadEnvIntoProcess();
|
|
@@ -980,7 +924,7 @@ var FinishCommand = class {
|
|
|
980
924
|
* Ports logic from merge-current-issue.sh lines 30-52
|
|
981
925
|
*/
|
|
982
926
|
async autoDetectFromCurrentDirectory() {
|
|
983
|
-
const currentDir =
|
|
927
|
+
const currentDir = path2.basename(process.cwd());
|
|
984
928
|
const prPattern = /_pr_(\d+)$/;
|
|
985
929
|
const prMatch = currentDir.match(prPattern);
|
|
986
930
|
if (prMatch == null ? void 0 : prMatch[1]) {
|
|
@@ -1244,7 +1188,7 @@ var FinishCommand = class {
|
|
|
1244
1188
|
return;
|
|
1245
1189
|
}
|
|
1246
1190
|
if (mergeBehavior.mode === "github-draft-pr") {
|
|
1247
|
-
const { MetadataManager: MetadataManager3 } = await import("./MetadataManager-
|
|
1191
|
+
const { MetadataManager: MetadataManager3 } = await import("./MetadataManager-W3C54UYT.js");
|
|
1248
1192
|
const metadataManager2 = new MetadataManager3();
|
|
1249
1193
|
const metadata = await metadataManager2.readMetadata(worktree.path);
|
|
1250
1194
|
getLogger().debug(`Draft PR mode: worktree=${worktree.path}, draftPrNumber=${(metadata == null ? void 0 : metadata.draftPrNumber) ?? "none"}`);
|
|
@@ -1345,7 +1289,7 @@ var FinishCommand = class {
|
|
|
1345
1289
|
getLogger().debug("Skipping build verification (--skip-build flag provided)");
|
|
1346
1290
|
}
|
|
1347
1291
|
await this.generateSessionSummaryIfConfigured(parsed, worktree, options);
|
|
1348
|
-
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-
|
|
1292
|
+
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-W3C54UYT.js");
|
|
1349
1293
|
const metadataManager = new MetadataManager2();
|
|
1350
1294
|
if (!options.dryRun) {
|
|
1351
1295
|
await metadataManager.archiveMetadata(worktree.path);
|
|
@@ -1374,7 +1318,7 @@ var FinishCommand = class {
|
|
|
1374
1318
|
"Cannot cleanup PR with uncommitted changes. Commit or stash changes, then run again with --force to cleanup anyway."
|
|
1375
1319
|
);
|
|
1376
1320
|
}
|
|
1377
|
-
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-
|
|
1321
|
+
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-W3C54UYT.js");
|
|
1378
1322
|
const metadataManager = new MetadataManager2();
|
|
1379
1323
|
if (!options.dryRun) {
|
|
1380
1324
|
await metadataManager.archiveMetadata(worktree.path);
|
|
@@ -1506,7 +1450,7 @@ var FinishCommand = class {
|
|
|
1506
1450
|
}
|
|
1507
1451
|
finishResult.prUrl = prResult.url;
|
|
1508
1452
|
await this.generateSessionSummaryIfConfigured(parsed, worktree, options, prResult.number);
|
|
1509
|
-
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-
|
|
1453
|
+
const { MetadataManager: MetadataManager2 } = await import("./MetadataManager-W3C54UYT.js");
|
|
1510
1454
|
const metadataManager = new MetadataManager2();
|
|
1511
1455
|
if (!options.dryRun) {
|
|
1512
1456
|
await metadataManager.archiveMetadata(worktree.path);
|
|
@@ -1847,8 +1791,8 @@ var FinishCommand = class {
|
|
|
1847
1791
|
* Check if current working directory is within the target worktree
|
|
1848
1792
|
*/
|
|
1849
1793
|
isRunningFromWithinWorktree(worktreePath) {
|
|
1850
|
-
const normalizedCwd =
|
|
1851
|
-
const normalizedWorktree =
|
|
1794
|
+
const normalizedCwd = path2.normalize(process.cwd());
|
|
1795
|
+
const normalizedWorktree = path2.normalize(worktreePath);
|
|
1852
1796
|
return normalizedCwd.startsWith(normalizedWorktree);
|
|
1853
1797
|
}
|
|
1854
1798
|
/**
|
|
@@ -1903,12 +1847,12 @@ function determineLoomType(worktree) {
|
|
|
1903
1847
|
}
|
|
1904
1848
|
return "branch";
|
|
1905
1849
|
}
|
|
1906
|
-
function extractPRNumbers(
|
|
1907
|
-
if (!
|
|
1850
|
+
function extractPRNumbers(path5) {
|
|
1851
|
+
if (!path5) {
|
|
1908
1852
|
return [];
|
|
1909
1853
|
}
|
|
1910
1854
|
const prPathPattern = /_pr_(\d+)$/;
|
|
1911
|
-
const match =
|
|
1855
|
+
const match = path5.match(prPathPattern);
|
|
1912
1856
|
if (match == null ? void 0 : match[1]) {
|
|
1913
1857
|
return [match[1]];
|
|
1914
1858
|
}
|
|
@@ -1956,7 +1900,9 @@ function formatLoomForJson(worktree, mainWorktreePath, metadata) {
|
|
|
1956
1900
|
projectPath: (metadata == null ? void 0 : metadata.projectPath) ?? null,
|
|
1957
1901
|
issueUrls: (metadata == null ? void 0 : metadata.issueUrls) ?? {},
|
|
1958
1902
|
prUrls: (metadata == null ? void 0 : metadata.prUrls) ?? {},
|
|
1959
|
-
capabilities: (metadata == null ? void 0 : metadata.capabilities) ?? []
|
|
1903
|
+
capabilities: (metadata == null ? void 0 : metadata.capabilities) ?? [],
|
|
1904
|
+
isChildLoom: (metadata == null ? void 0 : metadata.parentLoom) != null,
|
|
1905
|
+
parentLoom: (metadata == null ? void 0 : metadata.parentLoom) ?? null
|
|
1960
1906
|
};
|
|
1961
1907
|
}
|
|
1962
1908
|
function formatLoomsForJson(worktrees, mainWorktreePath, metadata) {
|
|
@@ -1983,21 +1929,125 @@ function formatFinishedLoomForJson(metadata) {
|
|
|
1983
1929
|
prUrls: metadata.prUrls ?? {},
|
|
1984
1930
|
capabilities: metadata.capabilities ?? [],
|
|
1985
1931
|
status: metadata.status ?? "finished",
|
|
1986
|
-
finishedAt: metadata.finishedAt ?? null
|
|
1932
|
+
finishedAt: metadata.finishedAt ?? null,
|
|
1933
|
+
isChildLoom: metadata.parentLoom != null,
|
|
1934
|
+
parentLoom: metadata.parentLoom ?? null
|
|
1987
1935
|
};
|
|
1988
1936
|
}
|
|
1989
1937
|
|
|
1938
|
+
// src/utils/list-children.ts
|
|
1939
|
+
async function fetchChildIssues(parentIssueNumber, settings, repo) {
|
|
1940
|
+
const providerName = IssueTrackerFactory.getProviderName(settings);
|
|
1941
|
+
logger.debug("Fetching child issues", { parentIssueNumber, provider: providerName, repo });
|
|
1942
|
+
const results = await Promise.allSettled([
|
|
1943
|
+
(async () => {
|
|
1944
|
+
if (providerName === "github") {
|
|
1945
|
+
const issueNum = parseInt(parentIssueNumber, 10);
|
|
1946
|
+
if (isNaN(issueNum)) {
|
|
1947
|
+
logger.warn(`Invalid GitHub issue number: ${parentIssueNumber}`);
|
|
1948
|
+
return [];
|
|
1949
|
+
}
|
|
1950
|
+
return getSubIssues(issueNum, repo);
|
|
1951
|
+
} else if (providerName === "linear") {
|
|
1952
|
+
return getLinearChildIssues(parentIssueNumber);
|
|
1953
|
+
} else {
|
|
1954
|
+
logger.warn(`Unsupported issue tracker provider: ${providerName}`);
|
|
1955
|
+
return [];
|
|
1956
|
+
}
|
|
1957
|
+
})()
|
|
1958
|
+
]);
|
|
1959
|
+
const result = results[0];
|
|
1960
|
+
if (result.status === "fulfilled") {
|
|
1961
|
+
return result.value;
|
|
1962
|
+
} else {
|
|
1963
|
+
logger.warn(`Failed to fetch child issues for ${parentIssueNumber}`, { error: result.reason });
|
|
1964
|
+
return [];
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
async function findChildLooms(parentBranchName, metadataManager) {
|
|
1968
|
+
logger.debug("Finding child looms", { parentBranchName });
|
|
1969
|
+
const allMetadata = await metadataManager.listAllMetadata();
|
|
1970
|
+
const childLooms = allMetadata.filter((metadata) => {
|
|
1971
|
+
if (!metadata.parentLoom) {
|
|
1972
|
+
return false;
|
|
1973
|
+
}
|
|
1974
|
+
return metadata.parentLoom.branchName === parentBranchName;
|
|
1975
|
+
});
|
|
1976
|
+
logger.debug(`Found ${childLooms.length} child looms for parent: ${parentBranchName}`);
|
|
1977
|
+
return childLooms;
|
|
1978
|
+
}
|
|
1979
|
+
function matchChildrenData(childIssues, childLooms) {
|
|
1980
|
+
const issueToLoomMap = /* @__PURE__ */ new Map();
|
|
1981
|
+
for (const loom of childLooms) {
|
|
1982
|
+
for (const issueNum of loom.issue_numbers) {
|
|
1983
|
+
issueToLoomMap.set(issueNum, loom);
|
|
1984
|
+
}
|
|
1985
|
+
}
|
|
1986
|
+
const childIssueIds = new Set(childIssues.map((issue) => issue.id));
|
|
1987
|
+
const matchedIssues = childIssues.map((issue) => {
|
|
1988
|
+
const matchingLoom = issueToLoomMap.get(issue.id);
|
|
1989
|
+
return {
|
|
1990
|
+
id: issue.id,
|
|
1991
|
+
title: issue.title,
|
|
1992
|
+
url: issue.url,
|
|
1993
|
+
state: issue.state,
|
|
1994
|
+
hasActiveLoom: matchingLoom != null,
|
|
1995
|
+
loomBranch: (matchingLoom == null ? void 0 : matchingLoom.branchName) ?? null
|
|
1996
|
+
};
|
|
1997
|
+
});
|
|
1998
|
+
const matchedLooms = childLooms.map((loom) => {
|
|
1999
|
+
const hasMatchingIssue = loom.issue_numbers.some((issueNum) => childIssueIds.has(issueNum));
|
|
2000
|
+
return {
|
|
2001
|
+
branch: loom.branchName ?? "",
|
|
2002
|
+
issueNumbers: loom.issue_numbers,
|
|
2003
|
+
hasMatchingIssue
|
|
2004
|
+
};
|
|
2005
|
+
});
|
|
2006
|
+
const summary = {
|
|
2007
|
+
totalIssues: matchedIssues.length,
|
|
2008
|
+
issuesWithLooms: matchedIssues.filter((issue) => issue.hasActiveLoom).length,
|
|
2009
|
+
totalLooms: matchedLooms.length,
|
|
2010
|
+
orphanLooms: matchedLooms.filter((loom) => !loom.hasMatchingIssue).length
|
|
2011
|
+
};
|
|
2012
|
+
return {
|
|
2013
|
+
issues: matchedIssues,
|
|
2014
|
+
looms: matchedLooms,
|
|
2015
|
+
summary
|
|
2016
|
+
};
|
|
2017
|
+
}
|
|
2018
|
+
async function assembleChildrenData(parentLoom, metadataManager, settings, repo) {
|
|
2019
|
+
if (!parentLoom.issue_numbers || parentLoom.issue_numbers.length === 0) {
|
|
2020
|
+
logger.debug("No issue_numbers on loom, skipping children fetch", {
|
|
2021
|
+
branch: parentLoom.branchName
|
|
2022
|
+
});
|
|
2023
|
+
return null;
|
|
2024
|
+
}
|
|
2025
|
+
if (!parentLoom.branchName) {
|
|
2026
|
+
logger.debug("No branchName on loom, skipping children fetch");
|
|
2027
|
+
return null;
|
|
2028
|
+
}
|
|
2029
|
+
const parentIssueNumber = parentLoom.issue_numbers[0];
|
|
2030
|
+
if (parentIssueNumber === void 0) {
|
|
2031
|
+
return null;
|
|
2032
|
+
}
|
|
2033
|
+
const [childIssues, childLooms] = await Promise.all([
|
|
2034
|
+
fetchChildIssues(parentIssueNumber, settings, repo),
|
|
2035
|
+
findChildLooms(parentLoom.branchName, metadataManager)
|
|
2036
|
+
]);
|
|
2037
|
+
return matchChildrenData(childIssues, childLooms);
|
|
2038
|
+
}
|
|
2039
|
+
|
|
1990
2040
|
// src/cli.ts
|
|
1991
2041
|
import fs3 from "fs-extra";
|
|
1992
2042
|
|
|
1993
2043
|
// src/lib/VersionMigrationManager.ts
|
|
1994
2044
|
import fs2 from "fs-extra";
|
|
1995
|
-
import
|
|
2045
|
+
import path4 from "path";
|
|
1996
2046
|
import os2 from "os";
|
|
1997
2047
|
|
|
1998
2048
|
// src/migrations/index.ts
|
|
1999
2049
|
import fs from "fs-extra";
|
|
2000
|
-
import
|
|
2050
|
+
import path3 from "path";
|
|
2001
2051
|
import os from "os";
|
|
2002
2052
|
var migrations = [
|
|
2003
2053
|
// v0.6.0 is the baseline - no migrations needed
|
|
@@ -2005,9 +2055,9 @@ var migrations = [
|
|
|
2005
2055
|
version: "0.6.1",
|
|
2006
2056
|
description: "Add global gitignore for .iloom/settings.local.json",
|
|
2007
2057
|
migrate: async () => {
|
|
2008
|
-
const globalIgnorePath =
|
|
2058
|
+
const globalIgnorePath = path3.join(os.homedir(), ".config", "git", "ignore");
|
|
2009
2059
|
const pattern = "**/.iloom/settings.local.json";
|
|
2010
|
-
await fs.ensureDir(
|
|
2060
|
+
await fs.ensureDir(path3.dirname(globalIgnorePath));
|
|
2011
2061
|
let content = "";
|
|
2012
2062
|
try {
|
|
2013
2063
|
content = await fs.readFile(globalIgnorePath, "utf-8");
|
|
@@ -2025,9 +2075,9 @@ var migrations = [
|
|
|
2025
2075
|
version: "0.7.1",
|
|
2026
2076
|
description: "Add global gitignore for .iloom/package.iloom.local.json",
|
|
2027
2077
|
migrate: async () => {
|
|
2028
|
-
const globalIgnorePath =
|
|
2078
|
+
const globalIgnorePath = path3.join(os.homedir(), ".config", "git", "ignore");
|
|
2029
2079
|
const pattern = "**/.iloom/package.iloom.local.json";
|
|
2030
|
-
await fs.ensureDir(
|
|
2080
|
+
await fs.ensureDir(path3.dirname(globalIgnorePath));
|
|
2031
2081
|
let content = "";
|
|
2032
2082
|
try {
|
|
2033
2083
|
content = await fs.readFile(globalIgnorePath, "utf-8");
|
|
@@ -2051,7 +2101,7 @@ var VersionMigrationManager = class {
|
|
|
2051
2101
|
}
|
|
2052
2102
|
// Return path to migration state file
|
|
2053
2103
|
getMigrationStatePath() {
|
|
2054
|
-
return
|
|
2104
|
+
return path4.join(os2.homedir(), ".config", "iloom-ai", "migration-state.json");
|
|
2055
2105
|
}
|
|
2056
2106
|
// Get effective version, respecting ILOOM_VERSION_OVERRIDE env var
|
|
2057
2107
|
// packageVersion is the version from package.json passed by caller
|
|
@@ -2091,7 +2141,7 @@ var VersionMigrationManager = class {
|
|
|
2091
2141
|
async saveMigrationState(version, newFailures = []) {
|
|
2092
2142
|
const statePath = this.getMigrationStatePath();
|
|
2093
2143
|
try {
|
|
2094
|
-
await fs2.ensureDir(
|
|
2144
|
+
await fs2.ensureDir(path4.dirname(statePath));
|
|
2095
2145
|
const existingState = await this.loadFullMigrationState();
|
|
2096
2146
|
const existingFailures = existingState.failedMigrations ?? [];
|
|
2097
2147
|
const allFailures = [...existingFailures];
|
|
@@ -2195,7 +2245,7 @@ program.name("iloom").description(packageJson.description).version(packageJson.v
|
|
|
2195
2245
|
} catch {
|
|
2196
2246
|
}
|
|
2197
2247
|
try {
|
|
2198
|
-
const { SettingsMigrationManager } = await import("./SettingsMigrationManager-
|
|
2248
|
+
const { SettingsMigrationManager } = await import("./SettingsMigrationManager-LEBMJP3B.js");
|
|
2199
2249
|
const migrationManager = new SettingsMigrationManager();
|
|
2200
2250
|
await migrationManager.migrateSettingsIfNeeded();
|
|
2201
2251
|
} catch (error) {
|
|
@@ -2332,18 +2382,18 @@ async function autoLaunchInitForMultipleRemotes() {
|
|
|
2332
2382
|
logger.info("iloom will now launch an interactive configuration session with Claude");
|
|
2333
2383
|
logger.info("to help you select which remote to use for GitHub operations.");
|
|
2334
2384
|
logger.info("");
|
|
2335
|
-
const { waitForKeypress: waitForKeypress2 } = await import("./prompt-
|
|
2385
|
+
const { waitForKeypress: waitForKeypress2 } = await import("./prompt-ONNPSNKM.js");
|
|
2336
2386
|
await waitForKeypress2("Press any key to start configuration...");
|
|
2337
2387
|
logger.info("");
|
|
2338
2388
|
try {
|
|
2339
|
-
const { InitCommand
|
|
2340
|
-
const initCommand = new
|
|
2389
|
+
const { InitCommand } = await import("./init-MZBIXQ7V.js");
|
|
2390
|
+
const initCommand = new InitCommand();
|
|
2341
2391
|
const customInitialMessage = "Help me configure which git remote iloom should use for GitHub operations. I have multiple remotes and need to select the correct one.";
|
|
2342
2392
|
await initCommand.execute(customInitialMessage);
|
|
2343
2393
|
logger.info("");
|
|
2344
2394
|
logger.info("Configuration complete! Continuing with your original command...");
|
|
2345
2395
|
logger.info("");
|
|
2346
|
-
const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-
|
|
2396
|
+
const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-VCVLL32H.js");
|
|
2347
2397
|
const settingsManager = new SettingsManager2();
|
|
2348
2398
|
const settings = await settingsManager.loadSettings();
|
|
2349
2399
|
const { hasMultipleRemotes: hasMultipleRemotes2 } = await import("./remote-IJAMOEAP.js");
|
|
@@ -2373,7 +2423,7 @@ program.command("start").alias("new").alias("create").alias("up").description("C
|
|
|
2373
2423
|
logger.error("JSON mode requires identifier argument");
|
|
2374
2424
|
process.exit(1);
|
|
2375
2425
|
}
|
|
2376
|
-
const { promptInput } = await import("./prompt-
|
|
2426
|
+
const { promptInput } = await import("./prompt-ONNPSNKM.js");
|
|
2377
2427
|
finalIdentifier = await promptInput("Enter issue number, PR number (pr/123), or branch name");
|
|
2378
2428
|
if (!(finalIdentifier == null ? void 0 : finalIdentifier.trim())) {
|
|
2379
2429
|
logger.error("Identifier is required");
|
|
@@ -2437,7 +2487,7 @@ program.command("add-issue").alias("a").description("Create and enhance GitHub i
|
|
|
2437
2487
|
});
|
|
2438
2488
|
program.command("feedback").alias("f").description("Submit feedback/bug report to iloom-cli repository").argument("<description>", "Feedback title (>30 chars, >2 spaces; or any non-empty text when --body provided)").option("--body <text>", "Body text for feedback (added after diagnostics)").action(async (description, options) => {
|
|
2439
2489
|
try {
|
|
2440
|
-
const { FeedbackCommand } = await import("./feedback-
|
|
2490
|
+
const { FeedbackCommand } = await import("./feedback-HZVLOTQJ.js");
|
|
2441
2491
|
const command = new FeedbackCommand();
|
|
2442
2492
|
const feedbackOptions = {};
|
|
2443
2493
|
if (options.body !== void 0) {
|
|
@@ -2522,7 +2572,7 @@ program.command("finish").alias("dn").description("Merge work and cleanup worksp
|
|
|
2522
2572
|
program.command("commit").alias("c").description("Commit all uncommitted files with issue reference").option("-m, --message <text>", "Custom commit message (skip Claude generation)").option("--fixes", 'Use "Fixes #N" trailer instead of "Refs #N" (closes issue)').option("--no-review", "Skip commit message review prompt").option("--json", "Output result as JSON (implies --no-review)").option("--wip-commit", "Quick WIP commit: skip validations and pre-commit hooks").action(async (options) => {
|
|
2523
2573
|
const executeAction = async () => {
|
|
2524
2574
|
try {
|
|
2525
|
-
const { CommitCommand } = await import("./commit-
|
|
2575
|
+
const { CommitCommand } = await import("./commit-534QIRHY.js");
|
|
2526
2576
|
const command = new CommitCommand();
|
|
2527
2577
|
const noReview = options.review === false || options.json === true;
|
|
2528
2578
|
const result = await command.execute({
|
|
@@ -2557,7 +2607,7 @@ program.command("commit").alias("c").description("Commit all uncommitted files w
|
|
|
2557
2607
|
});
|
|
2558
2608
|
program.command("rebase").description("Rebase current branch on main with Claude-assisted conflict resolution").option("-f, --force", "Skip confirmation prompts").option("-n, --dry-run", "Preview actions without executing").action(async (options) => {
|
|
2559
2609
|
try {
|
|
2560
|
-
const { RebaseCommand } = await import("./rebase-
|
|
2610
|
+
const { RebaseCommand } = await import("./rebase-7YS3N274.js");
|
|
2561
2611
|
const command = new RebaseCommand();
|
|
2562
2612
|
await command.execute(options);
|
|
2563
2613
|
} catch (error) {
|
|
@@ -2566,12 +2616,12 @@ program.command("rebase").description("Rebase current branch on main with Claude
|
|
|
2566
2616
|
}
|
|
2567
2617
|
});
|
|
2568
2618
|
program.command("spin").alias("ignite").description("Launch Claude with auto-detected workspace context").addOption(
|
|
2569
|
-
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"])
|
|
2619
|
+
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"])
|
|
2570
2620
|
).action(async (options) => {
|
|
2571
2621
|
try {
|
|
2572
|
-
const { IgniteCommand } = await import("./ignite-
|
|
2622
|
+
const { IgniteCommand } = await import("./ignite-ZO7SGUKP.js");
|
|
2573
2623
|
const command = new IgniteCommand();
|
|
2574
|
-
await command.execute(options.oneShot
|
|
2624
|
+
await command.execute(options.oneShot);
|
|
2575
2625
|
} catch (error) {
|
|
2576
2626
|
logger.error(`Failed to spin up loom: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
2577
2627
|
process.exit(1);
|
|
@@ -2580,7 +2630,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
|
|
|
2580
2630
|
program.command("open").description("Open workspace in browser or run CLI tool").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
2581
2631
|
try {
|
|
2582
2632
|
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
2583
|
-
const { OpenCommand } = await import("./open-
|
|
2633
|
+
const { OpenCommand } = await import("./open-2LPZ7XXW.js");
|
|
2584
2634
|
const cmd = new OpenCommand();
|
|
2585
2635
|
const input = identifier ? { identifier, args } : { args };
|
|
2586
2636
|
await cmd.execute(input);
|
|
@@ -2592,7 +2642,7 @@ program.command("open").description("Open workspace in browser or run CLI tool")
|
|
|
2592
2642
|
program.command("run").description("Run CLI tool or open workspace in browser").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").allowUnknownOption().action(async (identifier, _options, command) => {
|
|
2593
2643
|
try {
|
|
2594
2644
|
const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
|
|
2595
|
-
const { RunCommand } = await import("./run-
|
|
2645
|
+
const { RunCommand } = await import("./run-XPGCMFFO.js");
|
|
2596
2646
|
const cmd = new RunCommand();
|
|
2597
2647
|
const input = identifier ? { identifier, args } : { args };
|
|
2598
2648
|
await cmd.execute(input);
|
|
@@ -2603,7 +2653,7 @@ program.command("run").description("Run CLI tool or open workspace in browser").
|
|
|
2603
2653
|
});
|
|
2604
2654
|
program.command("dev-server").alias("dev").description("Start dev server for workspace (foreground)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--json", "Output as JSON").action(async (identifier, options) => {
|
|
2605
2655
|
try {
|
|
2606
|
-
const { DevServerCommand } = await import("./dev-server-
|
|
2656
|
+
const { DevServerCommand } = await import("./dev-server-TYYJM3XA.js");
|
|
2607
2657
|
const cmd = new DevServerCommand();
|
|
2608
2658
|
await cmd.execute({ identifier, json: options == null ? void 0 : options.json });
|
|
2609
2659
|
} catch (error) {
|
|
@@ -2613,7 +2663,7 @@ program.command("dev-server").alias("dev").description("Start dev server for wor
|
|
|
2613
2663
|
});
|
|
2614
2664
|
program.command("shell").alias("terminal").description("Open interactive shell with workspace environment").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
|
|
2615
2665
|
try {
|
|
2616
|
-
const { ShellCommand } = await import("./shell-
|
|
2666
|
+
const { ShellCommand } = await import("./shell-2SPM3Z5O.js");
|
|
2617
2667
|
const cmd = new ShellCommand();
|
|
2618
2668
|
await cmd.execute({ identifier });
|
|
2619
2669
|
} catch (error) {
|
|
@@ -2623,7 +2673,7 @@ program.command("shell").alias("terminal").description("Open interactive shell w
|
|
|
2623
2673
|
});
|
|
2624
2674
|
program.command("build").description("Run the build script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
|
|
2625
2675
|
try {
|
|
2626
|
-
const { BuildCommand } = await import("./build-
|
|
2676
|
+
const { BuildCommand } = await import("./build-H4DK3DMQ.js");
|
|
2627
2677
|
const cmd = new BuildCommand();
|
|
2628
2678
|
await cmd.execute(identifier ? { identifier } : {});
|
|
2629
2679
|
} catch (error) {
|
|
@@ -2633,7 +2683,7 @@ program.command("build").description("Run the build script").argument("[identifi
|
|
|
2633
2683
|
});
|
|
2634
2684
|
program.command("lint").description("Run the lint script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
|
|
2635
2685
|
try {
|
|
2636
|
-
const { LintCommand } = await import("./lint-
|
|
2686
|
+
const { LintCommand } = await import("./lint-MDVUV3W2.js");
|
|
2637
2687
|
const cmd = new LintCommand();
|
|
2638
2688
|
await cmd.execute(identifier ? { identifier } : {});
|
|
2639
2689
|
} catch (error) {
|
|
@@ -2643,7 +2693,7 @@ program.command("lint").description("Run the lint script").argument("[identifier
|
|
|
2643
2693
|
});
|
|
2644
2694
|
program.command("test").description("Run the test script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
|
|
2645
2695
|
try {
|
|
2646
|
-
const { TestCommand } = await import("./test-
|
|
2696
|
+
const { TestCommand } = await import("./test-N2725YRI.js");
|
|
2647
2697
|
const cmd = new TestCommand();
|
|
2648
2698
|
await cmd.execute(identifier ? { identifier } : {});
|
|
2649
2699
|
} catch (error) {
|
|
@@ -2653,7 +2703,7 @@ program.command("test").description("Run the test script").argument("[identifier
|
|
|
2653
2703
|
});
|
|
2654
2704
|
program.command("compile").alias("typecheck").description("Run the compile or typecheck script (prefers compile if both exist)").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
|
|
2655
2705
|
try {
|
|
2656
|
-
const { CompileCommand } = await import("./compile-
|
|
2706
|
+
const { CompileCommand } = await import("./compile-ZOAODFN2.js");
|
|
2657
2707
|
const cmd = new CompileCommand();
|
|
2658
2708
|
await cmd.execute(identifier ? { identifier } : {});
|
|
2659
2709
|
} catch (error) {
|
|
@@ -2664,7 +2714,7 @@ program.command("compile").alias("typecheck").description("Run the compile or ty
|
|
|
2664
2714
|
program.command("cleanup").alias("remove").alias("clean").description("Remove workspaces").argument("[identifier]", "Branch name or issue number to cleanup (auto-detected)").option("-l, --list", "List all worktrees").option("-a, --all", "Remove all worktrees (interactive confirmation)").option("-i, --issue <number>", "Cleanup by issue number", parseInt).option("-f, --force", "Skip confirmations and force removal").option("--dry-run", "Show what would be done without doing it").option("--json", "Output result as JSON").option("--defer <ms>", "Wait specified milliseconds before cleanup", parseInt).action(async (identifier, options) => {
|
|
2665
2715
|
const executeAction = async () => {
|
|
2666
2716
|
try {
|
|
2667
|
-
const { CleanupCommand } = await import("./cleanup-
|
|
2717
|
+
const { CleanupCommand } = await import("./cleanup-OGE7V7AD.js");
|
|
2668
2718
|
const command = new CleanupCommand();
|
|
2669
2719
|
const input = {
|
|
2670
2720
|
options: options ?? {}
|
|
@@ -2693,7 +2743,7 @@ program.command("cleanup").alias("remove").alias("clean").description("Remove wo
|
|
|
2693
2743
|
await executeAction();
|
|
2694
2744
|
}
|
|
2695
2745
|
});
|
|
2696
|
-
program.command("list").description("Show active workspaces").option("--json", "Output as JSON").option("--finished", "Show only finished looms (sorted by finish time, latest first)").option("--all", "Show both active and finished looms").option("--global", "Show looms from all projects (default: current project only)").action(async (options) => {
|
|
2746
|
+
program.command("list").description("Show active workspaces").option("--json", "Output as JSON").option("--finished", "Show only finished looms (sorted by finish time, latest first)").option("--all", "Show both active and finished looms").option("--global", "Show looms from all projects (default: current project only)").option("--children", "Fetch and display child issues and child looms for each parent loom").action(async (options) => {
|
|
2697
2747
|
try {
|
|
2698
2748
|
const manager = new GitWorktreeManager();
|
|
2699
2749
|
const metadataManager = new MetadataManager();
|
|
@@ -2792,7 +2842,9 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2792
2842
|
issueUrls: loom.issueUrls ?? {},
|
|
2793
2843
|
prUrls: loom.prUrls ?? {},
|
|
2794
2844
|
status: "active",
|
|
2795
|
-
finishedAt: null
|
|
2845
|
+
finishedAt: null,
|
|
2846
|
+
isChildLoom: loom.parentLoom != null,
|
|
2847
|
+
parentLoom: loom.parentLoom ?? null
|
|
2796
2848
|
}));
|
|
2797
2849
|
} else {
|
|
2798
2850
|
activeJson = formatLoomsForJson(worktrees, mainWorktreePath, metadata).map((loom) => ({
|
|
@@ -2813,6 +2865,47 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2813
2865
|
(loom) => loom.projectPath == null || loom.projectPath === currentProjectPath
|
|
2814
2866
|
);
|
|
2815
2867
|
}
|
|
2868
|
+
if (options.children) {
|
|
2869
|
+
const settingsManager = new SettingsManager();
|
|
2870
|
+
const settings = await settingsManager.loadSettings();
|
|
2871
|
+
const activeChildrenResults = await Promise.allSettled(
|
|
2872
|
+
activeJson.map(async (loom) => {
|
|
2873
|
+
const index = activeJson.indexOf(loom);
|
|
2874
|
+
const loomMetadata = options.global ? globalActiveLooms.find((m) => m.branchName === loom.branch) : metadata.get(loom.worktreePath ?? "");
|
|
2875
|
+
if (!loomMetadata) {
|
|
2876
|
+
return { index, children: null };
|
|
2877
|
+
}
|
|
2878
|
+
const children = await assembleChildrenData(loomMetadata, metadataManager, settings);
|
|
2879
|
+
return { index, children };
|
|
2880
|
+
})
|
|
2881
|
+
);
|
|
2882
|
+
for (const result of activeChildrenResults) {
|
|
2883
|
+
if (result.status === "fulfilled" && result.value.children) {
|
|
2884
|
+
const loom = activeJson[result.value.index];
|
|
2885
|
+
if (loom) {
|
|
2886
|
+
loom.children = result.value.children;
|
|
2887
|
+
}
|
|
2888
|
+
}
|
|
2889
|
+
}
|
|
2890
|
+
const finishedChildrenResults = await Promise.allSettled(
|
|
2891
|
+
finishedJson.map(async (loom, index) => {
|
|
2892
|
+
const loomMetadata = finishedLooms.find((m) => m.branchName === loom.branch);
|
|
2893
|
+
if (!loomMetadata) {
|
|
2894
|
+
return { index, children: null };
|
|
2895
|
+
}
|
|
2896
|
+
const children = await assembleChildrenData(loomMetadata, metadataManager, settings);
|
|
2897
|
+
return { index, children };
|
|
2898
|
+
})
|
|
2899
|
+
);
|
|
2900
|
+
for (const result of finishedChildrenResults) {
|
|
2901
|
+
if (result.status === "fulfilled" && result.value.children) {
|
|
2902
|
+
const loom = finishedJson[result.value.index];
|
|
2903
|
+
if (loom) {
|
|
2904
|
+
loom.children = result.value.children;
|
|
2905
|
+
}
|
|
2906
|
+
}
|
|
2907
|
+
}
|
|
2908
|
+
}
|
|
2816
2909
|
const allLooms = [...activeJson, ...finishedJson];
|
|
2817
2910
|
console.log(JSON.stringify(allLooms, null, 2));
|
|
2818
2911
|
return;
|
|
@@ -2829,11 +2922,20 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2829
2922
|
}
|
|
2830
2923
|
return;
|
|
2831
2924
|
}
|
|
2925
|
+
let textSettings = null;
|
|
2926
|
+
if (options.children) {
|
|
2927
|
+
const settingsManager = new SettingsManager();
|
|
2928
|
+
textSettings = await settingsManager.loadSettings();
|
|
2929
|
+
}
|
|
2832
2930
|
if (showActive && hasActive) {
|
|
2833
2931
|
logger.info("Active workspaces:");
|
|
2834
2932
|
if (options.global) {
|
|
2835
2933
|
for (const loom of filteredGlobalActiveLooms) {
|
|
2836
|
-
|
|
2934
|
+
if (loom.parentLoom) {
|
|
2935
|
+
logger.info(` ${loom.branchName ?? "unknown"} (Child of: ${loom.parentLoom.branchName})`);
|
|
2936
|
+
} else {
|
|
2937
|
+
logger.info(` ${loom.branchName ?? "unknown"}`);
|
|
2938
|
+
}
|
|
2837
2939
|
if (loom.description) {
|
|
2838
2940
|
logger.info(` Description: ${loom.description}`);
|
|
2839
2941
|
}
|
|
@@ -2843,17 +2945,43 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2843
2945
|
if (loom.projectPath) {
|
|
2844
2946
|
logger.info(` Project: ${loom.projectPath}`);
|
|
2845
2947
|
}
|
|
2948
|
+
if (options.children && textSettings) {
|
|
2949
|
+
const childrenData = await assembleChildrenData(loom, metadataManager, textSettings);
|
|
2950
|
+
if (childrenData && (childrenData.summary.totalIssues > 0 || childrenData.summary.totalLooms > 0)) {
|
|
2951
|
+
logger.info(` Child Issues: ${childrenData.summary.totalIssues} (${childrenData.summary.issuesWithLooms} with active looms)`);
|
|
2952
|
+
for (const issue of childrenData.issues) {
|
|
2953
|
+
if (!issue.hasActiveLoom) {
|
|
2954
|
+
logger.info(` [No loom] #${issue.id} - ${issue.title} (${issue.state})`);
|
|
2955
|
+
}
|
|
2956
|
+
}
|
|
2957
|
+
}
|
|
2958
|
+
}
|
|
2846
2959
|
}
|
|
2847
2960
|
} else {
|
|
2848
2961
|
for (const worktree of filteredWorktrees) {
|
|
2849
2962
|
const formatted = manager.formatWorktree(worktree);
|
|
2850
2963
|
const loomMetadata = metadata.get(worktree.path);
|
|
2851
|
-
|
|
2964
|
+
if (loomMetadata == null ? void 0 : loomMetadata.parentLoom) {
|
|
2965
|
+
logger.info(` ${formatted.title} (Child of: ${loomMetadata.parentLoom.branchName})`);
|
|
2966
|
+
} else {
|
|
2967
|
+
logger.info(` ${formatted.title}`);
|
|
2968
|
+
}
|
|
2852
2969
|
if (loomMetadata == null ? void 0 : loomMetadata.description) {
|
|
2853
2970
|
logger.info(` Description: ${loomMetadata.description}`);
|
|
2854
2971
|
}
|
|
2855
2972
|
logger.info(` Path: ${formatted.path}`);
|
|
2856
2973
|
logger.info(` Commit: ${formatted.commit}`);
|
|
2974
|
+
if (options.children && textSettings && loomMetadata) {
|
|
2975
|
+
const childrenData = await assembleChildrenData(loomMetadata, metadataManager, textSettings);
|
|
2976
|
+
if (childrenData && (childrenData.summary.totalIssues > 0 || childrenData.summary.totalLooms > 0)) {
|
|
2977
|
+
logger.info(` Child Issues: ${childrenData.summary.totalIssues} (${childrenData.summary.issuesWithLooms} with active looms)`);
|
|
2978
|
+
for (const issue of childrenData.issues) {
|
|
2979
|
+
if (!issue.hasActiveLoom) {
|
|
2980
|
+
logger.info(` [No loom] #${issue.id} - ${issue.title} (${issue.state})`);
|
|
2981
|
+
}
|
|
2982
|
+
}
|
|
2983
|
+
}
|
|
2984
|
+
}
|
|
2857
2985
|
}
|
|
2858
2986
|
}
|
|
2859
2987
|
}
|
|
@@ -2863,13 +2991,28 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2863
2991
|
}
|
|
2864
2992
|
logger.info("Finished looms:");
|
|
2865
2993
|
for (const loom of filteredFinishedLooms) {
|
|
2866
|
-
|
|
2994
|
+
if (loom.parentLoom) {
|
|
2995
|
+
logger.info(` ${loom.branchName ?? "unknown"} (Child of: ${loom.parentLoom.branchName})`);
|
|
2996
|
+
} else {
|
|
2997
|
+
logger.info(` ${loom.branchName ?? "unknown"}`);
|
|
2998
|
+
}
|
|
2867
2999
|
if (loom.description) {
|
|
2868
3000
|
logger.info(` Description: ${loom.description}`);
|
|
2869
3001
|
}
|
|
2870
3002
|
if (loom.finishedAt) {
|
|
2871
3003
|
logger.info(` Finished: ${new Date(loom.finishedAt).toLocaleString()}`);
|
|
2872
3004
|
}
|
|
3005
|
+
if (options.children && textSettings) {
|
|
3006
|
+
const childrenData = await assembleChildrenData(loom, metadataManager, textSettings);
|
|
3007
|
+
if (childrenData && (childrenData.summary.totalIssues > 0 || childrenData.summary.totalLooms > 0)) {
|
|
3008
|
+
logger.info(` Child Issues: ${childrenData.summary.totalIssues} (${childrenData.summary.issuesWithLooms} with active looms)`);
|
|
3009
|
+
for (const issue of childrenData.issues) {
|
|
3010
|
+
if (!issue.hasActiveLoom) {
|
|
3011
|
+
logger.info(` [No loom] #${issue.id} - ${issue.title} (${issue.state})`);
|
|
3012
|
+
}
|
|
3013
|
+
}
|
|
3014
|
+
}
|
|
3015
|
+
}
|
|
2873
3016
|
}
|
|
2874
3017
|
}
|
|
2875
3018
|
} catch (error) {
|
|
@@ -2887,7 +3030,7 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2887
3030
|
});
|
|
2888
3031
|
program.command("projects").description("List configured iloom projects").option("--json", "Output as JSON (default behavior)").action(async (options) => {
|
|
2889
3032
|
try {
|
|
2890
|
-
const { ProjectsCommand } = await import("./projects-
|
|
3033
|
+
const { ProjectsCommand } = await import("./projects-325GEEGJ.js");
|
|
2891
3034
|
const command = new ProjectsCommand();
|
|
2892
3035
|
const result = await command.execute(options);
|
|
2893
3036
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -2898,8 +3041,8 @@ program.command("projects").description("List configured iloom projects").option
|
|
|
2898
3041
|
});
|
|
2899
3042
|
program.command("init").alias("config").description("Initialize iloom configuration").argument("[prompt]", 'Custom initial message to send to Claude (defaults to "Help me configure iloom settings.")').action(async (prompt) => {
|
|
2900
3043
|
try {
|
|
2901
|
-
const { InitCommand
|
|
2902
|
-
const command = new
|
|
3044
|
+
const { InitCommand } = await import("./init-MZBIXQ7V.js");
|
|
3045
|
+
const command = new InitCommand();
|
|
2903
3046
|
const trimmedPrompt = prompt == null ? void 0 : prompt.trim();
|
|
2904
3047
|
const customPrompt = trimmedPrompt && trimmedPrompt.length > 0 ? trimmedPrompt : void 0;
|
|
2905
3048
|
await command.execute(customPrompt);
|
|
@@ -2908,9 +3051,19 @@ program.command("init").alias("config").description("Initialize iloom configurat
|
|
|
2908
3051
|
process.exit(1);
|
|
2909
3052
|
}
|
|
2910
3053
|
});
|
|
3054
|
+
program.command("plan").description("Launch interactive planning session with Architect persona").argument("[prompt]", "Initial planning prompt or topic").option("--model <model>", "Model to use (default: opus)").option("--yolo", "Enable autonomous mode - Claude proceeds without user interaction").option("--planner <provider>", "AI provider for planning: claude, gemini, codex (default: claude)").option("--reviewer <provider>", "AI provider for review: claude, gemini, codex, none (default: none)").action(async (prompt, options) => {
|
|
3055
|
+
try {
|
|
3056
|
+
const { PlanCommand } = await import("./plan-PIME6UNY.js");
|
|
3057
|
+
const command = new PlanCommand();
|
|
3058
|
+
await command.execute(prompt, options == null ? void 0 : options.model, options == null ? void 0 : options.yolo, options == null ? void 0 : options.planner, options == null ? void 0 : options.reviewer);
|
|
3059
|
+
} catch (error) {
|
|
3060
|
+
logger.error(`Planning session failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
3061
|
+
process.exit(1);
|
|
3062
|
+
}
|
|
3063
|
+
});
|
|
2911
3064
|
program.command("contribute").description("Set up local development environment for contributing to a GitHub project").argument("[repository]", "GitHub repository (owner/repo, github.com/owner/repo, or full URL). Defaults to iloom-ai/iloom-cli").action(async (repository) => {
|
|
2912
3065
|
try {
|
|
2913
|
-
const { ContributeCommand } = await import("./contribute-
|
|
3066
|
+
const { ContributeCommand } = await import("./contribute-7USRBWRM.js");
|
|
2914
3067
|
const command = new ContributeCommand();
|
|
2915
3068
|
await command.execute(repository);
|
|
2916
3069
|
} catch (error) {
|
|
@@ -2930,7 +3083,7 @@ program.command("update").description("Update iloom-cli to the latest version").
|
|
|
2930
3083
|
});
|
|
2931
3084
|
program.command("test-github").description("Test GitHub integration (Issue #3)").argument("<identifier>", "Issue number or PR number").option("--no-claude", "Skip Claude for branch name generation").action(async (identifier, options) => {
|
|
2932
3085
|
try {
|
|
2933
|
-
const { GitHubService: GitHubService2 } = await import("./GitHubService-
|
|
3086
|
+
const { GitHubService: GitHubService2 } = await import("./GitHubService-ACZVNTJE.js");
|
|
2934
3087
|
const { DefaultBranchNamingService: DefaultBranchNamingService2 } = await import("./BranchNamingService-AO7BPIUJ.js");
|
|
2935
3088
|
logger.info("Testing GitHub Integration\n");
|
|
2936
3089
|
const service = new GitHubService2();
|
|
@@ -2990,9 +3143,9 @@ program.command("test-github").description("Test GitHub integration (Issue #3)")
|
|
|
2990
3143
|
program.command("test-claude").description("Test Claude integration (Issue #10)").option("--detect", "Test Claude CLI detection").option("--version", "Get Claude CLI version").option("--branch <title>", "Test branch name generation with given title").option("--issue <number>", "Issue number for branch generation", "123").option("--launch <prompt>", "Launch Claude with a prompt (headless)").option("--interactive", "Launch Claude interactively (requires --launch)").option("--template <name>", "Test template loading").action(async (options) => {
|
|
2991
3144
|
try {
|
|
2992
3145
|
const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-V4HRPR4Z.js");
|
|
2993
|
-
const { PromptTemplateManager } = await import("./PromptTemplateManager-
|
|
2994
|
-
const { ClaudeService } = await import("./ClaudeService-
|
|
2995
|
-
const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-
|
|
3146
|
+
const { PromptTemplateManager } = await import("./PromptTemplateManager-OUYDHOPI.js");
|
|
3147
|
+
const { ClaudeService } = await import("./ClaudeService-FKPOQRA4.js");
|
|
3148
|
+
const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-RDP6CLK6.js");
|
|
2996
3149
|
logger.info("Testing Claude Integration\n");
|
|
2997
3150
|
if (options.detect) {
|
|
2998
3151
|
logger.info("Detecting Claude CLI...");
|
|
@@ -3127,7 +3280,7 @@ program.command("test-claude").description("Test Claude integration (Issue #10)"
|
|
|
3127
3280
|
});
|
|
3128
3281
|
program.command("test-webserver").description("Test if a web server is running on a workspace port").argument("<issue-number>", "Issue number (port will be calculated as 3000 + issue number)", parseInt).option("--kill", "Kill the web server if detected").action(async (issueNumber, options) => {
|
|
3129
3282
|
try {
|
|
3130
|
-
const { TestWebserverCommand } = await import("./test-webserver-
|
|
3283
|
+
const { TestWebserverCommand } = await import("./test-webserver-XLJ2TZFP.js");
|
|
3131
3284
|
const command = new TestWebserverCommand();
|
|
3132
3285
|
await command.execute({ issueNumber, options });
|
|
3133
3286
|
} catch (error) {
|
|
@@ -3140,7 +3293,7 @@ program.command("test-webserver").description("Test if a web server is running o
|
|
|
3140
3293
|
});
|
|
3141
3294
|
program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
|
|
3142
3295
|
try {
|
|
3143
|
-
const { TestGitCommand } = await import("./test-git-
|
|
3296
|
+
const { TestGitCommand } = await import("./test-git-ZPSPA2TP.js");
|
|
3144
3297
|
const command = new TestGitCommand();
|
|
3145
3298
|
await command.execute();
|
|
3146
3299
|
} catch (error) {
|
|
@@ -3166,7 +3319,7 @@ program.command("test-tabs").description("Test iTerm2 dual tab functionality - o
|
|
|
3166
3319
|
});
|
|
3167
3320
|
program.command("test-prefix").description("Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)").action(async () => {
|
|
3168
3321
|
try {
|
|
3169
|
-
const { TestPrefixCommand } = await import("./test-prefix-
|
|
3322
|
+
const { TestPrefixCommand } = await import("./test-prefix-6DLB2BHE.js");
|
|
3170
3323
|
const command = new TestPrefixCommand();
|
|
3171
3324
|
await command.execute();
|
|
3172
3325
|
} catch (error) {
|
|
@@ -3180,7 +3333,7 @@ program.command("test-prefix").description("Test worktree prefix configuration -
|
|
|
3180
3333
|
program.command("summary").description("Generate Claude session summary for a loom").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--with-comment", "Post summary as a comment to the issue/PR").option("--json", "Output result as JSON").action(async (identifier, options) => {
|
|
3181
3334
|
const executeAction = async () => {
|
|
3182
3335
|
try {
|
|
3183
|
-
const { SummaryCommand } = await import("./summary-
|
|
3336
|
+
const { SummaryCommand } = await import("./summary-C5VVSJAJ.js");
|
|
3184
3337
|
const command = new SummaryCommand();
|
|
3185
3338
|
const result = await command.execute({ identifier, options });
|
|
3186
3339
|
if (options.json && result) {
|
|
@@ -3209,7 +3362,7 @@ program.command("summary").description("Generate Claude session summary for a lo
|
|
|
3209
3362
|
program.command("recap").description("Get recap for a loom (defaults to current directory)").argument("[identifier]", "Issue number, PR number (pr/123), or branch name (auto-detected if omitted)").option("--json", "Output as JSON with filePath for file watching").action(async (identifier, options) => {
|
|
3210
3363
|
const executeAction = async () => {
|
|
3211
3364
|
try {
|
|
3212
|
-
const { RecapCommand } = await import("./recap-
|
|
3365
|
+
const { RecapCommand } = await import("./recap-GSXFEOD6.js");
|
|
3213
3366
|
const command = new RecapCommand();
|
|
3214
3367
|
const result = await command.execute({ identifier, json: options.json });
|
|
3215
3368
|
if (options.json && result) {
|
|
@@ -3238,8 +3391,8 @@ program.command("recap").description("Get recap for a loom (defaults to current
|
|
|
3238
3391
|
program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
|
|
3239
3392
|
var _a;
|
|
3240
3393
|
try {
|
|
3241
|
-
const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-
|
|
3242
|
-
const { createNeonProviderFromSettings: createNeonProviderFromSettings2 } = await import("./neon-helpers-
|
|
3394
|
+
const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-VCVLL32H.js");
|
|
3395
|
+
const { createNeonProviderFromSettings: createNeonProviderFromSettings2 } = await import("./neon-helpers-VVFFTLXE.js");
|
|
3243
3396
|
logger.info("Testing Neon Integration\n");
|
|
3244
3397
|
logger.info("1. Settings Configuration:");
|
|
3245
3398
|
const settingsManager = new SettingsManager2();
|