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,280 @@
1
+ import { runGh } from "../../utils/github-cli.js";
2
+ import { logger } from "../../utils/logger.js";
3
+ import { STATUS } from "../../types/common.schema.js";
4
+ /**
5
+ * Service for detecting Copilot status changes on issues
6
+ * Implements the same logic as bash version for status transitions
7
+ */
8
+ export class CopilotDetectionService {
9
+ /**
10
+ * Detect if Copilot has completed work or if status should be updated
11
+ * Based on bash version: scripts/hubLaunch/lib/interactive-lib.sh:detect_copilot_completion
12
+ *
13
+ * Status transitions:
14
+ * - unassigned → initialWaiting: When Copilot gets assigned
15
+ * - initialWaiting → ready: When Copilot requests review or marks PR ready
16
+ * - ready → waiting: When user comments with @copilot
17
+ * - waiting → ready: When Copilot responds to user's request
18
+ */
19
+ async detectStatusChange(issueNumber, currentStatus) {
20
+ try {
21
+ // Check if Copilot is assigned (for unassigned → initialWaiting)
22
+ if (currentStatus === STATUS.UNASSIGNED) {
23
+ const isCopilotAssigned = await this.isCopilotAssigned(issueNumber);
24
+ if (isCopilotAssigned) {
25
+ logger.debug(`Copilot detected on issue #${issueNumber}, transitioning to initialWaiting`);
26
+ return STATUS.INITIAL_WAITING;
27
+ }
28
+ return currentStatus;
29
+ }
30
+ // Only check completion for initialWaiting, ready, or waiting
31
+ if (currentStatus !== STATUS.INITIAL_WAITING &&
32
+ currentStatus !== STATUS.READY &&
33
+ currentStatus !== STATUS.WAITING) {
34
+ return currentStatus;
35
+ }
36
+ // Check if there's a PR linked to this issue
37
+ const prNumber = await this.findCopilotPR(issueNumber);
38
+ if (!prNumber) {
39
+ return currentStatus;
40
+ }
41
+ // Scenario 1: Check if Copilot requested review OR finished work (initialWaiting → ready)
42
+ if (currentStatus === STATUS.INITIAL_WAITING) {
43
+ const isReady = await this.isCopilotWorkReady(prNumber);
44
+ if (isReady) {
45
+ logger.debug(`PR #${prNumber} ready for review, transitioning to ready`);
46
+ return STATUS.READY;
47
+ }
48
+ return currentStatus;
49
+ }
50
+ // Scenario 1.5: Check if user commented with @copilot on ready PR (ready → waiting)
51
+ if (currentStatus === STATUS.READY) {
52
+ const isWaitingForCopilot = await this.isWaitingForCopilotResponse(prNumber);
53
+ if (isWaitingForCopilot) {
54
+ logger.debug(`User requested changes from Copilot on PR #${prNumber}, transitioning to waiting`);
55
+ return STATUS.WAITING;
56
+ }
57
+ return currentStatus;
58
+ }
59
+ // Scenario 2: Check if Copilot responded (waiting → ready)
60
+ if (currentStatus === STATUS.WAITING) {
61
+ const hasCopilotResponded = await this.hasCopilotResponded(prNumber);
62
+ if (hasCopilotResponded) {
63
+ logger.debug(`Copilot responded on PR #${prNumber}, transitioning to ready`);
64
+ return STATUS.READY;
65
+ }
66
+ return currentStatus;
67
+ }
68
+ return currentStatus;
69
+ }
70
+ catch (error) {
71
+ logger.debug(`Error detecting status change for issue #${issueNumber}: ${String(error)}`);
72
+ return currentStatus;
73
+ }
74
+ }
75
+ /**
76
+ * Check if Copilot is assigned to the issue
77
+ */
78
+ async isCopilotAssigned(issueNumber) {
79
+ try {
80
+ const result = await runGh([
81
+ "issue",
82
+ "view",
83
+ issueNumber.toString(),
84
+ "--json",
85
+ "assignees",
86
+ "--jq",
87
+ ".assignees[].login",
88
+ ], { silent: true });
89
+ return result.toLowerCase().includes("copilot");
90
+ }
91
+ catch (error) {
92
+ logger.debug(`Error checking Copilot assignment: ${String(error)}`);
93
+ return false;
94
+ }
95
+ }
96
+ /**
97
+ * Find PR created by Copilot for this issue
98
+ */
99
+ async findCopilotPR(issueNumber) {
100
+ try {
101
+ const result = await runGh([
102
+ "pr",
103
+ "list",
104
+ "--search",
105
+ `fixes #${issueNumber}`,
106
+ "--json",
107
+ "number,author",
108
+ "--jq",
109
+ `.[] | select(.author.login | contains("copilot") or contains("Copilot")) | .number`,
110
+ ], { silent: true });
111
+ const prNumber = parseInt(result.trim(), 10);
112
+ return isNaN(prNumber) ? null : prNumber;
113
+ }
114
+ catch (error) {
115
+ logger.debug(`Error finding Copilot PR: ${String(error)}`);
116
+ return null;
117
+ }
118
+ }
119
+ /**
120
+ * Check if Copilot's work is ready for review
121
+ * Checks for: review requests, ready_for_review event, or "finished work" comment
122
+ */
123
+ async isCopilotWorkReady(prNumber) {
124
+ try {
125
+ // Method 1: Check for explicit review requests
126
+ const reviewRequests = await runGh([
127
+ "pr",
128
+ "view",
129
+ prNumber.toString(),
130
+ "--json",
131
+ "reviewRequests",
132
+ "--jq",
133
+ ".reviewRequests[].login",
134
+ ], { silent: true });
135
+ if (reviewRequests.trim()) {
136
+ return true;
137
+ }
138
+ // Method 2: Check PR comments for "finished work" message from Copilot
139
+ const comments = await runGh([
140
+ "pr",
141
+ "view",
142
+ prNumber.toString(),
143
+ "--json",
144
+ "comments",
145
+ "--jq",
146
+ `.comments[] | select(.author.login | contains("copilot") or contains("Copilot")) | .body`,
147
+ ], { silent: true });
148
+ if (comments.toLowerCase().includes("finished work")) {
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+ catch (error) {
154
+ logger.debug(`Error checking if Copilot work is ready: ${String(error)}`);
155
+ return false;
156
+ }
157
+ }
158
+ /**
159
+ * Check if user commented with @copilot after Copilot's last comment
160
+ */
161
+ async isWaitingForCopilotResponse(prNumber) {
162
+ try {
163
+ // Get current user
164
+ const currentUser = await runGh(["api", "user", "--jq", ".login"], {
165
+ silent: true,
166
+ });
167
+ const username = currentUser.trim();
168
+ if (!username) {
169
+ return false;
170
+ }
171
+ // Get PR comments with timestamps
172
+ const commentsJson = await runGh([
173
+ "pr",
174
+ "view",
175
+ prNumber.toString(),
176
+ "--json",
177
+ "comments",
178
+ "--jq",
179
+ `.comments[] | "\(.author.login)\t\(.createdAt)\t\(.body)"`,
180
+ ], { silent: true });
181
+ const comments = commentsJson
182
+ .trim()
183
+ .split("\n")
184
+ .filter((line) => line);
185
+ // Find the last Copilot comment timestamp
186
+ let lastCopilotTime = null;
187
+ for (const line of comments) {
188
+ const parts = line.split("\t");
189
+ const author = parts[0];
190
+ const timestamp = parts[1];
191
+ if (author && author.toLowerCase().includes("copilot") && timestamp) {
192
+ lastCopilotTime = timestamp;
193
+ }
194
+ }
195
+ // Check if user commented with @copilot after Copilot's last comment
196
+ for (const line of comments) {
197
+ const parts = line.split("\t");
198
+ const author = parts[0];
199
+ const timestamp = parts[1];
200
+ const body = parts[2];
201
+ if (author === username &&
202
+ body &&
203
+ body.toLowerCase().includes("@copilot") &&
204
+ timestamp &&
205
+ (!lastCopilotTime || timestamp > lastCopilotTime)) {
206
+ return true;
207
+ }
208
+ }
209
+ return false;
210
+ }
211
+ catch (error) {
212
+ logger.debug(`Error checking if waiting for Copilot: ${String(error)}`);
213
+ return false;
214
+ }
215
+ }
216
+ /**
217
+ * Check if Copilot has responded after user's @copilot mention
218
+ */
219
+ async hasCopilotResponded(prNumber) {
220
+ try {
221
+ // Get current user
222
+ const currentUser = await runGh(["api", "user", "--jq", ".login"], {
223
+ silent: true,
224
+ });
225
+ const username = currentUser.trim();
226
+ if (!username) {
227
+ return false;
228
+ }
229
+ // Get PR comments with timestamps
230
+ const commentsJson = await runGh([
231
+ "pr",
232
+ "view",
233
+ prNumber.toString(),
234
+ "--json",
235
+ "comments",
236
+ "--jq",
237
+ `.comments[] | "\(.author.login)\t\(.createdAt)\t\(.body)"`,
238
+ ], { silent: true });
239
+ const comments = commentsJson
240
+ .trim()
241
+ .split("\n")
242
+ .filter((line) => line);
243
+ // Find the last user comment with @copilot
244
+ let lastUserCopilotMentionTime = null;
245
+ for (const line of comments) {
246
+ const parts = line.split("\t");
247
+ const author = parts[0];
248
+ const timestamp = parts[1];
249
+ const body = parts[2];
250
+ if (author === username &&
251
+ body &&
252
+ body.toLowerCase().includes("@copilot") &&
253
+ timestamp) {
254
+ lastUserCopilotMentionTime = timestamp;
255
+ }
256
+ }
257
+ if (!lastUserCopilotMentionTime) {
258
+ return false;
259
+ }
260
+ // Check if Copilot commented after user's @copilot mention
261
+ for (const line of comments) {
262
+ const parts = line.split("\t");
263
+ const author = parts[0];
264
+ const timestamp = parts[1];
265
+ if (author &&
266
+ author.toLowerCase().includes("copilot") &&
267
+ timestamp &&
268
+ timestamp > lastUserCopilotMentionTime) {
269
+ return true;
270
+ }
271
+ }
272
+ return false;
273
+ }
274
+ catch (error) {
275
+ logger.debug(`Error checking if Copilot responded: ${String(error)}`);
276
+ return false;
277
+ }
278
+ }
279
+ }
280
+ //# sourceMappingURL=CopilotDetectionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotDetectionService.js","sourceRoot":"","sources":["../../../src/services/github/CopilotDetectionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Config } from '../../types/index.js';
2
+ /**
3
+ * Service for GitHub Copilot operations
4
+ * Single Responsibility: Copilot-specific functionality
5
+ */
6
+ export declare class CopilotService {
7
+ constructor(_config?: Config);
8
+ /**
9
+ * Assign GitHub Copilot to an issue using GitHub GraphQL API
10
+ * This uses the gh CLI to execute GraphQL queries, avoiding browser automation
11
+ * which GitHub blocks with anti-bot detection.
12
+ */
13
+ assignToIssue(issueNumber: number): Promise<boolean>;
14
+ /**
15
+ * Check if Copilot is assigned to an issue
16
+ */
17
+ checkAssignment(issueNumber: number): Promise<boolean>;
18
+ /**
19
+ * Request Copilot review on a PR
20
+ */
21
+ requestReview(prNumber: number): Promise<void>;
22
+ /**
23
+ * Add a comment for Copilot to respond to
24
+ */
25
+ addCopilotComment(issueNumber: number, message: string): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=CopilotService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotService.d.ts","sourceRoot":"","sources":["../../../src/services/github/CopilotService.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAwDnD;;;GAGG;AACH,qBAAa,cAAc;gBAGb,OAAO,CAAC,EAAE,MAAM;IAE5B;;;;OAIG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8J1D;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB5D;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD;;OAEG;IACG,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB7E"}
@@ -0,0 +1,249 @@
1
+ import { logger } from '../../utils/logger.js';
2
+ import { ghApi, getRepoInfo } from '../../utils/github-cli.js';
3
+ import { runCommand } from '../../utils/shell.js';
4
+ import { writeFileSync, unlinkSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { tmpdir } from 'os';
7
+ /**
8
+ * Helper to run GraphQL query via temp file (cross-platform: Windows + Unix)
9
+ */
10
+ async function runGraphQL(request, headers) {
11
+ const timestamp = Date.now();
12
+ const tempFile = join(tmpdir(), `graphql-${timestamp}.json`);
13
+ writeFileSync(tempFile, JSON.stringify(request));
14
+ try {
15
+ const isWindows = process.platform === 'win32';
16
+ let result;
17
+ if (isWindows) {
18
+ // Windows: Write a PowerShell script to avoid argument parsing issues
19
+ const psScript = join(tmpdir(), `graphql-${timestamp}.ps1`);
20
+ const headerArgs = headers?.map((h) => `-H "${h}"`).join(' ') || '';
21
+ const scriptContent = `$content = Get-Content -Path '${tempFile.replace(/\\/g, '\\\\')}' -Raw; $content | gh api graphql ${headerArgs} --input -`;
22
+ writeFileSync(psScript, scriptContent);
23
+ try {
24
+ result = await runCommand(`powershell -ExecutionPolicy Bypass -File "${psScript}"`, { silent: true });
25
+ }
26
+ finally {
27
+ try {
28
+ unlinkSync(psScript);
29
+ }
30
+ catch {
31
+ /* ignore */
32
+ }
33
+ }
34
+ }
35
+ else {
36
+ // Unix (macOS/Linux): use cat
37
+ const headerArgs = headers?.map((h) => `-H "${h}"`).join(' ') || '';
38
+ result = await runCommand(`cat "${tempFile}" | gh api graphql ${headerArgs} --input -`, { silent: true });
39
+ }
40
+ return result;
41
+ }
42
+ finally {
43
+ try {
44
+ unlinkSync(tempFile);
45
+ }
46
+ catch {
47
+ /* ignore */
48
+ }
49
+ }
50
+ }
51
+ /**
52
+ * Service for GitHub Copilot operations
53
+ * Single Responsibility: Copilot-specific functionality
54
+ */
55
+ export class CopilotService {
56
+ // Config kept for backwards compatibility with existing call sites
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
+ constructor(_config) { }
59
+ /**
60
+ * Assign GitHub Copilot to an issue using GitHub GraphQL API
61
+ * This uses the gh CLI to execute GraphQL queries, avoiding browser automation
62
+ * which GitHub blocks with anti-bot detection.
63
+ */
64
+ async assignToIssue(issueNumber) {
65
+ try {
66
+ const repo = await getRepoInfo();
67
+ logger.info(`Assigning Copilot to: ${repo.owner}/${repo.name}#${issueNumber}`);
68
+ // Step 1: Find the copilot-swe-agent bot in suggested actors
69
+ logger.debug('Finding Copilot bot in suggested actors...');
70
+ const suggestedActorsResult = await runGraphQL({
71
+ query: `query($owner: String!, $name: String!) {
72
+ repository(owner: $owner, name: $name) {
73
+ id
74
+ suggestedActors(first: 100, capabilities: CAN_BE_ASSIGNED) {
75
+ nodes {
76
+ ... on Bot {
77
+ id
78
+ login
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }`,
84
+ variables: {
85
+ owner: repo.owner,
86
+ name: repo.name,
87
+ },
88
+ });
89
+ const suggestedData = JSON.parse(suggestedActorsResult);
90
+ const suggestedActors = suggestedData.data?.repository?.suggestedActors?.nodes || [];
91
+ const repositoryId = suggestedData.data?.repository?.id;
92
+ // Find copilot-swe-agent
93
+ const copilotBot = suggestedActors.find((actor) => actor.login === 'copilot-swe-agent');
94
+ if (!copilotBot) {
95
+ logger.error("Copilot isn't available as an assignee for this repository.");
96
+ logger.info('Please ensure:');
97
+ logger.info(' 1. You have a Copilot Pro, Pro+, Business, or Enterprise plan');
98
+ logger.info(' 2. Copilot coding agent is enabled for this repository');
99
+ logger.info('');
100
+ logger.info('For more info: https://docs.github.com/en/copilot/using-github-copilot/using-copilot-coding-agent-to-work-on-tasks/about-assigning-tasks-to-copilot');
101
+ return false;
102
+ }
103
+ logger.debug(`Found Copilot bot with ID: ${copilotBot.id}`);
104
+ // Step 2: Get issue ID and existing assignees
105
+ logger.debug('Getting issue details...');
106
+ const issueResult = await runGraphQL({
107
+ query: `query($owner: String!, $name: String!, $number: Int!) {
108
+ repository(owner: $owner, name: $name) {
109
+ issue(number: $number) {
110
+ id
111
+ assignees(first: 100) {
112
+ nodes {
113
+ id
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }`,
119
+ variables: {
120
+ owner: repo.owner,
121
+ name: repo.name,
122
+ number: issueNumber,
123
+ },
124
+ });
125
+ const issueData = JSON.parse(issueResult);
126
+ const issue = issueData.data?.repository?.issue;
127
+ if (!issue) {
128
+ logger.error(`Issue #${issueNumber} not found`);
129
+ return false;
130
+ }
131
+ // Build assignee IDs list (existing + copilot)
132
+ const existingAssigneeIds = (issue.assignees?.nodes || []).map((node) => node.id);
133
+ const assigneeIds = [...existingAssigneeIds, copilotBot.id];
134
+ // Step 3: Assign Copilot using updateIssue mutation with agent assignment
135
+ logger.debug('Assigning Copilot to issue...');
136
+ const mutationResult = await runGraphQL({
137
+ query: `mutation($issueId: ID!, $assigneeIds: [ID!]!, $repoId: ID!) {
138
+ updateIssue(input: {
139
+ id: $issueId
140
+ assigneeIds: $assigneeIds
141
+ agentAssignment: {
142
+ customAgent: ""
143
+ customInstructions: ""
144
+ targetRepositoryId: $repoId
145
+ }
146
+ }) {
147
+ issue {
148
+ id
149
+ number
150
+ url
151
+ }
152
+ }
153
+ }`,
154
+ variables: {
155
+ issueId: issue.id,
156
+ assigneeIds: assigneeIds,
157
+ repoId: repositoryId,
158
+ },
159
+ }, ['GraphQL-Features: issues_copilot_assignment_api_support']);
160
+ const mutationData = JSON.parse(mutationResult);
161
+ if (mutationData.errors) {
162
+ logger.error('Failed to assign Copilot:');
163
+ for (const error of mutationData.errors) {
164
+ logger.error(` ${error.message}`);
165
+ }
166
+ return false;
167
+ }
168
+ const updatedIssue = mutationData.data?.updateIssue?.issue;
169
+ if (updatedIssue) {
170
+ logger.success(`Successfully assigned Copilot to issue #${updatedIssue.number}!`);
171
+ logger.info(`Copilot will now work on this issue and create a PR.`);
172
+ logger.info(`Track progress at: ${updatedIssue.url}`);
173
+ return true;
174
+ }
175
+ return false;
176
+ }
177
+ catch (error) {
178
+ const errorMsg = error instanceof Error ? error.message : String(error);
179
+ logger.error(`Error assigning Copilot: ${errorMsg}`);
180
+ // Check for common issues
181
+ if (errorMsg.includes('gh: command not found') || errorMsg.includes("'gh' is not recognized")) {
182
+ logger.info('');
183
+ logger.info('The GitHub CLI (gh) is required for Copilot assignment.');
184
+ logger.info('Install it from: https://cli.github.com/');
185
+ }
186
+ else if (errorMsg.includes('not logged in') || errorMsg.includes('authentication')) {
187
+ logger.info('');
188
+ logger.info('Please authenticate with GitHub CLI:');
189
+ logger.info(' gh auth login');
190
+ }
191
+ return false;
192
+ }
193
+ }
194
+ /**
195
+ * Check if Copilot is assigned to an issue
196
+ */
197
+ async checkAssignment(issueNumber) {
198
+ try {
199
+ const repo = await getRepoInfo();
200
+ const issue = await ghApi(`/repos/${repo.owner}/${repo.name}/issues/${issueNumber}`);
201
+ return issue.assignees.some((a) => a.login.toLowerCase().includes('copilot'));
202
+ }
203
+ catch (error) {
204
+ logger.debug(`Error checking Copilot assignment: ${String(error)}`);
205
+ return false;
206
+ }
207
+ }
208
+ /**
209
+ * Request Copilot review on a PR
210
+ */
211
+ async requestReview(prNumber) {
212
+ const repo = await getRepoInfo();
213
+ logger.info(`Requesting Copilot review on PR #${prNumber}...`);
214
+ try {
215
+ await ghApi(`/repos/${repo.owner}/${repo.name}/issues/${prNumber}/comments`, {
216
+ method: 'POST',
217
+ fields: {
218
+ body: '@github-copilot review',
219
+ },
220
+ });
221
+ logger.success(`Requested Copilot review on PR #${prNumber}`);
222
+ }
223
+ catch (error) {
224
+ logger.error(`Error requesting Copilot review: ${String(error)}`);
225
+ throw error;
226
+ }
227
+ }
228
+ /**
229
+ * Add a comment for Copilot to respond to
230
+ */
231
+ async addCopilotComment(issueNumber, message) {
232
+ const repo = await getRepoInfo();
233
+ logger.info(`Adding Copilot comment to issue #${issueNumber}...`);
234
+ try {
235
+ await ghApi(`/repos/${repo.owner}/${repo.name}/issues/${issueNumber}/comments`, {
236
+ method: 'POST',
237
+ fields: {
238
+ body: `@github-copilot ${message}`,
239
+ },
240
+ });
241
+ logger.success(`Added Copilot comment to issue #${issueNumber}`);
242
+ }
243
+ catch (error) {
244
+ logger.error(`Error adding Copilot comment: ${String(error)}`);
245
+ throw error;
246
+ }
247
+ }
248
+ }
249
+ //# sourceMappingURL=CopilotService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotService.js","sourceRoot":"","sources":["../../../src/services/github/CopilotService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface DeploymentStatusResult {
2
+ status: "pending" | "success" | "failed";
3
+ timestamp?: string;
4
+ }
5
+ interface Comment {
6
+ author: string;
7
+ body: string;
8
+ createdAt: string;
9
+ }
10
+ /**
11
+ * Service for detecting deployment status from PR comments
12
+ * Parses Vercel bot comments to determine deployment status
13
+ */
14
+ export declare class DeploymentDetectionService {
15
+ /**
16
+ * Detect deployment status from PR comments
17
+ * Looks for Vercel bot comments indicating deployment success or failure
18
+ */
19
+ detectDeploymentStatus(comments: Comment[]): DeploymentStatusResult;
20
+ /**
21
+ * Check if we should notify Copilot about a deployment failure
22
+ *
23
+ * Returns true if:
24
+ * - Deployment status is "failed" AND
25
+ * - Either no previous notification exists OR
26
+ * - The deployment failure timestamp is newer than the last notification timestamp
27
+ *
28
+ * This allows multiple notifications if deployment fails again after a fix attempt,
29
+ * while preventing duplicate notifications for the same failure.
30
+ *
31
+ * @param deploymentStatus The current deployment status with optional timestamp
32
+ * @param deploymentNotifiedAt ISO timestamp of when Copilot was last notified
33
+ * @returns true if Copilot should be notified about this failure
34
+ */
35
+ shouldNotifyCopilot(deploymentStatus: DeploymentStatusResult, deploymentNotifiedAt?: string): boolean;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=DeploymentDetectionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeploymentDetectionService.d.ts","sourceRoot":"","sources":["../../../src/services/github/DeploymentDetectionService.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,OAAO;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,0BAA0B;IACrC;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,sBAAsB;IA4EnE;;;;;;;;;;;;;;OAcG;IACH,mBAAmB,CACjB,gBAAgB,EAAE,sBAAsB,EACxC,oBAAoB,CAAC,EAAE,MAAM,GAC5B,OAAO;CA2BX"}