@iloom/cli 0.8.2 → 0.9.0

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 (160) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +50 -4
  3. package/dist/{BranchNamingService-AO7BPIUJ.js → BranchNamingService-K6XNWQ6C.js} +2 -2
  4. package/dist/ClaudeContextManager-X2Y72GRL.js +14 -0
  5. package/dist/ClaudeService-7P32TTES.js +13 -0
  6. package/dist/{LoomLauncher-NHZMEVTQ.js → LoomLauncher-3I47SUPV.js} +6 -6
  7. package/dist/{ProjectCapabilityDetector-IA56AUE6.js → ProjectCapabilityDetector-N5L7T4IY.js} +3 -3
  8. package/dist/PromptTemplateManager-36YLQRHP.js +11 -0
  9. package/dist/README.md +50 -4
  10. package/dist/{SettingsManager-VCVLL32H.js → SettingsManager-QR7V2IW2.js} +2 -2
  11. package/dist/agents/iloom-artifact-reviewer.md +280 -0
  12. package/dist/agents/iloom-code-reviewer.md +9 -7
  13. package/dist/agents/iloom-issue-analyze-and-plan.md +21 -6
  14. package/dist/agents/iloom-issue-analyzer.md +21 -6
  15. package/dist/agents/iloom-issue-complexity-evaluator.md +21 -6
  16. package/dist/agents/iloom-issue-enhancer.md +21 -6
  17. package/dist/agents/iloom-issue-implementer.md +21 -6
  18. package/dist/agents/iloom-issue-planner.md +21 -6
  19. package/dist/{build-Z3WCIKPD.js → build-IC4CJRMP.js} +8 -8
  20. package/dist/{chunk-TVH67KEO.js → chunk-2HZX6AMR.js} +2 -2
  21. package/dist/{chunk-VZYSM7N7.js → chunk-2JPXGGP4.js} +20 -15
  22. package/dist/chunk-2JPXGGP4.js.map +1 -0
  23. package/dist/{chunk-HSGZW3ID.js → chunk-4GAJJUYS.js} +3 -3
  24. package/dist/chunk-4GAJJUYS.js.map +1 -0
  25. package/dist/{chunk-RD7I2Q2F.js → chunk-4LKGCFGG.js} +2 -2
  26. package/dist/{chunk-SSASIBDJ.js → chunk-5LVVQGB3.js} +5 -5
  27. package/dist/{chunk-GWONJE3X.js → chunk-6Y3FTRJL.js} +189 -48
  28. package/dist/chunk-6Y3FTRJL.js.map +1 -0
  29. package/dist/{chunk-4BSXZ5YZ.js → chunk-B7U6OKUR.js} +5 -24
  30. package/dist/chunk-B7U6OKUR.js.map +1 -0
  31. package/dist/{chunk-IGKPPACU.js → chunk-FO5GGFOV.js} +17 -8
  32. package/dist/chunk-FO5GGFOV.js.map +1 -0
  33. package/dist/{chunk-GDS2HXSW.js → chunk-H6ST2TGP.js} +20 -3
  34. package/dist/chunk-H6ST2TGP.js.map +1 -0
  35. package/dist/{chunk-A7XHHUEV.js → chunk-HZXBHMVM.js} +47 -22
  36. package/dist/chunk-HZXBHMVM.js.map +1 -0
  37. package/dist/{chunk-44Y5IF7P.js → chunk-I23OQB4Y.js} +5 -5
  38. package/dist/chunk-JT5LZRMI.js +302 -0
  39. package/dist/chunk-JT5LZRMI.js.map +1 -0
  40. package/dist/{chunk-Q457PKGH.js → chunk-KAYXR544.js} +2 -2
  41. package/dist/{chunk-XU5A6BWA.js → chunk-MZPRBNYC.js} +4 -4
  42. package/dist/{chunk-XHNACIHO.js → chunk-NTTSUAVM.js} +2 -2
  43. package/dist/{chunk-PLI3JQWT.js → chunk-OAVJR4PM.js} +2 -2
  44. package/dist/{chunk-4KGRPHM6.js → chunk-PL2FDYEK.js} +2 -2
  45. package/dist/chunk-QN47QVBX.js +131 -0
  46. package/dist/chunk-QN47QVBX.js.map +1 -0
  47. package/dist/{chunk-3FC3VNEX.js → chunk-RD7OPXZK.js} +34 -8
  48. package/dist/chunk-RD7OPXZK.js.map +1 -0
  49. package/dist/{chunk-O6LECMT6.js → chunk-TGRK3CHF.js} +8 -8
  50. package/dist/{chunk-7GLZVDPQ.js → chunk-TL72BGP6.js} +2 -2
  51. package/dist/{chunk-52MVUK5V.js → chunk-USSL2X4A.js} +2 -2
  52. package/dist/chunk-USSL2X4A.js.map +1 -0
  53. package/dist/{chunk-XPKN3QWY.js → chunk-VOGGLPG5.js} +1 -2
  54. package/dist/{chunk-IWIIOFEB.js → chunk-XFEK2X2D.js} +16 -6
  55. package/dist/chunk-XFEK2X2D.js.map +1 -0
  56. package/dist/{chunk-PBSHQVCT.js → chunk-Z6F5CUS6.js} +4 -4
  57. package/dist/{claude-V4HRPR4Z.js → claude-TP2QO3BU.js} +2 -2
  58. package/dist/{cleanup-NWNKWPUY.js → cleanup-M6N7KV7E.js} +20 -15
  59. package/dist/{cleanup-NWNKWPUY.js.map → cleanup-M6N7KV7E.js.map} +1 -1
  60. package/dist/cli.js +118 -84
  61. package/dist/cli.js.map +1 -1
  62. package/dist/{commit-534QIRHY.js → commit-ORHR53KW.js} +10 -10
  63. package/dist/{compile-UANHMNTS.js → compile-EOWJORKO.js} +8 -8
  64. package/dist/{contribute-7USRBWRM.js → contribute-4KCEOHSH.js} +3 -3
  65. package/dist/{dev-server-TO7RLYJI.js → dev-server-Q6M62ATG.js} +13 -13
  66. package/dist/{feedback-7ZZI6RC5.js → feedback-XRI7SGYX.js} +11 -11
  67. package/dist/{git-GUNOPP4Q.js → git-W3XUIFTR.js} +5 -3
  68. package/dist/hooks/iloom-hook.js +5 -3
  69. package/dist/{ignite-5SIGOW5V.js → ignite-3FHQY23X.js} +90 -26
  70. package/dist/ignite-3FHQY23X.js.map +1 -0
  71. package/dist/index.d.ts +37 -2
  72. package/dist/index.js +49 -13
  73. package/dist/index.js.map +1 -1
  74. package/dist/{chunk-FPNSFP6K.js → init-ALYWKNWG.js} +42 -329
  75. package/dist/init-ALYWKNWG.js.map +1 -0
  76. package/dist/{lint-XPODLDVA.js → lint-IHUH45OC.js} +8 -8
  77. package/dist/{open-M2SUR74Y.js → open-KWOV2OFO.js} +15 -15
  78. package/dist/{plan-FB4AOJ2Q.js → plan-P6MXL7AU.js} +54 -22
  79. package/dist/plan-P6MXL7AU.js.map +1 -0
  80. package/dist/{projects-325GEEGJ.js → projects-LH362JZQ.js} +3 -3
  81. package/dist/prompts/init-prompt.txt +9 -1
  82. package/dist/prompts/issue-prompt.txt +315 -5
  83. package/dist/prompts/plan-prompt.txt +4 -6
  84. package/dist/prompts/pr-prompt.txt +79 -0
  85. package/dist/prompts/regular-prompt.txt +210 -5
  86. package/dist/{rebase-4FNRBW3H.js → rebase-AJOJOZUG.js} +9 -9
  87. package/dist/{recap-GSXFEOD6.js → recap-GKJXMDXW.js} +5 -5
  88. package/dist/{run-GZNHRJB2.js → run-QEUVZF7J.js} +15 -15
  89. package/dist/schema/settings.schema.json +9 -1
  90. package/dist/{shell-2SPM3Z5O.js → shell-DAAVG4YN.js} +5 -5
  91. package/dist/{summary-Z4F7YFXE.js → summary-WNEYCO4S.js} +11 -11
  92. package/dist/{test-LBSPYIJW.js → test-5GPWWO3P.js} +8 -8
  93. package/dist/{test-git-ZPSPA2TP.js → test-git-EJUKDB7F.js} +3 -3
  94. package/dist/{test-prefix-6DLB2BHE.js → test-prefix-23TOBUXY.js} +3 -3
  95. package/dist/{test-webserver-XLJ2TZFP.js → test-webserver-CKROHFBQ.js} +5 -5
  96. package/dist/{vscode-LH3VSQ2W.js → vscode-6TOLFCI2.js} +5 -5
  97. package/package.json +2 -2
  98. package/dist/ClaudeContextManager-RDP6CLK6.js +0 -14
  99. package/dist/ClaudeService-FKPOQRA4.js +0 -13
  100. package/dist/PRManager-A63LT3NF.js +0 -16
  101. package/dist/PromptTemplateManager-OUYDHOPI.js +0 -9
  102. package/dist/chunk-3FC3VNEX.js.map +0 -1
  103. package/dist/chunk-4BSXZ5YZ.js.map +0 -1
  104. package/dist/chunk-52MVUK5V.js.map +0 -1
  105. package/dist/chunk-66QOCD5N.js +0 -79
  106. package/dist/chunk-66QOCD5N.js.map +0 -1
  107. package/dist/chunk-A7XHHUEV.js.map +0 -1
  108. package/dist/chunk-FPNSFP6K.js.map +0 -1
  109. package/dist/chunk-GDS2HXSW.js.map +0 -1
  110. package/dist/chunk-GWONJE3X.js.map +0 -1
  111. package/dist/chunk-HSGZW3ID.js.map +0 -1
  112. package/dist/chunk-IGKPPACU.js.map +0 -1
  113. package/dist/chunk-IWIIOFEB.js.map +0 -1
  114. package/dist/chunk-VZYSM7N7.js.map +0 -1
  115. package/dist/git-GUNOPP4Q.js.map +0 -1
  116. package/dist/ignite-5SIGOW5V.js.map +0 -1
  117. package/dist/init-XXDIB2UJ.js +0 -21
  118. package/dist/init-XXDIB2UJ.js.map +0 -1
  119. package/dist/plan-FB4AOJ2Q.js.map +0 -1
  120. /package/dist/{BranchNamingService-AO7BPIUJ.js.map → BranchNamingService-K6XNWQ6C.js.map} +0 -0
  121. /package/dist/{ClaudeContextManager-RDP6CLK6.js.map → ClaudeContextManager-X2Y72GRL.js.map} +0 -0
  122. /package/dist/{ClaudeService-FKPOQRA4.js.map → ClaudeService-7P32TTES.js.map} +0 -0
  123. /package/dist/{LoomLauncher-NHZMEVTQ.js.map → LoomLauncher-3I47SUPV.js.map} +0 -0
  124. /package/dist/{PRManager-A63LT3NF.js.map → ProjectCapabilityDetector-N5L7T4IY.js.map} +0 -0
  125. /package/dist/{ProjectCapabilityDetector-IA56AUE6.js.map → PromptTemplateManager-36YLQRHP.js.map} +0 -0
  126. /package/dist/{PromptTemplateManager-OUYDHOPI.js.map → SettingsManager-QR7V2IW2.js.map} +0 -0
  127. /package/dist/{build-Z3WCIKPD.js.map → build-IC4CJRMP.js.map} +0 -0
  128. /package/dist/{chunk-TVH67KEO.js.map → chunk-2HZX6AMR.js.map} +0 -0
  129. /package/dist/{chunk-RD7I2Q2F.js.map → chunk-4LKGCFGG.js.map} +0 -0
  130. /package/dist/{chunk-SSASIBDJ.js.map → chunk-5LVVQGB3.js.map} +0 -0
  131. /package/dist/{chunk-44Y5IF7P.js.map → chunk-I23OQB4Y.js.map} +0 -0
  132. /package/dist/{chunk-Q457PKGH.js.map → chunk-KAYXR544.js.map} +0 -0
  133. /package/dist/{chunk-XU5A6BWA.js.map → chunk-MZPRBNYC.js.map} +0 -0
  134. /package/dist/{chunk-XHNACIHO.js.map → chunk-NTTSUAVM.js.map} +0 -0
  135. /package/dist/{chunk-PLI3JQWT.js.map → chunk-OAVJR4PM.js.map} +0 -0
  136. /package/dist/{chunk-4KGRPHM6.js.map → chunk-PL2FDYEK.js.map} +0 -0
  137. /package/dist/{chunk-O6LECMT6.js.map → chunk-TGRK3CHF.js.map} +0 -0
  138. /package/dist/{chunk-7GLZVDPQ.js.map → chunk-TL72BGP6.js.map} +0 -0
  139. /package/dist/{chunk-XPKN3QWY.js.map → chunk-VOGGLPG5.js.map} +0 -0
  140. /package/dist/{chunk-PBSHQVCT.js.map → chunk-Z6F5CUS6.js.map} +0 -0
  141. /package/dist/{SettingsManager-VCVLL32H.js.map → claude-TP2QO3BU.js.map} +0 -0
  142. /package/dist/{commit-534QIRHY.js.map → commit-ORHR53KW.js.map} +0 -0
  143. /package/dist/{compile-UANHMNTS.js.map → compile-EOWJORKO.js.map} +0 -0
  144. /package/dist/{contribute-7USRBWRM.js.map → contribute-4KCEOHSH.js.map} +0 -0
  145. /package/dist/{dev-server-TO7RLYJI.js.map → dev-server-Q6M62ATG.js.map} +0 -0
  146. /package/dist/{feedback-7ZZI6RC5.js.map → feedback-XRI7SGYX.js.map} +0 -0
  147. /package/dist/{claude-V4HRPR4Z.js.map → git-W3XUIFTR.js.map} +0 -0
  148. /package/dist/{lint-XPODLDVA.js.map → lint-IHUH45OC.js.map} +0 -0
  149. /package/dist/{open-M2SUR74Y.js.map → open-KWOV2OFO.js.map} +0 -0
  150. /package/dist/{projects-325GEEGJ.js.map → projects-LH362JZQ.js.map} +0 -0
  151. /package/dist/{rebase-4FNRBW3H.js.map → rebase-AJOJOZUG.js.map} +0 -0
  152. /package/dist/{recap-GSXFEOD6.js.map → recap-GKJXMDXW.js.map} +0 -0
  153. /package/dist/{run-GZNHRJB2.js.map → run-QEUVZF7J.js.map} +0 -0
  154. /package/dist/{shell-2SPM3Z5O.js.map → shell-DAAVG4YN.js.map} +0 -0
  155. /package/dist/{summary-Z4F7YFXE.js.map → summary-WNEYCO4S.js.map} +0 -0
  156. /package/dist/{test-LBSPYIJW.js.map → test-5GPWWO3P.js.map} +0 -0
  157. /package/dist/{test-git-ZPSPA2TP.js.map → test-git-EJUKDB7F.js.map} +0 -0
  158. /package/dist/{test-prefix-6DLB2BHE.js.map → test-prefix-23TOBUXY.js.map} +0 -0
  159. /package/dist/{test-webserver-XLJ2TZFP.js.map → test-webserver-CKROHFBQ.js.map} +0 -0
  160. /package/dist/{vscode-LH3VSQ2W.js.map → vscode-6TOLFCI2.js.map} +0 -0
@@ -6,6 +6,21 @@ color: pink
6
6
  model: opus
7
7
  ---
8
8
 
9
+ {{#if DRAFT_PR_MODE}}
10
+ ## Comment Routing: Draft PR Mode
11
+
12
+ **IMPORTANT: This loom is using draft PR mode.**
13
+
14
+ - **Read issue details** from Issue #{{ISSUE_NUMBER}} using `mcp__issue_management__get_issue`
15
+ - **Write ALL workflow comments** to PR #{{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}} using `type: "pr"`
16
+
17
+ Do NOT write comments to the issue - only to the draft PR.
18
+ {{else}}
19
+ ## Comment Routing: Standard Issue Mode
20
+
21
+ - **Read and write** to Issue #{{ISSUE_NUMBER}} using `type: "issue"`
22
+ {{/if}}
23
+
9
24
  You are Claude, an elite issue analyst specializing in deep technical investigation and root cause analysis. Your expertise lies in methodically researching codebases, identifying patterns, and documenting technical findings with surgical precision.
10
25
 
11
26
  **Your Core Mission**: Analyze issues to identify root causes and document key findings concisely. You research but you do not solve or propose solutions - your role is to provide the technical intelligence needed for informed decision-making.
@@ -298,8 +313,8 @@ Available Tools:
298
313
  Parameters: { commentId: string, number: string }
299
314
  Returns: { id, body, author, created_at, ... }
300
315
 
301
- {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}
302
- Parameters: { number: string, body: "markdown content", type: "pr" }{{/if}}{{#if STANDARD_ISSUE_MODE}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
316
+ {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}}
317
+ Parameters: { number: string, body: "markdown content", type: "pr" }{{else}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
303
318
  Parameters: { number: string, body: "markdown content", type: "issue" }{{/if}}
304
319
  Returns: { id: string, url: string, created_at: string }
305
320
 
@@ -324,10 +339,10 @@ Example Usage:
324
339
  ```
325
340
  // Start
326
341
  {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
327
- number: {{DRAFT_PR_NUMBER}},
342
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
328
343
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
329
344
  type: "pr"
330
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}const comment = await mcp__issue_management__create_comment({
345
+ }){{else}}const comment = await mcp__issue_management__create_comment({
331
346
  number: {{ISSUE_NUMBER}},
332
347
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
333
348
  type: "issue"
@@ -343,9 +358,9 @@ await mcp__recap__add_artifact({
343
358
  // Update as you progress
344
359
  {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
345
360
  commentId: comment.id,
346
- number: {{DRAFT_PR_NUMBER}},
361
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
347
362
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
348
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}await mcp__issue_management__update_comment({
363
+ }){{else}}await mcp__issue_management__update_comment({
349
364
  commentId: comment.id,
350
365
  number: {{ISSUE_NUMBER}},
351
366
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -6,6 +6,21 @@ color: orange
6
6
  model: haiku
7
7
  ---
8
8
 
9
+ {{#if DRAFT_PR_MODE}}
10
+ ## Comment Routing: Draft PR Mode
11
+
12
+ **IMPORTANT: This loom is using draft PR mode.**
13
+
14
+ - **Read issue details** from Issue #{{ISSUE_NUMBER}} using `mcp__issue_management__get_issue`
15
+ - **Write ALL workflow comments** to PR #{{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}} using `type: "pr"`
16
+
17
+ Do NOT write comments to the issue - only to the draft PR.
18
+ {{else}}
19
+ ## Comment Routing: Standard Issue Mode
20
+
21
+ - **Read and write** to Issue #{{ISSUE_NUMBER}} using `type: "issue"`
22
+ {{/if}}
23
+
9
24
  You are Claude, an AI assistant specialized in rapid complexity assessment for issues. Your role is to perform a quick evaluation to determine whether an issue should follow a TRIVIAL, SIMPLE, or COMPLEX workflow.
10
25
 
11
26
  **Your Core Mission**: Perform a fast, deterministic complexity assessment (NOT deep analysis) to route the issue to the appropriate workflow. Speed and accuracy are both critical.
@@ -201,8 +216,8 @@ Available Tools:
201
216
  Parameters: { commentId: string, number: string }
202
217
  Returns: { id, body, author, created_at, ... }
203
218
 
204
- {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}
205
- Parameters: { number: string, body: "markdown content", type: "pr" }{{/if}}{{#if STANDARD_ISSUE_MODE}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
219
+ {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}}
220
+ Parameters: { number: string, body: "markdown content", type: "pr" }{{else}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
206
221
  Parameters: { number: string, body: "markdown content", type: "issue" }{{/if}}
207
222
  Returns: { id: string, url: string, created_at: string }
208
223
 
@@ -228,10 +243,10 @@ Example Usage:
228
243
  ```
229
244
  // Start
230
245
  {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
231
- number: {{DRAFT_PR_NUMBER}},
246
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
232
247
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
233
248
  type: "pr"
234
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}const comment = await mcp__issue_management__create_comment({
249
+ }){{else}}const comment = await mcp__issue_management__create_comment({
235
250
  number: {{ISSUE_NUMBER}},
236
251
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
237
252
  type: "issue"
@@ -247,9 +262,9 @@ await mcp__recap__add_artifact({
247
262
  // Update as you progress
248
263
  {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
249
264
  commentId: comment.id,
250
- number: {{DRAFT_PR_NUMBER}},
265
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
251
266
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
252
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}await mcp__issue_management__update_comment({
267
+ }){{else}}await mcp__issue_management__update_comment({
253
268
  commentId: comment.id,
254
269
  number: {{ISSUE_NUMBER}},
255
270
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -6,6 +6,21 @@ color: purple
6
6
  model: opus
7
7
  ---
8
8
 
9
+ {{#if DRAFT_PR_MODE}}
10
+ ## Comment Routing: Draft PR Mode
11
+
12
+ **IMPORTANT: This loom is using draft PR mode.**
13
+
14
+ - **Read issue details** from Issue #{{ISSUE_NUMBER}} using `mcp__issue_management__get_issue`
15
+ - **Write ALL workflow comments** to PR #{{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}} using `type: "pr"`
16
+
17
+ Do NOT write comments to the issue - only to the draft PR.
18
+ {{else}}
19
+ ## Comment Routing: Standard Issue Mode
20
+
21
+ - **Read and write** to Issue #{{ISSUE_NUMBER}} using `type: "issue"`
22
+ {{/if}}
23
+
9
24
  You are Claude, an elite Product Manager specializing in bug and enhancement report analysis. Your expertise lies in understanding user experiences, structuring problem statements, and creating clear specifications that enable development teams to work autonomously.
10
25
 
11
26
  **Your Core Mission**: Analyze bug reports and enhancement requests from a user's perspective, creating structured specifications that clarify the problem without diving into technical implementation or code analysis.
@@ -103,8 +118,8 @@ Available Tools:
103
118
  Parameters: { commentId: string, number: string }
104
119
  Returns: { id, body, author, created_at, ... }
105
120
 
106
- {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}
107
- Parameters: { number: string, body: "markdown content", type: "pr" }{{/if}}{{#if STANDARD_ISSUE_MODE}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
121
+ {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}}
122
+ Parameters: { number: string, body: "markdown content", type: "pr" }{{else}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
108
123
  Parameters: { number: string, body: "markdown content", type: "issue" }{{/if}}
109
124
  Returns: { id: string, url: string, created_at: string }
110
125
 
@@ -130,10 +145,10 @@ Example Usage:
130
145
  ```
131
146
  // Start
132
147
  {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
133
- number: {{DRAFT_PR_NUMBER}},
148
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
134
149
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
135
150
  type: "pr"
136
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}const comment = await mcp__issue_management__create_comment({
151
+ }){{else}}const comment = await mcp__issue_management__create_comment({
137
152
  number: {{ISSUE_NUMBER}},
138
153
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
139
154
  type: "issue"
@@ -149,9 +164,9 @@ await mcp__recap__add_artifact({
149
164
  // Update as you progress
150
165
  {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
151
166
  commentId: comment.id,
152
- number: {{DRAFT_PR_NUMBER}},
167
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
153
168
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
154
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}await mcp__issue_management__update_comment({
169
+ }){{else}}await mcp__issue_management__update_comment({
155
170
  commentId: comment.id,
156
171
  number: {{ISSUE_NUMBER}},
157
172
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -6,6 +6,21 @@ model: opus
6
6
  color: green
7
7
  ---
8
8
 
9
+ {{#if DRAFT_PR_MODE}}
10
+ ## Comment Routing: Draft PR Mode
11
+
12
+ **IMPORTANT: This loom is using draft PR mode.**
13
+
14
+ - **Read issue details** from Issue #{{ISSUE_NUMBER}} using `mcp__issue_management__get_issue`
15
+ - **Write ALL workflow comments** to PR #{{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}} using `type: "pr"`
16
+
17
+ Do NOT write comments to the issue - only to the draft PR.
18
+ {{else}}
19
+ ## Comment Routing: Standard Issue Mode
20
+
21
+ - **Read and write** to Issue #{{ISSUE_NUMBER}} using `type: "issue"`
22
+ {{/if}}
23
+
9
24
  You are Claude, an AI assistant specialized in implementing issues with absolute precision and adherence to specifications. You are currently using the 'opus' model - if you are not, you must immediately notify the user and stop. Ultrathink to perform as described below.
10
25
 
11
26
  ## Loom Recap
@@ -27,8 +42,8 @@ Available Tools:
27
42
  Parameters: { commentId: string, number: string }
28
43
  Returns: { id, body, author, created_at, ... }
29
44
 
30
- {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}
31
- Parameters: { number: string, body: "markdown content", type: "pr" }{{/if}}{{#if STANDARD_ISSUE_MODE}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
45
+ {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}}
46
+ Parameters: { number: string, body: "markdown content", type: "pr" }{{else}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
32
47
  Parameters: { number: string, body: "markdown content", type: "issue" }{{/if}}
33
48
  Returns: { id: string, url: string, created_at: string }
34
49
 
@@ -69,10 +84,10 @@ Example Usage:
69
84
  ```
70
85
  // Start
71
86
  {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
72
- number: {{DRAFT_PR_NUMBER}},
87
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
73
88
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
74
89
  type: "pr"
75
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}const comment = await mcp__issue_management__create_comment({
90
+ }){{else}}const comment = await mcp__issue_management__create_comment({
76
91
  number: {{ISSUE_NUMBER}},
77
92
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
78
93
  type: "issue"
@@ -88,9 +103,9 @@ await mcp__recap__add_artifact({
88
103
  // Update as you progress
89
104
  {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
90
105
  commentId: comment.id,
91
- number: {{DRAFT_PR_NUMBER}},
106
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
92
107
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
93
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}await mcp__issue_management__update_comment({
108
+ }){{else}}await mcp__issue_management__update_comment({
94
109
  commentId: comment.id,
95
110
  number: {{ISSUE_NUMBER}},
96
111
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -6,6 +6,21 @@ color: blue
6
6
  model: opus
7
7
  ---
8
8
 
9
+ {{#if DRAFT_PR_MODE}}
10
+ ## Comment Routing: Draft PR Mode
11
+
12
+ **IMPORTANT: This loom is using draft PR mode.**
13
+
14
+ - **Read issue details** from Issue #{{ISSUE_NUMBER}} using `mcp__issue_management__get_issue`
15
+ - **Write ALL workflow comments** to PR #{{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}} using `type: "pr"`
16
+
17
+ Do NOT write comments to the issue - only to the draft PR.
18
+ {{else}}
19
+ ## Comment Routing: Standard Issue Mode
20
+
21
+ - **Read and write** to Issue #{{ISSUE_NUMBER}} using `type: "issue"`
22
+ {{/if}}
23
+
9
24
  You are Claude, an AI assistant designed to excel at analyzing issues and creating detailed implementation plans. Analyze the context and respond with precision and thoroughness. Think harder as you execute your tasks.
10
25
 
11
26
  ## Loom Recap
@@ -43,8 +58,8 @@ Available Tools:
43
58
  Parameters: { commentId: string, number: string }
44
59
  Returns: { id, body, author, created_at, ... }
45
60
 
46
- {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}
47
- Parameters: { number: string, body: "markdown content", type: "pr" }{{/if}}{{#if STANDARD_ISSUE_MODE}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
61
+ {{#if DRAFT_PR_MODE}}- mcp__issue_management__create_comment: Create a new comment on PR {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}[PR NUMBER MISSING]{{/unless}}
62
+ Parameters: { number: string, body: "markdown content", type: "pr" }{{else}}- mcp__issue_management__create_comment: Create a new comment on issue {{ISSUE_NUMBER}}
48
63
  Parameters: { number: string, body: "markdown content", type: "issue" }{{/if}}
49
64
  Returns: { id: string, url: string, created_at: string }
50
65
 
@@ -69,10 +84,10 @@ Example Usage:
69
84
  ```
70
85
  // Start
71
86
  {{#if DRAFT_PR_MODE}}const comment = await mcp__issue_management__create_comment({
72
- number: {{DRAFT_PR_NUMBER}},
87
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
73
88
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
74
89
  type: "pr"
75
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}const comment = await mcp__issue_management__create_comment({
90
+ }){{else}}const comment = await mcp__issue_management__create_comment({
76
91
  number: {{ISSUE_NUMBER}},
77
92
  body: "# Analysis Phase\n\n- [ ] Fetch issue details\n- [ ] Analyze requirements",
78
93
  type: "issue"
@@ -88,9 +103,9 @@ await mcp__recap__add_artifact({
88
103
  // Update as you progress
89
104
  {{#if DRAFT_PR_MODE}}await mcp__issue_management__update_comment({
90
105
  commentId: comment.id,
91
- number: {{DRAFT_PR_NUMBER}},
106
+ number: {{DRAFT_PR_NUMBER}}{{#unless DRAFT_PR_NUMBER}}/* PR NUMBER MISSING */{{/unless}},
92
107
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
93
- }){{/if}}{{#if STANDARD_ISSUE_MODE}}await mcp__issue_management__update_comment({
108
+ }){{else}}await mcp__issue_management__update_comment({
94
109
  commentId: comment.id,
95
110
  number: {{ISSUE_NUMBER}},
96
111
  body: "# Analysis Phase\n\n- [x] Fetch issue details\n- [ ] Analyze requirements"
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ScriptCommandBase
4
- } from "./chunk-O6LECMT6.js";
5
- import "./chunk-RD7I2Q2F.js";
6
- import "./chunk-TVH67KEO.js";
7
- import "./chunk-HSGZW3ID.js";
8
- import "./chunk-XPKN3QWY.js";
9
- import "./chunk-GDS2HXSW.js";
10
- import "./chunk-IWIIOFEB.js";
4
+ } from "./chunk-TGRK3CHF.js";
5
+ import "./chunk-2HZX6AMR.js";
6
+ import "./chunk-4LKGCFGG.js";
7
+ import "./chunk-4GAJJUYS.js";
8
+ import "./chunk-VOGGLPG5.js";
9
+ import "./chunk-H6ST2TGP.js";
10
+ import "./chunk-XFEK2X2D.js";
11
11
  import "./chunk-KBEIQP4G.js";
12
12
  import "./chunk-6MLEBAYZ.js";
13
13
  import "./chunk-VT4PDUYT.js";
@@ -24,4 +24,4 @@ var BuildCommand = class extends ScriptCommandBase {
24
24
  export {
25
25
  BuildCommand
26
26
  };
27
- //# sourceMappingURL=build-Z3WCIKPD.js.map
27
+ //# sourceMappingURL=build-IC4CJRMP.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  extractIssueNumber,
4
4
  extractPRNumber
5
- } from "./chunk-GDS2HXSW.js";
5
+ } from "./chunk-H6ST2TGP.js";
6
6
 
7
7
  // src/utils/IdentifierParser.ts
8
8
  function matchIssueIdentifier(input) {
@@ -108,4 +108,4 @@ export {
108
108
  matchIssueIdentifier,
109
109
  IdentifierParser
110
110
  };
111
- //# sourceMappingURL=chunk-TVH67KEO.js.map
111
+ //# sourceMappingURL=chunk-2HZX6AMR.js.map
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ProcessManager
4
- } from "./chunk-XHNACIHO.js";
4
+ } from "./chunk-NTTSUAVM.js";
5
5
  import {
6
6
  detectPackageManager,
7
7
  runScript
8
- } from "./chunk-RD7I2Q2F.js";
8
+ } from "./chunk-4LKGCFGG.js";
9
9
  import {
10
- readPackageJson
11
- } from "./chunk-XPKN3QWY.js";
10
+ getPackageScripts
11
+ } from "./chunk-VOGGLPG5.js";
12
12
  import {
13
13
  logger
14
14
  } from "./chunk-VT4PDUYT.js";
@@ -40,12 +40,23 @@ async function buildDevServerCommand(workspacePath) {
40
40
  }
41
41
 
42
42
  // src/lib/DevServerManager.ts
43
+ var DEFAULT_STARTUP_TIMEOUT = 18e4;
44
+ function getStartupTimeout() {
45
+ const envTimeout = process.env.ILOOM_DEV_SERVER_TIMEOUT;
46
+ if (envTimeout) {
47
+ const parsed = parseInt(envTimeout, 10);
48
+ if (!isNaN(parsed) && parsed > 0) {
49
+ return parsed;
50
+ }
51
+ }
52
+ return DEFAULT_STARTUP_TIMEOUT;
53
+ }
43
54
  var DevServerManager = class {
44
55
  constructor(processManager, options = {}) {
45
56
  this.runningServers = /* @__PURE__ */ new Map();
46
57
  this.processManager = processManager ?? new ProcessManager();
47
58
  this.options = {
48
- startupTimeout: options.startupTimeout ?? 3e4,
59
+ startupTimeout: options.startupTimeout ?? getStartupTimeout(),
49
60
  checkInterval: options.checkInterval ?? 1e3
50
61
  };
51
62
  }
@@ -81,15 +92,9 @@ var DevServerManager = class {
81
92
  * Start dev server in background and wait for it to be ready
82
93
  */
83
94
  async startDevServer(worktreePath, port) {
84
- var _a;
85
- try {
86
- const packageJson = await readPackageJson(worktreePath);
87
- if (!((_a = packageJson.scripts) == null ? void 0 : _a["dev"])) {
88
- logger.warn('Skipping auto-start: no "dev" script found in package.json');
89
- return;
90
- }
91
- } catch {
92
- logger.debug("Skipping auto-start: no package.json found");
95
+ const scripts = await getPackageScripts(worktreePath);
96
+ if (!scripts["dev"]) {
97
+ logger.warn('Skipping auto-start: no "dev" script found in package.json or package.iloom.json');
93
98
  return;
94
99
  }
95
100
  const devCommand = await buildDevServerCommand(worktreePath);
@@ -212,4 +217,4 @@ var DevServerManager = class {
212
217
  export {
213
218
  DevServerManager
214
219
  };
215
- //# sourceMappingURL=chunk-VZYSM7N7.js.map
220
+ //# sourceMappingURL=chunk-2JPXGGP4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/DevServerManager.ts","../src/utils/dev-server.ts"],"sourcesContent":["import { execa, type ExecaChildProcess } from 'execa'\nimport { setTimeout } from 'timers/promises'\nimport { ProcessManager } from './process/ProcessManager.js'\nimport { buildDevServerCommand } from '../utils/dev-server.js'\nimport { runScript } from '../utils/package-manager.js'\nimport { getPackageScripts } from '../utils/package-json.js'\nimport { logger } from '../utils/logger.js'\n\n/**\n * Default startup timeout in milliseconds (180 seconds)\n * Can be overridden via ILOOM_DEV_SERVER_TIMEOUT environment variable\n */\nconst DEFAULT_STARTUP_TIMEOUT = 180000\n\nfunction getStartupTimeout(): number {\n\tconst envTimeout = process.env.ILOOM_DEV_SERVER_TIMEOUT\n\tif (envTimeout) {\n\t\tconst parsed = parseInt(envTimeout, 10)\n\t\tif (!isNaN(parsed) && parsed > 0) {\n\t\t\treturn parsed\n\t\t}\n\t}\n\treturn DEFAULT_STARTUP_TIMEOUT\n}\n\nexport interface DevServerManagerOptions {\n\t/**\n\t * Maximum time to wait for server to start (in milliseconds)\n\t * Default: 180000 (180 seconds)\n\t * Can be overridden via ILOOM_DEV_SERVER_TIMEOUT environment variable\n\t */\n\tstartupTimeout?: number\n\n\t/**\n\t * Interval between port checks (in milliseconds)\n\t * Default: 1000 (1 second)\n\t */\n\tcheckInterval?: number\n}\n\n/**\n * DevServerManager handles auto-starting and monitoring dev servers\n * Used by open/run commands to ensure dev server is running before opening browser\n */\nexport class DevServerManager {\n\tprivate readonly processManager: ProcessManager\n\tprivate readonly options: Required<DevServerManagerOptions>\n\tprivate runningServers: Map<number, ExecaChildProcess> = new Map()\n\n\tconstructor(\n\t\tprocessManager?: ProcessManager,\n\t\toptions: DevServerManagerOptions = {}\n\t) {\n\t\tthis.processManager = processManager ?? new ProcessManager()\n\t\tthis.options = {\n\t\t\tstartupTimeout: options.startupTimeout ?? getStartupTimeout(),\n\t\t\tcheckInterval: options.checkInterval ?? 1000,\n\t\t}\n\t}\n\n\t/**\n\t * Ensure dev server is running on the specified port\n\t * If not running, start it and wait for it to be ready\n\t *\n\t * @param worktreePath - Path to the worktree\n\t * @param port - Port the server should run on\n\t * @returns true if server is ready, false if startup failed/timed out\n\t */\n\tasync ensureServerRunning(worktreePath: string, port: number): Promise<boolean> {\n\t\tlogger.debug(`Checking if dev server is running on port ${port}...`)\n\n\t\t// Check if already running\n\t\tconst existingProcess = await this.processManager.detectDevServer(port)\n\t\tif (existingProcess) {\n\t\t\tlogger.debug(\n\t\t\t\t`Dev server already running on port ${port} (PID: ${existingProcess.pid})`\n\t\t\t)\n\t\t\treturn true\n\t\t}\n\n\t\t// Not running - start it\n\t\tlogger.info(`Dev server not running on port ${port}, starting...`)\n\n\t\ttry {\n\t\t\tawait this.startDevServer(worktreePath, port)\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t`Failed to start dev server: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t)\n\t\t\treturn false\n\t\t}\n\t}\n\n\t/**\n\t * Start dev server in background and wait for it to be ready\n\t */\n\tprivate async startDevServer(worktreePath: string, port: number): Promise<void> {\n\t\t// Guard: Check if a dev script exists in package.json or package.iloom.json\n\t\tconst scripts = await getPackageScripts(worktreePath)\n\t\tif (!scripts['dev']) {\n\t\t\tlogger.warn('Skipping auto-start: no \"dev\" script found in package.json or package.iloom.json')\n\t\t\treturn\n\t\t}\n\n\t\t// Build dev server command\n\t\tconst devCommand = await buildDevServerCommand(worktreePath)\n\t\tlogger.debug(`Starting dev server with command: ${devCommand}`)\n\n\t\t// Start server in background\n\t\tconst serverProcess = execa('sh', ['-c', devCommand], {\n\t\t\tcwd: worktreePath,\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\tPORT: port.toString(),\n\t\t\t},\n\t\t\t// Important: Don't inherit stdio - server runs in background\n\t\t\tstdio: 'ignore',\n\t\t\t// Detach from parent process so it continues running\n\t\t\tdetached: true,\n\t\t})\n\n\t\t// Store reference to prevent cleanup\n\t\tthis.runningServers.set(port, serverProcess)\n\n\t\t// Unref so parent can exit\n\t\tserverProcess.unref()\n\n\t\t// Wait for server to be ready\n\t\tlogger.info(`Waiting for dev server to start on port ${port}...`)\n\t\tconst ready = await this.waitForServerReady(port)\n\n\t\tif (!ready) {\n\t\t\tthrow new Error(\n\t\t\t\t`Dev server failed to start within ${this.options.startupTimeout}ms timeout`\n\t\t\t)\n\t\t}\n\n\t\tlogger.success(`Dev server started successfully on port ${port}`)\n\t}\n\n\t/**\n\t * Wait for server to be ready by polling the port\n\t */\n\tprivate async waitForServerReady(port: number): Promise<boolean> {\n\t\tconst startTime = Date.now()\n\t\tlet attempts = 0\n\n\t\twhile (Date.now() - startTime < this.options.startupTimeout) {\n\t\t\tattempts++\n\n\t\t\t// Check if server is listening\n\t\t\tconst processInfo = await this.processManager.detectDevServer(port)\n\n\t\t\tif (processInfo) {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`Server detected on port ${port} after ${attempts} attempts (${Date.now() - startTime}ms)`\n\t\t\t\t)\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Wait before next check\n\t\t\tawait setTimeout(this.options.checkInterval)\n\t\t}\n\n\t\t// Timeout\n\t\tlogger.warn(\n\t\t\t`Server did not start on port ${port} after ${this.options.startupTimeout}ms (${attempts} attempts)`\n\t\t)\n\t\treturn false\n\t}\n\n\t/**\n\t * Check if a dev server is running on the specified port\n\t *\n\t * @param port - Port to check\n\t * @returns true if server is running, false otherwise\n\t */\n\tasync isServerRunning(port: number): Promise<boolean> {\n\t\tconst existingProcess = await this.processManager.detectDevServer(port)\n\t\treturn existingProcess !== null\n\t}\n\n\t/**\n\t * Run dev server in foreground mode (blocking)\n\t * This method blocks until the server is stopped (e.g., via Ctrl+C)\n\t *\n\t * @param worktreePath - Path to the worktree\n\t * @param port - Port the server should run on\n\t * @param redirectToStderr - If true, redirect stdout/stderr to stderr (useful for JSON output)\n\t * @param onProcessStarted - Callback called immediately after process starts with PID\n\t * @returns Process information including PID\n\t */\n\tasync runServerForeground(\n\t\tworktreePath: string,\n\t\tport: number,\n\t\tredirectToStderr = false,\n\t\tonProcessStarted?: (pid?: number) => void,\n\t\tenvOverrides?: Record<string, string>\n\t): Promise<{ pid?: number }> {\n\t\tlogger.debug(`Starting dev server in foreground on port ${port}`)\n\n\t\t// Use runScript for foreground mode to support multi-language projects\n\t\t// Note: redirectToStderr is handled via custom execa call when needed\n\t\tif (redirectToStderr) {\n\t\t\t// For redirectToStderr, we still need direct execa control for custom stdio\n\t\t\tconst devCommand = await buildDevServerCommand(worktreePath)\n\t\t\tlogger.debug(`Starting dev server with command: ${devCommand}`)\n\n\t\t\tconst serverProcess = execa('sh', ['-c', devCommand], {\n\t\t\t\tcwd: worktreePath,\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\t...envOverrides,\n\t\t\t\t\tPORT: port.toString(),\n\t\t\t\t},\n\t\t\t\tstdio: [process.stdin, process.stderr, process.stderr],\n\t\t\t})\n\n\t\t\tconst processInfo: { pid?: number } = serverProcess.pid !== undefined ? { pid: serverProcess.pid } : {}\n\n\t\t\tif (onProcessStarted) {\n\t\t\t\tonProcessStarted(processInfo.pid)\n\t\t\t}\n\n\t\t\tawait serverProcess\n\t\t\treturn processInfo\n\t\t}\n\n\t\t// Use runScript for standard foreground mode\n\t\treturn await runScript('dev', worktreePath, [], {\n\t\t\tenv: {\n\t\t\t\t...envOverrides,\n\t\t\t\tPORT: port.toString(),\n\t\t\t},\n\t\t\tforeground: true,\n\t\t\t...(onProcessStarted && { onStart: onProcessStarted }),\n\t\t\tnoCi: true, // Dev servers should not have CI=true\n\t\t})\n\t}\n\n\t/**\n\t * Clean up all running server processes\n\t * This should be called when the manager is being disposed\n\t */\n\tasync cleanup(): Promise<void> {\n\t\tfor (const [port, serverProcess] of this.runningServers.entries()) {\n\t\t\ttry {\n\t\t\t\tlogger.debug(`Cleaning up server process on port ${port}`)\n\t\t\t\tserverProcess.kill()\n\t\t\t} catch (error) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Failed to kill server process on port ${port}: ${error instanceof Error ? error.message : 'Unknown error'}`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tthis.runningServers.clear()\n\t}\n}\n","import { detectPackageManager } from './package-manager.js'\nimport { logger } from './logger.js'\nimport type { Capability } from '../types/loom.js'\n\n/**\n * Build dev server command for workspace\n * Detects package manager and constructs appropriate command\n */\nexport async function buildDevServerCommand(\n\tworkspacePath: string\n): Promise<string> {\n\tconst packageManager = await detectPackageManager(workspacePath)\n\n\tlet devCommand: string\n\n\tswitch (packageManager) {\n\t\tcase 'pnpm':\n\t\t\tdevCommand = 'pnpm dev'\n\t\t\tbreak\n\t\tcase 'npm':\n\t\t\tdevCommand = 'npm run dev'\n\t\t\tbreak\n\t\tcase 'yarn':\n\t\t\tdevCommand = 'yarn dev'\n\t\t\tbreak\n\t\tdefault:\n\t\t\t// Fallback to npm (handles bun and other package managers)\n\t\t\tlogger.warn(`Unknown or unsupported package manager: ${packageManager}, defaulting to npm`)\n\t\t\tdevCommand = 'npm run dev'\n\t}\n\n\tlogger.debug(`Dev server command: ${devCommand}`)\n\treturn devCommand\n}\n\n/**\n * Build complete dev server launch command for terminal\n * Includes VSCode launch, echo message (only for web projects), and dev server start\n */\nexport async function getDevServerLaunchCommand(\n\tworkspacePath: string,\n\tport?: number,\n\tcapabilities: Capability[] = []\n): Promise<string> {\n\tconst devCommand = await buildDevServerCommand(workspacePath)\n\n\tconst commands: string[] = []\n\n\t// // Open VSCode\n\t// commands.push('code .')\n\n\t// Echo message (only for web projects)\n\tif (capabilities.includes('web')) {\n\t\tif (port !== undefined) {\n\t\t\tcommands.push(`echo 'Starting dev server on PORT=${port}...'`)\n\t\t} else {\n\t\t\tcommands.push(`echo 'Starting dev server...'`)\n\t\t}\n\t}\n\n\t// Start dev server\n\tcommands.push(devCommand)\n\n\treturn commands.join(' && ')\n}\n"],"mappings":"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","names":[]}
@@ -11,7 +11,7 @@ import {
11
11
  isPRBranch,
12
12
  isValidGitRepo,
13
13
  parseWorktreeList
14
- } from "./chunk-GDS2HXSW.js";
14
+ } from "./chunk-H6ST2TGP.js";
15
15
  import {
16
16
  getLogger
17
17
  } from "./chunk-6MLEBAYZ.js";
@@ -104,7 +104,7 @@ var GitWorktreeManager = class {
104
104
  } else if (options.baseBranch) {
105
105
  args.push(options.baseBranch);
106
106
  }
107
- await executeGitCommand(args, { cwd: this._workingDirectory });
107
+ await executeGitCommand(args, { cwd: this._workingDirectory, timeout: 3e5 });
108
108
  return absolutePath;
109
109
  }
110
110
  /**
@@ -388,4 +388,4 @@ var GitWorktreeManager = class {
388
388
  export {
389
389
  GitWorktreeManager
390
390
  };
391
- //# sourceMappingURL=chunk-HSGZW3ID.js.map
391
+ //# sourceMappingURL=chunk-4GAJJUYS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/GitWorktreeManager.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\nimport {\n type GitWorktree,\n type WorktreeCreateOptions,\n type WorktreeListOptions,\n type WorktreeValidation,\n type WorktreeStatus,\n type WorktreeCleanupOptions,\n} from '../types/worktree.js'\nimport {\n executeGitCommand,\n parseWorktreeList,\n isPRBranch,\n extractPRNumber,\n generateWorktreePath,\n isValidGitRepo,\n getCurrentBranch,\n getRepoRoot,\n hasUncommittedChanges,\n getDefaultBranch,\n findMainWorktreePathWithSettings,\n} from '../utils/git.js'\nimport { getLogger } from '../utils/logger-context.js'\nimport type { SettingsManager } from './SettingsManager.js'\n\n/**\n * Manages Git worktrees for the iloom CLI\n * Ports functionality from bash scripts into TypeScript\n */\nexport class GitWorktreeManager {\n private readonly _workingDirectory: string\n\n constructor(workingDirectory: string = process.cwd()) {\n this._workingDirectory = workingDirectory\n }\n\n /**\n * Get the working directory for git operations (main worktree path)\n */\n get workingDirectory(): string {\n return this._workingDirectory\n }\n\n /**\n * List all worktrees in the repository\n * Defaults to porcelain format for reliable machine parsing\n * Equivalent to: git worktree list --porcelain\n */\n async listWorktrees(options: WorktreeListOptions = {}): Promise<GitWorktree[]> {\n const args = ['worktree', 'list']\n // Default to porcelain format for consistent parsing (can be disabled with porcelain: false)\n if (options.porcelain !== false) args.push('--porcelain')\n if (options.verbose) args.push('-v')\n\n const output = await executeGitCommand(args, { cwd: this._workingDirectory })\n return parseWorktreeList(output)\n }\n\n /**\n * Find worktree for a specific branch\n * Ports: find_worktree_for_branch() from find-worktree-for-branch.sh\n */\n async findWorktreeForBranch(branchName: string): Promise<GitWorktree | null> {\n const worktrees = await this.listWorktrees()\n return worktrees.find(wt => wt.branch === branchName) ?? null\n }\n\n /**\n * Check if a worktree is the main repository worktree\n * Uses findMainWorktreePathWithSettings to determine the main worktree based on settings.\n *\n * @param worktree - The worktree to check\n * @param settingsManager - SettingsManager instance for loading settings\n * @returns true if the worktree is the main worktree\n */\n async isMainWorktree(worktree: GitWorktree, settingsManager: SettingsManager): Promise<boolean> {\n const mainWorktreePath = await findMainWorktreePathWithSettings(worktree.path, settingsManager)\n return worktree.path === mainWorktreePath\n }\n\n /**\n * Check if a worktree is a PR worktree based on naming patterns\n * Ports: is_pr_worktree() from worktree-utils.sh\n */\n isPRWorktree(worktree: GitWorktree): boolean {\n return isPRBranch(worktree.branch)\n }\n\n /**\n * Get PR number from worktree branch name\n * Ports: get_pr_number_from_worktree() from worktree-utils.sh\n */\n getPRNumberFromWorktree(worktree: GitWorktree): number | null {\n return extractPRNumber(worktree.branch)\n }\n\n /**\n * Create a new worktree\n * Ports worktree creation logic from new-branch-workflow.sh\n * @returns The absolute path to the created worktree\n */\n async createWorktree(options: WorktreeCreateOptions): Promise<string> {\n // Validate inputs\n if (!options.branch) {\n throw new Error('Branch name is required')\n }\n\n // Ensure path is absolute\n const absolutePath = path.resolve(options.path)\n\n // Check if path already exists and handle force flag\n if (await fs.pathExists(absolutePath)) {\n if (!options.force) {\n throw new Error(`Path already exists: ${absolutePath}`)\n }\n // Remove existing directory if force is true\n await fs.remove(absolutePath)\n }\n\n // Build git worktree add command\n const args = ['worktree', 'add']\n\n if (options.createBranch) {\n args.push('-b', options.branch)\n }\n\n if (options.force) {\n args.push('--force')\n }\n\n args.push(absolutePath)\n\n // Add branch name if not creating new branch\n if (!options.createBranch) {\n args.push(options.branch)\n } else if (options.baseBranch) {\n args.push(options.baseBranch)\n }\n\n // 5 minute timeout for repos with LFS that need to download large files\n await executeGitCommand(args, { cwd: this._workingDirectory, timeout: 300000 })\n return absolutePath\n }\n\n /**\n * Remove a worktree and optionally clean up associated files\n * Ports worktree removal logic from cleanup-worktree.sh\n * @returns A message describing what was done (for dry-run mode)\n */\n async removeWorktree(\n worktreePath: string,\n options: WorktreeCleanupOptions = {}\n ): Promise<string | void> {\n // Validate worktree exists - use porcelain format for consistent parsing\n const worktrees = await this.listWorktrees({ porcelain: true })\n const worktree = worktrees.find(wt => wt.path === worktreePath)\n\n if (!worktree) {\n // Add debug logging to help diagnose the issue\n getLogger().debug(`Looking for worktree path: ${worktreePath}`)\n getLogger().debug(`Found ${worktrees.length} worktrees:`)\n worktrees.forEach((wt, i) => {\n getLogger().debug(` ${i}: path=\"${wt.path}\", branch=\"${wt.branch}\"`)\n })\n throw new Error(`Worktree not found: ${worktreePath}`)\n }\n\n // Check for uncommitted changes unless force is specified\n if (!options.force && !options.dryRun) {\n const hasChanges = await hasUncommittedChanges(worktreePath)\n if (hasChanges) {\n throw new Error(`Worktree has uncommitted changes: ${worktreePath}. Use --force to override.`)\n }\n }\n\n if (options.dryRun) {\n const actions = ['Remove worktree registration']\n if (options.removeDirectory) actions.push('Remove directory from disk')\n if (options.removeBranch) actions.push(`Remove branch: ${worktree.branch}`)\n\n return `Would perform: ${actions.join(', ')}`\n }\n\n // Remove worktree registration\n const args = ['worktree', 'remove']\n if (options.force) args.push('--force')\n args.push(worktreePath)\n\n await executeGitCommand(args, { cwd: this._workingDirectory })\n\n // Remove directory if requested\n if (options.removeDirectory && (await fs.pathExists(worktreePath))) {\n await fs.remove(worktreePath)\n }\n\n // Remove branch if requested and safe to do so\n if (options.removeBranch && !worktree.bare) {\n try {\n await executeGitCommand(['branch', '-D', worktree.branch], {\n cwd: this._workingDirectory,\n })\n } catch (error) {\n // Don't fail the whole operation if branch deletion fails\n // Just log a warning (caller can handle this)\n throw new Error(\n `Worktree removed but failed to delete branch ${worktree.branch}: ${error instanceof Error ? error.message : 'Unknown error'}`\n )\n }\n }\n }\n\n /**\n * Validate worktree state and integrity\n */\n async validateWorktree(worktreePath: string): Promise<WorktreeValidation> {\n const issues: string[] = []\n let existsOnDisk = false\n let isValidRepo = false\n let hasValidBranch = false\n\n try {\n // Check if path exists on disk\n existsOnDisk = await fs.pathExists(worktreePath)\n if (!existsOnDisk) {\n issues.push('Worktree directory does not exist on disk')\n }\n\n // Check if it's a valid Git repository\n if (existsOnDisk) {\n isValidRepo = await isValidGitRepo(worktreePath)\n if (!isValidRepo) {\n issues.push('Directory is not a valid Git repository')\n }\n }\n\n // Check if branch reference is valid\n if (isValidRepo) {\n const currentBranch = await getCurrentBranch(worktreePath)\n hasValidBranch = currentBranch !== null\n if (!hasValidBranch) {\n issues.push('Could not determine current branch')\n }\n }\n\n // Check if worktree is registered with Git\n const worktrees = await this.listWorktrees()\n const isRegistered = worktrees.some(wt => wt.path === worktreePath)\n if (!isRegistered) {\n issues.push('Worktree is not registered with Git')\n }\n } catch (error) {\n issues.push(`Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`)\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n existsOnDisk,\n isValidRepo,\n hasValidBranch,\n }\n }\n\n /**\n * Get detailed status information for a worktree\n */\n async getWorktreeStatus(worktreePath: string): Promise<WorktreeStatus> {\n const statusOutput = await executeGitCommand(['status', '--porcelain=v1'], {\n cwd: worktreePath,\n })\n\n let modified = 0\n let staged = 0\n let deleted = 0\n let untracked = 0\n\n const lines = statusOutput.trim().split('\\n').filter(Boolean)\n for (const line of lines) {\n const status = line.substring(0, 2)\n if (status[0] === 'M' || status[1] === 'M') modified++\n if (status[0] === 'A' || status[0] === 'D' || status[0] === 'R') staged++\n if (status[0] === 'D' || status[1] === 'D') deleted++\n if (status === '??') untracked++\n }\n\n const currentBranch = (await getCurrentBranch(worktreePath)) ?? 'unknown'\n const detached = currentBranch === 'unknown'\n\n // Get ahead/behind information\n let ahead = 0\n let behind = 0\n try {\n const aheadBehindOutput = await executeGitCommand(\n ['rev-list', '--left-right', '--count', `origin/${currentBranch}...HEAD`],\n { cwd: worktreePath }\n )\n const parts = aheadBehindOutput.trim().split('\\t')\n const behindStr = parts[0]\n const aheadStr = parts[1]\n behind = behindStr ? parseInt(behindStr, 10) || 0 : 0\n ahead = aheadStr ? parseInt(aheadStr, 10) || 0 : 0\n } catch {\n // Ignore errors for ahead/behind calculation\n }\n\n return {\n modified,\n staged,\n deleted,\n untracked,\n hasChanges: modified + staged + deleted + untracked > 0,\n branch: currentBranch,\n detached,\n ahead,\n behind,\n }\n }\n\n /**\n * Generate a suggested worktree path for a branch\n */\n generateWorktreePath(\n branchName: string,\n customRoot?: string,\n options?: { isPR?: boolean; prNumber?: number; prefix?: string }\n ): string {\n const root = customRoot ?? this._workingDirectory\n return generateWorktreePath(branchName, root, options)\n }\n\n /**\n * Sanitize a branch name for use as a directory name\n * Replaces slashes with dashes and removes invalid filesystem characters\n * Ports logic from bash script line 593: ${BRANCH_NAME//\\\\//-}\n */\n sanitizeBranchName(branchName: string): string {\n return branchName\n .replace(/\\//g, '-') // Replace slashes with dashes\n .replace(/[^a-zA-Z0-9-]/g, '-') // Replace invalid chars (including underscores) with dashes\n .replace(/-+/g, '-') // Collapse multiple dashes\n .replace(/^-|-$/g, '') // Remove leading/trailing dashes\n .toLowerCase()\n }\n\n /**\n * Check if repository is in a valid state for worktree operations\n */\n async isRepoReady(): Promise<boolean> {\n try {\n const repoRoot = await getRepoRoot(this._workingDirectory)\n return repoRoot !== null\n } catch {\n return false\n }\n }\n\n /**\n * Get repository information\n */\n async getRepoInfo(): Promise<{\n root: string | null\n defaultBranch: string\n currentBranch: string | null\n }> {\n const root = await getRepoRoot(this._workingDirectory)\n const defaultBranch = await getDefaultBranch(this._workingDirectory)\n const currentBranch = await getCurrentBranch(this._workingDirectory)\n\n return {\n root,\n defaultBranch,\n currentBranch,\n }\n }\n\n /**\n * Prune stale worktree entries (worktrees that no longer exist on disk)\n */\n async pruneWorktrees(): Promise<void> {\n await executeGitCommand(['worktree', 'prune', '-v'], { cwd: this._workingDirectory })\n }\n\n /**\n * Lock a worktree to prevent it from being pruned or moved\n */\n async lockWorktree(worktreePath: string, reason?: string): Promise<void> {\n const args = ['worktree', 'lock', worktreePath]\n if (reason) args.push('--reason', reason)\n\n await executeGitCommand(args, { cwd: this._workingDirectory })\n }\n\n /**\n * Unlock a previously locked worktree\n */\n async unlockWorktree(worktreePath: string): Promise<void> {\n await executeGitCommand(['worktree', 'unlock', worktreePath], { cwd: this._workingDirectory })\n }\n\n /**\n * Find worktrees matching an identifier (branch name, path, or PR number)\n */\n async findWorktreesByIdentifier(identifier: string): Promise<GitWorktree[]> {\n const worktrees = await this.listWorktrees({ porcelain: true })\n return worktrees.filter(\n wt =>\n wt.branch.includes(identifier) ||\n wt.path.includes(identifier) ||\n this.getPRNumberFromWorktree(wt)?.toString() === identifier\n )\n }\n\n /**\n * Find worktree for a specific issue number using exact pattern matching\n * Matches: issue-{N} at start OR after /, -, _ (but NOT issue-{N}X where X is a digit)\n * Supports patterns like: issue-44, feat/issue-44-feature, feat-issue-44, bugfix_issue-44, etc.\n * Avoids false matches like: tissue-44, myissue-44\n * Ports: find_existing_worktree() from bash script lines 131-165\n */\n async findWorktreeForIssue(issueNumber: string | number): Promise<GitWorktree | null> {\n const worktrees = await this.listWorktrees({ porcelain: true })\n\n // Pattern: starts with 'issue-{N}' OR has '/issue-{N}', '-issue-{N}', '_issue-{N}' but not 'issue-{N}{digit}'\n // Case-insensitive to handle Linear IDs (MARK-1 vs mark-1)\n const pattern = new RegExp(`(?:^|[/_-])issue-${issueNumber}(?:-|__|$)`, 'i')\n\n return worktrees.find(wt => pattern.test(wt.branch)) ?? null\n }\n\n /**\n * Find worktree for a specific PR by branch name\n * Ports: find_existing_worktree() for PR type from bash script lines 149-160\n */\n async findWorktreeForPR(prNumber: number, branchName: string): Promise<GitWorktree | null> {\n const worktrees = await this.listWorktrees({ porcelain: true })\n\n // Find by exact branch name match (prioritized)\n const byBranch = worktrees.find(wt => wt.branch === branchName)\n if (byBranch) return byBranch\n\n // Also check directory name pattern: *_pr_{N}\n const pathPattern = new RegExp(`_pr_${prNumber}$`)\n return worktrees.find(wt => pathPattern.test(wt.path)) ?? null\n }\n\n /**\n * Remove multiple worktrees\n * Returns a summary of successes and failures\n * Automatically filters out the main worktree\n *\n * @param worktrees - Array of worktrees to remove\n * @param settingsManager - SettingsManager instance for determining main worktree\n * @param options - Cleanup options\n */\n async removeWorktrees(\n worktrees: GitWorktree[],\n settingsManager: SettingsManager,\n options: WorktreeCleanupOptions = {}\n ): Promise<{\n successes: Array<{ worktree: GitWorktree }>\n failures: Array<{ worktree: GitWorktree; error: string }>\n skipped: Array<{ worktree: GitWorktree; reason: string }>\n }> {\n const successes: Array<{ worktree: GitWorktree }> = []\n const failures: Array<{ worktree: GitWorktree; error: string }> = []\n const skipped: Array<{ worktree: GitWorktree; reason: string }> = []\n\n for (const worktree of worktrees) {\n // Skip main worktree\n if (await this.isMainWorktree(worktree, settingsManager)) {\n skipped.push({ worktree, reason: 'Cannot remove main worktree' })\n continue\n }\n\n try {\n await this.removeWorktree(worktree.path, {\n ...options,\n removeDirectory: true,\n })\n successes.push({ worktree })\n } catch (error) {\n failures.push({\n worktree,\n error: error instanceof Error ? error.message : 'Unknown error',\n })\n }\n }\n\n return { successes, failures, skipped }\n }\n\n /**\n * Format worktree information for display\n */\n formatWorktree(worktree: GitWorktree): {\n title: string\n path: string\n commit: string\n } {\n const prNumber = this.getPRNumberFromWorktree(worktree)\n const prLabel = prNumber ? ` (PR #${prNumber})` : ''\n const bareLabel = worktree.bare ? ' [main]' : ''\n\n return {\n title: `${worktree.branch}${prLabel}${bareLabel}`,\n path: worktree.path,\n commit: worktree.commit.substring(0, 7),\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getPackageScripts
4
- } from "./chunk-XPKN3QWY.js";
4
+ } from "./chunk-VOGGLPG5.js";
5
5
  import {
6
6
  getLogger
7
7
  } from "./chunk-6MLEBAYZ.js";
@@ -161,4 +161,4 @@ export {
161
161
  installDependencies,
162
162
  runScript
163
163
  };
164
- //# sourceMappingURL=chunk-RD7I2Q2F.js.map
164
+ //# sourceMappingURL=chunk-4LKGCFGG.js.map
@@ -2,21 +2,21 @@
2
2
  import {
3
3
  detectPackageManager,
4
4
  runScript
5
- } from "./chunk-RD7I2Q2F.js";
5
+ } from "./chunk-4LKGCFGG.js";
6
6
  import {
7
7
  getPackageConfig,
8
8
  hasScript
9
- } from "./chunk-XPKN3QWY.js";
9
+ } from "./chunk-VOGGLPG5.js";
10
10
  import {
11
11
  executeGitCommand
12
- } from "./chunk-GDS2HXSW.js";
12
+ } from "./chunk-H6ST2TGP.js";
13
13
  import {
14
14
  promptCommitAction
15
15
  } from "./chunk-7JDMYTFZ.js";
16
16
  import {
17
17
  detectClaudeCli,
18
18
  launchClaude
19
- } from "./chunk-IGKPPACU.js";
19
+ } from "./chunk-FO5GGFOV.js";
20
20
  import {
21
21
  getLogger
22
22
  } from "./chunk-6MLEBAYZ.js";
@@ -823,4 +823,4 @@ export {
823
823
  UserAbortedCommitError,
824
824
  CommitManager
825
825
  };
826
- //# sourceMappingURL=chunk-SSASIBDJ.js.map
826
+ //# sourceMappingURL=chunk-5LVVQGB3.js.map