@iloom/cli 0.13.1 → 0.13.3

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 (148) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/CLAUDE.md +66 -0
  4. package/dist/{ClaudeContextManager-ZH6LEA5I.js → ClaudeContextManager-KJ4VEA2F.js} +5 -5
  5. package/dist/{ClaudeService-YR66WXZN.js → ClaudeService-WTJO4UW6.js} +4 -4
  6. package/dist/{IssueTrackerFactory-O2ZBA666.js → IssueTrackerFactory-UEJALI4X.js} +3 -3
  7. package/dist/{LoomLauncher-V54ENBEF.js → LoomLauncher-KG2VBNQA.js} +5 -5
  8. package/dist/{PromptTemplateManager-4RFELNYY.js → PromptTemplateManager-QIUVJP6S.js} +2 -2
  9. package/dist/README.md +1 -1
  10. package/dist/{SettingsManager-SLSYEYDZ.js → SettingsManager-PVHBSCMI.js} +2 -2
  11. package/dist/agents/CLAUDE.md +68 -0
  12. package/dist/agents/iloom-code-reviewer.md +1 -0
  13. package/dist/agents/iloom-wave-verifier.md +1 -36
  14. package/dist/{build-ZTGWDHWU.js → build-2FXDYEZQ.js} +6 -6
  15. package/dist/{chunk-LNY2Y32V.js → chunk-2WRD6Y5E.js} +2 -2
  16. package/dist/{chunk-WYDLOQYO.js → chunk-32D4CWWH.js} +2 -2
  17. package/dist/{chunk-KGOBNC5A.js → chunk-5W44AI63.js} +3 -3
  18. package/dist/{chunk-PPQ5LV7U.js → chunk-D6FU4DLN.js} +2 -2
  19. package/dist/{chunk-PS6K2AOV.js → chunk-DMNI225H.js} +4 -4
  20. package/dist/{chunk-55NTREIU.js → chunk-DYLOITSO.js} +55 -35
  21. package/dist/chunk-DYLOITSO.js.map +1 -0
  22. package/dist/{chunk-T4KFKKEB.js → chunk-H4TSDALC.js} +6 -6
  23. package/dist/{chunk-J5JOJPK3.js → chunk-L3P3YJCE.js} +2 -2
  24. package/dist/{chunk-MRPIDNZU.js → chunk-LDE6VNG5.js} +1 -1
  25. package/dist/chunk-LDE6VNG5.js.map +1 -0
  26. package/dist/{chunk-F5NKWLMQ.js → chunk-MNPKEWBQ.js} +9 -5
  27. package/dist/chunk-MNPKEWBQ.js.map +1 -0
  28. package/dist/{chunk-EHAITKLS.js → chunk-MPHSR6GA.js} +3 -3
  29. package/dist/{chunk-HWDQRW3O.js → chunk-OHX3PSAY.js} +2 -2
  30. package/dist/{chunk-C2BVNJW5.js → chunk-OIJNBFMP.js} +2 -2
  31. package/dist/{chunk-TJDKGKQV.js → chunk-OMV47LLA.js} +2 -2
  32. package/dist/{chunk-P5MNWBLH.js → chunk-OVW26FHW.js} +19 -7
  33. package/dist/chunk-OVW26FHW.js.map +1 -0
  34. package/dist/{chunk-QNRXRSKC.js → chunk-RP6MHV24.js} +9 -9
  35. package/dist/chunk-RP6MHV24.js.map +1 -0
  36. package/dist/{chunk-UXBVDD7U.js → chunk-U2OPXZ6E.js} +282 -44
  37. package/dist/chunk-U2OPXZ6E.js.map +1 -0
  38. package/dist/{chunk-T4NESGYB.js → chunk-UMAOVKQX.js} +3 -3
  39. package/dist/{chunk-E5OM25WK.js → chunk-UQWMPQ2Q.js} +2 -2
  40. package/dist/{chunk-ZEFTWM5Z.js → chunk-VUIPDX3T.js} +2 -2
  41. package/dist/{chunk-GQDVH6FA.js → chunk-XC5JKRSH.js} +2 -2
  42. package/dist/{chunk-G2DGDCDP.js → chunk-Y2JHYPMX.js} +15 -13
  43. package/dist/chunk-Y2JHYPMX.js.map +1 -0
  44. package/dist/{chunk-ERMEYFT6.js → chunk-YVNG35OW.js} +2 -2
  45. package/dist/{chunk-7TN5VW4I.js → chunk-Z32HPRZF.js} +2 -1
  46. package/dist/chunk-Z32HPRZF.js.map +1 -0
  47. package/dist/{chunk-KCAWSZUO.js → chunk-Z3ZEJN3W.js} +13 -13
  48. package/dist/{chunk-GPBX2BY2.js → chunk-ZWXJ7G2C.js} +2 -2
  49. package/dist/{cleanup-BCVY7PEF.js → cleanup-W5FP3UKK.js} +16 -16
  50. package/dist/cli.js +115 -68
  51. package/dist/cli.js.map +1 -1
  52. package/dist/{commit-L5JNBU4U.js → commit-7RI2JFFW.js} +6 -6
  53. package/dist/{compile-GPJOHXH4.js → compile-NWTMKAGL.js} +6 -6
  54. package/dist/{contribute-QEGCI4PS.js → contribute-QWPOT4QR.js} +3 -3
  55. package/dist/{dev-server-UQKNKU2S.js → dev-server-U2XUN57X.js} +61 -30
  56. package/dist/dev-server-U2XUN57X.js.map +1 -0
  57. package/dist/{feedback-2LWXKLQZ.js → feedback-M43SGGK2.js} +4 -4
  58. package/dist/{git-IS7AV3ED.js → git-ZTMT6OAI.js} +3 -3
  59. package/dist/{ignite-VQDJQ37S.js → ignite-GUYKYC5G.js} +11 -11
  60. package/dist/index.d.ts +30 -3
  61. package/dist/index.js +8 -4
  62. package/dist/index.js.map +1 -1
  63. package/dist/{init-7SDJUAEZ.js → init-AMLCFVXG.js} +9 -7
  64. package/dist/init-AMLCFVXG.js.map +1 -0
  65. package/dist/{install-deps-NGSFDNUW.js → install-deps-XS2UUCUS.js} +6 -6
  66. package/dist/{issues-4HQKEUP7.js → issues-2IT7PSNZ.js} +4 -4
  67. package/dist/{lint-C5FOVRXY.js → lint-DKWJHET3.js} +6 -6
  68. package/dist/mcp/issue-management-server.js +8 -4
  69. package/dist/mcp/issue-management-server.js.map +1 -1
  70. package/dist/{open-2HL6GV5F.js → open-XIUV5JMJ.js} +16 -15
  71. package/dist/open-XIUV5JMJ.js.map +1 -0
  72. package/dist/{plan-GC3HF73T.js → plan-UPYDB34J.js} +20 -20
  73. package/dist/prompts/epic-report-prompt.txt +145 -0
  74. package/dist/prompts/init-prompt.txt +32 -9
  75. package/dist/prompts/issue-prompt.txt +1 -1
  76. package/dist/prompts/swarm-orchestrator-prompt.txt +50 -6
  77. package/dist/{rebase-MLIN572O.js → rebase-6AXN45AE.js} +5 -5
  78. package/dist/{recap-CKGKFDJL.js → recap-XDKI3MTA.js} +6 -6
  79. package/dist/{run-CUNRQNZS.js → run-VOGGJGPO.js} +19 -19
  80. package/dist/run-VOGGJGPO.js.map +1 -0
  81. package/dist/schema/settings.schema.json +14 -0
  82. package/dist/{shell-M2YYPNGV.js → shell-XOILFEZW.js} +5 -5
  83. package/dist/{summary-XR4CBJEG.js → summary-BVYOM63C.js} +10 -8
  84. package/dist/{summary-XR4CBJEG.js.map → summary-BVYOM63C.js.map} +1 -1
  85. package/dist/{test-ESDAHEVE.js → test-6T2UMQ7T.js} +6 -6
  86. package/dist/{test-git-KWPLHYSI.js → test-git-CQ65OL45.js} +3 -3
  87. package/dist/{test-jira-6NK7UHSV.js → test-jira-CQQHGZ3S.js} +3 -3
  88. package/dist/{test-prefix-VVODGHXP.js → test-prefix-HMTZSS67.js} +3 -3
  89. package/dist/{test-webserver-AHXKC6H4.js → test-webserver-ZN73CM2T.js} +5 -5
  90. package/dist/{vscode-OY7HOVRO.js → vscode-ABQ5ZSH7.js} +5 -5
  91. package/package.json +1 -1
  92. package/dist/chunk-55NTREIU.js.map +0 -1
  93. package/dist/chunk-7TN5VW4I.js.map +0 -1
  94. package/dist/chunk-F5NKWLMQ.js.map +0 -1
  95. package/dist/chunk-G2DGDCDP.js.map +0 -1
  96. package/dist/chunk-MRPIDNZU.js.map +0 -1
  97. package/dist/chunk-P5MNWBLH.js.map +0 -1
  98. package/dist/chunk-QNRXRSKC.js.map +0 -1
  99. package/dist/chunk-UXBVDD7U.js.map +0 -1
  100. package/dist/dev-server-UQKNKU2S.js.map +0 -1
  101. package/dist/init-7SDJUAEZ.js.map +0 -1
  102. package/dist/open-2HL6GV5F.js.map +0 -1
  103. package/dist/run-CUNRQNZS.js.map +0 -1
  104. /package/dist/{ClaudeContextManager-ZH6LEA5I.js.map → ClaudeContextManager-KJ4VEA2F.js.map} +0 -0
  105. /package/dist/{ClaudeService-YR66WXZN.js.map → ClaudeService-WTJO4UW6.js.map} +0 -0
  106. /package/dist/{IssueTrackerFactory-O2ZBA666.js.map → IssueTrackerFactory-UEJALI4X.js.map} +0 -0
  107. /package/dist/{LoomLauncher-V54ENBEF.js.map → LoomLauncher-KG2VBNQA.js.map} +0 -0
  108. /package/dist/{PromptTemplateManager-4RFELNYY.js.map → PromptTemplateManager-QIUVJP6S.js.map} +0 -0
  109. /package/dist/{SettingsManager-SLSYEYDZ.js.map → SettingsManager-PVHBSCMI.js.map} +0 -0
  110. /package/dist/{build-ZTGWDHWU.js.map → build-2FXDYEZQ.js.map} +0 -0
  111. /package/dist/{chunk-LNY2Y32V.js.map → chunk-2WRD6Y5E.js.map} +0 -0
  112. /package/dist/{chunk-WYDLOQYO.js.map → chunk-32D4CWWH.js.map} +0 -0
  113. /package/dist/{chunk-KGOBNC5A.js.map → chunk-5W44AI63.js.map} +0 -0
  114. /package/dist/{chunk-PPQ5LV7U.js.map → chunk-D6FU4DLN.js.map} +0 -0
  115. /package/dist/{chunk-PS6K2AOV.js.map → chunk-DMNI225H.js.map} +0 -0
  116. /package/dist/{chunk-T4KFKKEB.js.map → chunk-H4TSDALC.js.map} +0 -0
  117. /package/dist/{chunk-J5JOJPK3.js.map → chunk-L3P3YJCE.js.map} +0 -0
  118. /package/dist/{chunk-EHAITKLS.js.map → chunk-MPHSR6GA.js.map} +0 -0
  119. /package/dist/{chunk-HWDQRW3O.js.map → chunk-OHX3PSAY.js.map} +0 -0
  120. /package/dist/{chunk-C2BVNJW5.js.map → chunk-OIJNBFMP.js.map} +0 -0
  121. /package/dist/{chunk-TJDKGKQV.js.map → chunk-OMV47LLA.js.map} +0 -0
  122. /package/dist/{chunk-T4NESGYB.js.map → chunk-UMAOVKQX.js.map} +0 -0
  123. /package/dist/{chunk-E5OM25WK.js.map → chunk-UQWMPQ2Q.js.map} +0 -0
  124. /package/dist/{chunk-ZEFTWM5Z.js.map → chunk-VUIPDX3T.js.map} +0 -0
  125. /package/dist/{chunk-GQDVH6FA.js.map → chunk-XC5JKRSH.js.map} +0 -0
  126. /package/dist/{chunk-ERMEYFT6.js.map → chunk-YVNG35OW.js.map} +0 -0
  127. /package/dist/{chunk-KCAWSZUO.js.map → chunk-Z3ZEJN3W.js.map} +0 -0
  128. /package/dist/{chunk-GPBX2BY2.js.map → chunk-ZWXJ7G2C.js.map} +0 -0
  129. /package/dist/{cleanup-BCVY7PEF.js.map → cleanup-W5FP3UKK.js.map} +0 -0
  130. /package/dist/{commit-L5JNBU4U.js.map → commit-7RI2JFFW.js.map} +0 -0
  131. /package/dist/{compile-GPJOHXH4.js.map → compile-NWTMKAGL.js.map} +0 -0
  132. /package/dist/{contribute-QEGCI4PS.js.map → contribute-QWPOT4QR.js.map} +0 -0
  133. /package/dist/{feedback-2LWXKLQZ.js.map → feedback-M43SGGK2.js.map} +0 -0
  134. /package/dist/{git-IS7AV3ED.js.map → git-ZTMT6OAI.js.map} +0 -0
  135. /package/dist/{ignite-VQDJQ37S.js.map → ignite-GUYKYC5G.js.map} +0 -0
  136. /package/dist/{install-deps-NGSFDNUW.js.map → install-deps-XS2UUCUS.js.map} +0 -0
  137. /package/dist/{issues-4HQKEUP7.js.map → issues-2IT7PSNZ.js.map} +0 -0
  138. /package/dist/{lint-C5FOVRXY.js.map → lint-DKWJHET3.js.map} +0 -0
  139. /package/dist/{plan-GC3HF73T.js.map → plan-UPYDB34J.js.map} +0 -0
  140. /package/dist/{rebase-MLIN572O.js.map → rebase-6AXN45AE.js.map} +0 -0
  141. /package/dist/{recap-CKGKFDJL.js.map → recap-XDKI3MTA.js.map} +0 -0
  142. /package/dist/{shell-M2YYPNGV.js.map → shell-XOILFEZW.js.map} +0 -0
  143. /package/dist/{test-ESDAHEVE.js.map → test-6T2UMQ7T.js.map} +0 -0
  144. /package/dist/{test-git-KWPLHYSI.js.map → test-git-CQ65OL45.js.map} +0 -0
  145. /package/dist/{test-jira-6NK7UHSV.js.map → test-jira-CQQHGZ3S.js.map} +0 -0
  146. /package/dist/{test-prefix-VVODGHXP.js.map → test-prefix-HMTZSS67.js.map} +0 -0
  147. /package/dist/{test-webserver-AHXKC6H4.js.map → test-webserver-ZN73CM2T.js.map} +0 -0
  148. /package/dist/{vscode-OY7HOVRO.js.map → vscode-ABQ5ZSH7.js.map} +0 -0
@@ -2,37 +2,37 @@
2
2
  import {
3
3
  DevServerManager,
4
4
  buildDevServerUrl
5
- } from "./chunk-P5MNWBLH.js";
5
+ } from "./chunk-OVW26FHW.js";
6
6
  import {
7
7
  DockerManager
8
- } from "./chunk-7TN5VW4I.js";
9
- import "./chunk-LNY2Y32V.js";
8
+ } from "./chunk-Z32HPRZF.js";
9
+ import "./chunk-2WRD6Y5E.js";
10
10
  import {
11
11
  getWorkspacePort
12
- } from "./chunk-ERMEYFT6.js";
12
+ } from "./chunk-YVNG35OW.js";
13
13
  import {
14
14
  IdentifierParser
15
- } from "./chunk-GQDVH6FA.js";
15
+ } from "./chunk-XC5JKRSH.js";
16
16
  import "./chunk-OLJ54WGW.js";
17
17
  import {
18
18
  GitWorktreeManager
19
- } from "./chunk-PPQ5LV7U.js";
19
+ } from "./chunk-D6FU4DLN.js";
20
20
  import {
21
21
  openBrowser
22
22
  } from "./chunk-WEBMMJKL.js";
23
- import {
24
- extractSettingsOverrides
25
- } from "./chunk-GYCR2LOU.js";
26
23
  import {
27
24
  ProjectCapabilityDetector
28
25
  } from "./chunk-772N5WCA.js";
29
26
  import "./chunk-K3QGG4O2.js";
27
+ import {
28
+ extractSettingsOverrides
29
+ } from "./chunk-GYCR2LOU.js";
30
30
  import {
31
31
  extractIssueNumber
32
- } from "./chunk-KGOBNC5A.js";
32
+ } from "./chunk-5W44AI63.js";
33
33
  import {
34
34
  SettingsManager
35
- } from "./chunk-F5NKWLMQ.js";
35
+ } from "./chunk-MNPKEWBQ.js";
36
36
  import "./chunk-XIVLGWUX.js";
37
37
  import "./chunk-FTYWGQFM.js";
38
38
  import {
@@ -59,7 +59,7 @@ var OpenCommand = class {
59
59
  const { capabilities, binEntries } = await this.capabilityDetector.detectCapabilities(worktree.path);
60
60
  logger.debug(`Detected capabilities: ${capabilities.join(", ")}`);
61
61
  if (capabilities.includes("web")) {
62
- await this.openWebBrowser(worktree);
62
+ await this.openWebBrowser(worktree, input.env);
63
63
  } else if (capabilities.includes("cli")) {
64
64
  await this.runCLITool(worktree.path, binEntries, input.args ?? []);
65
65
  } else {
@@ -183,7 +183,7 @@ var OpenCommand = class {
183
183
  * Open web browser with workspace URL
184
184
  * Auto-starts dev server if not already running
185
185
  */
186
- async openWebBrowser(worktree) {
186
+ async openWebBrowser(worktree, env) {
187
187
  var _a, _b, _c, _d, _e;
188
188
  const cliOverrides = extractSettingsOverrides();
189
189
  const settings = await this.settingsManager.loadSettings(void 0, cliOverrides);
@@ -209,7 +209,8 @@ var OpenCommand = class {
209
209
  const serverReady = await this.devServerManager.ensureServerRunning(
210
210
  worktree.path,
211
211
  port,
212
- dockerConfig
212
+ dockerConfig,
213
+ env
213
214
  );
214
215
  if (!serverReady) {
215
216
  logger.warn(
@@ -257,4 +258,4 @@ Make sure the project is built (run 'il start' first)`
257
258
  export {
258
259
  OpenCommand
259
260
  };
260
- //# sourceMappingURL=open-2HL6GV5F.js.map
261
+ //# sourceMappingURL=open-XIUV5JMJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/open.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport { execa } from 'execa'\nimport { GitWorktreeManager } from '../lib/GitWorktreeManager.js'\nimport { ProjectCapabilityDetector } from '../lib/ProjectCapabilityDetector.js'\nimport { DevServerManager } from '../lib/DevServerManager.js'\nimport { DockerManager } from '../lib/DockerManager.js'\nimport { SettingsManager } from '../lib/SettingsManager.js'\nimport { IdentifierParser } from '../utils/IdentifierParser.js'\nimport { openBrowser } from '../utils/browser.js'\nimport { getWorkspacePort } from '../utils/port.js'\nimport { extractIssueNumber } from '../utils/git.js'\nimport { buildDevServerUrl } from '../utils/dev-server.js'\nimport { logger } from '../utils/logger.js'\nimport { extractSettingsOverrides } from '../utils/cli-overrides.js'\nimport type { GitWorktree } from '../types/worktree.js'\n\nexport interface OpenCommandInput {\n\tidentifier?: string\n\targs?: string[]\n\tenv?: Record<string, string> | undefined\n}\n\ninterface ParsedOpenInput {\n\ttype: 'issue' | 'pr' | 'branch' | 'epic'\n\tnumber?: string | number // For issues and PRs\n\tbranchName?: string // For branches\n\toriginalInput: string\n\tautoDetected: boolean\n}\n\n/**\n * OpenCommand - Opens workspace in browser or runs CLI tool\n * Priority: Web first, CLI fallback\n */\nexport class OpenCommand {\n\tconstructor(\n\t\tprivate gitWorktreeManager = new GitWorktreeManager(),\n\t\tprivate capabilityDetector = new ProjectCapabilityDetector(),\n\t\tprivate identifierParser = new IdentifierParser(new GitWorktreeManager()),\n\t\tprivate devServerManager = new DevServerManager(),\n\t\tprivate settingsManager = new SettingsManager()\n\t) {}\n\n\tasync execute(input: OpenCommandInput): Promise<void> {\n\t\t// 1. Parse or auto-detect identifier\n\t\tconst parsed = input.identifier\n\t\t\t? await this.parseExplicitInput(input.identifier)\n\t\t\t: await this.autoDetectFromCurrentDirectory()\n\n\t\tlogger.debug(`Parsed input: ${JSON.stringify(parsed)}`)\n\n\t\t// 2. Find worktree path based on identifier\n\t\tconst worktree = await this.findWorktreeForIdentifier(parsed)\n\n\t\tlogger.info(`Found worktree at: ${worktree.path}`)\n\n\t\t// 3. Detect project capabilities\n\t\tconst { capabilities, binEntries } =\n\t\t\tawait this.capabilityDetector.detectCapabilities(worktree.path)\n\n\t\tlogger.debug(`Detected capabilities: ${capabilities.join(', ')}`)\n\n\t\t// 4. Execute based on capabilities (web first, CLI fallback)\n\t\tif (capabilities.includes('web')) {\n\t\t\tawait this.openWebBrowser(worktree, input.env)\n\t\t} else if (capabilities.includes('cli')) {\n\t\t\tawait this.runCLITool(worktree.path, binEntries, input.args ?? [])\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`No web or CLI capabilities detected for workspace at ${worktree.path}`\n\t\t\t)\n\t\t}\n\t}\n\n\t/**\n\t * Parse explicit identifier input\n\t */\n\tprivate async parseExplicitInput(identifier: string): Promise<ParsedOpenInput> {\n\t\tconst parsed = await this.identifierParser.parseForPatternDetection(identifier)\n\n\t\t// Description type should never reach open command (converted in start)\n\t\tif (parsed.type === 'description') {\n\t\t\tthrow new Error('Description input type is not supported in open command')\n\t\t}\n\n\t\tconst result: ParsedOpenInput = {\n\t\t\ttype: parsed.type,\n\t\t\toriginalInput: parsed.originalInput,\n\t\t\tautoDetected: false,\n\t\t}\n\n\t\tif (parsed.number !== undefined) {\n\t\t\tresult.number = parsed.number\n\t\t}\n\t\tif (parsed.branchName !== undefined) {\n\t\t\tresult.branchName = parsed.branchName\n\t\t}\n\n\t\treturn result\n\t}\n\n\t/**\n\t * Auto-detect identifier from current directory\n\t * Same logic as FinishCommand.autoDetectFromCurrentDirectory()\n\t */\n\tprivate async autoDetectFromCurrentDirectory(): Promise<ParsedOpenInput> {\n\t\tconst currentDir = path.basename(process.cwd())\n\n\t\t// Check for PR worktree pattern: _pr_N suffix\n\t\tconst prPattern = /_pr_(\\d+)$/\n\t\tconst prMatch = currentDir.match(prPattern)\n\n\t\tif (prMatch?.[1]) {\n\t\t\tconst prNumber = parseInt(prMatch[1], 10)\n\t\t\tlogger.debug(`Auto-detected PR #${prNumber} from directory: ${currentDir}`)\n\t\t\treturn {\n\t\t\t\ttype: 'pr',\n\t\t\t\tnumber: prNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Check for issue pattern in directory\n\t\tconst issueNumber = extractIssueNumber(currentDir)\n\n\t\tif (issueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${issueNumber} from directory: ${currentDir}`)\n\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: issueNumber,\n\t\t\t\toriginalInput: currentDir,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: get current branch name\n\t\tconst repoInfo = await this.gitWorktreeManager.getRepoInfo()\n\t\tconst currentBranch = repoInfo.currentBranch\n\n\t\tif (!currentBranch) {\n\t\t\tthrow new Error(\n\t\t\t\t'Could not auto-detect identifier. Please provide an issue number, PR number, or branch name.\\n' +\n\t\t\t\t\t'Expected directory pattern: feat/issue-XX-description OR worktree with _pr_N suffix'\n\t\t\t)\n\t\t}\n\n\t\t// Try to extract issue from branch name\n\t\tconst branchIssueNumber = extractIssueNumber(currentBranch)\n\t\tif (branchIssueNumber !== null) {\n\t\t\tlogger.debug(`Auto-detected issue #${branchIssueNumber} from branch: ${currentBranch}`)\n\t\t\treturn {\n\t\t\t\ttype: 'issue',\n\t\t\t\tnumber: branchIssueNumber,\n\t\t\t\toriginalInput: currentBranch,\n\t\t\t\tautoDetected: true,\n\t\t\t}\n\t\t}\n\n\t\t// Last resort: use branch name\n\t\treturn {\n\t\t\ttype: 'branch',\n\t\t\tbranchName: currentBranch,\n\t\t\toriginalInput: currentBranch,\n\t\t\tautoDetected: true,\n\t\t}\n\t}\n\n\t/**\n\t * Find worktree for the given identifier\n\t */\n\tprivate async findWorktreeForIdentifier(parsed: ParsedOpenInput): Promise<GitWorktree> {\n\t\tlet worktree: GitWorktree | null = null\n\n\t\tif (parsed.type === 'issue' && parsed.number !== undefined) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForIssue(parsed.number)\n\t\t} else if (parsed.type === 'pr' && parsed.number !== undefined) {\n\t\t\t// For PRs, ensure the number is numeric (PRs are always numeric per GitHub)\n\t\t\tconst prNumber = typeof parsed.number === 'number' ? parsed.number : Number(parsed.number)\n\t\t\tif (isNaN(prNumber) || !isFinite(prNumber)) {\n\t\t\t\tthrow new Error(`Invalid PR number: ${parsed.number}. PR numbers must be numeric.`)\n\t\t\t}\n\t\t\t// Pass empty string for branch name since we don't know it yet\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForPR(prNumber, '')\n\t\t} else if (parsed.type === 'branch' && parsed.branchName) {\n\t\t\tworktree = await this.gitWorktreeManager.findWorktreeForBranch(\n\t\t\t\tparsed.branchName\n\t\t\t)\n\t\t}\n\n\t\tif (!worktree) {\n\t\t\tthrow new Error(\n\t\t\t\t`No worktree found for ${this.formatParsedInput(parsed)}. ` +\n\t\t\t\t\t`Run 'il start ${parsed.originalInput}' to create one.`\n\t\t\t)\n\t\t}\n\n\t\treturn worktree\n\t}\n\n\t/**\n\t * Format parsed input for display\n\t */\n\tprivate formatParsedInput(parsed: ParsedOpenInput): string {\n\t\tconst autoLabel = parsed.autoDetected ? ' (auto-detected)' : ''\n\n\t\tif (parsed.type === 'issue') {\n\t\t\treturn `issue #${parsed.number}${autoLabel}`\n\t\t}\n\t\tif (parsed.type === 'pr') {\n\t\t\treturn `PR #${parsed.number}${autoLabel}`\n\t\t}\n\t\treturn `branch \"${parsed.branchName}\"${autoLabel}`\n\t}\n\n\t/**\n\t * Open web browser with workspace URL\n\t * Auto-starts dev server if not already running\n\t */\n\tprivate async openWebBrowser(worktree: GitWorktree, env?: Record<string, string>): Promise<void> {\n\t\tconst cliOverrides = extractSettingsOverrides()\n\t\tconst settings = await this.settingsManager.loadSettings(undefined, cliOverrides)\n\t\tconst isMainWorktree = await this.gitWorktreeManager.isMainWorktree(worktree, this.settingsManager)\n\t\tconst port = await getWorkspacePort({\n\t\t\tworktreePath: worktree.path,\n\t\t\tworktreeBranch: worktree.branch,\n\t\t\tbasePort: settings.capabilities?.web?.basePort,\n\t\t\tcheckEnvFile: true,\n\t\t\tisMainWorktree,\n\t\t})\n\n\t\t// Extract Docker configuration if Docker mode is enabled\n\t\tconst issueNumber = extractIssueNumber(worktree.branch)\n\t\tconst dockerIdentifier = issueNumber?.toString() ?? worktree.branch\n\t\tconst dockerConfig = DockerManager.buildDockerConfigFromSettings(\n\t\t\tsettings.capabilities?.web,\n\t\t\tdockerIdentifier\n\t\t)\n\n\t\tif (dockerConfig) {\n\t\t\tawait DockerManager.assertAvailable()\n\t\t\tconst { dockerFile, containerPort, identifier } = dockerConfig\n\t\t\tlogger.debug(`Docker mode enabled with config: ${JSON.stringify({ dockerFile, containerPort, identifier })}`)\n\t\t}\n\n\t\t// Ensure dev server is running on the port\n\t\tconst serverReady = await this.devServerManager.ensureServerRunning(\n\t\t\tworktree.path,\n\t\t\tport,\n\t\t\tdockerConfig,\n\t\t\tenv\n\t\t)\n\n\t\tif (!serverReady) {\n\t\t\tlogger.warn(\n\t\t\t\t`Dev server failed to start on port ${port}. Opening browser anyway...`\n\t\t\t)\n\t\t}\n\n\t\t// Construct URL and open browser\n\t\tconst protocol = settings.capabilities?.web?.protocol ?? 'http'\n\t\tconst url = buildDevServerUrl(port, protocol)\n\t\tlogger.info(`Opening browser: ${url}`)\n\t\tawait openBrowser(url)\n\t\tlogger.success('Browser opened')\n\t}\n\n\t/**\n\t * Run CLI tool directly from worktree bin path (NO SYMLINKS!)\n\t */\n\tprivate async runCLITool(\n\t\tworktreePath: string,\n\t\tbinEntries: Record<string, string>,\n\t\targs: string[]\n\t): Promise<void> {\n\t\t// Validate binEntries exist\n\t\tif (Object.keys(binEntries).length === 0) {\n\t\t\tthrow new Error('No bin entries found in package.json')\n\t\t}\n\n\t\t// Get first bin entry (deterministic)\n\t\tconst firstEntry = Object.entries(binEntries)[0]\n\t\tif (!firstEntry) {\n\t\t\tthrow new Error('No bin entries found in package.json')\n\t\t}\n\t\tconst [binName, binPath] = firstEntry\n\t\tlogger.debug(`Using bin entry: ${binName} -> ${binPath}`)\n\n\t\t// CRITICAL: Construct absolute path (NO SYMLINKS!)\n\t\tconst binFilePath = path.resolve(worktreePath, binPath)\n\t\tlogger.debug(`Resolved bin file path: ${binFilePath}`)\n\n\t\t// Verify file exists\n\t\tif (!(await fs.pathExists(binFilePath))) {\n\t\t\tthrow new Error(\n\t\t\t\t`CLI executable not found: ${binFilePath}\\n` +\n\t\t\t\t\t`Make sure the project is built (run 'il start' first)`\n\t\t\t)\n\t\t}\n\n\t\t// Execute with Node.js\n\t\tlogger.info(`Running CLI: node ${binFilePath} ${args.join(' ')}`)\n\t\tawait execa('node', [binFilePath, ...args], {\n\t\t\tstdio: 'inherit', // Allow interactive CLIs (prompts, colors, etc.)\n\t\t\tcwd: worktreePath, // Execute in worktree context\n\t\t\tenv: process.env, // Inherit environment\n\t\t})\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  IgniteCommand
4
- } from "./chunk-G2DGDCDP.js";
4
+ } from "./chunk-Y2JHYPMX.js";
5
5
  import {
6
6
  StartCommand,
7
7
  launchFirstRunSetup,
8
8
  needsFirstRunSetup
9
- } from "./chunk-KCAWSZUO.js";
10
- import "./chunk-55NTREIU.js";
11
- import "./chunk-J5JOJPK3.js";
12
- import "./chunk-C2BVNJW5.js";
9
+ } from "./chunk-Z3ZEJN3W.js";
10
+ import "./chunk-DYLOITSO.js";
11
+ import "./chunk-L3P3YJCE.js";
12
+ import "./chunk-OIJNBFMP.js";
13
13
  import {
14
14
  preAcceptClaudeTrust
15
15
  } from "./chunk-7UBEHQTP.js";
16
- import "./chunk-ERMEYFT6.js";
16
+ import "./chunk-YVNG35OW.js";
17
17
  import {
18
18
  matchIssueIdentifier
19
- } from "./chunk-GQDVH6FA.js";
19
+ } from "./chunk-XC5JKRSH.js";
20
20
  import "./chunk-HKEXRZMU.js";
21
21
  import {
22
22
  TelemetryService
@@ -29,26 +29,26 @@ import {
29
29
  } from "./chunk-CQHHEW2M.js";
30
30
  import {
31
31
  AgentManager
32
- } from "./chunk-QNRXRSKC.js";
32
+ } from "./chunk-RP6MHV24.js";
33
33
  import {
34
34
  IssueManagementProviderFactory
35
- } from "./chunk-ZEFTWM5Z.js";
35
+ } from "./chunk-VUIPDX3T.js";
36
36
  import "./chunk-4232AHNQ.js";
37
37
  import "./chunk-OLJ54WGW.js";
38
- import "./chunk-PPQ5LV7U.js";
38
+ import "./chunk-D6FU4DLN.js";
39
39
  import "./chunk-WEBMMJKL.js";
40
- import "./chunk-WYDLOQYO.js";
41
- import "./chunk-T4NESGYB.js";
40
+ import "./chunk-772N5WCA.js";
41
+ import "./chunk-K3QGG4O2.js";
42
+ import "./chunk-32D4CWWH.js";
43
+ import "./chunk-UMAOVKQX.js";
42
44
  import {
43
45
  PromptTemplateManager
44
- } from "./chunk-MRPIDNZU.js";
46
+ } from "./chunk-LDE6VNG5.js";
45
47
  import "./chunk-GYCR2LOU.js";
46
48
  import "./chunk-AQUSMNBF.js";
47
- import "./chunk-772N5WCA.js";
48
- import "./chunk-K3QGG4O2.js";
49
49
  import {
50
50
  IssueTrackerFactory
51
- } from "./chunk-GPBX2BY2.js";
51
+ } from "./chunk-ZWXJ7G2C.js";
52
52
  import "./chunk-DMSL5BAP.js";
53
53
  import "./chunk-D4Q7T5KD.js";
54
54
  import "./chunk-KV4NU3RP.js";
@@ -64,11 +64,11 @@ import {
64
64
  detectClaudeCli,
65
65
  launchClaude
66
66
  } from "./chunk-DDHWZNGL.js";
67
- import "./chunk-KGOBNC5A.js";
67
+ import "./chunk-5W44AI63.js";
68
68
  import {
69
69
  PlanCommandSettingsSchema,
70
70
  SettingsManager
71
- } from "./chunk-F5NKWLMQ.js";
71
+ } from "./chunk-MNPKEWBQ.js";
72
72
  import "./chunk-XIVLGWUX.js";
73
73
  import {
74
74
  withLogger
@@ -394,7 +394,7 @@ var PlanCommand = class {
394
394
  );
395
395
  if (shouldRunInit) {
396
396
  logger.info(chalk.bold("Launching iloom init..."));
397
- const { InitCommand } = await import("./init-7SDJUAEZ.js");
397
+ const { InitCommand } = await import("./init-AMLCFVXG.js");
398
398
  const initCommand = new InitCommand();
399
399
  await initCommand.execute(
400
400
  "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."
@@ -743,4 +743,4 @@ ${initialMessage}`;
743
743
  export {
744
744
  PlanCommand
745
745
  };
746
- //# sourceMappingURL=plan-GC3HF73T.js.map
746
+ //# sourceMappingURL=plan-UPYDB34J.js.map
@@ -0,0 +1,145 @@
1
+ You are generating an implementation report for an epic PR. You are NOT having a conversation. Output ONLY the report markdown — no preamble, no meta-commentary, no sign-off.
2
+
3
+ ## Epic Context
4
+
5
+ Epic: #{{EPIC_NUMBER}} - {{EPIC_TITLE}}
6
+ Children: {{TOTAL_CHILDREN}} total, {{TOTAL_SUCCEEDED}} succeeded, {{TOTAL_FAILED}} failed
7
+
8
+ ## Content Quality Guidelines
9
+
10
+ **CRITICAL: This report is NOT a play-by-play of the swarm. It's a knowledge artifact for PR reviewers and future developers.**
11
+
12
+ The reader doesn't care about:
13
+ - Which agent did what, or in which order
14
+ - Git operations (rebases, merges, pushes, conflict resolution steps)
15
+ - Workflow phases, status transitions, or orchestration mechanics
16
+ - "The agent analyzed the issue and then planned the implementation"
17
+
18
+ The reader DOES care about:
19
+ - What changed in the codebase and why
20
+ - What could break and what to watch out for
21
+ - Decisions that constrain future work
22
+ - Gaps in testing or verification
23
+ - Integration risks from parallel development
24
+
25
+ **Self-check:** If a sentence describes swarm PROCESS rather than codebase KNOWLEDGE, delete it.
26
+
27
+ | BAD (process narration) | GOOD (technical insight) |
28
+ |-------------------------|--------------------------|
29
+ | "Issue #42 was implemented first, then #43 was merged" | "The auth middleware now validates tokens before route matching" |
30
+ | "The agent resolved a merge conflict in config.ts" | "Two children modified the same type union — reconciled to include both additions" |
31
+ | "Wave 1 completed successfully with 4 children" | "All 4 services share a common `ChildImplementationData` interface for consistency" |
32
+ | "The verification agent confirmed all must-haves" | "The collector gracefully degrades when recap files are missing (returns partial data)" |
33
+
34
+ ## Report Structure
35
+
36
+ Produce these sections in order:
37
+
38
+ ### 1. Executive Summary (always visible, no collapse)
39
+
40
+ 3-4 sentences covering:
41
+ - What capability was added or changed (in user/developer terms, not swarm terms)
42
+ - Key architectural pattern or approach chosen
43
+ - Anything a reviewer should be concerned about
44
+ - Quick stats: files changed, tests added
45
+
46
+ ### 2. What to Review Carefully (always visible, no collapse)
47
+
48
+ 3-5 bullets pointing reviewers to the areas where human judgment matters most:
49
+ - Integration seams between independently-developed components
50
+ - Behavioral changes to existing code paths
51
+ - Edge cases with no test coverage
52
+ - Architectural choices that could be controversial
53
+
54
+ ### 3. Cross-Cutting Risks & Assumptions
55
+
56
+ <details>
57
+ <summary>Risks & Assumptions (expand for details)</summary>
58
+
59
+ Synthesize from ALL children. Group by architectural concern (e.g., "API Surface", "Error Handling", "Type Safety") — NOT by child issue. Highlight risks that appeared in multiple children. Flag any contradictions between children's approaches.
60
+
61
+ </details>
62
+
63
+ ### 4. Architecture Decisions
64
+
65
+ <details>
66
+ <summary>Key Decisions (expand for details)</summary>
67
+
68
+ Decisions that affect the overall system — shared interfaces, patterns, naming conventions, integration contracts. Include rationale. Format as bullets.
69
+
70
+ </details>
71
+
72
+ ### 5. Testing & Verification
73
+
74
+ <details>
75
+ <summary>Test Coverage (expand for details)</summary>
76
+
77
+ - New tests: what areas they cover and rough count
78
+ - Modified tests: what changed and why
79
+ - Coverage gaps: areas with NO test coverage that need manual verification
80
+ - Integration verification results: what was checked, what passed, what was fixed
81
+
82
+ </details>
83
+
84
+ ### 6. Lessons Learned
85
+
86
+ <details>
87
+ <summary>What we'd do differently (expand for details)</summary>
88
+
89
+ Technical insights, NOT process reflection:
90
+ - Integration issues discovered when merging parallel work (e.g., "Two children defined the same type differently")
91
+ - Contract mismatches caught by review or verification (and how they were fixed)
92
+ - Patterns that worked well for parallel decomposition
93
+ - Patterns that caused friction (e.g., "Shared type file was modified by 3 children independently")
94
+
95
+ Do NOT include: "should have planned better", "the swarm was efficient", "agents worked well together"
96
+
97
+ </details>
98
+
99
+ ### 7. Per-Child Details
100
+
101
+ For each child, use an H3 heading with the issue number as a link, then collapse the details:
102
+
103
+ ```
104
+ ### [#NUMBER](issue-url): TITLE — succeeded/failed
105
+
106
+ <details>
107
+ <summary>Details</summary>
108
+
109
+ **What changed:** [1-2 sentences about the actual code change, not the process]
110
+
111
+ **Key files:** [most important files, not exhaustive list]
112
+
113
+ **Decisions:** [child-specific decisions with brief rationale]
114
+
115
+ **Risks:** [child-specific risks, if any]
116
+
117
+ **Test coverage:** [what's tested, what isn't]
118
+
119
+ </details>
120
+ ```
121
+
122
+ This way the issue number and title are always visible as scannable headings, with details collapsed underneath.
123
+
124
+ ## Formatting Rules
125
+
126
+ - Sections 1 and 2 are ALWAYS visible (no `<details>` wrapper) — they're the skim layer
127
+ - Sections 3-7 use `<details><summary>` — they're the depth layer
128
+ - Replace "(expand for details)" with actual item counts when you can (e.g., "Risks & Assumptions (4 items)")
129
+ - Keep total output under 10,000 characters (GitHub comment limit)
130
+ - Write for two audiences: humans who skim headings and expand selectively, and AI agents that ingest everything
131
+
132
+ ## VALIDATION CHECKLIST
133
+
134
+ Before outputting, verify:
135
+ - [ ] Executive summary describes what CHANGED, not what the swarm DID
136
+ - [ ] No sentences describe agent behavior, orchestration steps, or workflow phases
137
+ - [ ] Risks are grouped by concern, not by child issue
138
+ - [ ] "What to Review Carefully" contains actionable guidance, not vague praise
139
+ - [ ] Lessons learned contains technical insights, not process reflection
140
+
141
+ ## Child Implementation Data
142
+
143
+ {{CHILD_DATA}}
144
+
145
+ Output ONLY the report markdown. No preamble, no meta-commentary, no sign-off.
@@ -51,6 +51,11 @@ ALL iloom configuration files should default to their `.local` variants:
51
51
  - ❌ **NEVER** read README.md, package.json, or any other files "for context"
52
52
  - **WHY**: All necessary information is provided in template variables
53
53
 
54
+ **GITIGNORE CHECKS:**
55
+ - If you need to check whether a file is gitignored, ALWAYS use `git check-ignore -q <path>` (exit code 0 = ignored, non-zero = not ignored)
56
+ - ❌ **NEVER** read or parse `.gitignore` files directly to determine gitignore status
57
+ - **WHY**: `git check-ignore` respects all gitignore sources (global, repo, nested) — reading a single `.gitignore` file does not
58
+
54
59
  **VIOLATION EXAMPLES TO AVOID:**
55
60
  - ❌ "Let me read .iloom/settings.json to see your current configuration"
56
61
  - ❌ "Let me look at your settings file to understand what's configured"
@@ -515,6 +520,13 @@ The following JSON Schema defines valid iloom settings:
515
520
  "type": "string"
516
521
  },
517
522
  "description": "Additional arguments for docker run (e.g., [\"-v\", \"./src:/app/src\"] for volume mounts)"
523
+ },
524
+ "dockerRunEnv": {
525
+ "type": "object",
526
+ "additionalProperties": {
527
+ "type": "string"
528
+ },
529
+ "description": "Environment variables to pass to docker run (e.g., {\"NODE_ENV\": \"development\", \"DEBUG\": \"true\"})"
518
530
  }
519
531
  },
520
532
  "additionalProperties": false,
@@ -575,6 +587,13 @@ The following JSON Schema defines valid iloom settings:
575
587
  "type": "string"
576
588
  },
577
589
  "description": "Additional arguments for docker run"
590
+ },
591
+ "runEnv": {
592
+ "type": "object",
593
+ "additionalProperties": {
594
+ "type": "string"
595
+ },
596
+ "description": "Environment variables to pass to docker run"
578
597
  }
579
598
  },
580
599
  "additionalProperties": false
@@ -990,8 +1009,8 @@ Current Configuration:
990
1009
  Main Branch: [currentMainBranch or "main (default)"]
991
1010
  Permission Mode (Issues): [currentPermissionMode or "acceptEdits (default)"]
992
1011
  Base Port: [currentBasePort or "3000 (default)"]
993
- IDE: [currentIdeType or "vscode (default)"]
994
- Issue Tracker: [currentIssueProvider or "github (default)"]
1012
+ {{#unless IS_VSCODE_MODE}}IDE: [currentIdeType or "vscode (default)"]
1013
+ {{/unless}}Issue Tracker: [currentIssueProvider or "github (default)"]
995
1014
  Linear Team ID: [currentLinearTeamId] (only if currentIssueProvider == linear)
996
1015
  {{#if MULTIPLE_REMOTES}}GitHub Remote: [currentGitHubRemote] (only if currentIssueProvider == github){{/if}}
997
1016
  Jira Host: [currentJiraHost] (only if currentIssueProvider == jira)
@@ -1338,6 +1357,9 @@ This repository has multiple git remotes detected. iloom needs to know which rem
1338
1357
 
1339
1358
  **Step 3: IDE Selection**
1340
1359
 
1360
+ {{#if IS_VSCODE_MODE}}
1361
+ 4. **IDE Selection** — SKIP this question. The user is running from VS Code, so automatically set `ide.type` to `"vscode"`. Do not ask.
1362
+ {{else}}
1341
1363
  4. **IDE Selection**
1342
1364
  - Question format: "Which IDE should iloom launch when starting a loom?{{#if currentIdeType}} (Currently: [currentIdeType]){{/if}}"
1343
1365
  - Options:
@@ -1352,6 +1374,7 @@ This repository has multiple git remotes detected. iloom needs to know which rem
1352
1374
  - Validation: Must be one of the listed options
1353
1375
  - Store answer as: `ide.type`
1354
1376
  - Note: Color synchronization (title bar colors) only works with VSCode-compatible editors (vscode, cursor, windsurf, antigravity). Other IDEs will launch without color theming.
1377
+ {{/if}}
1355
1378
 
1356
1379
  **Step 4: Merge Mode** (only ask if multiple remotes detected OR user requests advanced config)
1357
1380
 
@@ -1375,7 +1398,7 @@ This repository has multiple git remotes detected. iloom needs to know which rem
1375
1398
  **Implementation Details:**
1376
1399
  - Ask Step 1 first to determine provider
1377
1400
  - Then ask Step 2 based on the provider selected (includes Linear API Token if Linear was selected, or Jira credentials if Jira was selected)
1378
- - Ask Step 3 (IDE) for all users
1401
+ {{#unless IS_VSCODE_MODE}}- Ask Step 3 (IDE) for all users{{/unless}}
1379
1402
  - Ask Step 4 (Merge Mode) only if multiple remotes detected OR user requests advanced config
1380
1403
  - Set multiSelect: false for all questions
1381
1404
  - Process answers sequentially as they depend on each other
@@ -1425,8 +1448,8 @@ Tooling Configuration (Phase 2):
1425
1448
  Jira Project Key: [value] (only if issue tracker is Jira)
1426
1449
  Jira Board ID: [value or "not configured"] (only if issue tracker is Jira)
1427
1450
  Jira API Token: [configured/not configured] (only if issue tracker is Jira - never show actual token)
1428
- IDE: [value or "vscode (default)"]
1429
- Merge Mode: [value] (only if configured)
1451
+ {{#unless IS_VSCODE_MODE}} IDE: [value or "vscode (default)"]
1452
+ {{/unless}} Merge Mode: [value] (only if configured)
1430
1453
  Swarm Mode: [Maximum Quality / Balanced / Fast & Cheap] (only if configured in Phase 2.5)
1431
1454
  ```
1432
1455
 
@@ -1736,7 +1759,7 @@ Would you like to commit these changes?
1736
1759
  - **ONLY commit iloom-related files**: .iloom/settings.json, .iloom/package.iloom.json, .gitignore
1737
1760
  - **NEVER stage or commit unrelated files** - even if they appear in `git status`
1738
1761
  - **If the commit fails, you must then subsequently request to use --no-verify flag** to bypass pre-commit hooks that might fail due to unrelated codebase state
1739
- - **Do NOT commit local-only files** - settings.local.json and package.iloom.local.json should be gitignored, not committed
1762
+ - **Do NOT commit local-only files** - settings.local.json and package.iloom.local.json are automatically added to the global gitignore by iloom CLI
1740
1763
  - **YOU MAY NEED TO EDIT/UPDATE MORE THAN ONE FILE if the user is changing something like API Keys (local only), permissionsMode (local only), IDE (recommened global) as well as shared settings.
1741
1764
 
1742
1765
  **Step 3: If user says yes, commit the changes**
@@ -1748,7 +1771,7 @@ Stage ONLY the iloom-related files that should be committed:
1748
1771
  git add .iloom/settings.json .iloom/package.iloom.json .gitignore 2>/dev/null || true
1749
1772
  ```
1750
1773
 
1751
- Note: Do NOT add local-only files (.iloom/settings.local.json, .iloom/package.iloom.local.json) - they should be gitignored, not committed.
1774
+ Note: Do NOT add local-only files (.iloom/settings.local.json, .iloom/package.iloom.local.json) - these are automatically added to the global gitignore by iloom CLI.
1752
1775
 
1753
1776
  Then commit:
1754
1777
 
@@ -2040,13 +2063,13 @@ When configuring agents, use these model identifiers:
2040
2063
  **Local Overrides for Fork Contributors:**
2041
2064
 
2042
2065
  If you're contributing to a forked repository, save your customizations to `.iloom/package.iloom.local.json` instead of `package.iloom.json`. This file:
2043
- - Is automatically added to global gitignore (won't appear in PRs)
2066
+ - Is automatically gitignored by iloom CLI (won't appear in PRs)
2044
2067
  - Merges with package.iloom.json (local scripts override base scripts)
2045
2068
  - Is automatically copied to new looms
2046
2069
 
2047
2070
  **When to use each file:**
2048
2071
  - `package.iloom.json` - Shared team configuration, committed to git
2049
- - `package.iloom.local.json` - Personal overrides, never committed (gitignored globally)
2072
+ - `package.iloom.local.json` - Personal overrides, never committed (automatically gitignored by iloom CLI)
2050
2073
 
2051
2074
  Example `.iloom/package.iloom.local.json`:
2052
2075
  ```json
@@ -1247,7 +1247,7 @@ This section is about reviewing code changes for quality, security, and complian
1247
1247
  **Auto-Run Mode**: Review automatically executes after implementation completes. No manual trigger needed.
1248
1248
 
1249
1249
  {{#if SWARM_MODE}}
1250
- 1. Execute code review via /iloom-swarm-code-reviewer skill with prompt: "Run code review."
1250
+ 1. Execute code review via /iloom-swarm-code-reviewer skill with prompt: "Your worktree path is <your-worktree-path>. Run code review."
1251
1251
  {{else}}
1252
1252
  1. Execute: @agent-iloom-code-reviewer with prompt "Run code review." (foreground, no extra context)
1253
1253
  {{/if}}
@@ -3,6 +3,9 @@
3
3
  You are the swarm orchestrator for epic #{{EPIC_ISSUE_NUMBER}}. Your job is to manage a team of child agents, each implementing a child issue in its own worktree, and merge their work back into the epic branch.
4
4
 
5
5
  **Epic Worktree:** `{{EPIC_WORKTREE_PATH}}`
6
+ {{#if PORT}}
7
+ **Dev Server Port:** `{{PORT}}` — This is the port assigned to the epic worktree. After merging child work into the epic branch, you can verify web output by running `curl http://localhost:{{PORT}}` or using Chrome DevTools MCP tools against this port. This is useful for checking that the integrated result works correctly.
8
+ {{/if}}
6
9
 
7
10
  You are running with `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`. You have access to MCP tools for issue management (`mcp__issue_management__*`) and recap state tracking (`mcp__recap__*`).
8
11
 
@@ -92,10 +95,12 @@ This is a JSON object representing the dependency DAG. Keys are issue numbers (a
92
95
  12. Create final commit with Fixes trailer for epic issue
93
96
  13. Push epic branch to remote (final commit)
94
97
  14. Print final summary
98
+ 15. Post completion status comment on epic issue
95
99
  {{else}}
96
100
  11. Create final commit with Fixes trailer for epic issue
97
101
  12. Push epic branch to remote (final commit)
98
102
  13. Print final summary
103
+ 14. Post completion status comment on epic issue
99
104
  {{/if}}
100
105
  {{else}}
101
106
  6. Clean up completed child worktrees (if not --skip-cleanup)
@@ -106,9 +111,11 @@ This is a JSON object representing the dependency DAG. Keys are issue numbers (a
106
111
  10. Run post-swarm code review and auto-fix any findings
107
112
  11. Create final commit with Fixes trailer for epic issue
108
113
  12. Print final summary
114
+ 13. Post completion status comment on epic issue
109
115
  {{else}}
110
116
  10. Create final commit with Fixes trailer for epic issue
111
117
  11. Print final summary
118
+ 12. Post completion status comment on epic issue
112
119
  {{/if}}
113
120
  {{/if}}
114
121
  {{else}}
@@ -120,9 +127,11 @@ This is a JSON object representing the dependency DAG. Keys are issue numbers (a
120
127
  10. Run post-swarm code review and auto-fix any findings
121
128
  11. Create final commit with Fixes trailer for epic issue
122
129
  12. Print final summary
130
+ 13. Post completion status comment on epic issue
123
131
  {{else}}
124
132
  10. Create final commit with Fixes trailer for epic issue
125
133
  11. Print final summary
134
+ 12. Post completion status comment on epic issue
126
135
  {{/if}}
127
136
  {{/if}}
128
137
 
@@ -627,25 +636,60 @@ The epic branch at `{{EPIC_WORKTREE_PATH}}` contains merged work from all succes
627
636
  The epic worktree is ready for review at: `{{EPIC_WORKTREE_PATH}}`
628
637
  ```
629
638
 
639
+ ### Step 5.4.5: Post Completion Status Comment on Epic Issue
640
+
641
+ Using the same data you just printed in Step 5.4, post a lightweight status comment on the parent epic issue.
642
+
643
+ 1. Build the comment body using the following format:
644
+
645
+ ```markdown
646
+ ## Swarm Completion Status
647
+
648
+ **Epic:** #<EPIC_ISSUE_NUMBER>
649
+
650
+ | Issue | Status |
651
+ |-------|--------|
652
+ | [#<number>](<url>) | Done |
653
+ | [#<number>](<url>) | Failed |
654
+
655
+ **Results:** N succeeded, N failed out of N total children.
656
+
657
+ _Full implementation report will be generated at `il finish` time._
658
+ ```
659
+
660
+ 2. Post the comment by calling `mcp__issue_management__create_comment` with:
661
+ - `number`: `"{{EPIC_ISSUE_NUMBER}}"`
662
+ - `type`: `"issue"`
663
+ - `body`: the constructed markdown above
664
+ - `markupLanguage`: `"GFM"`
665
+
666
+ 3. Log the comment as a recap artifact by calling `mcp__recap__add_artifact` with:
667
+ - `type`: `"comment"`
668
+ - `primaryUrl`: the URL returned from the create_comment call
669
+ - `description`: `"Swarm completion status comment"`
670
+ - (omit `worktreePath` -- this belongs to the epic recap)
671
+
672
+ 4. If the comment creation fails for any reason, log the error and continue. This step is non-blocking -- do not let a failed comment post stop the swarm from completing.
673
+
630
674
  {{#if DRAFT_PR_MODE}}
631
675
  {{#if AUTO_COMMIT_PUSH}}
632
676
  {{#if POST_SWARM_REVIEW}}
633
- Mark todo #10, #11, #12, #13, and #14 as completed.
677
+ Mark todo #10, #11, #12, #13, #14, and #15 as completed.
634
678
  {{else}}
635
- Mark todo #10, #11, #12, and #13 as completed.
679
+ Mark todo #10, #11, #12, #13, and #14 as completed.
636
680
  {{/if}}
637
681
  {{else}}
638
682
  {{#if POST_SWARM_REVIEW}}
639
- Mark todo #9, #10, #11, and #12 as completed.
683
+ Mark todo #9, #10, #11, #12, and #13 as completed.
640
684
  {{else}}
641
- Mark todo #9, #10, and #11 as completed.
685
+ Mark todo #9, #10, #11, and #12 as completed.
642
686
  {{/if}}
643
687
  {{/if}}
644
688
  {{else}}
645
689
  {{#if POST_SWARM_REVIEW}}
646
- Mark todo #9, #10, #11, and #12 as completed.
690
+ Mark todo #9, #10, #11, #12, and #13 as completed.
647
691
  {{else}}
648
- Mark todo #9, #10, and #11 as completed.
692
+ Mark todo #9, #10, #11, and #12 as completed.
649
693
  {{/if}}
650
694
  {{/if}}
651
695
 
@@ -2,23 +2,23 @@
2
2
  import {
3
3
  BuildRunner,
4
4
  MergeManager
5
- } from "./chunk-EHAITKLS.js";
5
+ } from "./chunk-MPHSR6GA.js";
6
6
  import {
7
7
  installDependencies
8
8
  } from "./chunk-OLJ54WGW.js";
9
9
  import {
10
10
  GitWorktreeManager
11
- } from "./chunk-PPQ5LV7U.js";
11
+ } from "./chunk-D6FU4DLN.js";
12
12
  import "./chunk-772N5WCA.js";
13
13
  import "./chunk-K3QGG4O2.js";
14
14
  import "./chunk-DDHWZNGL.js";
15
15
  import {
16
16
  getWorktreeRoot,
17
17
  isValidGitRepo
18
- } from "./chunk-KGOBNC5A.js";
18
+ } from "./chunk-5W44AI63.js";
19
19
  import {
20
20
  SettingsManager
21
- } from "./chunk-F5NKWLMQ.js";
21
+ } from "./chunk-MNPKEWBQ.js";
22
22
  import "./chunk-XIVLGWUX.js";
23
23
  import "./chunk-FTYWGQFM.js";
24
24
  import {
@@ -148,4 +148,4 @@ export {
148
148
  RebaseCommand,
149
149
  WorktreeValidationError
150
150
  };
151
- //# sourceMappingURL=rebase-MLIN572O.js.map
151
+ //# sourceMappingURL=rebase-6AXN45AE.js.map
@@ -4,15 +4,15 @@ import {
4
4
  } from "./chunk-NXMDEL3F.js";
5
5
  import {
6
6
  findArchivedRecap
7
- } from "./chunk-E5OM25WK.js";
7
+ } from "./chunk-UQWMPQ2Q.js";
8
8
  import {
9
9
  IdentifierParser
10
- } from "./chunk-GQDVH6FA.js";
10
+ } from "./chunk-XC5JKRSH.js";
11
11
  import {
12
12
  GitWorktreeManager
13
- } from "./chunk-PPQ5LV7U.js";
14
- import "./chunk-KGOBNC5A.js";
15
- import "./chunk-F5NKWLMQ.js";
13
+ } from "./chunk-D6FU4DLN.js";
14
+ import "./chunk-5W44AI63.js";
15
+ import "./chunk-MNPKEWBQ.js";
16
16
  import "./chunk-XIVLGWUX.js";
17
17
  import "./chunk-FTYWGQFM.js";
18
18
  import "./chunk-VRPPI6GU.js";
@@ -135,4 +135,4 @@ var RecapCommand = class {
135
135
  export {
136
136
  RecapCommand
137
137
  };
138
- //# sourceMappingURL=recap-CKGKFDJL.js.map
138
+ //# sourceMappingURL=recap-XDKI3MTA.js.map