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,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"}
|