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,58 @@
1
+ import type { IssueStatus } from "../../types/common.schema.js";
2
+ import { type DeploymentStatusResult } from "./DeploymentDetectionService.js";
3
+ interface IssueStatusChange {
4
+ issueNumber: number;
5
+ oldStatus: IssueStatus;
6
+ newStatus: IssueStatus;
7
+ }
8
+ interface DeploymentStatusChange {
9
+ issueNumber: number;
10
+ prNumber?: number;
11
+ deploymentStatus: DeploymentStatusResult;
12
+ }
13
+ /**
14
+ * Batch-optimized service for detecting Copilot status changes
15
+ * Uses a single GraphQL query to fetch all issue data at once
16
+ */
17
+ export declare class BatchCopilotDetectionService {
18
+ /** Maximum number of issues to process per GraphQL query */
19
+ private static readonly BATCH_SIZE;
20
+ private currentUsername;
21
+ private deploymentService;
22
+ constructor();
23
+ /**
24
+ * Detect status changes for multiple issues using batched API calls
25
+ */
26
+ detectStatusChanges(issues: Array<{
27
+ number: number;
28
+ status: IssueStatus;
29
+ }>): Promise<IssueStatusChange[]>;
30
+ /**
31
+ * Detect deployment status for multiple issues using batched API calls
32
+ * Reuses the same data fetched for Copilot status detection
33
+ */
34
+ detectDeploymentStatus(issueNumbers: number[]): Promise<DeploymentStatusChange[]>;
35
+ /**
36
+ * Fetch all issues data in a single GraphQL query
37
+ */
38
+ private fetchAllIssuesData;
39
+ /**
40
+ * Calculate new status based on issue data
41
+ * Same logic as the original CopilotDetectionService but using batch data
42
+ */
43
+ private calculateNewStatus;
44
+ /**
45
+ * Check if Copilot's work is ready for review
46
+ */
47
+ private isCopilotWorkReady;
48
+ /**
49
+ * Check if user commented with @copilot after Copilot's last comment
50
+ */
51
+ private isWaitingForCopilotResponse;
52
+ /**
53
+ * Check if Copilot has responded after user's @copilot mention
54
+ */
55
+ private hasCopilotResponded;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=BatchCopilotDetectionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchCopilotDetectionService.d.ts","sourceRoot":"","sources":["../../../src/services/github/BatchCopilotDetectionService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE1G,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,UAAU,sBAAsB;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C;AA0DD;;;GAGG;AACH,qBAAa,4BAA4B;IACvC,4DAA4D;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IAExC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAA6B;;IAMtD;;OAEG;IACG,mBAAmB,CACvB,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,GACrD,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAsD/B;;;OAGG;IACG,sBAAsB,CAC1B,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAqDpC;;OAEG;YACW,kBAAkB;IA2HhC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAyE1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA2BnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAgC5B"}
@@ -0,0 +1,321 @@
1
+ import { ghGraphQL, getRepoInfo } from "../../utils/github-cli.js";
2
+ import { logger } from "../../utils/logger.js";
3
+ import { STATUS } from "../../types/common.schema.js";
4
+ import { DeploymentDetectionService } from "./DeploymentDetectionService.js";
5
+ /**
6
+ * Batch-optimized service for detecting Copilot status changes
7
+ * Uses a single GraphQL query to fetch all issue data at once
8
+ */
9
+ export class BatchCopilotDetectionService {
10
+ /** Maximum number of issues to process per GraphQL query */
11
+ static BATCH_SIZE = 12;
12
+ currentUsername = null;
13
+ deploymentService;
14
+ constructor() {
15
+ this.deploymentService = new DeploymentDetectionService();
16
+ }
17
+ /**
18
+ * Detect status changes for multiple issues using batched API calls
19
+ */
20
+ async detectStatusChanges(issues) {
21
+ if (issues.length === 0) {
22
+ return [];
23
+ }
24
+ const changes = [];
25
+ const totalBatches = Math.ceil(issues.length / BatchCopilotDetectionService.BATCH_SIZE);
26
+ // Split into batches
27
+ for (let i = 0; i < issues.length; i += BatchCopilotDetectionService.BATCH_SIZE) {
28
+ const batchIndex = Math.floor(i / BatchCopilotDetectionService.BATCH_SIZE) + 1;
29
+ const batch = issues.slice(i, i + BatchCopilotDetectionService.BATCH_SIZE);
30
+ try {
31
+ const repoInfo = await getRepoInfo();
32
+ const issueData = await this.fetchAllIssuesData(repoInfo.owner, repoInfo.name, batch.map((issue) => issue.number));
33
+ for (const issue of batch) {
34
+ const data = issueData.find((d) => d.number === issue.number);
35
+ if (!data) {
36
+ continue;
37
+ }
38
+ const newStatus = this.calculateNewStatus(issue.number, issue.status, data);
39
+ if (newStatus !== issue.status) {
40
+ changes.push({
41
+ issueNumber: issue.number,
42
+ oldStatus: issue.status,
43
+ newStatus,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ catch (error) {
49
+ logger.error(`Batch ${batchIndex}/${totalBatches} failed (${batch.length} issues): ${error instanceof Error ? error.message : String(error)}`);
50
+ // Continue with next batch instead of failing completely
51
+ }
52
+ }
53
+ return changes;
54
+ }
55
+ /**
56
+ * Detect deployment status for multiple issues using batched API calls
57
+ * Reuses the same data fetched for Copilot status detection
58
+ */
59
+ async detectDeploymentStatus(issueNumbers) {
60
+ if (issueNumbers.length === 0) {
61
+ return [];
62
+ }
63
+ const deploymentChanges = [];
64
+ const totalBatches = Math.ceil(issueNumbers.length / BatchCopilotDetectionService.BATCH_SIZE);
65
+ // Split into batches
66
+ for (let i = 0; i < issueNumbers.length; i += BatchCopilotDetectionService.BATCH_SIZE) {
67
+ const batchIndex = Math.floor(i / BatchCopilotDetectionService.BATCH_SIZE) + 1;
68
+ const batch = issueNumbers.slice(i, i + BatchCopilotDetectionService.BATCH_SIZE);
69
+ try {
70
+ const repoInfo = await getRepoInfo();
71
+ const issueData = await this.fetchAllIssuesData(repoInfo.owner, repoInfo.name, batch);
72
+ for (const data of issueData) {
73
+ // Check deployment status from PR comments
74
+ const copilotPR = data.linkedPRs[0]; // Get first Copilot PR
75
+ if (!copilotPR) {
76
+ // No PR found, skip deployment status check
77
+ // Don't track deployment status for issues without PRs
78
+ continue;
79
+ }
80
+ // Detect deployment status from PR comments
81
+ const deploymentStatus = this.deploymentService.detectDeploymentStatus(copilotPR.comments);
82
+ deploymentChanges.push({
83
+ issueNumber: data.number,
84
+ prNumber: copilotPR.number,
85
+ deploymentStatus,
86
+ });
87
+ }
88
+ }
89
+ catch (error) {
90
+ logger.error(`Batch ${batchIndex}/${totalBatches} failed for deployment detection (${batch.length} issues): ${error instanceof Error ? error.message : String(error)}`);
91
+ // Continue with next batch instead of failing completely
92
+ }
93
+ }
94
+ return deploymentChanges;
95
+ }
96
+ /**
97
+ * Fetch all issues data in a single GraphQL query
98
+ */
99
+ async fetchAllIssuesData(owner, repo, issueNumbers) {
100
+ // Build GraphQL query with aliases for each issue
101
+ const issueQueries = issueNumbers
102
+ .map((num) => `
103
+ issue${num}: issue(number: ${num}) {
104
+ number
105
+ assignees(first: 10) {
106
+ nodes {
107
+ login
108
+ }
109
+ }
110
+ timelineItems(first: 20, itemTypes: [CROSS_REFERENCED_EVENT]) {
111
+ nodes {
112
+ __typename
113
+ ... on CrossReferencedEvent {
114
+ source {
115
+ ... on PullRequest {
116
+ number
117
+ author {
118
+ login
119
+ }
120
+ reviewRequests(first: 10) {
121
+ nodes {
122
+ requestedReviewer {
123
+ ... on User {
124
+ login
125
+ }
126
+ }
127
+ }
128
+ }
129
+ comments(last: 20) {
130
+ nodes {
131
+ author {
132
+ login
133
+ }
134
+ body
135
+ createdAt
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ `)
145
+ .join("\n");
146
+ const query = `
147
+ query {
148
+ repository(owner: "${owner}", name: "${repo}") {
149
+ ${issueQueries}
150
+ }
151
+ viewer {
152
+ login
153
+ }
154
+ }
155
+ `;
156
+ const response = await ghGraphQL(query);
157
+ // Cache current username
158
+ this.currentUsername = response.data.viewer.login;
159
+ // Parse response into IssueData array
160
+ const issueDataList = [];
161
+ const repository = response.data.repository;
162
+ for (const issueNumber of issueNumbers) {
163
+ const issueKey = `issue${issueNumber}`;
164
+ const issueNode = repository[issueKey];
165
+ if (!issueNode) {
166
+ continue;
167
+ }
168
+ const assignees = issueNode.assignees.nodes.map((node) => node.login);
169
+ // Extract PRs from timeline
170
+ const linkedPRs = [];
171
+ for (const item of issueNode.timelineItems.nodes) {
172
+ if (item.__typename === "CrossReferencedEvent" &&
173
+ item.source &&
174
+ "number" in item.source) {
175
+ const pr = item.source;
176
+ const prAuthor = pr.author.login.toLowerCase();
177
+ // Only consider PRs created by Copilot
178
+ if (prAuthor.includes("copilot")) {
179
+ linkedPRs.push({
180
+ number: pr.number,
181
+ author: pr.author.login,
182
+ reviewRequests: pr.reviewRequests.nodes
183
+ .map((rr) => rr.requestedReviewer?.login)
184
+ .filter((login) => !!login),
185
+ comments: pr.comments.nodes.map((c) => ({
186
+ author: c.author.login,
187
+ body: c.body,
188
+ createdAt: c.createdAt,
189
+ })),
190
+ });
191
+ }
192
+ }
193
+ }
194
+ issueDataList.push({
195
+ number: issueNode.number,
196
+ assignees,
197
+ linkedPRs,
198
+ });
199
+ }
200
+ return issueDataList;
201
+ }
202
+ /**
203
+ * Calculate new status based on issue data
204
+ * Same logic as the original CopilotDetectionService but using batch data
205
+ */
206
+ calculateNewStatus(issueNumber, currentStatus, data) {
207
+ // Check if Copilot is assigned (for unassigned → initialWaiting)
208
+ if (currentStatus === STATUS.UNASSIGNED) {
209
+ const isCopilotAssigned = data.assignees.some((assignee) => assignee.toLowerCase().includes("copilot"));
210
+ if (isCopilotAssigned) {
211
+ logger.debug(`Copilot detected on issue #${issueNumber}, transitioning to initialWaiting`);
212
+ return STATUS.INITIAL_WAITING;
213
+ }
214
+ return currentStatus;
215
+ }
216
+ // Only check completion for initialWaiting, ready, or waiting
217
+ if (currentStatus !== STATUS.INITIAL_WAITING &&
218
+ currentStatus !== STATUS.READY &&
219
+ currentStatus !== STATUS.WAITING) {
220
+ return currentStatus;
221
+ }
222
+ // Find Copilot's PR
223
+ const copilotPR = data.linkedPRs[0]; // Take the first Copilot PR
224
+ if (!copilotPR) {
225
+ return currentStatus;
226
+ }
227
+ // Scenario 1: Check if Copilot requested review OR finished work (initialWaiting → ready)
228
+ if (currentStatus === STATUS.INITIAL_WAITING) {
229
+ const isReady = this.isCopilotWorkReady(copilotPR);
230
+ if (isReady) {
231
+ logger.debug(`PR #${copilotPR.number} ready for review, transitioning to ready`);
232
+ return STATUS.READY;
233
+ }
234
+ return currentStatus;
235
+ }
236
+ // Scenario 1.5: Check if user commented with @copilot on ready PR (ready → waiting)
237
+ if (currentStatus === STATUS.READY) {
238
+ const isWaitingForCopilot = this.isWaitingForCopilotResponse(copilotPR);
239
+ if (isWaitingForCopilot) {
240
+ logger.debug(`User requested changes from Copilot on PR #${copilotPR.number}, transitioning to waiting`);
241
+ return STATUS.WAITING;
242
+ }
243
+ return currentStatus;
244
+ }
245
+ // Scenario 2: Check if Copilot responded (waiting → ready)
246
+ if (currentStatus === STATUS.WAITING) {
247
+ const hasCopilotResponded = this.hasCopilotResponded(copilotPR);
248
+ if (hasCopilotResponded) {
249
+ logger.debug(`Copilot responded on PR #${copilotPR.number}, transitioning to ready`);
250
+ return STATUS.READY;
251
+ }
252
+ return currentStatus;
253
+ }
254
+ return currentStatus;
255
+ }
256
+ /**
257
+ * Check if Copilot's work is ready for review
258
+ */
259
+ isCopilotWorkReady(pr) {
260
+ // Method 1: Check for explicit review requests
261
+ if (pr.reviewRequests.length > 0) {
262
+ return true;
263
+ }
264
+ // Method 2: Check PR comments for "finished work" message from Copilot
265
+ const hasFinishedWorkComment = pr.comments.some((comment) => comment.author.toLowerCase().includes("copilot") &&
266
+ comment.body.toLowerCase().includes("finished work"));
267
+ return hasFinishedWorkComment;
268
+ }
269
+ /**
270
+ * Check if user commented with @copilot after Copilot's last comment
271
+ */
272
+ isWaitingForCopilotResponse(pr) {
273
+ if (!this.currentUsername) {
274
+ return false;
275
+ }
276
+ // Find the last Copilot comment timestamp
277
+ let lastCopilotTime = null;
278
+ for (const comment of pr.comments) {
279
+ if (comment.author.toLowerCase().includes("copilot")) {
280
+ lastCopilotTime = comment.createdAt;
281
+ }
282
+ }
283
+ // Check if user commented with @copilot after Copilot's last comment
284
+ for (const comment of pr.comments) {
285
+ if (comment.author === this.currentUsername &&
286
+ comment.body.toLowerCase().includes("@copilot") &&
287
+ (!lastCopilotTime || comment.createdAt > lastCopilotTime)) {
288
+ return true;
289
+ }
290
+ }
291
+ return false;
292
+ }
293
+ /**
294
+ * Check if Copilot has responded after user's @copilot mention
295
+ */
296
+ hasCopilotResponded(pr) {
297
+ if (!this.currentUsername) {
298
+ return false;
299
+ }
300
+ // Find the last user comment with @copilot
301
+ let lastUserCopilotMentionTime = null;
302
+ for (const comment of pr.comments) {
303
+ if (comment.author === this.currentUsername &&
304
+ comment.body.toLowerCase().includes("@copilot")) {
305
+ lastUserCopilotMentionTime = comment.createdAt;
306
+ }
307
+ }
308
+ if (!lastUserCopilotMentionTime) {
309
+ return false;
310
+ }
311
+ // Check if Copilot commented after user's @copilot mention
312
+ for (const comment of pr.comments) {
313
+ if (comment.author.toLowerCase().includes("copilot") &&
314
+ comment.createdAt > lastUserCopilotMentionTime) {
315
+ return true;
316
+ }
317
+ }
318
+ return false;
319
+ }
320
+ }
321
+ //# sourceMappingURL=BatchCopilotDetectionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchCopilotDetectionService.js","sourceRoot":"","sources":["../../../src/services/github/BatchCopilotDetectionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { IssueStatus } from "../../types/common.schema.js";
2
+ /**
3
+ * Service for detecting Copilot status changes on issues
4
+ * Implements the same logic as bash version for status transitions
5
+ */
6
+ export declare class CopilotDetectionService {
7
+ /**
8
+ * Detect if Copilot has completed work or if status should be updated
9
+ * Based on bash version: scripts/hubLaunch/lib/interactive-lib.sh:detect_copilot_completion
10
+ *
11
+ * Status transitions:
12
+ * - unassigned → initialWaiting: When Copilot gets assigned
13
+ * - initialWaiting → ready: When Copilot requests review or marks PR ready
14
+ * - ready → waiting: When user comments with @copilot
15
+ * - waiting → ready: When Copilot responds to user's request
16
+ */
17
+ detectStatusChange(issueNumber: number, currentStatus: IssueStatus): Promise<IssueStatus>;
18
+ /**
19
+ * Check if Copilot is assigned to the issue
20
+ */
21
+ private isCopilotAssigned;
22
+ /**
23
+ * Find PR created by Copilot for this issue
24
+ */
25
+ private findCopilotPR;
26
+ /**
27
+ * Check if Copilot's work is ready for review
28
+ * Checks for: review requests, ready_for_review event, or "finished work" comment
29
+ */
30
+ private isCopilotWorkReady;
31
+ /**
32
+ * Check if user commented with @copilot after Copilot's last comment
33
+ */
34
+ private isWaitingForCopilotResponse;
35
+ /**
36
+ * Check if Copilot has responded after user's @copilot mention
37
+ */
38
+ private hasCopilotResponded;
39
+ }
40
+ //# sourceMappingURL=CopilotDetectionService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotDetectionService.d.ts","sourceRoot":"","sources":["../../../src/services/github/CopilotDetectionService.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE;;;GAGG;AACH,qBAAa,uBAAuB;IAClC;;;;;;;;;OASG;IACG,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,WAAW,GACzB,OAAO,CAAC,WAAW,CAAC;IA2EvB;;OAEG;YACW,iBAAiB;IAsB/B;;OAEG;YACW,aAAa;IAwB3B;;;OAGG;YACW,kBAAkB;IA6ChC;;OAEG;YACW,2BAA2B;IAoEzC;;OAEG;YACW,mBAAmB;CAyElC"}