@iloom/cli 0.8.0 → 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 +1 -1
- package/dist/{PRManager-XLTVG6YG.js → PRManager-H4TUZTZL.js} +4 -4
- package/dist/README.md +1 -1
- package/dist/agents/iloom-code-reviewer.md +16 -1
- package/dist/agents/iloom-framework-detector.md +1 -1
- package/dist/agents/iloom-issue-analyze-and-plan.md +1 -1
- package/dist/agents/iloom-issue-analyzer.md +1 -1
- package/dist/agents/iloom-issue-enhancer.md +1 -1
- package/dist/agents/iloom-issue-implementer.md +2 -2
- package/dist/agents/iloom-issue-planner.md +1 -1
- package/dist/{chunk-YAVVDZVF.js → chunk-EQOFNPEY.js} +2 -2
- package/dist/{chunk-WNXYC7J4.js → chunk-NR64HNF7.js} +2 -2
- package/dist/{chunk-AZH27CPV.js → chunk-PBSHQVCT.js} +2 -2
- package/dist/{chunk-LFVRG6UU.js → chunk-RNBIISBZ.js} +4 -2
- package/dist/chunk-RNBIISBZ.js.map +1 -0
- package/dist/{chunk-QJX6ICWY.js → chunk-SC6X5EBG.js} +2 -2
- package/dist/{chunk-L4CN7YQT.js → chunk-UDZCTLD6.js} +2 -2
- package/dist/{cleanup-25PCP2EM.js → cleanup-OGE7V7AD.js} +2 -2
- package/dist/cli.js +222 -19
- package/dist/cli.js.map +1 -1
- package/dist/{commit-SS77KUNX.js → commit-534QIRHY.js} +3 -3
- package/dist/{ignite-CPXPZ4ZD.js → ignite-ZO7SGUKP.js} +3 -3
- package/dist/{plan-N3YDCOIV.js → plan-PIME6UNY.js} +4 -4
- package/dist/prompts/init-prompt.txt +26 -2
- package/dist/{summary-5UWNLAI5.js → summary-C5VVSJAJ.js} +5 -5
- package/package.json +1 -1
- package/dist/chunk-LFVRG6UU.js.map +0 -1
- /package/dist/{PRManager-XLTVG6YG.js.map → PRManager-H4TUZTZL.js.map} +0 -0
- /package/dist/{chunk-YAVVDZVF.js.map → chunk-EQOFNPEY.js.map} +0 -0
- /package/dist/{chunk-WNXYC7J4.js.map → chunk-NR64HNF7.js.map} +0 -0
- /package/dist/{chunk-AZH27CPV.js.map → chunk-PBSHQVCT.js.map} +0 -0
- /package/dist/{chunk-QJX6ICWY.js.map → chunk-SC6X5EBG.js.map} +0 -0
- /package/dist/{chunk-L4CN7YQT.js.map → chunk-UDZCTLD6.js.map} +0 -0
- /package/dist/{cleanup-25PCP2EM.js.map → cleanup-OGE7V7AD.js.map} +0 -0
- /package/dist/{commit-SS77KUNX.js.map → commit-534QIRHY.js.map} +0 -0
- /package/dist/{ignite-CPXPZ4ZD.js.map → ignite-ZO7SGUKP.js.map} +0 -0
- /package/dist/{plan-N3YDCOIV.js.map → plan-PIME6UNY.js.map} +0 -0
- /package/dist/{summary-5UWNLAI5.js.map → summary-C5VVSJAJ.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,7 +9,7 @@ import {
|
|
|
9
9
|
EnvironmentManager,
|
|
10
10
|
LoomManager,
|
|
11
11
|
ResourceCleanup
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NR64HNF7.js";
|
|
13
13
|
import {
|
|
14
14
|
launchFirstRunSetup,
|
|
15
15
|
needsFirstRunSetup
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from "./chunk-ECP77QGE.js";
|
|
21
21
|
import {
|
|
22
22
|
IssueTrackerFactory
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-SC6X5EBG.js";
|
|
24
24
|
import {
|
|
25
25
|
ProcessManager
|
|
26
26
|
} from "./chunk-XHNACIHO.js";
|
|
@@ -62,14 +62,16 @@ import {
|
|
|
62
62
|
import "./chunk-XPKN3QWY.js";
|
|
63
63
|
import {
|
|
64
64
|
PRManager
|
|
65
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-EQOFNPEY.js";
|
|
66
66
|
import {
|
|
67
67
|
openBrowser
|
|
68
68
|
} from "./chunk-YETJNRQM.js";
|
|
69
69
|
import {
|
|
70
70
|
IssueManagementProviderFactory
|
|
71
|
-
} from "./chunk-
|
|
72
|
-
import
|
|
71
|
+
} from "./chunk-UDZCTLD6.js";
|
|
72
|
+
import {
|
|
73
|
+
getLinearChildIssues
|
|
74
|
+
} from "./chunk-RNBIISBZ.js";
|
|
73
75
|
import {
|
|
74
76
|
getConfiguredRepoFromSettings,
|
|
75
77
|
hasMultipleRemotes
|
|
@@ -112,7 +114,9 @@ import {
|
|
|
112
114
|
import {
|
|
113
115
|
GitHubService
|
|
114
116
|
} from "./chunk-PVW6JE7E.js";
|
|
115
|
-
import
|
|
117
|
+
import {
|
|
118
|
+
getSubIssues
|
|
119
|
+
} from "./chunk-THS5L54H.js";
|
|
116
120
|
import {
|
|
117
121
|
promptConfirmation,
|
|
118
122
|
waitForKeypress
|
|
@@ -1896,7 +1900,9 @@ function formatLoomForJson(worktree, mainWorktreePath, metadata) {
|
|
|
1896
1900
|
projectPath: (metadata == null ? void 0 : metadata.projectPath) ?? null,
|
|
1897
1901
|
issueUrls: (metadata == null ? void 0 : metadata.issueUrls) ?? {},
|
|
1898
1902
|
prUrls: (metadata == null ? void 0 : metadata.prUrls) ?? {},
|
|
1899
|
-
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
|
|
1900
1906
|
};
|
|
1901
1907
|
}
|
|
1902
1908
|
function formatLoomsForJson(worktrees, mainWorktreePath, metadata) {
|
|
@@ -1923,8 +1929,112 @@ function formatFinishedLoomForJson(metadata) {
|
|
|
1923
1929
|
prUrls: metadata.prUrls ?? {},
|
|
1924
1930
|
capabilities: metadata.capabilities ?? [],
|
|
1925
1931
|
status: metadata.status ?? "finished",
|
|
1926
|
-
finishedAt: metadata.finishedAt ?? null
|
|
1932
|
+
finishedAt: metadata.finishedAt ?? null,
|
|
1933
|
+
isChildLoom: metadata.parentLoom != null,
|
|
1934
|
+
parentLoom: metadata.parentLoom ?? null
|
|
1935
|
+
};
|
|
1936
|
+
}
|
|
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
|
|
1927
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);
|
|
1928
2038
|
}
|
|
1929
2039
|
|
|
1930
2040
|
// src/cli.ts
|
|
@@ -2462,7 +2572,7 @@ program.command("finish").alias("dn").description("Merge work and cleanup worksp
|
|
|
2462
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) => {
|
|
2463
2573
|
const executeAction = async () => {
|
|
2464
2574
|
try {
|
|
2465
|
-
const { CommitCommand } = await import("./commit-
|
|
2575
|
+
const { CommitCommand } = await import("./commit-534QIRHY.js");
|
|
2466
2576
|
const command = new CommitCommand();
|
|
2467
2577
|
const noReview = options.review === false || options.json === true;
|
|
2468
2578
|
const result = await command.execute({
|
|
@@ -2509,7 +2619,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
|
|
|
2509
2619
|
new Option("--one-shot <mode>", "One-shot automation mode").choices(["default", "noReview", "bypassPermissions"])
|
|
2510
2620
|
).action(async (options) => {
|
|
2511
2621
|
try {
|
|
2512
|
-
const { IgniteCommand } = await import("./ignite-
|
|
2622
|
+
const { IgniteCommand } = await import("./ignite-ZO7SGUKP.js");
|
|
2513
2623
|
const command = new IgniteCommand();
|
|
2514
2624
|
await command.execute(options.oneShot);
|
|
2515
2625
|
} catch (error) {
|
|
@@ -2604,7 +2714,7 @@ program.command("compile").alias("typecheck").description("Run the compile or ty
|
|
|
2604
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) => {
|
|
2605
2715
|
const executeAction = async () => {
|
|
2606
2716
|
try {
|
|
2607
|
-
const { CleanupCommand } = await import("./cleanup-
|
|
2717
|
+
const { CleanupCommand } = await import("./cleanup-OGE7V7AD.js");
|
|
2608
2718
|
const command = new CleanupCommand();
|
|
2609
2719
|
const input = {
|
|
2610
2720
|
options: options ?? {}
|
|
@@ -2633,7 +2743,7 @@ program.command("cleanup").alias("remove").alias("clean").description("Remove wo
|
|
|
2633
2743
|
await executeAction();
|
|
2634
2744
|
}
|
|
2635
2745
|
});
|
|
2636
|
-
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) => {
|
|
2637
2747
|
try {
|
|
2638
2748
|
const manager = new GitWorktreeManager();
|
|
2639
2749
|
const metadataManager = new MetadataManager();
|
|
@@ -2732,7 +2842,9 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2732
2842
|
issueUrls: loom.issueUrls ?? {},
|
|
2733
2843
|
prUrls: loom.prUrls ?? {},
|
|
2734
2844
|
status: "active",
|
|
2735
|
-
finishedAt: null
|
|
2845
|
+
finishedAt: null,
|
|
2846
|
+
isChildLoom: loom.parentLoom != null,
|
|
2847
|
+
parentLoom: loom.parentLoom ?? null
|
|
2736
2848
|
}));
|
|
2737
2849
|
} else {
|
|
2738
2850
|
activeJson = formatLoomsForJson(worktrees, mainWorktreePath, metadata).map((loom) => ({
|
|
@@ -2753,6 +2865,47 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2753
2865
|
(loom) => loom.projectPath == null || loom.projectPath === currentProjectPath
|
|
2754
2866
|
);
|
|
2755
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
|
+
}
|
|
2756
2909
|
const allLooms = [...activeJson, ...finishedJson];
|
|
2757
2910
|
console.log(JSON.stringify(allLooms, null, 2));
|
|
2758
2911
|
return;
|
|
@@ -2769,11 +2922,20 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2769
2922
|
}
|
|
2770
2923
|
return;
|
|
2771
2924
|
}
|
|
2925
|
+
let textSettings = null;
|
|
2926
|
+
if (options.children) {
|
|
2927
|
+
const settingsManager = new SettingsManager();
|
|
2928
|
+
textSettings = await settingsManager.loadSettings();
|
|
2929
|
+
}
|
|
2772
2930
|
if (showActive && hasActive) {
|
|
2773
2931
|
logger.info("Active workspaces:");
|
|
2774
2932
|
if (options.global) {
|
|
2775
2933
|
for (const loom of filteredGlobalActiveLooms) {
|
|
2776
|
-
|
|
2934
|
+
if (loom.parentLoom) {
|
|
2935
|
+
logger.info(` ${loom.branchName ?? "unknown"} (Child of: ${loom.parentLoom.branchName})`);
|
|
2936
|
+
} else {
|
|
2937
|
+
logger.info(` ${loom.branchName ?? "unknown"}`);
|
|
2938
|
+
}
|
|
2777
2939
|
if (loom.description) {
|
|
2778
2940
|
logger.info(` Description: ${loom.description}`);
|
|
2779
2941
|
}
|
|
@@ -2783,17 +2945,43 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2783
2945
|
if (loom.projectPath) {
|
|
2784
2946
|
logger.info(` Project: ${loom.projectPath}`);
|
|
2785
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
|
+
}
|
|
2786
2959
|
}
|
|
2787
2960
|
} else {
|
|
2788
2961
|
for (const worktree of filteredWorktrees) {
|
|
2789
2962
|
const formatted = manager.formatWorktree(worktree);
|
|
2790
2963
|
const loomMetadata = metadata.get(worktree.path);
|
|
2791
|
-
|
|
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
|
+
}
|
|
2792
2969
|
if (loomMetadata == null ? void 0 : loomMetadata.description) {
|
|
2793
2970
|
logger.info(` Description: ${loomMetadata.description}`);
|
|
2794
2971
|
}
|
|
2795
2972
|
logger.info(` Path: ${formatted.path}`);
|
|
2796
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
|
+
}
|
|
2797
2985
|
}
|
|
2798
2986
|
}
|
|
2799
2987
|
}
|
|
@@ -2803,13 +2991,28 @@ program.command("list").description("Show active workspaces").option("--json", "
|
|
|
2803
2991
|
}
|
|
2804
2992
|
logger.info("Finished looms:");
|
|
2805
2993
|
for (const loom of filteredFinishedLooms) {
|
|
2806
|
-
|
|
2994
|
+
if (loom.parentLoom) {
|
|
2995
|
+
logger.info(` ${loom.branchName ?? "unknown"} (Child of: ${loom.parentLoom.branchName})`);
|
|
2996
|
+
} else {
|
|
2997
|
+
logger.info(` ${loom.branchName ?? "unknown"}`);
|
|
2998
|
+
}
|
|
2807
2999
|
if (loom.description) {
|
|
2808
3000
|
logger.info(` Description: ${loom.description}`);
|
|
2809
3001
|
}
|
|
2810
3002
|
if (loom.finishedAt) {
|
|
2811
3003
|
logger.info(` Finished: ${new Date(loom.finishedAt).toLocaleString()}`);
|
|
2812
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
|
+
}
|
|
2813
3016
|
}
|
|
2814
3017
|
}
|
|
2815
3018
|
} catch (error) {
|
|
@@ -2850,7 +3053,7 @@ program.command("init").alias("config").description("Initialize iloom configurat
|
|
|
2850
3053
|
});
|
|
2851
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) => {
|
|
2852
3055
|
try {
|
|
2853
|
-
const { PlanCommand } = await import("./plan-
|
|
3056
|
+
const { PlanCommand } = await import("./plan-PIME6UNY.js");
|
|
2854
3057
|
const command = new PlanCommand();
|
|
2855
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);
|
|
2856
3059
|
} catch (error) {
|
|
@@ -3130,7 +3333,7 @@ program.command("test-prefix").description("Test worktree prefix configuration -
|
|
|
3130
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) => {
|
|
3131
3334
|
const executeAction = async () => {
|
|
3132
3335
|
try {
|
|
3133
|
-
const { SummaryCommand } = await import("./summary-
|
|
3336
|
+
const { SummaryCommand } = await import("./summary-C5VVSJAJ.js");
|
|
3134
3337
|
const command = new SummaryCommand();
|
|
3135
3338
|
const result = await command.execute({ identifier, options });
|
|
3136
3339
|
if (options.json && result) {
|