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,492 @@
1
+ import { runCommand, runCommandWithStdin, commandExists, getRepoRoot, } from './shell.js';
2
+ import { logger } from './logger.js';
3
+ const repoInfoCache = new Map();
4
+ const REPO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
5
+ const REPO_CACHE_MAX_SIZE = 10; // LRU eviction after 10 entries
6
+ /**
7
+ * Retry helper with exponential backoff for transient failures
8
+ */
9
+ async function retryWithBackoff(fn, maxRetries = 2, initialDelayMs = 1000) {
10
+ let lastError;
11
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
12
+ try {
13
+ return await fn();
14
+ }
15
+ catch (error) {
16
+ lastError = error instanceof Error ? error : new Error(String(error));
17
+ const errorMessage = lastError.message.toLowerCase();
18
+ // Don't retry on authentication errors or client errors
19
+ if (errorMessage.includes('authentication') ||
20
+ errorMessage.includes('unauthorized') ||
21
+ errorMessage.includes('http 401') ||
22
+ errorMessage.includes('http 403') ||
23
+ errorMessage.includes('http 404') ||
24
+ errorMessage.includes('not found')) {
25
+ throw lastError;
26
+ }
27
+ // Retry on network errors and server errors
28
+ const isRetryable = errorMessage.includes('enotfound') ||
29
+ errorMessage.includes('etimedout') ||
30
+ errorMessage.includes('econnrefused') ||
31
+ errorMessage.includes('econnreset') ||
32
+ errorMessage.includes('connection reset') ||
33
+ errorMessage.includes('read tcp') ||
34
+ errorMessage.includes('network') ||
35
+ errorMessage.includes('http 5') ||
36
+ errorMessage.includes('api.github.com');
37
+ if (!isRetryable || attempt === maxRetries) {
38
+ throw lastError;
39
+ }
40
+ // Exponential backoff
41
+ const delayMs = initialDelayMs * Math.pow(2, attempt);
42
+ logger.debug(`Retrying after ${delayMs}ms (attempt ${attempt + 1}/${maxRetries})...`);
43
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
44
+ }
45
+ }
46
+ throw lastError;
47
+ }
48
+ /**
49
+ * Check if GitHub CLI is installed
50
+ */
51
+ export async function checkGhCli() {
52
+ const exists = await commandExists('gh');
53
+ if (!exists) {
54
+ logger.error('GitHub CLI (gh) is not installed.');
55
+ logger.info('Install it from: https://cli.github.com/');
56
+ return false;
57
+ }
58
+ return true;
59
+ }
60
+ /**
61
+ * Check if authenticated with GitHub CLI
62
+ * Automatically attempts to refresh expired tokens before prompting re-login
63
+ */
64
+ export async function checkGhAuth() {
65
+ try {
66
+ await runCommand('gh auth status', { silent: true });
67
+ // Proactively refresh if the token will expire within 2 hours,
68
+ // so that subsequent git operations don't fail mid-session.
69
+ // This runs in the background — failure is non-fatal.
70
+ const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
71
+ (async () => {
72
+ try {
73
+ const loginModule = await import('../commands/login.js');
74
+ const tokenData = await loginModule.loadGitHubToken();
75
+ if (tokenData?.expires_at &&
76
+ loginModule.isTokenExpiringWithin(tokenData.expires_at, TWO_HOURS_MS)) {
77
+ logger.debug('Token expiring within 2 hours — proactively refreshing');
78
+ await attemptTokenRefresh();
79
+ }
80
+ }
81
+ catch {
82
+ // Non-fatal: proactive refresh failure must not block the command
83
+ }
84
+ })();
85
+ return true;
86
+ }
87
+ catch {
88
+ // Attempt automatic token refresh for any gh auth status failure
89
+ const refreshed = await attemptTokenRefresh();
90
+ if (refreshed) {
91
+ logger.success('✅ GitHub token automatically refreshed');
92
+ return true;
93
+ }
94
+ // Refresh not possible (no refresh token available or refresh failed)
95
+ logger.blank();
96
+ logger.error('⚠️ GitHub authentication has expired or is unavailable.');
97
+ logger.blank();
98
+ logger.info('Please re-authenticate by running:');
99
+ logger.info(' hula login');
100
+ logger.blank();
101
+ return false;
102
+ }
103
+ }
104
+ /**
105
+ * Attempt to refresh the GitHub token automatically
106
+ * Returns true if successful, false otherwise
107
+ */
108
+ async function attemptTokenRefresh() {
109
+ try {
110
+ // Import login module functions
111
+ const loginModule = await import('../commands/login.js');
112
+ const { loadConfig } = await import('../config/index.js');
113
+ // Load saved token
114
+ const tokenData = await loginModule.loadGitHubToken();
115
+ if (!tokenData || !tokenData.refresh_token) {
116
+ logger.debug('No refresh token available');
117
+ return false;
118
+ }
119
+ // Attempt token refresh using the stored refresh token
120
+ logger.info('🔄 Attempting automatic token refresh...');
121
+ // Load config for client ID
122
+ const config = await loadConfig();
123
+ // Refresh the token
124
+ const refreshed = await loginModule.refreshGitHubToken(tokenData.refresh_token, config);
125
+ if (!refreshed) {
126
+ logger.debug('Token refresh failed');
127
+ return false;
128
+ }
129
+ // Save the new token directly
130
+ const fs = await import('fs/promises');
131
+ const path = await import('path');
132
+ const os = await import('os');
133
+ const tokenPath = path.join(os.homedir(), '.hublaunch', 'github-token');
134
+ const newTokenData = {
135
+ access_token: refreshed.access_token,
136
+ refresh_token: refreshed.refresh_token,
137
+ expires_at: refreshed.expires_in
138
+ ? new Date(Date.now() + refreshed.expires_in * 1000).toISOString()
139
+ : null,
140
+ created_at: new Date().toISOString(),
141
+ };
142
+ await fs.writeFile(tokenPath, JSON.stringify(newTokenData, null, 2), {
143
+ mode: 0o600,
144
+ });
145
+ logger.debug('Saved refreshed token');
146
+ // Re-configure gh CLI
147
+ const { exec } = await import('child_process');
148
+ const { promisify } = await import('util');
149
+ const execAsync = promisify(exec);
150
+ try {
151
+ await execAsync('which gh');
152
+ await execAsync(`echo "${refreshed.access_token}" | gh auth login --with-token`);
153
+ logger.debug('GitHub CLI re-configured with refreshed token');
154
+ }
155
+ catch {
156
+ logger.debug('Could not re-configure gh CLI');
157
+ }
158
+ return true;
159
+ }
160
+ catch (error) {
161
+ logger.debug('Token refresh attempt failed: ' + error);
162
+ return false;
163
+ }
164
+ }
165
+ /**
166
+ * Validate all GitHub CLI requirements
167
+ */
168
+ export async function validateGhCli() {
169
+ const cliExists = await checkGhCli();
170
+ if (!cliExists)
171
+ return false;
172
+ const isAuthed = await checkGhAuth();
173
+ if (!isAuthed)
174
+ return false;
175
+ return true;
176
+ }
177
+ /**
178
+ * Get GitHub CLI version
179
+ * Returns version string like "2.40.1" or null if unable to determine
180
+ */
181
+ export async function getGhVersion() {
182
+ try {
183
+ const output = await runCommand('gh --version', { silent: true });
184
+ // Output format: "gh version 2.40.1 (2023-12-13)\n..." or "gh version 2.4\n..."
185
+ // Match 2 or 3 part versions
186
+ const match = output.match(/gh version (\d+\.\d+(?:\.\d+)?)/);
187
+ return match?.[1] ?? null;
188
+ }
189
+ catch (error) {
190
+ logger.debug(`Failed to get gh version: ${error}`);
191
+ return null;
192
+ }
193
+ }
194
+ /**
195
+ * Check if GitHub CLI version meets minimum requirement
196
+ * @param minVersion - Minimum required version (e.g., "2.4.0")
197
+ * @returns true if version is sufficient, false otherwise
198
+ */
199
+ export async function checkGhVersion(minVersion = '2.4.0') {
200
+ const version = await getGhVersion();
201
+ if (!version) {
202
+ logger.error('Unable to determine GitHub CLI version.');
203
+ logger.info('Install it from: https://cli.github.com/');
204
+ return false;
205
+ }
206
+ // Parse version strings into comparable numbers
207
+ // Validate that all parts are numeric
208
+ const parseVersion = (v) => {
209
+ const parts = v.split('.').map((n) => parseInt(n, 10));
210
+ // Ensure all parts are valid numbers
211
+ if (parts.some((n) => isNaN(n))) {
212
+ logger.debug(`Invalid version format: ${v}`);
213
+ return [];
214
+ }
215
+ return parts;
216
+ };
217
+ const current = parseVersion(version);
218
+ const required = parseVersion(minVersion);
219
+ // If parsing failed, return false
220
+ if (current.length === 0 || required.length === 0) {
221
+ logger.error('Unable to parse version numbers.');
222
+ return false;
223
+ }
224
+ // Compare major.minor.patch
225
+ // Treat missing parts as 0 (e.g., "2.4" becomes [2, 4, 0])
226
+ for (let i = 0; i < 3; i++) {
227
+ const currentPart = current[i] ?? 0;
228
+ const requiredPart = required[i] ?? 0;
229
+ if (currentPart > requiredPart)
230
+ return true;
231
+ if (currentPart < requiredPart) {
232
+ logger.error(`GitHub CLI version ${version} is too old.`);
233
+ logger.error(`Minimum required: ${minVersion} (for GitHub Projects v2 support)`);
234
+ logger.info('');
235
+ logger.info('Upgrade with:');
236
+ logger.info(' brew upgrade gh # macOS with Homebrew');
237
+ logger.info(' winget upgrade GitHub.cli # Windows with winget');
238
+ logger.info(' choco upgrade gh # Windows with Chocolatey');
239
+ logger.info(' gh extension upgrade cli # Using gh extensions');
240
+ logger.info(' See https://cli.github.com/ for other platforms');
241
+ return false;
242
+ }
243
+ }
244
+ logger.debug(`GitHub CLI version ${version} meets requirement (>= ${minVersion})`);
245
+ return true;
246
+ }
247
+ /**
248
+ * Run a GitHub CLI command
249
+ */
250
+ export async function runGh(args, options = {}) {
251
+ // Properly escape arguments to avoid shell interpretation
252
+ const escapedArgs = args.map((arg) => {
253
+ // If arg contains special characters, quote it
254
+ if (arg.includes(' ') ||
255
+ arg.includes('(') ||
256
+ arg.includes(')') ||
257
+ arg.includes('|') ||
258
+ arg.includes('"') ||
259
+ arg.includes('\t')) {
260
+ return `'${arg.replace(/'/g, "'\\''")}'`;
261
+ }
262
+ return arg;
263
+ });
264
+ return runCommand(`gh ${escapedArgs.join(' ')}`, options);
265
+ }
266
+ /**
267
+ * Run GitHub CLI API command and parse JSON response with retry logic
268
+ *
269
+ * For POST and PATCH requests with fields, we always use JSON input via stdin
270
+ * (`--input -`) to avoid shell escaping issues. This ensures that body content
271
+ * containing special characters (backticks, parentheses, quotes, etc.) is handled
272
+ * correctly without shell interpretation.
273
+ */
274
+ export async function ghApi(endpoint, options = {}) {
275
+ const executeApi = async () => {
276
+ const { method = 'GET', fields = {} } = options;
277
+ let cmd = `gh api ${endpoint}`;
278
+ if (method !== 'GET') {
279
+ cmd += ` -X ${method}`;
280
+ }
281
+ const hasFields = Object.keys(fields).length > 0;
282
+ let output;
283
+ // Always use JSON input for POST/PATCH/PUT requests with fields to avoid shell
284
+ // escaping issues with special characters (backticks, parentheses, etc.)
285
+ // Especially important on Windows where single quotes don't work correctly
286
+ if (hasFields && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {
287
+ const jsonData = JSON.stringify(fields);
288
+ cmd += ` --input -`;
289
+ output = await runCommandWithStdin(cmd, jsonData);
290
+ }
291
+ else {
292
+ // For GET requests or requests without fields, use command line arguments
293
+ for (const [key, value] of Object.entries(fields)) {
294
+ if (typeof value === 'string') {
295
+ // Use double quotes for better Windows compatibility
296
+ cmd += ` -f ${key}="${value}"`;
297
+ }
298
+ }
299
+ output = await runCommand(cmd);
300
+ }
301
+ // Handle empty responses (common with DELETE operations that return 204 No Content)
302
+ const trimmedOutput = output.trim();
303
+ if (trimmedOutput === '') {
304
+ // Return undefined for empty responses, cast to T for type safety
305
+ // This is safe because DELETE operations don't return data
306
+ return undefined;
307
+ }
308
+ return JSON.parse(trimmedOutput);
309
+ };
310
+ // Use retry logic unless explicitly disabled or for write operations
311
+ // Don't retry POST/PATCH/DELETE to avoid duplicate operations
312
+ const { method = 'GET', skipRetry = false } = options;
313
+ if (skipRetry || method !== 'GET') {
314
+ return executeApi();
315
+ }
316
+ return retryWithBackoff(executeApi);
317
+ }
318
+ /**
319
+ * Get current GitHub username
320
+ */
321
+ export async function getGhUsername() {
322
+ const result = await ghApi('/user');
323
+ return result.login;
324
+ }
325
+ /**
326
+ * Get repository information with retry logic and caching
327
+ */
328
+ export async function getRepoInfo() {
329
+ // Get repo root as cache key
330
+ let cacheKey;
331
+ try {
332
+ cacheKey = await getRepoRoot();
333
+ }
334
+ catch {
335
+ // If we can't get repo root, use process.cwd() as fallback
336
+ cacheKey = process.cwd();
337
+ }
338
+ // Check cache first
339
+ const cached = repoInfoCache.get(cacheKey);
340
+ const now = Date.now();
341
+ if (cached && now - cached.timestamp < REPO_CACHE_TTL_MS) {
342
+ logger.debug('Using cached repo info');
343
+ return cached.data;
344
+ }
345
+ // Fetch with retry logic
346
+ const fetchRepoInfo = async () => {
347
+ logger.debug('Fetching repo info from GitHub CLI');
348
+ try {
349
+ const result = await runCommand('gh repo view --json owner,name', {
350
+ silent: true,
351
+ });
352
+ const parsed = JSON.parse(result);
353
+ const repoInfo = {
354
+ owner: parsed.owner.login,
355
+ name: parsed.name,
356
+ };
357
+ logger.debug(`Fetched repo info: ${repoInfo.owner}/${repoInfo.name}`);
358
+ return repoInfo;
359
+ }
360
+ catch (error) {
361
+ const errorMessage = error instanceof Error ? error.message : String(error);
362
+ // Check if the error is because the repository doesn't exist on GitHub
363
+ if (errorMessage.includes('Could not resolve to a Repository')) {
364
+ // Try to get the repository name from the git remote
365
+ try {
366
+ const remoteUrl = await runCommand('git config --get remote.origin.url', {
367
+ silent: true,
368
+ });
369
+ // Parse the remote URL to extract owner/repo
370
+ const match = remoteUrl.match(/github\.com[:/](.+?)\/(.+?)(\.git)?$/);
371
+ if (match) {
372
+ const owner = match[1];
373
+ const repo = match[2];
374
+ logger.blank();
375
+ logger.error(`Repository not found on GitHub: ${owner}/${repo}`);
376
+ logger.blank();
377
+ logger.info('The repository exists locally but not on GitHub.');
378
+ logger.info('Please create it first using one of these methods:');
379
+ logger.blank();
380
+ logger.info(' 1. Using GitHub CLI:');
381
+ logger.info(` gh repo create ${owner}/${repo} --source=. --push`);
382
+ logger.blank();
383
+ logger.info(' 2. Via GitHub website:');
384
+ logger.info(' https://github.com/new');
385
+ logger.blank();
386
+ throw new Error(`Repository ${owner}/${repo} does not exist on GitHub`);
387
+ }
388
+ }
389
+ catch (gitError) {
390
+ // If we can't get the remote URL, just rethrow the original error
391
+ }
392
+ }
393
+ throw error;
394
+ }
395
+ };
396
+ try {
397
+ const repoInfo = await retryWithBackoff(fetchRepoInfo, 2, 1000);
398
+ // LRU eviction: remove oldest entry if cache is at max size
399
+ // (do this before adding new entry to maintain max size)
400
+ if (repoInfoCache.size >= REPO_CACHE_MAX_SIZE) {
401
+ let oldestKey = null;
402
+ let oldestTime = Infinity;
403
+ for (const [key, value] of repoInfoCache.entries()) {
404
+ if (value.timestamp < oldestTime) {
405
+ oldestTime = value.timestamp;
406
+ oldestKey = key;
407
+ }
408
+ }
409
+ if (oldestKey) {
410
+ repoInfoCache.delete(oldestKey);
411
+ logger.debug(`Evicted oldest cache entry: ${oldestKey}`);
412
+ }
413
+ }
414
+ // Update cache with fresh data (timestamp after successful retrieval)
415
+ repoInfoCache.set(cacheKey, {
416
+ data: repoInfo,
417
+ timestamp: Date.now(),
418
+ });
419
+ return repoInfo;
420
+ }
421
+ catch (error) {
422
+ // Fallback to cached value if available (even if expired)
423
+ if (cached) {
424
+ logger.warning('Unable to fetch repo info, using cached data (may be stale)');
425
+ return cached.data;
426
+ }
427
+ // No cache available, throw the error
428
+ throw error;
429
+ }
430
+ }
431
+ /**
432
+ * GraphQL query helper with retry logic
433
+ */
434
+ export async function ghGraphQL(query, variables = {}, options = {}) {
435
+ const executeQuery = async () => {
436
+ const isWindows = process.platform === 'win32';
437
+ let cmd;
438
+ if (isWindows) {
439
+ // Windows: Use double quotes with backslash escaping
440
+ const escapedQuery = query
441
+ .replace(/\\/g, '\\\\')
442
+ .replace(/"/g, '\\"')
443
+ .replace(/\n/g, ' ')
444
+ .replace(/\r/g, '');
445
+ cmd = `gh api graphql -f query="${escapedQuery}"`;
446
+ // Add variables
447
+ for (const [key, value] of Object.entries(variables)) {
448
+ if (typeof value === 'number') {
449
+ cmd += ` -F ${key}=${value}`;
450
+ }
451
+ else {
452
+ const escapedValue = String(value)
453
+ .replace(/\\/g, '\\\\')
454
+ .replace(/"/g, '\\"');
455
+ cmd += ` -f ${key}="${escapedValue}"`;
456
+ }
457
+ }
458
+ }
459
+ else {
460
+ // Mac/Linux: Use single quotes (no escaping needed inside single quotes)
461
+ // Just replace single quotes with '\'' to break out and add escaped quote
462
+ const escapedQuery = query
463
+ .replace(/'/g, "'\\''")
464
+ .replace(/\n/g, ' ')
465
+ .replace(/\r/g, '');
466
+ cmd = `gh api graphql -f query='${escapedQuery}'`;
467
+ // Add variables
468
+ for (const [key, value] of Object.entries(variables)) {
469
+ if (typeof value === 'number') {
470
+ cmd += ` -F ${key}=${value}`;
471
+ }
472
+ else {
473
+ const escapedValue = String(value).replace(/'/g, "'\\''");
474
+ cmd += ` -f ${key}='${escapedValue}'`;
475
+ }
476
+ }
477
+ }
478
+ if (!options.suppressErrors) {
479
+ logger.debug(`GraphQL command: ${cmd.substring(0, 200)}...`);
480
+ }
481
+ const output = await runCommand(cmd, {
482
+ suppressErrors: options.suppressErrors,
483
+ });
484
+ return JSON.parse(output);
485
+ };
486
+ // Use retry logic unless explicitly disabled
487
+ if (options.skipRetry) {
488
+ return executeQuery();
489
+ }
490
+ return retryWithBackoff(executeQuery);
491
+ }
492
+ //# sourceMappingURL=github-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-cli.js","sourceRoot":"","sources":["../../src/utils/github-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { IssueStatus, Priority } from '../types/index.js';
2
+ export declare const logger: {
3
+ info: (msg: string) => void;
4
+ success: (msg: string) => void;
5
+ warning: (msg: string) => void;
6
+ error: (msg: string) => void;
7
+ debug: (msg: string) => void;
8
+ /**
9
+ * Print a section header
10
+ */
11
+ section: (title: string) => void;
12
+ /**
13
+ * Display issue with status indicator
14
+ */
15
+ issue: (status: IssueStatus, msg: string) => void;
16
+ /**
17
+ * Display priority with colored emoji
18
+ */
19
+ priority: (level: Priority, emoji: string, msg: string) => void;
20
+ /**
21
+ * Display a list item
22
+ */
23
+ listItem: (msg: string, indent?: number) => void;
24
+ /**
25
+ * Display a numbered list item
26
+ */
27
+ numberedItem: (num: number, msg: string, indent?: number) => void;
28
+ /**
29
+ * Print blank line
30
+ */
31
+ blank: () => void;
32
+ /**
33
+ * Raw console.log passthrough
34
+ */
35
+ log: (...args: unknown[]) => void;
36
+ /**
37
+ * Create a spinner/loading indicator
38
+ * Returns an object with stop() method to clear the spinner
39
+ */
40
+ spinner: (msg: string) => {
41
+ stop: (_finalMsg?: string) => void;
42
+ update: (_newMsg: string) => void;
43
+ };
44
+ };
45
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA2B/D,eAAO,MAAM,MAAM;gBACL,MAAM;mBACH,MAAM;mBACN,MAAM;iBACR,MAAM;iBACN,MAAM;IAOnB;;OAEG;qBACc,MAAM;IAMvB;;OAEG;oBACa,WAAW,OAAO,MAAM;IAQxC;;OAEG;sBACe,QAAQ,SAAS,MAAM,OAAO,MAAM;IAMtD;;OAEG;oBACa,MAAM;IAKtB;;OAEG;wBACiB,MAAM,OAAO,MAAM;IAKvC;;OAEG;;IAGH;;OAEG;mBACY,OAAO,EAAE;IAExB;;;OAGG;mBACY,MAAM;2BAQI,MAAM;0BACP,MAAM;;CA2B/B,CAAC"}