@iloom/cli 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +21 -2
  3. package/dist/{ClaudeContextManager-X2Y72GRL.js → ClaudeContextManager-HR5JQKAI.js} +4 -4
  4. package/dist/{ClaudeService-7P32TTES.js → ClaudeService-TK7FMC2X.js} +3 -3
  5. package/dist/{GitHubService-ACZVNTJE.js → GitHubService-TGWJN4V4.js} +3 -3
  6. package/dist/{LoomLauncher-3I47SUPV.js → LoomLauncher-73NXL2CL.js} +4 -4
  7. package/dist/README.md +21 -2
  8. package/dist/{SettingsManager-QR7V2IW2.js → SettingsManager-AW3JTJHD.js} +2 -2
  9. package/dist/{build-IC4CJRMP.js → build-THZI572G.js} +6 -6
  10. package/dist/{chunk-Z6F5CUS6.js → chunk-3I4ONZRT.js} +3 -3
  11. package/dist/{chunk-THS5L54H.js → chunk-4CO6KG5S.js} +50 -3
  12. package/dist/chunk-4CO6KG5S.js.map +1 -0
  13. package/dist/{chunk-MZPRBNYC.js → chunk-6IIL5M2L.js} +2 -2
  14. package/dist/{chunk-2JPXGGP4.js → chunk-A7NJF73J.js} +2 -2
  15. package/dist/{chunk-H6ST2TGP.js → chunk-AR5QKYNE.js} +3 -3
  16. package/dist/{chunk-PL2FDYEK.js → chunk-CWRI4JC3.js} +2 -2
  17. package/dist/{chunk-I23OQB4Y.js → chunk-DGG2VY7B.js} +6 -5
  18. package/dist/chunk-DGG2VY7B.js.map +1 -0
  19. package/dist/{chunk-RNBIISBZ.js → chunk-FJDRTVJX.js} +50 -5
  20. package/dist/chunk-FJDRTVJX.js.map +1 -0
  21. package/dist/{chunk-NTTSUAVM.js → chunk-IZIYLYPK.js} +2 -2
  22. package/dist/{chunk-TGRK3CHF.js → chunk-KJTVU3HZ.js} +4 -4
  23. package/dist/{chunk-SC6X5EBG.js → chunk-KXGQYLFZ.js} +3 -3
  24. package/dist/{chunk-USSL2X4A.js → chunk-NUACL52E.js} +2 -2
  25. package/dist/{chunk-JT5LZRMI.js → chunk-NWMORW3U.js} +2 -2
  26. package/dist/{chunk-PVW6JE7E.js → chunk-OFDN5NKS.js} +4 -3
  27. package/dist/{chunk-PVW6JE7E.js.map → chunk-OFDN5NKS.js.map} +1 -1
  28. package/dist/{chunk-HZXBHMVM.js → chunk-R4YWBGY6.js} +3 -3
  29. package/dist/{chunk-XFEK2X2D.js → chunk-RI2YL6TK.js} +9 -3
  30. package/dist/chunk-RI2YL6TK.js.map +1 -0
  31. package/dist/{chunk-6Y3FTRJL.js → chunk-SOSQILHO.js} +102 -51
  32. package/dist/chunk-SOSQILHO.js.map +1 -0
  33. package/dist/{chunk-4GAJJUYS.js → chunk-TC7APDKU.js} +2 -2
  34. package/dist/{chunk-UDZCTLD6.js → chunk-ULSWCPQG.js} +3 -3
  35. package/dist/{chunk-5LVVQGB3.js → chunk-VPTAX5TR.js} +7 -7
  36. package/dist/chunk-VPTAX5TR.js.map +1 -0
  37. package/dist/{chunk-RD7OPXZK.js → chunk-W6DP5RVR.js} +3 -3
  38. package/dist/{chunk-XJHQVOT6.js → chunk-WHI5KEOX.js} +2 -2
  39. package/dist/{chunk-2HZX6AMR.js → chunk-YKFCCV6S.js} +2 -2
  40. package/dist/{chunk-OAVJR4PM.js → chunk-Z2TWEXR7.js} +2 -2
  41. package/dist/{cleanup-M6N7KV7E.js → cleanup-PJRIFFU4.js} +16 -16
  42. package/dist/cli.js +79 -62
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{commit-ORHR53KW.js → commit-IVP3M4HG.js} +10 -9
  45. package/dist/commit-IVP3M4HG.js.map +1 -0
  46. package/dist/{compile-EOWJORKO.js → compile-R2J65HBQ.js} +6 -6
  47. package/dist/{contribute-4KCEOHSH.js → contribute-VDZXHK5Y.js} +4 -4
  48. package/dist/{dev-server-Q6M62ATG.js → dev-server-7F622OEO.js} +8 -8
  49. package/dist/{feedback-XRI7SGYX.js → feedback-E7VET7CL.js} +6 -6
  50. package/dist/{git-W3XUIFTR.js → git-2QDQ2X2S.js} +3 -3
  51. package/dist/{ignite-3FHQY23X.js → ignite-IW35CDBD.js} +10 -10
  52. package/dist/index.d.ts +18 -0
  53. package/dist/index.js +14 -6
  54. package/dist/index.js.map +1 -1
  55. package/dist/{init-ALYWKNWG.js → init-676DHF6R.js} +5 -5
  56. package/dist/issues-PJSOLOBJ.js +138 -0
  57. package/dist/issues-PJSOLOBJ.js.map +1 -0
  58. package/dist/{lint-IHUH45OC.js → lint-CJM7BAIM.js} +6 -6
  59. package/dist/mcp/issue-management-server.js +5 -4
  60. package/dist/mcp/issue-management-server.js.map +1 -1
  61. package/dist/{open-KWOV2OFO.js → open-544H7JF5.js} +8 -8
  62. package/dist/{plan-P6MXL7AU.js → plan-Q7ELXDLC.js} +12 -12
  63. package/dist/prompts/init-prompt.txt +39 -21
  64. package/dist/{rebase-AJOJOZUG.js → rebase-YND35CIE.js} +5 -5
  65. package/dist/{recap-GKJXMDXW.js → recap-3W7COH7D.js} +5 -5
  66. package/dist/{run-QEUVZF7J.js → run-QUXJKDQQ.js} +8 -8
  67. package/dist/schema/settings.schema.json +15 -0
  68. package/dist/{shell-DAAVG4YN.js → shell-QGECBLST.js} +5 -5
  69. package/dist/{summary-WNEYCO4S.js → summary-G2T4452H.js} +9 -9
  70. package/dist/{test-5GPWWO3P.js → test-EA5NQFDC.js} +6 -6
  71. package/dist/{test-git-EJUKDB7F.js → test-git-M7LSLEFL.js} +3 -3
  72. package/dist/{test-prefix-23TOBUXY.js → test-prefix-64NAAUON.js} +3 -3
  73. package/dist/{test-webserver-CKROHFBQ.js → test-webserver-OK6Z5FJM.js} +5 -5
  74. package/dist/{vscode-6TOLFCI2.js → vscode-AR5NNXXI.js} +5 -5
  75. package/package.json +1 -1
  76. package/dist/chunk-5LVVQGB3.js.map +0 -1
  77. package/dist/chunk-6Y3FTRJL.js.map +0 -1
  78. package/dist/chunk-I23OQB4Y.js.map +0 -1
  79. package/dist/chunk-RNBIISBZ.js.map +0 -1
  80. package/dist/chunk-THS5L54H.js.map +0 -1
  81. package/dist/chunk-XFEK2X2D.js.map +0 -1
  82. package/dist/commit-ORHR53KW.js.map +0 -1
  83. /package/dist/{ClaudeContextManager-X2Y72GRL.js.map → ClaudeContextManager-HR5JQKAI.js.map} +0 -0
  84. /package/dist/{ClaudeService-7P32TTES.js.map → ClaudeService-TK7FMC2X.js.map} +0 -0
  85. /package/dist/{GitHubService-ACZVNTJE.js.map → GitHubService-TGWJN4V4.js.map} +0 -0
  86. /package/dist/{LoomLauncher-3I47SUPV.js.map → LoomLauncher-73NXL2CL.js.map} +0 -0
  87. /package/dist/{SettingsManager-QR7V2IW2.js.map → SettingsManager-AW3JTJHD.js.map} +0 -0
  88. /package/dist/{build-IC4CJRMP.js.map → build-THZI572G.js.map} +0 -0
  89. /package/dist/{chunk-Z6F5CUS6.js.map → chunk-3I4ONZRT.js.map} +0 -0
  90. /package/dist/{chunk-MZPRBNYC.js.map → chunk-6IIL5M2L.js.map} +0 -0
  91. /package/dist/{chunk-2JPXGGP4.js.map → chunk-A7NJF73J.js.map} +0 -0
  92. /package/dist/{chunk-H6ST2TGP.js.map → chunk-AR5QKYNE.js.map} +0 -0
  93. /package/dist/{chunk-PL2FDYEK.js.map → chunk-CWRI4JC3.js.map} +0 -0
  94. /package/dist/{chunk-NTTSUAVM.js.map → chunk-IZIYLYPK.js.map} +0 -0
  95. /package/dist/{chunk-TGRK3CHF.js.map → chunk-KJTVU3HZ.js.map} +0 -0
  96. /package/dist/{chunk-SC6X5EBG.js.map → chunk-KXGQYLFZ.js.map} +0 -0
  97. /package/dist/{chunk-USSL2X4A.js.map → chunk-NUACL52E.js.map} +0 -0
  98. /package/dist/{chunk-JT5LZRMI.js.map → chunk-NWMORW3U.js.map} +0 -0
  99. /package/dist/{chunk-HZXBHMVM.js.map → chunk-R4YWBGY6.js.map} +0 -0
  100. /package/dist/{chunk-4GAJJUYS.js.map → chunk-TC7APDKU.js.map} +0 -0
  101. /package/dist/{chunk-UDZCTLD6.js.map → chunk-ULSWCPQG.js.map} +0 -0
  102. /package/dist/{chunk-RD7OPXZK.js.map → chunk-W6DP5RVR.js.map} +0 -0
  103. /package/dist/{chunk-XJHQVOT6.js.map → chunk-WHI5KEOX.js.map} +0 -0
  104. /package/dist/{chunk-2HZX6AMR.js.map → chunk-YKFCCV6S.js.map} +0 -0
  105. /package/dist/{chunk-OAVJR4PM.js.map → chunk-Z2TWEXR7.js.map} +0 -0
  106. /package/dist/{cleanup-M6N7KV7E.js.map → cleanup-PJRIFFU4.js.map} +0 -0
  107. /package/dist/{compile-EOWJORKO.js.map → compile-R2J65HBQ.js.map} +0 -0
  108. /package/dist/{contribute-4KCEOHSH.js.map → contribute-VDZXHK5Y.js.map} +0 -0
  109. /package/dist/{dev-server-Q6M62ATG.js.map → dev-server-7F622OEO.js.map} +0 -0
  110. /package/dist/{feedback-XRI7SGYX.js.map → feedback-E7VET7CL.js.map} +0 -0
  111. /package/dist/{git-W3XUIFTR.js.map → git-2QDQ2X2S.js.map} +0 -0
  112. /package/dist/{ignite-3FHQY23X.js.map → ignite-IW35CDBD.js.map} +0 -0
  113. /package/dist/{init-ALYWKNWG.js.map → init-676DHF6R.js.map} +0 -0
  114. /package/dist/{lint-IHUH45OC.js.map → lint-CJM7BAIM.js.map} +0 -0
  115. /package/dist/{open-KWOV2OFO.js.map → open-544H7JF5.js.map} +0 -0
  116. /package/dist/{plan-P6MXL7AU.js.map → plan-Q7ELXDLC.js.map} +0 -0
  117. /package/dist/{rebase-AJOJOZUG.js.map → rebase-YND35CIE.js.map} +0 -0
  118. /package/dist/{recap-GKJXMDXW.js.map → recap-3W7COH7D.js.map} +0 -0
  119. /package/dist/{run-QEUVZF7J.js.map → run-QUXJKDQQ.js.map} +0 -0
  120. /package/dist/{shell-DAAVG4YN.js.map → shell-QGECBLST.js.map} +0 -0
  121. /package/dist/{summary-WNEYCO4S.js.map → summary-G2T4452H.js.map} +0 -0
  122. /package/dist/{test-5GPWWO3P.js.map → test-EA5NQFDC.js.map} +0 -0
  123. /package/dist/{test-git-EJUKDB7F.js.map → test-git-M7LSLEFL.js.map} +0 -0
  124. /package/dist/{test-prefix-23TOBUXY.js.map → test-prefix-64NAAUON.js.map} +0 -0
  125. /package/dist/{test-webserver-CKROHFBQ.js.map → test-webserver-OK6Z5FJM.js.map} +0 -0
  126. /package/dist/{vscode-6TOLFCI2.js.map → vscode-AR5NNXXI.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-Z6F5CUS6.js";
4
+ } from "./chunk-3I4ONZRT.js";
5
5
  import "./chunk-NXMDEL3F.js";
6
6
  import {
7
7
  CLIIsolationManager,
@@ -9,41 +9,41 @@ import {
9
9
  EnvironmentManager,
10
10
  LoomManager,
11
11
  ResourceCleanup
12
- } from "./chunk-6Y3FTRJL.js";
12
+ } from "./chunk-SOSQILHO.js";
13
13
  import {
14
14
  PRManager
15
- } from "./chunk-I23OQB4Y.js";
15
+ } from "./chunk-DGG2VY7B.js";
16
16
  import {
17
17
  launchFirstRunSetup,
18
18
  needsFirstRunSetup
19
- } from "./chunk-RD7OPXZK.js";
19
+ } from "./chunk-W6DP5RVR.js";
20
20
  import {
21
21
  BuildRunner,
22
22
  MergeManager
23
- } from "./chunk-HZXBHMVM.js";
23
+ } from "./chunk-R4YWBGY6.js";
24
24
  import {
25
25
  IssueTrackerFactory
26
- } from "./chunk-SC6X5EBG.js";
26
+ } from "./chunk-KXGQYLFZ.js";
27
27
  import {
28
28
  ProcessManager
29
- } from "./chunk-NTTSUAVM.js";
30
- import "./chunk-USSL2X4A.js";
29
+ } from "./chunk-IZIYLYPK.js";
30
+ import "./chunk-NUACL52E.js";
31
31
  import {
32
32
  IdentifierParser,
33
33
  matchIssueIdentifier
34
- } from "./chunk-2HZX6AMR.js";
34
+ } from "./chunk-YKFCCV6S.js";
35
35
  import {
36
36
  createNeonProviderFromSettings
37
37
  } from "./chunk-7ZEHSSUP.js";
38
38
  import {
39
39
  ShellCompletion
40
- } from "./chunk-JT5LZRMI.js";
40
+ } from "./chunk-NWMORW3U.js";
41
41
  import "./chunk-Q7POFB5Q.js";
42
42
  import {
43
43
  IssueEnhancementService,
44
44
  capitalizeFirstLetter
45
- } from "./chunk-PL2FDYEK.js";
46
- import "./chunk-XJHQVOT6.js";
45
+ } from "./chunk-CWRI4JC3.js";
46
+ import "./chunk-WHI5KEOX.js";
47
47
  import {
48
48
  openBrowser
49
49
  } from "./chunk-YETJNRQM.js";
@@ -54,19 +54,19 @@ import {
54
54
  CommitManager,
55
55
  UserAbortedCommitError,
56
56
  ValidationRunner
57
- } from "./chunk-5LVVQGB3.js";
57
+ } from "./chunk-VPTAX5TR.js";
58
58
  import {
59
59
  IssueManagementProviderFactory
60
- } from "./chunk-UDZCTLD6.js";
60
+ } from "./chunk-ULSWCPQG.js";
61
61
  import {
62
62
  getLinearChildIssues
63
- } from "./chunk-RNBIISBZ.js";
63
+ } from "./chunk-FJDRTVJX.js";
64
64
  import {
65
65
  installDependencies
66
66
  } from "./chunk-4LKGCFGG.js";
67
67
  import {
68
68
  GitWorktreeManager
69
- } from "./chunk-4GAJJUYS.js";
69
+ } from "./chunk-TC7APDKU.js";
70
70
  import {
71
71
  getConfiguredRepoFromSettings,
72
72
  hasMultipleRemotes
@@ -78,8 +78,8 @@ import {
78
78
  } from "./chunk-O7VL5N6S.js";
79
79
  import {
80
80
  ClaudeContextManager
81
- } from "./chunk-OAVJR4PM.js";
82
- import "./chunk-MZPRBNYC.js";
81
+ } from "./chunk-Z2TWEXR7.js";
82
+ import "./chunk-6IIL5M2L.js";
83
83
  import "./chunk-QN47QVBX.js";
84
84
  import {
85
85
  extractSettingsOverrides
@@ -103,19 +103,19 @@ import {
103
103
  pushBranchToRemote,
104
104
  removePlaceholderCommitFromHead,
105
105
  removePlaceholderCommitFromHistory
106
- } from "./chunk-H6ST2TGP.js";
106
+ } from "./chunk-AR5QKYNE.js";
107
107
  import {
108
108
  SettingsManager
109
- } from "./chunk-XFEK2X2D.js";
109
+ } from "./chunk-RI2YL6TK.js";
110
110
  import {
111
111
  MetadataManager
112
112
  } from "./chunk-KBEIQP4G.js";
113
113
  import {
114
114
  GitHubService
115
- } from "./chunk-PVW6JE7E.js";
115
+ } from "./chunk-OFDN5NKS.js";
116
116
  import {
117
117
  getSubIssues
118
- } from "./chunk-THS5L54H.js";
118
+ } from "./chunk-4CO6KG5S.js";
119
119
  import {
120
120
  promptConfirmation,
121
121
  waitForKeypress
@@ -268,10 +268,7 @@ var StartCommand = class {
268
268
  parsed.type = "issue";
269
269
  parsed.number = result.number;
270
270
  }
271
- if (input.options.oneShot === "bypassPermissions") {
272
- if (isJsonMode) {
273
- throw new Error("JSON mode does not support bypassPermissions confirmation prompt");
274
- }
271
+ if (input.options.oneShot === "bypassPermissions" && input.options.claude !== false && !isJsonMode) {
275
272
  const { promptConfirmation: promptConfirmation2 } = await import("./prompt-ONNPSNKM.js");
276
273
  const confirmed = await promptConfirmation2(
277
274
  "WARNING: bypassPermissions mode will allow Claude to execute all tool calls without confirmation. This can be dangerous. Do you want to proceed?"
@@ -1101,7 +1098,7 @@ var FinishCommand = class {
1101
1098
  * This is the workflow: rebase → validate → commit → merge → cleanup
1102
1099
  */
1103
1100
  async executeIssueWorkflow(parsed, options, worktree, result) {
1104
- var _a, _b, _c, _d;
1101
+ var _a, _b, _c, _d, _e;
1105
1102
  getLogger().info("Rebasing branch on main...");
1106
1103
  const mergeOptions = {
1107
1104
  dryRun: options.dryRun ?? false,
@@ -1151,7 +1148,8 @@ var FinishCommand = class {
1151
1148
  const commitOptions = {
1152
1149
  dryRun: options.dryRun ?? false,
1153
1150
  skipVerify,
1154
- issuePrefix
1151
+ issuePrefix,
1152
+ timeout: (_d = settings2.git) == null ? void 0 : _d.commitTimeout
1155
1153
  };
1156
1154
  if (parsed.type === "issue" && parsed.number) {
1157
1155
  commitOptions.issueNumber = parsed.number;
@@ -1245,7 +1243,7 @@ var FinishCommand = class {
1245
1243
  } else {
1246
1244
  getLogger().info(`[DRY RUN] Would mark PR #${metadata.draftPrNumber} as ready for review`);
1247
1245
  }
1248
- const prUrl = (_d = metadata.prUrls) == null ? void 0 : _d[String(metadata.draftPrNumber)];
1246
+ const prUrl = (_e = metadata.prUrls) == null ? void 0 : _e[String(metadata.draftPrNumber)];
1249
1247
  if (prUrl) {
1250
1248
  result.prUrl = prUrl;
1251
1249
  }
@@ -1298,7 +1296,7 @@ var FinishCommand = class {
1298
1296
  * - CLOSED/MERGED: Skip to cleanup
1299
1297
  */
1300
1298
  async executePRWorkflow(parsed, options, worktree, pr, result) {
1301
- var _a, _b, _c;
1299
+ var _a, _b, _c, _d;
1302
1300
  if (pr.state === "closed" || pr.state === "merged") {
1303
1301
  getLogger().info(`PR #${parsed.number} is ${pr.state.toUpperCase()} - skipping to cleanup`);
1304
1302
  const gitStatus = await this.commitManager.detectUncommittedChanges(worktree.path);
@@ -1341,7 +1339,8 @@ var FinishCommand = class {
1341
1339
  await this.commitManager.commitChanges(worktree.path, {
1342
1340
  dryRun: false,
1343
1341
  skipVerify,
1344
- issuePrefix
1342
+ issuePrefix,
1343
+ timeout: (_d = settings.git) == null ? void 0 : _d.commitTimeout
1345
1344
  // Do NOT pass issueNumber for PRs - no "Fixes #" trailer needed
1346
1345
  });
1347
1346
  getLogger().success("Changes committed");
@@ -1931,6 +1930,7 @@ async function fetchChildIssues(parentIssueNumber, settings, repo) {
1931
1930
  logger.debug("Fetching child issues", { parentIssueNumber, provider: providerName, repo });
1932
1931
  const results = await Promise.allSettled([
1933
1932
  (async () => {
1933
+ var _a, _b;
1934
1934
  if (providerName === "github") {
1935
1935
  const issueNum = parseInt(parentIssueNumber, 10);
1936
1936
  if (isNaN(issueNum)) {
@@ -1939,7 +1939,8 @@ async function fetchChildIssues(parentIssueNumber, settings, repo) {
1939
1939
  }
1940
1940
  return getSubIssues(issueNum, repo);
1941
1941
  } else if (providerName === "linear") {
1942
- return getLinearChildIssues(parentIssueNumber);
1942
+ const apiToken = (_b = (_a = settings.issueManagement) == null ? void 0 : _a.linear) == null ? void 0 : _b.apiToken;
1943
+ return getLinearChildIssues(parentIssueNumber, apiToken ? { apiToken } : void 0);
1943
1944
  } else {
1944
1945
  logger.warn(`Unsupported issue tracker provider: ${providerName}`);
1945
1946
  return [];
@@ -2267,7 +2268,7 @@ async function validateSettingsForCommand(command) {
2267
2268
  if (bypassCommands.includes(commandName)) {
2268
2269
  return;
2269
2270
  }
2270
- const warnOnlyCommands = ["list", "projects"];
2271
+ const warnOnlyCommands = ["list", "projects", "issues"];
2271
2272
  try {
2272
2273
  const settingsManager = new SettingsManager();
2273
2274
  const settings = await settingsManager.loadSettings();
@@ -2291,7 +2292,7 @@ async function validateGhCliForCommand(command) {
2291
2292
  const commandName = command.name();
2292
2293
  const alwaysRequireGh = ["feedback", "contribute"];
2293
2294
  const conditionallyRequireGh = ["start", "finish", "enhance", "add-issue", "ignite", "spin"];
2294
- const warnOnly = ["init", "list", "rebase", "cleanup", "run", "update", "open"];
2295
+ const warnOnly = ["init", "list", "rebase", "cleanup", "run", "update", "open", "issues"];
2295
2296
  if (commandName.startsWith("test-") || commandName === "help") {
2296
2297
  return;
2297
2298
  }
@@ -2385,14 +2386,14 @@ async function autoLaunchInitForMultipleRemotes() {
2385
2386
  await waitForKeypress2("Press any key to start configuration...");
2386
2387
  logger.info("");
2387
2388
  try {
2388
- const { InitCommand } = await import("./init-ALYWKNWG.js");
2389
+ const { InitCommand } = await import("./init-676DHF6R.js");
2389
2390
  const initCommand = new InitCommand();
2390
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.";
2391
2392
  await initCommand.execute(customInitialMessage);
2392
2393
  logger.info("");
2393
2394
  logger.info("Configuration complete! Continuing with your original command...");
2394
2395
  logger.info("");
2395
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-QR7V2IW2.js");
2396
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-AW3JTJHD.js");
2396
2397
  const settingsManager = new SettingsManager2();
2397
2398
  const settings = await settingsManager.loadSettings();
2398
2399
  const { hasMultipleRemotes: hasMultipleRemotes2 } = await import("./remote-IJAMOEAP.js");
@@ -2489,7 +2490,7 @@ program.command("add-issue").alias("a").description("Create and enhance GitHub i
2489
2490
  });
2490
2491
  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) => {
2491
2492
  try {
2492
- const { FeedbackCommand } = await import("./feedback-XRI7SGYX.js");
2493
+ const { FeedbackCommand } = await import("./feedback-E7VET7CL.js");
2493
2494
  const command = new FeedbackCommand();
2494
2495
  const feedbackOptions = {};
2495
2496
  if (options.body !== void 0) {
@@ -2574,7 +2575,7 @@ program.command("finish").alias("dn").description("Merge work and cleanup worksp
2574
2575
  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) => {
2575
2576
  const executeAction = async () => {
2576
2577
  try {
2577
- const { CommitCommand } = await import("./commit-ORHR53KW.js");
2578
+ const { CommitCommand } = await import("./commit-IVP3M4HG.js");
2578
2579
  const command = new CommitCommand();
2579
2580
  const noReview = options.review === false || options.json === true;
2580
2581
  const result = await command.execute({
@@ -2609,7 +2610,7 @@ program.command("commit").alias("c").description("Commit all uncommitted files w
2609
2610
  });
2610
2611
  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) => {
2611
2612
  try {
2612
- const { RebaseCommand } = await import("./rebase-AJOJOZUG.js");
2613
+ const { RebaseCommand } = await import("./rebase-YND35CIE.js");
2613
2614
  const command = new RebaseCommand();
2614
2615
  await command.execute(options);
2615
2616
  } catch (error) {
@@ -2626,7 +2627,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
2626
2627
  options.oneShot = "bypassPermissions";
2627
2628
  }
2628
2629
  try {
2629
- const { IgniteCommand } = await import("./ignite-3FHQY23X.js");
2630
+ const { IgniteCommand } = await import("./ignite-IW35CDBD.js");
2630
2631
  const command = new IgniteCommand();
2631
2632
  if (options.json && options.jsonStream) {
2632
2633
  logger.error("--json and --json-stream are mutually exclusive");
@@ -2654,7 +2655,7 @@ program.command("spin").alias("ignite").description("Launch Claude with auto-det
2654
2655
  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) => {
2655
2656
  try {
2656
2657
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
2657
- const { OpenCommand } = await import("./open-KWOV2OFO.js");
2658
+ const { OpenCommand } = await import("./open-544H7JF5.js");
2658
2659
  const cmd = new OpenCommand();
2659
2660
  const input = identifier ? { identifier, args } : { args };
2660
2661
  await cmd.execute(input);
@@ -2666,7 +2667,7 @@ program.command("open").description("Open workspace in browser or run CLI tool")
2666
2667
  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) => {
2667
2668
  try {
2668
2669
  const args = (command == null ? void 0 : command.args) ? command.args.slice(identifier ? 1 : 0) : [];
2669
- const { RunCommand } = await import("./run-QEUVZF7J.js");
2670
+ const { RunCommand } = await import("./run-QUXJKDQQ.js");
2670
2671
  const cmd = new RunCommand();
2671
2672
  const input = identifier ? { identifier, args } : { args };
2672
2673
  await cmd.execute(input);
@@ -2677,7 +2678,7 @@ program.command("run").description("Run CLI tool or open workspace in browser").
2677
2678
  });
2678
2679
  program.command("vscode").description("Install iloom VS Code extension and open workspace in VS Code").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").option("--no-wait", "Skip keypress prompt and open immediately").action(async (identifier, options) => {
2679
2680
  try {
2680
- const { VSCodeCommand } = await import("./vscode-6TOLFCI2.js");
2681
+ const { VSCodeCommand } = await import("./vscode-AR5NNXXI.js");
2681
2682
  const cmd = new VSCodeCommand();
2682
2683
  await cmd.execute({ identifier, wait: options == null ? void 0 : options.wait });
2683
2684
  } catch (error) {
@@ -2686,7 +2687,7 @@ program.command("vscode").description("Install iloom VS Code extension and open
2686
2687
  });
2687
2688
  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) => {
2688
2689
  try {
2689
- const { DevServerCommand } = await import("./dev-server-Q6M62ATG.js");
2690
+ const { DevServerCommand } = await import("./dev-server-7F622OEO.js");
2690
2691
  const cmd = new DevServerCommand();
2691
2692
  await cmd.execute({ identifier, json: options == null ? void 0 : options.json });
2692
2693
  } catch (error) {
@@ -2696,7 +2697,7 @@ program.command("dev-server").alias("dev").description("Start dev server for wor
2696
2697
  });
2697
2698
  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) => {
2698
2699
  try {
2699
- const { ShellCommand } = await import("./shell-DAAVG4YN.js");
2700
+ const { ShellCommand } = await import("./shell-QGECBLST.js");
2700
2701
  const cmd = new ShellCommand();
2701
2702
  await cmd.execute({ identifier });
2702
2703
  } catch (error) {
@@ -2706,7 +2707,7 @@ program.command("shell").alias("terminal").description("Open interactive shell w
2706
2707
  });
2707
2708
  program.command("build").description("Run the build script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2708
2709
  try {
2709
- const { BuildCommand } = await import("./build-IC4CJRMP.js");
2710
+ const { BuildCommand } = await import("./build-THZI572G.js");
2710
2711
  const cmd = new BuildCommand();
2711
2712
  await cmd.execute(identifier ? { identifier } : {});
2712
2713
  } catch (error) {
@@ -2716,7 +2717,7 @@ program.command("build").description("Run the build script").argument("[identifi
2716
2717
  });
2717
2718
  program.command("lint").description("Run the lint script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2718
2719
  try {
2719
- const { LintCommand } = await import("./lint-IHUH45OC.js");
2720
+ const { LintCommand } = await import("./lint-CJM7BAIM.js");
2720
2721
  const cmd = new LintCommand();
2721
2722
  await cmd.execute(identifier ? { identifier } : {});
2722
2723
  } catch (error) {
@@ -2726,7 +2727,7 @@ program.command("lint").description("Run the lint script").argument("[identifier
2726
2727
  });
2727
2728
  program.command("test").description("Run the test script").argument("[identifier]", "Issue number, PR number, or branch name (auto-detected if omitted)").action(async (identifier) => {
2728
2729
  try {
2729
- const { TestCommand } = await import("./test-5GPWWO3P.js");
2730
+ const { TestCommand } = await import("./test-EA5NQFDC.js");
2730
2731
  const cmd = new TestCommand();
2731
2732
  await cmd.execute(identifier ? { identifier } : {});
2732
2733
  } catch (error) {
@@ -2736,7 +2737,7 @@ program.command("test").description("Run the test script").argument("[identifier
2736
2737
  });
2737
2738
  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) => {
2738
2739
  try {
2739
- const { CompileCommand } = await import("./compile-EOWJORKO.js");
2740
+ const { CompileCommand } = await import("./compile-R2J65HBQ.js");
2740
2741
  const cmd = new CompileCommand();
2741
2742
  await cmd.execute(identifier ? { identifier } : {});
2742
2743
  } catch (error) {
@@ -2747,7 +2748,7 @@ program.command("compile").alias("typecheck").description("Run the compile or ty
2747
2748
  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) => {
2748
2749
  const executeAction = async () => {
2749
2750
  try {
2750
- const { CleanupCommand } = await import("./cleanup-M6N7KV7E.js");
2751
+ const { CleanupCommand } = await import("./cleanup-PJRIFFU4.js");
2751
2752
  const command = new CleanupCommand();
2752
2753
  const input = {
2753
2754
  options: options ?? {}
@@ -3072,9 +3073,25 @@ program.command("projects").description("List configured iloom projects").option
3072
3073
  process.exit(1);
3073
3074
  }
3074
3075
  });
3076
+ program.command("issues").description("List project issues from configured issue tracker").argument("[project-path]", "Path to project root (auto-detected if omitted)").option("--json", "Output as JSON (default behavior)").option("--limit <n>", "Max issues to return", "100").action(async (projectPath, options) => {
3077
+ try {
3078
+ const { IssuesCommand } = await import("./issues-PJSOLOBJ.js");
3079
+ const command = new IssuesCommand();
3080
+ const parsedLimit = parseInt((options == null ? void 0 : options.limit) ?? "100", 10);
3081
+ const limit = Number.isNaN(parsedLimit) || parsedLimit <= 0 ? 100 : parsedLimit;
3082
+ const result = await command.execute({
3083
+ ...projectPath ? { projectPath } : {},
3084
+ limit
3085
+ });
3086
+ console.log(JSON.stringify(result, null, 2));
3087
+ } catch (error) {
3088
+ logger.error(`Failed to list issues: ${error instanceof Error ? error.message : "Unknown error"}`);
3089
+ process.exit(1);
3090
+ }
3091
+ });
3075
3092
  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) => {
3076
3093
  try {
3077
- const { InitCommand } = await import("./init-ALYWKNWG.js");
3094
+ const { InitCommand } = await import("./init-676DHF6R.js");
3078
3095
  const command = new InitCommand();
3079
3096
  const trimmedPrompt = prompt == null ? void 0 : prompt.trim();
3080
3097
  const customPrompt = trimmedPrompt && trimmedPrompt.length > 0 ? trimmedPrompt : void 0;
@@ -3088,7 +3105,7 @@ program.command("plan").description("Launch interactive planning session with Ar
3088
3105
  new Option("--output-format <format>", "Output format for Claude CLI (requires --print)").choices(["json", "stream-json", "text"])
3089
3106
  ).option("--verbose", "Enable verbose output (requires --print)").option("--json", "Output final result as JSON object (requires --print)").option("--json-stream", "Stream JSONL output to stdout in real-time (requires --print)").action(async (prompt, options) => {
3090
3107
  try {
3091
- const { PlanCommand } = await import("./plan-P6MXL7AU.js");
3108
+ const { PlanCommand } = await import("./plan-Q7ELXDLC.js");
3092
3109
  const command = new PlanCommand();
3093
3110
  if ((options == null ? void 0 : options.json) && (options == null ? void 0 : options.jsonStream)) {
3094
3111
  logger.error("--json and --json-stream are mutually exclusive");
@@ -3115,7 +3132,7 @@ program.command("plan").description("Launch interactive planning session with Ar
3115
3132
  });
3116
3133
  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) => {
3117
3134
  try {
3118
- const { ContributeCommand } = await import("./contribute-4KCEOHSH.js");
3135
+ const { ContributeCommand } = await import("./contribute-VDZXHK5Y.js");
3119
3136
  const command = new ContributeCommand();
3120
3137
  await command.execute(repository);
3121
3138
  } catch (error) {
@@ -3135,7 +3152,7 @@ program.command("update").description("Update iloom-cli to the latest version").
3135
3152
  });
3136
3153
  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) => {
3137
3154
  try {
3138
- const { GitHubService: GitHubService2 } = await import("./GitHubService-ACZVNTJE.js");
3155
+ const { GitHubService: GitHubService2 } = await import("./GitHubService-TGWJN4V4.js");
3139
3156
  const { DefaultBranchNamingService: DefaultBranchNamingService2 } = await import("./BranchNamingService-K6XNWQ6C.js");
3140
3157
  logger.info("Testing GitHub Integration\n");
3141
3158
  const service = new GitHubService2();
@@ -3196,8 +3213,8 @@ program.command("test-claude").description("Test Claude integration (Issue #10)"
3196
3213
  try {
3197
3214
  const { detectClaudeCli, getClaudeVersion, generateBranchName, launchClaude } = await import("./claude-TP2QO3BU.js");
3198
3215
  const { PromptTemplateManager } = await import("./PromptTemplateManager-36YLQRHP.js");
3199
- const { ClaudeService } = await import("./ClaudeService-7P32TTES.js");
3200
- const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-X2Y72GRL.js");
3216
+ const { ClaudeService } = await import("./ClaudeService-TK7FMC2X.js");
3217
+ const { ClaudeContextManager: ClaudeContextManager2 } = await import("./ClaudeContextManager-HR5JQKAI.js");
3201
3218
  logger.info("Testing Claude Integration\n");
3202
3219
  if (options.detect) {
3203
3220
  logger.info("Detecting Claude CLI...");
@@ -3332,7 +3349,7 @@ program.command("test-claude").description("Test Claude integration (Issue #10)"
3332
3349
  });
3333
3350
  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) => {
3334
3351
  try {
3335
- const { TestWebserverCommand } = await import("./test-webserver-CKROHFBQ.js");
3352
+ const { TestWebserverCommand } = await import("./test-webserver-OK6Z5FJM.js");
3336
3353
  const command = new TestWebserverCommand();
3337
3354
  await command.execute({ issueNumber, options });
3338
3355
  } catch (error) {
@@ -3345,7 +3362,7 @@ program.command("test-webserver").description("Test if a web server is running o
3345
3362
  });
3346
3363
  program.command("test-git").description("Test Git integration - findMainWorktreePath() function (reads .iloom/settings.json)").action(async () => {
3347
3364
  try {
3348
- const { TestGitCommand } = await import("./test-git-EJUKDB7F.js");
3365
+ const { TestGitCommand } = await import("./test-git-M7LSLEFL.js");
3349
3366
  const command = new TestGitCommand();
3350
3367
  await command.execute();
3351
3368
  } catch (error) {
@@ -3371,7 +3388,7 @@ program.command("test-tabs").description("Test iTerm2 dual tab functionality - o
3371
3388
  });
3372
3389
  program.command("test-prefix").description("Test worktree prefix configuration - preview worktree paths (reads .iloom/settings.json)").action(async () => {
3373
3390
  try {
3374
- const { TestPrefixCommand } = await import("./test-prefix-23TOBUXY.js");
3391
+ const { TestPrefixCommand } = await import("./test-prefix-64NAAUON.js");
3375
3392
  const command = new TestPrefixCommand();
3376
3393
  await command.execute();
3377
3394
  } catch (error) {
@@ -3385,7 +3402,7 @@ program.command("test-prefix").description("Test worktree prefix configuration -
3385
3402
  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) => {
3386
3403
  const executeAction = async () => {
3387
3404
  try {
3388
- const { SummaryCommand } = await import("./summary-WNEYCO4S.js");
3405
+ const { SummaryCommand } = await import("./summary-G2T4452H.js");
3389
3406
  const command = new SummaryCommand();
3390
3407
  const result = await command.execute({ identifier, options });
3391
3408
  if (options.json && result) {
@@ -3414,7 +3431,7 @@ program.command("summary").description("Generate Claude session summary for a lo
3414
3431
  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) => {
3415
3432
  const executeAction = async () => {
3416
3433
  try {
3417
- const { RecapCommand } = await import("./recap-GKJXMDXW.js");
3434
+ const { RecapCommand } = await import("./recap-3W7COH7D.js");
3418
3435
  const command = new RecapCommand();
3419
3436
  const result = await command.execute({ identifier, json: options.json });
3420
3437
  if (options.json && result) {
@@ -3443,7 +3460,7 @@ program.command("recap").description("Get recap for a loom (defaults to current
3443
3460
  program.command("test-neon").description("Test Neon integration and debug configuration").action(async () => {
3444
3461
  var _a;
3445
3462
  try {
3446
- const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-QR7V2IW2.js");
3463
+ const { SettingsManager: SettingsManager2 } = await import("./SettingsManager-AW3JTJHD.js");
3447
3464
  const { createNeonProviderFromSettings: createNeonProviderFromSettings2 } = await import("./neon-helpers-VVFFTLXE.js");
3448
3465
  logger.info("Testing Neon Integration\n");
3449
3466
  logger.info("1. Settings Configuration:");