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,105 @@
1
+ import axios from 'axios';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import { logger } from '../utils/logger.js';
5
+ import { HulaApiClient } from '../services/api/HulaApiClient.js';
6
+ import { LogFormatterService } from '../services/logs/LogFormatterService.js';
7
+ import { TempFileService } from '../services/logs/TempFileService.js';
8
+ import { EditorService } from '../services/editor/EditorService.js';
9
+ import { resolveProject } from '../utils/project-resolver.js';
10
+ /**
11
+ * Logs command - View logs for a tracked plan
12
+ *
13
+ * Usage: hula logs <trackingName> [--lines N] [--raw]
14
+ */
15
+ export function logsCommand(program, config) {
16
+ program
17
+ .command('logs <trackingName>')
18
+ // .alias("g")
19
+ .description('View logs for a tracked plan')
20
+ .option('--lines <number>', 'Number of lines to show (default: 100)', '100')
21
+ .option('-r, --raw', 'Show raw log output only', false)
22
+ .action(async (trackingName, options) => {
23
+ await executeLogs(trackingName, options, config);
24
+ });
25
+ }
26
+ /**
27
+ * Execute logs command - fetch and display logs for a tracked plan
28
+ *
29
+ * @param trackingName - The plan's tracking name (e.g., "fix-button")
30
+ * @param options - Command options (lines, raw)
31
+ * @param config - HubLaunch configuration
32
+ */
33
+ export async function executeLogs(trackingName, options, config) {
34
+ const serverUrl = config.hulaProjectUrl ?? process.env.HULA_PROJECT_URL;
35
+ const apiKey = config.hulaApiKey ?? process.env.HULA_API_KEY;
36
+ const lines = parseInt(options.lines, 10) || 100;
37
+ if (!serverUrl || !apiKey) {
38
+ logger.error('Server URL and API key are required.');
39
+ logger.info("Run 'hula login' to authenticate with hula-project.");
40
+ process.exit(1);
41
+ }
42
+ logger.info(`📋 Fetching logs for: ${trackingName}`);
43
+ logger.blank();
44
+ const apiClient = new HulaApiClient({
45
+ baseUrl: serverUrl.replace(/\/$/, ''),
46
+ apiKey,
47
+ timeout: 30000,
48
+ });
49
+ const project = await resolveProject(config);
50
+ try {
51
+ const content = await apiClient.fetchTaskLogs(trackingName, {
52
+ type: 'log',
53
+ lines,
54
+ project,
55
+ });
56
+ if (options.raw) {
57
+ process.stdout.write(content);
58
+ return;
59
+ }
60
+ const formatter = new LogFormatterService();
61
+ const formatted = formatter.formatPlainText(content, {
62
+ trackingName,
63
+ lines,
64
+ });
65
+ const tempFileService = new TempFileService(path.join(os.tmpdir(), 'hublaunch-logs'));
66
+ const filePath = await tempFileService.createTempFile(formatted, trackingName);
67
+ logger.info(`Log file created: ${filePath}`);
68
+ const editorService = new EditorService(config.editorCommand);
69
+ await editorService.openFile(filePath);
70
+ logger.success('✓ Log file opened in editor');
71
+ }
72
+ catch (error) {
73
+ handleApiError(error, serverUrl);
74
+ process.exit(1);
75
+ }
76
+ }
77
+ function handleApiError(error, serverUrl) {
78
+ if (axios.isAxiosError(error)) {
79
+ if (error.response) {
80
+ const status = error.response.status;
81
+ const data = error.response.data;
82
+ switch (status) {
83
+ case 401:
84
+ logger.error('Authentication failed. Your API key may be invalid.');
85
+ logger.info("Run 'hula login' to re-authenticate.");
86
+ break;
87
+ case 404:
88
+ logger.error(data.error ?? 'Plan not found or no logs available');
89
+ break;
90
+ default:
91
+ logger.error(data.error ?? `Request failed with status ${status}`);
92
+ }
93
+ }
94
+ else if (error.code === 'ECONNREFUSED') {
95
+ logger.error(`Cannot connect to server at ${serverUrl}`);
96
+ }
97
+ else {
98
+ logger.error(`Network error: ${error.message}`);
99
+ }
100
+ }
101
+ else {
102
+ throw error;
103
+ }
104
+ }
105
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.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
+ * Merge command - Merge PR, delete branch, remove from tracking
5
+ */
6
+ export declare function mergeCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBnE"}
@@ -0,0 +1,240 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { PRService } from "../services/github/PRService.js";
3
+ import { TrackingService, } from "../services/tracking/TrackingService.js";
4
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
5
+ import { searchSelect, UserCancelledError } from "../utils/prompts.js";
6
+ import { GitService } from "../services/git/GitService.js";
7
+ import { runCommand } from "../utils/shell.js";
8
+ /**
9
+ * Merge command - Merge PR, delete branch, remove from tracking
10
+ */
11
+ export function mergeCommand(program, config) {
12
+ program
13
+ .command("merge [issueNumber]")
14
+ .description("Merge PR, delete branch, remove from tracking")
15
+ .option("--no-delete", "Don't delete branch after merge")
16
+ .option("--no-remove", "Don't remove from tracking")
17
+ .action(async (issueNumber, options) => {
18
+ try {
19
+ await executeMerge(config, issueNumber, options);
20
+ }
21
+ catch (error) {
22
+ if (error instanceof UserCancelledError) {
23
+ logger.info('\nCancelled.');
24
+ process.exit(0);
25
+ }
26
+ logger.error("Failed to merge PR:");
27
+ logger.error(error instanceof Error ? error.message : String(error));
28
+ process.exit(1);
29
+ }
30
+ });
31
+ }
32
+ async function executeMerge(config, issueNumberArg, options) {
33
+ logger.section("Merge Pull Request");
34
+ // Initialize services
35
+ const prService = new PRService();
36
+ const gitService = new GitService();
37
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
38
+ // Get issue number
39
+ let issueNumber;
40
+ if (issueNumberArg) {
41
+ issueNumber = parseInt(issueNumberArg, 10);
42
+ if (isNaN(issueNumber)) {
43
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
44
+ }
45
+ }
46
+ else {
47
+ // Show tracked issues and let user select
48
+ const trackedIssues = await trackingService.getAll();
49
+ if (trackedIssues.length === 0) {
50
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
51
+ }
52
+ const choices = trackedIssues
53
+ .filter((issue) => issue.number !== undefined)
54
+ .map((issue) => ({
55
+ name: `#${issue.number} - ${issue.name}`,
56
+ value: issue.number.toString(),
57
+ }));
58
+ const selected = await searchSelect("Select issue to merge:", choices);
59
+ issueNumber = parseInt(selected, 10);
60
+ }
61
+ // Get tracked issue
62
+ const trackedIssue = await trackingService.getByNumber(issueNumber);
63
+ if (!trackedIssue) {
64
+ logger.warning(`Issue #${issueNumber} is not tracked. Continuing anyway...`);
65
+ }
66
+ // Get PRs for issue
67
+ logger.info(`Fetching PRs for issue #${issueNumber}...`);
68
+ const prs = await prService.getAllByIssue(issueNumber);
69
+ if (prs.length === 0) {
70
+ throw new Error(`No PRs found for issue #${issueNumber}`);
71
+ }
72
+ // Select PR (prioritize open PRs)
73
+ let prNumber;
74
+ if (prs.length === 1) {
75
+ const firstPR = prs[0];
76
+ if (!firstPR) {
77
+ throw new Error("PR data is invalid");
78
+ }
79
+ prNumber = firstPR.number;
80
+ }
81
+ else {
82
+ // Prioritize open PRs
83
+ const openPRs = prs.filter((pr) => pr.state === "open");
84
+ if (openPRs.length > 0) {
85
+ if (openPRs.length === 1) {
86
+ const firstOpenPR = openPRs[0];
87
+ if (!firstOpenPR) {
88
+ throw new Error("PR data is invalid");
89
+ }
90
+ prNumber = firstOpenPR.number;
91
+ }
92
+ else {
93
+ // Multiple open PRs - let user choose
94
+ logger.warning(`Found ${openPRs.length} open PRs for this issue:`);
95
+ logger.blank();
96
+ openPRs.forEach((pr) => {
97
+ logger.info(` PR #${pr.number}: ${pr.title}`);
98
+ });
99
+ logger.blank();
100
+ const choices = openPRs.map((pr) => ({
101
+ name: `#${pr.number} - ${pr.title}`,
102
+ value: pr.number.toString(),
103
+ }));
104
+ const selected = await searchSelect("Select PR to merge:", choices);
105
+ prNumber = parseInt(selected, 10);
106
+ }
107
+ }
108
+ else {
109
+ throw new Error(`No open PRs found for issue #${issueNumber}. All PRs are closed or merged.`);
110
+ }
111
+ }
112
+ const pr = prs.find((p) => p.number === prNumber);
113
+ if (!pr) {
114
+ throw new Error(`PR #${prNumber} not found`);
115
+ }
116
+ logger.blank();
117
+ logger.info("PR Details:");
118
+ logger.info(` Number: #${prNumber}`);
119
+ logger.info(` Title: ${pr.title}`);
120
+ logger.info(` Branch: ${pr.head.ref}`);
121
+ logger.info(` State: ${pr.state}`);
122
+ logger.blank();
123
+ // Check if PR is a draft and mark as ready if needed
124
+ const isDraft = await prService.isDraft(prNumber);
125
+ if (isDraft) {
126
+ logger.warning("This PR is currently in draft state.");
127
+ logger.info("Marking PR as ready for review...");
128
+ try {
129
+ await prService.convertToReady(prNumber);
130
+ logger.success("✓ PR marked as ready for review");
131
+ logger.blank();
132
+ }
133
+ catch (error) {
134
+ logger.warning("Warning: Could not mark PR as ready. Attempting to merge anyway...");
135
+ logger.blank();
136
+ }
137
+ }
138
+ // Confirmation prompt
139
+ logger.warning("═══════════════════════════════════════════════════════");
140
+ logger.warning(`Ready to merge PR #${prNumber}`);
141
+ if (trackedIssue) {
142
+ logger.info(` Issue: ${trackedIssue.name} (#${issueNumber})`);
143
+ }
144
+ logger.info(` PR: ${pr.title} (#${prNumber})`);
145
+ logger.blank();
146
+ logger.info("This will:");
147
+ logger.info(" 1. Merge the PR using squash merge");
148
+ if (options.delete) {
149
+ logger.info(" 2. Delete the branch");
150
+ }
151
+ if (options.remove && trackedIssue) {
152
+ logger.info(` 3. Remove issue #${issueNumber} from tracking`);
153
+ }
154
+ logger.blank();
155
+ logger.warning("═══════════════════════════════════════════════════════");
156
+ logger.blank();
157
+ // Perform merge
158
+ logger.blank();
159
+ logger.info(`Merging PR #${prNumber}...`);
160
+ try {
161
+ await prService.merge(prNumber, {
162
+ mergeMethod: "squash",
163
+ deleteBranch: options.delete,
164
+ });
165
+ logger.blank();
166
+ logger.success(`✓ PR #${prNumber} merged successfully!`);
167
+ logger.blank();
168
+ // Delete local branch if it exists
169
+ let localBranchDeleted = false;
170
+ if (options.delete) {
171
+ try {
172
+ const currentBranch = await gitService.getCurrentBranch();
173
+ if (currentBranch === pr.head.ref) {
174
+ // Detect default branch using gh CLI (already a project dependency)
175
+ let defaultBranch = "main";
176
+ try {
177
+ const repoInfo = await runCommand('gh repo view --json defaultBranchRef --jq ".defaultBranchRef.name"', { silent: true });
178
+ if (repoInfo.trim()) {
179
+ defaultBranch = repoInfo.trim();
180
+ }
181
+ }
182
+ catch {
183
+ logger.debug("Could not detect default branch, falling back to 'main'");
184
+ }
185
+ logger.info(`Switching to ${defaultBranch} before deleting branch...`);
186
+ await gitService.checkout(defaultBranch);
187
+ }
188
+ await gitService.deleteBranch(pr.head.ref, true);
189
+ localBranchDeleted = true;
190
+ logger.success(`✓ Deleted local branch: ${pr.head.ref}`);
191
+ }
192
+ catch (error) {
193
+ logger.debug(`Could not delete local branch ${pr.head.ref}: ${error instanceof Error ? error.message : String(error)}`);
194
+ // Non-critical — branch may not exist locally (e.g., remote-only PR)
195
+ }
196
+ }
197
+ // Remove from tracking if requested
198
+ if (options.remove && trackedIssue) {
199
+ logger.info("Removing from tracking...");
200
+ await trackingService.removeByName(trackedIssue.name);
201
+ logger.success(`✓ Removed issue #${issueNumber} from tracking`);
202
+ }
203
+ // Remove from GitHub Project if configured
204
+ // TODO: Implement ProjectService.removeIssue method
205
+ if (trackedIssue && config.projectNumber) {
206
+ logger.debug("Project removal not yet implemented");
207
+ // try {
208
+ // const projectService = new ProjectService();
209
+ // await projectService.removeIssue(config.projectNumber, issueNumber);
210
+ // logger.success("✓ Removed from GitHub Project");
211
+ // } catch (error) {
212
+ // logger.debug(
213
+ // `Could not remove from project: ${error instanceof Error ? error.message : String(error)}`
214
+ // );
215
+ // // Non-critical error, continue
216
+ // }
217
+ }
218
+ logger.blank();
219
+ logger.success("═══════════════════════════════════════════════════════");
220
+ logger.success("✨ Merge Complete!");
221
+ logger.blank();
222
+ logger.info("Summary:");
223
+ logger.info(` ✓ PR #${prNumber} merged and branch deleted remotely`);
224
+ if (options.delete && localBranchDeleted) {
225
+ logger.info(` ✓ Local branch ${pr.head.ref} deleted`);
226
+ }
227
+ if (options.remove && trackedIssue) {
228
+ logger.info(` ✓ Issue #${issueNumber} removed from tracking`);
229
+ }
230
+ logger.blank();
231
+ logger.success("═══════════════════════════════════════════════════════");
232
+ logger.blank();
233
+ }
234
+ catch (error) {
235
+ logger.blank();
236
+ logger.error(`Failed to merge PR #${prNumber}`);
237
+ throw error;
238
+ }
239
+ }
240
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.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
+ * Preview command - Open PR deployment preview
5
+ */
6
+ export declare function previewCommand(program: Command, config: Config): void;
7
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBrE"}
@@ -0,0 +1,160 @@
1
+ import { logger } from "../utils/logger.js";
2
+ import { PRService } from "../services/github/PRService.js";
3
+ import { TrackingService } from "../services/tracking/TrackingService.js";
4
+ import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
5
+ import { PreviewService } from "../services/preview/PreviewService.js";
6
+ import { searchSelect, UserCancelledError } from "../utils/prompts.js";
7
+ import { HookExecutor } from "../services/hooks/HookExecutor.js";
8
+ /**
9
+ * Preview command - Open PR deployment preview
10
+ */
11
+ export function previewCommand(program, config) {
12
+ program
13
+ .command("preview [issueNumber]")
14
+ .description("Open PR deployment preview with automated login")
15
+ .option("--no-session", "Open in system browser without persistent session")
16
+ .option("--no-hook", "Skip deployment startup hook, use built-in auto-login")
17
+ .option("--background", "Open browser and return immediately")
18
+ .action(async (issueNumber, options) => {
19
+ try {
20
+ await executePreview(config, issueNumber, options);
21
+ }
22
+ catch (error) {
23
+ if (error instanceof UserCancelledError) {
24
+ logger.info('\nCancelled.');
25
+ process.exit(0);
26
+ }
27
+ logger.error("Failed to open preview:");
28
+ logger.error(error instanceof Error ? error.message : String(error));
29
+ process.exit(1);
30
+ }
31
+ });
32
+ }
33
+ async function executePreview(config, issueNumberArg, options = { session: true, hook: true, background: false }) {
34
+ logger.section("Open Deployment Preview");
35
+ // Initialize services
36
+ const prService = new PRService();
37
+ const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
38
+ const hookExecutor = new HookExecutor();
39
+ const previewService = new PreviewService(config);
40
+ // Get issue number
41
+ let issueNumber;
42
+ if (issueNumberArg) {
43
+ issueNumber = parseInt(issueNumberArg, 10);
44
+ if (isNaN(issueNumber)) {
45
+ throw new Error(`Invalid issue number: ${issueNumberArg}`);
46
+ }
47
+ }
48
+ else {
49
+ // Show tracked issues and let user select
50
+ const trackedIssues = await trackingService.getAll();
51
+ if (trackedIssues.length === 0) {
52
+ throw new Error("No tracked issues found. Run 'hublaunch track' first.");
53
+ }
54
+ const choices = trackedIssues
55
+ .filter((issue) => issue.number !== undefined)
56
+ .map((issue) => ({
57
+ name: `#${issue.number} - ${issue.name}`,
58
+ value: issue.number.toString(),
59
+ }));
60
+ const selected = await searchSelect("Select issue to preview:", choices);
61
+ issueNumber = parseInt(selected, 10);
62
+ }
63
+ // Get PR for issue
64
+ logger.info(`Fetching PR for issue #${issueNumber}...`);
65
+ const pr = await prService.getByIssue(issueNumber);
66
+ if (!pr) {
67
+ throw new Error(`No PR found for issue #${issueNumber}`);
68
+ }
69
+ logger.info(`Found PR #${pr.number}: ${pr.title}`);
70
+ logger.blank();
71
+ // Try to extract Vercel URL from PR
72
+ logger.info("Looking for deployment URL...");
73
+ // Get PR comments to find Vercel deployment URL
74
+ const timeline = await prService.getTimeline(pr.number);
75
+ let deploymentUrl = null;
76
+ // Search for vercel.app URLs in timeline
77
+ for (const event of timeline) {
78
+ if (typeof event === "object" && event !== null && "body" in event) {
79
+ const body = String(event.body);
80
+ const vercelMatch = body.match(/https?:\/\/[^\s]*\.vercel\.app/);
81
+ if (vercelMatch) {
82
+ deploymentUrl = vercelMatch[0];
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ if (!deploymentUrl) {
88
+ logger.warning("Could not find Vercel deployment URL in PR comments");
89
+ logger.info(`Opening PR page instead: ${pr.html_url}`);
90
+ logger.blank();
91
+ // Open PR in browser with auto-login
92
+ if (options.session) {
93
+ if (options.background) {
94
+ await previewService.openInBackground(pr.html_url);
95
+ }
96
+ else {
97
+ await previewService.openWithAutoLogin(pr.html_url, { keepOpen: true });
98
+ }
99
+ }
100
+ else {
101
+ // Fallback to system browser
102
+ const open = await import('open');
103
+ await open.default(pr.html_url);
104
+ logger.success("✓ Opened PR in browser");
105
+ }
106
+ return;
107
+ }
108
+ logger.success(`Found deployment: ${deploymentUrl}`);
109
+ logger.blank();
110
+ // Prepare hook context
111
+ const hookContext = {
112
+ issueNumber,
113
+ prNumber: pr.number,
114
+ deploymentUrl,
115
+ prTitle: pr.title,
116
+ prUrl: pr.html_url,
117
+ };
118
+ // Check for configured hook first, then legacy preview-init.ts
119
+ const hookPath = config.hooks?.deploymentStartup ||
120
+ ".hublaunch/hooks/deploymentStartupScript.ts";
121
+ const legacyPath = ".hublaunch/preview-init.ts";
122
+ // Try configured hook first, then legacy path (skip if --no-hook)
123
+ if (options.hook && hookExecutor.exists(hookPath)) {
124
+ logger.info("Deployment startup hook found, executing...");
125
+ logger.info("Opening browser in background...");
126
+ logger.blank();
127
+ await hookExecutor.executeBackground(hookPath, hookContext);
128
+ logger.success("✓ Browser is opening...");
129
+ logger.info("You can continue working while the browser is open.");
130
+ return;
131
+ }
132
+ else if (options.hook && hookExecutor.exists(legacyPath)) {
133
+ logger.warning("Found legacy preview-init.ts - consider migrating to hooks/");
134
+ logger.info("Opening browser in background...");
135
+ logger.blank();
136
+ await hookExecutor.executeBackground(legacyPath, hookContext);
137
+ logger.success("✓ Browser is opening...");
138
+ logger.info("You can continue working while the browser is open.");
139
+ return;
140
+ }
141
+ // Use PreviewService with automated login
142
+ logger.info("Opening deployment with auto-login...");
143
+ logger.info("(Uses TEST_USER_EMAIL & TEST_USER_PASSWORD env vars)");
144
+ logger.blank();
145
+ if (options.background) {
146
+ await previewService.openInBackground(deploymentUrl);
147
+ }
148
+ else if (options.session) {
149
+ await previewService.openWithAutoLogin(deploymentUrl, { keepOpen: true });
150
+ }
151
+ else {
152
+ // No session mode - use system browser
153
+ const open = await import('open');
154
+ await open.default(deploymentUrl);
155
+ logger.success("✓ Opened deployment in browser");
156
+ }
157
+ logger.blank();
158
+ logger.success("✨ Preview opened!");
159
+ }
160
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,YAAY,EAAoB,MAAM,mCAAmC,CAAC;AAEnF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAc;IAC7D,OAAO;SACJ,OAAO,CAAC,uBAAuB,CAAC;SAChC,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,cAAc,EAAE,mDAAmD,CAAC;SAC3E,MAAM,CAAC,WAAW,EAAE,uDAAuD,CAAC;SAC5E,MAAM,CAAC,cAAc,EAAE,qCAAqC,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,WAA+B,EAAE,OAAiE,EAAE,EAAE;QACnH,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,cAAkC,EAClC,UAAoE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;IAEpH,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAE1C,sBAAsB;IACtB,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,IAAI,eAAe,CACzC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CACtC,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAElD,mBAAmB;IACnB,IAAI,WAAmB,CAAC;IACxB,IAAI,cAAc,EAAE,CAAC;QACnB,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,0CAA0C;QAC1C,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;QACrD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,OAAO,GAAG,aAAa;aAC1B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;aAC7C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACf,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,IAAI,EAAE;YACxC,KAAK,EAAE,KAAK,CAAC,MAAO,CAAC,QAAQ,EAAE;SAChC,CAAC,CAAC,CAAC;QAEN,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;QACzE,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,mBAAmB;IACnB,MAAM,CAAC,IAAI,CAAC,0BAA0B,WAAW,KAAK,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAEnD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,oCAAoC;IACpC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAE7C,gDAAgD;IAChD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,yCAAyC;IACzC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACnE,MAAM,IAAI,GAAG,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACjE,IAAI,WAAW,EAAE,CAAC;gBAChB,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,qCAAqC;QACrC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,uBAAuB;IACvB,MAAM,WAAW,GAAgB;QAC/B,WAAW;QACX,QAAQ,EAAE,EAAE,CAAC,MAAM;QACnB,aAAa;QACb,OAAO,EAAE,EAAE,CAAC,KAAK;QACjB,KAAK,EAAE,EAAE,CAAC,QAAQ;KACnB,CAAC;IAEF,+DAA+D;IAC/D,MAAM,QAAQ,GACZ,MAAM,CAAC,KAAK,EAAE,iBAAiB;QAC/B,6CAA6C,CAAC;IAChD,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAEhD,kEAAkE;IAClE,IAAI,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,YAAY,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE5D,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,CACZ,6DAA6D,CAC9D,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,MAAM,YAAY,CAAC,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,EAAE,CAAC;IAEf,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,cAAc,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,cAAc,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,uCAAuC;QACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Command } from 'commander';
2
+ import type { Config } from '../types/index.js';
3
+ /**
4
+ * Project command - Setup and manage GitHub Projects V2 integration
5
+ */
6
+ export declare function projectCommand(program: Command, config: Config): void;
7
+ /**
8
+ * Run project setup flow and return configuration values
9
+ * This can be called from both 'project setup' and 'init' commands
10
+ * Returns null if setup is cancelled or fails
11
+ */
12
+ export declare function runProjectSetupFlow(): Promise<{
13
+ projectNumber: number;
14
+ projectId: string;
15
+ projectOwner: string;
16
+ enableAutoSync: boolean;
17
+ } | null>;
18
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BrE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,IAAI,CAAC,CAoOR"}