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,140 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { IssueService } from '../services/github/IssueService.js';
3
+ import { TrackingService } from '../services/tracking/TrackingService.js';
4
+ import { TrackingAdapterFactory } from '../services/tracking/TrackingAdapterFactory.js';
5
+ import { getGhUsername, getRepoInfo } from '../utils/github-cli.js';
6
+ import { STATUS } from '../types/common.schema.js';
7
+ import { multiSelect, selectPriority, UserCancelledError, } from '../utils/prompts.js';
8
+ /**
9
+ * Track command - Add existing GitHub issues to tracking
10
+ */
11
+ export function trackCommand(program, config) {
12
+ program
13
+ .command('track [issueNumber]')
14
+ .description('Add existing GitHub issues to tracking')
15
+ .action(async (issueNumber) => {
16
+ try {
17
+ await executeTrack(config, issueNumber);
18
+ }
19
+ catch (error) {
20
+ if (error instanceof UserCancelledError) {
21
+ logger.info('\nCancelled.');
22
+ process.exit(0);
23
+ }
24
+ logger.error('Failed to track issue:');
25
+ logger.error(error instanceof Error ? error.message : String(error));
26
+ process.exit(1);
27
+ }
28
+ });
29
+ }
30
+ async function executeTrack(config, issueNumberArg) {
31
+ logger.section('Add Issues to Tracking');
32
+ // Initialize services
33
+ const issueService = new IssueService();
34
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
35
+ if (issueNumberArg) {
36
+ // Track specific issue
37
+ const issueNumber = parseInt(issueNumberArg, 10);
38
+ if (isNaN(issueNumber)) {
39
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
40
+ }
41
+ await trackSingleIssue(issueService, trackingService, issueNumber, config);
42
+ }
43
+ else {
44
+ // Track user's issues interactively
45
+ await trackUserIssues(issueService, trackingService, config);
46
+ }
47
+ logger.blank();
48
+ logger.success('✨ Issues tracked successfully!');
49
+ logger.blank();
50
+ }
51
+ async function trackSingleIssue(issueService, trackingService, issueNumber, config) {
52
+ // Check if already tracked
53
+ const exists = await trackingService.exists(issueNumber);
54
+ if (exists) {
55
+ logger.warning(`Issue #${issueNumber} is already tracked`);
56
+ return;
57
+ }
58
+ // Get issue details
59
+ logger.info(`Fetching issue #${issueNumber}...`);
60
+ const issue = await issueService.get(issueNumber);
61
+ // Get repository info
62
+ const repo = await getRepoInfo();
63
+ // Select priority
64
+ const priorityLevels = config.priorityLevels ?? [
65
+ { name: 'Critical', emoji: '🔴', color: 'red' },
66
+ { name: 'High', emoji: '🟠', color: 'orange' },
67
+ { name: 'Medium', emoji: '🟡', color: 'yellow' },
68
+ { name: 'Low', emoji: '🟢', color: 'green' },
69
+ { name: 'Minimal', emoji: '⚪', color: 'gray' },
70
+ ];
71
+ const priority = await selectPriority('Select priority for this issue:', priorityLevels);
72
+ // Create tracked issue
73
+ const trackedIssue = {
74
+ name: `${repo.owner}/${repo.name}#${issue.number}`,
75
+ trackingName: issue.title,
76
+ number: issue.number,
77
+ trackingStatus: STATUS.UNASSIGNED,
78
+ priority,
79
+ projectOwner: repo.owner,
80
+ projectName: repo.name,
81
+ createdAt: issue.createdAt,
82
+ updatedAt: issue.updatedAt,
83
+ assignees: issue.assignees,
84
+ };
85
+ await trackingService.add(trackedIssue);
86
+ }
87
+ async function trackUserIssues(issueService, trackingService, _config) {
88
+ // Get current username
89
+ const username = await getGhUsername();
90
+ logger.info(`Fetching your issues...`);
91
+ // Get user's issues
92
+ const userIssues = await issueService.listUserIssues(username);
93
+ if (userIssues.length === 0) {
94
+ logger.info('No open issues found for your account.');
95
+ return;
96
+ }
97
+ // Filter out already tracked issues
98
+ const trackedIssues = await trackingService.getAll();
99
+ const trackedNumbers = new Set(trackedIssues.map((i) => i.number));
100
+ const untrackedIssues = userIssues.filter((i) => !trackedNumbers.has(i.number));
101
+ if (untrackedIssues.length === 0) {
102
+ logger.info('All your issues are already tracked.');
103
+ return;
104
+ }
105
+ logger.success(`Found ${untrackedIssues.length} untracked issue(s)`);
106
+ logger.blank();
107
+ // Show issues and let user select which to track
108
+ const choices = untrackedIssues.map((issue, index) => ({
109
+ name: `${index + 1}. #${issue.number}: ${issue.title}`,
110
+ value: issue.number.toString(),
111
+ }));
112
+ const selectedNumbers = await multiSelect('Select issues to track:', choices);
113
+ if (selectedNumbers.length === 0) {
114
+ logger.info('No issues selected.');
115
+ return;
116
+ }
117
+ // Track selected issues
118
+ const repo = await getRepoInfo();
119
+ for (const numStr of selectedNumbers) {
120
+ const issueNumber = parseInt(numStr, 10);
121
+ const issue = untrackedIssues.find((i) => i.number === issueNumber);
122
+ if (!issue)
123
+ continue;
124
+ const trackedIssue = {
125
+ name: `${repo.owner}/${repo.name}#${issue.number}`,
126
+ trackingName: issue.title,
127
+ number: issue.number,
128
+ trackingStatus: STATUS.UNASSIGNED,
129
+ priority: 'Medium',
130
+ projectOwner: repo.owner,
131
+ projectName: repo.name,
132
+ createdAt: issue.createdAt,
133
+ updatedAt: issue.updatedAt,
134
+ assignees: issue.assignees,
135
+ };
136
+ await trackingService.add(trackedIssue);
137
+ }
138
+ logger.success(`Tracked ${selectedNumbers.length} issue(s)`);
139
+ }
140
+ //# sourceMappingURL=track.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/commands/track.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Command } from 'commander';
2
+ import type { Config } from '../types/index.js';
3
+ /**
4
+ * Upload command - Upload a plan to the target branch using a temporary worktree.
5
+ *
6
+ * Flow:
7
+ * 1. Determine which plan file to upload (latest or user-specified)
8
+ * 2. Read plan file content into memory
9
+ * 3. Create a temporary worktree from origin/main
10
+ * 4. Copy plan file into the worktree at the same relative path
11
+ * 5. Stage + auto-commit the plan file in the worktree
12
+ * 6. Push from the worktree
13
+ * 7. Remove the worktree
14
+ * 8. Plan file remains untouched in the main working tree
15
+ */
16
+ export declare function uploadCommand(program: Command, config: Config): void;
17
+ /**
18
+ * Execute upload command
19
+ */
20
+ export declare function executeUpload(config: Config, planPath?: string): Promise<void>;
21
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAepE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA2Hf"}
@@ -0,0 +1,145 @@
1
+ import { basename, dirname, join, resolve, isAbsolute } from 'path';
2
+ import { readFileSync, writeFileSync, mkdirSync } from 'fs';
3
+ import { PlanService } from '../services/plan/PlanService.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { WorktreeService } from '../services/git/WorktreeService.js';
6
+ import { getRepoInfo } from '../utils/github-cli.js';
7
+ import { getRepoRoot } from '../utils/shell.js';
8
+ /**
9
+ * Upload command - Upload a plan to the target branch using a temporary worktree.
10
+ *
11
+ * Flow:
12
+ * 1. Determine which plan file to upload (latest or user-specified)
13
+ * 2. Read plan file content into memory
14
+ * 3. Create a temporary worktree from origin/main
15
+ * 4. Copy plan file into the worktree at the same relative path
16
+ * 5. Stage + auto-commit the plan file in the worktree
17
+ * 6. Push from the worktree
18
+ * 7. Remove the worktree
19
+ * 8. Plan file remains untouched in the main working tree
20
+ */
21
+ export function uploadCommand(program, config) {
22
+ program
23
+ .command('upload [planPath]', { hidden: true })
24
+ .description('Upload plan to origin (target branch configurable via uploadBranch, default: main)')
25
+ .action(async (planPath) => {
26
+ try {
27
+ await executeUpload(config, planPath);
28
+ }
29
+ catch (error) {
30
+ logger.error('Failed to upload plan:');
31
+ logger.error(error instanceof Error ? error.message : String(error));
32
+ process.exit(1);
33
+ }
34
+ });
35
+ }
36
+ /**
37
+ * Execute upload command
38
+ */
39
+ export async function executeUpload(config, planPath) {
40
+ const planService = new PlanService(config.planPath);
41
+ const targetBranch = config.uploadBranch ?? 'main';
42
+ const rawBasePath = config.worktreeBasePath ?? '.hula-worktrees';
43
+ const repoRoot = await getRepoRoot();
44
+ const worktreeBasePath = isAbsolute(rawBasePath) ? rawBasePath : resolve(repoRoot, rawBasePath);
45
+ // Validate targetBranch to prevent command injection in git push refspec
46
+ if (targetBranch.includes(';') ||
47
+ targetBranch.includes('|') ||
48
+ targetBranch.includes('&') ||
49
+ targetBranch.includes('$') ||
50
+ targetBranch.includes('`') ||
51
+ targetBranch.includes('\\') ||
52
+ targetBranch.includes('\n') ||
53
+ targetBranch.includes('\r') ||
54
+ targetBranch.includes('\0') ||
55
+ targetBranch.trim() === '') {
56
+ logger.error(`Invalid uploadBranch value in config: "${targetBranch}"`);
57
+ process.exit(1);
58
+ }
59
+ // Step 1: Determine which plan to upload
60
+ let targetPlan = null;
61
+ if (planPath) {
62
+ targetPlan = { path: planPath, name: basename(planPath, '.md') };
63
+ }
64
+ else {
65
+ const latestPlan = await planService.getLatestPlan();
66
+ if (latestPlan) {
67
+ targetPlan = {
68
+ path: latestPlan.path,
69
+ name: latestPlan.filename.replace('.md', ''),
70
+ };
71
+ }
72
+ }
73
+ if (!targetPlan) {
74
+ logger.error('No plan found to upload');
75
+ logger.info('Run /hula-plan first to create a plan, or specify a path.');
76
+ process.exit(1);
77
+ }
78
+ logger.section('Upload Plan');
79
+ logger.info(`Plan: ${targetPlan.path}`);
80
+ logger.info(`Target branch: ${targetBranch}`);
81
+ // Step 2: Read plan file content into memory
82
+ const relativePath = planService.getRelativePath(targetPlan.path);
83
+ const planContent = readFileSync(targetPlan.path, 'utf-8');
84
+ logger.debug('Plan file content read into memory');
85
+ // Step 3: Get repo info and create worktree service
86
+ const repoInfo = await getRepoInfo();
87
+ const worktreeService = new WorktreeService({
88
+ basePath: worktreeBasePath,
89
+ repoName: repoInfo.name,
90
+ });
91
+ // Use a timestamp-based identifier to avoid collisions between concurrent uploads
92
+ const identifier = `${Date.now()}`;
93
+ const worktreePath = worktreeService.getWorktreeDir('upload', identifier);
94
+ logger.info('Creating temporary upload worktree...');
95
+ let worktreeCreated = false;
96
+ try {
97
+ // Step 4: Create a temporary worktree off origin/main (detached HEAD)
98
+ await worktreeService.createWorktreeAt(worktreePath, `origin/${targetBranch}`, true);
99
+ worktreeCreated = true;
100
+ // Step 5: Copy plan file into the worktree at the same relative path
101
+ logger.info('Writing plan file to upload worktree...');
102
+ const worktreePlanPath = join(worktreePath, relativePath);
103
+ mkdirSync(dirname(worktreePlanPath), { recursive: true });
104
+ writeFileSync(worktreePlanPath, planContent, 'utf-8');
105
+ // Step 6: Stage and commit in the worktree
106
+ logger.info('Committing plan file in upload worktree...');
107
+ const hasChanges = await worktreeService.hasChangesAt(worktreePath);
108
+ if (hasChanges) {
109
+ await worktreeService.commitChangesAt(worktreePath, 'chore: upload plan via hula');
110
+ }
111
+ else {
112
+ logger.info('Plan already up-to-date, proceeding to push...');
113
+ }
114
+ // Step 7: Push from worktree
115
+ const spinner = logger.spinner(`Pushing to origin/${targetBranch}...`);
116
+ try {
117
+ // For a detached HEAD worktree we push HEAD directly to the target branch
118
+ await worktreeService.pushAt(worktreePath, `HEAD:${targetBranch}`);
119
+ spinner.stop();
120
+ logger.success(`Plan uploaded to origin/${targetBranch}`);
121
+ }
122
+ catch (error) {
123
+ spinner.stop();
124
+ throw error;
125
+ }
126
+ }
127
+ finally {
128
+ // Step 8: Always remove the temporary worktree
129
+ if (worktreeCreated) {
130
+ logger.info('Cleaning up upload worktree...');
131
+ try {
132
+ await worktreeService.removeWorktreeAt(worktreePath);
133
+ logger.debug('Upload worktree removed');
134
+ }
135
+ catch (error) {
136
+ logger.warning(`Failed to remove upload worktree at ${worktreePath}: ${error instanceof Error ? error.message : String(error)}`);
137
+ logger.info(`You can manually remove it with: git worktree remove "${worktreePath}" --force`);
138
+ }
139
+ }
140
+ }
141
+ // Plan file remains untouched in the main working tree
142
+ // Note: the file will be cleaned up later by launch/create after success
143
+ logger.debug('Plan file preserved in main working tree');
144
+ }
145
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.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
+ * View command - View tracked issues with status and plan files
5
+ */
6
+ export declare function viewCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAA+B,MAAM,mBAAmB,CAAC;AAG7E;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAelE"}
@@ -0,0 +1,168 @@
1
+ import { logger } from '../utils/logger.js';
2
+ import { TrackingService } from '../services/tracking/TrackingService.js';
3
+ import { TrackingAdapterFactory } from '../services/tracking/TrackingAdapterFactory.js';
4
+ import { STATUS } from '../types/common.schema.js';
5
+ /**
6
+ * View command - View tracked issues with status and plan files
7
+ */
8
+ export function viewCommand(program, config) {
9
+ program
10
+ .command('view')
11
+ .description('View tracked issues with status and plan files')
12
+ .option('--status <status>', 'Filter by status')
13
+ .option('--priority <priority>', 'Filter by priority')
14
+ .action(async (options) => {
15
+ try {
16
+ await executeView(config, options);
17
+ }
18
+ catch (error) {
19
+ logger.error('Failed to view issues:');
20
+ logger.error(error instanceof Error ? error.message : String(error));
21
+ process.exit(1);
22
+ }
23
+ });
24
+ }
25
+ async function executeView(config, options) {
26
+ logger.section('Tracked Issues');
27
+ // Initialize tracking service
28
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
29
+ // Get all tracked issues
30
+ let issues = await trackingService.getAll();
31
+ if (issues.length === 0) {
32
+ logger.info('No tracked issues found.');
33
+ logger.blank();
34
+ logger.info("Use 'hublaunch track' to add issues to tracking.");
35
+ logger.blank();
36
+ return;
37
+ }
38
+ // Apply filters
39
+ if (options.status) {
40
+ issues = issues.filter((i) => i.trackingStatus === options.status);
41
+ }
42
+ if (options.priority) {
43
+ issues = issues.filter((i) => i.priority === options.priority);
44
+ }
45
+ // Sort issues based on config
46
+ const sortConfig = config.issueSortOrder ?? {
47
+ sortBy: 'created',
48
+ direction: 'desc',
49
+ groupBy: 'priority',
50
+ };
51
+ issues = trackingService.sortIssues(issues, sortConfig.sortBy, sortConfig.direction);
52
+ // Group by priority or status if configured
53
+ if (sortConfig.groupBy === 'priority') {
54
+ displayGroupedByPriority(issues, config);
55
+ }
56
+ else if (sortConfig.groupBy === 'status') {
57
+ displayGroupedByStatus(issues);
58
+ }
59
+ else {
60
+ displayIssuesList(issues);
61
+ }
62
+ // Display standalone jobs (those without a GitHub issue number)
63
+ // Standalone-task UI was removed when the local schema dropped the
64
+ // job* fields (see CHANGELOG: Plan/Project/Task rename).
65
+ logger.blank();
66
+ logger.info(`Total: ${issues.length} plan(s)`);
67
+ logger.blank();
68
+ }
69
+ function displayGroupedByPriority(issues, config) {
70
+ const priorityLevels = config.priorityLevels ?? [
71
+ { name: 'Critical', emoji: '🔴', color: 'red' },
72
+ { name: 'High', emoji: '🟠', color: 'orange' },
73
+ { name: 'Medium', emoji: '🟡', color: 'yellow' },
74
+ { name: 'Low', emoji: '🟢', color: 'green' },
75
+ { name: 'Minimal', emoji: '⚪', color: 'gray' },
76
+ ];
77
+ for (const level of priorityLevels) {
78
+ const priorityIssues = issues.filter((i) => i.priority === level.name);
79
+ if (priorityIssues.length === 0)
80
+ continue;
81
+ logger.blank();
82
+ logger.priority(level.name, level.emoji, `${level.name} Priority (${priorityIssues.length})`);
83
+ logger.blank();
84
+ for (const issue of priorityIssues) {
85
+ displayIssue(issue);
86
+ }
87
+ }
88
+ }
89
+ function displayGroupedByStatus(issues) {
90
+ const statuses = [
91
+ STATUS.UNASSIGNED,
92
+ STATUS.INITIAL_WAITING,
93
+ STATUS.WAITING,
94
+ STATUS.READY,
95
+ ];
96
+ for (const status of statuses) {
97
+ const statusIssues = issues.filter((i) => i.trackingStatus === status);
98
+ if (statusIssues.length === 0)
99
+ continue;
100
+ logger.blank();
101
+ logger.issue(status, `${status.toUpperCase()} (${statusIssues.length})`);
102
+ logger.blank();
103
+ for (const issue of statusIssues) {
104
+ displayIssue(issue);
105
+ }
106
+ }
107
+ }
108
+ function displayIssuesList(issues) {
109
+ logger.blank();
110
+ for (const issue of issues) {
111
+ displayIssue(issue);
112
+ }
113
+ }
114
+ /**
115
+ * Display standalone jobs (ralph-run jobs without a GitHub issue)
116
+ * @deprecated removed with the Plan/Project/Task rename; the server no
117
+ * longer surfaces per-task status to the list endpoint, and the local
118
+ * schema dropped the `job*` fields. Kept as a stub to avoid widening
119
+ * this diff; can be deleted in a follow-up.
120
+ */
121
+ function displayStandaloneJobs(_jobs) {
122
+ // intentionally empty
123
+ }
124
+ void displayStandaloneJobs;
125
+ function displayIssue(issue) {
126
+ const issueNumber = issue.number ? `#${issue.number} ` : '';
127
+ logger.log(` ${issueNumber}${issue.name}`);
128
+ logger.log(` Status: ${issue.trackingStatus} | Priority: ${issue.priority}`);
129
+ if (issue.assignees && issue.assignees.length > 0) {
130
+ logger.log(` Assignees: ${issue.assignees.join(', ')}`);
131
+ }
132
+ if (issue.prNumber) {
133
+ logger.log(` PR: #${issue.prNumber}`);
134
+ }
135
+ if (issue.planPath) {
136
+ logger.log(` Plan: ${issue.planPath}`);
137
+ }
138
+ logger.blank();
139
+ }
140
+ /**
141
+ * Format job status as an emoji indicator
142
+ * @deprecated stub kept after the Plan/Project/Task rename dropped
143
+ * `job*` fields. Will be removed in a follow-up.
144
+ */
145
+ function formatJobIndicator(_status) {
146
+ return '';
147
+ }
148
+ void formatJobIndicator;
149
+ /**
150
+ * Format ISO datetime to a shorter display (currently unused; kept
151
+ * as a small helper for future re-introduction of formatted display).
152
+ */
153
+ function _formatTime(isoString) {
154
+ try {
155
+ const date = new Date(isoString);
156
+ return date.toLocaleString('en-US', {
157
+ month: 'short',
158
+ day: 'numeric',
159
+ hour: '2-digit',
160
+ minute: '2-digit',
161
+ });
162
+ }
163
+ catch {
164
+ return isoString;
165
+ }
166
+ }
167
+ void _formatTime;
168
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.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
+ * Watch command - Monitor PR for Copilot completion and test results
5
+ */
6
+ export declare function watchCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAMhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BnE"}