@iloom/cli 0.7.6 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +32 -3
  3. package/dist/{ClaudeContextManager-Y2YJC6BU.js → ClaudeContextManager-RDP6CLK6.js} +5 -5
  4. package/dist/{ClaudeService-NDVFQRKC.js → ClaudeService-FKPOQRA4.js} +4 -4
  5. package/dist/GitHubService-ACZVNTJE.js +12 -0
  6. package/dist/{LoomLauncher-U2B3VHPC.js → LoomLauncher-NHZMEVTQ.js} +5 -5
  7. package/dist/{MetadataManager-XJ2YB762.js → MetadataManager-W3C54UYT.js} +2 -2
  8. package/dist/{PRManager-7F3AAY66.js → PRManager-H4TUZTZL.js} +5 -5
  9. package/dist/{PromptTemplateManager-7L3HJQQU.js → PromptTemplateManager-OUYDHOPI.js} +2 -2
  10. package/dist/README.md +32 -3
  11. package/dist/{SettingsManager-YU4VYPTW.js → SettingsManager-VCVLL32H.js} +4 -2
  12. package/dist/{SettingsMigrationManager-KZKDG66H.js → SettingsMigrationManager-LEBMJP3B.js} +3 -3
  13. package/dist/agents/iloom-code-reviewer.md +735 -0
  14. package/dist/agents/iloom-framework-detector.md +1 -1
  15. package/dist/agents/iloom-issue-analyze-and-plan.md +2 -2
  16. package/dist/agents/iloom-issue-analyzer.md +2 -2
  17. package/dist/agents/iloom-issue-complexity-evaluator.md +1 -1
  18. package/dist/agents/iloom-issue-enhancer.md +2 -2
  19. package/dist/agents/iloom-issue-implementer.md +3 -3
  20. package/dist/agents/iloom-issue-planner.md +2 -2
  21. package/dist/{build-HQ5HGA3T.js → build-H4DK3DMQ.js} +7 -7
  22. package/dist/{chunk-N7FVXZNI.js → chunk-4BSXZ5YZ.js} +31 -9
  23. package/dist/chunk-4BSXZ5YZ.js.map +1 -0
  24. package/dist/{chunk-VYKKWU36.js → chunk-4KGRPHM6.js} +3 -3
  25. package/dist/{chunk-CFQVOTHO.js → chunk-52MVUK5V.js} +2 -2
  26. package/dist/{chunk-TIYJEEVO.js → chunk-66QOCD5N.js} +1 -1
  27. package/dist/chunk-66QOCD5N.js.map +1 -0
  28. package/dist/chunk-7JDMYTFZ.js +251 -0
  29. package/dist/chunk-7JDMYTFZ.js.map +1 -0
  30. package/dist/{chunk-7LSSNB7Y.js → chunk-7ZEHSSUP.js} +2 -2
  31. package/dist/chunk-A4UQY3M2.js +75 -0
  32. package/dist/chunk-A4UQY3M2.js.map +1 -0
  33. package/dist/{chunk-ELJKYFSH.js → chunk-BCQDYAOJ.js} +4 -4
  34. package/dist/{chunk-F2PWIRV4.js → chunk-BYUMEDDD.js} +2 -2
  35. package/dist/{chunk-CAXFWFV6.js → chunk-ECP77QGE.js} +4 -4
  36. package/dist/{chunk-6YAMWLCP.js → chunk-EQOFNPEY.js} +3 -3
  37. package/dist/{chunk-ZA575VLF.js → chunk-GDS2HXSW.js} +4 -4
  38. package/dist/{chunk-UDRZY65Y.js → chunk-HSGZW3ID.js} +2 -2
  39. package/dist/{chunk-WFQ5CLTR.js → chunk-IWIIOFEB.js} +56 -5
  40. package/dist/chunk-IWIIOFEB.js.map +1 -0
  41. package/dist/{chunk-VWGKGNJP.js → chunk-KBEIQP4G.js} +3 -1
  42. package/dist/chunk-KBEIQP4G.js.map +1 -0
  43. package/dist/{chunk-ETY2SBW5.js → chunk-NR64HNF7.js} +17 -15
  44. package/dist/chunk-NR64HNF7.js.map +1 -0
  45. package/dist/{chunk-WT4UGBE2.js → chunk-PBSHQVCT.js} +5 -5
  46. package/dist/{chunk-64HCHVJM.js → chunk-PLI3JQWT.js} +2 -2
  47. package/dist/{chunk-USJSNHGG.js → chunk-PVW6JE7E.js} +3 -3
  48. package/dist/{chunk-HBJITKSZ.js → chunk-RNBIISBZ.js} +161 -3
  49. package/dist/chunk-RNBIISBZ.js.map +1 -0
  50. package/dist/{chunk-C7YW5IMS.js → chunk-RODL2HVY.js} +17 -6
  51. package/dist/{chunk-C7YW5IMS.js.map → chunk-RODL2HVY.js.map} +1 -1
  52. package/dist/{chunk-3K3WY3BN.js → chunk-SC6X5EBG.js} +4 -4
  53. package/dist/{chunk-NEPH2O4C.js → chunk-SSASIBDJ.js} +3 -3
  54. package/dist/{chunk-GCPAZSGV.js → chunk-THS5L54H.js} +150 -3
  55. package/dist/chunk-THS5L54H.js.map +1 -0
  56. package/dist/{chunk-5V74K5ZA.js → chunk-TVH67KEO.js} +25 -2
  57. package/dist/chunk-TVH67KEO.js.map +1 -0
  58. package/dist/{chunk-NPEMVE27.js → chunk-UDZCTLD6.js} +115 -3
  59. package/dist/chunk-UDZCTLD6.js.map +1 -0
  60. package/dist/{chunk-ENMTWE74.js → chunk-VZYSM7N7.js} +2 -2
  61. package/dist/{chunk-WZYBHD7P.js → chunk-XHNACIHO.js} +2 -2
  62. package/dist/{chunk-XAMBIVXE.js → chunk-XJHQVOT6.js} +2 -2
  63. package/dist/{chunk-O36JLYNW.js → chunk-XU5A6BWA.js} +4 -7
  64. package/dist/chunk-XU5A6BWA.js.map +1 -0
  65. package/dist/{cleanup-IO4KV2DL.js → cleanup-OGE7V7AD.js} +16 -16
  66. package/dist/cli.js +317 -164
  67. package/dist/cli.js.map +1 -1
  68. package/dist/{commit-3ULFKXNB.js → commit-534QIRHY.js} +10 -10
  69. package/dist/{compile-CT7IR7O2.js → compile-ZOAODFN2.js} +7 -7
  70. package/dist/{contribute-GXKOIA42.js → contribute-7USRBWRM.js} +6 -6
  71. package/dist/{dev-server-OAP3RZC6.js → dev-server-TYYJM3XA.js} +9 -9
  72. package/dist/{feedback-ZLAX3BVL.js → feedback-HZVLOTQJ.js} +9 -9
  73. package/dist/{git-ENLT2VNI.js → git-GUNOPP4Q.js} +4 -4
  74. package/dist/hooks/iloom-hook.js +75 -3
  75. package/dist/{ignite-HA2OJF6Z.js → ignite-ZO7SGUKP.js} +85 -25
  76. package/dist/ignite-ZO7SGUKP.js.map +1 -0
  77. package/dist/index.d.ts +85 -2
  78. package/dist/index.js +133 -73
  79. package/dist/index.js.map +1 -1
  80. package/dist/init-MZBIXQ7V.js +21 -0
  81. package/dist/{lint-HAVU4U34.js → lint-MDVUV3W2.js} +7 -7
  82. package/dist/mcp/issue-management-server.js +569 -2
  83. package/dist/mcp/issue-management-server.js.map +1 -1
  84. package/dist/{neon-helpers-3KBC4A3Y.js → neon-helpers-VVFFTLXE.js} +3 -3
  85. package/dist/{open-IN3LUZXX.js → open-2LPZ7XXW.js} +9 -9
  86. package/dist/plan-PIME6UNY.js +371 -0
  87. package/dist/plan-PIME6UNY.js.map +1 -0
  88. package/dist/{projects-CTRTTMSK.js → projects-325GEEGJ.js} +2 -2
  89. package/dist/{prompt-3SAZYRUN.js → prompt-ONNPSNKM.js} +2 -2
  90. package/dist/prompts/init-prompt.txt +83 -3
  91. package/dist/prompts/issue-prompt.txt +51 -3
  92. package/dist/prompts/plan-prompt.txt +435 -0
  93. package/dist/prompts/pr-prompt.txt +38 -0
  94. package/dist/prompts/regular-prompt.txt +53 -3
  95. package/dist/{rebase-RLEVFHWN.js → rebase-7YS3N274.js} +6 -6
  96. package/dist/{recap-ZKGHZCX6.js → recap-GSXFEOD6.js} +6 -6
  97. package/dist/{run-QEIS2EH2.js → run-XPGCMFFO.js} +9 -9
  98. package/dist/schema/settings.schema.json +57 -1
  99. package/dist/{shell-2NNSIU34.js → shell-2SPM3Z5O.js} +6 -6
  100. package/dist/{summary-MPOOQIOX.js → summary-C5VVSJAJ.js} +11 -11
  101. package/dist/{test-75WAA6DU.js → test-N2725YRI.js} +7 -7
  102. package/dist/{test-git-E2BLXR6M.js → test-git-ZPSPA2TP.js} +4 -4
  103. package/dist/{test-prefix-A7JGGYAA.js → test-prefix-6DLB2BHE.js} +4 -4
  104. package/dist/{test-webserver-J6SMNLU2.js → test-webserver-XLJ2TZFP.js} +6 -6
  105. package/package.json +1 -1
  106. package/dist/GitHubService-O7U4UQ7N.js +0 -12
  107. package/dist/agents/iloom-issue-reviewer.md +0 -139
  108. package/dist/chunk-5V74K5ZA.js.map +0 -1
  109. package/dist/chunk-ETY2SBW5.js.map +0 -1
  110. package/dist/chunk-GCPAZSGV.js.map +0 -1
  111. package/dist/chunk-HBJITKSZ.js.map +0 -1
  112. package/dist/chunk-N7FVXZNI.js.map +0 -1
  113. package/dist/chunk-NPEMVE27.js.map +0 -1
  114. package/dist/chunk-O36JLYNW.js.map +0 -1
  115. package/dist/chunk-TIYJEEVO.js.map +0 -1
  116. package/dist/chunk-VWGKGNJP.js.map +0 -1
  117. package/dist/chunk-WFQ5CLTR.js.map +0 -1
  118. package/dist/chunk-ZX3GTM7O.js +0 -119
  119. package/dist/chunk-ZX3GTM7O.js.map +0 -1
  120. package/dist/ignite-HA2OJF6Z.js.map +0 -1
  121. package/dist/init-S6IEGRSX.js +0 -21
  122. /package/dist/{ClaudeContextManager-Y2YJC6BU.js.map → ClaudeContextManager-RDP6CLK6.js.map} +0 -0
  123. /package/dist/{ClaudeService-NDVFQRKC.js.map → ClaudeService-FKPOQRA4.js.map} +0 -0
  124. /package/dist/{GitHubService-O7U4UQ7N.js.map → GitHubService-ACZVNTJE.js.map} +0 -0
  125. /package/dist/{LoomLauncher-U2B3VHPC.js.map → LoomLauncher-NHZMEVTQ.js.map} +0 -0
  126. /package/dist/{MetadataManager-XJ2YB762.js.map → MetadataManager-W3C54UYT.js.map} +0 -0
  127. /package/dist/{PRManager-7F3AAY66.js.map → PRManager-H4TUZTZL.js.map} +0 -0
  128. /package/dist/{PromptTemplateManager-7L3HJQQU.js.map → PromptTemplateManager-OUYDHOPI.js.map} +0 -0
  129. /package/dist/{SettingsManager-YU4VYPTW.js.map → SettingsManager-VCVLL32H.js.map} +0 -0
  130. /package/dist/{SettingsMigrationManager-KZKDG66H.js.map → SettingsMigrationManager-LEBMJP3B.js.map} +0 -0
  131. /package/dist/{build-HQ5HGA3T.js.map → build-H4DK3DMQ.js.map} +0 -0
  132. /package/dist/{chunk-VYKKWU36.js.map → chunk-4KGRPHM6.js.map} +0 -0
  133. /package/dist/{chunk-CFQVOTHO.js.map → chunk-52MVUK5V.js.map} +0 -0
  134. /package/dist/{chunk-7LSSNB7Y.js.map → chunk-7ZEHSSUP.js.map} +0 -0
  135. /package/dist/{chunk-ELJKYFSH.js.map → chunk-BCQDYAOJ.js.map} +0 -0
  136. /package/dist/{chunk-F2PWIRV4.js.map → chunk-BYUMEDDD.js.map} +0 -0
  137. /package/dist/{chunk-CAXFWFV6.js.map → chunk-ECP77QGE.js.map} +0 -0
  138. /package/dist/{chunk-6YAMWLCP.js.map → chunk-EQOFNPEY.js.map} +0 -0
  139. /package/dist/{chunk-ZA575VLF.js.map → chunk-GDS2HXSW.js.map} +0 -0
  140. /package/dist/{chunk-UDRZY65Y.js.map → chunk-HSGZW3ID.js.map} +0 -0
  141. /package/dist/{chunk-WT4UGBE2.js.map → chunk-PBSHQVCT.js.map} +0 -0
  142. /package/dist/{chunk-64HCHVJM.js.map → chunk-PLI3JQWT.js.map} +0 -0
  143. /package/dist/{chunk-USJSNHGG.js.map → chunk-PVW6JE7E.js.map} +0 -0
  144. /package/dist/{chunk-3K3WY3BN.js.map → chunk-SC6X5EBG.js.map} +0 -0
  145. /package/dist/{chunk-NEPH2O4C.js.map → chunk-SSASIBDJ.js.map} +0 -0
  146. /package/dist/{chunk-ENMTWE74.js.map → chunk-VZYSM7N7.js.map} +0 -0
  147. /package/dist/{chunk-WZYBHD7P.js.map → chunk-XHNACIHO.js.map} +0 -0
  148. /package/dist/{chunk-XAMBIVXE.js.map → chunk-XJHQVOT6.js.map} +0 -0
  149. /package/dist/{cleanup-IO4KV2DL.js.map → cleanup-OGE7V7AD.js.map} +0 -0
  150. /package/dist/{commit-3ULFKXNB.js.map → commit-534QIRHY.js.map} +0 -0
  151. /package/dist/{compile-CT7IR7O2.js.map → compile-ZOAODFN2.js.map} +0 -0
  152. /package/dist/{contribute-GXKOIA42.js.map → contribute-7USRBWRM.js.map} +0 -0
  153. /package/dist/{dev-server-OAP3RZC6.js.map → dev-server-TYYJM3XA.js.map} +0 -0
  154. /package/dist/{feedback-ZLAX3BVL.js.map → feedback-HZVLOTQJ.js.map} +0 -0
  155. /package/dist/{git-ENLT2VNI.js.map → git-GUNOPP4Q.js.map} +0 -0
  156. /package/dist/{init-S6IEGRSX.js.map → init-MZBIXQ7V.js.map} +0 -0
  157. /package/dist/{lint-HAVU4U34.js.map → lint-MDVUV3W2.js.map} +0 -0
  158. /package/dist/{neon-helpers-3KBC4A3Y.js.map → neon-helpers-VVFFTLXE.js.map} +0 -0
  159. /package/dist/{open-IN3LUZXX.js.map → open-2LPZ7XXW.js.map} +0 -0
  160. /package/dist/{projects-CTRTTMSK.js.map → projects-325GEEGJ.js.map} +0 -0
  161. /package/dist/{prompt-3SAZYRUN.js.map → prompt-ONNPSNKM.js.map} +0 -0
  162. /package/dist/{rebase-RLEVFHWN.js.map → rebase-7YS3N274.js.map} +0 -0
  163. /package/dist/{recap-ZKGHZCX6.js.map → recap-GSXFEOD6.js.map} +0 -0
  164. /package/dist/{run-QEIS2EH2.js.map → run-XPGCMFFO.js.map} +0 -0
  165. /package/dist/{shell-2NNSIU34.js.map → shell-2SPM3Z5O.js.map} +0 -0
  166. /package/dist/{summary-MPOOQIOX.js.map → summary-C5VVSJAJ.js.map} +0 -0
  167. /package/dist/{test-75WAA6DU.js.map → test-N2725YRI.js.map} +0 -0
  168. /package/dist/{test-git-E2BLXR6M.js.map → test-git-ZPSPA2TP.js.map} +0 -0
  169. /package/dist/{test-prefix-A7JGGYAA.js.map → test-prefix-6DLB2BHE.js.map} +0 -0
  170. /package/dist/{test-webserver-J6SMNLU2.js.map → test-webserver-XLJ2TZFP.js.map} +0 -0
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createNeonProviderFromSettings
4
- } from "./chunk-7LSSNB7Y.js";
5
- import "./chunk-ZX3GTM7O.js";
4
+ } from "./chunk-7ZEHSSUP.js";
5
+ import "./chunk-7JDMYTFZ.js";
6
6
  import "./chunk-6MLEBAYZ.js";
7
7
  import "./chunk-VT4PDUYT.js";
8
8
  export {
9
9
  createNeonProviderFromSettings
10
10
  };
11
- //# sourceMappingURL=neon-helpers-3KBC4A3Y.js.map
11
+ //# sourceMappingURL=neon-helpers-VVFFTLXE.js.map
@@ -1,21 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DevServerManager
4
- } from "./chunk-ENMTWE74.js";
5
- import "./chunk-WZYBHD7P.js";
4
+ } from "./chunk-VZYSM7N7.js";
5
+ import "./chunk-XHNACIHO.js";
6
6
  import {
7
7
  getWorkspacePort
8
- } from "./chunk-CFQVOTHO.js";
8
+ } from "./chunk-52MVUK5V.js";
9
9
  import {
10
10
  IdentifierParser
11
- } from "./chunk-5V74K5ZA.js";
11
+ } from "./chunk-TVH67KEO.js";
12
12
  import {
13
13
  ProjectCapabilityDetector
14
14
  } from "./chunk-7GLZVDPQ.js";
15
15
  import "./chunk-RD7I2Q2F.js";
16
16
  import {
17
17
  GitWorktreeManager
18
- } from "./chunk-UDRZY65Y.js";
18
+ } from "./chunk-HSGZW3ID.js";
19
19
  import "./chunk-XPKN3QWY.js";
20
20
  import {
21
21
  openBrowser
@@ -25,11 +25,11 @@ import {
25
25
  } from "./chunk-GYCR2LOU.js";
26
26
  import {
27
27
  extractIssueNumber
28
- } from "./chunk-ZA575VLF.js";
28
+ } from "./chunk-GDS2HXSW.js";
29
29
  import {
30
30
  SettingsManager
31
- } from "./chunk-WFQ5CLTR.js";
32
- import "./chunk-VWGKGNJP.js";
31
+ } from "./chunk-IWIIOFEB.js";
32
+ import "./chunk-KBEIQP4G.js";
33
33
  import "./chunk-6MLEBAYZ.js";
34
34
  import {
35
35
  logger
@@ -238,4 +238,4 @@ Make sure the project is built (run 'il start' first)`
238
238
  export {
239
239
  OpenCommand
240
240
  };
241
- //# sourceMappingURL=open-IN3LUZXX.js.map
241
+ //# sourceMappingURL=open-2LPZ7XXW.js.map
@@ -0,0 +1,371 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ launchFirstRunSetup,
4
+ needsFirstRunSetup
5
+ } from "./chunk-A4UQY3M2.js";
6
+ import {
7
+ IssueTrackerFactory
8
+ } from "./chunk-SC6X5EBG.js";
9
+ import {
10
+ matchIssueIdentifier
11
+ } from "./chunk-TVH67KEO.js";
12
+ import "./chunk-RODL2HVY.js";
13
+ import "./chunk-Q7POFB5Q.js";
14
+ import "./chunk-BYUMEDDD.js";
15
+ import {
16
+ generateIssueManagementMcpConfig
17
+ } from "./chunk-XJHQVOT6.js";
18
+ import "./chunk-4BSXZ5YZ.js";
19
+ import "./chunk-HSGZW3ID.js";
20
+ import {
21
+ IssueManagementProviderFactory
22
+ } from "./chunk-UDZCTLD6.js";
23
+ import "./chunk-RNBIISBZ.js";
24
+ import "./chunk-FXDYIV3K.js";
25
+ import {
26
+ PromptTemplateManager
27
+ } from "./chunk-66QOCD5N.js";
28
+ import "./chunk-GDS2HXSW.js";
29
+ import {
30
+ PlanCommandSettingsSchema,
31
+ SettingsManager
32
+ } from "./chunk-IWIIOFEB.js";
33
+ import "./chunk-KBEIQP4G.js";
34
+ import "./chunk-PVW6JE7E.js";
35
+ import "./chunk-THS5L54H.js";
36
+ import {
37
+ isInteractiveEnvironment,
38
+ promptConfirmation
39
+ } from "./chunk-7JDMYTFZ.js";
40
+ import {
41
+ detectClaudeCli,
42
+ launchClaude
43
+ } from "./chunk-IGKPPACU.js";
44
+ import "./chunk-6MLEBAYZ.js";
45
+ import {
46
+ logger
47
+ } from "./chunk-VT4PDUYT.js";
48
+
49
+ // src/commands/plan.ts
50
+ import chalk from "chalk";
51
+ var PLANNER_PROVIDERS = ["claude", "gemini", "codex"];
52
+ var REVIEWER_PROVIDERS = ["claude", "gemini", "codex", "none"];
53
+ function formatChildIssues(children, issuePrefix) {
54
+ if (children.length === 0) return "None";
55
+ return children.map((child) => `- ${issuePrefix}${child.id}: ${child.title} (${child.state})`).join("\n");
56
+ }
57
+ function formatDependencies(dependencies, issuePrefix) {
58
+ const lines = [];
59
+ if (dependencies.blockedBy.length > 0) {
60
+ lines.push("**Blocked by:**");
61
+ for (const dep of dependencies.blockedBy) {
62
+ lines.push(`- ${issuePrefix}${dep.id}: ${dep.title} (${dep.state})`);
63
+ }
64
+ }
65
+ if (dependencies.blocking.length > 0) {
66
+ if (lines.length > 0) lines.push("");
67
+ lines.push("**Blocking:**");
68
+ for (const dep of dependencies.blocking) {
69
+ lines.push(`- ${issuePrefix}${dep.id}: ${dep.title} (${dep.state})`);
70
+ }
71
+ }
72
+ return lines.length > 0 ? lines.join("\n") : "None";
73
+ }
74
+ var PlanCommand = class {
75
+ constructor(templateManager) {
76
+ this.templateManager = templateManager ?? new PromptTemplateManager();
77
+ }
78
+ /**
79
+ * Main entry point for the plan command
80
+ * @param prompt - Optional initial planning prompt or topic
81
+ * @param model - Optional model to use (defaults to 'opus')
82
+ * @param yolo - Optional flag to enable autonomous mode (skip permission prompts)
83
+ * @param planner - Optional planner provider (defaults to 'claude')
84
+ * @param reviewer - Optional reviewer provider (defaults to 'none')
85
+ */
86
+ async execute(prompt, model, yolo, planner, reviewer) {
87
+ let normalizedPlanner;
88
+ if (planner) {
89
+ const normalized = planner.toLowerCase();
90
+ const result = PlanCommandSettingsSchema.shape.planner.safeParse(normalized);
91
+ if (!result.success) {
92
+ throw new Error(`Invalid planner: "${planner}". Allowed values: ${PLANNER_PROVIDERS.join(", ")}`);
93
+ }
94
+ normalizedPlanner = normalized;
95
+ }
96
+ let normalizedReviewer;
97
+ if (reviewer) {
98
+ const normalized = reviewer.toLowerCase();
99
+ const result = PlanCommandSettingsSchema.shape.reviewer.safeParse(normalized);
100
+ if (!result.success) {
101
+ throw new Error(`Invalid reviewer: "${reviewer}". Allowed values: ${REVIEWER_PROVIDERS.join(", ")}`);
102
+ }
103
+ normalizedReviewer = normalized;
104
+ }
105
+ logger.debug("PlanCommand.execute() starting", {
106
+ cwd: process.cwd(),
107
+ hasPrompt: !!prompt,
108
+ yolo,
109
+ planner: normalizedPlanner ?? planner,
110
+ reviewer: normalizedReviewer ?? reviewer
111
+ });
112
+ if (process.env.FORCE_FIRST_TIME_SETUP === "true" || await needsFirstRunSetup()) {
113
+ await launchFirstRunSetup();
114
+ }
115
+ logger.info(chalk.bold("Starting interactive planning session..."));
116
+ logger.debug("Checking Claude CLI availability");
117
+ const claudeAvailable = await detectClaudeCli();
118
+ logger.debug("Claude CLI availability check result", { claudeAvailable });
119
+ if (!claudeAvailable) {
120
+ logger.error(
121
+ "Claude Code not detected. Please install it: npm install -g @anthropic-ai/claude-code"
122
+ );
123
+ throw new Error("Claude Code CLI is required for planning sessions");
124
+ }
125
+ const settingsManager = new SettingsManager();
126
+ const settings = await settingsManager.loadSettings();
127
+ const identifierMatch = prompt ? matchIssueIdentifier(prompt) : { isIssueIdentifier: false };
128
+ const looksLikeIssueIdentifier = identifierMatch.isIssueIdentifier;
129
+ let decompositionContext = null;
130
+ const provider = settings ? IssueTrackerFactory.getProviderName(settings) : "github";
131
+ const issuePrefix = provider === "github" ? "#" : "";
132
+ if (prompt && looksLikeIssueIdentifier) {
133
+ const issueTracker = IssueTrackerFactory.create(settings);
134
+ logger.debug("Detected potential issue identifier, validating via issueTracker", { identifier: prompt });
135
+ const detection = await issueTracker.detectInputType(prompt);
136
+ if (detection.type === "issue" && detection.identifier) {
137
+ const issue = await issueTracker.fetchIssue(detection.identifier);
138
+ decompositionContext = {
139
+ identifier: String(issue.number),
140
+ title: issue.title,
141
+ body: issue.body
142
+ };
143
+ logger.info(chalk.dim(`Preparing to create a detailed plan for issue #${decompositionContext.identifier}: ${decompositionContext.title}`));
144
+ try {
145
+ const mcpProvider = IssueManagementProviderFactory.create(provider);
146
+ logger.debug("Fetching child issues for decomposition context", { identifier: decompositionContext.identifier });
147
+ const children = await mcpProvider.getChildIssues({ number: decompositionContext.identifier });
148
+ if (children.length > 0) {
149
+ decompositionContext.children = children;
150
+ logger.debug("Found existing child issues", { count: children.length });
151
+ }
152
+ logger.debug("Fetching dependencies for decomposition context", { identifier: decompositionContext.identifier });
153
+ const dependencies = await mcpProvider.getDependencies({
154
+ number: decompositionContext.identifier,
155
+ direction: "both"
156
+ });
157
+ if (dependencies.blocking.length > 0 || dependencies.blockedBy.length > 0) {
158
+ decompositionContext.dependencies = dependencies;
159
+ logger.debug("Found existing dependencies", {
160
+ blocking: dependencies.blocking.length,
161
+ blockedBy: dependencies.blockedBy.length
162
+ });
163
+ }
164
+ } catch (error) {
165
+ logger.debug("Failed to fetch children/dependencies, continuing without them", {
166
+ error: error instanceof Error ? error.message : "Unknown error"
167
+ });
168
+ }
169
+ } else {
170
+ logger.debug("Input matched issue pattern but issue not found, treating as planning topic", {
171
+ identifier: prompt,
172
+ detectionType: detection.type
173
+ });
174
+ }
175
+ }
176
+ const effectiveModel = model ?? settingsManager.getPlanModel(settings ?? void 0);
177
+ const effectivePlanner = normalizedPlanner ?? settingsManager.getPlanPlanner(settings ?? void 0);
178
+ const effectiveReviewer = normalizedReviewer ?? settingsManager.getPlanReviewer(settings ?? void 0);
179
+ logger.debug("Detected issue provider, model, planner, and reviewer", {
180
+ provider,
181
+ effectiveModel,
182
+ effectivePlanner,
183
+ effectiveReviewer
184
+ });
185
+ logger.debug("Generating MCP config for issue management");
186
+ let mcpConfig;
187
+ try {
188
+ mcpConfig = await generateIssueManagementMcpConfig(void 0, void 0, provider, settings ?? void 0);
189
+ } catch (error) {
190
+ const message = error instanceof Error ? error.message : "Unknown error";
191
+ if (isInteractiveEnvironment()) {
192
+ const shouldRunInit = await promptConfirmation(
193
+ "No git repository or remote found. Would you like to run 'il init' to set up?",
194
+ true
195
+ );
196
+ if (shouldRunInit) {
197
+ logger.info(chalk.bold("Launching iloom init..."));
198
+ const { InitCommand } = await import("./init-MZBIXQ7V.js");
199
+ const initCommand = new InitCommand();
200
+ await initCommand.execute(
201
+ "Help the user set up a GitHub repository or Linear project for this project so they can use issue management features. When complete tell the user they can exit to continue the planning session."
202
+ );
203
+ logger.info(chalk.bold("Retrying planning session setup..."));
204
+ try {
205
+ mcpConfig = await generateIssueManagementMcpConfig(void 0, void 0, provider, settings ?? void 0);
206
+ } catch (retryError) {
207
+ const retryMessage = retryError instanceof Error ? retryError.message : "Unknown error";
208
+ logger.error(`Failed to generate MCP config: ${retryMessage}`);
209
+ if (provider === "github") {
210
+ logger.error(
211
+ "GitHub issue management requires a git repository with a GitHub remote configured."
212
+ );
213
+ throw new Error(
214
+ `Cannot start planning session after init: ${retryMessage}. Ensure you are in a git repository with a GitHub remote configured.`
215
+ );
216
+ } else {
217
+ logger.error(
218
+ "Linear issue management requires LINEAR_API_TOKEN to be configured."
219
+ );
220
+ throw new Error(
221
+ `Cannot start planning session after init: ${retryMessage}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`
222
+ );
223
+ }
224
+ }
225
+ } else {
226
+ logger.error(`Failed to generate MCP config: ${message}`);
227
+ if (provider === "github") {
228
+ logger.error(
229
+ "GitHub issue management requires a git repository with a GitHub remote configured."
230
+ );
231
+ throw new Error(
232
+ `Cannot start planning session: ${message}. Ensure you are in a git repository with a GitHub remote configured.`
233
+ );
234
+ } else {
235
+ logger.error(
236
+ "Linear issue management requires LINEAR_API_TOKEN to be configured."
237
+ );
238
+ throw new Error(
239
+ `Cannot start planning session: ${message}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`
240
+ );
241
+ }
242
+ }
243
+ } else {
244
+ logger.error(`Failed to generate MCP config: ${message}`);
245
+ if (provider === "github") {
246
+ logger.error(
247
+ "GitHub issue management requires a git repository with a GitHub remote configured."
248
+ );
249
+ throw new Error(
250
+ `Cannot start planning session: ${message}. Ensure you are in a git repository with a GitHub remote configured.`
251
+ );
252
+ } else {
253
+ logger.error(
254
+ "Linear issue management requires LINEAR_API_TOKEN to be configured."
255
+ );
256
+ throw new Error(
257
+ `Cannot start planning session: ${message}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`
258
+ );
259
+ }
260
+ }
261
+ }
262
+ logger.debug("MCP config generated", {
263
+ serverCount: mcpConfig.length
264
+ });
265
+ const isVscodeMode = process.env.ILOOM_VSCODE === "1";
266
+ logger.debug("VS Code mode detection", { isVscodeMode });
267
+ const providerFlags = PLANNER_PROVIDERS.reduce((acc, p) => ({
268
+ ...acc,
269
+ [`USE_${p.toUpperCase()}_PLANNER`]: effectivePlanner === p
270
+ }), {});
271
+ ["claude", "gemini", "codex"].forEach((p) => {
272
+ providerFlags[`USE_${p.toUpperCase()}_REVIEWER`] = effectiveReviewer === p;
273
+ });
274
+ logger.debug("Loading plan prompt template");
275
+ const templateVariables = {
276
+ IS_VSCODE_MODE: isVscodeMode,
277
+ EXISTING_ISSUE_MODE: !!decompositionContext,
278
+ FRESH_PLANNING_MODE: !decompositionContext,
279
+ PARENT_ISSUE_NUMBER: decompositionContext == null ? void 0 : decompositionContext.identifier,
280
+ PARENT_ISSUE_TITLE: decompositionContext == null ? void 0 : decompositionContext.title,
281
+ PARENT_ISSUE_BODY: decompositionContext == null ? void 0 : decompositionContext.body,
282
+ PARENT_ISSUE_CHILDREN: (decompositionContext == null ? void 0 : decompositionContext.children) ? formatChildIssues(decompositionContext.children, issuePrefix) : void 0,
283
+ PARENT_ISSUE_DEPENDENCIES: (decompositionContext == null ? void 0 : decompositionContext.dependencies) ? formatDependencies(decompositionContext.dependencies, issuePrefix) : void 0,
284
+ PLANNER: effectivePlanner,
285
+ REVIEWER: effectiveReviewer,
286
+ HAS_REVIEWER: effectiveReviewer !== "none",
287
+ ...providerFlags
288
+ };
289
+ const architectPrompt = await this.templateManager.getPrompt("plan", templateVariables);
290
+ logger.debug("Plan prompt loaded", {
291
+ promptLength: architectPrompt.length,
292
+ mode: decompositionContext ? "decomposition" : "fresh"
293
+ });
294
+ const allowedTools = [
295
+ // Issue management tools
296
+ "mcp__issue_management__create_issue",
297
+ "mcp__issue_management__create_child_issue",
298
+ "mcp__issue_management__get_issue",
299
+ "mcp__issue_management__get_child_issues",
300
+ "mcp__issue_management__get_comment",
301
+ "mcp__issue_management__create_comment",
302
+ // Dependency management tools
303
+ "mcp__issue_management__create_dependency",
304
+ "mcp__issue_management__get_dependencies",
305
+ "mcp__issue_management__remove_dependency",
306
+ // Codebase exploration tools (read-only)
307
+ "Read",
308
+ "Glob",
309
+ "Grep",
310
+ "Task",
311
+ // Web research tools
312
+ "WebFetch",
313
+ "WebSearch",
314
+ // Git commands for understanding repo state
315
+ "Bash(git status:*)",
316
+ "Bash(git log:*)",
317
+ "Bash(git branch:*)",
318
+ "Bash(git remote:*)",
319
+ "Bash(git diff:*)",
320
+ "Bash(git show:*)"
321
+ ];
322
+ const claudeOptions = {
323
+ model: effectiveModel,
324
+ headless: false,
325
+ appendSystemPrompt: architectPrompt,
326
+ mcpConfig,
327
+ addDir: process.cwd(),
328
+ allowedTools
329
+ };
330
+ if (yolo) {
331
+ if (!prompt) {
332
+ throw new Error('--yolo requires a prompt or issue identifier (e.g., il plan --yolo "add gitlab support" or il plan --yolo 42)');
333
+ }
334
+ logger.warn(
335
+ "\u26A0\uFE0F YOLO mode enabled - Claude will skip permission prompts and proceed autonomously. This could destroy important data or make irreversible changes. Proceeding means you accept this risk."
336
+ );
337
+ }
338
+ logger.debug("Launching Claude with options", {
339
+ optionKeys: Object.keys(claudeOptions),
340
+ headless: claudeOptions.headless,
341
+ hasSystemPrompt: !!claudeOptions.appendSystemPrompt,
342
+ addDir: claudeOptions.addDir,
343
+ yolo
344
+ });
345
+ let initialMessage;
346
+ if (decompositionContext) {
347
+ initialMessage = `Break down issue #${decompositionContext.identifier} into child issues.`;
348
+ } else if (prompt) {
349
+ initialMessage = prompt;
350
+ } else {
351
+ initialMessage = "Help me plan a feature or decompose work into issues.";
352
+ }
353
+ if (yolo) {
354
+ initialMessage = `[AUTONOMOUS MODE]
355
+ Proceed through the flow without requiring user interaction. Make and document your assumptions and proceed to create the epic and child issues and dependencies if necessary. This guidance supersedes all previous guidance.
356
+
357
+ [TOPIC]
358
+ ${initialMessage}`;
359
+ }
360
+ await launchClaude(initialMessage, {
361
+ ...claudeOptions,
362
+ ...yolo && { permissionMode: "bypassPermissions" }
363
+ });
364
+ logger.debug("Claude session completed");
365
+ logger.info(chalk.green("Planning session ended."));
366
+ }
367
+ };
368
+ export {
369
+ PlanCommand
370
+ };
371
+ //# sourceMappingURL=plan-PIME6UNY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/plan.ts"],"sourcesContent":["import { logger } from '../utils/logger.js'\nimport chalk from 'chalk'\nimport { detectClaudeCli, launchClaude } from '../utils/claude.js'\nimport { PromptTemplateManager, type TemplateVariables } from '../lib/PromptTemplateManager.js'\nimport { generateIssueManagementMcpConfig } from '../utils/mcp.js'\nimport { SettingsManager, PlanCommandSettingsSchema } from '../lib/SettingsManager.js'\nimport { IssueTrackerFactory } from '../lib/IssueTrackerFactory.js'\nimport { matchIssueIdentifier } from '../utils/IdentifierParser.js'\nimport { IssueManagementProviderFactory } from '../mcp/IssueManagementProviderFactory.js'\nimport { needsFirstRunSetup, launchFirstRunSetup } from '../utils/first-run-setup.js'\nimport type { IssueProvider, ChildIssueResult, DependenciesResult } from '../mcp/types.js'\nimport { promptConfirmation, isInteractiveEnvironment } from '../utils/prompt.js'\n\n// Define provider arrays for validation and dynamic flag generation\nconst PLANNER_PROVIDERS = ['claude', 'gemini', 'codex'] as const\nconst REVIEWER_PROVIDERS = ['claude', 'gemini', 'codex', 'none'] as const\n\ntype PlannerProvider = (typeof PLANNER_PROVIDERS)[number]\ntype ReviewerProvider = (typeof REVIEWER_PROVIDERS)[number]\n\n/**\n * Format child issues as a markdown list for inclusion in the prompt\n */\nfunction formatChildIssues(children: ChildIssueResult[], issuePrefix: string): string {\n\tif (children.length === 0) return 'None'\n\treturn children\n\t\t.map(child => `- ${issuePrefix}${child.id}: ${child.title} (${child.state})`)\n\t\t.join('\\n')\n}\n\n/**\n * Format dependencies as a markdown list for inclusion in the prompt\n */\nfunction formatDependencies(dependencies: DependenciesResult, issuePrefix: string): string {\n\tconst lines: string[] = []\n\n\tif (dependencies.blockedBy.length > 0) {\n\t\tlines.push('**Blocked by:**')\n\t\tfor (const dep of dependencies.blockedBy) {\n\t\t\tlines.push(`- ${issuePrefix}${dep.id}: ${dep.title} (${dep.state})`)\n\t\t}\n\t}\n\n\tif (dependencies.blocking.length > 0) {\n\t\tif (lines.length > 0) lines.push('')\n\t\tlines.push('**Blocking:**')\n\t\tfor (const dep of dependencies.blocking) {\n\t\t\tlines.push(`- ${issuePrefix}${dep.id}: ${dep.title} (${dep.state})`)\n\t\t}\n\t}\n\n\treturn lines.length > 0 ? lines.join('\\n') : 'None'\n}\n\n/**\n * Launch interactive planning session with Architect persona\n * Implements the `il plan` command requested in issue #471\n *\n * The Architect persona helps users:\n * - Break epics down into child issues following \"1 issue = 1 loom = 1 PR\" pattern\n * - Think through implementation approaches\n * - Create issues at the end of the planning session using MCP tools\n */\nexport class PlanCommand {\n\tprivate readonly templateManager: PromptTemplateManager\n\n\tconstructor(templateManager?: PromptTemplateManager) {\n\t\tthis.templateManager = templateManager ?? new PromptTemplateManager()\n\t}\n\n\t/**\n\t * Main entry point for the plan command\n\t * @param prompt - Optional initial planning prompt or topic\n\t * @param model - Optional model to use (defaults to 'opus')\n\t * @param yolo - Optional flag to enable autonomous mode (skip permission prompts)\n\t * @param planner - Optional planner provider (defaults to 'claude')\n\t * @param reviewer - Optional reviewer provider (defaults to 'none')\n\t */\n\tpublic async execute(prompt?: string, model?: string, yolo?: boolean, planner?: string, reviewer?: string): Promise<void> {\n\t\t// Validate and normalize planner CLI argument\n\t\tlet normalizedPlanner: PlannerProvider | undefined\n\t\tif (planner) {\n\t\t\tconst normalized = planner.toLowerCase()\n\t\t\tconst result = PlanCommandSettingsSchema.shape.planner.safeParse(normalized)\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new Error(`Invalid planner: \"${planner}\". Allowed values: ${PLANNER_PROVIDERS.join(', ')}`)\n\t\t\t}\n\t\t\tnormalizedPlanner = normalized as PlannerProvider\n\t\t}\n\n\t\t// Validate and normalize reviewer CLI argument\n\t\tlet normalizedReviewer: ReviewerProvider | undefined\n\t\tif (reviewer) {\n\t\t\tconst normalized = reviewer.toLowerCase()\n\t\t\tconst result = PlanCommandSettingsSchema.shape.reviewer.safeParse(normalized)\n\t\t\tif (!result.success) {\n\t\t\t\tthrow new Error(`Invalid reviewer: \"${reviewer}\". Allowed values: ${REVIEWER_PROVIDERS.join(', ')}`)\n\t\t\t}\n\t\t\tnormalizedReviewer = normalized as ReviewerProvider\n\t\t}\n\n\t\tlogger.debug('PlanCommand.execute() starting', {\n\t\t\tcwd: process.cwd(),\n\t\t\thasPrompt: !!prompt,\n\t\t\tyolo,\n\t\t\tplanner: normalizedPlanner ?? planner,\n\t\t\treviewer: normalizedReviewer ?? reviewer,\n\t\t})\n\n\t\t// Check for first-run setup (same check as StartCommand)\n\t\tif (process.env.FORCE_FIRST_TIME_SETUP === \"true\" || await needsFirstRunSetup()) {\n\t\t\tawait launchFirstRunSetup()\n\t\t}\n\n\t\tlogger.info(chalk.bold('Starting interactive planning session...'))\n\n\t\t// Check if Claude CLI is available\n\t\tlogger.debug('Checking Claude CLI availability')\n\t\tconst claudeAvailable = await detectClaudeCli()\n\t\tlogger.debug('Claude CLI availability check result', { claudeAvailable })\n\n\t\tif (!claudeAvailable) {\n\t\t\tlogger.error(\n\t\t\t\t\"Claude Code not detected. Please install it: npm install -g @anthropic-ai/claude-code\"\n\t\t\t)\n\t\t\tthrow new Error('Claude Code CLI is required for planning sessions')\n\t\t}\n\n\t\t// Load settings to detect configured issue provider and model\n\t\tconst settingsManager = new SettingsManager()\n\t\tconst settings = await settingsManager.loadSettings()\n\n\t\t// Detect if prompt is an issue number for decomposition mode\n\t\t// Uses shared matchIssueIdentifier() utility to identify issue identifiers:\n\t\t// - Numeric pattern: #123 or 123 (GitHub format)\n\t\t// - Linear pattern: ENG-123 (requires at least 2 letters before dash)\n\t\tconst identifierMatch = prompt ? matchIssueIdentifier(prompt) : { isIssueIdentifier: false }\n\t\tconst looksLikeIssueIdentifier = identifierMatch.isIssueIdentifier\n\t\tlet decompositionContext: {\n\t\t\tidentifier: string\n\t\t\ttitle: string\n\t\t\tbody: string\n\t\t\tchildren?: ChildIssueResult[]\n\t\t\tdependencies?: DependenciesResult\n\t\t} | null = null\n\n\t\tconst provider = settings ? IssueTrackerFactory.getProviderName(settings) : 'github'\n\t\tconst issuePrefix = provider === 'github' ? '#' : ''\n\n\t\tif (prompt && looksLikeIssueIdentifier) {\n\t\t\t// Validate and fetch issue using issueTracker.detectInputType() pattern from StartCommand\n\t\t\tconst issueTracker = IssueTrackerFactory.create(settings)\n\n\t\t\tlogger.debug('Detected potential issue identifier, validating via issueTracker', { identifier: prompt })\n\n\t\t\t// Use detectInputType to validate the identifier exists (same pattern as StartCommand)\n\t\t\tconst detection = await issueTracker.detectInputType(prompt)\n\n\t\t\tif (detection.type === 'issue' && detection.identifier) {\n\t\t\t\t// Valid issue found - fetch full details for decomposition context\n\t\t\t\tconst issue = await issueTracker.fetchIssue(detection.identifier)\n\t\t\t\tdecompositionContext = {\n\t\t\t\t\tidentifier: String(issue.number),\n\t\t\t\t\ttitle: issue.title,\n\t\t\t\t\tbody: issue.body\n\t\t\t\t}\n\t\t\t\tlogger.info(chalk.dim(`Preparing to create a detailed plan for issue #${decompositionContext.identifier}: ${decompositionContext.title}`))\n\n\t\t\t\t// Fetch existing children and dependencies using MCP provider\n\t\t\t\t// This allows users to resume planning where they left off\n\t\t\t\ttry {\n\t\t\t\t\tconst mcpProvider = IssueManagementProviderFactory.create(provider as IssueProvider)\n\n\t\t\t\t\t// Fetch child issues\n\t\t\t\t\tlogger.debug('Fetching child issues for decomposition context', { identifier: decompositionContext.identifier })\n\t\t\t\t\tconst children = await mcpProvider.getChildIssues({ number: decompositionContext.identifier })\n\t\t\t\t\tif (children.length > 0) {\n\t\t\t\t\t\tdecompositionContext.children = children\n\t\t\t\t\t\tlogger.debug('Found existing child issues', { count: children.length })\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fetch dependencies (both directions)\n\t\t\t\t\tlogger.debug('Fetching dependencies for decomposition context', { identifier: decompositionContext.identifier })\n\t\t\t\t\tconst dependencies = await mcpProvider.getDependencies({\n\t\t\t\t\t\tnumber: decompositionContext.identifier,\n\t\t\t\t\t\tdirection: 'both'\n\t\t\t\t\t})\n\t\t\t\t\tif (dependencies.blocking.length > 0 || dependencies.blockedBy.length > 0) {\n\t\t\t\t\t\tdecompositionContext.dependencies = dependencies\n\t\t\t\t\t\tlogger.debug('Found existing dependencies', {\n\t\t\t\t\t\t\tblocking: dependencies.blocking.length,\n\t\t\t\t\t\t\tblockedBy: dependencies.blockedBy.length\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Log but don't fail - children/dependencies are optional context\n\t\t\t\t\tlogger.debug('Failed to fetch children/dependencies, continuing without them', {\n\t\t\t\t\t\terror: error instanceof Error ? error.message : 'Unknown error'\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Input matched issue pattern but issue not found - treat as regular prompt\n\t\t\t\tlogger.debug('Input matched issue pattern but issue not found, treating as planning topic', {\n\t\t\t\t\tidentifier: prompt,\n\t\t\t\t\tdetectionType: detection.type\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Use CLI model if provided, otherwise use settings (plan.model), defaults to opus\n\t\tconst effectiveModel = model ?? settingsManager.getPlanModel(settings ?? undefined)\n\n\t\t// Get effective planner/reviewer (CLI > settings > default)\n\t\tconst effectivePlanner = normalizedPlanner ?? settingsManager.getPlanPlanner(settings ?? undefined)\n\t\tconst effectiveReviewer = normalizedReviewer ?? settingsManager.getPlanReviewer(settings ?? undefined)\n\n\t\tlogger.debug('Detected issue provider, model, planner, and reviewer', {\n\t\t\tprovider,\n\t\t\teffectiveModel,\n\t\t\teffectivePlanner,\n\t\t\teffectiveReviewer,\n\t\t})\n\n\t\t// Generate MCP config for issue management tools\n\t\t// This will throw if no git remote is configured - offer to run 'il init' as fallback\n\t\tlogger.debug('Generating MCP config for issue management')\n\t\tlet mcpConfig: Record<string, unknown>[]\n\t\ttry {\n\t\t\tmcpConfig = await generateIssueManagementMcpConfig(undefined, undefined, provider, settings ?? undefined)\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : 'Unknown error'\n\n\t\t\t// Check if running in interactive mode - offer to run init\n\t\t\tif (isInteractiveEnvironment()) {\n\t\t\t\tconst shouldRunInit = await promptConfirmation(\n\t\t\t\t\t\"No git repository or remote found. Would you like to run 'il init' to set up?\",\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t\tif (shouldRunInit) {\n\t\t\t\t\t// Dynamically import and run InitCommand\n\t\t\t\t\tlogger.info(chalk.bold('Launching iloom init...'))\n\t\t\t\t\tconst { InitCommand } = await import('./init.js')\n\t\t\t\t\tconst initCommand = new InitCommand()\n\t\t\t\t\tawait initCommand.execute(\n\t\t\t\t\t\t'Help the user set up a GitHub repository or Linear project for this project so they can use issue management features. When complete tell the user they can exit to continue the planning session.'\n\t\t\t\t\t)\n\n\t\t\t\t\t// Retry MCP config generation after init\n\t\t\t\t\tlogger.info(chalk.bold('Retrying planning session setup...'))\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmcpConfig = await generateIssueManagementMcpConfig(undefined, undefined, provider, settings ?? undefined)\n\t\t\t\t\t} catch (retryError) {\n\t\t\t\t\t\tconst retryMessage = retryError instanceof Error ? retryError.message : 'Unknown error'\n\t\t\t\t\t\tlogger.error(`Failed to generate MCP config: ${retryMessage}`)\n\t\t\t\t\t\tif (provider === 'github') {\n\t\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\t'GitHub issue management requires a git repository with a GitHub remote configured.'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Cannot start planning session after init: ${retryMessage}. Ensure you are in a git repository with a GitHub remote configured.`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\t'Linear issue management requires LINEAR_API_TOKEN to be configured.'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Cannot start planning session after init: ${retryMessage}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// User declined init prompt - show provider-specific error messages\n\t\t\t\t\tlogger.error(`Failed to generate MCP config: ${message}`)\n\t\t\t\t\tif (provider === 'github') {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t'GitHub issue management requires a git repository with a GitHub remote configured.'\n\t\t\t\t\t\t)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Cannot start planning session: ${message}. Ensure you are in a git repository with a GitHub remote configured.`\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t'Linear issue management requires LINEAR_API_TOKEN to be configured.'\n\t\t\t\t\t\t)\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Cannot start planning session: ${message}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Non-interactive mode - show provider-specific error messages\n\t\t\t\tlogger.error(`Failed to generate MCP config: ${message}`)\n\t\t\t\tif (provider === 'github') {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t'GitHub issue management requires a git repository with a GitHub remote configured.'\n\t\t\t\t\t)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot start planning session: ${message}. Ensure you are in a git repository with a GitHub remote configured.`\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t'Linear issue management requires LINEAR_API_TOKEN to be configured.'\n\t\t\t\t\t)\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Cannot start planning session: ${message}. Ensure LINEAR_API_TOKEN is configured in settings or environment.`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlogger.debug('MCP config generated', {\n\t\t\tserverCount: mcpConfig.length,\n\t\t})\n\n\t\t// Detect VS Code mode\n\t\tconst isVscodeMode = process.env.ILOOM_VSCODE === '1'\n\t\tlogger.debug('VS Code mode detection', { isVscodeMode })\n\n\t\t// Compute template variables for multi-AI provider support\n\t\t// Generate USE_*_PLANNER and USE_*_REVIEWER flags dynamically\n\t\tconst providerFlags = PLANNER_PROVIDERS.reduce((acc, p) => ({\n\t\t\t...acc,\n\t\t\t[`USE_${p.toUpperCase()}_PLANNER`]: effectivePlanner === p,\n\t\t}), {} as Record<string, boolean>)\n\n\t\t// Add reviewer flags (excluding 'none')\n\t\t;(['claude', 'gemini', 'codex'] as const).forEach(p => {\n\t\t\tproviderFlags[`USE_${p.toUpperCase()}_REVIEWER`] = effectiveReviewer === p\n\t\t})\n\n\t\t// Load plan prompt template with mode-specific variables\n\t\tlogger.debug('Loading plan prompt template')\n\t\tconst templateVariables: TemplateVariables = {\n\t\t\tIS_VSCODE_MODE: isVscodeMode,\n\t\t\tEXISTING_ISSUE_MODE: !!decompositionContext,\n\t\t\tFRESH_PLANNING_MODE: !decompositionContext,\n\t\t\tPARENT_ISSUE_NUMBER: decompositionContext?.identifier,\n\t\t\tPARENT_ISSUE_TITLE: decompositionContext?.title,\n\t\t\tPARENT_ISSUE_BODY: decompositionContext?.body,\n\t\t\tPARENT_ISSUE_CHILDREN: decompositionContext?.children\n\t\t\t\t? formatChildIssues(decompositionContext.children, issuePrefix)\n\t\t\t\t: undefined,\n\t\t\tPARENT_ISSUE_DEPENDENCIES: decompositionContext?.dependencies\n\t\t\t\t? formatDependencies(decompositionContext.dependencies, issuePrefix)\n\t\t\t\t: undefined,\n\t\t\tPLANNER: effectivePlanner,\n\t\t\tREVIEWER: effectiveReviewer,\n\t\t\tHAS_REVIEWER: effectiveReviewer !== 'none',\n\t\t\t...providerFlags,\n\t\t}\n\t\tconst architectPrompt = await this.templateManager.getPrompt('plan', templateVariables)\n\t\tlogger.debug('Plan prompt loaded', {\n\t\t\tpromptLength: architectPrompt.length,\n\t\t\tmode: decompositionContext ? 'decomposition' : 'fresh',\n\t\t})\n\n\t\t// Define allowed tools for the Architect persona\n\t\tconst allowedTools = [\n\t\t\t// Issue management tools\n\t\t\t'mcp__issue_management__create_issue',\n\t\t\t'mcp__issue_management__create_child_issue',\n\t\t\t'mcp__issue_management__get_issue',\n\t\t\t'mcp__issue_management__get_child_issues',\n\t\t\t'mcp__issue_management__get_comment',\n\t\t\t'mcp__issue_management__create_comment',\n\t\t\t// Dependency management tools\n\t\t\t'mcp__issue_management__create_dependency',\n\t\t\t'mcp__issue_management__get_dependencies',\n\t\t\t'mcp__issue_management__remove_dependency',\n\t\t\t// Codebase exploration tools (read-only)\n\t\t\t'Read',\n\t\t\t'Glob',\n\t\t\t'Grep',\n\t\t\t'Task',\n\t\t\t// Web research tools\n\t\t\t'WebFetch',\n\t\t\t'WebSearch',\n\t\t\t// Git commands for understanding repo state\n\t\t\t'Bash(git status:*)',\n\t\t\t'Bash(git log:*)',\n\t\t\t'Bash(git branch:*)',\n\t\t\t'Bash(git remote:*)',\n\t\t\t'Bash(git diff:*)',\n\t\t\t'Bash(git show:*)',\n\t\t]\n\n\t\t// Build Claude options\n\t\tconst claudeOptions = {\n\t\t\tmodel: effectiveModel,\n\t\t\theadless: false,\n\t\t\tappendSystemPrompt: architectPrompt,\n\t\t\tmcpConfig,\n\t\t\taddDir: process.cwd(),\n\t\t\tallowedTools,\n\t\t}\n\n\t\t// Handle --yolo mode\n\t\tif (yolo) {\n\t\t\tif (!prompt) {\n\t\t\t\tthrow new Error('--yolo requires a prompt or issue identifier (e.g., il plan --yolo \"add gitlab support\" or il plan --yolo 42)')\n\t\t\t}\n\t\t\tlogger.warn(\n\t\t\t\t'⚠️ YOLO mode enabled - Claude will skip permission prompts and proceed autonomously. This could destroy important data or make irreversible changes. Proceeding means you accept this risk.'\n\t\t\t)\n\t\t}\n\n\t\tlogger.debug('Launching Claude with options', {\n\t\t\toptionKeys: Object.keys(claudeOptions),\n\t\t\theadless: claudeOptions.headless,\n\t\t\thasSystemPrompt: !!claudeOptions.appendSystemPrompt,\n\t\t\taddDir: claudeOptions.addDir,\n\t\t\tyolo,\n\t\t})\n\n\t\t// Launch Claude in interactive mode\n\t\t// Construct initial message based on mode\n\t\tlet initialMessage: string\n\t\tif (decompositionContext) {\n\t\t\t// Issue decomposition mode - provide context about what to decompose\n\t\t\tinitialMessage = `Break down issue #${decompositionContext.identifier} into child issues.`\n\t\t} else if (prompt) {\n\t\t\t// Fresh planning with user-provided topic\n\t\t\tinitialMessage = prompt\n\t\t} else {\n\t\t\t// Interactive mode - no topic provided\n\t\t\tinitialMessage = 'Help me plan a feature or decompose work into issues.'\n\t\t}\n\n\t\t// Apply yolo mode wrapper if enabled\n\t\tif (yolo) {\n\t\t\tinitialMessage = `[AUTONOMOUS MODE]\nProceed through the flow without requiring user interaction. Make and document your assumptions and proceed to create the epic and child issues and dependencies if necessary. This guidance supersedes all previous guidance.\n\n[TOPIC]\n${initialMessage}`\n\t\t}\n\n\t\tawait launchClaude(initialMessage, {\n\t\t\t...claudeOptions,\n\t\t\t...(yolo && { permissionMode: 'bypassPermissions' as const }),\n\t\t})\n\n\t\tlogger.debug('Claude session completed')\n\t\tlogger.info(chalk.green('Planning session ended.'))\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  import "./chunk-XPKN3QWY.js";
6
6
  import {
7
7
  MetadataManager
8
- } from "./chunk-VWGKGNJP.js";
8
+ } from "./chunk-KBEIQP4G.js";
9
9
  import {
10
10
  getLogger
11
11
  } from "./chunk-6MLEBAYZ.js";
@@ -100,4 +100,4 @@ var ProjectsCommand = class {
100
100
  export {
101
101
  ProjectsCommand
102
102
  };
103
- //# sourceMappingURL=projects-CTRTTMSK.js.map
103
+ //# sourceMappingURL=projects-325GEEGJ.js.map
@@ -5,7 +5,7 @@ import {
5
5
  promptConfirmation,
6
6
  promptInput,
7
7
  waitForKeypress
8
- } from "./chunk-ZX3GTM7O.js";
8
+ } from "./chunk-7JDMYTFZ.js";
9
9
  import "./chunk-VT4PDUYT.js";
10
10
  export {
11
11
  isInteractiveEnvironment,
@@ -14,4 +14,4 @@ export {
14
14
  promptInput,
15
15
  waitForKeypress
16
16
  };
17
- //# sourceMappingURL=prompt-3SAZYRUN.js.map
17
+ //# sourceMappingURL=prompt-ONNPSNKM.js.map
@@ -303,6 +303,24 @@ The following JSON Schema defines valid iloom settings:
303
303
  "haiku"
304
304
  ],
305
305
  "description": "Claude model shorthand: sonnet, opus, or haiku"
306
+ },
307
+ "enabled": {
308
+ "type": "boolean",
309
+ "description": "Whether this agent is enabled. Defaults to true."
310
+ },
311
+ "providers": {
312
+ "type": "object",
313
+ "additionalProperties": {
314
+ "type": "string"
315
+ },
316
+ "propertyNames": {
317
+ "enum": [
318
+ "claude",
319
+ "gemini",
320
+ "codex"
321
+ ]
322
+ },
323
+ "description": "Map of review providers to model names. Keys: claude, gemini, codex. Values: model name strings (e.g., \"sonnet\", \"gemini-3-pro-preview\", \"gpt-5.2-codex\")"
306
324
  }
307
325
  },
308
326
  "additionalProperties": false
@@ -314,7 +332,7 @@ The following JSON Schema defines valid iloom settings:
314
332
  "type": "null"
315
333
  }
316
334
  ],
317
- "description": "Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-issue-reviewer (reviews code changes against requirements)"
335
+ "description": "Per-agent configuration overrides. Available agents: iloom-issue-analyzer (analyzes issues), iloom-issue-planner (creates implementation plans), iloom-issue-analyze-and-plan (combined analysis and planning), iloom-issue-complexity-evaluator (evaluates complexity), iloom-issue-enhancer (enhances issue descriptions), iloom-issue-implementer (implements code changes), iloom-code-reviewer (reviews code changes against requirements)"
318
336
  },
319
337
  "spin": {
320
338
  "type": "object",
@@ -333,6 +351,44 @@ The following JSON Schema defines valid iloom settings:
333
351
  "additionalProperties": false,
334
352
  "description": "Spin orchestrator configuration. Model defaults to opus when not configured."
335
353
  },
354
+ "plan": {
355
+ "type": "object",
356
+ "properties": {
357
+ "model": {
358
+ "type": "string",
359
+ "enum": [
360
+ "sonnet",
361
+ "opus",
362
+ "haiku"
363
+ ],
364
+ "default": "opus",
365
+ "description": "Claude model shorthand for plan command"
366
+ },
367
+ "planner": {
368
+ "type": "string",
369
+ "enum": [
370
+ "claude",
371
+ "gemini",
372
+ "codex"
373
+ ],
374
+ "default": "claude",
375
+ "description": "AI provider for creating the plan"
376
+ },
377
+ "reviewer": {
378
+ "type": "string",
379
+ "enum": [
380
+ "claude",
381
+ "gemini",
382
+ "codex",
383
+ "none"
384
+ ],
385
+ "default": "none",
386
+ "description": "AI provider for reviewing the plan (none to skip review)"
387
+ }
388
+ },
389
+ "additionalProperties": false,
390
+ "description": "Plan command configuration. Model defaults to opus, planner to claude, reviewer to none when not configured."
391
+ },
336
392
  "summary": {
337
393
  "type": "object",
338
394
  "properties": {
@@ -1359,7 +1415,17 @@ When you're ready to finish, type `/exit` to close this session and return to yo
1359
1415
 
1360
1416
  If users ask about specific configurations, help them add these sections to their settings:
1361
1417
 
1362
- 1. **Agent Models Configuration:**
1418
+ **Available Models by Provider** (as of February 2026):
1419
+
1420
+ When configuring agents, use these model identifiers:
1421
+
1422
+ | Provider | Models | Notes |
1423
+ |----------|--------|-------|
1424
+ | `claude` | `sonnet`, `opus`, `haiku` | Default provider. Use the `model` field. |
1425
+ | `gemini` | `gemini-3-pro-preview` | Requires Gemini MCP server configured. Use the `providers` field. |
1426
+ | `codex` | `gpt-5.2-codex` | Requires Codex MCP server configured. Use the `providers` field. |
1427
+
1428
+ 1. **Agent Models Configuration (Claude):**
1363
1429
  ```json
1364
1430
  "agents": {
1365
1431
  "iloom-issue-analyzer": { "model": "opus" },
@@ -1400,7 +1466,21 @@ If users ask about specific configurations, help them add these sections to thei
1400
1466
  }
1401
1467
  ```
1402
1468
 
1403
- 6. **Custom Script Configuration (package.iloom.json):**
1469
+ 6. **Code Review with Multiple Providers:**
1470
+ ```json
1471
+ "agents": {
1472
+ "iloom-code-reviewer": {
1473
+ "providers": {
1474
+ "claude": "opus",
1475
+ "gemini": "gemini-3-pro-preview"
1476
+ }
1477
+ }
1478
+ }
1479
+ ```
1480
+
1481
+ This configures the code reviewer to use both Claude and Gemini for reviews. Multiple providers can be configured to get reviews from different AI models.
1482
+
1483
+ 7. **Custom Script Configuration (package.iloom.json):**
1404
1484
 
1405
1485
  If users want to override or supplement npm scripts with custom commands, help them create `.iloom/package.iloom.json`:
1406
1486
  ```json