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,12 @@
1
+ /**
2
+ * Application constants
3
+ */
4
+ /**
5
+ * Hula Project API URL
6
+ */
7
+ export declare const HULA_PROJECT_URL: string;
8
+ /**
9
+ * GitHub App Client ID for OAuth Device Flow
10
+ */
11
+ export declare const GITHUB_APP_CLIENT_ID: string;
12
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB,QACiC,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAC2B,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Application constants
3
+ */
4
+ /**
5
+ * Hula Project API URL
6
+ */
7
+ export const HULA_PROJECT_URL = process.env.HULA_PROJECT_URL ?? 'https://www.hublaunch.site';
8
+ /**
9
+ * GitHub App Client ID for OAuth Device Flow
10
+ */
11
+ export const GITHUB_APP_CLIENT_ID = process.env.GITHUB_APP_CLIENT_ID ?? 'Iv23liHqNAAjK1pT0ly2';
12
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,4BAA4B,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,sBAAsB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type Config } from '../types/config.schema.js';
2
+ /**
3
+ * Configuration loader with TypeScript config file support
4
+ * Loads and validates .hublaunch/hublaunch.config.ts or uses defaults
5
+ */
6
+ export declare class ConfigLoader {
7
+ private projectRoot;
8
+ private configPath;
9
+ private config;
10
+ constructor(projectRoot?: string);
11
+ /**
12
+ * Load configuration from file or use defaults
13
+ */
14
+ load(): Promise<Config>;
15
+ /**
16
+ * One-shot per-process migration: rename legacy
17
+ * `.hublaunch/trackedIssues.json` → `.hublaunch/trackedPlans.json` and
18
+ * transform contents to the new schema. Errors are warned, not fatal.
19
+ */
20
+ private migrationDone;
21
+ private runLocalFileMigration;
22
+ /**
23
+ * Apply defaults for optional fields
24
+ */
25
+ private applyDefaults;
26
+ /**
27
+ * Resolve relative paths to absolute paths based on project root
28
+ */
29
+ private resolvePaths;
30
+ /**
31
+ * Get current config (loads if not already loaded)
32
+ */
33
+ get(): Promise<Config>;
34
+ /**
35
+ * Reload configuration from file
36
+ */
37
+ reload(): Promise<Config>;
38
+ }
39
+ /**
40
+ * Get or create ConfigLoader instance
41
+ */
42
+ export declare function getConfigLoader(projectRoot?: string): ConfigLoader;
43
+ /**
44
+ * Load configuration
45
+ */
46
+ export declare function loadConfig(projectRoot?: string): Promise<Config>;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAInC;;;GAGG;AAEH,qBAAa,YAAY;IAIX,OAAO,CAAC,WAAW;IAH/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAuB;gBAEjB,WAAW,GAAE,MAAsB;IAiBvD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IA8E7B;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAS;YAChB,qBAAqB;IAcnC;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;CAIhC;AAKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAKlE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtE"}
@@ -0,0 +1,175 @@
1
+ import { existsSync } from 'fs';
2
+ import { join, resolve, isAbsolute, normalize } from 'path';
3
+ import { pathToFileURL } from 'url';
4
+ import { config as dotenvConfig } from 'dotenv';
5
+ import { ConfigSchema, DEFAULT_CONFIG, } from '../types/config.schema.js';
6
+ import { DEFAULT_PRIORITY_LEVELS } from '../types/common.schema.js';
7
+ import { migrateLocalTrackingFile } from '../services/tracking/local-file-migration.js';
8
+ /**
9
+ * Configuration loader with TypeScript config file support
10
+ * Loads and validates .hublaunch/hublaunch.config.ts or uses defaults
11
+ */
12
+ export class ConfigLoader {
13
+ projectRoot;
14
+ configPath;
15
+ config = null;
16
+ constructor(projectRoot = process.cwd()) {
17
+ this.projectRoot = projectRoot;
18
+ // Check for .ts file first, then .js/.mjs file
19
+ const configPathTs = join(projectRoot, '.hublaunch', 'hublaunch.config.ts');
20
+ const configPathMjs = join(projectRoot, '.hublaunch', 'hublaunch.config.mjs');
21
+ const configPathJs = join(projectRoot, '.hublaunch', 'hublaunch.config.js');
22
+ // Prefer .ts, then .mjs, then .js
23
+ this.configPath = existsSync(configPathTs)
24
+ ? configPathTs
25
+ : existsSync(configPathMjs)
26
+ ? configPathMjs
27
+ : configPathJs;
28
+ // Load environment variables from project root .env (quietly)
29
+ dotenvConfig({ path: join(projectRoot, '.env'), quiet: true });
30
+ }
31
+ /**
32
+ * Load configuration from file or use defaults
33
+ */
34
+ async load() {
35
+ if (this.config) {
36
+ return this.config;
37
+ }
38
+ if (!existsSync(this.configPath)) {
39
+ // Use default config if file doesn't exist
40
+ this.config = this.applyDefaults(DEFAULT_CONFIG);
41
+ this.config = this.resolvePaths(this.config);
42
+ await this.runLocalFileMigration(this.config);
43
+ return this.config;
44
+ }
45
+ try {
46
+ // Suppress the MODULE_TYPELESS_PACKAGE_JSON warning during config import
47
+ const originalEmitWarning = process.emitWarning;
48
+ process.emitWarning = (warning, ...args) => {
49
+ // Filter out the MODULE_TYPELESS_PACKAGE_JSON warning
50
+ if (typeof warning === 'string' &&
51
+ warning.includes('MODULE_TYPELESS_PACKAGE_JSON')) {
52
+ return;
53
+ }
54
+ if (typeof warning === 'object' &&
55
+ warning &&
56
+ 'name' in warning &&
57
+ warning.name === 'MODULE_TYPELESS_PACKAGE_JSON') {
58
+ return;
59
+ }
60
+ return originalEmitWarning.call(process, warning, ...args);
61
+ };
62
+ try {
63
+ // Use dynamic import to load TypeScript/JavaScript config file
64
+ // Convert file path to file:// URL for proper ESM import
65
+ const configUrl = pathToFileURL(this.configPath).href;
66
+ // Add cache busting to ensure fresh load on reload
67
+ const moduleUrl = `${configUrl}?update=${Date.now()}`;
68
+ const configModule = (await import(moduleUrl));
69
+ // Get the config - try default export first, then named 'config' export, then the module itself
70
+ const parsedConfig = (configModule.default ||
71
+ configModule.config ||
72
+ configModule);
73
+ // Validate with Zod schema
74
+ const validated = ConfigSchema.parse(parsedConfig);
75
+ this.config = this.applyDefaults(validated);
76
+ // Resolve relative paths to absolute paths based on project root
77
+ this.config = this.resolvePaths(this.config);
78
+ await this.runLocalFileMigration(this.config);
79
+ return this.config;
80
+ }
81
+ finally {
82
+ // Restore original emitWarning
83
+ process.emitWarning = originalEmitWarning;
84
+ }
85
+ }
86
+ catch (error) {
87
+ console.warn(`Warning: Could not load config from ${this.configPath}, using defaults`);
88
+ console.warn(error instanceof Error ? error.message : String(error));
89
+ this.config = this.applyDefaults(DEFAULT_CONFIG);
90
+ this.config = this.resolvePaths(this.config);
91
+ await this.runLocalFileMigration(this.config);
92
+ return this.config;
93
+ }
94
+ }
95
+ /**
96
+ * One-shot per-process migration: rename legacy
97
+ * `.hublaunch/trackedIssues.json` → `.hublaunch/trackedPlans.json` and
98
+ * transform contents to the new schema. Errors are warned, not fatal.
99
+ */
100
+ migrationDone = false;
101
+ async runLocalFileMigration(config) {
102
+ if (this.migrationDone)
103
+ return;
104
+ this.migrationDone = true;
105
+ try {
106
+ await migrateLocalTrackingFile(config.trackingFile);
107
+ }
108
+ catch (err) {
109
+ console.warn(`Warning: tracking-file migration failed: ${err instanceof Error ? err.message : String(err)}`);
110
+ }
111
+ }
112
+ /**
113
+ * Apply defaults for optional fields
114
+ */
115
+ applyDefaults(config) {
116
+ return {
117
+ ...config,
118
+ priorityLevels: config.priorityLevels ?? DEFAULT_PRIORITY_LEVELS,
119
+ commandAliases: config.commandAliases ?? {
120
+ primary: ['hula', 'hub-launch', 'hl'],
121
+ },
122
+ issueSortOrder: config.issueSortOrder ?? {
123
+ groupBy: 'priority',
124
+ sortBy: 'created',
125
+ direction: 'desc',
126
+ },
127
+ };
128
+ }
129
+ /**
130
+ * Resolve relative paths to absolute paths based on project root
131
+ */
132
+ resolvePaths(config) {
133
+ return {
134
+ ...config,
135
+ planPath: isAbsolute(config.planPath)
136
+ ? normalize(config.planPath)
137
+ : resolve(this.projectRoot, normalize(config.planPath)),
138
+ trackingFile: isAbsolute(config.trackingFile)
139
+ ? normalize(config.trackingFile)
140
+ : resolve(this.projectRoot, normalize(config.trackingFile)),
141
+ };
142
+ }
143
+ /**
144
+ * Get current config (loads if not already loaded)
145
+ */
146
+ async get() {
147
+ return this.load();
148
+ }
149
+ /**
150
+ * Reload configuration from file
151
+ */
152
+ async reload() {
153
+ this.config = null;
154
+ return this.load();
155
+ }
156
+ }
157
+ // Singleton instance
158
+ let configLoader = null;
159
+ /**
160
+ * Get or create ConfigLoader instance
161
+ */
162
+ export function getConfigLoader(projectRoot) {
163
+ if (!configLoader) {
164
+ configLoader = new ConfigLoader(projectRoot);
165
+ }
166
+ return configLoader;
167
+ }
168
+ /**
169
+ * Load configuration
170
+ */
171
+ export async function loadConfig(projectRoot) {
172
+ const loader = getConfigLoader(projectRoot);
173
+ return loader.load();
174
+ }
175
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ // Suppress Node.js MODULE_TYPELESS_PACKAGE_JSON warnings early
3
+ // This must be done before any dynamic imports
4
+ const originalEmitWarning = process.emitWarning;
5
+ process.emitWarning = ((warning, ...args) => {
6
+ if (typeof warning === 'string' &&
7
+ warning.includes('MODULE_TYPELESS_PACKAGE_JSON')) {
8
+ return;
9
+ }
10
+ if (typeof warning === 'object' &&
11
+ warning &&
12
+ 'code' in warning &&
13
+ warning.code === 'MODULE_TYPELESS_PACKAGE_JSON') {
14
+ return;
15
+ }
16
+ return originalEmitWarning.call(process, warning, ...args);
17
+ });
18
+ // Also catch warnings through the warning event
19
+ process.on('warning', (warning) => {
20
+ // Suppress MODULE_TYPELESS_PACKAGE_JSON warnings
21
+ if (warning.name === 'Warning' &&
22
+ warning.message.includes('MODULE_TYPELESS_PACKAGE_JSON')) {
23
+ return;
24
+ }
25
+ // Re-emit other warnings to console (default behavior)
26
+ // Don't re-emit since we've already caught it
27
+ });
28
+ // Override console.error temporarily to catch the warning output
29
+ const originalConsoleError = console.error;
30
+ console.error = (...args) => {
31
+ const msg = args[0];
32
+ if (typeof msg === 'string' && msg.includes('MODULE_TYPELESS_PACKAGE_JSON')) {
33
+ return;
34
+ }
35
+ return originalConsoleError.apply(console, args);
36
+ };
37
+ import { createRequire } from 'module';
38
+ import { Command } from 'commander';
39
+ import { logger } from './utils/logger.js';
40
+ import { validateGhCli } from './utils/github-cli.js';
41
+ import { loadConfig } from './config/index.js';
42
+ import { githubAppService } from './services/github/GithubAppService.js';
43
+ const require = createRequire(import.meta.url);
44
+ const { version } = require('../package.json');
45
+ // Import commands
46
+ import { initCommand } from './commands/init.js';
47
+ import { mergeCommand } from './commands/merge.js';
48
+ import { logsCommand } from './commands/logs.js';
49
+ import { launchCommand } from './commands/launch.js';
50
+ import { executeCommand } from './commands/execute.js';
51
+ import { executeLogin } from './commands/login.js';
52
+ import { uploadCommand } from './commands/upload.js';
53
+ import { findGitRoot } from './utils/git-utils.js';
54
+ const program = new Command();
55
+ /**
56
+ * Main CLI entry point
57
+ */
58
+ async function main() {
59
+ // Setup program
60
+ program
61
+ .name('hublaunch')
62
+ .description('GitHub Issue and PR automation tool')
63
+ .version(version)
64
+ .addHelpText('after', '\nGetting Started:\n Run "hula login" to authenticate and start using HubLaunch\n Run "hula init" to generate or regenerate the project configuration\n');
65
+ // Check if user is asking for help or version (skip validation)
66
+ const args = process.argv.slice(2);
67
+ const isHelpOrVersion = args.length === 0 ||
68
+ args.some((arg) => arg === '--help' ||
69
+ arg === '-h' ||
70
+ arg === '--version' ||
71
+ arg === '-V' ||
72
+ arg === 'help');
73
+ // Check if login command (which handles authentication itself)
74
+ const isLoginCommand = args[0] === 'login';
75
+ // Show loading indicator during initialization (skip for help/version)
76
+ let spinner = null;
77
+ if (!isHelpOrVersion) {
78
+ spinner = logger.spinner('Loading...');
79
+ }
80
+ try {
81
+ if (!isHelpOrVersion && !isLoginCommand) {
82
+ // Validate GitHub CLI is available and authenticated
83
+ const ghValid = await validateGhCli();
84
+ if (!ghValid) {
85
+ spinner?.stop();
86
+ process.exit(1);
87
+ }
88
+ }
89
+ // Find project root (Git repository root)
90
+ const projectRoot = await findGitRoot();
91
+ // Load configuration (which will load .env from project root)
92
+ const config = await loadConfig(projectRoot);
93
+ // Stop spinner once loaded
94
+ spinner?.stop();
95
+ // Check for GitHub App installation (non-intrusive, runs in background)
96
+ // Skip for help/version/login commands
97
+ if (!isLoginCommand && config.hulaApiKey) {
98
+ // Check GitHub App installation status (will prompt if needed)
99
+ // This runs async and doesn't block execution
100
+ githubAppService.checkAndPromptInstallation(config).catch(() => {
101
+ // Silently fail - don't block user from using the CLI
102
+ });
103
+ }
104
+ // Register commands
105
+ program
106
+ .command('login')
107
+ .description('Authenticate with hula-project')
108
+ .option('--url <url>', 'hula-project server URL (defaults to config or env)')
109
+ .action(async (options) => {
110
+ const configWithUrl = options.url
111
+ ? { ...config, hulaProjectUrl: options.url }
112
+ : config;
113
+ await executeLogin(configWithUrl);
114
+ });
115
+ // ── Core commands ──────────────────────────────────────────────────────────
116
+ initCommand(program, config);
117
+ // ── Pro Plan commands ───────────────────────────────────────────────────────
118
+ launchCommand(program, config);
119
+ mergeCommand(program, config);
120
+ executeCommand(program, config);
121
+ uploadCommand(program, config);
122
+ logsCommand(program, config);
123
+ // Help command
124
+ program
125
+ .command('help')
126
+ .description('Show help information')
127
+ .action(() => {
128
+ program.help();
129
+ });
130
+ if (args.length === 0) {
131
+ program.outputHelp();
132
+ process.exit(0);
133
+ }
134
+ // Parse arguments
135
+ await program.parseAsync(process.argv);
136
+ }
137
+ catch (error) {
138
+ spinner?.stop();
139
+ throw error;
140
+ }
141
+ }
142
+ // Run main
143
+ main().catch((error) => {
144
+ logger.error('Fatal error:');
145
+ logger.error(error instanceof Error ? error.message : String(error));
146
+ process.exit(1);
147
+ });
148
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ export interface HulaApiConfig {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ timeout?: number;
5
+ }
6
+ export interface ApiTrackedPlan {
7
+ id: string;
8
+ trackingName: string;
9
+ issueNumber: number | null;
10
+ title: string;
11
+ trackingStatus: string;
12
+ githubState: string;
13
+ priority: string;
14
+ project: {
15
+ owner: string;
16
+ name: string;
17
+ fullName: string;
18
+ };
19
+ prNumber?: number | null;
20
+ prUrl?: string | null;
21
+ githubUrl: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ deploymentStatus?: 'pending' | 'success' | 'failed' | null;
25
+ /**
26
+ * Server-side owner id. Optional for backward compatibility with older
27
+ * servers that did not expose this field.
28
+ */
29
+ createdById?: string;
30
+ }
31
+ export interface PlanStatusResponse {
32
+ plan: ApiTrackedPlan;
33
+ copilotStatus: {
34
+ status: string;
35
+ isAssigned: boolean;
36
+ hasPR: boolean;
37
+ };
38
+ lastPolled: string;
39
+ }
40
+ export interface TrackPlanRequest {
41
+ owner: string;
42
+ repo: string;
43
+ issueNumber: number;
44
+ trackingName: string;
45
+ title: string;
46
+ priority?: string;
47
+ planPath?: string;
48
+ copilotAssigned?: boolean;
49
+ }
50
+ export interface ListPlansResponse {
51
+ plans: ApiTrackedPlan[];
52
+ total: number;
53
+ page: number;
54
+ limit: number;
55
+ totalPages: number;
56
+ /**
57
+ * The id of the authenticated user. Optional for backward compatibility
58
+ * with older servers that did not expose this field.
59
+ */
60
+ currentUserId?: string;
61
+ }
62
+ /**
63
+ * HTTP client for communicating with hula-project REST API.
64
+ * Handles authentication, retries, and error mapping.
65
+ *
66
+ * @example
67
+ * const client = new HulaApiClient({
68
+ * baseUrl: 'https://hula.example.com',
69
+ * apiKey: 'hula_sk_...'
70
+ * });
71
+ * const plans = await client.listPlans();
72
+ */
73
+ export declare class HulaApiClient {
74
+ private client;
75
+ constructor(config: HulaApiConfig);
76
+ /**
77
+ * List all tracked plans for authenticated user
78
+ */
79
+ listPlans(filters?: {
80
+ status?: string;
81
+ priority?: string;
82
+ project?: string;
83
+ page?: number;
84
+ limit?: number;
85
+ }): Promise<ListPlansResponse>;
86
+ /**
87
+ * Track a new plan
88
+ */
89
+ trackPlan(data: TrackPlanRequest): Promise<{
90
+ plan: ApiTrackedPlan;
91
+ }>;
92
+ /**
93
+ * Get detailed status for a specific plan
94
+ */
95
+ getPlanStatus(owner: string, repo: string, issueNumber: number): Promise<PlanStatusResponse>;
96
+ /**
97
+ * Update plan priority
98
+ */
99
+ updatePlanPriority(planId: string, priority: string): Promise<{
100
+ plan: ApiTrackedPlan;
101
+ }>;
102
+ /**
103
+ * Untrack a plan
104
+ */
105
+ untrackPlan(planId: string): Promise<{
106
+ success: boolean;
107
+ }>;
108
+ /**
109
+ * Fetch the latest Task's logs for a tracked plan (plain text).
110
+ * Calls GET /api/v1/logs/:planName.
111
+ *
112
+ * The URL string `/api/v1/logs/<name>` is preserved across the server
113
+ * rename; only the underlying resolution semantics changed (the server
114
+ * now resolves the name to a Plan and reads its latest Task's log).
115
+ */
116
+ fetchTaskLogs(planName: string, options: {
117
+ type?: 'log' | 'output';
118
+ lines?: number;
119
+ project: string;
120
+ }): Promise<string>;
121
+ /**
122
+ * Detects when a 404 came from the `/api/v1/plans` collection endpoint
123
+ * and rethrows as an `IncompatibleServerError`. A collection 404 can
124
+ * only mean the server predates the Plan/Project/Task rename. Per-
125
+ * resource 404s (e.g. `/api/v1/plans/<id>`) keep `NotFoundError`
126
+ * semantics and are handled by `handleError()`.
127
+ */
128
+ private maybeRethrowAsIncompatibleServer;
129
+ /**
130
+ * Handle API errors with user-friendly messages
131
+ */
132
+ private handleError;
133
+ }
134
+ export declare class ApiError extends Error {
135
+ statusCode?: number | undefined;
136
+ constructor(message: string, statusCode?: number | undefined);
137
+ }
138
+ export declare class AuthenticationError extends ApiError {
139
+ constructor(message: string);
140
+ }
141
+ export declare class AuthorizationError extends ApiError {
142
+ constructor(message: string);
143
+ }
144
+ export declare class NotFoundError extends ApiError {
145
+ constructor(message: string);
146
+ }
147
+ export declare class ConflictError extends ApiError {
148
+ constructor(message: string);
149
+ }
150
+ export declare class RateLimitError extends ApiError {
151
+ constructor(message: string);
152
+ }
153
+ export declare class ServerError extends ApiError {
154
+ constructor(message: string);
155
+ }
156
+ export declare class TimeoutError extends ApiError {
157
+ constructor(message: string);
158
+ }
159
+ export declare class NetworkError extends ApiError {
160
+ constructor(message: string);
161
+ }
162
+ /**
163
+ * Raised when hub-launch detects that the connected hula-server predates
164
+ * the Plan/Project/Task rename (NoStackApp/hula-server PR #159) — i.e. a
165
+ * 404 on the `/api/v1/plans` collection endpoint.
166
+ */
167
+ export declare class IncompatibleServerError extends ApiError {
168
+ constructor();
169
+ }
170
+ //# sourceMappingURL=HulaApiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HulaApiClient.d.ts","sourceRoot":"","sources":["../../../src/services/api/HulaApiClient.ts"],"names":[],"mappings":"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"}