@iloom/cli 0.8.3 → 0.9.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 +50 -4
- package/dist/{BranchNamingService-AO7BPIUJ.js → BranchNamingService-K6XNWQ6C.js} +2 -2
- package/dist/ClaudeContextManager-X2Y72GRL.js +14 -0
- package/dist/ClaudeService-7P32TTES.js +13 -0
- package/dist/{GitHubService-ACZVNTJE.js → GitHubService-O7T6CFAJ.js} +3 -3
- package/dist/{LoomLauncher-NHZMEVTQ.js → LoomLauncher-3I47SUPV.js} +6 -6
- package/dist/{ProjectCapabilityDetector-IA56AUE6.js → ProjectCapabilityDetector-N5L7T4IY.js} +3 -3
- package/dist/PromptTemplateManager-36YLQRHP.js +11 -0
- package/dist/README.md +50 -4
- package/dist/{SettingsManager-VCVLL32H.js → SettingsManager-QR7V2IW2.js} +2 -2
- package/dist/agents/iloom-artifact-reviewer.md +280 -0
- package/dist/agents/iloom-code-reviewer.md +9 -7
- package/dist/agents/iloom-issue-analyze-and-plan.md +21 -6
- package/dist/agents/iloom-issue-analyzer.md +21 -6
- package/dist/agents/iloom-issue-complexity-evaluator.md +21 -6
- package/dist/agents/iloom-issue-enhancer.md +21 -6
- package/dist/agents/iloom-issue-implementer.md +21 -6
- package/dist/agents/iloom-issue-planner.md +21 -6
- package/dist/{build-Z3WCIKPD.js → build-IC4CJRMP.js} +8 -8
- package/dist/{chunk-TVH67KEO.js → chunk-2HZX6AMR.js} +2 -2
- package/dist/{chunk-VZYSM7N7.js → chunk-2JPXGGP4.js} +20 -15
- package/dist/chunk-2JPXGGP4.js.map +1 -0
- package/dist/{chunk-SC6X5EBG.js → chunk-3P6J4IZZ.js} +3 -3
- package/dist/{chunk-HSGZW3ID.js → chunk-4GAJJUYS.js} +3 -3
- package/dist/chunk-4GAJJUYS.js.map +1 -0
- package/dist/{chunk-RD7I2Q2F.js → chunk-4LKGCFGG.js} +2 -2
- package/dist/{chunk-GWONJE3X.js → chunk-4ZIHFUPN.js} +226 -62
- package/dist/chunk-4ZIHFUPN.js.map +1 -0
- package/dist/{chunk-SSASIBDJ.js → chunk-5LVVQGB3.js} +5 -5
- package/dist/{chunk-4BSXZ5YZ.js → chunk-B7U6OKUR.js} +5 -24
- package/dist/chunk-B7U6OKUR.js.map +1 -0
- package/dist/{chunk-RNBIISBZ.js → chunk-ENGCJIYQ.js} +48 -3
- package/dist/chunk-ENGCJIYQ.js.map +1 -0
- package/dist/{chunk-IGKPPACU.js → chunk-FO5GGFOV.js} +17 -8
- package/dist/chunk-FO5GGFOV.js.map +1 -0
- package/dist/{chunk-GDS2HXSW.js → chunk-H6ST2TGP.js} +20 -3
- package/dist/chunk-H6ST2TGP.js.map +1 -0
- package/dist/{chunk-A7XHHUEV.js → chunk-HZXBHMVM.js} +47 -22
- package/dist/chunk-HZXBHMVM.js.map +1 -0
- package/dist/{chunk-44Y5IF7P.js → chunk-I3HMNWQQ.js} +9 -8
- package/dist/chunk-I3HMNWQQ.js.map +1 -0
- package/dist/{chunk-XJHQVOT6.js → chunk-J7FJ6PUT.js} +2 -2
- package/dist/chunk-JT5LZRMI.js +302 -0
- package/dist/chunk-JT5LZRMI.js.map +1 -0
- package/dist/{chunk-Q457PKGH.js → chunk-KAYXR544.js} +2 -2
- package/dist/{chunk-XU5A6BWA.js → chunk-MZPRBNYC.js} +4 -4
- package/dist/{chunk-XHNACIHO.js → chunk-NTTSUAVM.js} +2 -2
- package/dist/{chunk-PLI3JQWT.js → chunk-OAVJR4PM.js} +2 -2
- package/dist/{chunk-UDZCTLD6.js → chunk-OK7LUTRW.js} +3 -3
- package/dist/{chunk-PBSHQVCT.js → chunk-POU2UMWN.js} +5 -5
- package/dist/chunk-QN47QVBX.js +131 -0
- package/dist/chunk-QN47QVBX.js.map +1 -0
- package/dist/{chunk-3FC3VNEX.js → chunk-RD7OPXZK.js} +34 -8
- package/dist/chunk-RD7OPXZK.js.map +1 -0
- package/dist/{chunk-O6LECMT6.js → chunk-TGRK3CHF.js} +8 -8
- package/dist/{chunk-7GLZVDPQ.js → chunk-TL72BGP6.js} +2 -2
- package/dist/{chunk-THS5L54H.js → chunk-TRUMP4DA.js} +26 -2
- package/dist/{chunk-THS5L54H.js.map → chunk-TRUMP4DA.js.map} +1 -1
- package/dist/{chunk-52MVUK5V.js → chunk-USSL2X4A.js} +2 -2
- package/dist/chunk-USSL2X4A.js.map +1 -0
- package/dist/{chunk-XPKN3QWY.js → chunk-VOGGLPG5.js} +1 -2
- package/dist/{chunk-IWIIOFEB.js → chunk-XFEK2X2D.js} +16 -6
- package/dist/chunk-XFEK2X2D.js.map +1 -0
- package/dist/{chunk-PVW6JE7E.js → chunk-Y5HSSIK2.js} +2 -2
- package/dist/{chunk-4KGRPHM6.js → chunk-Y5O2ALDZ.js} +3 -3
- package/dist/{claude-V4HRPR4Z.js → claude-TP2QO3BU.js} +2 -2
- package/dist/{cleanup-NWNKWPUY.js → cleanup-D3CSRBBZ.js} +23 -18
- package/dist/{cleanup-NWNKWPUY.js.map → cleanup-D3CSRBBZ.js.map} +1 -1
- package/dist/cli.js +143 -93
- package/dist/cli.js.map +1 -1
- package/dist/{commit-534QIRHY.js → commit-IWGT42XN.js} +13 -13
- package/dist/{compile-UANHMNTS.js → compile-EOWJORKO.js} +8 -8
- package/dist/{contribute-7USRBWRM.js → contribute-WSJTV2RX.js} +4 -4
- package/dist/{dev-server-TO7RLYJI.js → dev-server-Q6M62ATG.js} +13 -13
- package/dist/{feedback-7ZZI6RC5.js → feedback-QPNDZQRV.js} +14 -14
- package/dist/{git-GUNOPP4Q.js → git-W3XUIFTR.js} +5 -3
- package/dist/hooks/iloom-hook.js +5 -3
- package/dist/{ignite-JBX3BUDE.js → ignite-OPO6EDYT.js} +95 -52
- package/dist/ignite-OPO6EDYT.js.map +1 -0
- package/dist/index.d.ts +40 -2
- package/dist/index.js +52 -15
- package/dist/index.js.map +1 -1
- package/dist/{chunk-FPNSFP6K.js → init-ALYWKNWG.js} +42 -329
- package/dist/init-ALYWKNWG.js.map +1 -0
- package/dist/issues-L7TBUPXT.js +116 -0
- package/dist/issues-L7TBUPXT.js.map +1 -0
- package/dist/{lint-XPODLDVA.js → lint-IHUH45OC.js} +8 -8
- package/dist/mcp/issue-management-server.js +3 -2
- package/dist/mcp/issue-management-server.js.map +1 -1
- package/dist/{open-M2SUR74Y.js → open-KWOV2OFO.js} +15 -15
- package/dist/{plan-FB4AOJ2Q.js → plan-BRJBFJHF.js} +60 -28
- package/dist/plan-BRJBFJHF.js.map +1 -0
- package/dist/{projects-325GEEGJ.js → projects-LH362JZQ.js} +3 -3
- package/dist/prompts/init-prompt.txt +9 -1
- package/dist/prompts/issue-prompt.txt +310 -0
- package/dist/prompts/plan-prompt.txt +4 -6
- package/dist/prompts/pr-prompt.txt +79 -0
- package/dist/prompts/regular-prompt.txt +205 -0
- package/dist/{rebase-4FNRBW3H.js → rebase-AJOJOZUG.js} +9 -9
- package/dist/{recap-GSXFEOD6.js → recap-GKJXMDXW.js} +5 -5
- package/dist/{run-GZNHRJB2.js → run-QEUVZF7J.js} +15 -15
- package/dist/schema/settings.schema.json +9 -1
- package/dist/{shell-2SPM3Z5O.js → shell-DAAVG4YN.js} +5 -5
- package/dist/{summary-Z4F7YFXE.js → summary-ZKOA35PT.js} +13 -13
- package/dist/{test-LBSPYIJW.js → test-5GPWWO3P.js} +8 -8
- package/dist/{test-git-ZPSPA2TP.js → test-git-EJUKDB7F.js} +3 -3
- package/dist/{test-prefix-6DLB2BHE.js → test-prefix-23TOBUXY.js} +3 -3
- package/dist/{test-webserver-XLJ2TZFP.js → test-webserver-CKROHFBQ.js} +5 -5
- package/dist/{vscode-LH3VSQ2W.js → vscode-6TOLFCI2.js} +5 -5
- package/package.json +2 -2
- package/dist/ClaudeContextManager-RDP6CLK6.js +0 -14
- package/dist/ClaudeService-FKPOQRA4.js +0 -13
- package/dist/PRManager-A63LT3NF.js +0 -16
- package/dist/PromptTemplateManager-OUYDHOPI.js +0 -9
- package/dist/chunk-3FC3VNEX.js.map +0 -1
- package/dist/chunk-44Y5IF7P.js.map +0 -1
- package/dist/chunk-4BSXZ5YZ.js.map +0 -1
- package/dist/chunk-52MVUK5V.js.map +0 -1
- package/dist/chunk-66QOCD5N.js +0 -79
- package/dist/chunk-66QOCD5N.js.map +0 -1
- package/dist/chunk-A7XHHUEV.js.map +0 -1
- package/dist/chunk-FPNSFP6K.js.map +0 -1
- package/dist/chunk-GDS2HXSW.js.map +0 -1
- package/dist/chunk-GWONJE3X.js.map +0 -1
- package/dist/chunk-HSGZW3ID.js.map +0 -1
- package/dist/chunk-IGKPPACU.js.map +0 -1
- package/dist/chunk-IWIIOFEB.js.map +0 -1
- package/dist/chunk-RNBIISBZ.js.map +0 -1
- package/dist/chunk-VZYSM7N7.js.map +0 -1
- package/dist/git-GUNOPP4Q.js.map +0 -1
- package/dist/ignite-JBX3BUDE.js.map +0 -1
- package/dist/init-XXDIB2UJ.js +0 -21
- package/dist/init-XXDIB2UJ.js.map +0 -1
- package/dist/plan-FB4AOJ2Q.js.map +0 -1
- /package/dist/{BranchNamingService-AO7BPIUJ.js.map → BranchNamingService-K6XNWQ6C.js.map} +0 -0
- /package/dist/{ClaudeContextManager-RDP6CLK6.js.map → ClaudeContextManager-X2Y72GRL.js.map} +0 -0
- /package/dist/{ClaudeService-FKPOQRA4.js.map → ClaudeService-7P32TTES.js.map} +0 -0
- /package/dist/{GitHubService-ACZVNTJE.js.map → GitHubService-O7T6CFAJ.js.map} +0 -0
- /package/dist/{LoomLauncher-NHZMEVTQ.js.map → LoomLauncher-3I47SUPV.js.map} +0 -0
- /package/dist/{PRManager-A63LT3NF.js.map → ProjectCapabilityDetector-N5L7T4IY.js.map} +0 -0
- /package/dist/{ProjectCapabilityDetector-IA56AUE6.js.map → PromptTemplateManager-36YLQRHP.js.map} +0 -0
- /package/dist/{PromptTemplateManager-OUYDHOPI.js.map → SettingsManager-QR7V2IW2.js.map} +0 -0
- /package/dist/{build-Z3WCIKPD.js.map → build-IC4CJRMP.js.map} +0 -0
- /package/dist/{chunk-TVH67KEO.js.map → chunk-2HZX6AMR.js.map} +0 -0
- /package/dist/{chunk-SC6X5EBG.js.map → chunk-3P6J4IZZ.js.map} +0 -0
- /package/dist/{chunk-RD7I2Q2F.js.map → chunk-4LKGCFGG.js.map} +0 -0
- /package/dist/{chunk-SSASIBDJ.js.map → chunk-5LVVQGB3.js.map} +0 -0
- /package/dist/{chunk-XJHQVOT6.js.map → chunk-J7FJ6PUT.js.map} +0 -0
- /package/dist/{chunk-Q457PKGH.js.map → chunk-KAYXR544.js.map} +0 -0
- /package/dist/{chunk-XU5A6BWA.js.map → chunk-MZPRBNYC.js.map} +0 -0
- /package/dist/{chunk-XHNACIHO.js.map → chunk-NTTSUAVM.js.map} +0 -0
- /package/dist/{chunk-PLI3JQWT.js.map → chunk-OAVJR4PM.js.map} +0 -0
- /package/dist/{chunk-UDZCTLD6.js.map → chunk-OK7LUTRW.js.map} +0 -0
- /package/dist/{chunk-PBSHQVCT.js.map → chunk-POU2UMWN.js.map} +0 -0
- /package/dist/{chunk-O6LECMT6.js.map → chunk-TGRK3CHF.js.map} +0 -0
- /package/dist/{chunk-7GLZVDPQ.js.map → chunk-TL72BGP6.js.map} +0 -0
- /package/dist/{chunk-XPKN3QWY.js.map → chunk-VOGGLPG5.js.map} +0 -0
- /package/dist/{chunk-PVW6JE7E.js.map → chunk-Y5HSSIK2.js.map} +0 -0
- /package/dist/{chunk-4KGRPHM6.js.map → chunk-Y5O2ALDZ.js.map} +0 -0
- /package/dist/{SettingsManager-VCVLL32H.js.map → claude-TP2QO3BU.js.map} +0 -0
- /package/dist/{commit-534QIRHY.js.map → commit-IWGT42XN.js.map} +0 -0
- /package/dist/{compile-UANHMNTS.js.map → compile-EOWJORKO.js.map} +0 -0
- /package/dist/{contribute-7USRBWRM.js.map → contribute-WSJTV2RX.js.map} +0 -0
- /package/dist/{dev-server-TO7RLYJI.js.map → dev-server-Q6M62ATG.js.map} +0 -0
- /package/dist/{feedback-7ZZI6RC5.js.map → feedback-QPNDZQRV.js.map} +0 -0
- /package/dist/{claude-V4HRPR4Z.js.map → git-W3XUIFTR.js.map} +0 -0
- /package/dist/{lint-XPODLDVA.js.map → lint-IHUH45OC.js.map} +0 -0
- /package/dist/{open-M2SUR74Y.js.map → open-KWOV2OFO.js.map} +0 -0
- /package/dist/{projects-325GEEGJ.js.map → projects-LH362JZQ.js.map} +0 -0
- /package/dist/{rebase-4FNRBW3H.js.map → rebase-AJOJOZUG.js.map} +0 -0
- /package/dist/{recap-GSXFEOD6.js.map → recap-GKJXMDXW.js.map} +0 -0
- /package/dist/{run-GZNHRJB2.js.map → run-QEUVZF7J.js.map} +0 -0
- /package/dist/{shell-2SPM3Z5O.js.map → shell-DAAVG4YN.js.map} +0 -0
- /package/dist/{summary-Z4F7YFXE.js.map → summary-ZKOA35PT.js.map} +0 -0
- /package/dist/{test-LBSPYIJW.js.map → test-5GPWWO3P.js.map} +0 -0
- /package/dist/{test-git-ZPSPA2TP.js.map → test-git-EJUKDB7F.js.map} +0 -0
- /package/dist/{test-prefix-6DLB2BHE.js.map → test-prefix-23TOBUXY.js.map} +0 -0
- /package/dist/{test-webserver-XLJ2TZFP.js.map → test-webserver-CKROHFBQ.js.map} +0 -0
- /package/dist/{vscode-LH3VSQ2W.js.map → vscode-6TOLFCI2.js.map} +0 -0
|
@@ -1,39 +1,46 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
} from "./chunk-RD7I2Q2F.js";
|
|
3
|
+
PRManager
|
|
4
|
+
} from "./chunk-I3HMNWQQ.js";
|
|
6
5
|
import {
|
|
7
6
|
calculatePortForBranch,
|
|
8
7
|
calculatePortFromIdentifier
|
|
9
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-USSL2X4A.js";
|
|
9
|
+
import {
|
|
10
|
+
installDependencies,
|
|
11
|
+
runScript
|
|
12
|
+
} from "./chunk-4LKGCFGG.js";
|
|
10
13
|
import {
|
|
11
14
|
getPackageConfig,
|
|
12
15
|
hasScript
|
|
13
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-VOGGLPG5.js";
|
|
14
17
|
import {
|
|
18
|
+
GitCommandError,
|
|
19
|
+
PLACEHOLDER_COMMIT_PREFIX,
|
|
15
20
|
branchExists,
|
|
16
21
|
checkRemoteBranchStatus,
|
|
17
22
|
ensureRepositoryHasCommits,
|
|
18
23
|
executeGitCommand,
|
|
19
24
|
extractIssueNumber,
|
|
20
25
|
extractPRNumber,
|
|
26
|
+
fetchOrigin,
|
|
21
27
|
findMainWorktreePathWithSettings,
|
|
22
28
|
findWorktreeForBranch,
|
|
23
29
|
getMergeTargetBranch,
|
|
24
30
|
hasUncommittedChanges,
|
|
25
31
|
isBranchMergedIntoMain,
|
|
26
|
-
isFileTrackedByGit
|
|
27
|
-
|
|
32
|
+
isFileTrackedByGit,
|
|
33
|
+
pushBranchToRemote
|
|
34
|
+
} from "./chunk-H6ST2TGP.js";
|
|
28
35
|
import {
|
|
29
36
|
SettingsManager
|
|
30
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-XFEK2X2D.js";
|
|
31
38
|
import {
|
|
32
39
|
MetadataManager
|
|
33
40
|
} from "./chunk-KBEIQP4G.js";
|
|
34
41
|
import {
|
|
35
42
|
GitHubService
|
|
36
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-Y5HSSIK2.js";
|
|
37
44
|
import {
|
|
38
45
|
calculateForegroundColor,
|
|
39
46
|
generateColorFromBranchName,
|
|
@@ -44,7 +51,7 @@ import {
|
|
|
44
51
|
} from "./chunk-433MOLAU.js";
|
|
45
52
|
import {
|
|
46
53
|
generateRandomSessionId
|
|
47
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-FO5GGFOV.js";
|
|
48
55
|
import {
|
|
49
56
|
getLogger
|
|
50
57
|
} from "./chunk-6MLEBAYZ.js";
|
|
@@ -237,7 +244,7 @@ var LoomManager = class {
|
|
|
237
244
|
* NEW: Checks for existing worktrees and reuses them if found
|
|
238
245
|
*/
|
|
239
246
|
async createIloom(input) {
|
|
240
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
|
|
247
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
|
|
241
248
|
getLogger().info("Fetching issue data...");
|
|
242
249
|
const issueData = await this.fetchIssueData(input);
|
|
243
250
|
if (input.type === "issue" || input.type === "pr" || input.type === "branch") {
|
|
@@ -325,38 +332,79 @@ var LoomManager = class {
|
|
|
325
332
|
let draftPrNumber = void 0;
|
|
326
333
|
let draftPrUrl = void 0;
|
|
327
334
|
const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
|
|
328
|
-
if (mergeBehavior.mode === "github-draft-pr" && input.type === "issue") {
|
|
329
|
-
getLogger().info("Creating placeholder commit for draft PR...");
|
|
330
|
-
const { executeGitCommand: executeGitCommand2, PLACEHOLDER_COMMIT_PREFIX, pushBranchToRemote } = await import("./git-GUNOPP4Q.js");
|
|
331
|
-
await executeGitCommand2(
|
|
332
|
-
[
|
|
333
|
-
"commit",
|
|
334
|
-
"--allow-empty",
|
|
335
|
-
"--no-verify",
|
|
336
|
-
"-m",
|
|
337
|
-
`${PLACEHOLDER_COMMIT_PREFIX} Temporary commit for draft PR (will be removed on finish)`
|
|
338
|
-
],
|
|
339
|
-
{ cwd: worktreePath }
|
|
340
|
-
);
|
|
341
|
-
getLogger().debug("Placeholder commit created");
|
|
342
|
-
getLogger().info("Pushing branch to remote for draft PR...");
|
|
343
|
-
await pushBranchToRemote(branchName, worktreePath, { dryRun: false });
|
|
344
|
-
const { PRManager } = await import("./PRManager-A63LT3NF.js");
|
|
335
|
+
if (mergeBehavior.mode === "github-draft-pr" && (input.type === "issue" || input.type === "branch")) {
|
|
345
336
|
const prManager = new PRManager(settingsData);
|
|
346
|
-
|
|
347
|
-
|
|
337
|
+
getLogger().info("Fetching from origin...");
|
|
338
|
+
await executeGitCommand(["fetch", "origin"], { cwd: worktreePath });
|
|
339
|
+
let remoteBranchExists = false;
|
|
340
|
+
try {
|
|
341
|
+
await executeGitCommand(["rev-parse", "--verify", `origin/${branchName}`], { cwd: worktreePath });
|
|
342
|
+
remoteBranchExists = true;
|
|
343
|
+
getLogger().info(`Remote branch origin/${branchName} already exists, resetting local to match...`);
|
|
344
|
+
} catch (error) {
|
|
345
|
+
if (error instanceof GitCommandError && (error.stderr.includes("unknown revision") || error.stderr.includes("Needed a single revision") || error.stderr.includes("bad revision"))) {
|
|
346
|
+
getLogger().debug(`Remote branch origin/${branchName} does not exist`);
|
|
347
|
+
} else {
|
|
348
|
+
throw error;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (remoteBranchExists) {
|
|
352
|
+
await executeGitCommand(["reset", "--hard", `origin/${branchName}`], { cwd: worktreePath });
|
|
353
|
+
await executeGitCommand(["branch", "--set-upstream-to", `origin/${branchName}`], { cwd: worktreePath });
|
|
354
|
+
getLogger().success("Local branch reset to match remote");
|
|
355
|
+
} else {
|
|
356
|
+
getLogger().info("Creating placeholder commit for draft PR...");
|
|
357
|
+
await executeGitCommand(
|
|
358
|
+
[
|
|
359
|
+
"commit",
|
|
360
|
+
"--allow-empty",
|
|
361
|
+
"--no-verify",
|
|
362
|
+
"-m",
|
|
363
|
+
`${PLACEHOLDER_COMMIT_PREFIX} Temporary commit for draft PR (will be removed on finish)`
|
|
364
|
+
],
|
|
365
|
+
{ cwd: worktreePath }
|
|
366
|
+
);
|
|
367
|
+
getLogger().debug("Placeholder commit created");
|
|
368
|
+
getLogger().info("Pushing branch to remote for draft PR...");
|
|
369
|
+
await pushBranchToRemote(branchName, worktreePath, { dryRun: false });
|
|
370
|
+
}
|
|
371
|
+
const existingPR = await prManager.checkForExistingPR(branchName, worktreePath);
|
|
372
|
+
if (existingPR) {
|
|
373
|
+
draftPrNumber = existingPR.number;
|
|
374
|
+
draftPrUrl = existingPR.url;
|
|
375
|
+
getLogger().success(`Found existing PR: ${existingPR.url}`);
|
|
376
|
+
} else {
|
|
377
|
+
const prTitle = (issueData == null ? void 0 : issueData.title) ?? `Work on ${branchName}`;
|
|
378
|
+
let prBody;
|
|
379
|
+
if (input.type === "issue") {
|
|
380
|
+
const issueBody = (issueData == null ? void 0 : issueData.body) ? `
|
|
348
381
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
382
|
+
## ${issueData.title}
|
|
383
|
+
|
|
384
|
+
${issueData.body}` : "";
|
|
385
|
+
prBody = `Fixes ${prManager.issuePrefix}${input.identifier}${issueBody}
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
*This PR was created automatically by iloom.*`;
|
|
389
|
+
} else {
|
|
390
|
+
prBody = `Branch: ${branchName}
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
*This PR was created automatically by iloom.*`;
|
|
394
|
+
}
|
|
395
|
+
const draftBaseBranch = ((_e = input.parentLoom) == null ? void 0 : _e.branchName) ?? settingsData.mainBranch ?? "main";
|
|
396
|
+
getLogger().info("Creating draft PR...");
|
|
397
|
+
const prResult = await prManager.createDraftPR(
|
|
398
|
+
branchName,
|
|
399
|
+
prTitle,
|
|
400
|
+
prBody,
|
|
401
|
+
draftBaseBranch,
|
|
402
|
+
worktreePath
|
|
403
|
+
);
|
|
404
|
+
draftPrNumber = prResult.number;
|
|
405
|
+
draftPrUrl = prResult.url;
|
|
406
|
+
getLogger().success(`Draft PR created: ${prResult.url}`);
|
|
407
|
+
}
|
|
360
408
|
}
|
|
361
409
|
const allMetadata = await this.metadataManager.listAllMetadata();
|
|
362
410
|
const usedHexColors = allMetadata.filter((metadata) => metadata.colorHex !== null).map((metadata) => metadata.colorHex);
|
|
@@ -384,16 +432,16 @@ This PR was created automatically by iloom.`;
|
|
|
384
432
|
);
|
|
385
433
|
}
|
|
386
434
|
}
|
|
387
|
-
const enableClaude = ((
|
|
388
|
-
const enableCode = ((
|
|
389
|
-
const enableDevServer = ((
|
|
390
|
-
const enableTerminal = ((
|
|
391
|
-
const oneShot = ((
|
|
392
|
-
const setArguments = (
|
|
393
|
-
const executablePath = (
|
|
435
|
+
const enableClaude = ((_f = input.options) == null ? void 0 : _f.enableClaude) !== false;
|
|
436
|
+
const enableCode = ((_g = input.options) == null ? void 0 : _g.enableCode) !== false;
|
|
437
|
+
const enableDevServer = ((_h = input.options) == null ? void 0 : _h.enableDevServer) !== false;
|
|
438
|
+
const enableTerminal = ((_i = input.options) == null ? void 0 : _i.enableTerminal) ?? false;
|
|
439
|
+
const oneShot = ((_j = input.options) == null ? void 0 : _j.oneShot) ?? "default";
|
|
440
|
+
const setArguments = (_k = input.options) == null ? void 0 : _k.setArguments;
|
|
441
|
+
const executablePath = (_l = input.options) == null ? void 0 : _l.executablePath;
|
|
394
442
|
if (enableClaude || enableCode || enableDevServer || enableTerminal) {
|
|
395
|
-
const { LoomLauncher } = await import("./LoomLauncher-
|
|
396
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
443
|
+
const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
|
|
444
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
|
|
397
445
|
const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
|
|
398
446
|
const launcher = new LoomLauncher(claudeContext, this.settings);
|
|
399
447
|
await launcher.launchLoom({
|
|
@@ -412,7 +460,7 @@ This PR was created automatically by iloom.`;
|
|
|
412
460
|
...setArguments && { setArguments },
|
|
413
461
|
...executablePath && { executablePath },
|
|
414
462
|
sourceEnvOnStart: settingsData.sourceEnvOnStart ?? false,
|
|
415
|
-
colorTerminal: ((
|
|
463
|
+
colorTerminal: ((_m = input.options) == null ? void 0 : _m.colorTerminal) ?? ((_n = settingsData.colors) == null ? void 0 : _n.terminal) ?? true,
|
|
416
464
|
colorHex: colorData.hex
|
|
417
465
|
});
|
|
418
466
|
}
|
|
@@ -428,6 +476,9 @@ This PR was created automatically by iloom.`;
|
|
|
428
476
|
}
|
|
429
477
|
}
|
|
430
478
|
const pr_numbers = input.type === "pr" ? [String(input.identifier)] : [];
|
|
479
|
+
if (draftPrNumber && !pr_numbers.includes(String(draftPrNumber))) {
|
|
480
|
+
pr_numbers.push(String(draftPrNumber));
|
|
481
|
+
}
|
|
431
482
|
const sessionId = generateRandomSessionId();
|
|
432
483
|
let issueUrls = {};
|
|
433
484
|
if (input.type === "issue" && (issueData == null ? void 0 : issueData.url)) {
|
|
@@ -452,7 +503,7 @@ This PR was created automatically by iloom.`;
|
|
|
452
503
|
prUrls,
|
|
453
504
|
capabilities,
|
|
454
505
|
...draftPrNumber && { draftPrNumber },
|
|
455
|
-
...((
|
|
506
|
+
...((_o = input.options) == null ? void 0 : _o.oneShot) && { oneShot: input.options.oneShot },
|
|
456
507
|
...input.parentLoom && { parentLoom: input.parentLoom }
|
|
457
508
|
};
|
|
458
509
|
await this.metadataManager.writeMetadata(worktreePath, metadataInput);
|
|
@@ -541,7 +592,7 @@ This PR was created automatically by iloom.`;
|
|
|
541
592
|
async checkAndWarnChildLooms(branchName) {
|
|
542
593
|
let targetBranch = branchName;
|
|
543
594
|
if (!targetBranch) {
|
|
544
|
-
const { getCurrentBranch } = await import("./git-
|
|
595
|
+
const { getCurrentBranch } = await import("./git-W3XUIFTR.js");
|
|
545
596
|
targetBranch = await getCurrentBranch();
|
|
546
597
|
}
|
|
547
598
|
if (!targetBranch) {
|
|
@@ -640,13 +691,27 @@ This PR was created automatically by iloom.`;
|
|
|
640
691
|
);
|
|
641
692
|
}
|
|
642
693
|
}
|
|
643
|
-
const branchExistedLocally = await branchExists(branchName);
|
|
694
|
+
const branchExistedLocally = await branchExists(branchName, process.cwd(), false);
|
|
644
695
|
if (input.type !== "pr" && branchExistedLocally) {
|
|
645
696
|
throw new Error(
|
|
646
697
|
`Cannot create worktree: branch '${branchName}' already exists. Use 'git branch -D ${branchName}' to delete it first if needed.`
|
|
647
698
|
);
|
|
648
699
|
}
|
|
649
|
-
const
|
|
700
|
+
const mergeBehavior = settingsData.mergeBehavior ?? { mode: "local" };
|
|
701
|
+
const isPRMode = mergeBehavior.mode === "github-pr" || mergeBehavior.mode === "github-draft-pr";
|
|
702
|
+
const isChildLoom = !!input.parentLoom;
|
|
703
|
+
let baseBranch;
|
|
704
|
+
if (isChildLoom) {
|
|
705
|
+
baseBranch = ((_a = input.parentLoom) == null ? void 0 : _a.branchName) ?? input.baseBranch;
|
|
706
|
+
} else if (isPRMode && input.type !== "pr") {
|
|
707
|
+
getLogger().info("Fetching from origin to ensure latest main branch...");
|
|
708
|
+
await fetchOrigin(this.gitWorktree.workingDirectory);
|
|
709
|
+
const mainBranch = settingsData.mainBranch ?? "main";
|
|
710
|
+
baseBranch = `origin/${mainBranch}`;
|
|
711
|
+
getLogger().info(`Branching from ${baseBranch}`);
|
|
712
|
+
} else {
|
|
713
|
+
baseBranch = input.baseBranch;
|
|
714
|
+
}
|
|
650
715
|
await this.gitWorktree.createWorktree({
|
|
651
716
|
path: worktreePath,
|
|
652
717
|
branch: branchName,
|
|
@@ -1047,8 +1112,8 @@ This PR was created automatically by iloom.`;
|
|
|
1047
1112
|
const executablePath = (_i = input.options) == null ? void 0 : _i.executablePath;
|
|
1048
1113
|
if (enableClaude || enableCode || enableDevServer || enableTerminal) {
|
|
1049
1114
|
getLogger().info("Launching workspace components...");
|
|
1050
|
-
const { LoomLauncher } = await import("./LoomLauncher-
|
|
1051
|
-
const { ClaudeContextManager } = await import("./ClaudeContextManager-
|
|
1115
|
+
const { LoomLauncher } = await import("./LoomLauncher-3I47SUPV.js");
|
|
1116
|
+
const { ClaudeContextManager } = await import("./ClaudeContextManager-X2Y72GRL.js");
|
|
1052
1117
|
const claudeContext = new ClaudeContextManager(void 0, void 0, this.settings);
|
|
1053
1118
|
const launcher = new LoomLauncher(claudeContext, this.settings);
|
|
1054
1119
|
await launcher.launchLoom({
|
|
@@ -1783,7 +1848,41 @@ var DatabaseManager = class {
|
|
|
1783
1848
|
};
|
|
1784
1849
|
|
|
1785
1850
|
// src/lib/ResourceCleanup.ts
|
|
1851
|
+
import path5 from "path";
|
|
1852
|
+
|
|
1853
|
+
// src/utils/recap-archiver.ts
|
|
1786
1854
|
import path4 from "path";
|
|
1855
|
+
import os2 from "os";
|
|
1856
|
+
import fs6 from "fs-extra";
|
|
1857
|
+
var RECAPS_DIR = path4.join(os2.homedir(), ".config", "iloom-ai", "recaps");
|
|
1858
|
+
var ARCHIVED_DIR = path4.join(RECAPS_DIR, "archived");
|
|
1859
|
+
function slugifyPath(loomPath) {
|
|
1860
|
+
let slug = loomPath.replace(/[/\\]+$/, "");
|
|
1861
|
+
slug = slug.replace(/[/\\]/g, "___");
|
|
1862
|
+
slug = slug.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
1863
|
+
return `${slug}.json`;
|
|
1864
|
+
}
|
|
1865
|
+
async function archiveRecap(worktreePath) {
|
|
1866
|
+
const filename = slugifyPath(worktreePath);
|
|
1867
|
+
const sourcePath = path4.join(RECAPS_DIR, filename);
|
|
1868
|
+
if (!await fs6.pathExists(sourcePath)) {
|
|
1869
|
+
getLogger().debug(`No recap file to archive for worktree: ${worktreePath}`);
|
|
1870
|
+
return;
|
|
1871
|
+
}
|
|
1872
|
+
const content = await fs6.readFile(sourcePath, "utf8");
|
|
1873
|
+
const data = JSON.parse(content);
|
|
1874
|
+
const archivedData = {
|
|
1875
|
+
...data,
|
|
1876
|
+
archivedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1877
|
+
};
|
|
1878
|
+
await fs6.ensureDir(ARCHIVED_DIR, { mode: 493 });
|
|
1879
|
+
const destPath = path4.join(ARCHIVED_DIR, filename);
|
|
1880
|
+
await fs6.writeFile(destPath, JSON.stringify(archivedData, null, 2), { mode: 420 });
|
|
1881
|
+
await fs6.unlink(sourcePath);
|
|
1882
|
+
getLogger().debug(`Recap archived for worktree: ${worktreePath}`);
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
// src/lib/ResourceCleanup.ts
|
|
1787
1886
|
var ResourceCleanup = class {
|
|
1788
1887
|
constructor(gitWorktree, processManager, database, cliIsolation, settingsManager) {
|
|
1789
1888
|
this.gitWorktree = gitWorktree;
|
|
@@ -1865,6 +1964,7 @@ var ResourceCleanup = class {
|
|
|
1865
1964
|
rollbackRequired: false
|
|
1866
1965
|
};
|
|
1867
1966
|
}
|
|
1967
|
+
let safetyCheckPassed = false;
|
|
1868
1968
|
if (!options.force) {
|
|
1869
1969
|
const shouldCheckMergeSafety = options.checkMergeSafety ?? options.deleteBranch === true;
|
|
1870
1970
|
const shouldCheckRemoteBranch = options.checkRemoteBranch ?? false;
|
|
@@ -1875,6 +1975,7 @@ var ResourceCleanup = class {
|
|
|
1875
1975
|
|
|
1876
1976
|
${blockerMessage}`);
|
|
1877
1977
|
}
|
|
1978
|
+
safetyCheckPassed = true;
|
|
1878
1979
|
if (safety.warnings.length > 0) {
|
|
1879
1980
|
safety.warnings.forEach((warning) => {
|
|
1880
1981
|
getLogger().warn(warning);
|
|
@@ -1883,7 +1984,7 @@ ${blockerMessage}`);
|
|
|
1883
1984
|
}
|
|
1884
1985
|
let databaseConfig = null;
|
|
1885
1986
|
if (!options.keepDatabase && worktree) {
|
|
1886
|
-
const envFilePath =
|
|
1987
|
+
const envFilePath = path5.join(worktree.path, ".env");
|
|
1887
1988
|
try {
|
|
1888
1989
|
const shouldCleanup = this.database ? await this.database.shouldUseDatabaseBranching(envFilePath) : false;
|
|
1889
1990
|
databaseConfig = { shouldCleanup, envFilePath };
|
|
@@ -1951,6 +2052,33 @@ ${blockerMessage}`);
|
|
|
1951
2052
|
});
|
|
1952
2053
|
}
|
|
1953
2054
|
}
|
|
2055
|
+
if (worktree) {
|
|
2056
|
+
if (options.dryRun) {
|
|
2057
|
+
operations.push({
|
|
2058
|
+
type: "recap",
|
|
2059
|
+
success: true,
|
|
2060
|
+
message: `[DRY RUN] Would archive recap file for: ${worktree.path}`
|
|
2061
|
+
});
|
|
2062
|
+
} else {
|
|
2063
|
+
try {
|
|
2064
|
+
await archiveRecap(worktree.path);
|
|
2065
|
+
operations.push({
|
|
2066
|
+
type: "recap",
|
|
2067
|
+
success: true,
|
|
2068
|
+
message: `Recap file archived`
|
|
2069
|
+
});
|
|
2070
|
+
} catch (error) {
|
|
2071
|
+
const err = error instanceof Error ? error : new Error("Unknown error");
|
|
2072
|
+
getLogger().warn(`Recap archival failed: ${err.message}`);
|
|
2073
|
+
operations.push({
|
|
2074
|
+
type: "recap",
|
|
2075
|
+
success: false,
|
|
2076
|
+
message: "Recap archival failed (non-fatal)",
|
|
2077
|
+
error: err.message
|
|
2078
|
+
});
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
}
|
|
1954
2082
|
if (options.deleteBranch && worktree) {
|
|
1955
2083
|
if (options.dryRun) {
|
|
1956
2084
|
operations.push({
|
|
@@ -1961,7 +2089,8 @@ ${blockerMessage}`);
|
|
|
1961
2089
|
} else {
|
|
1962
2090
|
try {
|
|
1963
2091
|
const branchOptions = {
|
|
1964
|
-
dryRun: false
|
|
2092
|
+
dryRun: false,
|
|
2093
|
+
safetyVerified: safetyCheckPassed
|
|
1965
2094
|
};
|
|
1966
2095
|
if (mergeTargetBranch !== null) {
|
|
1967
2096
|
branchOptions.mergeTargetBranch = mergeTargetBranch;
|
|
@@ -2115,6 +2244,35 @@ ${blockerMessage}`);
|
|
|
2115
2244
|
}
|
|
2116
2245
|
}
|
|
2117
2246
|
}
|
|
2247
|
+
if (worktree) {
|
|
2248
|
+
if (options.dryRun) {
|
|
2249
|
+
operations.push({
|
|
2250
|
+
type: "metadata",
|
|
2251
|
+
success: true,
|
|
2252
|
+
message: `[DRY RUN] Would delete metadata for worktree: ${worktree.path}`
|
|
2253
|
+
});
|
|
2254
|
+
} else {
|
|
2255
|
+
try {
|
|
2256
|
+
await this.metadataManager.deleteMetadata(worktree.path);
|
|
2257
|
+
getLogger().info(`Metadata deleted for worktree: ${worktree.path}`);
|
|
2258
|
+
operations.push({
|
|
2259
|
+
type: "metadata",
|
|
2260
|
+
success: true,
|
|
2261
|
+
message: "Metadata deleted"
|
|
2262
|
+
});
|
|
2263
|
+
} catch (error) {
|
|
2264
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
2265
|
+
errors.push(err);
|
|
2266
|
+
getLogger().warn(`Metadata deletion failed: ${err.message}`);
|
|
2267
|
+
operations.push({
|
|
2268
|
+
type: "metadata",
|
|
2269
|
+
success: false,
|
|
2270
|
+
message: "Metadata deletion failed (non-fatal)",
|
|
2271
|
+
error: err.message
|
|
2272
|
+
});
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
}
|
|
2118
2276
|
const success = errors.length === 0;
|
|
2119
2277
|
return {
|
|
2120
2278
|
identifier: displayIdentifier,
|
|
@@ -2175,9 +2333,9 @@ ${blockerMessage}`);
|
|
|
2175
2333
|
getLogger().info(`[DRY RUN] Would delete branch: ${branchName}`);
|
|
2176
2334
|
return true;
|
|
2177
2335
|
}
|
|
2336
|
+
let deleteCwd = workingDir;
|
|
2178
2337
|
try {
|
|
2179
2338
|
let deleteFlag = "-d";
|
|
2180
|
-
let deleteCwd = workingDir;
|
|
2181
2339
|
if (options.force) {
|
|
2182
2340
|
deleteFlag = "-D";
|
|
2183
2341
|
} else if (options.mergeTargetBranch) {
|
|
@@ -2232,6 +2390,12 @@ ${blockerMessage}`);
|
|
|
2232
2390
|
throw error;
|
|
2233
2391
|
}
|
|
2234
2392
|
if (errorMessage.includes("not fully merged")) {
|
|
2393
|
+
if (options.safetyVerified) {
|
|
2394
|
+
getLogger().info(`Branch '${branchName}' not merged into HEAD but safety verified - using force delete`);
|
|
2395
|
+
await executeGitCommand(["branch", "-D", branchName], { cwd: deleteCwd });
|
|
2396
|
+
getLogger().info(`Branch deleted: ${branchName}`);
|
|
2397
|
+
return true;
|
|
2398
|
+
}
|
|
2235
2399
|
throw new Error(
|
|
2236
2400
|
`Cannot delete unmerged branch '${branchName}'. Use --force to delete anyway.`
|
|
2237
2401
|
);
|
|
@@ -2257,7 +2421,7 @@ ${blockerMessage}`);
|
|
|
2257
2421
|
return false;
|
|
2258
2422
|
}
|
|
2259
2423
|
try {
|
|
2260
|
-
const envFilePath =
|
|
2424
|
+
const envFilePath = path5.join(worktreePath, ".env");
|
|
2261
2425
|
const shouldCleanup = await this.database.shouldUseDatabaseBranching(envFilePath);
|
|
2262
2426
|
let cwd;
|
|
2263
2427
|
try {
|
|
@@ -2441,4 +2605,4 @@ export {
|
|
|
2441
2605
|
DatabaseManager,
|
|
2442
2606
|
ResourceCleanup
|
|
2443
2607
|
};
|
|
2444
|
-
//# sourceMappingURL=chunk-
|
|
2608
|
+
//# sourceMappingURL=chunk-4ZIHFUPN.js.map
|