@iloom/cli 0.13.2 → 0.13.4

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 (169) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/{BranchNamingService-MEK2WZUD.js → BranchNamingService-PBP6DY3H.js} +2 -2
  4. package/dist/{ClaudeContextManager-KJ4VEA2F.js → ClaudeContextManager-3HT4LEIU.js} +5 -5
  5. package/dist/{ClaudeService-WTJO4UW6.js → ClaudeService-7BHL2GWC.js} +4 -4
  6. package/dist/{IssueTrackerFactory-UEJALI4X.js → IssueTrackerFactory-JH34S4GX.js} +3 -3
  7. package/dist/{LoomLauncher-KG2VBNQA.js → LoomLauncher-RGXJOCMC.js} +8 -5
  8. package/dist/LoomLauncher-RGXJOCMC.js.map +1 -0
  9. package/dist/{MetadataManager-HHE6LQF2.js → MetadataManager-WKM7JJIO.js} +2 -2
  10. package/dist/README.md +1 -1
  11. package/dist/{SettingsManager-PVHBSCMI.js → SettingsManager-Y5OU5HCX.js} +4 -2
  12. package/dist/agents/CLAUDE.md +12 -7
  13. package/dist/agents/iloom-code-reviewer.md +2 -1
  14. package/dist/agents/iloom-framework-detector.md +56 -9
  15. package/dist/agents/iloom-issue-analyze-and-plan.md +1 -0
  16. package/dist/agents/iloom-issue-analyzer.md +1 -0
  17. package/dist/agents/iloom-issue-complexity-evaluator.md +1 -0
  18. package/dist/agents/iloom-issue-enhancer.md +2 -1
  19. package/dist/agents/iloom-issue-implementer.md +4 -1
  20. package/dist/agents/iloom-issue-planner.md +2 -1
  21. package/dist/agents/iloom-wave-verifier.md +1 -0
  22. package/dist/{build-2FXDYEZQ.js → build-NJJT6UHO.js} +7 -7
  23. package/dist/{chunk-VUIPDX3T.js → chunk-27CQSBUG.js} +2 -2
  24. package/dist/{chunk-YVNG35OW.js → chunk-2Z4VKQND.js} +2 -2
  25. package/dist/{chunk-UQWMPQ2Q.js → chunk-4QROZMPZ.js} +3 -3
  26. package/dist/{chunk-U2OPXZ6E.js → chunk-5NVJ6N3C.js} +7 -7
  27. package/dist/{chunk-2WRD6Y5E.js → chunk-5VP2HAWF.js} +2 -2
  28. package/dist/{chunk-CQHHEW2M.js → chunk-5WJN63T4.js} +1 -1
  29. package/dist/chunk-5WJN63T4.js.map +1 -0
  30. package/dist/{chunk-H4TSDALC.js → chunk-64K5SZXC.js} +6 -6
  31. package/dist/{chunk-5W44AI63.js → chunk-6FHFHMNF.js} +4 -4
  32. package/dist/{chunk-XC5JKRSH.js → chunk-6RKZDUTQ.js} +2 -2
  33. package/dist/{chunk-RP6MHV24.js → chunk-7VSOM25S.js} +20 -15
  34. package/dist/chunk-7VSOM25S.js.map +1 -0
  35. package/dist/{chunk-UMAOVKQX.js → chunk-CSJ7JNJV.js} +3 -3
  36. package/dist/{chunk-AQUSMNBF.js → chunk-CWRQ4NU4.js} +2 -2
  37. package/dist/{chunk-R2EFSRKR.js → chunk-EBPFEM5X.js} +16 -15
  38. package/dist/chunk-EBPFEM5X.js.map +1 -0
  39. package/dist/{chunk-OMV47LLA.js → chunk-FPM6XDEO.js} +2 -2
  40. package/dist/{chunk-DYLOITSO.js → chunk-HMMDNIKG.js} +38 -31
  41. package/dist/chunk-HMMDNIKG.js.map +1 -0
  42. package/dist/{chunk-XIVLGWUX.js → chunk-JDXJIPXR.js} +3 -1
  43. package/dist/chunk-JDXJIPXR.js.map +1 -0
  44. package/dist/{chunk-ZWXJ7G2C.js → chunk-JIMFSNZI.js} +2 -2
  45. package/dist/{chunk-D6FU4DLN.js → chunk-LULQYBRA.js} +2 -2
  46. package/dist/{chunk-DDHWZNGL.js → chunk-MB4CB7Q4.js} +6 -5
  47. package/dist/chunk-MB4CB7Q4.js.map +1 -0
  48. package/dist/{chunk-OHX3PSAY.js → chunk-MZPVETJH.js} +7 -15
  49. package/dist/chunk-MZPVETJH.js.map +1 -0
  50. package/dist/{chunk-OIJNBFMP.js → chunk-OSWL7YDO.js} +2 -2
  51. package/dist/{chunk-32D4CWWH.js → chunk-R2RGFNR4.js} +2 -2
  52. package/dist/{chunk-MPHSR6GA.js → chunk-R4Y2ZBOL.js} +5 -5
  53. package/dist/{chunk-L3P3YJCE.js → chunk-RLFS5KHU.js} +3 -3
  54. package/dist/{chunk-DMNI225H.js → chunk-SM2YM3YR.js} +4 -4
  55. package/dist/{chunk-MNPKEWBQ.js → chunk-UVZBZ5IF.js} +52 -1
  56. package/dist/chunk-UVZBZ5IF.js.map +1 -0
  57. package/dist/{chunk-Y2JHYPMX.js → chunk-VG7UFVF2.js} +47 -35
  58. package/dist/chunk-VG7UFVF2.js.map +1 -0
  59. package/dist/{chunk-OVW26FHW.js → chunk-VQ3Y3PVT.js} +2 -2
  60. package/dist/{chunk-PH65MFQM.js → chunk-Y2TPRF5H.js} +3 -3
  61. package/dist/{claude-ACL7G4CF.js → claude-IYLIOOP7.js} +2 -2
  62. package/dist/{cleanup-I62RA5TZ.js → cleanup-Q6PEKMVF.js} +18 -18
  63. package/dist/cli.js +93 -77
  64. package/dist/cli.js.map +1 -1
  65. package/dist/{commit-7RI2JFFW.js → commit-JKZQYNEB.js} +8 -8
  66. package/dist/{compile-NWTMKAGL.js → compile-QEMZDLKO.js} +7 -7
  67. package/dist/{contribute-QWPOT4QR.js → contribute-TCEOVFDN.js} +4 -4
  68. package/dist/{dev-server-OZ6KKKTR.js → dev-server-25BIZKTB.js} +12 -12
  69. package/dist/{feedback-G63MODT2.js → feedback-CQ42GFZE.js} +7 -7
  70. package/dist/{git-ZTMT6OAI.js → git-HWDX2KWU.js} +4 -4
  71. package/dist/{ignite-GUYKYC5G.js → ignite-25QLX2FS.js} +13 -13
  72. package/dist/index.d.ts +1764 -1709
  73. package/dist/index.js +105 -8
  74. package/dist/index.js.map +1 -1
  75. package/dist/{init-AMLCFVXG.js → init-LRNRRFFU.js} +8 -8
  76. package/dist/{install-deps-XS2UUCUS.js → install-deps-DHFHT3KI.js} +7 -7
  77. package/dist/{issues-2IT7PSNZ.js → issues-W722ILMI.js} +5 -5
  78. package/dist/{lint-DKWJHET3.js → lint-TZDEPVKN.js} +7 -7
  79. package/dist/mcp/issue-management-server.js +39 -0
  80. package/dist/mcp/issue-management-server.js.map +1 -1
  81. package/dist/mcp/recap-server.js +2 -2
  82. package/dist/mcp/recap-server.js.map +1 -1
  83. package/dist/{open-6PXNIPXS.js → open-BCQSZYAD.js} +12 -12
  84. package/dist/{plan-NJVQBBT3.js → plan-2LUGSOYG.js} +30 -28
  85. package/dist/plan-2LUGSOYG.js.map +1 -0
  86. package/dist/{projects-3F6T3KZL.js → projects-INTNTWRM.js} +2 -2
  87. package/dist/prompts/init-prompt.txt +72 -4
  88. package/dist/prompts/issue-prompt.txt +6 -3
  89. package/dist/prompts/pr-prompt.txt +3 -2
  90. package/dist/prompts/regular-prompt.txt +3 -2
  91. package/dist/prompts/session-summary-prompt.txt +2 -1
  92. package/dist/prompts/swarm-orchestrator-prompt.txt +2 -2
  93. package/dist/{rebase-6AXN45AE.js → rebase-ZKZKKQKB.js} +7 -7
  94. package/dist/{recap-XDKI3MTA.js → recap-XXLLMETY.js} +7 -7
  95. package/dist/{run-RHE5NPDT.js → run-5P5ULYZY.js} +12 -12
  96. package/dist/schema/settings.schema.json +50 -0
  97. package/dist/{shell-XOILFEZW.js → shell-GNDHII2J.js} +6 -6
  98. package/dist/{summary-BVYOM63C.js → summary-TVLBZNKY.js} +10 -10
  99. package/dist/{test-6T2UMQ7T.js → test-T5K7FOKQ.js} +7 -7
  100. package/dist/{test-git-CQ65OL45.js → test-git-AQ3ZQ4RA.js} +4 -4
  101. package/dist/{test-jira-CQQHGZ3S.js → test-jira-7XQ63U2C.js} +3 -3
  102. package/dist/{test-prefix-HMTZSS67.js → test-prefix-OTY2HBSB.js} +4 -4
  103. package/dist/{test-webserver-ZN73CM2T.js → test-webserver-CPQMUCDD.js} +6 -6
  104. package/dist/{vscode-ABQ5ZSH7.js → vscode-M4KRTKZK.js} +6 -6
  105. package/package.json +1 -1
  106. package/dist/LoomLauncher-KG2VBNQA.js.map +0 -1
  107. package/dist/chunk-CQHHEW2M.js.map +0 -1
  108. package/dist/chunk-DDHWZNGL.js.map +0 -1
  109. package/dist/chunk-DYLOITSO.js.map +0 -1
  110. package/dist/chunk-MNPKEWBQ.js.map +0 -1
  111. package/dist/chunk-OHX3PSAY.js.map +0 -1
  112. package/dist/chunk-R2EFSRKR.js.map +0 -1
  113. package/dist/chunk-RP6MHV24.js.map +0 -1
  114. package/dist/chunk-XIVLGWUX.js.map +0 -1
  115. package/dist/chunk-Y2JHYPMX.js.map +0 -1
  116. package/dist/plan-NJVQBBT3.js.map +0 -1
  117. /package/dist/{BranchNamingService-MEK2WZUD.js.map → BranchNamingService-PBP6DY3H.js.map} +0 -0
  118. /package/dist/{ClaudeContextManager-KJ4VEA2F.js.map → ClaudeContextManager-3HT4LEIU.js.map} +0 -0
  119. /package/dist/{ClaudeService-WTJO4UW6.js.map → ClaudeService-7BHL2GWC.js.map} +0 -0
  120. /package/dist/{IssueTrackerFactory-UEJALI4X.js.map → IssueTrackerFactory-JH34S4GX.js.map} +0 -0
  121. /package/dist/{MetadataManager-HHE6LQF2.js.map → MetadataManager-WKM7JJIO.js.map} +0 -0
  122. /package/dist/{SettingsManager-PVHBSCMI.js.map → SettingsManager-Y5OU5HCX.js.map} +0 -0
  123. /package/dist/{build-2FXDYEZQ.js.map → build-NJJT6UHO.js.map} +0 -0
  124. /package/dist/{chunk-VUIPDX3T.js.map → chunk-27CQSBUG.js.map} +0 -0
  125. /package/dist/{chunk-YVNG35OW.js.map → chunk-2Z4VKQND.js.map} +0 -0
  126. /package/dist/{chunk-UQWMPQ2Q.js.map → chunk-4QROZMPZ.js.map} +0 -0
  127. /package/dist/{chunk-U2OPXZ6E.js.map → chunk-5NVJ6N3C.js.map} +0 -0
  128. /package/dist/{chunk-2WRD6Y5E.js.map → chunk-5VP2HAWF.js.map} +0 -0
  129. /package/dist/{chunk-H4TSDALC.js.map → chunk-64K5SZXC.js.map} +0 -0
  130. /package/dist/{chunk-5W44AI63.js.map → chunk-6FHFHMNF.js.map} +0 -0
  131. /package/dist/{chunk-XC5JKRSH.js.map → chunk-6RKZDUTQ.js.map} +0 -0
  132. /package/dist/{chunk-UMAOVKQX.js.map → chunk-CSJ7JNJV.js.map} +0 -0
  133. /package/dist/{chunk-AQUSMNBF.js.map → chunk-CWRQ4NU4.js.map} +0 -0
  134. /package/dist/{chunk-OMV47LLA.js.map → chunk-FPM6XDEO.js.map} +0 -0
  135. /package/dist/{chunk-ZWXJ7G2C.js.map → chunk-JIMFSNZI.js.map} +0 -0
  136. /package/dist/{chunk-D6FU4DLN.js.map → chunk-LULQYBRA.js.map} +0 -0
  137. /package/dist/{chunk-OIJNBFMP.js.map → chunk-OSWL7YDO.js.map} +0 -0
  138. /package/dist/{chunk-32D4CWWH.js.map → chunk-R2RGFNR4.js.map} +0 -0
  139. /package/dist/{chunk-MPHSR6GA.js.map → chunk-R4Y2ZBOL.js.map} +0 -0
  140. /package/dist/{chunk-L3P3YJCE.js.map → chunk-RLFS5KHU.js.map} +0 -0
  141. /package/dist/{chunk-DMNI225H.js.map → chunk-SM2YM3YR.js.map} +0 -0
  142. /package/dist/{chunk-OVW26FHW.js.map → chunk-VQ3Y3PVT.js.map} +0 -0
  143. /package/dist/{chunk-PH65MFQM.js.map → chunk-Y2TPRF5H.js.map} +0 -0
  144. /package/dist/{claude-ACL7G4CF.js.map → claude-IYLIOOP7.js.map} +0 -0
  145. /package/dist/{cleanup-I62RA5TZ.js.map → cleanup-Q6PEKMVF.js.map} +0 -0
  146. /package/dist/{commit-7RI2JFFW.js.map → commit-JKZQYNEB.js.map} +0 -0
  147. /package/dist/{compile-NWTMKAGL.js.map → compile-QEMZDLKO.js.map} +0 -0
  148. /package/dist/{contribute-QWPOT4QR.js.map → contribute-TCEOVFDN.js.map} +0 -0
  149. /package/dist/{dev-server-OZ6KKKTR.js.map → dev-server-25BIZKTB.js.map} +0 -0
  150. /package/dist/{feedback-G63MODT2.js.map → feedback-CQ42GFZE.js.map} +0 -0
  151. /package/dist/{git-ZTMT6OAI.js.map → git-HWDX2KWU.js.map} +0 -0
  152. /package/dist/{ignite-GUYKYC5G.js.map → ignite-25QLX2FS.js.map} +0 -0
  153. /package/dist/{init-AMLCFVXG.js.map → init-LRNRRFFU.js.map} +0 -0
  154. /package/dist/{install-deps-XS2UUCUS.js.map → install-deps-DHFHT3KI.js.map} +0 -0
  155. /package/dist/{issues-2IT7PSNZ.js.map → issues-W722ILMI.js.map} +0 -0
  156. /package/dist/{lint-DKWJHET3.js.map → lint-TZDEPVKN.js.map} +0 -0
  157. /package/dist/{open-6PXNIPXS.js.map → open-BCQSZYAD.js.map} +0 -0
  158. /package/dist/{projects-3F6T3KZL.js.map → projects-INTNTWRM.js.map} +0 -0
  159. /package/dist/{rebase-6AXN45AE.js.map → rebase-ZKZKKQKB.js.map} +0 -0
  160. /package/dist/{recap-XDKI3MTA.js.map → recap-XXLLMETY.js.map} +0 -0
  161. /package/dist/{run-RHE5NPDT.js.map → run-5P5ULYZY.js.map} +0 -0
  162. /package/dist/{shell-XOILFEZW.js.map → shell-GNDHII2J.js.map} +0 -0
  163. /package/dist/{summary-BVYOM63C.js.map → summary-TVLBZNKY.js.map} +0 -0
  164. /package/dist/{test-6T2UMQ7T.js.map → test-T5K7FOKQ.js.map} +0 -0
  165. /package/dist/{test-git-CQ65OL45.js.map → test-git-AQ3ZQ4RA.js.map} +0 -0
  166. /package/dist/{test-jira-CQQHGZ3S.js.map → test-jira-7XQ63U2C.js.map} +0 -0
  167. /package/dist/{test-prefix-HMTZSS67.js.map → test-prefix-OTY2HBSB.js.map} +0 -0
  168. /package/dist/{test-webserver-ZN73CM2T.js.map → test-webserver-CPQMUCDD.js.map} +0 -0
  169. /package/dist/{vscode-ABQ5ZSH7.js.map → vscode-M4KRTKZK.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -123,1767 +123,1819 @@ interface WorktreeCleanupOptions {
123
123
  dryRun?: boolean;
124
124
  }
125
125
 
126
- declare const VALID_CLAUDE_MODELS: readonly ["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"];
127
- type ClaudeModel = (typeof VALID_CLAUDE_MODELS)[number];
128
126
  /**
129
- * Zod schema for iloom settings
127
+ * Options for ResourceCleanup operations
130
128
  */
131
- declare const IloomSettingsSchema: z.ZodObject<{
132
- mainBranch: z.ZodOptional<z.ZodString>;
133
- sourceEnvOnStart: z.ZodDefault<z.ZodBoolean>;
134
- worktreePrefix: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
135
- protectedBranches: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
136
- copyGitIgnoredPatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
137
- workflows: z.ZodOptional<z.ZodObject<{
138
- issue: z.ZodOptional<z.ZodObject<{
139
- permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
140
- noVerify: z.ZodOptional<z.ZodBoolean>;
141
- startIde: z.ZodDefault<z.ZodBoolean>;
142
- startDevServer: z.ZodDefault<z.ZodBoolean>;
143
- startAiAgent: z.ZodDefault<z.ZodBoolean>;
144
- startTerminal: z.ZodDefault<z.ZodBoolean>;
145
- generateSummary: z.ZodDefault<z.ZodBoolean>;
146
- }, "strip", z.ZodTypeAny, {
147
- startIde: boolean;
148
- startDevServer: boolean;
149
- startAiAgent: boolean;
150
- startTerminal: boolean;
151
- generateSummary: boolean;
152
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
153
- noVerify?: boolean | undefined;
154
- }, {
155
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
156
- noVerify?: boolean | undefined;
157
- startIde?: boolean | undefined;
158
- startDevServer?: boolean | undefined;
159
- startAiAgent?: boolean | undefined;
160
- startTerminal?: boolean | undefined;
161
- generateSummary?: boolean | undefined;
162
- }>>;
163
- pr: z.ZodOptional<z.ZodObject<{
164
- permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
165
- noVerify: z.ZodOptional<z.ZodBoolean>;
166
- startIde: z.ZodDefault<z.ZodBoolean>;
167
- startDevServer: z.ZodDefault<z.ZodBoolean>;
168
- startAiAgent: z.ZodDefault<z.ZodBoolean>;
169
- startTerminal: z.ZodDefault<z.ZodBoolean>;
170
- generateSummary: z.ZodDefault<z.ZodBoolean>;
171
- }, "strip", z.ZodTypeAny, {
172
- startIde: boolean;
173
- startDevServer: boolean;
174
- startAiAgent: boolean;
175
- startTerminal: boolean;
176
- generateSummary: boolean;
177
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
178
- noVerify?: boolean | undefined;
179
- }, {
180
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
181
- noVerify?: boolean | undefined;
182
- startIde?: boolean | undefined;
183
- startDevServer?: boolean | undefined;
184
- startAiAgent?: boolean | undefined;
185
- startTerminal?: boolean | undefined;
186
- generateSummary?: boolean | undefined;
187
- }>>;
188
- regular: z.ZodOptional<z.ZodObject<{
189
- permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
190
- noVerify: z.ZodOptional<z.ZodBoolean>;
191
- startIde: z.ZodDefault<z.ZodBoolean>;
192
- startDevServer: z.ZodDefault<z.ZodBoolean>;
193
- startAiAgent: z.ZodDefault<z.ZodBoolean>;
194
- startTerminal: z.ZodDefault<z.ZodBoolean>;
195
- generateSummary: z.ZodDefault<z.ZodBoolean>;
196
- }, "strip", z.ZodTypeAny, {
197
- startIde: boolean;
198
- startDevServer: boolean;
199
- startAiAgent: boolean;
200
- startTerminal: boolean;
201
- generateSummary: boolean;
202
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
203
- noVerify?: boolean | undefined;
204
- }, {
205
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
206
- noVerify?: boolean | undefined;
207
- startIde?: boolean | undefined;
208
- startDevServer?: boolean | undefined;
209
- startAiAgent?: boolean | undefined;
210
- startTerminal?: boolean | undefined;
211
- generateSummary?: boolean | undefined;
212
- }>>;
213
- }, "strip", z.ZodTypeAny, {
214
- issue?: {
215
- startIde: boolean;
216
- startDevServer: boolean;
217
- startAiAgent: boolean;
218
- startTerminal: boolean;
219
- generateSummary: boolean;
220
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
221
- noVerify?: boolean | undefined;
222
- } | undefined;
223
- pr?: {
224
- startIde: boolean;
225
- startDevServer: boolean;
226
- startAiAgent: boolean;
227
- startTerminal: boolean;
228
- generateSummary: boolean;
229
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
230
- noVerify?: boolean | undefined;
231
- } | undefined;
232
- regular?: {
233
- startIde: boolean;
234
- startDevServer: boolean;
235
- startAiAgent: boolean;
236
- startTerminal: boolean;
237
- generateSummary: boolean;
238
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
239
- noVerify?: boolean | undefined;
240
- } | undefined;
241
- }, {
242
- issue?: {
243
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
244
- noVerify?: boolean | undefined;
245
- startIde?: boolean | undefined;
246
- startDevServer?: boolean | undefined;
247
- startAiAgent?: boolean | undefined;
248
- startTerminal?: boolean | undefined;
249
- generateSummary?: boolean | undefined;
250
- } | undefined;
251
- pr?: {
252
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
253
- noVerify?: boolean | undefined;
254
- startIde?: boolean | undefined;
255
- startDevServer?: boolean | undefined;
256
- startAiAgent?: boolean | undefined;
257
- startTerminal?: boolean | undefined;
258
- generateSummary?: boolean | undefined;
259
- } | undefined;
260
- regular?: {
261
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
262
- noVerify?: boolean | undefined;
263
- startIde?: boolean | undefined;
264
- startDevServer?: boolean | undefined;
265
- startAiAgent?: boolean | undefined;
266
- startTerminal?: boolean | undefined;
267
- generateSummary?: boolean | undefined;
268
- } | undefined;
269
- }>>;
270
- agents: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
271
- model: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
272
- swarmModel: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
273
- enabled: z.ZodOptional<z.ZodBoolean>;
274
- providers: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "gemini", "codex"]>, z.ZodString>>;
275
- review: z.ZodOptional<z.ZodBoolean>;
276
- swarmReview: z.ZodOptional<z.ZodBoolean>;
277
- }, "strip", z.ZodTypeAny, {
278
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
279
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
280
- enabled?: boolean | undefined;
281
- providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
282
- review?: boolean | undefined;
283
- swarmReview?: boolean | undefined;
284
- }, {
285
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
286
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
287
- enabled?: boolean | undefined;
288
- providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
289
- review?: boolean | undefined;
290
- swarmReview?: boolean | undefined;
291
- }>>>>;
292
- spin: z.ZodOptional<z.ZodObject<{
293
- model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
294
- swarmModel: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
295
- postSwarmReview: z.ZodDefault<z.ZodBoolean>;
296
- }, "strip", z.ZodTypeAny, {
297
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
298
- postSwarmReview: boolean;
299
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
300
- }, {
301
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
302
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
303
- postSwarmReview?: boolean | undefined;
304
- }>>;
305
- plan: z.ZodOptional<z.ZodObject<{
306
- model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
307
- planner: z.ZodDefault<z.ZodEnum<["claude", "gemini", "codex"]>>;
308
- reviewer: z.ZodDefault<z.ZodEnum<["claude", "gemini", "codex", "none"]>>;
309
- waveVerification: z.ZodDefault<z.ZodBoolean>;
310
- }, "strip", z.ZodTypeAny, {
311
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
312
- planner: "claude" | "gemini" | "codex";
313
- reviewer: "claude" | "gemini" | "codex" | "none";
314
- waveVerification: boolean;
315
- }, {
316
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
317
- planner?: "claude" | "gemini" | "codex" | undefined;
318
- reviewer?: "claude" | "gemini" | "codex" | "none" | undefined;
319
- waveVerification?: boolean | undefined;
320
- }>>;
321
- summary: z.ZodOptional<z.ZodObject<{
322
- model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
323
- }, "strip", z.ZodTypeAny, {
324
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
325
- }, {
326
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
327
- }>>;
328
- capabilities: z.ZodOptional<z.ZodObject<{
329
- web: z.ZodOptional<z.ZodObject<{
330
- basePort: z.ZodOptional<z.ZodNumber>;
331
- protocol: z.ZodDefault<z.ZodEnum<["http", "https"]>>;
332
- devServer: z.ZodDefault<z.ZodEnum<["process", "docker"]>>;
333
- dockerFile: z.ZodDefault<z.ZodString>;
334
- containerPort: z.ZodOptional<z.ZodNumber>;
335
- dockerBuildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
336
- dockerBuildSecrets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
337
- dockerRunArgs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
338
- dockerRunEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
339
- }, "strip", z.ZodTypeAny, {
340
- protocol: "http" | "https";
341
- devServer: "docker" | "process";
342
- dockerFile: string;
343
- basePort?: number | undefined;
344
- containerPort?: number | undefined;
345
- dockerBuildArgs?: Record<string, string> | undefined;
346
- dockerBuildSecrets?: Record<string, string> | undefined;
347
- dockerRunArgs?: string[] | undefined;
348
- dockerRunEnv?: Record<string, string> | undefined;
349
- }, {
350
- basePort?: number | undefined;
351
- protocol?: "http" | "https" | undefined;
352
- devServer?: "docker" | "process" | undefined;
353
- dockerFile?: string | undefined;
354
- containerPort?: number | undefined;
355
- dockerBuildArgs?: Record<string, string> | undefined;
356
- dockerBuildSecrets?: Record<string, string> | undefined;
357
- dockerRunArgs?: string[] | undefined;
358
- dockerRunEnv?: Record<string, string> | undefined;
359
- }>>;
360
- database: z.ZodOptional<z.ZodObject<{
361
- databaseUrlEnvVarName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
362
- }, "strip", z.ZodTypeAny, {
363
- databaseUrlEnvVarName: string;
364
- }, {
365
- databaseUrlEnvVarName?: string | undefined;
366
- }>>;
367
- }, "strip", z.ZodTypeAny, {
368
- web?: {
369
- protocol: "http" | "https";
370
- devServer: "docker" | "process";
371
- dockerFile: string;
372
- basePort?: number | undefined;
373
- containerPort?: number | undefined;
374
- dockerBuildArgs?: Record<string, string> | undefined;
375
- dockerBuildSecrets?: Record<string, string> | undefined;
376
- dockerRunArgs?: string[] | undefined;
377
- dockerRunEnv?: Record<string, string> | undefined;
378
- } | undefined;
379
- database?: {
380
- databaseUrlEnvVarName: string;
381
- } | undefined;
382
- }, {
383
- web?: {
384
- basePort?: number | undefined;
385
- protocol?: "http" | "https" | undefined;
386
- devServer?: "docker" | "process" | undefined;
387
- dockerFile?: string | undefined;
388
- containerPort?: number | undefined;
389
- dockerBuildArgs?: Record<string, string> | undefined;
390
- dockerBuildSecrets?: Record<string, string> | undefined;
391
- dockerRunArgs?: string[] | undefined;
392
- dockerRunEnv?: Record<string, string> | undefined;
393
- } | undefined;
394
- database?: {
395
- databaseUrlEnvVarName?: string | undefined;
396
- } | undefined;
397
- }>>;
398
- devServer: z.ZodOptional<z.ZodObject<{
399
- mode: z.ZodDefault<z.ZodEnum<["docker"]>>;
400
- docker: z.ZodOptional<z.ZodObject<{
401
- dockerFile: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
402
- containerPort: z.ZodOptional<z.ZodNumber>;
403
- buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
404
- runArgs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
405
- runEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
406
- }, "strip", z.ZodTypeAny, {
407
- dockerFile: string;
408
- containerPort?: number | undefined;
409
- buildArgs?: Record<string, string> | undefined;
410
- runArgs?: string[] | undefined;
411
- runEnv?: Record<string, string> | undefined;
412
- }, {
413
- dockerFile?: string | undefined;
414
- containerPort?: number | undefined;
415
- buildArgs?: Record<string, string> | undefined;
416
- runArgs?: string[] | undefined;
417
- runEnv?: Record<string, string> | undefined;
418
- }>>;
419
- }, "strip", z.ZodTypeAny, {
420
- mode: "docker";
421
- docker?: {
422
- dockerFile: string;
423
- containerPort?: number | undefined;
424
- buildArgs?: Record<string, string> | undefined;
425
- runArgs?: string[] | undefined;
426
- runEnv?: Record<string, string> | undefined;
427
- } | undefined;
428
- }, {
429
- docker?: {
430
- dockerFile?: string | undefined;
431
- containerPort?: number | undefined;
432
- buildArgs?: Record<string, string> | undefined;
433
- runArgs?: string[] | undefined;
434
- runEnv?: Record<string, string> | undefined;
435
- } | undefined;
436
- mode?: "docker" | undefined;
437
- }>>;
438
- databaseProviders: z.ZodOptional<z.ZodObject<{
439
- neon: z.ZodOptional<z.ZodObject<{
440
- projectId: z.ZodString;
441
- parentBranch: z.ZodString;
442
- }, "strip", z.ZodTypeAny, {
443
- projectId: string;
444
- parentBranch: string;
445
- }, {
446
- projectId: string;
447
- parentBranch: string;
448
- }>>;
449
- }, "strip", z.ZodTypeAny, {
450
- neon?: {
451
- projectId: string;
452
- parentBranch: string;
453
- } | undefined;
454
- }, {
455
- neon?: {
456
- projectId: string;
457
- parentBranch: string;
458
- } | undefined;
459
- }>>;
460
- issueManagement: z.ZodOptional<z.ZodObject<{
461
- provider: z.ZodDefault<z.ZodOptional<z.ZodEnum<["github", "linear", "jira"]>>>;
462
- github: z.ZodOptional<z.ZodObject<{
463
- remote: z.ZodString;
464
- }, "strip", z.ZodTypeAny, {
465
- remote: string;
466
- }, {
467
- remote: string;
468
- }>>;
469
- linear: z.ZodOptional<z.ZodObject<{
470
- teamId: z.ZodString;
471
- branchFormat: z.ZodOptional<z.ZodString>;
472
- apiToken: z.ZodOptional<z.ZodString>;
473
- }, "strip", z.ZodTypeAny, {
474
- teamId: string;
475
- branchFormat?: string | undefined;
476
- apiToken?: string | undefined;
477
- }, {
478
- teamId: string;
479
- branchFormat?: string | undefined;
480
- apiToken?: string | undefined;
481
- }>>;
482
- jira: z.ZodOptional<z.ZodObject<{
483
- host: z.ZodString;
484
- username: z.ZodString;
485
- apiToken: z.ZodOptional<z.ZodString>;
486
- projectKey: z.ZodString;
487
- boardId: z.ZodOptional<z.ZodString>;
488
- transitionMappings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
489
- defaultIssueType: z.ZodDefault<z.ZodOptional<z.ZodString>>;
490
- defaultSubtaskType: z.ZodDefault<z.ZodOptional<z.ZodString>>;
491
- doneStatuses: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
492
- }, "strip", z.ZodTypeAny, {
493
- host: string;
494
- username: string;
495
- projectKey: string;
496
- defaultIssueType: string;
497
- defaultSubtaskType: string;
498
- doneStatuses: string[];
499
- apiToken?: string | undefined;
500
- boardId?: string | undefined;
501
- transitionMappings?: Record<string, string> | undefined;
502
- }, {
503
- host: string;
504
- username: string;
505
- projectKey: string;
506
- apiToken?: string | undefined;
507
- boardId?: string | undefined;
508
- transitionMappings?: Record<string, string> | undefined;
509
- defaultIssueType?: string | undefined;
510
- defaultSubtaskType?: string | undefined;
511
- doneStatuses?: string[] | undefined;
512
- }>>;
513
- }, "strip", z.ZodTypeAny, {
514
- provider: "github" | "linear" | "jira";
515
- github?: {
516
- remote: string;
517
- } | undefined;
518
- linear?: {
519
- teamId: string;
520
- branchFormat?: string | undefined;
521
- apiToken?: string | undefined;
522
- } | undefined;
523
- jira?: {
524
- host: string;
525
- username: string;
526
- projectKey: string;
527
- defaultIssueType: string;
528
- defaultSubtaskType: string;
529
- doneStatuses: string[];
530
- apiToken?: string | undefined;
531
- boardId?: string | undefined;
532
- transitionMappings?: Record<string, string> | undefined;
533
- } | undefined;
534
- }, {
535
- github?: {
536
- remote: string;
537
- } | undefined;
538
- linear?: {
539
- teamId: string;
540
- branchFormat?: string | undefined;
541
- apiToken?: string | undefined;
542
- } | undefined;
543
- jira?: {
544
- host: string;
545
- username: string;
546
- projectKey: string;
547
- apiToken?: string | undefined;
548
- boardId?: string | undefined;
549
- transitionMappings?: Record<string, string> | undefined;
550
- defaultIssueType?: string | undefined;
551
- defaultSubtaskType?: string | undefined;
552
- doneStatuses?: string[] | undefined;
553
- } | undefined;
554
- provider?: "github" | "linear" | "jira" | undefined;
555
- }>>;
556
- versionControl: z.ZodOptional<z.ZodObject<{
557
- provider: z.ZodDefault<z.ZodOptional<z.ZodEnum<["github", "bitbucket"]>>>;
558
- bitbucket: z.ZodOptional<z.ZodObject<{
559
- username: z.ZodString;
560
- apiToken: z.ZodOptional<z.ZodString>;
561
- workspace: z.ZodOptional<z.ZodString>;
562
- repoSlug: z.ZodOptional<z.ZodString>;
563
- reviewers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
564
- }, "strip", z.ZodTypeAny, {
565
- username: string;
566
- apiToken?: string | undefined;
567
- workspace?: string | undefined;
568
- repoSlug?: string | undefined;
569
- reviewers?: string[] | undefined;
570
- }, {
571
- username: string;
572
- apiToken?: string | undefined;
573
- workspace?: string | undefined;
574
- repoSlug?: string | undefined;
575
- reviewers?: string[] | undefined;
576
- }>>;
577
- }, "strip", z.ZodTypeAny, {
578
- provider: "github" | "bitbucket";
579
- bitbucket?: {
580
- username: string;
581
- apiToken?: string | undefined;
582
- workspace?: string | undefined;
583
- repoSlug?: string | undefined;
584
- reviewers?: string[] | undefined;
585
- } | undefined;
586
- }, {
587
- provider?: "github" | "bitbucket" | undefined;
588
- bitbucket?: {
589
- username: string;
590
- apiToken?: string | undefined;
591
- workspace?: string | undefined;
592
- repoSlug?: string | undefined;
593
- reviewers?: string[] | undefined;
594
- } | undefined;
595
- }>>;
596
- mergeBehavior: z.ZodOptional<z.ZodObject<{
597
- mode: z.ZodEffects<z.ZodDefault<z.ZodEnum<["local", "pr", "draft-pr", "github-pr", "github-draft-pr", "bitbucket-pr"]>>, "pr" | "local" | "draft-pr", "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined>;
598
- remote: z.ZodOptional<z.ZodString>;
599
- autoCommitPush: z.ZodOptional<z.ZodBoolean>;
600
- prTitlePrefix: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
601
- openBrowserOnFinish: z.ZodDefault<z.ZodBoolean>;
602
- }, "strip", z.ZodTypeAny, {
603
- mode: "pr" | "local" | "draft-pr";
604
- openBrowserOnFinish: boolean;
605
- remote?: string | undefined;
606
- autoCommitPush?: boolean | undefined;
607
- prTitlePrefix?: boolean | undefined;
608
- }, {
609
- mode?: "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined;
610
- remote?: string | undefined;
611
- autoCommitPush?: boolean | undefined;
612
- prTitlePrefix?: boolean | undefined;
613
- openBrowserOnFinish?: boolean | undefined;
614
- }>>;
615
- ide: z.ZodOptional<z.ZodObject<{
616
- type: z.ZodDefault<z.ZodEnum<["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf", "antigravity"]>>;
617
- }, "strip", z.ZodTypeAny, {
618
- type: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity";
619
- }, {
620
- type?: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity" | undefined;
621
- }>>;
622
- colors: z.ZodOptional<z.ZodObject<{
623
- terminal: z.ZodDefault<z.ZodBoolean>;
624
- vscode: z.ZodDefault<z.ZodBoolean>;
625
- }, "strip", z.ZodTypeAny, {
626
- terminal: boolean;
627
- vscode: boolean;
628
- }, {
629
- terminal?: boolean | undefined;
630
- vscode?: boolean | undefined;
631
- }>>;
632
- attribution: z.ZodDefault<z.ZodEnum<["off", "upstreamOnly", "on"]>>;
633
- git: z.ZodDefault<z.ZodObject<{
634
- commitTimeout: z.ZodDefault<z.ZodNumber>;
635
- }, "strip", z.ZodTypeAny, {
636
- commitTimeout: number;
637
- }, {
638
- commitTimeout?: number | undefined;
639
- }>>;
640
- }, "strip", z.ZodTypeAny, {
641
- sourceEnvOnStart: boolean;
642
- attribution: "off" | "upstreamOnly" | "on";
643
- git: {
644
- commitTimeout: number;
645
- };
646
- plan?: {
647
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
648
- planner: "claude" | "gemini" | "codex";
649
- reviewer: "claude" | "gemini" | "codex" | "none";
650
- waveVerification: boolean;
651
- } | undefined;
652
- spin?: {
653
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
654
- postSwarmReview: boolean;
655
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
656
- } | undefined;
657
- devServer?: {
658
- mode: "docker";
659
- docker?: {
660
- dockerFile: string;
661
- containerPort?: number | undefined;
662
- buildArgs?: Record<string, string> | undefined;
663
- runArgs?: string[] | undefined;
664
- runEnv?: Record<string, string> | undefined;
665
- } | undefined;
666
- } | undefined;
667
- mainBranch?: string | undefined;
668
- worktreePrefix?: string | undefined;
669
- protectedBranches?: string[] | undefined;
670
- copyGitIgnoredPatterns?: string[] | undefined;
671
- workflows?: {
672
- issue?: {
673
- startIde: boolean;
674
- startDevServer: boolean;
675
- startAiAgent: boolean;
676
- startTerminal: boolean;
677
- generateSummary: boolean;
678
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
679
- noVerify?: boolean | undefined;
680
- } | undefined;
681
- pr?: {
682
- startIde: boolean;
683
- startDevServer: boolean;
684
- startAiAgent: boolean;
685
- startTerminal: boolean;
686
- generateSummary: boolean;
687
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
688
- noVerify?: boolean | undefined;
689
- } | undefined;
690
- regular?: {
691
- startIde: boolean;
692
- startDevServer: boolean;
693
- startAiAgent: boolean;
694
- startTerminal: boolean;
695
- generateSummary: boolean;
696
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
697
- noVerify?: boolean | undefined;
698
- } | undefined;
699
- } | undefined;
700
- agents?: Record<string, {
701
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
702
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
703
- enabled?: boolean | undefined;
704
- providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
705
- review?: boolean | undefined;
706
- swarmReview?: boolean | undefined;
707
- }> | null | undefined;
708
- summary?: {
709
- model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
710
- } | undefined;
711
- capabilities?: {
712
- web?: {
713
- protocol: "http" | "https";
714
- devServer: "docker" | "process";
715
- dockerFile: string;
716
- basePort?: number | undefined;
717
- containerPort?: number | undefined;
718
- dockerBuildArgs?: Record<string, string> | undefined;
719
- dockerBuildSecrets?: Record<string, string> | undefined;
720
- dockerRunArgs?: string[] | undefined;
721
- dockerRunEnv?: Record<string, string> | undefined;
722
- } | undefined;
723
- database?: {
724
- databaseUrlEnvVarName: string;
725
- } | undefined;
726
- } | undefined;
727
- databaseProviders?: {
728
- neon?: {
729
- projectId: string;
730
- parentBranch: string;
731
- } | undefined;
732
- } | undefined;
733
- issueManagement?: {
734
- provider: "github" | "linear" | "jira";
735
- github?: {
736
- remote: string;
737
- } | undefined;
738
- linear?: {
739
- teamId: string;
740
- branchFormat?: string | undefined;
741
- apiToken?: string | undefined;
742
- } | undefined;
743
- jira?: {
744
- host: string;
745
- username: string;
746
- projectKey: string;
747
- defaultIssueType: string;
748
- defaultSubtaskType: string;
749
- doneStatuses: string[];
750
- apiToken?: string | undefined;
751
- boardId?: string | undefined;
752
- transitionMappings?: Record<string, string> | undefined;
753
- } | undefined;
754
- } | undefined;
755
- versionControl?: {
756
- provider: "github" | "bitbucket";
757
- bitbucket?: {
758
- username: string;
759
- apiToken?: string | undefined;
760
- workspace?: string | undefined;
761
- repoSlug?: string | undefined;
762
- reviewers?: string[] | undefined;
763
- } | undefined;
764
- } | undefined;
765
- mergeBehavior?: {
766
- mode: "pr" | "local" | "draft-pr";
767
- openBrowserOnFinish: boolean;
768
- remote?: string | undefined;
769
- autoCommitPush?: boolean | undefined;
770
- prTitlePrefix?: boolean | undefined;
771
- } | undefined;
772
- ide?: {
773
- type: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity";
774
- } | undefined;
775
- colors?: {
776
- terminal: boolean;
777
- vscode: boolean;
778
- } | undefined;
779
- }, {
780
- plan?: {
781
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
782
- planner?: "claude" | "gemini" | "codex" | undefined;
783
- reviewer?: "claude" | "gemini" | "codex" | "none" | undefined;
784
- waveVerification?: boolean | undefined;
785
- } | undefined;
786
- spin?: {
787
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
788
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
789
- postSwarmReview?: boolean | undefined;
790
- } | undefined;
791
- devServer?: {
792
- docker?: {
793
- dockerFile?: string | undefined;
794
- containerPort?: number | undefined;
795
- buildArgs?: Record<string, string> | undefined;
796
- runArgs?: string[] | undefined;
797
- runEnv?: Record<string, string> | undefined;
798
- } | undefined;
799
- mode?: "docker" | undefined;
800
- } | undefined;
801
- mainBranch?: string | undefined;
802
- sourceEnvOnStart?: boolean | undefined;
803
- worktreePrefix?: string | undefined;
804
- protectedBranches?: string[] | undefined;
805
- copyGitIgnoredPatterns?: string[] | undefined;
806
- workflows?: {
807
- issue?: {
808
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
809
- noVerify?: boolean | undefined;
810
- startIde?: boolean | undefined;
811
- startDevServer?: boolean | undefined;
812
- startAiAgent?: boolean | undefined;
813
- startTerminal?: boolean | undefined;
814
- generateSummary?: boolean | undefined;
815
- } | undefined;
816
- pr?: {
817
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
818
- noVerify?: boolean | undefined;
819
- startIde?: boolean | undefined;
820
- startDevServer?: boolean | undefined;
821
- startAiAgent?: boolean | undefined;
822
- startTerminal?: boolean | undefined;
823
- generateSummary?: boolean | undefined;
824
- } | undefined;
825
- regular?: {
826
- permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
827
- noVerify?: boolean | undefined;
828
- startIde?: boolean | undefined;
829
- startDevServer?: boolean | undefined;
830
- startAiAgent?: boolean | undefined;
831
- startTerminal?: boolean | undefined;
832
- generateSummary?: boolean | undefined;
833
- } | undefined;
834
- } | undefined;
835
- agents?: Record<string, {
836
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
837
- swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
838
- enabled?: boolean | undefined;
839
- providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
840
- review?: boolean | undefined;
841
- swarmReview?: boolean | undefined;
842
- }> | null | undefined;
843
- summary?: {
844
- model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
845
- } | undefined;
846
- capabilities?: {
847
- web?: {
848
- basePort?: number | undefined;
849
- protocol?: "http" | "https" | undefined;
850
- devServer?: "docker" | "process" | undefined;
851
- dockerFile?: string | undefined;
852
- containerPort?: number | undefined;
853
- dockerBuildArgs?: Record<string, string> | undefined;
854
- dockerBuildSecrets?: Record<string, string> | undefined;
855
- dockerRunArgs?: string[] | undefined;
856
- dockerRunEnv?: Record<string, string> | undefined;
857
- } | undefined;
858
- database?: {
859
- databaseUrlEnvVarName?: string | undefined;
860
- } | undefined;
861
- } | undefined;
862
- databaseProviders?: {
863
- neon?: {
864
- projectId: string;
865
- parentBranch: string;
866
- } | undefined;
867
- } | undefined;
868
- issueManagement?: {
869
- github?: {
870
- remote: string;
871
- } | undefined;
872
- linear?: {
873
- teamId: string;
874
- branchFormat?: string | undefined;
875
- apiToken?: string | undefined;
876
- } | undefined;
877
- jira?: {
878
- host: string;
879
- username: string;
880
- projectKey: string;
881
- apiToken?: string | undefined;
882
- boardId?: string | undefined;
883
- transitionMappings?: Record<string, string> | undefined;
884
- defaultIssueType?: string | undefined;
885
- defaultSubtaskType?: string | undefined;
886
- doneStatuses?: string[] | undefined;
887
- } | undefined;
888
- provider?: "github" | "linear" | "jira" | undefined;
889
- } | undefined;
890
- versionControl?: {
891
- provider?: "github" | "bitbucket" | undefined;
892
- bitbucket?: {
893
- username: string;
894
- apiToken?: string | undefined;
895
- workspace?: string | undefined;
896
- repoSlug?: string | undefined;
897
- reviewers?: string[] | undefined;
898
- } | undefined;
899
- } | undefined;
900
- mergeBehavior?: {
901
- mode?: "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined;
902
- remote?: string | undefined;
903
- autoCommitPush?: boolean | undefined;
904
- prTitlePrefix?: boolean | undefined;
905
- openBrowserOnFinish?: boolean | undefined;
906
- } | undefined;
907
- ide?: {
908
- type?: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity" | undefined;
909
- } | undefined;
910
- colors?: {
911
- terminal?: boolean | undefined;
912
- vscode?: boolean | undefined;
913
- } | undefined;
914
- attribution?: "off" | "upstreamOnly" | "on" | undefined;
915
- git?: {
916
- commitTimeout?: number | undefined;
917
- } | undefined;
918
- }>;
129
+ interface ResourceCleanupOptions {
130
+ /** Preview operations without executing */
131
+ dryRun?: boolean;
132
+ /** Skip confirmations and safety checks */
133
+ force?: boolean;
134
+ /** Delete the associated branch */
135
+ deleteBranch?: boolean;
136
+ /** Keep database branch instead of deleting */
137
+ keepDatabase?: boolean;
138
+ /** Prompt for confirmation before operations */
139
+ interactive?: boolean;
140
+ /** Check if branch is merged before allowing cleanup (defaults to true when deleteBranch is true) */
141
+ checkMergeSafety?: boolean;
142
+ /** Check if branch exists on remote before allowing cleanup (useful for GitHub-PR mode) */
143
+ checkRemoteBranch?: boolean;
144
+ /** Pre-resolved worktree to clean up (skips the search step) */
145
+ worktree?: {
146
+ path: string;
147
+ branch: string;
148
+ };
149
+ /** Archive metadata instead of deleting (preserves loom in il list --finished) */
150
+ archive?: boolean;
151
+ }
152
+ /**
153
+ * Result of a cleanup operation
154
+ */
155
+ interface CleanupResult {
156
+ /** Identifier that was cleaned up */
157
+ identifier: string;
158
+ /** Actual branch name that was found (will differ from identifier) */
159
+ branchName?: string;
160
+ /** Overall success status */
161
+ success: boolean;
162
+ /** Whether this was a dry-run operation */
163
+ dryRun?: boolean;
164
+ /** Individual operation results */
165
+ operations: OperationResult[];
166
+ /** Errors encountered during cleanup */
167
+ errors: Error[];
168
+ /** Whether rollback is required */
169
+ rollbackRequired?: boolean;
170
+ }
171
+ /**
172
+ * Result of an individual cleanup operation
173
+ */
174
+ interface OperationResult {
175
+ /** Type of operation performed */
176
+ type: 'dev-server' | 'worktree' | 'branch' | 'database' | 'cli-symlinks' | 'recap' | 'metadata' | 'trust';
177
+ /** Whether operation succeeded */
178
+ success: boolean;
179
+ /** Human-readable message */
180
+ message: string;
181
+ /** Error message if operation failed */
182
+ error?: string;
183
+ /** For database operations: whether branch was actually deleted (vs not found) */
184
+ deleted?: boolean;
185
+ }
186
+ /**
187
+ * Safety check result
188
+ */
189
+ interface SafetyCheck {
190
+ /** Whether cleanup is safe to proceed */
191
+ isSafe: boolean;
192
+ /** Non-blocking warnings */
193
+ warnings: string[];
194
+ /** Blocking issues that prevent cleanup */
195
+ blockers: string[];
196
+ }
197
+ /**
198
+ * Options for branch deletion
199
+ */
200
+ interface BranchDeleteOptions {
201
+ /** Force delete unmerged branch */
202
+ force?: boolean;
203
+ /** Also delete remote branch */
204
+ remote?: boolean;
205
+ /** Preview without executing */
206
+ dryRun?: boolean;
207
+ /** Path to the worktree being cleaned up (for merge target resolution) - DEPRECATED: use mergeTargetBranch instead */
208
+ worktreePath?: string;
209
+ /** Pre-fetched merge target branch (parent branch for child looms, main branch for others).
210
+ * This must be fetched BEFORE worktree deletion since metadata won't be readable after deletion. */
211
+ mergeTargetBranch?: string;
212
+ /** Safety check has verified no data loss risk. When true, allows force delete
213
+ * if git branch -d fails with "not fully merged" since safety is already confirmed. */
214
+ safetyVerified?: boolean;
215
+ }
919
216
  /**
920
- * TypeScript type for iloom settings derived from Zod schema
217
+ * Target for batch cleanup - represents a branch that may or may not have a worktree
921
218
  */
922
- type IloomSettings = z.infer<typeof IloomSettingsSchema>;
219
+ interface BranchCleanupTarget {
220
+ /** Branch name */
221
+ branchName: string;
222
+ /** Whether this branch has an associated worktree */
223
+ hasWorktree: boolean;
224
+ /** Path to worktree if it exists */
225
+ worktreePath?: string;
226
+ }
923
227
  /**
924
- * Manages project-level settings from .iloom/settings.json
228
+ * Result of batch cleanup operation for an issue
925
229
  */
926
- declare class SettingsManager {
927
- /**
928
- * Load settings from global, project, and local sources with proper precedence
929
- * Merge hierarchy (lowest to highest priority):
930
- * 1. Global settings (~/.config/iloom-ai/settings.json)
931
- * 2. Project settings (<PROJECT_ROOT>/.iloom/settings.json)
932
- * 3. Local settings (<PROJECT_ROOT>/.iloom/settings.local.json)
933
- * 4. CLI overrides (--set flags)
934
- * Returns empty object if all files don't exist (not an error)
935
- */
936
- loadSettings(projectRoot?: string, cliOverrides?: Partial<IloomSettings>): Promise<IloomSettings>;
937
- /**
938
- * Log the final merged configuration for debugging
939
- */
940
- private logFinalConfiguration;
941
- /**
942
- * Load and parse a single settings file
943
- * Returns empty object if file doesn't exist (not an error)
944
- * Uses non-defaulting schema to prevent polluting partial settings with defaults before merge
945
- */
946
- private loadSettingsFile;
947
- /**
948
- * Deep merge two settings objects with priority to override
949
- * Uses deepmerge library with array replacement strategy
950
- */
951
- private mergeSettings;
952
- /**
953
- * Format all Zod validation errors into a single error message
954
- */
955
- private formatAllZodErrors;
956
- /**
957
- * Validate settings structure and model names using Zod schema
958
- * This method is kept for testing purposes but uses Zod internally
959
- * @internal - Only used in tests via bracket notation
960
- */
961
- private validateSettings;
962
- /**
963
- * Get project root (defaults to process.cwd())
964
- */
965
- private getProjectRoot;
966
- /**
967
- * Get global config directory path (~/.config/iloom-ai)
968
- */
969
- private getGlobalConfigDir;
970
- /**
971
- * Get global settings file path (~/.config/iloom-ai/settings.json)
972
- */
973
- private getGlobalSettingsPath;
974
- /**
975
- * Load and parse global settings file
976
- * Returns empty object if file doesn't exist (not an error)
977
- * Warns but returns empty object on validation/parse errors (graceful degradation)
978
- */
979
- private loadGlobalSettingsFile;
980
- /**
981
- * Get effective protected branches list with mainBranch always included
982
- *
983
- * This method provides a single source of truth for protected branches logic:
984
- * 1. Use configured protectedBranches if provided
985
- * 2. Otherwise use defaults: [mainBranch, 'main', 'master', 'develop']
986
- * 3. ALWAYS ensure mainBranch is included even if user configured custom list
987
- *
988
- * @param projectRoot - Optional project root directory (defaults to process.cwd())
989
- * @returns Array of protected branch names with mainBranch guaranteed to be included
990
- */
991
- getProtectedBranches(projectRoot?: string): Promise<string[]>;
992
- /**
993
- * Get the spin orchestrator model with default applied
994
- * Default is defined in SpinAgentSettingsSchema
995
- *
996
- * @param settings - Pre-loaded settings object
997
- * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
998
- */
999
- getSpinModel(settings?: IloomSettings, mode?: 'swarm'): ClaudeModel;
1000
- /**
1001
- * Get the plan command model with default applied
1002
- * Default is defined in PlanCommandSettingsSchema
1003
- *
1004
- * @param settings - Pre-loaded settings object
1005
- * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
1006
- */
1007
- getPlanModel(settings?: IloomSettings): ClaudeModel;
1008
- /**
1009
- * Get the plan command planner with default applied
1010
- * Default is 'claude'
1011
- *
1012
- * @param settings - Pre-loaded settings object
1013
- * @returns Planner provider ('claude', 'gemini', or 'codex')
1014
- */
1015
- getPlanPlanner(settings?: IloomSettings): 'claude' | 'gemini' | 'codex';
1016
- /**
1017
- * Get the plan command reviewer with default applied
1018
- * Default is 'none' (no review step)
1019
- *
1020
- * @param settings - Pre-loaded settings object
1021
- * @returns Reviewer provider ('claude', 'gemini', 'codex', or 'none')
1022
- */
1023
- getPlanReviewer(settings?: IloomSettings): 'claude' | 'gemini' | 'codex' | 'none';
1024
- /**
1025
- * Get the plan command waveVerification setting with default applied
1026
- * Default is true (verification tasks are generated)
1027
- *
1028
- * @param settings - Pre-loaded settings object
1029
- * @returns Whether wave verification is enabled
1030
- */
1031
- getPlanWaveVerification(settings?: IloomSettings): boolean;
1032
- /**
1033
- * Get the session summary model with default applied
1034
- * Default is defined in SummarySettingsSchema
1035
- *
1036
- * @param settings - Pre-loaded settings object
1037
- * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
1038
- */
1039
- getSummaryModel(settings?: IloomSettings): ClaudeModel;
230
+ interface BatchCleanupResult {
231
+ /** Issue number that was cleaned up */
232
+ issueNumber: string | number;
233
+ /** Number of branches found matching the issue */
234
+ targetsFound: number;
235
+ /** Number of worktrees successfully removed */
236
+ worktreesRemoved: number;
237
+ /** Number of branches successfully deleted */
238
+ branchesDeleted: number;
239
+ /** Number of failed operations */
240
+ failed: number;
241
+ /** Individual cleanup results for each branch */
242
+ results: CleanupResult[];
243
+ }
244
+
245
+ /**
246
+ * Strategy interface for generating branch names from issue information
247
+ */
248
+ interface BranchNameStrategy {
249
+ generate(issueNumber: string | number, title: string): Promise<string>;
250
+ }
251
+ /**
252
+ * Options for branch name generation
253
+ * Supports both simple generation and custom strategy override
254
+ */
255
+ interface BranchGenerationOptions {
256
+ issueNumber: string | number;
257
+ title: string;
258
+ strategy?: BranchNameStrategy;
259
+ }
260
+
261
+ interface EnvVariable {
262
+ key: string;
263
+ value: string;
264
+ }
265
+ interface EnvFileOptions {
266
+ path: string;
267
+ backup?: boolean;
268
+ encoding?: BufferEncoding;
269
+ }
270
+ /**
271
+ * @deprecated Use exception-based error handling instead
272
+ */
273
+ interface EnvOperationResult {
274
+ success: boolean;
275
+ backupPath?: string;
276
+ error?: string;
277
+ }
278
+ interface PortAssignmentOptions {
279
+ basePort?: number;
280
+ issueNumber?: string | number;
281
+ prNumber?: number;
282
+ branchName?: string;
283
+ }
284
+
285
+ type ProjectCapability = 'cli' | 'web';
286
+ type Capability = ProjectCapability;
287
+ interface Loom {
288
+ id: string;
289
+ path: string;
290
+ branch: string;
291
+ type: 'issue' | 'pr' | 'branch' | 'epic';
292
+ identifier: string | number;
293
+ port: number;
294
+ databaseBranch?: string;
295
+ description?: string;
296
+ createdAt: Date;
297
+ lastAccessed: Date;
298
+ issueData?: {
299
+ title?: string;
300
+ body?: string;
301
+ url?: string;
302
+ state?: string;
303
+ };
304
+ capabilities?: ProjectCapability[];
305
+ binEntries?: Record<string, string>;
306
+ cliSymlinks?: string[];
307
+ }
308
+ interface CreateLoomInput {
309
+ type: 'issue' | 'pr' | 'branch' | 'epic';
310
+ identifier: string | number;
311
+ originalInput: string;
312
+ baseBranch?: string;
313
+ parentLoom?: {
314
+ type: 'issue' | 'pr' | 'branch' | 'epic';
315
+ identifier: string | number;
316
+ branchName: string;
317
+ worktreePath: string;
318
+ databaseBranch?: string;
319
+ };
320
+ options?: {
321
+ skipDatabase?: boolean;
322
+ colorTerminal?: boolean;
323
+ colorVscode?: boolean;
324
+ enableClaude?: boolean;
325
+ enableCode?: boolean;
326
+ enableDevServer?: boolean;
327
+ enableTerminal?: boolean;
328
+ oneShot?: OneShotMode;
329
+ dangerouslySkipPermissions?: boolean;
330
+ complexity?: ComplexityOverride;
331
+ effort?: EffortLevel;
332
+ setArguments?: string[];
333
+ executablePath?: string;
334
+ sourceEnvOnStart?: boolean;
335
+ childIssueNumbers?: string[];
336
+ childIssues?: Array<{
337
+ number: string;
338
+ title: string;
339
+ body: string;
340
+ url: string;
341
+ }>;
342
+ dependencyMap?: Record<string, string[]>;
343
+ };
344
+ }
345
+ type LaunchMode = 'editor' | 'terminal' | 'both';
346
+ interface LoomSummary {
347
+ id: string;
348
+ type: 'issue' | 'pr' | 'branch' | 'epic';
349
+ identifier: string | number;
350
+ title?: string;
351
+ branch: string;
352
+ port: number;
353
+ status: 'active' | 'stale' | 'error';
354
+ lastAccessed: string;
1040
355
  }
1041
356
 
1042
357
  /**
1043
- * Manages Git worktrees for the iloom CLI
1044
- * Ports functionality from bash scripts into TypeScript
358
+ * Information about a running process
1045
359
  */
1046
- declare class GitWorktreeManager {
1047
- private readonly _workingDirectory;
1048
- constructor(workingDirectory?: string);
1049
- /**
1050
- * Get the working directory for git operations (main worktree path)
1051
- */
1052
- get workingDirectory(): string;
1053
- /**
1054
- * List all worktrees in the repository
1055
- * Defaults to porcelain format for reliable machine parsing
1056
- * Equivalent to: git worktree list --porcelain
1057
- */
1058
- listWorktrees(options?: WorktreeListOptions): Promise<GitWorktree[]>;
1059
- /**
1060
- * Find worktree for a specific branch
1061
- * Ports: find_worktree_for_branch() from find-worktree-for-branch.sh
1062
- */
1063
- findWorktreeForBranch(branchName: string): Promise<GitWorktree | null>;
1064
- /**
1065
- * Check if a worktree is the main repository worktree
1066
- * Uses findMainWorktreePathWithSettings to determine the main worktree based on settings.
1067
- *
1068
- * @param worktree - The worktree to check
1069
- * @param settingsManager - SettingsManager instance for loading settings
1070
- * @returns true if the worktree is the main worktree
1071
- */
1072
- isMainWorktree(worktree: GitWorktree, settingsManager: SettingsManager): Promise<boolean>;
1073
- /**
1074
- * Check if a worktree is a PR worktree based on naming patterns
1075
- * Ports: is_pr_worktree() from worktree-utils.sh
1076
- */
1077
- isPRWorktree(worktree: GitWorktree): boolean;
1078
- /**
1079
- * Get PR number from worktree branch name
1080
- * Ports: get_pr_number_from_worktree() from worktree-utils.sh
1081
- */
1082
- getPRNumberFromWorktree(worktree: GitWorktree): number | null;
1083
- /**
1084
- * Create a new worktree
1085
- * Ports worktree creation logic from new-branch-workflow.sh
1086
- * @returns The absolute path to the created worktree
1087
- */
1088
- createWorktree(options: WorktreeCreateOptions): Promise<string>;
1089
- /**
1090
- * Remove a worktree and optionally clean up associated files
1091
- * Ports worktree removal logic from cleanup-worktree.sh
1092
- * @returns A message describing what was done (for dry-run mode)
1093
- */
1094
- removeWorktree(worktreePath: string, options?: WorktreeCleanupOptions): Promise<string | void>;
1095
- /**
1096
- * Validate worktree state and integrity
1097
- */
1098
- validateWorktree(worktreePath: string): Promise<WorktreeValidation>;
1099
- /**
1100
- * Get detailed status information for a worktree
1101
- */
1102
- getWorktreeStatus(worktreePath: string): Promise<WorktreeStatus>;
1103
- /**
1104
- * Generate a suggested worktree path for a branch
1105
- */
1106
- generateWorktreePath(branchName: string, customRoot?: string, options?: {
1107
- isPR?: boolean;
1108
- prNumber?: number;
1109
- prefix?: string;
1110
- }): string;
1111
- /**
1112
- * Sanitize a branch name for use as a directory name
1113
- * Replaces slashes with dashes and removes invalid filesystem characters
1114
- * Ports logic from bash script line 593: ${BRANCH_NAME//\\//-}
1115
- */
1116
- sanitizeBranchName(branchName: string): string;
1117
- /**
1118
- * Check if repository is in a valid state for worktree operations
1119
- */
1120
- isRepoReady(): Promise<boolean>;
1121
- /**
1122
- * Get repository information
1123
- */
1124
- getRepoInfo(): Promise<{
1125
- root: string | null;
1126
- defaultBranch: string;
1127
- currentBranch: string | null;
1128
- }>;
1129
- /**
1130
- * Prune stale worktree entries (worktrees that no longer exist on disk)
1131
- */
1132
- pruneWorktrees(): Promise<void>;
1133
- /**
1134
- * Lock a worktree to prevent it from being pruned or moved
1135
- */
1136
- lockWorktree(worktreePath: string, reason?: string): Promise<void>;
1137
- /**
1138
- * Unlock a previously locked worktree
1139
- */
1140
- unlockWorktree(worktreePath: string): Promise<void>;
1141
- /**
1142
- * Find worktrees matching an identifier (branch name, path, or PR number)
1143
- */
1144
- findWorktreesByIdentifier(identifier: string): Promise<GitWorktree[]>;
1145
- /**
1146
- * Find worktree for a specific issue number using exact pattern matching
1147
- * Matches: issue-{N} at start OR after /, -, _ (but NOT issue-{N}X where X is a digit)
1148
- * Supports patterns like: issue-44, feat/issue-44-feature, feat-issue-44, bugfix_issue-44, etc.
1149
- * Avoids false matches like: tissue-44, myissue-44
1150
- * Ports: find_existing_worktree() from bash script lines 131-165
1151
- */
1152
- findWorktreeForIssue(issueNumber: string | number): Promise<GitWorktree | null>;
1153
- /**
1154
- * Find worktree for a specific PR by branch name
1155
- * Ports: find_existing_worktree() for PR type from bash script lines 149-160
1156
- */
1157
- findWorktreeForPR(prNumber: number, branchName: string): Promise<GitWorktree | null>;
360
+ interface ProcessInfo {
361
+ /** Process ID */
362
+ pid: number;
363
+ /** Process name (e.g., "node", "pnpm") */
364
+ name: string;
365
+ /** Full command line */
366
+ command: string;
367
+ /** Port the process is listening on */
368
+ port: number;
369
+ /** Whether this appears to be a dev server */
370
+ isDevServer: boolean;
371
+ }
372
+
373
+ interface TelemetryConfig {
374
+ enabled: boolean;
375
+ disclosed_at?: string;
376
+ last_version?: string;
377
+ }
378
+ interface CliInstalledProperties {
379
+ version: string;
380
+ os: string;
381
+ node_version: string;
382
+ }
383
+ interface CliUpgradedProperties {
384
+ version: string;
385
+ previous_version: string;
386
+ os: string;
387
+ }
388
+ interface LoomCreatedProperties {
389
+ source_type: 'issue' | 'pr' | 'branch' | 'freeform';
390
+ tracker: string;
391
+ is_child_loom: boolean;
392
+ one_shot_mode: 'default' | 'skip-reviews' | 'yolo';
393
+ complexity_override: boolean;
394
+ create_only: boolean;
395
+ }
396
+ interface LoomFinishedProperties {
397
+ merge_behavior: 'local' | 'pr' | 'draft-pr';
398
+ duration_minutes: number;
399
+ }
400
+ interface LoomAbandonedProperties {
401
+ duration_minutes: number;
402
+ phase_reached: string;
403
+ }
404
+ interface EpicPlannedProperties {
405
+ child_count: number;
406
+ tracker: string;
407
+ }
408
+ interface SwarmStartedProperties {
409
+ child_count: number;
410
+ tracker: string;
411
+ }
412
+ interface SwarmChildCompletedProperties {
413
+ success: boolean;
414
+ duration_minutes: number;
415
+ }
416
+ interface SwarmCompletedProperties {
417
+ total_children: number;
418
+ succeeded: number;
419
+ failed: number;
420
+ duration_minutes: number;
421
+ }
422
+ interface DemoStartedProperties {
423
+ path: string;
424
+ }
425
+ interface DemoCompletedProperties {
426
+ path: string;
427
+ converted_to_real_project: boolean;
428
+ }
429
+ interface ContributeStartedProperties {
430
+ tracker: string;
431
+ }
432
+ interface SessionStartedProperties {
433
+ has_neon: boolean;
434
+ language: string;
435
+ effort?: EffortLevel;
436
+ }
437
+ interface ErrorOccurredProperties {
438
+ error_type: string;
439
+ command: string;
440
+ phase: string;
441
+ }
442
+ interface InitStartedProperties {
443
+ mode: 'accept-defaults' | 'guided' | 'guided-custom-prompt';
444
+ }
445
+ interface InitCompletedProperties {
446
+ mode: 'accept-defaults' | 'guided' | 'guided-custom-prompt';
447
+ }
448
+ interface AutoSwarmStartedProperties {
449
+ source: 'decomposition' | 'fresh';
450
+ planner: string;
451
+ }
452
+ interface AutoSwarmCompletedProperties {
453
+ source: 'decomposition' | 'fresh';
454
+ success: boolean;
455
+ child_count: number;
456
+ duration_minutes: number;
457
+ phase_reached: 'plan' | 'start' | 'spin';
458
+ fallback_to_normal: boolean;
459
+ }
460
+ interface EpicReportGeneratedProperties {
461
+ total_children: number;
462
+ succeeded: number;
463
+ failed: number;
464
+ }
465
+ interface DevServerStartedEvent {
466
+ /** Execution mode for the dev server */
467
+ mode: 'docker' | 'process';
468
+ /** Whether the dev server started successfully */
469
+ success: boolean;
1158
470
  /**
1159
- * Remove multiple worktrees
1160
- * Returns a summary of successes and failures
1161
- * Automatically filters out the main worktree
1162
- *
1163
- * @param worktrees - Array of worktrees to remove
1164
- * @param settingsManager - SettingsManager instance for determining main worktree
1165
- * @param options - Cleanup options
471
+ * Time in milliseconds to build the Docker image.
472
+ * Only present when mode is 'docker'.
1166
473
  */
1167
- removeWorktrees(worktrees: GitWorktree[], settingsManager: SettingsManager, options?: WorktreeCleanupOptions): Promise<{
1168
- successes: Array<{
1169
- worktree: GitWorktree;
1170
- }>;
1171
- failures: Array<{
1172
- worktree: GitWorktree;
1173
- error: string;
1174
- }>;
1175
- skipped: Array<{
1176
- worktree: GitWorktree;
1177
- reason: string;
1178
- }>;
1179
- }>;
474
+ buildDurationMs?: number;
475
+ /** Time in milliseconds from start to the server being ready */
476
+ startDurationMs: number;
1180
477
  /**
1181
- * Format worktree information for display
478
+ * Number of BuildKit secrets mounted during docker build.
479
+ * Only present when mode is 'docker' and secrets are configured.
480
+ * Tracks feature adoption without exposing secret IDs or paths.
1182
481
  */
1183
- formatWorktree(worktree: GitWorktree): {
1184
- title: string;
1185
- path: string;
1186
- commit: string;
1187
- };
482
+ docker_build_secrets_count?: number;
483
+ }
484
+ interface DevServerStoppedEvent {
485
+ /** Execution mode for the dev server */
486
+ mode: 'docker' | 'process';
487
+ /** Reason the dev server stopped */
488
+ reason: 'user' | 'cleanup' | 'error';
489
+ }
490
+ interface TelemetryEventMap {
491
+ 'cli.installed': CliInstalledProperties;
492
+ 'cli.upgraded': CliUpgradedProperties;
493
+ 'loom.created': LoomCreatedProperties;
494
+ 'loom.finished': LoomFinishedProperties;
495
+ 'loom.abandoned': LoomAbandonedProperties;
496
+ 'epic.planned': EpicPlannedProperties;
497
+ 'swarm.started': SwarmStartedProperties;
498
+ 'swarm.child_completed': SwarmChildCompletedProperties;
499
+ 'swarm.completed': SwarmCompletedProperties;
500
+ 'demo.started': DemoStartedProperties;
501
+ 'demo.completed': DemoCompletedProperties;
502
+ 'contribute.started': ContributeStartedProperties;
503
+ 'session.started': SessionStartedProperties;
504
+ 'error.occurred': ErrorOccurredProperties;
505
+ 'init.started': InitStartedProperties;
506
+ 'init.completed': InitCompletedProperties;
507
+ 'auto_swarm.started': AutoSwarmStartedProperties;
508
+ 'auto_swarm.completed': AutoSwarmCompletedProperties;
509
+ 'epic.report_generated': EpicReportGeneratedProperties;
510
+ 'devServer.started': DevServerStartedEvent;
511
+ 'devServer.stopped': DevServerStoppedEvent;
512
+ }
513
+ type TelemetryEventName = keyof TelemetryEventMap;
514
+
515
+ interface Workspace {
516
+ id: string;
517
+ path: string;
518
+ branch: string;
519
+ issueNumber?: string | number;
520
+ prNumber?: number;
521
+ port: number;
522
+ databaseBranch?: string;
523
+ createdAt: Date;
524
+ lastAccessed: Date;
525
+ }
526
+ interface WorkspaceInput {
527
+ identifier: string;
528
+ type: 'issue' | 'pr' | 'branch';
529
+ skipClaude?: boolean;
530
+ }
531
+ interface WorkspaceSummary {
532
+ id: string;
533
+ issueNumber?: string | number;
534
+ prNumber?: number;
535
+ title: string;
536
+ branch: string;
537
+ port: number;
538
+ status: 'active' | 'stale' | 'error';
539
+ lastAccessed: string;
540
+ }
541
+ interface Worktree {
542
+ path: string;
543
+ branch: string;
544
+ commit: string;
545
+ isPR: boolean;
546
+ prNumber?: number;
547
+ issueNumber?: string | number;
548
+ port?: number;
549
+ }
550
+ interface GitStatus {
551
+ hasUncommittedChanges: boolean;
552
+ unstagedFiles: string[];
553
+ stagedFiles: string[];
554
+ currentBranch: string;
555
+ isAheadOfRemote: boolean;
556
+ isBehindRemote: boolean;
557
+ }
558
+ interface Issue {
559
+ number: string | number;
560
+ title: string;
561
+ body: string;
562
+ state: 'open' | 'closed';
563
+ labels: string[];
564
+ assignees: string[];
565
+ url: string;
566
+ }
567
+ interface PullRequest {
568
+ number: number;
569
+ title: string;
570
+ body: string;
571
+ state: 'open' | 'closed' | 'merged';
572
+ branch: string;
573
+ baseBranch: string;
574
+ url: string;
575
+ isDraft: boolean;
576
+ isFork?: boolean;
577
+ }
578
+ /**
579
+ * Generic input detection result for issue trackers
580
+ * String-based identifier to support non-numeric IDs (e.g., Linear "ENG-123")
581
+ */
582
+ interface IssueTrackerInputDetection {
583
+ type: 'issue' | 'pr' | 'unknown';
584
+ identifier: string | null;
585
+ rawInput: string;
1188
586
  }
1189
587
 
1190
588
  /**
1191
- * Options for ResourceCleanup operations
589
+ * Result of database branch deletion operation
590
+ * Distinguishes between successful deletion, branch not found, and errors
1192
591
  */
1193
- interface ResourceCleanupOptions {
1194
- /** Preview operations without executing */
592
+ interface DatabaseDeletionResult {
593
+ /** Overall operation succeeded (true even if branch didn't exist) */
594
+ success: boolean;
595
+ /** True only if a branch was actually deleted */
596
+ deleted: boolean;
597
+ /** True if branch didn't exist (not an error, just nothing to do) */
598
+ notFound: boolean;
599
+ /** Error message if operation failed */
600
+ error?: string;
601
+ /** User declined deletion (for preview databases) */
602
+ userDeclined?: boolean;
603
+ /** Name of the branch that was processed */
604
+ branchName?: string;
605
+ }
606
+ interface DatabaseProvider {
607
+ createBranch(name: string, fromBranch?: string, cwd?: string): Promise<string>;
608
+ deleteBranch(name: string, isPreview?: boolean, cwd?: string): Promise<DatabaseDeletionResult>;
609
+ getConnectionString(branch: string, cwd?: string): Promise<string>;
610
+ listBranches(cwd?: string): Promise<string[]>;
611
+ branchExists(name: string, cwd?: string): Promise<boolean>;
612
+ findPreviewBranch(branchName: string, cwd?: string): Promise<string | null>;
613
+ getBranchNameFromEndpoint(endpointId: string, cwd?: string): Promise<string | null>;
614
+ sanitizeBranchName(branchName: string): string;
615
+ isAuthenticated(cwd?: string): Promise<boolean>;
616
+ isCliAvailable(): Promise<boolean>;
617
+ isConfigured(): boolean;
618
+ }
619
+ interface Config {
620
+ defaultPort: number;
621
+ databaseProvider?: 'neon' | 'supabase' | 'planetscale';
622
+ claudeModel?: ClaudeModel;
623
+ skipClaude?: boolean;
624
+ customWorkspaceRoot?: string;
625
+ }
626
+ type OneShotMode = 'default' | 'noReview' | 'bypassPermissions';
627
+ type ComplexityOverride = 'trivial' | 'simple' | 'complex';
628
+ declare const VALID_EFFORT_LEVELS: readonly ["low", "medium", "high", "max"];
629
+ type EffortLevel = (typeof VALID_EFFORT_LEVELS)[number];
630
+ /**
631
+ * Type guard for EffortLevel values
632
+ * Validates that a value is a valid effort level at runtime
633
+ */
634
+ declare function isEffortLevel(value: unknown): value is EffortLevel;
635
+ interface StartOptions {
636
+ claude?: boolean;
637
+ code?: boolean;
638
+ devServer?: boolean;
639
+ terminal?: boolean;
640
+ childLoom?: boolean;
641
+ epic?: boolean;
642
+ createOnly?: boolean;
643
+ oneShot?: OneShotMode;
644
+ dangerouslySkipPermissions?: boolean;
645
+ complexity?: ComplexityOverride;
646
+ effort?: EffortLevel;
647
+ body?: string;
648
+ json?: boolean;
649
+ }
650
+ interface AddIssueOptions {
651
+ body?: string;
652
+ json?: boolean;
653
+ }
654
+ interface FeedbackOptions {
655
+ body?: string;
656
+ }
657
+ interface EnhanceOptions {
658
+ noBrowser?: boolean;
659
+ json?: boolean;
660
+ }
661
+ interface FinishOptions {
662
+ force?: boolean;
1195
663
  dryRun?: boolean;
1196
- /** Skip confirmations and safety checks */
664
+ pr?: number;
665
+ skipBuild?: boolean;
666
+ noBrowser?: boolean;
667
+ cleanup?: boolean;
668
+ json?: boolean;
669
+ skipToPr?: boolean;
670
+ jsonStream?: boolean;
671
+ review?: boolean;
672
+ }
673
+ /**
674
+ * Options for the cleanup command
675
+ * All flags are optional and can be combined (subject to validation)
676
+ */
677
+ interface CleanupOptions {
678
+ /** List all worktrees without removing anything */
679
+ list?: boolean;
680
+ /** Remove all worktrees (interactive confirmation required unless --force) */
681
+ all?: boolean;
682
+ /** Cleanup by specific issue identifier (numeric or alphanumeric like RANDOM-13) */
683
+ issue?: string | number;
684
+ /** Skip confirmations and force removal */
1197
685
  force?: boolean;
1198
- /** Delete the associated branch */
1199
- deleteBranch?: boolean;
1200
- /** Keep database branch instead of deleting */
1201
- keepDatabase?: boolean;
1202
- /** Prompt for confirmation before operations */
1203
- interactive?: boolean;
1204
- /** Check if branch is merged before allowing cleanup (defaults to true when deleteBranch is true) */
1205
- checkMergeSafety?: boolean;
1206
- /** Check if branch exists on remote before allowing cleanup (useful for GitHub-PR mode) */
1207
- checkRemoteBranch?: boolean;
1208
- /** Pre-resolved worktree to clean up (skips the search step) */
1209
- worktree?: {
1210
- path: string;
1211
- branch: string;
1212
- };
686
+ /** Show what would be done without actually doing it */
687
+ dryRun?: boolean;
688
+ /** Output result as JSON */
689
+ json?: boolean;
690
+ /** Wait specified milliseconds before cleanup execution */
691
+ defer?: number;
1213
692
  /** Archive metadata instead of deleting (preserves loom in il list --finished) */
1214
693
  archive?: boolean;
1215
694
  }
1216
- /**
1217
- * Result of a cleanup operation
1218
- */
1219
- interface CleanupResult {
1220
- /** Identifier that was cleaned up */
1221
- identifier: string;
1222
- /** Actual branch name that was found (will differ from identifier) */
1223
- branchName?: string;
1224
- /** Overall success status */
695
+ interface ListOptions {
696
+ json?: boolean;
697
+ }
698
+ interface AddIssueResult {
699
+ url: string;
700
+ id: number;
701
+ title: string;
702
+ created_at: string;
703
+ }
704
+ interface EnhanceResult {
705
+ url: string;
706
+ id: number;
707
+ title: string;
708
+ created_at: string;
709
+ enhanced: boolean;
710
+ }
711
+ interface StartResult {
712
+ id: string;
713
+ path: string;
714
+ branch: string;
715
+ port?: number;
716
+ type: 'issue' | 'pr' | 'branch' | 'epic';
717
+ identifier: string | number;
718
+ title?: string;
719
+ capabilities?: string[];
720
+ childIssueNumbers?: string[];
721
+ }
722
+ interface FinishResult {
1225
723
  success: boolean;
724
+ type: 'issue' | 'pr' | 'branch' | 'epic';
725
+ identifier: string | number;
1226
726
  /** Whether this was a dry-run operation */
1227
727
  dryRun?: boolean;
1228
- /** Individual operation results */
1229
- operations: OperationResult[];
1230
- /** Errors encountered during cleanup */
1231
- errors: Error[];
1232
- /** Whether rollback is required */
1233
- rollbackRequired?: boolean;
728
+ operations: Array<{
729
+ type: 'validation' | 'commit' | 'rebase' | 'merge' | 'cleanup' | 'pr-creation' | 'pr-ready' | 'build';
730
+ message: string;
731
+ success: boolean;
732
+ error?: string;
733
+ }>;
734
+ prUrl?: string;
735
+ cleanupResult?: CleanupResult;
1234
736
  }
1235
- /**
1236
- * Result of an individual cleanup operation
1237
- */
1238
- interface OperationResult {
1239
- /** Type of operation performed */
1240
- type: 'dev-server' | 'worktree' | 'branch' | 'database' | 'cli-symlinks' | 'recap' | 'metadata' | 'trust';
1241
- /** Whether operation succeeded */
737
+ interface SummaryResult {
738
+ summary: string;
739
+ sessionId: string;
740
+ issueNumber?: string | number;
741
+ branchName: string;
742
+ loomType: 'issue' | 'pr' | 'branch' | 'epic';
743
+ }
744
+ interface RebaseResult {
1242
745
  success: boolean;
1243
- /** Human-readable message */
1244
- message: string;
1245
- /** Error message if operation failed */
746
+ conflictsDetected: boolean;
747
+ claudeLaunched: boolean;
748
+ conflictsResolved?: boolean;
1246
749
  error?: string;
1247
- /** For database operations: whether branch was actually deleted (vs not found) */
1248
- deleted?: boolean;
1249
750
  }
1250
- /**
1251
- * Safety check result
1252
- */
1253
- interface SafetyCheck {
1254
- /** Whether cleanup is safe to proceed */
1255
- isSafe: boolean;
1256
- /** Non-blocking warnings */
1257
- warnings: string[];
1258
- /** Blocking issues that prevent cleanup */
1259
- blockers: string[];
751
+ interface RebaseOutcome {
752
+ conflictsDetected: boolean;
753
+ claudeLaunched: boolean;
754
+ conflictsResolved: boolean;
1260
755
  }
1261
- /**
1262
- * Options for branch deletion
1263
- */
1264
- interface BranchDeleteOptions {
1265
- /** Force delete unmerged branch */
1266
- force?: boolean;
1267
- /** Also delete remote branch */
1268
- remote?: boolean;
1269
- /** Preview without executing */
1270
- dryRun?: boolean;
1271
- /** Path to the worktree being cleaned up (for merge target resolution) - DEPRECATED: use mergeTargetBranch instead */
1272
- worktreePath?: string;
1273
- /** Pre-fetched merge target branch (parent branch for child looms, main branch for others).
1274
- * This must be fetched BEFORE worktree deletion since metadata won't be readable after deletion. */
1275
- mergeTargetBranch?: string;
1276
- /** Safety check has verified no data loss risk. When true, allows force delete
1277
- * if git branch -d fails with "not fully merged" since safety is already confirmed. */
1278
- safetyVerified?: boolean;
756
+ interface MockOptions {
757
+ scenario: 'empty' | 'existing' | 'conflicts' | 'error';
758
+ data?: unknown;
1279
759
  }
1280
- /**
1281
- * Target for batch cleanup - represents a branch that may or may not have a worktree
1282
- */
1283
- interface BranchCleanupTarget {
1284
- /** Branch name */
1285
- branchName: string;
1286
- /** Whether this branch has an associated worktree */
1287
- hasWorktree: boolean;
1288
- /** Path to worktree if it exists */
1289
- worktreePath?: string;
760
+
761
+ interface RgbColor {
762
+ r: number;
763
+ g: number;
764
+ b: number;
1290
765
  }
1291
- /**
1292
- * Result of batch cleanup operation for an issue
1293
- */
1294
- interface BatchCleanupResult {
1295
- /** Issue number that was cleaned up */
1296
- issueNumber: string | number;
1297
- /** Number of branches found matching the issue */
1298
- targetsFound: number;
1299
- /** Number of worktrees successfully removed */
1300
- worktreesRemoved: number;
1301
- /** Number of branches successfully deleted */
1302
- branchesDeleted: number;
1303
- /** Number of failed operations */
1304
- failed: number;
1305
- /** Individual cleanup results for each branch */
1306
- results: CleanupResult[];
766
+ interface ColorData {
767
+ rgb: RgbColor;
768
+ hex: string;
769
+ index: number;
1307
770
  }
1308
-
1309
- /**
1310
- * Strategy interface for generating branch names from issue information
1311
- */
1312
- interface BranchNameStrategy {
1313
- generate(issueNumber: string | number, title: string): Promise<string>;
771
+ type Platform = 'darwin' | 'linux' | 'win32' | 'unsupported';
772
+ interface ValidationOptions {
773
+ dryRun?: boolean;
774
+ skipTypecheck?: boolean;
775
+ skipLint?: boolean;
776
+ skipTests?: boolean;
777
+ jsonStream?: boolean;
1314
778
  }
1315
- /**
1316
- * Options for branch name generation
1317
- * Supports both simple generation and custom strategy override
1318
- */
1319
- interface BranchGenerationOptions {
1320
- issueNumber: string | number;
1321
- title: string;
1322
- strategy?: BranchNameStrategy;
779
+ interface ValidationStepResult {
780
+ step: 'typecheck' | 'compile' | 'lint' | 'test';
781
+ passed: boolean;
782
+ skipped: boolean;
783
+ output?: string;
784
+ error?: string;
785
+ duration?: number;
1323
786
  }
1324
-
1325
- interface EnvVariable {
1326
- key: string;
1327
- value: string;
787
+ interface ValidationResult {
788
+ success: boolean;
789
+ steps: ValidationStepResult[];
790
+ totalDuration: number;
1328
791
  }
1329
- interface EnvFileOptions {
1330
- path: string;
1331
- backup?: boolean;
1332
- encoding?: BufferEncoding;
792
+ interface CommitOptions {
793
+ dryRun?: boolean;
794
+ issueNumber?: string | number;
795
+ issuePrefix: string;
796
+ message?: string;
797
+ noReview?: boolean;
798
+ skipVerify?: boolean;
799
+ skipVerifySilent?: boolean;
800
+ trailerType?: 'Refs' | 'Fixes';
801
+ timeout?: number;
1333
802
  }
1334
803
  /**
1335
- * @deprecated Use exception-based error handling instead
804
+ * Error thrown when user aborts a commit operation
805
+ * Used by CommitManager when user selects 'abort' at the commit prompt
1336
806
  */
1337
- interface EnvOperationResult {
1338
- success: boolean;
1339
- backupPath?: string;
1340
- error?: string;
807
+ declare class UserAbortedCommitError extends Error {
808
+ constructor(message?: string);
1341
809
  }
1342
- interface PortAssignmentOptions {
1343
- basePort?: number;
1344
- issueNumber?: string | number;
1345
- prNumber?: number;
1346
- branchName?: string;
810
+ interface MergeOptions {
811
+ dryRun?: boolean;
812
+ force?: boolean;
813
+ repoRoot?: string;
814
+ jsonStream?: boolean;
1347
815
  }
1348
-
1349
- type ProjectCapability = 'cli' | 'web';
1350
- type Capability = ProjectCapability;
1351
- interface Loom {
1352
- id: string;
1353
- path: string;
1354
- branch: string;
1355
- type: 'issue' | 'pr' | 'branch' | 'epic';
1356
- identifier: string | number;
1357
- port: number;
1358
- databaseBranch?: string;
1359
- description?: string;
1360
- createdAt: Date;
1361
- lastAccessed: Date;
1362
- issueData?: {
1363
- title?: string;
1364
- body?: string;
1365
- url?: string;
1366
- state?: string;
1367
- };
1368
- capabilities?: ProjectCapability[];
1369
- binEntries?: Record<string, string>;
1370
- cliSymlinks?: string[];
816
+ interface MergeResult {
817
+ success: boolean;
818
+ branchName: string;
819
+ commitsMerged: number;
820
+ rebaseCompleted: boolean;
821
+ mergeCompleted: boolean;
1371
822
  }
1372
- interface CreateLoomInput {
1373
- type: 'issue' | 'pr' | 'branch' | 'epic';
1374
- identifier: string | number;
1375
- originalInput: string;
1376
- baseBranch?: string;
1377
- parentLoom?: {
1378
- type: 'issue' | 'pr' | 'branch' | 'epic';
1379
- identifier: string | number;
1380
- branchName: string;
1381
- worktreePath: string;
1382
- databaseBranch?: string;
1383
- };
1384
- options?: {
1385
- skipDatabase?: boolean;
1386
- colorTerminal?: boolean;
1387
- colorVscode?: boolean;
1388
- enableClaude?: boolean;
1389
- enableCode?: boolean;
1390
- enableDevServer?: boolean;
1391
- enableTerminal?: boolean;
1392
- oneShot?: OneShotMode;
1393
- dangerouslySkipPermissions?: boolean;
1394
- complexity?: ComplexityOverride;
1395
- setArguments?: string[];
1396
- executablePath?: string;
1397
- sourceEnvOnStart?: boolean;
1398
- childIssueNumbers?: string[];
1399
- childIssues?: Array<{
1400
- number: string;
1401
- title: string;
1402
- body: string;
1403
- url: string;
1404
- }>;
1405
- dependencyMap?: Record<string, string[]>;
823
+ interface UpdateCheckCache {
824
+ lastCheck: number;
825
+ latestVersion: string;
826
+ }
827
+ interface UpdateCheckResult {
828
+ currentVersion: string;
829
+ latestVersion: string;
830
+ updateAvailable: boolean;
831
+ }
832
+ type InstallationMethod = 'global' | 'local' | 'linked' | 'unknown';
833
+
834
+ declare const VALID_CLAUDE_MODELS: readonly ["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"];
835
+ type ClaudeModel = (typeof VALID_CLAUDE_MODELS)[number];
836
+ /**
837
+ * Zod schema for iloom settings
838
+ */
839
+ declare const IloomSettingsSchema: z.ZodObject<{
840
+ mainBranch: z.ZodOptional<z.ZodString>;
841
+ sourceEnvOnStart: z.ZodDefault<z.ZodBoolean>;
842
+ worktreePrefix: z.ZodEffects<z.ZodOptional<z.ZodString>, string | undefined, string | undefined>;
843
+ protectedBranches: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
844
+ copyGitIgnoredPatterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
845
+ workflows: z.ZodOptional<z.ZodObject<{
846
+ issue: z.ZodOptional<z.ZodObject<{
847
+ permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
848
+ noVerify: z.ZodOptional<z.ZodBoolean>;
849
+ startIde: z.ZodDefault<z.ZodBoolean>;
850
+ startDevServer: z.ZodDefault<z.ZodBoolean>;
851
+ startAiAgent: z.ZodDefault<z.ZodBoolean>;
852
+ startTerminal: z.ZodDefault<z.ZodBoolean>;
853
+ generateSummary: z.ZodDefault<z.ZodBoolean>;
854
+ }, "strip", z.ZodTypeAny, {
855
+ startIde: boolean;
856
+ startDevServer: boolean;
857
+ startAiAgent: boolean;
858
+ startTerminal: boolean;
859
+ generateSummary: boolean;
860
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
861
+ noVerify?: boolean | undefined;
862
+ }, {
863
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
864
+ noVerify?: boolean | undefined;
865
+ startIde?: boolean | undefined;
866
+ startDevServer?: boolean | undefined;
867
+ startAiAgent?: boolean | undefined;
868
+ startTerminal?: boolean | undefined;
869
+ generateSummary?: boolean | undefined;
870
+ }>>;
871
+ pr: z.ZodOptional<z.ZodObject<{
872
+ permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
873
+ noVerify: z.ZodOptional<z.ZodBoolean>;
874
+ startIde: z.ZodDefault<z.ZodBoolean>;
875
+ startDevServer: z.ZodDefault<z.ZodBoolean>;
876
+ startAiAgent: z.ZodDefault<z.ZodBoolean>;
877
+ startTerminal: z.ZodDefault<z.ZodBoolean>;
878
+ generateSummary: z.ZodDefault<z.ZodBoolean>;
879
+ }, "strip", z.ZodTypeAny, {
880
+ startIde: boolean;
881
+ startDevServer: boolean;
882
+ startAiAgent: boolean;
883
+ startTerminal: boolean;
884
+ generateSummary: boolean;
885
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
886
+ noVerify?: boolean | undefined;
887
+ }, {
888
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
889
+ noVerify?: boolean | undefined;
890
+ startIde?: boolean | undefined;
891
+ startDevServer?: boolean | undefined;
892
+ startAiAgent?: boolean | undefined;
893
+ startTerminal?: boolean | undefined;
894
+ generateSummary?: boolean | undefined;
895
+ }>>;
896
+ regular: z.ZodOptional<z.ZodObject<{
897
+ permissionMode: z.ZodOptional<z.ZodEnum<["plan", "acceptEdits", "bypassPermissions", "default"]>>;
898
+ noVerify: z.ZodOptional<z.ZodBoolean>;
899
+ startIde: z.ZodDefault<z.ZodBoolean>;
900
+ startDevServer: z.ZodDefault<z.ZodBoolean>;
901
+ startAiAgent: z.ZodDefault<z.ZodBoolean>;
902
+ startTerminal: z.ZodDefault<z.ZodBoolean>;
903
+ generateSummary: z.ZodDefault<z.ZodBoolean>;
904
+ }, "strip", z.ZodTypeAny, {
905
+ startIde: boolean;
906
+ startDevServer: boolean;
907
+ startAiAgent: boolean;
908
+ startTerminal: boolean;
909
+ generateSummary: boolean;
910
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
911
+ noVerify?: boolean | undefined;
912
+ }, {
913
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
914
+ noVerify?: boolean | undefined;
915
+ startIde?: boolean | undefined;
916
+ startDevServer?: boolean | undefined;
917
+ startAiAgent?: boolean | undefined;
918
+ startTerminal?: boolean | undefined;
919
+ generateSummary?: boolean | undefined;
920
+ }>>;
921
+ }, "strip", z.ZodTypeAny, {
922
+ issue?: {
923
+ startIde: boolean;
924
+ startDevServer: boolean;
925
+ startAiAgent: boolean;
926
+ startTerminal: boolean;
927
+ generateSummary: boolean;
928
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
929
+ noVerify?: boolean | undefined;
930
+ } | undefined;
931
+ pr?: {
932
+ startIde: boolean;
933
+ startDevServer: boolean;
934
+ startAiAgent: boolean;
935
+ startTerminal: boolean;
936
+ generateSummary: boolean;
937
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
938
+ noVerify?: boolean | undefined;
939
+ } | undefined;
940
+ regular?: {
941
+ startIde: boolean;
942
+ startDevServer: boolean;
943
+ startAiAgent: boolean;
944
+ startTerminal: boolean;
945
+ generateSummary: boolean;
946
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
947
+ noVerify?: boolean | undefined;
948
+ } | undefined;
949
+ }, {
950
+ issue?: {
951
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
952
+ noVerify?: boolean | undefined;
953
+ startIde?: boolean | undefined;
954
+ startDevServer?: boolean | undefined;
955
+ startAiAgent?: boolean | undefined;
956
+ startTerminal?: boolean | undefined;
957
+ generateSummary?: boolean | undefined;
958
+ } | undefined;
959
+ pr?: {
960
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
961
+ noVerify?: boolean | undefined;
962
+ startIde?: boolean | undefined;
963
+ startDevServer?: boolean | undefined;
964
+ startAiAgent?: boolean | undefined;
965
+ startTerminal?: boolean | undefined;
966
+ generateSummary?: boolean | undefined;
967
+ } | undefined;
968
+ regular?: {
969
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
970
+ noVerify?: boolean | undefined;
971
+ startIde?: boolean | undefined;
972
+ startDevServer?: boolean | undefined;
973
+ startAiAgent?: boolean | undefined;
974
+ startTerminal?: boolean | undefined;
975
+ generateSummary?: boolean | undefined;
976
+ } | undefined;
977
+ }>>;
978
+ agents: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
979
+ model: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
980
+ swarmModel: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
981
+ effort: z.ZodOptional<z.ZodEnum<["low", "medium", "high", "max"]>>;
982
+ swarmEffort: z.ZodOptional<z.ZodEnum<["low", "medium", "high", "max"]>>;
983
+ enabled: z.ZodOptional<z.ZodBoolean>;
984
+ providers: z.ZodOptional<z.ZodRecord<z.ZodEnum<["claude", "gemini", "codex"]>, z.ZodString>>;
985
+ review: z.ZodOptional<z.ZodBoolean>;
986
+ swarmReview: z.ZodOptional<z.ZodBoolean>;
987
+ }, "strip", z.ZodTypeAny, {
988
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
989
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
990
+ effort?: "low" | "medium" | "high" | "max" | undefined;
991
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
992
+ enabled?: boolean | undefined;
993
+ providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
994
+ review?: boolean | undefined;
995
+ swarmReview?: boolean | undefined;
996
+ }, {
997
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
998
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
999
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1000
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1001
+ enabled?: boolean | undefined;
1002
+ providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
1003
+ review?: boolean | undefined;
1004
+ swarmReview?: boolean | undefined;
1005
+ }>>>>;
1006
+ spin: z.ZodOptional<z.ZodObject<{
1007
+ model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
1008
+ swarmModel: z.ZodOptional<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
1009
+ effort: z.ZodOptional<z.ZodEnum<["low", "medium", "high", "max"]>>;
1010
+ swarmEffort: z.ZodOptional<z.ZodEnum<["low", "medium", "high", "max"]>>;
1011
+ postSwarmReview: z.ZodDefault<z.ZodBoolean>;
1012
+ }, "strip", z.ZodTypeAny, {
1013
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1014
+ postSwarmReview: boolean;
1015
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1016
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1017
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1018
+ }, {
1019
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1020
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1021
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1022
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1023
+ postSwarmReview?: boolean | undefined;
1024
+ }>>;
1025
+ plan: z.ZodOptional<z.ZodObject<{
1026
+ model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
1027
+ effort: z.ZodOptional<z.ZodEnum<["low", "medium", "high", "max"]>>;
1028
+ planner: z.ZodDefault<z.ZodEnum<["claude", "gemini", "codex"]>>;
1029
+ reviewer: z.ZodDefault<z.ZodEnum<["claude", "gemini", "codex", "none"]>>;
1030
+ waveVerification: z.ZodDefault<z.ZodBoolean>;
1031
+ }, "strip", z.ZodTypeAny, {
1032
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1033
+ planner: "claude" | "gemini" | "codex";
1034
+ reviewer: "claude" | "gemini" | "codex" | "none";
1035
+ waveVerification: boolean;
1036
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1037
+ }, {
1038
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1039
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1040
+ planner?: "claude" | "gemini" | "codex" | undefined;
1041
+ reviewer?: "claude" | "gemini" | "codex" | "none" | undefined;
1042
+ waveVerification?: boolean | undefined;
1043
+ }>>;
1044
+ summary: z.ZodOptional<z.ZodObject<{
1045
+ model: z.ZodDefault<z.ZodEnum<["sonnet", "opus", "haiku", "sonnet[1m]", "opus[1m]"]>>;
1046
+ }, "strip", z.ZodTypeAny, {
1047
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1048
+ }, {
1049
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1050
+ }>>;
1051
+ capabilities: z.ZodOptional<z.ZodObject<{
1052
+ web: z.ZodOptional<z.ZodObject<{
1053
+ basePort: z.ZodOptional<z.ZodNumber>;
1054
+ protocol: z.ZodDefault<z.ZodEnum<["http", "https"]>>;
1055
+ devServer: z.ZodDefault<z.ZodEnum<["process", "docker"]>>;
1056
+ dockerFile: z.ZodDefault<z.ZodString>;
1057
+ containerPort: z.ZodOptional<z.ZodNumber>;
1058
+ dockerBuildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1059
+ dockerBuildSecrets: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1060
+ dockerRunArgs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1061
+ dockerRunEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1062
+ }, "strip", z.ZodTypeAny, {
1063
+ protocol: "http" | "https";
1064
+ devServer: "docker" | "process";
1065
+ dockerFile: string;
1066
+ basePort?: number | undefined;
1067
+ containerPort?: number | undefined;
1068
+ dockerBuildArgs?: Record<string, string> | undefined;
1069
+ dockerBuildSecrets?: Record<string, string> | undefined;
1070
+ dockerRunArgs?: string[] | undefined;
1071
+ dockerRunEnv?: Record<string, string> | undefined;
1072
+ }, {
1073
+ basePort?: number | undefined;
1074
+ protocol?: "http" | "https" | undefined;
1075
+ devServer?: "docker" | "process" | undefined;
1076
+ dockerFile?: string | undefined;
1077
+ containerPort?: number | undefined;
1078
+ dockerBuildArgs?: Record<string, string> | undefined;
1079
+ dockerBuildSecrets?: Record<string, string> | undefined;
1080
+ dockerRunArgs?: string[] | undefined;
1081
+ dockerRunEnv?: Record<string, string> | undefined;
1082
+ }>>;
1083
+ database: z.ZodOptional<z.ZodObject<{
1084
+ databaseUrlEnvVarName: z.ZodDefault<z.ZodOptional<z.ZodString>>;
1085
+ }, "strip", z.ZodTypeAny, {
1086
+ databaseUrlEnvVarName: string;
1087
+ }, {
1088
+ databaseUrlEnvVarName?: string | undefined;
1089
+ }>>;
1090
+ }, "strip", z.ZodTypeAny, {
1091
+ web?: {
1092
+ protocol: "http" | "https";
1093
+ devServer: "docker" | "process";
1094
+ dockerFile: string;
1095
+ basePort?: number | undefined;
1096
+ containerPort?: number | undefined;
1097
+ dockerBuildArgs?: Record<string, string> | undefined;
1098
+ dockerBuildSecrets?: Record<string, string> | undefined;
1099
+ dockerRunArgs?: string[] | undefined;
1100
+ dockerRunEnv?: Record<string, string> | undefined;
1101
+ } | undefined;
1102
+ database?: {
1103
+ databaseUrlEnvVarName: string;
1104
+ } | undefined;
1105
+ }, {
1106
+ web?: {
1107
+ basePort?: number | undefined;
1108
+ protocol?: "http" | "https" | undefined;
1109
+ devServer?: "docker" | "process" | undefined;
1110
+ dockerFile?: string | undefined;
1111
+ containerPort?: number | undefined;
1112
+ dockerBuildArgs?: Record<string, string> | undefined;
1113
+ dockerBuildSecrets?: Record<string, string> | undefined;
1114
+ dockerRunArgs?: string[] | undefined;
1115
+ dockerRunEnv?: Record<string, string> | undefined;
1116
+ } | undefined;
1117
+ database?: {
1118
+ databaseUrlEnvVarName?: string | undefined;
1119
+ } | undefined;
1120
+ }>>;
1121
+ devServer: z.ZodOptional<z.ZodObject<{
1122
+ mode: z.ZodDefault<z.ZodEnum<["docker"]>>;
1123
+ docker: z.ZodOptional<z.ZodObject<{
1124
+ dockerFile: z.ZodEffects<z.ZodDefault<z.ZodString>, string, string | undefined>;
1125
+ containerPort: z.ZodOptional<z.ZodNumber>;
1126
+ buildArgs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1127
+ runArgs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1128
+ runEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1129
+ }, "strip", z.ZodTypeAny, {
1130
+ dockerFile: string;
1131
+ containerPort?: number | undefined;
1132
+ buildArgs?: Record<string, string> | undefined;
1133
+ runArgs?: string[] | undefined;
1134
+ runEnv?: Record<string, string> | undefined;
1135
+ }, {
1136
+ dockerFile?: string | undefined;
1137
+ containerPort?: number | undefined;
1138
+ buildArgs?: Record<string, string> | undefined;
1139
+ runArgs?: string[] | undefined;
1140
+ runEnv?: Record<string, string> | undefined;
1141
+ }>>;
1142
+ }, "strip", z.ZodTypeAny, {
1143
+ mode: "docker";
1144
+ docker?: {
1145
+ dockerFile: string;
1146
+ containerPort?: number | undefined;
1147
+ buildArgs?: Record<string, string> | undefined;
1148
+ runArgs?: string[] | undefined;
1149
+ runEnv?: Record<string, string> | undefined;
1150
+ } | undefined;
1151
+ }, {
1152
+ docker?: {
1153
+ dockerFile?: string | undefined;
1154
+ containerPort?: number | undefined;
1155
+ buildArgs?: Record<string, string> | undefined;
1156
+ runArgs?: string[] | undefined;
1157
+ runEnv?: Record<string, string> | undefined;
1158
+ } | undefined;
1159
+ mode?: "docker" | undefined;
1160
+ }>>;
1161
+ databaseProviders: z.ZodOptional<z.ZodObject<{
1162
+ neon: z.ZodOptional<z.ZodObject<{
1163
+ projectId: z.ZodString;
1164
+ parentBranch: z.ZodString;
1165
+ }, "strip", z.ZodTypeAny, {
1166
+ projectId: string;
1167
+ parentBranch: string;
1168
+ }, {
1169
+ projectId: string;
1170
+ parentBranch: string;
1171
+ }>>;
1172
+ }, "strip", z.ZodTypeAny, {
1173
+ neon?: {
1174
+ projectId: string;
1175
+ parentBranch: string;
1176
+ } | undefined;
1177
+ }, {
1178
+ neon?: {
1179
+ projectId: string;
1180
+ parentBranch: string;
1181
+ } | undefined;
1182
+ }>>;
1183
+ issueManagement: z.ZodOptional<z.ZodObject<{
1184
+ provider: z.ZodDefault<z.ZodOptional<z.ZodEnum<["github", "linear", "jira"]>>>;
1185
+ github: z.ZodOptional<z.ZodObject<{
1186
+ remote: z.ZodString;
1187
+ }, "strip", z.ZodTypeAny, {
1188
+ remote: string;
1189
+ }, {
1190
+ remote: string;
1191
+ }>>;
1192
+ linear: z.ZodOptional<z.ZodObject<{
1193
+ teamId: z.ZodString;
1194
+ branchFormat: z.ZodOptional<z.ZodString>;
1195
+ apiToken: z.ZodOptional<z.ZodString>;
1196
+ }, "strip", z.ZodTypeAny, {
1197
+ teamId: string;
1198
+ branchFormat?: string | undefined;
1199
+ apiToken?: string | undefined;
1200
+ }, {
1201
+ teamId: string;
1202
+ branchFormat?: string | undefined;
1203
+ apiToken?: string | undefined;
1204
+ }>>;
1205
+ jira: z.ZodOptional<z.ZodObject<{
1206
+ host: z.ZodString;
1207
+ username: z.ZodString;
1208
+ apiToken: z.ZodOptional<z.ZodString>;
1209
+ projectKey: z.ZodString;
1210
+ boardId: z.ZodOptional<z.ZodString>;
1211
+ transitionMappings: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1212
+ defaultIssueType: z.ZodDefault<z.ZodOptional<z.ZodString>>;
1213
+ defaultSubtaskType: z.ZodDefault<z.ZodOptional<z.ZodString>>;
1214
+ doneStatuses: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
1215
+ }, "strip", z.ZodTypeAny, {
1216
+ host: string;
1217
+ username: string;
1218
+ projectKey: string;
1219
+ defaultIssueType: string;
1220
+ defaultSubtaskType: string;
1221
+ doneStatuses: string[];
1222
+ apiToken?: string | undefined;
1223
+ boardId?: string | undefined;
1224
+ transitionMappings?: Record<string, string> | undefined;
1225
+ }, {
1226
+ host: string;
1227
+ username: string;
1228
+ projectKey: string;
1229
+ apiToken?: string | undefined;
1230
+ boardId?: string | undefined;
1231
+ transitionMappings?: Record<string, string> | undefined;
1232
+ defaultIssueType?: string | undefined;
1233
+ defaultSubtaskType?: string | undefined;
1234
+ doneStatuses?: string[] | undefined;
1235
+ }>>;
1236
+ }, "strip", z.ZodTypeAny, {
1237
+ provider: "github" | "linear" | "jira";
1238
+ github?: {
1239
+ remote: string;
1240
+ } | undefined;
1241
+ linear?: {
1242
+ teamId: string;
1243
+ branchFormat?: string | undefined;
1244
+ apiToken?: string | undefined;
1245
+ } | undefined;
1246
+ jira?: {
1247
+ host: string;
1248
+ username: string;
1249
+ projectKey: string;
1250
+ defaultIssueType: string;
1251
+ defaultSubtaskType: string;
1252
+ doneStatuses: string[];
1253
+ apiToken?: string | undefined;
1254
+ boardId?: string | undefined;
1255
+ transitionMappings?: Record<string, string> | undefined;
1256
+ } | undefined;
1257
+ }, {
1258
+ github?: {
1259
+ remote: string;
1260
+ } | undefined;
1261
+ linear?: {
1262
+ teamId: string;
1263
+ branchFormat?: string | undefined;
1264
+ apiToken?: string | undefined;
1265
+ } | undefined;
1266
+ jira?: {
1267
+ host: string;
1268
+ username: string;
1269
+ projectKey: string;
1270
+ apiToken?: string | undefined;
1271
+ boardId?: string | undefined;
1272
+ transitionMappings?: Record<string, string> | undefined;
1273
+ defaultIssueType?: string | undefined;
1274
+ defaultSubtaskType?: string | undefined;
1275
+ doneStatuses?: string[] | undefined;
1276
+ } | undefined;
1277
+ provider?: "github" | "linear" | "jira" | undefined;
1278
+ }>>;
1279
+ versionControl: z.ZodOptional<z.ZodObject<{
1280
+ provider: z.ZodDefault<z.ZodOptional<z.ZodEnum<["github", "bitbucket"]>>>;
1281
+ bitbucket: z.ZodOptional<z.ZodObject<{
1282
+ username: z.ZodString;
1283
+ apiToken: z.ZodOptional<z.ZodString>;
1284
+ workspace: z.ZodOptional<z.ZodString>;
1285
+ repoSlug: z.ZodOptional<z.ZodString>;
1286
+ reviewers: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
1287
+ }, "strip", z.ZodTypeAny, {
1288
+ username: string;
1289
+ apiToken?: string | undefined;
1290
+ workspace?: string | undefined;
1291
+ repoSlug?: string | undefined;
1292
+ reviewers?: string[] | undefined;
1293
+ }, {
1294
+ username: string;
1295
+ apiToken?: string | undefined;
1296
+ workspace?: string | undefined;
1297
+ repoSlug?: string | undefined;
1298
+ reviewers?: string[] | undefined;
1299
+ }>>;
1300
+ }, "strip", z.ZodTypeAny, {
1301
+ provider: "github" | "bitbucket";
1302
+ bitbucket?: {
1303
+ username: string;
1304
+ apiToken?: string | undefined;
1305
+ workspace?: string | undefined;
1306
+ repoSlug?: string | undefined;
1307
+ reviewers?: string[] | undefined;
1308
+ } | undefined;
1309
+ }, {
1310
+ provider?: "github" | "bitbucket" | undefined;
1311
+ bitbucket?: {
1312
+ username: string;
1313
+ apiToken?: string | undefined;
1314
+ workspace?: string | undefined;
1315
+ repoSlug?: string | undefined;
1316
+ reviewers?: string[] | undefined;
1317
+ } | undefined;
1318
+ }>>;
1319
+ mergeBehavior: z.ZodOptional<z.ZodObject<{
1320
+ mode: z.ZodEffects<z.ZodDefault<z.ZodEnum<["local", "pr", "draft-pr", "github-pr", "github-draft-pr", "bitbucket-pr"]>>, "pr" | "local" | "draft-pr", "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined>;
1321
+ remote: z.ZodOptional<z.ZodString>;
1322
+ autoCommitPush: z.ZodOptional<z.ZodBoolean>;
1323
+ prTitlePrefix: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
1324
+ openBrowserOnFinish: z.ZodDefault<z.ZodBoolean>;
1325
+ }, "strip", z.ZodTypeAny, {
1326
+ mode: "pr" | "local" | "draft-pr";
1327
+ openBrowserOnFinish: boolean;
1328
+ remote?: string | undefined;
1329
+ autoCommitPush?: boolean | undefined;
1330
+ prTitlePrefix?: boolean | undefined;
1331
+ }, {
1332
+ mode?: "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined;
1333
+ remote?: string | undefined;
1334
+ autoCommitPush?: boolean | undefined;
1335
+ prTitlePrefix?: boolean | undefined;
1336
+ openBrowserOnFinish?: boolean | undefined;
1337
+ }>>;
1338
+ ide: z.ZodOptional<z.ZodObject<{
1339
+ type: z.ZodDefault<z.ZodEnum<["vscode", "cursor", "webstorm", "sublime", "intellij", "windsurf", "antigravity"]>>;
1340
+ }, "strip", z.ZodTypeAny, {
1341
+ type: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity";
1342
+ }, {
1343
+ type?: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity" | undefined;
1344
+ }>>;
1345
+ colors: z.ZodOptional<z.ZodObject<{
1346
+ terminal: z.ZodDefault<z.ZodBoolean>;
1347
+ vscode: z.ZodDefault<z.ZodBoolean>;
1348
+ }, "strip", z.ZodTypeAny, {
1349
+ terminal: boolean;
1350
+ vscode: boolean;
1351
+ }, {
1352
+ terminal?: boolean | undefined;
1353
+ vscode?: boolean | undefined;
1354
+ }>>;
1355
+ attribution: z.ZodDefault<z.ZodEnum<["off", "upstreamOnly", "on"]>>;
1356
+ git: z.ZodDefault<z.ZodObject<{
1357
+ commitTimeout: z.ZodDefault<z.ZodNumber>;
1358
+ }, "strip", z.ZodTypeAny, {
1359
+ commitTimeout: number;
1360
+ }, {
1361
+ commitTimeout?: number | undefined;
1362
+ }>>;
1363
+ }, "strip", z.ZodTypeAny, {
1364
+ sourceEnvOnStart: boolean;
1365
+ attribution: "off" | "upstreamOnly" | "on";
1366
+ git: {
1367
+ commitTimeout: number;
1406
1368
  };
1407
- }
1408
- type LaunchMode = 'editor' | 'terminal' | 'both';
1409
- interface LoomSummary {
1410
- id: string;
1411
- type: 'issue' | 'pr' | 'branch' | 'epic';
1412
- identifier: string | number;
1413
- title?: string;
1414
- branch: string;
1415
- port: number;
1416
- status: 'active' | 'stale' | 'error';
1417
- lastAccessed: string;
1418
- }
1419
-
1420
- /**
1421
- * Information about a running process
1422
- */
1423
- interface ProcessInfo {
1424
- /** Process ID */
1425
- pid: number;
1426
- /** Process name (e.g., "node", "pnpm") */
1427
- name: string;
1428
- /** Full command line */
1429
- command: string;
1430
- /** Port the process is listening on */
1431
- port: number;
1432
- /** Whether this appears to be a dev server */
1433
- isDevServer: boolean;
1434
- }
1435
-
1436
- interface TelemetryConfig {
1437
- enabled: boolean;
1438
- disclosed_at?: string;
1439
- last_version?: string;
1440
- }
1441
- interface CliInstalledProperties {
1442
- version: string;
1443
- os: string;
1444
- node_version: string;
1445
- }
1446
- interface CliUpgradedProperties {
1447
- version: string;
1448
- previous_version: string;
1449
- os: string;
1450
- }
1451
- interface LoomCreatedProperties {
1452
- source_type: 'issue' | 'pr' | 'branch' | 'freeform';
1453
- tracker: string;
1454
- is_child_loom: boolean;
1455
- one_shot_mode: 'default' | 'skip-reviews' | 'yolo';
1456
- complexity_override: boolean;
1457
- create_only: boolean;
1458
- }
1459
- interface LoomFinishedProperties {
1460
- merge_behavior: 'local' | 'pr' | 'draft-pr';
1461
- duration_minutes: number;
1462
- }
1463
- interface LoomAbandonedProperties {
1464
- duration_minutes: number;
1465
- phase_reached: string;
1466
- }
1467
- interface EpicPlannedProperties {
1468
- child_count: number;
1469
- tracker: string;
1470
- }
1471
- interface SwarmStartedProperties {
1472
- child_count: number;
1473
- tracker: string;
1474
- }
1475
- interface SwarmChildCompletedProperties {
1476
- success: boolean;
1477
- duration_minutes: number;
1478
- }
1479
- interface SwarmCompletedProperties {
1480
- total_children: number;
1481
- succeeded: number;
1482
- failed: number;
1483
- duration_minutes: number;
1484
- }
1485
- interface DemoStartedProperties {
1486
- path: string;
1487
- }
1488
- interface DemoCompletedProperties {
1489
- path: string;
1490
- converted_to_real_project: boolean;
1491
- }
1492
- interface ContributeStartedProperties {
1493
- tracker: string;
1494
- }
1495
- interface SessionStartedProperties {
1496
- has_neon: boolean;
1497
- language: string;
1498
- }
1499
- interface ErrorOccurredProperties {
1500
- error_type: string;
1501
- command: string;
1502
- phase: string;
1503
- }
1504
- interface InitStartedProperties {
1505
- mode: 'accept-defaults' | 'guided' | 'guided-custom-prompt';
1506
- }
1507
- interface InitCompletedProperties {
1508
- mode: 'accept-defaults' | 'guided' | 'guided-custom-prompt';
1509
- }
1510
- interface AutoSwarmStartedProperties {
1511
- source: 'decomposition' | 'fresh';
1512
- planner: string;
1513
- }
1514
- interface AutoSwarmCompletedProperties {
1515
- source: 'decomposition' | 'fresh';
1516
- success: boolean;
1517
- child_count: number;
1518
- duration_minutes: number;
1519
- phase_reached: 'plan' | 'start' | 'spin';
1520
- fallback_to_normal: boolean;
1521
- }
1522
- interface EpicReportGeneratedProperties {
1523
- total_children: number;
1524
- succeeded: number;
1525
- failed: number;
1526
- }
1527
- interface DevServerStartedEvent {
1528
- /** Execution mode for the dev server */
1529
- mode: 'docker' | 'process';
1530
- /** Whether the dev server started successfully */
1531
- success: boolean;
1532
- /**
1533
- * Time in milliseconds to build the Docker image.
1534
- * Only present when mode is 'docker'.
1535
- */
1536
- buildDurationMs?: number;
1537
- /** Time in milliseconds from start to the server being ready */
1538
- startDurationMs: number;
1539
- /**
1540
- * Number of BuildKit secrets mounted during docker build.
1541
- * Only present when mode is 'docker' and secrets are configured.
1542
- * Tracks feature adoption without exposing secret IDs or paths.
1543
- */
1544
- docker_build_secrets_count?: number;
1545
- }
1546
- interface DevServerStoppedEvent {
1547
- /** Execution mode for the dev server */
1548
- mode: 'docker' | 'process';
1549
- /** Reason the dev server stopped */
1550
- reason: 'user' | 'cleanup' | 'error';
1551
- }
1552
- interface TelemetryEventMap {
1553
- 'cli.installed': CliInstalledProperties;
1554
- 'cli.upgraded': CliUpgradedProperties;
1555
- 'loom.created': LoomCreatedProperties;
1556
- 'loom.finished': LoomFinishedProperties;
1557
- 'loom.abandoned': LoomAbandonedProperties;
1558
- 'epic.planned': EpicPlannedProperties;
1559
- 'swarm.started': SwarmStartedProperties;
1560
- 'swarm.child_completed': SwarmChildCompletedProperties;
1561
- 'swarm.completed': SwarmCompletedProperties;
1562
- 'demo.started': DemoStartedProperties;
1563
- 'demo.completed': DemoCompletedProperties;
1564
- 'contribute.started': ContributeStartedProperties;
1565
- 'session.started': SessionStartedProperties;
1566
- 'error.occurred': ErrorOccurredProperties;
1567
- 'init.started': InitStartedProperties;
1568
- 'init.completed': InitCompletedProperties;
1569
- 'auto_swarm.started': AutoSwarmStartedProperties;
1570
- 'auto_swarm.completed': AutoSwarmCompletedProperties;
1571
- 'epic.report_generated': EpicReportGeneratedProperties;
1572
- 'devServer.started': DevServerStartedEvent;
1573
- 'devServer.stopped': DevServerStoppedEvent;
1574
- }
1575
- type TelemetryEventName = keyof TelemetryEventMap;
1576
-
1577
- interface Workspace {
1578
- id: string;
1579
- path: string;
1580
- branch: string;
1581
- issueNumber?: string | number;
1582
- prNumber?: number;
1583
- port: number;
1584
- databaseBranch?: string;
1585
- createdAt: Date;
1586
- lastAccessed: Date;
1587
- }
1588
- interface WorkspaceInput {
1589
- identifier: string;
1590
- type: 'issue' | 'pr' | 'branch';
1591
- skipClaude?: boolean;
1592
- }
1593
- interface WorkspaceSummary {
1594
- id: string;
1595
- issueNumber?: string | number;
1596
- prNumber?: number;
1597
- title: string;
1598
- branch: string;
1599
- port: number;
1600
- status: 'active' | 'stale' | 'error';
1601
- lastAccessed: string;
1602
- }
1603
- interface Worktree {
1604
- path: string;
1605
- branch: string;
1606
- commit: string;
1607
- isPR: boolean;
1608
- prNumber?: number;
1609
- issueNumber?: string | number;
1610
- port?: number;
1611
- }
1612
- interface GitStatus {
1613
- hasUncommittedChanges: boolean;
1614
- unstagedFiles: string[];
1615
- stagedFiles: string[];
1616
- currentBranch: string;
1617
- isAheadOfRemote: boolean;
1618
- isBehindRemote: boolean;
1619
- }
1620
- interface Issue {
1621
- number: string | number;
1622
- title: string;
1623
- body: string;
1624
- state: 'open' | 'closed';
1625
- labels: string[];
1626
- assignees: string[];
1627
- url: string;
1628
- }
1629
- interface PullRequest {
1630
- number: number;
1631
- title: string;
1632
- body: string;
1633
- state: 'open' | 'closed' | 'merged';
1634
- branch: string;
1635
- baseBranch: string;
1636
- url: string;
1637
- isDraft: boolean;
1638
- isFork?: boolean;
1639
- }
1640
- /**
1641
- * Generic input detection result for issue trackers
1642
- * String-based identifier to support non-numeric IDs (e.g., Linear "ENG-123")
1643
- */
1644
- interface IssueTrackerInputDetection {
1645
- type: 'issue' | 'pr' | 'unknown';
1646
- identifier: string | null;
1647
- rawInput: string;
1648
- }
1649
-
1369
+ plan?: {
1370
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1371
+ planner: "claude" | "gemini" | "codex";
1372
+ reviewer: "claude" | "gemini" | "codex" | "none";
1373
+ waveVerification: boolean;
1374
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1375
+ } | undefined;
1376
+ spin?: {
1377
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1378
+ postSwarmReview: boolean;
1379
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1380
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1381
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1382
+ } | undefined;
1383
+ devServer?: {
1384
+ mode: "docker";
1385
+ docker?: {
1386
+ dockerFile: string;
1387
+ containerPort?: number | undefined;
1388
+ buildArgs?: Record<string, string> | undefined;
1389
+ runArgs?: string[] | undefined;
1390
+ runEnv?: Record<string, string> | undefined;
1391
+ } | undefined;
1392
+ } | undefined;
1393
+ mainBranch?: string | undefined;
1394
+ worktreePrefix?: string | undefined;
1395
+ protectedBranches?: string[] | undefined;
1396
+ copyGitIgnoredPatterns?: string[] | undefined;
1397
+ workflows?: {
1398
+ issue?: {
1399
+ startIde: boolean;
1400
+ startDevServer: boolean;
1401
+ startAiAgent: boolean;
1402
+ startTerminal: boolean;
1403
+ generateSummary: boolean;
1404
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1405
+ noVerify?: boolean | undefined;
1406
+ } | undefined;
1407
+ pr?: {
1408
+ startIde: boolean;
1409
+ startDevServer: boolean;
1410
+ startAiAgent: boolean;
1411
+ startTerminal: boolean;
1412
+ generateSummary: boolean;
1413
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1414
+ noVerify?: boolean | undefined;
1415
+ } | undefined;
1416
+ regular?: {
1417
+ startIde: boolean;
1418
+ startDevServer: boolean;
1419
+ startAiAgent: boolean;
1420
+ startTerminal: boolean;
1421
+ generateSummary: boolean;
1422
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1423
+ noVerify?: boolean | undefined;
1424
+ } | undefined;
1425
+ } | undefined;
1426
+ agents?: Record<string, {
1427
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1428
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1429
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1430
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1431
+ enabled?: boolean | undefined;
1432
+ providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
1433
+ review?: boolean | undefined;
1434
+ swarmReview?: boolean | undefined;
1435
+ }> | null | undefined;
1436
+ summary?: {
1437
+ model: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]";
1438
+ } | undefined;
1439
+ capabilities?: {
1440
+ web?: {
1441
+ protocol: "http" | "https";
1442
+ devServer: "docker" | "process";
1443
+ dockerFile: string;
1444
+ basePort?: number | undefined;
1445
+ containerPort?: number | undefined;
1446
+ dockerBuildArgs?: Record<string, string> | undefined;
1447
+ dockerBuildSecrets?: Record<string, string> | undefined;
1448
+ dockerRunArgs?: string[] | undefined;
1449
+ dockerRunEnv?: Record<string, string> | undefined;
1450
+ } | undefined;
1451
+ database?: {
1452
+ databaseUrlEnvVarName: string;
1453
+ } | undefined;
1454
+ } | undefined;
1455
+ databaseProviders?: {
1456
+ neon?: {
1457
+ projectId: string;
1458
+ parentBranch: string;
1459
+ } | undefined;
1460
+ } | undefined;
1461
+ issueManagement?: {
1462
+ provider: "github" | "linear" | "jira";
1463
+ github?: {
1464
+ remote: string;
1465
+ } | undefined;
1466
+ linear?: {
1467
+ teamId: string;
1468
+ branchFormat?: string | undefined;
1469
+ apiToken?: string | undefined;
1470
+ } | undefined;
1471
+ jira?: {
1472
+ host: string;
1473
+ username: string;
1474
+ projectKey: string;
1475
+ defaultIssueType: string;
1476
+ defaultSubtaskType: string;
1477
+ doneStatuses: string[];
1478
+ apiToken?: string | undefined;
1479
+ boardId?: string | undefined;
1480
+ transitionMappings?: Record<string, string> | undefined;
1481
+ } | undefined;
1482
+ } | undefined;
1483
+ versionControl?: {
1484
+ provider: "github" | "bitbucket";
1485
+ bitbucket?: {
1486
+ username: string;
1487
+ apiToken?: string | undefined;
1488
+ workspace?: string | undefined;
1489
+ repoSlug?: string | undefined;
1490
+ reviewers?: string[] | undefined;
1491
+ } | undefined;
1492
+ } | undefined;
1493
+ mergeBehavior?: {
1494
+ mode: "pr" | "local" | "draft-pr";
1495
+ openBrowserOnFinish: boolean;
1496
+ remote?: string | undefined;
1497
+ autoCommitPush?: boolean | undefined;
1498
+ prTitlePrefix?: boolean | undefined;
1499
+ } | undefined;
1500
+ ide?: {
1501
+ type: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity";
1502
+ } | undefined;
1503
+ colors?: {
1504
+ terminal: boolean;
1505
+ vscode: boolean;
1506
+ } | undefined;
1507
+ }, {
1508
+ plan?: {
1509
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1510
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1511
+ planner?: "claude" | "gemini" | "codex" | undefined;
1512
+ reviewer?: "claude" | "gemini" | "codex" | "none" | undefined;
1513
+ waveVerification?: boolean | undefined;
1514
+ } | undefined;
1515
+ spin?: {
1516
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1517
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1518
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1519
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1520
+ postSwarmReview?: boolean | undefined;
1521
+ } | undefined;
1522
+ devServer?: {
1523
+ docker?: {
1524
+ dockerFile?: string | undefined;
1525
+ containerPort?: number | undefined;
1526
+ buildArgs?: Record<string, string> | undefined;
1527
+ runArgs?: string[] | undefined;
1528
+ runEnv?: Record<string, string> | undefined;
1529
+ } | undefined;
1530
+ mode?: "docker" | undefined;
1531
+ } | undefined;
1532
+ mainBranch?: string | undefined;
1533
+ sourceEnvOnStart?: boolean | undefined;
1534
+ worktreePrefix?: string | undefined;
1535
+ protectedBranches?: string[] | undefined;
1536
+ copyGitIgnoredPatterns?: string[] | undefined;
1537
+ workflows?: {
1538
+ issue?: {
1539
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1540
+ noVerify?: boolean | undefined;
1541
+ startIde?: boolean | undefined;
1542
+ startDevServer?: boolean | undefined;
1543
+ startAiAgent?: boolean | undefined;
1544
+ startTerminal?: boolean | undefined;
1545
+ generateSummary?: boolean | undefined;
1546
+ } | undefined;
1547
+ pr?: {
1548
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1549
+ noVerify?: boolean | undefined;
1550
+ startIde?: boolean | undefined;
1551
+ startDevServer?: boolean | undefined;
1552
+ startAiAgent?: boolean | undefined;
1553
+ startTerminal?: boolean | undefined;
1554
+ generateSummary?: boolean | undefined;
1555
+ } | undefined;
1556
+ regular?: {
1557
+ permissionMode?: "default" | "bypassPermissions" | "plan" | "acceptEdits" | undefined;
1558
+ noVerify?: boolean | undefined;
1559
+ startIde?: boolean | undefined;
1560
+ startDevServer?: boolean | undefined;
1561
+ startAiAgent?: boolean | undefined;
1562
+ startTerminal?: boolean | undefined;
1563
+ generateSummary?: boolean | undefined;
1564
+ } | undefined;
1565
+ } | undefined;
1566
+ agents?: Record<string, {
1567
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1568
+ swarmModel?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1569
+ effort?: "low" | "medium" | "high" | "max" | undefined;
1570
+ swarmEffort?: "low" | "medium" | "high" | "max" | undefined;
1571
+ enabled?: boolean | undefined;
1572
+ providers?: Partial<Record<"claude" | "gemini" | "codex", string>> | undefined;
1573
+ review?: boolean | undefined;
1574
+ swarmReview?: boolean | undefined;
1575
+ }> | null | undefined;
1576
+ summary?: {
1577
+ model?: "sonnet" | "opus" | "haiku" | "sonnet[1m]" | "opus[1m]" | undefined;
1578
+ } | undefined;
1579
+ capabilities?: {
1580
+ web?: {
1581
+ basePort?: number | undefined;
1582
+ protocol?: "http" | "https" | undefined;
1583
+ devServer?: "docker" | "process" | undefined;
1584
+ dockerFile?: string | undefined;
1585
+ containerPort?: number | undefined;
1586
+ dockerBuildArgs?: Record<string, string> | undefined;
1587
+ dockerBuildSecrets?: Record<string, string> | undefined;
1588
+ dockerRunArgs?: string[] | undefined;
1589
+ dockerRunEnv?: Record<string, string> | undefined;
1590
+ } | undefined;
1591
+ database?: {
1592
+ databaseUrlEnvVarName?: string | undefined;
1593
+ } | undefined;
1594
+ } | undefined;
1595
+ databaseProviders?: {
1596
+ neon?: {
1597
+ projectId: string;
1598
+ parentBranch: string;
1599
+ } | undefined;
1600
+ } | undefined;
1601
+ issueManagement?: {
1602
+ github?: {
1603
+ remote: string;
1604
+ } | undefined;
1605
+ linear?: {
1606
+ teamId: string;
1607
+ branchFormat?: string | undefined;
1608
+ apiToken?: string | undefined;
1609
+ } | undefined;
1610
+ jira?: {
1611
+ host: string;
1612
+ username: string;
1613
+ projectKey: string;
1614
+ apiToken?: string | undefined;
1615
+ boardId?: string | undefined;
1616
+ transitionMappings?: Record<string, string> | undefined;
1617
+ defaultIssueType?: string | undefined;
1618
+ defaultSubtaskType?: string | undefined;
1619
+ doneStatuses?: string[] | undefined;
1620
+ } | undefined;
1621
+ provider?: "github" | "linear" | "jira" | undefined;
1622
+ } | undefined;
1623
+ versionControl?: {
1624
+ provider?: "github" | "bitbucket" | undefined;
1625
+ bitbucket?: {
1626
+ username: string;
1627
+ apiToken?: string | undefined;
1628
+ workspace?: string | undefined;
1629
+ repoSlug?: string | undefined;
1630
+ reviewers?: string[] | undefined;
1631
+ } | undefined;
1632
+ } | undefined;
1633
+ mergeBehavior?: {
1634
+ mode?: "pr" | "local" | "draft-pr" | "github-pr" | "github-draft-pr" | "bitbucket-pr" | undefined;
1635
+ remote?: string | undefined;
1636
+ autoCommitPush?: boolean | undefined;
1637
+ prTitlePrefix?: boolean | undefined;
1638
+ openBrowserOnFinish?: boolean | undefined;
1639
+ } | undefined;
1640
+ ide?: {
1641
+ type?: "vscode" | "cursor" | "webstorm" | "sublime" | "intellij" | "windsurf" | "antigravity" | undefined;
1642
+ } | undefined;
1643
+ colors?: {
1644
+ terminal?: boolean | undefined;
1645
+ vscode?: boolean | undefined;
1646
+ } | undefined;
1647
+ attribution?: "off" | "upstreamOnly" | "on" | undefined;
1648
+ git?: {
1649
+ commitTimeout?: number | undefined;
1650
+ } | undefined;
1651
+ }>;
1650
1652
  /**
1651
- * Result of database branch deletion operation
1652
- * Distinguishes between successful deletion, branch not found, and errors
1653
+ * TypeScript type for iloom settings derived from Zod schema
1653
1654
  */
1654
- interface DatabaseDeletionResult {
1655
- /** Overall operation succeeded (true even if branch didn't exist) */
1656
- success: boolean;
1657
- /** True only if a branch was actually deleted */
1658
- deleted: boolean;
1659
- /** True if branch didn't exist (not an error, just nothing to do) */
1660
- notFound: boolean;
1661
- /** Error message if operation failed */
1662
- error?: string;
1663
- /** User declined deletion (for preview databases) */
1664
- userDeclined?: boolean;
1665
- /** Name of the branch that was processed */
1666
- branchName?: string;
1667
- }
1668
- interface DatabaseProvider {
1669
- createBranch(name: string, fromBranch?: string, cwd?: string): Promise<string>;
1670
- deleteBranch(name: string, isPreview?: boolean, cwd?: string): Promise<DatabaseDeletionResult>;
1671
- getConnectionString(branch: string, cwd?: string): Promise<string>;
1672
- listBranches(cwd?: string): Promise<string[]>;
1673
- branchExists(name: string, cwd?: string): Promise<boolean>;
1674
- findPreviewBranch(branchName: string, cwd?: string): Promise<string | null>;
1675
- getBranchNameFromEndpoint(endpointId: string, cwd?: string): Promise<string | null>;
1676
- sanitizeBranchName(branchName: string): string;
1677
- isAuthenticated(cwd?: string): Promise<boolean>;
1678
- isCliAvailable(): Promise<boolean>;
1679
- isConfigured(): boolean;
1680
- }
1681
- interface Config {
1682
- defaultPort: number;
1683
- databaseProvider?: 'neon' | 'supabase' | 'planetscale';
1684
- claudeModel?: ClaudeModel;
1685
- skipClaude?: boolean;
1686
- customWorkspaceRoot?: string;
1687
- }
1688
- type OneShotMode = 'default' | 'noReview' | 'bypassPermissions';
1689
- type ComplexityOverride = 'trivial' | 'simple' | 'complex';
1690
- interface StartOptions {
1691
- claude?: boolean;
1692
- code?: boolean;
1693
- devServer?: boolean;
1694
- terminal?: boolean;
1695
- childLoom?: boolean;
1696
- epic?: boolean;
1697
- createOnly?: boolean;
1698
- oneShot?: OneShotMode;
1699
- dangerouslySkipPermissions?: boolean;
1700
- complexity?: ComplexityOverride;
1701
- body?: string;
1702
- json?: boolean;
1703
- }
1704
- interface AddIssueOptions {
1705
- body?: string;
1706
- json?: boolean;
1707
- }
1708
- interface FeedbackOptions {
1709
- body?: string;
1710
- }
1711
- interface EnhanceOptions {
1712
- noBrowser?: boolean;
1713
- json?: boolean;
1714
- }
1715
- interface FinishOptions {
1716
- force?: boolean;
1717
- dryRun?: boolean;
1718
- pr?: number;
1719
- skipBuild?: boolean;
1720
- noBrowser?: boolean;
1721
- cleanup?: boolean;
1722
- json?: boolean;
1723
- skipToPr?: boolean;
1724
- jsonStream?: boolean;
1725
- review?: boolean;
1726
- }
1655
+ type IloomSettings = z.infer<typeof IloomSettingsSchema>;
1727
1656
  /**
1728
- * Options for the cleanup command
1729
- * All flags are optional and can be combined (subject to validation)
1657
+ * Manages project-level settings from .iloom/settings.json
1730
1658
  */
1731
- interface CleanupOptions {
1732
- /** List all worktrees without removing anything */
1733
- list?: boolean;
1734
- /** Remove all worktrees (interactive confirmation required unless --force) */
1735
- all?: boolean;
1736
- /** Cleanup by specific issue identifier (numeric or alphanumeric like RANDOM-13) */
1737
- issue?: string | number;
1738
- /** Skip confirmations and force removal */
1739
- force?: boolean;
1740
- /** Show what would be done without actually doing it */
1741
- dryRun?: boolean;
1742
- /** Output result as JSON */
1743
- json?: boolean;
1744
- /** Wait specified milliseconds before cleanup execution */
1745
- defer?: number;
1746
- /** Archive metadata instead of deleting (preserves loom in il list --finished) */
1747
- archive?: boolean;
1748
- }
1749
- interface ListOptions {
1750
- json?: boolean;
1751
- }
1752
- interface AddIssueResult {
1753
- url: string;
1754
- id: number;
1755
- title: string;
1756
- created_at: string;
1757
- }
1758
- interface EnhanceResult {
1759
- url: string;
1760
- id: number;
1761
- title: string;
1762
- created_at: string;
1763
- enhanced: boolean;
1764
- }
1765
- interface StartResult {
1766
- id: string;
1767
- path: string;
1768
- branch: string;
1769
- port?: number;
1770
- type: 'issue' | 'pr' | 'branch' | 'epic';
1771
- identifier: string | number;
1772
- title?: string;
1773
- capabilities?: string[];
1774
- childIssueNumbers?: string[];
1775
- }
1776
- interface FinishResult {
1777
- success: boolean;
1778
- type: 'issue' | 'pr' | 'branch' | 'epic';
1779
- identifier: string | number;
1780
- /** Whether this was a dry-run operation */
1781
- dryRun?: boolean;
1782
- operations: Array<{
1783
- type: 'validation' | 'commit' | 'rebase' | 'merge' | 'cleanup' | 'pr-creation' | 'pr-ready' | 'build';
1784
- message: string;
1785
- success: boolean;
1786
- error?: string;
1787
- }>;
1788
- prUrl?: string;
1789
- cleanupResult?: CleanupResult;
1790
- }
1791
- interface SummaryResult {
1792
- summary: string;
1793
- sessionId: string;
1794
- issueNumber?: string | number;
1795
- branchName: string;
1796
- loomType: 'issue' | 'pr' | 'branch' | 'epic';
1797
- }
1798
- interface RebaseResult {
1799
- success: boolean;
1800
- conflictsDetected: boolean;
1801
- claudeLaunched: boolean;
1802
- conflictsResolved?: boolean;
1803
- error?: string;
1804
- }
1805
- interface RebaseOutcome {
1806
- conflictsDetected: boolean;
1807
- claudeLaunched: boolean;
1808
- conflictsResolved: boolean;
1809
- }
1810
- interface MockOptions {
1811
- scenario: 'empty' | 'existing' | 'conflicts' | 'error';
1812
- data?: unknown;
1659
+ declare class SettingsManager {
1660
+ /**
1661
+ * Load settings from global, project, and local sources with proper precedence
1662
+ * Merge hierarchy (lowest to highest priority):
1663
+ * 1. Global settings (~/.config/iloom-ai/settings.json)
1664
+ * 2. Project settings (<PROJECT_ROOT>/.iloom/settings.json)
1665
+ * 3. Local settings (<PROJECT_ROOT>/.iloom/settings.local.json)
1666
+ * 4. CLI overrides (--set flags)
1667
+ * Returns empty object if all files don't exist (not an error)
1668
+ */
1669
+ loadSettings(projectRoot?: string, cliOverrides?: Partial<IloomSettings>): Promise<IloomSettings>;
1670
+ /**
1671
+ * Log the final merged configuration for debugging
1672
+ */
1673
+ private logFinalConfiguration;
1674
+ /**
1675
+ * Load and parse a single settings file
1676
+ * Returns empty object if file doesn't exist (not an error)
1677
+ * Uses non-defaulting schema to prevent polluting partial settings with defaults before merge
1678
+ */
1679
+ private loadSettingsFile;
1680
+ /**
1681
+ * Deep merge two settings objects with priority to override
1682
+ * Uses deepmerge library with array replacement strategy
1683
+ */
1684
+ private mergeSettings;
1685
+ /**
1686
+ * Format all Zod validation errors into a single error message
1687
+ */
1688
+ private formatAllZodErrors;
1689
+ /**
1690
+ * Validate settings structure and model names using Zod schema
1691
+ * This method is kept for testing purposes but uses Zod internally
1692
+ * @internal - Only used in tests via bracket notation
1693
+ */
1694
+ private validateSettings;
1695
+ /**
1696
+ * Get project root (defaults to process.cwd())
1697
+ */
1698
+ private getProjectRoot;
1699
+ /**
1700
+ * Get global config directory path (~/.config/iloom-ai)
1701
+ */
1702
+ private getGlobalConfigDir;
1703
+ /**
1704
+ * Get global settings file path (~/.config/iloom-ai/settings.json)
1705
+ */
1706
+ private getGlobalSettingsPath;
1707
+ /**
1708
+ * Load and parse global settings file
1709
+ * Returns empty object if file doesn't exist (not an error)
1710
+ * Warns but returns empty object on validation/parse errors (graceful degradation)
1711
+ */
1712
+ private loadGlobalSettingsFile;
1713
+ /**
1714
+ * Get effective protected branches list with mainBranch always included
1715
+ *
1716
+ * This method provides a single source of truth for protected branches logic:
1717
+ * 1. Use configured protectedBranches if provided
1718
+ * 2. Otherwise use defaults: [mainBranch, 'main', 'master', 'develop']
1719
+ * 3. ALWAYS ensure mainBranch is included even if user configured custom list
1720
+ *
1721
+ * @param projectRoot - Optional project root directory (defaults to process.cwd())
1722
+ * @returns Array of protected branch names with mainBranch guaranteed to be included
1723
+ */
1724
+ getProtectedBranches(projectRoot?: string): Promise<string[]>;
1725
+ /**
1726
+ * Get the spin orchestrator model with default applied
1727
+ * Default is defined in SpinAgentSettingsSchema
1728
+ *
1729
+ * @param settings - Pre-loaded settings object
1730
+ * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
1731
+ */
1732
+ getSpinModel(settings?: IloomSettings, mode?: 'swarm'): ClaudeModel;
1733
+ /**
1734
+ * Get the plan command model with default applied
1735
+ * Default is defined in PlanCommandSettingsSchema
1736
+ *
1737
+ * @param settings - Pre-loaded settings object
1738
+ * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
1739
+ */
1740
+ getPlanModel(settings?: IloomSettings): ClaudeModel;
1741
+ /**
1742
+ * Get the plan command planner with default applied
1743
+ * Default is 'claude'
1744
+ *
1745
+ * @param settings - Pre-loaded settings object
1746
+ * @returns Planner provider ('claude', 'gemini', or 'codex')
1747
+ */
1748
+ getPlanPlanner(settings?: IloomSettings): 'claude' | 'gemini' | 'codex';
1749
+ /**
1750
+ * Get the plan command reviewer with default applied
1751
+ * Default is 'none' (no review step)
1752
+ *
1753
+ * @param settings - Pre-loaded settings object
1754
+ * @returns Reviewer provider ('claude', 'gemini', 'codex', or 'none')
1755
+ */
1756
+ getPlanReviewer(settings?: IloomSettings): 'claude' | 'gemini' | 'codex' | 'none';
1757
+ /**
1758
+ * Get the plan command waveVerification setting with default applied
1759
+ * Default is true (verification tasks are generated)
1760
+ *
1761
+ * @param settings - Pre-loaded settings object
1762
+ * @returns Whether wave verification is enabled
1763
+ */
1764
+ getPlanWaveVerification(settings?: IloomSettings): boolean;
1765
+ /**
1766
+ * Get the spin effort level
1767
+ * Defaults to 'high' when not configured
1768
+ *
1769
+ * @param settings - Pre-loaded settings object
1770
+ * @param mode - When 'swarm', returns swarmEffort (defaults to 'high')
1771
+ * @returns Effort level
1772
+ */
1773
+ getSpinEffort(settings?: IloomSettings, mode?: 'swarm'): EffortLevel;
1774
+ /**
1775
+ * Get the plan effort level
1776
+ * Defaults to 'high' when not configured
1777
+ *
1778
+ * @param settings - Pre-loaded settings object
1779
+ * @returns Effort level
1780
+ */
1781
+ getPlanEffort(settings?: IloomSettings): EffortLevel;
1782
+ /**
1783
+ * Get the session summary model with default applied
1784
+ * Default is defined in SummarySettingsSchema
1785
+ *
1786
+ * @param settings - Pre-loaded settings object
1787
+ * @returns Model shorthand (e.g. 'opus', 'sonnet', 'haiku', 'sonnet[1m]', 'opus[1m]')
1788
+ */
1789
+ getSummaryModel(settings?: IloomSettings): ClaudeModel;
1813
1790
  }
1814
1791
 
1815
- interface RgbColor {
1816
- r: number;
1817
- g: number;
1818
- b: number;
1819
- }
1820
- interface ColorData {
1821
- rgb: RgbColor;
1822
- hex: string;
1823
- index: number;
1824
- }
1825
- type Platform = 'darwin' | 'linux' | 'win32' | 'unsupported';
1826
- interface ValidationOptions {
1827
- dryRun?: boolean;
1828
- skipTypecheck?: boolean;
1829
- skipLint?: boolean;
1830
- skipTests?: boolean;
1831
- jsonStream?: boolean;
1832
- }
1833
- interface ValidationStepResult {
1834
- step: 'typecheck' | 'compile' | 'lint' | 'test';
1835
- passed: boolean;
1836
- skipped: boolean;
1837
- output?: string;
1838
- error?: string;
1839
- duration?: number;
1840
- }
1841
- interface ValidationResult {
1842
- success: boolean;
1843
- steps: ValidationStepResult[];
1844
- totalDuration: number;
1845
- }
1846
- interface CommitOptions {
1847
- dryRun?: boolean;
1848
- issueNumber?: string | number;
1849
- issuePrefix: string;
1850
- message?: string;
1851
- noReview?: boolean;
1852
- skipVerify?: boolean;
1853
- skipVerifySilent?: boolean;
1854
- trailerType?: 'Refs' | 'Fixes';
1855
- timeout?: number;
1856
- }
1857
1792
  /**
1858
- * Error thrown when user aborts a commit operation
1859
- * Used by CommitManager when user selects 'abort' at the commit prompt
1793
+ * Manages Git worktrees for the iloom CLI
1794
+ * Ports functionality from bash scripts into TypeScript
1860
1795
  */
1861
- declare class UserAbortedCommitError extends Error {
1862
- constructor(message?: string);
1863
- }
1864
- interface MergeOptions {
1865
- dryRun?: boolean;
1866
- force?: boolean;
1867
- repoRoot?: string;
1868
- jsonStream?: boolean;
1869
- }
1870
- interface MergeResult {
1871
- success: boolean;
1872
- branchName: string;
1873
- commitsMerged: number;
1874
- rebaseCompleted: boolean;
1875
- mergeCompleted: boolean;
1876
- }
1877
- interface UpdateCheckCache {
1878
- lastCheck: number;
1879
- latestVersion: string;
1880
- }
1881
- interface UpdateCheckResult {
1882
- currentVersion: string;
1883
- latestVersion: string;
1884
- updateAvailable: boolean;
1796
+ declare class GitWorktreeManager {
1797
+ private readonly _workingDirectory;
1798
+ constructor(workingDirectory?: string);
1799
+ /**
1800
+ * Get the working directory for git operations (main worktree path)
1801
+ */
1802
+ get workingDirectory(): string;
1803
+ /**
1804
+ * List all worktrees in the repository
1805
+ * Defaults to porcelain format for reliable machine parsing
1806
+ * Equivalent to: git worktree list --porcelain
1807
+ */
1808
+ listWorktrees(options?: WorktreeListOptions): Promise<GitWorktree[]>;
1809
+ /**
1810
+ * Find worktree for a specific branch
1811
+ * Ports: find_worktree_for_branch() from find-worktree-for-branch.sh
1812
+ */
1813
+ findWorktreeForBranch(branchName: string): Promise<GitWorktree | null>;
1814
+ /**
1815
+ * Check if a worktree is the main repository worktree
1816
+ * Uses findMainWorktreePathWithSettings to determine the main worktree based on settings.
1817
+ *
1818
+ * @param worktree - The worktree to check
1819
+ * @param settingsManager - SettingsManager instance for loading settings
1820
+ * @returns true if the worktree is the main worktree
1821
+ */
1822
+ isMainWorktree(worktree: GitWorktree, settingsManager: SettingsManager): Promise<boolean>;
1823
+ /**
1824
+ * Check if a worktree is a PR worktree based on naming patterns
1825
+ * Ports: is_pr_worktree() from worktree-utils.sh
1826
+ */
1827
+ isPRWorktree(worktree: GitWorktree): boolean;
1828
+ /**
1829
+ * Get PR number from worktree branch name
1830
+ * Ports: get_pr_number_from_worktree() from worktree-utils.sh
1831
+ */
1832
+ getPRNumberFromWorktree(worktree: GitWorktree): number | null;
1833
+ /**
1834
+ * Create a new worktree
1835
+ * Ports worktree creation logic from new-branch-workflow.sh
1836
+ * @returns The absolute path to the created worktree
1837
+ */
1838
+ createWorktree(options: WorktreeCreateOptions): Promise<string>;
1839
+ /**
1840
+ * Remove a worktree and optionally clean up associated files
1841
+ * Ports worktree removal logic from cleanup-worktree.sh
1842
+ * @returns A message describing what was done (for dry-run mode)
1843
+ */
1844
+ removeWorktree(worktreePath: string, options?: WorktreeCleanupOptions): Promise<string | void>;
1845
+ /**
1846
+ * Validate worktree state and integrity
1847
+ */
1848
+ validateWorktree(worktreePath: string): Promise<WorktreeValidation>;
1849
+ /**
1850
+ * Get detailed status information for a worktree
1851
+ */
1852
+ getWorktreeStatus(worktreePath: string): Promise<WorktreeStatus>;
1853
+ /**
1854
+ * Generate a suggested worktree path for a branch
1855
+ */
1856
+ generateWorktreePath(branchName: string, customRoot?: string, options?: {
1857
+ isPR?: boolean;
1858
+ prNumber?: number;
1859
+ prefix?: string;
1860
+ }): string;
1861
+ /**
1862
+ * Sanitize a branch name for use as a directory name
1863
+ * Replaces slashes with dashes and removes invalid filesystem characters
1864
+ * Ports logic from bash script line 593: ${BRANCH_NAME//\\//-}
1865
+ */
1866
+ sanitizeBranchName(branchName: string): string;
1867
+ /**
1868
+ * Check if repository is in a valid state for worktree operations
1869
+ */
1870
+ isRepoReady(): Promise<boolean>;
1871
+ /**
1872
+ * Get repository information
1873
+ */
1874
+ getRepoInfo(): Promise<{
1875
+ root: string | null;
1876
+ defaultBranch: string;
1877
+ currentBranch: string | null;
1878
+ }>;
1879
+ /**
1880
+ * Prune stale worktree entries (worktrees that no longer exist on disk)
1881
+ */
1882
+ pruneWorktrees(): Promise<void>;
1883
+ /**
1884
+ * Lock a worktree to prevent it from being pruned or moved
1885
+ */
1886
+ lockWorktree(worktreePath: string, reason?: string): Promise<void>;
1887
+ /**
1888
+ * Unlock a previously locked worktree
1889
+ */
1890
+ unlockWorktree(worktreePath: string): Promise<void>;
1891
+ /**
1892
+ * Find worktrees matching an identifier (branch name, path, or PR number)
1893
+ */
1894
+ findWorktreesByIdentifier(identifier: string): Promise<GitWorktree[]>;
1895
+ /**
1896
+ * Find worktree for a specific issue number using exact pattern matching
1897
+ * Matches: issue-{N} at start OR after /, -, _ (but NOT issue-{N}X where X is a digit)
1898
+ * Supports patterns like: issue-44, feat/issue-44-feature, feat-issue-44, bugfix_issue-44, etc.
1899
+ * Avoids false matches like: tissue-44, myissue-44
1900
+ * Ports: find_existing_worktree() from bash script lines 131-165
1901
+ */
1902
+ findWorktreeForIssue(issueNumber: string | number): Promise<GitWorktree | null>;
1903
+ /**
1904
+ * Find worktree for a specific PR by branch name
1905
+ * Ports: find_existing_worktree() for PR type from bash script lines 149-160
1906
+ */
1907
+ findWorktreeForPR(prNumber: number, branchName: string): Promise<GitWorktree | null>;
1908
+ /**
1909
+ * Remove multiple worktrees
1910
+ * Returns a summary of successes and failures
1911
+ * Automatically filters out the main worktree
1912
+ *
1913
+ * @param worktrees - Array of worktrees to remove
1914
+ * @param settingsManager - SettingsManager instance for determining main worktree
1915
+ * @param options - Cleanup options
1916
+ */
1917
+ removeWorktrees(worktrees: GitWorktree[], settingsManager: SettingsManager, options?: WorktreeCleanupOptions): Promise<{
1918
+ successes: Array<{
1919
+ worktree: GitWorktree;
1920
+ }>;
1921
+ failures: Array<{
1922
+ worktree: GitWorktree;
1923
+ error: string;
1924
+ }>;
1925
+ skipped: Array<{
1926
+ worktree: GitWorktree;
1927
+ reason: string;
1928
+ }>;
1929
+ }>;
1930
+ /**
1931
+ * Format worktree information for display
1932
+ */
1933
+ formatWorktree(worktree: GitWorktree): {
1934
+ title: string;
1935
+ path: string;
1936
+ commit: string;
1937
+ };
1885
1938
  }
1886
- type InstallationMethod = 'global' | 'local' | 'linked' | 'unknown';
1887
1939
 
1888
1940
  /**
1889
1941
  * IssueTracker interface - abstraction for issue tracking providers
@@ -2305,6 +2357,7 @@ interface MetadataFile {
2305
2357
  oneShot?: OneShotMode;
2306
2358
  dangerouslySkipPermissions?: boolean;
2307
2359
  complexity?: ComplexityOverride;
2360
+ effort?: EffortLevel;
2308
2361
  capabilities?: ProjectCapability[];
2309
2362
  state?: SwarmState;
2310
2363
  childIssueNumbers?: string[];
@@ -2348,6 +2401,7 @@ interface WriteMetadataInput {
2348
2401
  oneShot?: OneShotMode;
2349
2402
  dangerouslySkipPermissions?: boolean;
2350
2403
  complexity?: ComplexityOverride;
2404
+ effort?: EffortLevel;
2351
2405
  capabilities: ProjectCapability[];
2352
2406
  state?: SwarmState;
2353
2407
  childIssueNumbers?: string[];
@@ -2392,6 +2446,7 @@ interface LoomMetadata {
2392
2446
  oneShot: OneShotMode | null;
2393
2447
  dangerouslySkipPermissions: boolean;
2394
2448
  complexity: ComplexityOverride | null;
2449
+ effort: EffortLevel | null;
2395
2450
  capabilities: ProjectCapability[];
2396
2451
  state: SwarmState | null;
2397
2452
  childIssueNumbers: string[];
@@ -3044,4 +3099,4 @@ declare class TableFormatter {
3044
3099
  static previewFormatting(headers: string[], options?: TableFormatterOptions): string;
3045
3100
  }
3046
3101
 
3047
- export { type AddIssueOptions, type AddIssueResult, type AutoSwarmCompletedProperties, type AutoSwarmStartedProperties, type BatchCleanupResult, type BranchCleanupTarget, type BranchDeleteOptions, type BranchGenerationOptions, type BranchNameStrategy, type Capability, type ClaudeContext, ClaudeContextManager, type CleanupOptions, type CleanupResult, type CliInstalledProperties, type CliUpgradedProperties, type ColorData, type CommitOptions, type ComplexityOverride, type Config, type ContributeStartedProperties, type CreateLoomInput, type DatabaseDeletionResult, DatabaseManager, type DatabaseProvider, type DemoCompletedProperties, type DemoStartedProperties, type DevServerStartedEvent, type DevServerStoppedEvent, type EnhanceOptions, type EnhanceResult, type EnvFileOptions, type EnvOperationResult, type EnvVariable, EnvironmentManager, type EpicPlannedProperties, type EpicReportGeneratedProperties, type ErrorOccurredProperties, type FeedbackOptions, type FinishOptions, type FinishResult, GitCommandError, GitHubService, type GitStatus, type GitWorktree, GitWorktreeManager, type InitCompletedProperties, type InitStartedProperties, type InstallationMethod, type Issue, type IssueTracker, IssueTrackerFactory, type IssueTrackerInputDetection, type IssueTrackerProviderType, JiraWikiSanitizer, type LaunchMode, LinearMarkupConverter, type ListOptions, type Logger, type LoggerOptions, type Loom, type LoomAbandonedProperties, type LoomCreatedProperties, type LoomFinishedProperties, type LoomSummary, type MergeOptions, type MergeResult, type MockOptions, type OneShotMode, type OperationResult, PLACEHOLDER_COMMIT_PREFIX, type PRWorktreePattern, type Platform, type PortAssignmentOptions, type ProcessInfo, type ProjectCapability, type PullRequest, type RebaseOutcome, type RebaseResult, type RemoteBranchStatus, type ResourceCleanupOptions, type RgbColor, type SafetyCheck, type SessionStartedProperties, type StartOptions, type StartResult, type SummaryResult, type SwarmChildCompletedProperties, type SwarmCompletedProperties, type SwarmStartedProperties, TableFormatter, type TableFormatterOptions, type TableGenerationOptions, type TelemetryConfig, type TelemetryEventMap, type TelemetryEventName, type UpdateCheckCache, type UpdateCheckResult, UserAbortedCommitError, type ValidationOptions, type ValidationResult, type ValidationStepResult, type Workspace, type WorkspaceInput, WorkspaceManager, type WorkspaceSummary, type Worktree, type WorktreeCleanupOptions, type WorktreeCreateOptions, type WorktreeListOptions, type WorktreeOperationResult, type WorktreeStatus, type WorktreeValidation, branchExists, checkRemoteBranchStatus, createLogger, createStderrLogger, ensureRepositoryHasCommits, executeGitCommand, extractIssueNumber, extractPRNumber, fetchOrigin, findAllBranchesForIssue, findMainWorktreePath, findMainWorktreePathWithSettings, findPlaceholderCommitSha, findWorktreeForBranch, generateWorktreePath, getCurrentBranch, getDefaultBranch, getMergeTargetBranch, getRepoRoot, getThemeMode, getWorktreeRoot, hasUncommittedChanges, isBranchMergedIntoMain, isEmptyRepository, isFileGitignored, isFileTrackedByGit, isPRBranch, isPlaceholderCommit, isRemoteBranchUpToDate, isValidGitRepo, isWorktreePath, logger, parseWorktreeList, pushBranchToRemote, removePlaceholderCommitFromHead, removePlaceholderCommitFromHistory, setThemeMode };
3102
+ export { type AddIssueOptions, type AddIssueResult, type AutoSwarmCompletedProperties, type AutoSwarmStartedProperties, type BatchCleanupResult, type BranchCleanupTarget, type BranchDeleteOptions, type BranchGenerationOptions, type BranchNameStrategy, type Capability, type ClaudeContext, ClaudeContextManager, type CleanupOptions, type CleanupResult, type CliInstalledProperties, type CliUpgradedProperties, type ColorData, type CommitOptions, type ComplexityOverride, type Config, type ContributeStartedProperties, type CreateLoomInput, type DatabaseDeletionResult, DatabaseManager, type DatabaseProvider, type DemoCompletedProperties, type DemoStartedProperties, type DevServerStartedEvent, type DevServerStoppedEvent, type EffortLevel, type EnhanceOptions, type EnhanceResult, type EnvFileOptions, type EnvOperationResult, type EnvVariable, EnvironmentManager, type EpicPlannedProperties, type EpicReportGeneratedProperties, type ErrorOccurredProperties, type FeedbackOptions, type FinishOptions, type FinishResult, GitCommandError, GitHubService, type GitStatus, type GitWorktree, GitWorktreeManager, type InitCompletedProperties, type InitStartedProperties, type InstallationMethod, type Issue, type IssueTracker, IssueTrackerFactory, type IssueTrackerInputDetection, type IssueTrackerProviderType, JiraWikiSanitizer, type LaunchMode, LinearMarkupConverter, type ListOptions, type Logger, type LoggerOptions, type Loom, type LoomAbandonedProperties, type LoomCreatedProperties, type LoomFinishedProperties, type LoomSummary, type MergeOptions, type MergeResult, type MockOptions, type OneShotMode, type OperationResult, PLACEHOLDER_COMMIT_PREFIX, type PRWorktreePattern, type Platform, type PortAssignmentOptions, type ProcessInfo, type ProjectCapability, type PullRequest, type RebaseOutcome, type RebaseResult, type RemoteBranchStatus, type ResourceCleanupOptions, type RgbColor, type SafetyCheck, type SessionStartedProperties, type StartOptions, type StartResult, type SummaryResult, type SwarmChildCompletedProperties, type SwarmCompletedProperties, type SwarmStartedProperties, TableFormatter, type TableFormatterOptions, type TableGenerationOptions, type TelemetryConfig, type TelemetryEventMap, type TelemetryEventName, type UpdateCheckCache, type UpdateCheckResult, UserAbortedCommitError, VALID_EFFORT_LEVELS, type ValidationOptions, type ValidationResult, type ValidationStepResult, type Workspace, type WorkspaceInput, WorkspaceManager, type WorkspaceSummary, type Worktree, type WorktreeCleanupOptions, type WorktreeCreateOptions, type WorktreeListOptions, type WorktreeOperationResult, type WorktreeStatus, type WorktreeValidation, branchExists, checkRemoteBranchStatus, createLogger, createStderrLogger, ensureRepositoryHasCommits, executeGitCommand, extractIssueNumber, extractPRNumber, fetchOrigin, findAllBranchesForIssue, findMainWorktreePath, findMainWorktreePathWithSettings, findPlaceholderCommitSha, findWorktreeForBranch, generateWorktreePath, getCurrentBranch, getDefaultBranch, getMergeTargetBranch, getRepoRoot, getThemeMode, getWorktreeRoot, hasUncommittedChanges, isBranchMergedIntoMain, isEffortLevel, isEmptyRepository, isFileGitignored, isFileTrackedByGit, isPRBranch, isPlaceholderCommit, isRemoteBranchUpToDate, isValidGitRepo, isWorktreePath, logger, parseWorktreeList, pushBranchToRemote, removePlaceholderCommitFromHead, removePlaceholderCommitFromHistory, setThemeMode };