hub-launch 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/CHANGELOG.md +144 -0
  2. package/README.md +195 -0
  3. package/bin/hublaunch +20 -0
  4. package/dist/commands/checkout.d.ts +7 -0
  5. package/dist/commands/checkout.d.ts.map +1 -0
  6. package/dist/commands/checkout.js +164 -0
  7. package/dist/commands/checkout.js.map +1 -0
  8. package/dist/commands/clean.d.ts +7 -0
  9. package/dist/commands/clean.d.ts.map +1 -0
  10. package/dist/commands/clean.js +206 -0
  11. package/dist/commands/clean.js.map +1 -0
  12. package/dist/commands/close.d.ts +7 -0
  13. package/dist/commands/close.d.ts.map +1 -0
  14. package/dist/commands/close.js +109 -0
  15. package/dist/commands/close.js.map +1 -0
  16. package/dist/commands/create.d.ts +7 -0
  17. package/dist/commands/create.d.ts.map +1 -0
  18. package/dist/commands/create.js +367 -0
  19. package/dist/commands/create.js.map +1 -0
  20. package/dist/commands/diff.d.ts +7 -0
  21. package/dist/commands/diff.d.ts.map +1 -0
  22. package/dist/commands/diff.js +98 -0
  23. package/dist/commands/diff.js.map +1 -0
  24. package/dist/commands/execute.d.ts +7 -0
  25. package/dist/commands/execute.d.ts.map +1 -0
  26. package/dist/commands/execute.js +376 -0
  27. package/dist/commands/execute.js.map +1 -0
  28. package/dist/commands/init.d.ts +8 -0
  29. package/dist/commands/init.d.ts.map +1 -0
  30. package/dist/commands/init.js +1243 -0
  31. package/dist/commands/init.js.map +1 -0
  32. package/dist/commands/interactive.d.ts +12 -0
  33. package/dist/commands/interactive.d.ts.map +1 -0
  34. package/dist/commands/interactive.js +1071 -0
  35. package/dist/commands/interactive.js.map +1 -0
  36. package/dist/commands/launch.d.ts +16 -0
  37. package/dist/commands/launch.d.ts.map +1 -0
  38. package/dist/commands/launch.js +684 -0
  39. package/dist/commands/launch.js.map +1 -0
  40. package/dist/commands/login.d.ts +40 -0
  41. package/dist/commands/login.d.ts.map +1 -0
  42. package/dist/commands/login.js +469 -0
  43. package/dist/commands/login.js.map +1 -0
  44. package/dist/commands/logs.d.ts +22 -0
  45. package/dist/commands/logs.d.ts.map +1 -0
  46. package/dist/commands/logs.js +105 -0
  47. package/dist/commands/logs.js.map +1 -0
  48. package/dist/commands/merge.d.ts +7 -0
  49. package/dist/commands/merge.d.ts.map +1 -0
  50. package/dist/commands/merge.js +240 -0
  51. package/dist/commands/merge.js.map +1 -0
  52. package/dist/commands/preview.d.ts +7 -0
  53. package/dist/commands/preview.d.ts.map +1 -0
  54. package/dist/commands/preview.js +160 -0
  55. package/dist/commands/preview.js.map +1 -0
  56. package/dist/commands/project.d.ts +18 -0
  57. package/dist/commands/project.d.ts.map +1 -0
  58. package/dist/commands/project.js +352 -0
  59. package/dist/commands/project.js.map +1 -0
  60. package/dist/commands/respond.d.ts +7 -0
  61. package/dist/commands/respond.d.ts.map +1 -0
  62. package/dist/commands/respond.js +112 -0
  63. package/dist/commands/respond.js.map +1 -0
  64. package/dist/commands/setPriority.d.ts +7 -0
  65. package/dist/commands/setPriority.d.ts.map +1 -0
  66. package/dist/commands/setPriority.js +112 -0
  67. package/dist/commands/setPriority.js.map +1 -0
  68. package/dist/commands/track.d.ts +7 -0
  69. package/dist/commands/track.d.ts.map +1 -0
  70. package/dist/commands/track.js +140 -0
  71. package/dist/commands/track.js.map +1 -0
  72. package/dist/commands/upload.d.ts +21 -0
  73. package/dist/commands/upload.d.ts.map +1 -0
  74. package/dist/commands/upload.js +145 -0
  75. package/dist/commands/upload.js.map +1 -0
  76. package/dist/commands/view.d.ts +7 -0
  77. package/dist/commands/view.d.ts.map +1 -0
  78. package/dist/commands/view.js +168 -0
  79. package/dist/commands/view.js.map +1 -0
  80. package/dist/commands/watch.d.ts +7 -0
  81. package/dist/commands/watch.d.ts.map +1 -0
  82. package/dist/commands/watch.js +438 -0
  83. package/dist/commands/watch.js.map +1 -0
  84. package/dist/commands/worktree.d.ts +7 -0
  85. package/dist/commands/worktree.d.ts.map +1 -0
  86. package/dist/commands/worktree.js +122 -0
  87. package/dist/commands/worktree.js.map +1 -0
  88. package/dist/config/command-names.d.ts +16 -0
  89. package/dist/config/command-names.d.ts.map +1 -0
  90. package/dist/config/command-names.js +17 -0
  91. package/dist/config/command-names.js.map +1 -0
  92. package/dist/config/constants.d.ts +12 -0
  93. package/dist/config/constants.d.ts.map +1 -0
  94. package/dist/config/constants.js +12 -0
  95. package/dist/config/constants.js.map +1 -0
  96. package/dist/config/index.d.ts +47 -0
  97. package/dist/config/index.d.ts.map +1 -0
  98. package/dist/config/index.js +175 -0
  99. package/dist/config/index.js.map +1 -0
  100. package/dist/index.d.ts +3 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +148 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/services/api/HulaApiClient.d.ts +170 -0
  105. package/dist/services/api/HulaApiClient.d.ts.map +1 -0
  106. package/dist/services/api/HulaApiClient.js +233 -0
  107. package/dist/services/api/HulaApiClient.js.map +1 -0
  108. package/dist/services/diff/DiffService.d.ts +44 -0
  109. package/dist/services/diff/DiffService.d.ts.map +1 -0
  110. package/dist/services/diff/DiffService.js +126 -0
  111. package/dist/services/diff/DiffService.js.map +1 -0
  112. package/dist/services/editor/EditorService.d.ts +53 -0
  113. package/dist/services/editor/EditorService.d.ts.map +1 -0
  114. package/dist/services/editor/EditorService.js +161 -0
  115. package/dist/services/editor/EditorService.js.map +1 -0
  116. package/dist/services/git/GitService.d.ts +124 -0
  117. package/dist/services/git/GitService.d.ts.map +1 -0
  118. package/dist/services/git/GitService.js +423 -0
  119. package/dist/services/git/GitService.js.map +1 -0
  120. package/dist/services/git/WorktreeService.d.ts +144 -0
  121. package/dist/services/git/WorktreeService.d.ts.map +1 -0
  122. package/dist/services/git/WorktreeService.js +505 -0
  123. package/dist/services/git/WorktreeService.js.map +1 -0
  124. package/dist/services/github/ActionsService.d.ts +66 -0
  125. package/dist/services/github/ActionsService.d.ts.map +1 -0
  126. package/dist/services/github/ActionsService.js +114 -0
  127. package/dist/services/github/ActionsService.js.map +1 -0
  128. package/dist/services/github/AssetUploadService.d.ts +103 -0
  129. package/dist/services/github/AssetUploadService.d.ts.map +1 -0
  130. package/dist/services/github/AssetUploadService.js +299 -0
  131. package/dist/services/github/AssetUploadService.js.map +1 -0
  132. package/dist/services/github/BatchCopilotDetectionService.d.ts +58 -0
  133. package/dist/services/github/BatchCopilotDetectionService.d.ts.map +1 -0
  134. package/dist/services/github/BatchCopilotDetectionService.js +321 -0
  135. package/dist/services/github/BatchCopilotDetectionService.js.map +1 -0
  136. package/dist/services/github/CopilotDetectionService.d.ts +40 -0
  137. package/dist/services/github/CopilotDetectionService.d.ts.map +1 -0
  138. package/dist/services/github/CopilotDetectionService.js +280 -0
  139. package/dist/services/github/CopilotDetectionService.js.map +1 -0
  140. package/dist/services/github/CopilotService.d.ts +27 -0
  141. package/dist/services/github/CopilotService.d.ts.map +1 -0
  142. package/dist/services/github/CopilotService.js +249 -0
  143. package/dist/services/github/CopilotService.js.map +1 -0
  144. package/dist/services/github/DeploymentDetectionService.d.ts +38 -0
  145. package/dist/services/github/DeploymentDetectionService.d.ts.map +1 -0
  146. package/dist/services/github/DeploymentDetectionService.js +104 -0
  147. package/dist/services/github/DeploymentDetectionService.js.map +1 -0
  148. package/dist/services/github/GithubAppService.d.ts +40 -0
  149. package/dist/services/github/GithubAppService.d.ts.map +1 -0
  150. package/dist/services/github/GithubAppService.js +187 -0
  151. package/dist/services/github/GithubAppService.js.map +1 -0
  152. package/dist/services/github/IssueService.d.ts +65 -0
  153. package/dist/services/github/IssueService.d.ts.map +1 -0
  154. package/dist/services/github/IssueService.js +231 -0
  155. package/dist/services/github/IssueService.js.map +1 -0
  156. package/dist/services/github/LabelService.d.ts +36 -0
  157. package/dist/services/github/LabelService.d.ts.map +1 -0
  158. package/dist/services/github/LabelService.js +122 -0
  159. package/dist/services/github/LabelService.js.map +1 -0
  160. package/dist/services/github/PRService.d.ts +77 -0
  161. package/dist/services/github/PRService.d.ts.map +1 -0
  162. package/dist/services/github/PRService.js +287 -0
  163. package/dist/services/github/PRService.js.map +1 -0
  164. package/dist/services/github/ProjectService.d.ts +144 -0
  165. package/dist/services/github/ProjectService.d.ts.map +1 -0
  166. package/dist/services/github/ProjectService.js +804 -0
  167. package/dist/services/github/ProjectService.js.map +1 -0
  168. package/dist/services/hooks/HookExecutor.d.ts +66 -0
  169. package/dist/services/hooks/HookExecutor.d.ts.map +1 -0
  170. package/dist/services/hooks/HookExecutor.js +227 -0
  171. package/dist/services/hooks/HookExecutor.js.map +1 -0
  172. package/dist/services/hooks/index.d.ts +2 -0
  173. package/dist/services/hooks/index.d.ts.map +1 -0
  174. package/dist/services/hooks/index.js +2 -0
  175. package/dist/services/hooks/index.js.map +1 -0
  176. package/dist/services/logs/LogFormatterService.d.ts +17 -0
  177. package/dist/services/logs/LogFormatterService.d.ts.map +1 -0
  178. package/dist/services/logs/LogFormatterService.js +35 -0
  179. package/dist/services/logs/LogFormatterService.js.map +1 -0
  180. package/dist/services/logs/TempFileService.d.ts +27 -0
  181. package/dist/services/logs/TempFileService.d.ts.map +1 -0
  182. package/dist/services/logs/TempFileService.js +90 -0
  183. package/dist/services/logs/TempFileService.js.map +1 -0
  184. package/dist/services/logs/index.d.ts +3 -0
  185. package/dist/services/logs/index.d.ts.map +1 -0
  186. package/dist/services/logs/index.js +4 -0
  187. package/dist/services/logs/index.js.map +1 -0
  188. package/dist/services/plan/PlanService.d.ts +70 -0
  189. package/dist/services/plan/PlanService.d.ts.map +1 -0
  190. package/dist/services/plan/PlanService.js +211 -0
  191. package/dist/services/plan/PlanService.js.map +1 -0
  192. package/dist/services/polling/GitHubDirectPollingAdapter.d.ts +16 -0
  193. package/dist/services/polling/GitHubDirectPollingAdapter.d.ts.map +1 -0
  194. package/dist/services/polling/GitHubDirectPollingAdapter.js +87 -0
  195. package/dist/services/polling/GitHubDirectPollingAdapter.js.map +1 -0
  196. package/dist/services/polling/HulaServerPollingAdapter.d.ts +23 -0
  197. package/dist/services/polling/HulaServerPollingAdapter.d.ts.map +1 -0
  198. package/dist/services/polling/HulaServerPollingAdapter.js +78 -0
  199. package/dist/services/polling/HulaServerPollingAdapter.js.map +1 -0
  200. package/dist/services/polling/IStatusPollingAdapter.d.ts +29 -0
  201. package/dist/services/polling/IStatusPollingAdapter.d.ts.map +1 -0
  202. package/dist/services/polling/IStatusPollingAdapter.js +2 -0
  203. package/dist/services/polling/IStatusPollingAdapter.js.map +1 -0
  204. package/dist/services/polling/StatusPollingAdapterFactory.d.ts +14 -0
  205. package/dist/services/polling/StatusPollingAdapterFactory.d.ts.map +1 -0
  206. package/dist/services/polling/StatusPollingAdapterFactory.js +41 -0
  207. package/dist/services/polling/StatusPollingAdapterFactory.js.map +1 -0
  208. package/dist/services/polling/index.d.ts +5 -0
  209. package/dist/services/polling/index.d.ts.map +1 -0
  210. package/dist/services/polling/index.js +5 -0
  211. package/dist/services/polling/index.js.map +1 -0
  212. package/dist/services/preview/PreviewService.d.ts +86 -0
  213. package/dist/services/preview/PreviewService.d.ts.map +1 -0
  214. package/dist/services/preview/PreviewService.js +439 -0
  215. package/dist/services/preview/PreviewService.js.map +1 -0
  216. package/dist/services/tracking/ProjectTrackingAdapter.d.ts +41 -0
  217. package/dist/services/tracking/ProjectTrackingAdapter.d.ts.map +1 -0
  218. package/dist/services/tracking/ProjectTrackingAdapter.js +230 -0
  219. package/dist/services/tracking/ProjectTrackingAdapter.js.map +1 -0
  220. package/dist/services/tracking/RemoteTrackingAdapter.d.ts +62 -0
  221. package/dist/services/tracking/RemoteTrackingAdapter.d.ts.map +1 -0
  222. package/dist/services/tracking/RemoteTrackingAdapter.js +242 -0
  223. package/dist/services/tracking/RemoteTrackingAdapter.js.map +1 -0
  224. package/dist/services/tracking/TrackingAdapterFactory.d.ts +25 -0
  225. package/dist/services/tracking/TrackingAdapterFactory.d.ts.map +1 -0
  226. package/dist/services/tracking/TrackingAdapterFactory.js +55 -0
  227. package/dist/services/tracking/TrackingAdapterFactory.js.map +1 -0
  228. package/dist/services/tracking/TrackingService.d.ts +104 -0
  229. package/dist/services/tracking/TrackingService.d.ts.map +1 -0
  230. package/dist/services/tracking/TrackingService.js +256 -0
  231. package/dist/services/tracking/TrackingService.js.map +1 -0
  232. package/dist/services/tracking/UntrackedIssuesService.d.ts +20 -0
  233. package/dist/services/tracking/UntrackedIssuesService.d.ts.map +1 -0
  234. package/dist/services/tracking/UntrackedIssuesService.js +148 -0
  235. package/dist/services/tracking/UntrackedIssuesService.js.map +1 -0
  236. package/dist/services/tracking/local-file-migration.d.ts +16 -0
  237. package/dist/services/tracking/local-file-migration.d.ts.map +1 -0
  238. package/dist/services/tracking/local-file-migration.js +86 -0
  239. package/dist/services/tracking/local-file-migration.js.map +1 -0
  240. package/dist/templates/planning-instructions.md +752 -0
  241. package/dist/templates/proceed-instructions.md +453 -0
  242. package/dist/templates/scripts/hula-fix-commit.sh +110 -0
  243. package/dist/templates/scripts/hula-fix-setup.sh +145 -0
  244. package/dist/templates/scripts/hula-launch-run.sh +89 -0
  245. package/dist/templates/scripts/hula-merge-local.sh +138 -0
  246. package/dist/templates/scripts/hula-merge-remote.sh +74 -0
  247. package/dist/templates/scripts/hula-read-config.sh +38 -0
  248. package/dist/templates/scripts/hula-verify-gather.sh +135 -0
  249. package/dist/templates/scripts/hula-verify-post.sh +84 -0
  250. package/dist/templates/skills/hula-confirm/SKILL.md +361 -0
  251. package/dist/templates/skills/hula-create/SKILL.md +211 -0
  252. package/dist/templates/skills/hula-fix/SKILL.md +224 -0
  253. package/dist/templates/skills/hula-launch/SKILL.md +159 -0
  254. package/dist/templates/skills/hula-log/SKILL.md +105 -0
  255. package/dist/templates/skills/hula-merge/SKILL.md +387 -0
  256. package/dist/templates/skills/hula-plan/SKILL.md +148 -0
  257. package/dist/templates/skills/hula-upload/SKILL.md +115 -0
  258. package/dist/templates/skills/hula-verify/SKILL.md +754 -0
  259. package/dist/types/common.schema.d.ts +46 -0
  260. package/dist/types/common.schema.d.ts.map +1 -0
  261. package/dist/types/common.schema.js +60 -0
  262. package/dist/types/common.schema.js.map +1 -0
  263. package/dist/types/config.schema.d.ts +443 -0
  264. package/dist/types/config.schema.d.ts.map +1 -0
  265. package/dist/types/config.schema.js +126 -0
  266. package/dist/types/config.schema.js.map +1 -0
  267. package/dist/types/index.d.ts +6 -0
  268. package/dist/types/index.d.ts.map +1 -0
  269. package/dist/types/index.js +7 -0
  270. package/dist/types/index.js.map +1 -0
  271. package/dist/types/issue.schema.d.ts +136 -0
  272. package/dist/types/issue.schema.d.ts.map +1 -0
  273. package/dist/types/issue.schema.js +49 -0
  274. package/dist/types/issue.schema.js.map +1 -0
  275. package/dist/types/pr.schema.d.ts +118 -0
  276. package/dist/types/pr.schema.d.ts.map +1 -0
  277. package/dist/types/pr.schema.js +40 -0
  278. package/dist/types/pr.schema.js.map +1 -0
  279. package/dist/types/tracking.schema.d.ts +340 -0
  280. package/dist/types/tracking.schema.d.ts.map +1 -0
  281. package/dist/types/tracking.schema.js +56 -0
  282. package/dist/types/tracking.schema.js.map +1 -0
  283. package/dist/utils/browser-launcher.d.ts +60 -0
  284. package/dist/utils/browser-launcher.d.ts.map +1 -0
  285. package/dist/utils/browser-launcher.js +263 -0
  286. package/dist/utils/browser-launcher.js.map +1 -0
  287. package/dist/utils/cache.d.ts +44 -0
  288. package/dist/utils/cache.d.ts.map +1 -0
  289. package/dist/utils/cache.js +94 -0
  290. package/dist/utils/cache.js.map +1 -0
  291. package/dist/utils/config-parser.d.ts +16 -0
  292. package/dist/utils/config-parser.d.ts.map +1 -0
  293. package/dist/utils/config-parser.js +210 -0
  294. package/dist/utils/config-parser.js.map +1 -0
  295. package/dist/utils/editor.d.ts +21 -0
  296. package/dist/utils/editor.d.ts.map +1 -0
  297. package/dist/utils/editor.js +213 -0
  298. package/dist/utils/editor.js.map +1 -0
  299. package/dist/utils/git-utils.d.ts +5 -0
  300. package/dist/utils/git-utils.d.ts.map +1 -0
  301. package/dist/utils/git-utils.js +18 -0
  302. package/dist/utils/git-utils.js.map +1 -0
  303. package/dist/utils/github-cli.d.ts +62 -0
  304. package/dist/utils/github-cli.d.ts.map +1 -0
  305. package/dist/utils/github-cli.js +492 -0
  306. package/dist/utils/github-cli.js.map +1 -0
  307. package/dist/utils/logger.d.ts +45 -0
  308. package/dist/utils/logger.d.ts.map +1 -0
  309. package/dist/utils/logger.js +118 -0
  310. package/dist/utils/logger.js.map +1 -0
  311. package/dist/utils/open-url.d.ts +19 -0
  312. package/dist/utils/open-url.d.ts.map +1 -0
  313. package/dist/utils/open-url.js +37 -0
  314. package/dist/utils/open-url.js.map +1 -0
  315. package/dist/utils/project-resolver.d.ts +13 -0
  316. package/dist/utils/project-resolver.d.ts.map +1 -0
  317. package/dist/utils/project-resolver.js +35 -0
  318. package/dist/utils/project-resolver.js.map +1 -0
  319. package/dist/utils/prompts.d.ts +80 -0
  320. package/dist/utils/prompts.d.ts.map +1 -0
  321. package/dist/utils/prompts.js +326 -0
  322. package/dist/utils/prompts.js.map +1 -0
  323. package/dist/utils/shell.d.ts +54 -0
  324. package/dist/utils/shell.d.ts.map +1 -0
  325. package/dist/utils/shell.js +152 -0
  326. package/dist/utils/shell.js.map +1 -0
  327. package/dist/utils/validators.d.ts +32 -0
  328. package/dist/utils/validators.d.ts.map +1 -0
  329. package/dist/utils/validators.js +64 -0
  330. package/dist/utils/validators.js.map +1 -0
  331. package/package.json +73 -0
@@ -0,0 +1,438 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { PRService } from "../services/github/PRService.js";
3
+ import { IssueService } from "../services/github/IssueService.js";
4
+ import { ActionsService } from "../services/github/ActionsService.js";
5
+ import { DiffService } from "../services/diff/DiffService.js";
6
+ import { EditorService } from "../services/editor/EditorService.js";
7
+ import { TrackingService } from "../services/tracking/TrackingService.js";
8
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
9
+ import { searchSelect, select, UserCancelledError } from "../utils/prompts.js";
10
+ import { writeFile } from "fs/promises";
11
+ import { join } from "path";
12
+ import { tmpdir } from "os";
13
+ /**
14
+ * Watch command - Monitor PR for Copilot completion and test results
15
+ */
16
+ export function watchCommand(program, config) {
17
+ program
18
+ .command("watch [issueNumber] [testPath]")
19
+ .description("Monitor PR for Copilot completion and test results")
20
+ .option("--interval <seconds>", "Check interval in seconds", "60")
21
+ .option("--max-iterations <number>", "Maximum iterations", "20")
22
+ .option("--timeout <seconds>", "Workflow completion timeout in seconds", "900")
23
+ .action(async (issueNumber, testPath, options) => {
24
+ try {
25
+ await executeWatch(config, issueNumber, testPath, options);
26
+ }
27
+ catch (error) {
28
+ if (error instanceof UserCancelledError) {
29
+ logger.info('\nCancelled.');
30
+ process.exit(0);
31
+ }
32
+ logger.error("Failed to watch PR:");
33
+ logger.error(error instanceof Error ? error.message : String(error));
34
+ process.exit(1);
35
+ }
36
+ });
37
+ }
38
+ async function executeWatch(config, issueNumberArg, testPath, options) {
39
+ logger.section("🔍 Watch PR and Test Results");
40
+ // Initialize services
41
+ const prService = new PRService();
42
+ const issueService = new IssueService();
43
+ const actionsService = new ActionsService();
44
+ const diffService = new DiffService();
45
+ const editorService = new EditorService(config.editorCommand);
46
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
47
+ // Get issue number
48
+ let issueNumber;
49
+ if (issueNumberArg) {
50
+ issueNumber = parseInt(issueNumberArg, 10);
51
+ if (isNaN(issueNumber)) {
52
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
53
+ }
54
+ }
55
+ else {
56
+ // Show tracked issues and let user select
57
+ const trackedIssues = await trackingService.getAll();
58
+ if (trackedIssues.length === 0) {
59
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
60
+ }
61
+ const choices = trackedIssues
62
+ .filter((issue) => issue.number !== undefined)
63
+ .map((issue) => ({
64
+ name: `#${issue.number} - ${issue.name}`,
65
+ value: issue.number.toString(),
66
+ }));
67
+ const selected = await searchSelect("Select issue to watch:", choices);
68
+ issueNumber = parseInt(selected, 10);
69
+ }
70
+ // Get PR for issue
71
+ logger.info(`Fetching PR for issue #${issueNumber}...`);
72
+ const pr = await prService.getByIssue(issueNumber);
73
+ if (!pr) {
74
+ throw new Error(`No PR found for issue #${issueNumber}`);
75
+ }
76
+ logger.info(`Watching Issue #${issueNumber}`);
77
+ logger.info(`PR #${pr.number}: ${pr.title}`);
78
+ logger.blank();
79
+ // If testPath provided, run test first
80
+ if (testPath) {
81
+ const timeoutSeconds = parseInt(options.timeout, 10);
82
+ await runTestCycle(pr.number, testPath, issueService, actionsService, editorService, timeoutSeconds);
83
+ }
84
+ // Enter interactive loop
85
+ const timeoutSeconds = parseInt(options.timeout, 10);
86
+ await watchLoop(issueNumber, pr.number, config, {
87
+ prService,
88
+ issueService,
89
+ actionsService,
90
+ diffService,
91
+ editorService,
92
+ }, timeoutSeconds);
93
+ }
94
+ /**
95
+ * Run a test cycle: post test command and wait for results
96
+ */
97
+ async function runTestCycle(prNumber, testPath, issueService, actionsService, editorService, timeoutSeconds = 900) {
98
+ logger.section("📤 Running Test");
99
+ // Post /test command
100
+ const testCommand = `/test ${testPath}`;
101
+ logger.info(`Posting test command: ${testCommand}`);
102
+ const beforeTime = new Date();
103
+ await issueService.addComment(prNumber, testCommand);
104
+ logger.success("✓ Test command posted");
105
+ logger.blank();
106
+ // Wait a bit for GitHub Actions to start
107
+ process.stdout.write("⏳ Waiting for GitHub Actions to start...");
108
+ await new Promise((resolve) => setTimeout(resolve, 5000));
109
+ // Poll for workflow run
110
+ process.stdout.write("\r🔍 Looking for workflow run... ");
111
+ let attemptCount = 0;
112
+ const maxAttempts = 30; // 30 attempts with 10s interval = 5 minutes
113
+ while (attemptCount < maxAttempts) {
114
+ const run = await actionsService.getLatestWorkflowRunAfter(prNumber, beforeTime);
115
+ if (run) {
116
+ process.stdout.write("\r" + " ".repeat(50) + "\r");
117
+ logger.info(`Found workflow run #${run.id}: ${run.name}`);
118
+ logger.blank();
119
+ // Poll for completion with configurable timeout
120
+ const completedRun = await actionsService.pollForCompletion(run.id, timeoutSeconds, 15);
121
+ if (completedRun) {
122
+ const testResult = await actionsService.convertToTestResult(completedRun);
123
+ await displayTestResult(testResult, testPath, prNumber, issueService, editorService, beforeTime);
124
+ return;
125
+ }
126
+ else {
127
+ logger.warning("⏱️ Timeout waiting for test completion");
128
+ return;
129
+ }
130
+ }
131
+ attemptCount++;
132
+ process.stdout.write(`\r⏳ Waiting for workflow to start... (${attemptCount * 10}s)`);
133
+ await new Promise((resolve) => setTimeout(resolve, 10000));
134
+ }
135
+ logger.warning("⏱️ Timeout waiting for workflow to start");
136
+ logger.info("The test may still be running. Check GitHub Actions:");
137
+ logger.info(` https://github.com/{owner}/{repo}/actions`);
138
+ }
139
+ /**
140
+ * Display test results
141
+ */
142
+ async function displayTestResult(result, testPath, prNumber, issueService, editorService, testCommandTime) {
143
+ logger.blank();
144
+ logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
145
+ if (result.passed) {
146
+ logger.success("✅ Test PASSED");
147
+ }
148
+ else {
149
+ logger.error("❌ Test FAILED");
150
+ }
151
+ logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
152
+ logger.blank();
153
+ logger.info(`Test: ${testPath}`);
154
+ logger.info(`Duration: ${result.duration}s`);
155
+ logger.info(`Workflow: ${result.workflowUrl}`);
156
+ logger.blank();
157
+ // Fetch the GitHub Actions bot comment with test results
158
+ logger.info("📄 Fetching test result details from GitHub Actions...");
159
+ const testResultComment = await fetchTestResultComment(prNumber, issueService, testCommandTime);
160
+ if (testResultComment) {
161
+ // Save to temp file and open in editor
162
+ const tempFile = join(tmpdir(), `hublaunch-test-result-pr${prNumber}.md`);
163
+ await writeFile(tempFile, testResultComment);
164
+ logger.success(`Test results saved to: ${tempFile}`);
165
+ // Open in editor in preview mode
166
+ try {
167
+ await editorService.openFileInPreview(tempFile);
168
+ logger.success("✓ Test results opened in editor");
169
+ }
170
+ catch (error) {
171
+ logger.warning(`Could not open in editor: ${error instanceof Error ? error.message : String(error)}`);
172
+ logger.info(`View manually: ${tempFile}`);
173
+ }
174
+ }
175
+ else {
176
+ logger.warning("Could not fetch detailed test results from GitHub Actions comment");
177
+ }
178
+ logger.blank();
179
+ }
180
+ /**
181
+ * Fetch the GitHub Actions bot comment with test results
182
+ */
183
+ async function fetchTestResultComment(prNumber, issueService, afterTime) {
184
+ const maxAttempts = 40; // 40 attempts with 3s interval = 2 minutes
185
+ let attemptCount = 0;
186
+ // Add buffer to afterTime to account for clock skew (subtract 5 seconds)
187
+ const adjustedAfterTime = new Date(afterTime.getTime() - 5000);
188
+ while (attemptCount < maxAttempts) {
189
+ const comments = await issueService.getComments(prNumber);
190
+ // Look for test result comments posted after test command
191
+ // The comments are posted by the workflow using the user's PAT token, so we check content instead of user
192
+ // Support both old format (with @copilot) and new format (without @copilot)
193
+ const testResultComments = comments.filter((c) => {
194
+ const commentTime = new Date(c.created_at);
195
+ const hasTestResult = c.body.includes("## ✅ Integration Test Passed") ||
196
+ c.body.includes("## ✅ Unit Test Passed") ||
197
+ c.body.includes("## ❌ Integration Test Failed") ||
198
+ c.body.includes("## ❌ Unit Test Failed");
199
+ // Also check for old format with @copilot
200
+ const hasOldFormat = c.body.includes("@copilot Please analyze the test failure");
201
+ return commentTime > adjustedAfterTime && (hasTestResult || hasOldFormat);
202
+ });
203
+ if (testResultComments.length > 0) {
204
+ // Return the most recent test result comment
205
+ const sortedComments = testResultComments.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
206
+ return sortedComments[0]?.body ?? null;
207
+ }
208
+ // Wait before next attempt (show progress every 5 attempts)
209
+ attemptCount++;
210
+ if (attemptCount % 5 === 0) {
211
+ logger.debug(`Still waiting for test result comment... (${attemptCount * 3}s elapsed)`);
212
+ }
213
+ await new Promise((resolve) => setTimeout(resolve, 3000));
214
+ }
215
+ return null;
216
+ }
217
+ /**
218
+ * Interactive watch loop with menu
219
+ */
220
+ async function watchLoop(_issueNumber, prNumber, _config, services, timeoutSeconds = 900) {
221
+ let running = true;
222
+ while (running) {
223
+ // Show menu
224
+ logger.section("─────────────────────────────────────────");
225
+ logger.info("What would you like to do next?");
226
+ logger.blank();
227
+ const action = await select("Select an action:", [
228
+ "d) View diffs - See code changes in this PR",
229
+ "t) Run test - Run tests again",
230
+ "o) Respond - Send message to Copilot",
231
+ "q) Quit - Exit watch mode",
232
+ ]);
233
+ const choice = action.charAt(0);
234
+ try {
235
+ switch (choice) {
236
+ case "d":
237
+ await handleViewDiffs(prNumber, services.prService, services.diffService, services.editorService);
238
+ break;
239
+ case "t":
240
+ await handleRunTest(prNumber, services.issueService, services.actionsService, services.editorService, timeoutSeconds);
241
+ break;
242
+ case "o":
243
+ await handleRespond(_issueNumber, prNumber, services.issueService, _config);
244
+ break;
245
+ case "q":
246
+ logger.success("✓ Exiting watch mode");
247
+ running = false;
248
+ break;
249
+ }
250
+ }
251
+ catch (error) {
252
+ logger.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
253
+ logger.blank();
254
+ }
255
+ }
256
+ // Exit cleanly without waiting for input
257
+ logger.blank();
258
+ }
259
+ /**
260
+ * Handle view diffs action
261
+ */
262
+ async function handleViewDiffs(prNumber, _prService, diffService, editorService) {
263
+ logger.blank();
264
+ logger.section("📄 Viewing Diffs");
265
+ // Get diff and files
266
+ logger.info("Fetching diff content...");
267
+ const [diff, files] = await Promise.all([
268
+ diffService.getDiff(prNumber),
269
+ diffService.getFiles(prNumber),
270
+ ]);
271
+ logger.info(`Found ${files.length} changed files`);
272
+ // Format diff with links
273
+ const formattedDiff = await diffService.formatDiffWithLinks(prNumber, diff, files, "vscode");
274
+ // Save to temp file
275
+ const tempFile = join(tmpdir(), `hublaunch-diff-pr${prNumber}.md`);
276
+ await writeFile(tempFile, formattedDiff);
277
+ logger.success(`Diff saved to: ${tempFile}`);
278
+ // Open in editor in preview mode
279
+ try {
280
+ await editorService.openFileInPreview(tempFile);
281
+ logger.success("✓ Diff opened in preview mode");
282
+ }
283
+ catch (error) {
284
+ logger.warning(`Could not open in editor, view manually: ${tempFile}`);
285
+ }
286
+ logger.blank();
287
+ }
288
+ /**
289
+ * Handle run test action
290
+ */
291
+ async function handleRunTest(prNumber, issueService, actionsService, editorService, timeoutSeconds = 900) {
292
+ logger.blank();
293
+ // Prompt for test path
294
+ const inquirer = await import("inquirer");
295
+ const { testPath } = await inquirer.default.prompt([
296
+ {
297
+ type: "input",
298
+ name: "testPath",
299
+ message: "Enter test path:",
300
+ default: "integrationTest/",
301
+ },
302
+ ]);
303
+ if (testPath.trim()) {
304
+ await runTestCycle(prNumber, testPath.trim(), issueService, actionsService, editorService, timeoutSeconds);
305
+ }
306
+ else {
307
+ logger.warning("No test path provided");
308
+ }
309
+ logger.blank();
310
+ }
311
+ /**
312
+ * Handle respond to Copilot action
313
+ */
314
+ async function handleRespond(_issueNumber, prNumber, issueService, config) {
315
+ logger.blank();
316
+ logger.section("📨 Respond to Copilot");
317
+ // Import compose functions
318
+ const { selectComposeMode, openEditorForMessage, composeInTerminal } = await import("../utils/editor.js");
319
+ // Ask user how they want to compose
320
+ const mode = await selectComposeMode();
321
+ if (!mode) {
322
+ // User cancelled
323
+ logger.warning("Message composition cancelled");
324
+ return;
325
+ }
326
+ logger.blank();
327
+ // Compose based on selected mode
328
+ let message;
329
+ if (mode === "editor") {
330
+ message = await openEditorForMessage(config, "@copilot ");
331
+ }
332
+ else {
333
+ // Terminal mode
334
+ message = await composeInTerminal("@copilot ");
335
+ }
336
+ if (!message?.trim()) {
337
+ logger.warning("Message composition cancelled");
338
+ return;
339
+ }
340
+ // Ensure @copilot prefix
341
+ let finalMessage = message.trim();
342
+ if (!finalMessage.startsWith("@copilot")) {
343
+ finalMessage = `@copilot ${finalMessage}`;
344
+ }
345
+ logger.info("Posting comment...");
346
+ await issueService.addComment(prNumber, finalMessage);
347
+ logger.success("✓ Comment posted to PR");
348
+ // Update tracking status to 'waiting' after responding to Copilot
349
+ try {
350
+ const { TrackingService } = await import("../services/tracking/TrackingService.js");
351
+ const { TrackingAdapterFactory } = await import("../services/tracking/TrackingAdapterFactory.js");
352
+ const { STATUS } = await import("../types/index.js");
353
+ const adapter = TrackingAdapterFactory.create(config);
354
+ const trackingService = new TrackingService(adapter);
355
+ const issue = await trackingService.getByNumber(_issueNumber);
356
+ if (issue) {
357
+ await trackingService.updateStatus(_issueNumber, STATUS.WAITING);
358
+ logger.info("✓ Updated tracking status to 'waiting'");
359
+ }
360
+ }
361
+ catch (error) {
362
+ // Don't fail if status update fails, just log it
363
+ logger.debug(`Failed to update tracking status: ${error instanceof Error ? error.message : String(error)}`);
364
+ }
365
+ logger.blank();
366
+ // Poll for Copilot response
367
+ logger.info("⏳ Waiting for Copilot response...");
368
+ const response = await pollForCopilotResponse(prNumber, issueService, 1200);
369
+ if (response) {
370
+ displayCopilotResponse(response);
371
+ }
372
+ else {
373
+ logger.warning("⏱️ No response from Copilot yet");
374
+ logger.info("Copilot may still be processing. Check the PR later.");
375
+ }
376
+ logger.blank();
377
+ }
378
+ /**
379
+ * Format elapsed seconds into a readable time string
380
+ */
381
+ function formatElapsedTime(seconds) {
382
+ if (seconds < 60) {
383
+ return `${seconds}s`;
384
+ }
385
+ const minutes = Math.floor(seconds / 60);
386
+ const remainingSeconds = seconds % 60;
387
+ return `${minutes}m ${remainingSeconds}s`;
388
+ }
389
+ /**
390
+ * Poll for Copilot response
391
+ */
392
+ async function pollForCopilotResponse(prNumber, issueService, timeoutSeconds) {
393
+ const startTime = Date.now();
394
+ const pollInterval = 15000; // 15 seconds
395
+ // Get initial comment count
396
+ const initialComments = await issueService.getComments(prNumber);
397
+ const lastCommentTime = initialComments.length > 0
398
+ ? new Date(initialComments[initialComments.length - 1]?.created_at ?? new Date())
399
+ : new Date();
400
+ while (Date.now() - startTime < timeoutSeconds * 1000) {
401
+ const comments = await issueService.getComments(prNumber);
402
+ // Look for new comments from Copilot (github-actions bot)
403
+ const newComments = comments.filter((c) => {
404
+ const commentTime = new Date(c.created_at);
405
+ return (commentTime > lastCommentTime &&
406
+ (c.user.login === "github-actions[bot]" ||
407
+ c.user.login === "copilot" ||
408
+ c.body.toLowerCase().includes("copilot")));
409
+ });
410
+ if (newComments.length > 0 && newComments[0]) {
411
+ process.stdout.write("\r" + " ".repeat(50) + "\r");
412
+ return {
413
+ body: newComments[0].body,
414
+ created_at: newComments[0].created_at,
415
+ };
416
+ }
417
+ const elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);
418
+ const formattedTime = formatElapsedTime(elapsedSeconds);
419
+ process.stdout.write(`\r⏳ Checking... (${formattedTime} elapsed)`);
420
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
421
+ }
422
+ return null;
423
+ }
424
+ /**
425
+ * Display Copilot response
426
+ */
427
+ function displayCopilotResponse(response) {
428
+ logger.blank();
429
+ logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
430
+ logger.info("📨 Copilot Response");
431
+ logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
432
+ logger.blank();
433
+ // Display the response body
434
+ logger.info(response.body);
435
+ logger.blank();
436
+ logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
437
+ }
438
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ import type { Config } from '../types/index.js';
3
+ /**
4
+ * Worktree commands for plan and fix isolation
5
+ */
6
+ export declare function worktreeCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6HtE"}
@@ -0,0 +1,122 @@
1
+ import { resolve, isAbsolute } from 'path';
2
+ import { WorktreeService } from '../services/git/WorktreeService.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { getRepoInfo } from '../utils/github-cli.js';
5
+ import { getRepoRoot } from '../utils/shell.js';
6
+ /**
7
+ * Worktree commands for plan and fix isolation
8
+ */
9
+ export function worktreeCommand(program, config) {
10
+ const rawWorktreeBasePath = config.worktreeBasePath ?? '.hula-worktrees';
11
+ const worktree = program
12
+ .command('worktree')
13
+ .description('Manage plan worktrees');
14
+ worktree
15
+ .command('setup')
16
+ .description('Create a worktree for plan creation')
17
+ .action(async () => {
18
+ try {
19
+ const worktreeService = new WorktreeService();
20
+ if (await worktreeService.worktreeExists()) {
21
+ const path = await worktreeService.getWorktreePath();
22
+ logger.info(`Worktree already exists at: ${path}`);
23
+ return;
24
+ }
25
+ const path = await worktreeService.createPlanWorktree();
26
+ logger.success(`Worktree created at: ${path}`);
27
+ logger.info('Plan files should be saved under this path.');
28
+ }
29
+ catch (error) {
30
+ logger.error('Failed to setup worktree:');
31
+ logger.error(error instanceof Error ? error.message : String(error));
32
+ process.exit(1);
33
+ }
34
+ });
35
+ worktree
36
+ .command('cleanup')
37
+ .description('Remove the plan worktree and all orphaned hula worktrees')
38
+ .action(async () => {
39
+ try {
40
+ // Clean up legacy plan worktree
41
+ const worktreeService = new WorktreeService();
42
+ if (await worktreeService.worktreeExists()) {
43
+ await worktreeService.removeWorktree();
44
+ logger.success('Plan worktree removed');
45
+ }
46
+ else {
47
+ logger.info('No legacy plan worktree to clean up');
48
+ }
49
+ // Clean up any orphaned hula worktrees
50
+ const repoInfo = await getRepoInfo().catch(() => null);
51
+ const repoRoot = await getRepoRoot();
52
+ const worktreeBasePath = isAbsolute(rawWorktreeBasePath)
53
+ ? rawWorktreeBasePath
54
+ : resolve(repoRoot, rawWorktreeBasePath);
55
+ const genericService = new WorktreeService({ basePath: worktreeBasePath, repoName: repoInfo?.name ?? '' });
56
+ const hulaWorktrees = await genericService.listHulaWorktrees();
57
+ if (hulaWorktrees.length > 0) {
58
+ logger.info(`Found ${hulaWorktrees.length} hula worktree(s) to remove:`);
59
+ for (const wt of hulaWorktrees) {
60
+ try {
61
+ await genericService.removeWorktreeAt(wt);
62
+ logger.success(` Removed: ${wt}`);
63
+ }
64
+ catch (error) {
65
+ logger.warning(` Failed to remove ${wt}: ${error instanceof Error ? error.message : String(error)}`);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ logger.info('No orphaned hula worktrees found');
71
+ }
72
+ }
73
+ catch (error) {
74
+ logger.error('Failed to cleanup worktree:');
75
+ logger.error(error instanceof Error ? error.message : String(error));
76
+ process.exit(1);
77
+ }
78
+ });
79
+ worktree
80
+ .command('status')
81
+ .description('Show worktree status (plan worktree + active hula worktrees)')
82
+ .action(async () => {
83
+ try {
84
+ // Show legacy plan worktree status
85
+ const worktreeService = new WorktreeService();
86
+ if (await worktreeService.worktreeExists()) {
87
+ const path = await worktreeService.getWorktreePath();
88
+ const hasChanges = await worktreeService.hasWorktreeChanges();
89
+ logger.info(`Plan worktree path: ${path}`);
90
+ logger.info(`Has uncommitted changes: ${hasChanges ? 'Yes' : 'No'}`);
91
+ }
92
+ else {
93
+ logger.info('No active plan worktree');
94
+ }
95
+ // Show hula worktrees
96
+ const repoInfo = await getRepoInfo().catch(() => null);
97
+ const repoRoot = await getRepoRoot();
98
+ const worktreeBasePath = isAbsolute(rawWorktreeBasePath)
99
+ ? rawWorktreeBasePath
100
+ : resolve(repoRoot, rawWorktreeBasePath);
101
+ const genericService = new WorktreeService({ basePath: worktreeBasePath, repoName: repoInfo?.name ?? '' });
102
+ const hulaWorktrees = await genericService.listHulaWorktrees();
103
+ if (hulaWorktrees.length > 0) {
104
+ logger.blank();
105
+ logger.info('Active hula worktrees:');
106
+ for (const wt of hulaWorktrees) {
107
+ const hasChanges = await genericService.hasChangesAt(wt);
108
+ logger.listItem(`${wt} (${hasChanges ? 'has changes' : 'clean'})`, 1);
109
+ }
110
+ }
111
+ else {
112
+ logger.info('No active hula worktrees');
113
+ }
114
+ }
115
+ catch (error) {
116
+ logger.error('Failed to get worktree status:');
117
+ logger.error(error instanceof Error ? error.message : String(error));
118
+ process.exit(1);
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Centralized command names configuration
3
+ * All command aliases and names are defined here for easy maintenance
4
+ */
5
+ export declare const COMMAND_NAMES: {
6
+ readonly primary: readonly ["hula", "hub-launch", "hl"];
7
+ readonly subcommands: {
8
+ readonly merge: "merge";
9
+ readonly init: "init";
10
+ readonly launch: "launch";
11
+ readonly execute: "execute";
12
+ readonly logs: "logs";
13
+ };
14
+ };
15
+ export type SubcommandName = keyof typeof COMMAND_NAMES.subcommands;
16
+ //# sourceMappingURL=command-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-names.d.ts","sourceRoot":"","sources":["../../src/config/command-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,aAAa;;;;;;;;;CAYhB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,aAAa,CAAC,WAAW,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Centralized command names configuration
3
+ * All command aliases and names are defined here for easy maintenance
4
+ */
5
+ export const COMMAND_NAMES = {
6
+ // Primary aliases (user-configurable)
7
+ primary: ["hula", "hub-launch", "hl"],
8
+ // Subcommands
9
+ subcommands: {
10
+ merge: "merge",
11
+ init: "init",
12
+ launch: "launch",
13
+ execute: "execute",
14
+ logs: "logs",
15
+ },
16
+ };
17
+ //# sourceMappingURL=command-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-names.js","sourceRoot":"","sources":["../../src/config/command-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,sCAAsC;IACtC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;IAErC,cAAc;IACd,WAAW,EAAE;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;KACb;CACO,CAAC"}