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,367 @@
1
+ import { dirname } from 'path';
2
+ import { logger } from '../utils/logger.js';
3
+ import { IssueService } from '../services/github/IssueService.js';
4
+ import { CopilotService } from '../services/github/CopilotService.js';
5
+ import { ProjectService } from '../services/github/ProjectService.js';
6
+ import { AssetUploadService } from '../services/github/AssetUploadService.js';
7
+ import { PlanService } from '../services/plan/PlanService.js';
8
+ import { TrackingService } from '../services/tracking/TrackingService.js';
9
+ import { TrackingAdapterFactory } from '../services/tracking/TrackingAdapterFactory.js';
10
+ import { GitService } from '../services/git/GitService.js';
11
+ import { executeUpload } from './upload.js';
12
+ import { STATUS } from '../types/common.schema.js';
13
+ import { confirm, multiSelect, input, selectPriority, UserCancelledError, } from '../utils/prompts.js';
14
+ import { getRepoInfo } from '../utils/github-cli.js';
15
+ import { ConflictError } from '../services/api/HulaApiClient.js';
16
+ /**
17
+ * Create command - Create GitHub issue from plan file
18
+ */
19
+ export function createCommand(program, config) {
20
+ program
21
+ .command('create [assignee]')
22
+ .description('Create GitHub issue from plan file')
23
+ .option('--plan <file>', 'Specific plan file to use')
24
+ .option('--name <name>', 'Local tracking name for the issue')
25
+ .option('--handoff <username>', 'Team member to hand off to')
26
+ .option('--priority <level>', 'Priority level (Critical, High, Medium, Low, Minimal)')
27
+ .option('--no-copilot', 'Skip Copilot assignment')
28
+ .option('--no-track', "Don't add to tracking")
29
+ .option('--attach <files...>', 'Image files to attach to the issue (png, jpg, gif, webp)')
30
+ .action(async (assignee, options) => {
31
+ try {
32
+ await executeCreate(config, assignee, options);
33
+ }
34
+ catch (error) {
35
+ if (error instanceof UserCancelledError) {
36
+ logger.info('\nCancelled.');
37
+ process.exit(0);
38
+ }
39
+ logger.error('Failed to create issue:');
40
+ logger.error(error instanceof Error ? error.message : String(error));
41
+ process.exit(1);
42
+ }
43
+ });
44
+ }
45
+ async function executeCreate(config, assigneeArg, options) {
46
+ logger.section('Create GitHub Issue from Plan');
47
+ // Initialize services
48
+ const issueService = new IssueService();
49
+ const copilotService = new CopilotService(config);
50
+ const planService = new PlanService(config.planPath);
51
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
52
+ // Select plan file
53
+ logger.info('Selecting plan file...');
54
+ let planFile;
55
+ if (options.plan) {
56
+ planFile = await planService.getPlanByFilename(options.plan);
57
+ if (!planFile) {
58
+ throw new Error(`Plan file not found: ${options.plan}\n` +
59
+ `Searched in: ${config.planPath}\n` +
60
+ `Also checked direct path.\n` +
61
+ `Make sure you created the plan with /hula-plan first.`);
62
+ }
63
+ }
64
+ else {
65
+ planFile = await planService.selectPlan(config.createIssuesPreference, config.planChoices);
66
+ }
67
+ logger.success(`Selected: ${planFile.filename}`);
68
+ // Parse plan
69
+ const plan = await planService.parsePlan(planFile.path);
70
+ // --- Attachment Processing ---
71
+ // Must happen BEFORE the plan sync to origin/main so the synced version
72
+ // contains GitHub URLs instead of broken local paths.
73
+ const assetUploadService = new AssetUploadService();
74
+ let processedBody = plan.body;
75
+ // 1. Auto-detect and resolve local image references in the plan body
76
+ const planDir = dirname(planFile.path);
77
+ processedBody = await assetUploadService.resolveLocalImages(processedBody, planDir);
78
+ // 2. Upload explicit --attach files and append to body
79
+ if (options.attach && options.attach.length > 0) {
80
+ logger.blank();
81
+ logger.section('Uploading Attachments');
82
+ // Validate all files first (fail fast)
83
+ const validatedPaths = [];
84
+ for (const filePath of options.attach) {
85
+ const resolved = assetUploadService.validateImageFile(filePath);
86
+ validatedPaths.push(resolved);
87
+ }
88
+ // Upload all validated files
89
+ const uploaded = await assetUploadService.uploadImages(validatedPaths);
90
+ // Append attachments section to body
91
+ if (uploaded.length > 0) {
92
+ const attachmentLines = uploaded.map((a) => a.markdown).join('\n');
93
+ processedBody += '\n\n## Attachments\n\n' + attachmentLines;
94
+ logger.success(`${uploaded.length} attachment(s) uploaded`);
95
+ }
96
+ }
97
+ // 3. If any images were resolved in the plan body, write the updated plan
98
+ // back to disk so the plan sync to origin/main below includes the
99
+ // GitHub URLs.
100
+ if (processedBody !== plan.body) {
101
+ const { writeFileSync } = await import('fs');
102
+ const fileContent = processedBody.startsWith('# ')
103
+ ? processedBody
104
+ : `# ${plan.title}\n\n${processedBody}`;
105
+ writeFileSync(planFile.path, fileContent, 'utf-8');
106
+ logger.debug('Updated plan file with resolved image URLs');
107
+ }
108
+ // Check if plan needs to be synced to origin/main (like launch does)
109
+ const planSyncStatus = await checkPlanSyncStatus(config, planFile.path);
110
+ if (!planSyncStatus.synced) {
111
+ if (planSyncStatus.location === 'not-found') {
112
+ // Plan file exists locally (we just read it) but not tracked in git
113
+ // This is fine for create - we just need the content to create the issue
114
+ logger.debug('Plan not found on origin/main, but available locally');
115
+ }
116
+ else if (planSyncStatus.location === 'local-main') {
117
+ // Auto-upload the plan so it's available on origin/main
118
+ logger.info('Plan not yet on origin/main, uploading...');
119
+ try {
120
+ await executeUpload(config, planFile.path);
121
+ logger.success('Plan synced to origin/main');
122
+ logger.blank();
123
+ }
124
+ catch (uploadError) {
125
+ // Upload failure is non-fatal for create - we can still create the issue
126
+ // from the local plan content
127
+ logger.warning('Could not upload plan to origin/main (continuing with local plan)');
128
+ logger.debug(uploadError instanceof Error
129
+ ? uploadError.message
130
+ : String(uploadError));
131
+ }
132
+ }
133
+ }
134
+ // Determine if running in non-interactive mode
135
+ const isNonInteractive = options.name !== undefined;
136
+ // Prompt for issue name/reference (or use provided --name)
137
+ logger.blank();
138
+ const issueName = isNonInteractive
139
+ ? options.name
140
+ : await input("Enter a short name to reference this issue (e.g., 'feature-x' or 'bug-fix-y'):");
141
+ if (!issueName || issueName.trim() === '') {
142
+ throw new Error('Issue name cannot be empty');
143
+ }
144
+ // Select priority (or use provided --priority)
145
+ logger.blank();
146
+ const priorityLevels = config.priorityLevels ?? [
147
+ { name: 'Critical', emoji: '🔴', color: 'red' },
148
+ { name: 'High', emoji: '🟠', color: 'orange' },
149
+ { name: 'Medium', emoji: '🟡', color: 'yellow' },
150
+ { name: 'Low', emoji: '🟢', color: 'green' },
151
+ { name: 'Minimal', emoji: '⚪', color: 'gray' },
152
+ ];
153
+ let priority;
154
+ if (isNonInteractive && options.priority) {
155
+ // Validate priority
156
+ const providedPriority = options.priority.toLowerCase();
157
+ const matchedPriority = priorityLevels.find((p) => p.name.toLowerCase() === providedPriority);
158
+ if (!matchedPriority) {
159
+ throw new Error(`Invalid priority: ${options.priority}. Valid options: ${priorityLevels
160
+ .map((p) => p.name)
161
+ .join(', ')}`);
162
+ }
163
+ priority = matchedPriority.name;
164
+ logger.info(`Using priority: ${matchedPriority.emoji} ${priority}`);
165
+ }
166
+ else if (isNonInteractive) {
167
+ // Default to Medium for non-interactive mode
168
+ priority = 'Medium';
169
+ logger.info(`Using default priority: 🟡 ${priority}`);
170
+ }
171
+ else {
172
+ logger.section('Set Issue Priority');
173
+ priority = await selectPriority('Select priority for this issue:', priorityLevels);
174
+ logger.success(`Selected priority: ${priorityLevels.find((p) => p.name === priority)?.emoji} ${priority}`);
175
+ }
176
+ // Select team members if configured
177
+ // Note: "handoff" is the conceptual term used - it represents assigning someone for follow-up
178
+ // Copilot is always assigned automatically
179
+ let assignees = [];
180
+ if (options.handoff) {
181
+ // Non-interactive mode with --handoff flag
182
+ assignees = [options.handoff];
183
+ logger.info(`Handing off to: ${options.handoff}`);
184
+ }
185
+ else if (assigneeArg) {
186
+ assignees = [assigneeArg];
187
+ }
188
+ else if (!isNonInteractive &&
189
+ config.teamMembers &&
190
+ config.teamMembers.length > 0) {
191
+ const shouldAssign = await confirm('Do you want to assign team members?', false);
192
+ if (shouldAssign) {
193
+ assignees = await multiSelect('Select team members to assign:', config.teamMembers);
194
+ }
195
+ }
196
+ // Create issue
197
+ logger.info('Creating GitHub issue...');
198
+ const issue = await issueService.create({
199
+ title: plan.title,
200
+ body: processedBody,
201
+ assignees,
202
+ });
203
+ logger.success(`Created issue #${issue.number}: ${issue.title}`);
204
+ logger.info(`URL: ${issue.url}`);
205
+ // Update issue body to include self-reference for Copilot PR linking
206
+ logger.blank();
207
+ logger.info('Updating issue with reference for Copilot...');
208
+ try {
209
+ const updatedBody = `Fixes #${issue.number}\n\n${issue.body}`;
210
+ await issueService.updateBody(issue.number, updatedBody);
211
+ logger.success('Added issue reference for Copilot linking');
212
+ }
213
+ catch (error) {
214
+ logger.warning('Could not update issue body with reference');
215
+ logger.debug(error instanceof Error ? error.message : String(error));
216
+ }
217
+ // Assign Copilot if requested
218
+ let copilotAssignedResult = false;
219
+ if (options.copilot) {
220
+ logger.blank();
221
+ logger.info('Assigning GitHub Copilot...');
222
+ // Wait for GitHub to propagate the newly created issue
223
+ // This prevents 404 errors when the browser tries to load the issue immediately
224
+ logger.info('Waiting for GitHub to propagate the issue...');
225
+ await new Promise((resolve) => setTimeout(resolve, 20000)); // Wait 20 seconds for GitHub propagation
226
+ try {
227
+ copilotAssignedResult = await copilotService.assignToIssue(issue.number);
228
+ if (copilotAssignedResult) {
229
+ logger.success('GitHub Copilot assigned successfully');
230
+ }
231
+ else {
232
+ logger.warning('Could not assign GitHub Copilot automatically');
233
+ logger.info('You may need to assign Copilot manually in the GitHub UI');
234
+ // Check for debug screenshot
235
+ const { tmpdir } = await import('os');
236
+ const { join } = await import('path');
237
+ const { existsSync } = await import('fs');
238
+ const debugPath = join(tmpdir(), 'github-copilot-not-found.png');
239
+ if (existsSync(debugPath)) {
240
+ logger.info(`📸 Debug screenshot saved to: ${debugPath}`);
241
+ }
242
+ }
243
+ }
244
+ catch (error) {
245
+ logger.error(`Failed to assign Copilot: ${error instanceof Error ? error.message : String(error)}`);
246
+ // Check for debug screenshot on error
247
+ try {
248
+ const { tmpdir } = await import('os');
249
+ const { join } = await import('path');
250
+ const { existsSync } = await import('fs');
251
+ const debugPath = join(tmpdir(), 'github-copilot-not-found.png');
252
+ if (existsSync(debugPath)) {
253
+ logger.info(`📸 Debug screenshot saved to: ${debugPath}`);
254
+ }
255
+ }
256
+ catch {
257
+ // Ignore errors checking for screenshot
258
+ }
259
+ }
260
+ }
261
+ // Add to tracking if requested
262
+ if (options.track) {
263
+ logger.blank();
264
+ logger.info('Adding to tracking...');
265
+ // Get repo info for remote tracking (owner/repo#number format)
266
+ const repo = await getRepoInfo();
267
+ const internalName = `${repo.owner}/${repo.name}#${issue.number}`;
268
+ // Convert to repo-relative path (server expects e.g. .hublaunch/plans/foo.md)
269
+ const relPlanPath = planService.getRelativePath(planFile.path);
270
+ const trackedIssue = {
271
+ name: internalName,
272
+ trackingName: issueName, // User's custom name
273
+ number: issue.number,
274
+ title: issue.title,
275
+ planPath: relPlanPath,
276
+ copilotAssigned: options.copilot ? copilotAssignedResult : false,
277
+ trackingStatus: STATUS.UNASSIGNED,
278
+ priority: priority,
279
+ createdAt: issue.createdAt,
280
+ updatedAt: issue.updatedAt,
281
+ assignees: issue.assignees,
282
+ };
283
+ try {
284
+ await trackingService.add(trackedIssue);
285
+ }
286
+ catch (addError) {
287
+ if (addError instanceof ConflictError) {
288
+ logger.warning('Plan already registered on tracking server (continuing...)');
289
+ logger.debug(addError instanceof Error ? addError.message : String(addError));
290
+ }
291
+ else {
292
+ throw addError;
293
+ }
294
+ }
295
+ // Manual project sync only if auto-sync is disabled
296
+ // (If auto-sync is enabled, TrackingService.add() already handled it)
297
+ if (config.projectNumber && config.projectId && !config.projectAutoSync) {
298
+ logger.blank();
299
+ logger.info('Adding to GitHub Projects...');
300
+ const projectService = new ProjectService();
301
+ try {
302
+ const repo = await getRepoInfo();
303
+ // Add issue to project
304
+ await projectService.addIssueToProject(issue.number, config.projectNumber);
305
+ // Wait a moment for GitHub to process the addition
306
+ await new Promise((resolve) => setTimeout(resolve, 1000));
307
+ // Find the project item ID
308
+ const itemId = await projectService.findProjectItem(repo.owner, config.projectNumber, issue.number);
309
+ if (!itemId) {
310
+ throw new Error('Could not find project item after adding to project');
311
+ }
312
+ // Determine initial status based on whether Copilot was assigned
313
+ const initialStatus = options.copilot
314
+ ? STATUS.INITIAL_WAITING
315
+ : STATUS.UNASSIGNED;
316
+ // Update tracking status field
317
+ await projectService.updateIssueStatus(itemId, initialStatus, config.projectId, repo.owner, config.projectNumber);
318
+ // Update priority field (use the selected priority)
319
+ await projectService.updateIssuePriority(itemId, priority, config.projectId, repo.owner, config.projectNumber);
320
+ logger.success(`Added to project with status: ${initialStatus}, priority: ${priority}`);
321
+ }
322
+ catch (error) {
323
+ logger.warning('Could not add to project (continuing...)');
324
+ logger.debug(error instanceof Error ? error.message : String(error));
325
+ }
326
+ }
327
+ }
328
+ logger.blank();
329
+ logger.success('✨ Issue created successfully!');
330
+ logger.info(`URL: ${issue.url}`);
331
+ logger.blank();
332
+ logger.info('You can go to https://www.hublaunch.site/dashboard to see a summary of your active plans.');
333
+ if (!config.updateNotificationUrl && !process.env.HULA_UPDATE_NOTIFICATION_URL) {
334
+ logger.info('Set updateNotificationUrl in your local hublaunch.config.js file to be able to get update messages about the status.');
335
+ }
336
+ // Clean up local plan file — it's now on origin/main and submitted as issue
337
+ planService.deletePlan(planFile.path);
338
+ }
339
+ /**
340
+ * Check if plan is synced to origin/main
341
+ * Reused logic from launch command to ensure consistency
342
+ */
343
+ async function checkPlanSyncStatus(config, planPath) {
344
+ const gitService = new GitService();
345
+ const planService = new PlanService(config.planPath);
346
+ try {
347
+ // Fetch latest from origin
348
+ await gitService.fetch('origin', 'main');
349
+ }
350
+ catch {
351
+ // If fetch fails (e.g., no network), continue with local checks
352
+ logger.debug('Could not fetch from origin, checking local state only');
353
+ }
354
+ // Check if plan exists on origin/main
355
+ const relativePath = planService.getRelativePath(planPath);
356
+ const onOrigin = await gitService.fileExistsOnRef('origin/main', relativePath);
357
+ if (onOrigin) {
358
+ return { synced: true, location: 'origin-main' };
359
+ }
360
+ // Check local main
361
+ const onLocalMain = await gitService.fileExistsOnRef('main', relativePath);
362
+ if (onLocalMain) {
363
+ return { synced: false, location: 'local-main' };
364
+ }
365
+ return { synced: false, location: 'not-found' };
366
+ }
367
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.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
+ * Diff command - View PR code changes with clickable file links
5
+ */
6
+ export declare function diffCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBlE"}
@@ -0,0 +1,98 @@
1
+ import { writeFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { tmpdir } from "os";
4
+ import { logger } from "../utils/logger.js";
5
+ import { PRService } from "../services/github/PRService.js";
6
+ import { DiffService } from "../services/diff/DiffService.js";
7
+ import { EditorService } from "../services/editor/EditorService.js";
8
+ import { TrackingService } from "../services/tracking/TrackingService.js";
9
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
10
+ import { searchSelect, UserCancelledError } from "../utils/prompts.js";
11
+ /**
12
+ * Diff command - View PR code changes with clickable file links
13
+ */
14
+ export function diffCommand(program, config) {
15
+ program
16
+ .command("diff [issueNumber]")
17
+ .description("View PR code changes with clickable file links")
18
+ .option("--editor <editor>", "Editor to use (vscode or cursor)", "vscode")
19
+ .action(async (issueNumber, options) => {
20
+ try {
21
+ await executeDiff(config, issueNumber, options);
22
+ }
23
+ catch (error) {
24
+ if (error instanceof UserCancelledError) {
25
+ logger.info('\nCancelled.');
26
+ process.exit(0);
27
+ }
28
+ logger.error("Failed to generate diff:");
29
+ logger.error(error instanceof Error ? error.message : String(error));
30
+ process.exit(1);
31
+ }
32
+ });
33
+ }
34
+ async function executeDiff(config, issueNumberArg, options) {
35
+ logger.section("View PR Diff");
36
+ // Initialize services
37
+ const prService = new PRService();
38
+ const diffService = new DiffService();
39
+ const editorService = new EditorService(config.editorCommand);
40
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
41
+ // Get issue number
42
+ let issueNumber;
43
+ if (issueNumberArg) {
44
+ issueNumber = parseInt(issueNumberArg, 10);
45
+ if (isNaN(issueNumber)) {
46
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
47
+ }
48
+ }
49
+ else {
50
+ // Show tracked issues and let user select
51
+ const trackedIssues = await trackingService.getAll();
52
+ if (trackedIssues.length === 0) {
53
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
54
+ }
55
+ const choices = trackedIssues
56
+ .filter((issue) => issue.number !== undefined)
57
+ .map((issue) => ({
58
+ name: `#${issue.number} - ${issue.name}`,
59
+ value: issue.number.toString(),
60
+ }));
61
+ const selected = await searchSelect("Select issue to view diff:", choices);
62
+ issueNumber = parseInt(selected, 10);
63
+ }
64
+ // Get PR for issue
65
+ logger.info(`Fetching PR for issue #${issueNumber}...`);
66
+ const pr = await prService.getByIssue(issueNumber);
67
+ if (!pr) {
68
+ throw new Error(`No PR found for issue #${issueNumber}`);
69
+ }
70
+ logger.info(`Found PR #${pr.number}: ${pr.title}`);
71
+ logger.blank();
72
+ // Get diff and files
73
+ logger.info("Fetching diff content...");
74
+ const [diff, files] = await Promise.all([
75
+ diffService.getDiff(pr.number),
76
+ diffService.getFiles(pr.number),
77
+ ]);
78
+ logger.info(`Found ${files.length} changed files`);
79
+ logger.blank();
80
+ // Format diff with links
81
+ logger.info("Generating formatted diff...");
82
+ const editor = options.editor === "cursor" ? "cursor" : "vscode";
83
+ const formattedDiff = await diffService.formatDiffWithLinks(pr.number, diff, files, editor);
84
+ // Save to temp file
85
+ const tempFile = join(tmpdir(), `hublaunch-diff-pr${pr.number}-issue${issueNumber}.md`);
86
+ await writeFile(tempFile, formattedDiff);
87
+ logger.success(`Diff saved to: ${tempFile}`);
88
+ // Open in editor in preview mode
89
+ try {
90
+ await editorService.openFileInPreview(tempFile);
91
+ }
92
+ catch (error) {
93
+ logger.warning(`Could not open in editor: ${error instanceof Error ? error.message : String(error)}`);
94
+ logger.info(`You can manually open: ${tempFile}`);
95
+ }
96
+ logger.success("✨ Diff generated successfully!");
97
+ }
98
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.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
+ * Execute command — trigger or manage execute-action runs on hula-project server
5
+ */
6
+ export declare function executeCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqDhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8DrE"}