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.
- package/CHANGELOG.md +144 -0
- package/README.md +195 -0
- package/bin/hublaunch +20 -0
- package/dist/commands/checkout.d.ts +7 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +164 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/clean.d.ts +7 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +206 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/close.d.ts +7 -0
- package/dist/commands/close.d.ts.map +1 -0
- package/dist/commands/close.js +109 -0
- package/dist/commands/close.js.map +1 -0
- package/dist/commands/create.d.ts +7 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +367 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/diff.d.ts +7 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +98 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/execute.d.ts +7 -0
- package/dist/commands/execute.d.ts.map +1 -0
- package/dist/commands/execute.js +376 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +1243 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/interactive.d.ts +12 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +1071 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/launch.d.ts +16 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +684 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/login.d.ts +40 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +469 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +22 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +105 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/merge.d.ts +7 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +240 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/preview.d.ts +7 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +160 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/project.d.ts +18 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +352 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/respond.d.ts +7 -0
- package/dist/commands/respond.d.ts.map +1 -0
- package/dist/commands/respond.js +112 -0
- package/dist/commands/respond.js.map +1 -0
- package/dist/commands/setPriority.d.ts +7 -0
- package/dist/commands/setPriority.d.ts.map +1 -0
- package/dist/commands/setPriority.js +112 -0
- package/dist/commands/setPriority.js.map +1 -0
- package/dist/commands/track.d.ts +7 -0
- package/dist/commands/track.d.ts.map +1 -0
- package/dist/commands/track.js +140 -0
- package/dist/commands/track.js.map +1 -0
- package/dist/commands/upload.d.ts +21 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +145 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/view.d.ts +7 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +168 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/watch.d.ts +7 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +438 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/worktree.d.ts +7 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +122 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/command-names.d.ts +16 -0
- package/dist/config/command-names.d.ts.map +1 -0
- package/dist/config/command-names.js +17 -0
- package/dist/config/command-names.js.map +1 -0
- package/dist/config/constants.d.ts +12 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +12 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +47 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +175 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api/HulaApiClient.d.ts +170 -0
- package/dist/services/api/HulaApiClient.d.ts.map +1 -0
- package/dist/services/api/HulaApiClient.js +233 -0
- package/dist/services/api/HulaApiClient.js.map +1 -0
- package/dist/services/diff/DiffService.d.ts +44 -0
- package/dist/services/diff/DiffService.d.ts.map +1 -0
- package/dist/services/diff/DiffService.js +126 -0
- package/dist/services/diff/DiffService.js.map +1 -0
- package/dist/services/editor/EditorService.d.ts +53 -0
- package/dist/services/editor/EditorService.d.ts.map +1 -0
- package/dist/services/editor/EditorService.js +161 -0
- package/dist/services/editor/EditorService.js.map +1 -0
- package/dist/services/git/GitService.d.ts +124 -0
- package/dist/services/git/GitService.d.ts.map +1 -0
- package/dist/services/git/GitService.js +423 -0
- package/dist/services/git/GitService.js.map +1 -0
- package/dist/services/git/WorktreeService.d.ts +144 -0
- package/dist/services/git/WorktreeService.d.ts.map +1 -0
- package/dist/services/git/WorktreeService.js +505 -0
- package/dist/services/git/WorktreeService.js.map +1 -0
- package/dist/services/github/ActionsService.d.ts +66 -0
- package/dist/services/github/ActionsService.d.ts.map +1 -0
- package/dist/services/github/ActionsService.js +114 -0
- package/dist/services/github/ActionsService.js.map +1 -0
- package/dist/services/github/AssetUploadService.d.ts +103 -0
- package/dist/services/github/AssetUploadService.d.ts.map +1 -0
- package/dist/services/github/AssetUploadService.js +299 -0
- package/dist/services/github/AssetUploadService.js.map +1 -0
- package/dist/services/github/BatchCopilotDetectionService.d.ts +58 -0
- package/dist/services/github/BatchCopilotDetectionService.d.ts.map +1 -0
- package/dist/services/github/BatchCopilotDetectionService.js +321 -0
- package/dist/services/github/BatchCopilotDetectionService.js.map +1 -0
- package/dist/services/github/CopilotDetectionService.d.ts +40 -0
- package/dist/services/github/CopilotDetectionService.d.ts.map +1 -0
- package/dist/services/github/CopilotDetectionService.js +280 -0
- package/dist/services/github/CopilotDetectionService.js.map +1 -0
- package/dist/services/github/CopilotService.d.ts +27 -0
- package/dist/services/github/CopilotService.d.ts.map +1 -0
- package/dist/services/github/CopilotService.js +249 -0
- package/dist/services/github/CopilotService.js.map +1 -0
- package/dist/services/github/DeploymentDetectionService.d.ts +38 -0
- package/dist/services/github/DeploymentDetectionService.d.ts.map +1 -0
- package/dist/services/github/DeploymentDetectionService.js +104 -0
- package/dist/services/github/DeploymentDetectionService.js.map +1 -0
- package/dist/services/github/GithubAppService.d.ts +40 -0
- package/dist/services/github/GithubAppService.d.ts.map +1 -0
- package/dist/services/github/GithubAppService.js +187 -0
- package/dist/services/github/GithubAppService.js.map +1 -0
- package/dist/services/github/IssueService.d.ts +65 -0
- package/dist/services/github/IssueService.d.ts.map +1 -0
- package/dist/services/github/IssueService.js +231 -0
- package/dist/services/github/IssueService.js.map +1 -0
- package/dist/services/github/LabelService.d.ts +36 -0
- package/dist/services/github/LabelService.d.ts.map +1 -0
- package/dist/services/github/LabelService.js +122 -0
- package/dist/services/github/LabelService.js.map +1 -0
- package/dist/services/github/PRService.d.ts +77 -0
- package/dist/services/github/PRService.d.ts.map +1 -0
- package/dist/services/github/PRService.js +287 -0
- package/dist/services/github/PRService.js.map +1 -0
- package/dist/services/github/ProjectService.d.ts +144 -0
- package/dist/services/github/ProjectService.d.ts.map +1 -0
- package/dist/services/github/ProjectService.js +804 -0
- package/dist/services/github/ProjectService.js.map +1 -0
- package/dist/services/hooks/HookExecutor.d.ts +66 -0
- package/dist/services/hooks/HookExecutor.d.ts.map +1 -0
- package/dist/services/hooks/HookExecutor.js +227 -0
- package/dist/services/hooks/HookExecutor.js.map +1 -0
- package/dist/services/hooks/index.d.ts +2 -0
- package/dist/services/hooks/index.d.ts.map +1 -0
- package/dist/services/hooks/index.js +2 -0
- package/dist/services/hooks/index.js.map +1 -0
- package/dist/services/logs/LogFormatterService.d.ts +17 -0
- package/dist/services/logs/LogFormatterService.d.ts.map +1 -0
- package/dist/services/logs/LogFormatterService.js +35 -0
- package/dist/services/logs/LogFormatterService.js.map +1 -0
- package/dist/services/logs/TempFileService.d.ts +27 -0
- package/dist/services/logs/TempFileService.d.ts.map +1 -0
- package/dist/services/logs/TempFileService.js +90 -0
- package/dist/services/logs/TempFileService.js.map +1 -0
- package/dist/services/logs/index.d.ts +3 -0
- package/dist/services/logs/index.d.ts.map +1 -0
- package/dist/services/logs/index.js +4 -0
- package/dist/services/logs/index.js.map +1 -0
- package/dist/services/plan/PlanService.d.ts +70 -0
- package/dist/services/plan/PlanService.d.ts.map +1 -0
- package/dist/services/plan/PlanService.js +211 -0
- package/dist/services/plan/PlanService.js.map +1 -0
- package/dist/services/polling/GitHubDirectPollingAdapter.d.ts +16 -0
- package/dist/services/polling/GitHubDirectPollingAdapter.d.ts.map +1 -0
- package/dist/services/polling/GitHubDirectPollingAdapter.js +87 -0
- package/dist/services/polling/GitHubDirectPollingAdapter.js.map +1 -0
- package/dist/services/polling/HulaServerPollingAdapter.d.ts +23 -0
- package/dist/services/polling/HulaServerPollingAdapter.d.ts.map +1 -0
- package/dist/services/polling/HulaServerPollingAdapter.js +78 -0
- package/dist/services/polling/HulaServerPollingAdapter.js.map +1 -0
- package/dist/services/polling/IStatusPollingAdapter.d.ts +29 -0
- package/dist/services/polling/IStatusPollingAdapter.d.ts.map +1 -0
- package/dist/services/polling/IStatusPollingAdapter.js +2 -0
- package/dist/services/polling/IStatusPollingAdapter.js.map +1 -0
- package/dist/services/polling/StatusPollingAdapterFactory.d.ts +14 -0
- package/dist/services/polling/StatusPollingAdapterFactory.d.ts.map +1 -0
- package/dist/services/polling/StatusPollingAdapterFactory.js +41 -0
- package/dist/services/polling/StatusPollingAdapterFactory.js.map +1 -0
- package/dist/services/polling/index.d.ts +5 -0
- package/dist/services/polling/index.d.ts.map +1 -0
- package/dist/services/polling/index.js +5 -0
- package/dist/services/polling/index.js.map +1 -0
- package/dist/services/preview/PreviewService.d.ts +86 -0
- package/dist/services/preview/PreviewService.d.ts.map +1 -0
- package/dist/services/preview/PreviewService.js +439 -0
- package/dist/services/preview/PreviewService.js.map +1 -0
- package/dist/services/tracking/ProjectTrackingAdapter.d.ts +41 -0
- package/dist/services/tracking/ProjectTrackingAdapter.d.ts.map +1 -0
- package/dist/services/tracking/ProjectTrackingAdapter.js +230 -0
- package/dist/services/tracking/ProjectTrackingAdapter.js.map +1 -0
- package/dist/services/tracking/RemoteTrackingAdapter.d.ts +62 -0
- package/dist/services/tracking/RemoteTrackingAdapter.d.ts.map +1 -0
- package/dist/services/tracking/RemoteTrackingAdapter.js +242 -0
- package/dist/services/tracking/RemoteTrackingAdapter.js.map +1 -0
- package/dist/services/tracking/TrackingAdapterFactory.d.ts +25 -0
- package/dist/services/tracking/TrackingAdapterFactory.d.ts.map +1 -0
- package/dist/services/tracking/TrackingAdapterFactory.js +55 -0
- package/dist/services/tracking/TrackingAdapterFactory.js.map +1 -0
- package/dist/services/tracking/TrackingService.d.ts +104 -0
- package/dist/services/tracking/TrackingService.d.ts.map +1 -0
- package/dist/services/tracking/TrackingService.js +256 -0
- package/dist/services/tracking/TrackingService.js.map +1 -0
- package/dist/services/tracking/UntrackedIssuesService.d.ts +20 -0
- package/dist/services/tracking/UntrackedIssuesService.d.ts.map +1 -0
- package/dist/services/tracking/UntrackedIssuesService.js +148 -0
- package/dist/services/tracking/UntrackedIssuesService.js.map +1 -0
- package/dist/services/tracking/local-file-migration.d.ts +16 -0
- package/dist/services/tracking/local-file-migration.d.ts.map +1 -0
- package/dist/services/tracking/local-file-migration.js +86 -0
- package/dist/services/tracking/local-file-migration.js.map +1 -0
- package/dist/templates/planning-instructions.md +752 -0
- package/dist/templates/proceed-instructions.md +453 -0
- package/dist/templates/scripts/hula-fix-commit.sh +110 -0
- package/dist/templates/scripts/hula-fix-setup.sh +145 -0
- package/dist/templates/scripts/hula-launch-run.sh +89 -0
- package/dist/templates/scripts/hula-merge-local.sh +138 -0
- package/dist/templates/scripts/hula-merge-remote.sh +74 -0
- package/dist/templates/scripts/hula-read-config.sh +38 -0
- package/dist/templates/scripts/hula-verify-gather.sh +135 -0
- package/dist/templates/scripts/hula-verify-post.sh +84 -0
- package/dist/templates/skills/hula-confirm/SKILL.md +361 -0
- package/dist/templates/skills/hula-create/SKILL.md +211 -0
- package/dist/templates/skills/hula-fix/SKILL.md +224 -0
- package/dist/templates/skills/hula-launch/SKILL.md +159 -0
- package/dist/templates/skills/hula-log/SKILL.md +105 -0
- package/dist/templates/skills/hula-merge/SKILL.md +387 -0
- package/dist/templates/skills/hula-plan/SKILL.md +148 -0
- package/dist/templates/skills/hula-upload/SKILL.md +115 -0
- package/dist/templates/skills/hula-verify/SKILL.md +754 -0
- package/dist/types/common.schema.d.ts +46 -0
- package/dist/types/common.schema.d.ts.map +1 -0
- package/dist/types/common.schema.js +60 -0
- package/dist/types/common.schema.js.map +1 -0
- package/dist/types/config.schema.d.ts +443 -0
- package/dist/types/config.schema.d.ts.map +1 -0
- package/dist/types/config.schema.js +126 -0
- package/dist/types/config.schema.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issue.schema.d.ts +136 -0
- package/dist/types/issue.schema.d.ts.map +1 -0
- package/dist/types/issue.schema.js +49 -0
- package/dist/types/issue.schema.js.map +1 -0
- package/dist/types/pr.schema.d.ts +118 -0
- package/dist/types/pr.schema.d.ts.map +1 -0
- package/dist/types/pr.schema.js +40 -0
- package/dist/types/pr.schema.js.map +1 -0
- package/dist/types/tracking.schema.d.ts +340 -0
- package/dist/types/tracking.schema.d.ts.map +1 -0
- package/dist/types/tracking.schema.js +56 -0
- package/dist/types/tracking.schema.js.map +1 -0
- package/dist/utils/browser-launcher.d.ts +60 -0
- package/dist/utils/browser-launcher.d.ts.map +1 -0
- package/dist/utils/browser-launcher.js +263 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/dist/utils/cache.d.ts +44 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +94 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config-parser.d.ts +16 -0
- package/dist/utils/config-parser.d.ts.map +1 -0
- package/dist/utils/config-parser.js +210 -0
- package/dist/utils/config-parser.js.map +1 -0
- package/dist/utils/editor.d.ts +21 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +213 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/git-utils.d.ts +5 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +18 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/github-cli.d.ts +62 -0
- package/dist/utils/github-cli.d.ts.map +1 -0
- package/dist/utils/github-cli.js +492 -0
- package/dist/utils/github-cli.js.map +1 -0
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +118 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/open-url.d.ts +19 -0
- package/dist/utils/open-url.d.ts.map +1 -0
- package/dist/utils/open-url.js +37 -0
- package/dist/utils/open-url.js.map +1 -0
- package/dist/utils/project-resolver.d.ts +13 -0
- package/dist/utils/project-resolver.d.ts.map +1 -0
- package/dist/utils/project-resolver.js +35 -0
- package/dist/utils/project-resolver.js.map +1 -0
- package/dist/utils/prompts.d.ts +80 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +326 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/shell.d.ts +54 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +152 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/validators.d.ts +32 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +64 -0
- package/dist/utils/validators.js.map +1 -0
- 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"}
|