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,438 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { PRService } from "../services/github/PRService.js";
|
|
3
|
+
import { IssueService } from "../services/github/IssueService.js";
|
|
4
|
+
import { ActionsService } from "../services/github/ActionsService.js";
|
|
5
|
+
import { DiffService } from "../services/diff/DiffService.js";
|
|
6
|
+
import { EditorService } from "../services/editor/EditorService.js";
|
|
7
|
+
import { TrackingService } from "../services/tracking/TrackingService.js";
|
|
8
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
9
|
+
import { searchSelect, select, UserCancelledError } from "../utils/prompts.js";
|
|
10
|
+
import { writeFile } from "fs/promises";
|
|
11
|
+
import { join } from "path";
|
|
12
|
+
import { tmpdir } from "os";
|
|
13
|
+
/**
|
|
14
|
+
* Watch command - Monitor PR for Copilot completion and test results
|
|
15
|
+
*/
|
|
16
|
+
export function watchCommand(program, config) {
|
|
17
|
+
program
|
|
18
|
+
.command("watch [issueNumber] [testPath]")
|
|
19
|
+
.description("Monitor PR for Copilot completion and test results")
|
|
20
|
+
.option("--interval <seconds>", "Check interval in seconds", "60")
|
|
21
|
+
.option("--max-iterations <number>", "Maximum iterations", "20")
|
|
22
|
+
.option("--timeout <seconds>", "Workflow completion timeout in seconds", "900")
|
|
23
|
+
.action(async (issueNumber, testPath, options) => {
|
|
24
|
+
try {
|
|
25
|
+
await executeWatch(config, issueNumber, testPath, options);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error instanceof UserCancelledError) {
|
|
29
|
+
logger.info('\nCancelled.');
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
logger.error("Failed to watch PR:");
|
|
33
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function executeWatch(config, issueNumberArg, testPath, options) {
|
|
39
|
+
logger.section("🔍 Watch PR and Test Results");
|
|
40
|
+
// Initialize services
|
|
41
|
+
const prService = new PRService();
|
|
42
|
+
const issueService = new IssueService();
|
|
43
|
+
const actionsService = new ActionsService();
|
|
44
|
+
const diffService = new DiffService();
|
|
45
|
+
const editorService = new EditorService(config.editorCommand);
|
|
46
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
47
|
+
// Get issue number
|
|
48
|
+
let issueNumber;
|
|
49
|
+
if (issueNumberArg) {
|
|
50
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
51
|
+
if (isNaN(issueNumber)) {
|
|
52
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Show tracked issues and let user select
|
|
57
|
+
const trackedIssues = await trackingService.getAll();
|
|
58
|
+
if (trackedIssues.length === 0) {
|
|
59
|
+
throw new Error("No tracked issues found. Run 'hublaunch track' first.");
|
|
60
|
+
}
|
|
61
|
+
const choices = trackedIssues
|
|
62
|
+
.filter((issue) => issue.number !== undefined)
|
|
63
|
+
.map((issue) => ({
|
|
64
|
+
name: `#${issue.number} - ${issue.name}`,
|
|
65
|
+
value: issue.number.toString(),
|
|
66
|
+
}));
|
|
67
|
+
const selected = await searchSelect("Select issue to watch:", choices);
|
|
68
|
+
issueNumber = parseInt(selected, 10);
|
|
69
|
+
}
|
|
70
|
+
// Get PR for issue
|
|
71
|
+
logger.info(`Fetching PR for issue #${issueNumber}...`);
|
|
72
|
+
const pr = await prService.getByIssue(issueNumber);
|
|
73
|
+
if (!pr) {
|
|
74
|
+
throw new Error(`No PR found for issue #${issueNumber}`);
|
|
75
|
+
}
|
|
76
|
+
logger.info(`Watching Issue #${issueNumber}`);
|
|
77
|
+
logger.info(`PR #${pr.number}: ${pr.title}`);
|
|
78
|
+
logger.blank();
|
|
79
|
+
// If testPath provided, run test first
|
|
80
|
+
if (testPath) {
|
|
81
|
+
const timeoutSeconds = parseInt(options.timeout, 10);
|
|
82
|
+
await runTestCycle(pr.number, testPath, issueService, actionsService, editorService, timeoutSeconds);
|
|
83
|
+
}
|
|
84
|
+
// Enter interactive loop
|
|
85
|
+
const timeoutSeconds = parseInt(options.timeout, 10);
|
|
86
|
+
await watchLoop(issueNumber, pr.number, config, {
|
|
87
|
+
prService,
|
|
88
|
+
issueService,
|
|
89
|
+
actionsService,
|
|
90
|
+
diffService,
|
|
91
|
+
editorService,
|
|
92
|
+
}, timeoutSeconds);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run a test cycle: post test command and wait for results
|
|
96
|
+
*/
|
|
97
|
+
async function runTestCycle(prNumber, testPath, issueService, actionsService, editorService, timeoutSeconds = 900) {
|
|
98
|
+
logger.section("📤 Running Test");
|
|
99
|
+
// Post /test command
|
|
100
|
+
const testCommand = `/test ${testPath}`;
|
|
101
|
+
logger.info(`Posting test command: ${testCommand}`);
|
|
102
|
+
const beforeTime = new Date();
|
|
103
|
+
await issueService.addComment(prNumber, testCommand);
|
|
104
|
+
logger.success("✓ Test command posted");
|
|
105
|
+
logger.blank();
|
|
106
|
+
// Wait a bit for GitHub Actions to start
|
|
107
|
+
process.stdout.write("⏳ Waiting for GitHub Actions to start...");
|
|
108
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
109
|
+
// Poll for workflow run
|
|
110
|
+
process.stdout.write("\r🔍 Looking for workflow run... ");
|
|
111
|
+
let attemptCount = 0;
|
|
112
|
+
const maxAttempts = 30; // 30 attempts with 10s interval = 5 minutes
|
|
113
|
+
while (attemptCount < maxAttempts) {
|
|
114
|
+
const run = await actionsService.getLatestWorkflowRunAfter(prNumber, beforeTime);
|
|
115
|
+
if (run) {
|
|
116
|
+
process.stdout.write("\r" + " ".repeat(50) + "\r");
|
|
117
|
+
logger.info(`Found workflow run #${run.id}: ${run.name}`);
|
|
118
|
+
logger.blank();
|
|
119
|
+
// Poll for completion with configurable timeout
|
|
120
|
+
const completedRun = await actionsService.pollForCompletion(run.id, timeoutSeconds, 15);
|
|
121
|
+
if (completedRun) {
|
|
122
|
+
const testResult = await actionsService.convertToTestResult(completedRun);
|
|
123
|
+
await displayTestResult(testResult, testPath, prNumber, issueService, editorService, beforeTime);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
logger.warning("⏱️ Timeout waiting for test completion");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
attemptCount++;
|
|
132
|
+
process.stdout.write(`\r⏳ Waiting for workflow to start... (${attemptCount * 10}s)`);
|
|
133
|
+
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
134
|
+
}
|
|
135
|
+
logger.warning("⏱️ Timeout waiting for workflow to start");
|
|
136
|
+
logger.info("The test may still be running. Check GitHub Actions:");
|
|
137
|
+
logger.info(` https://github.com/{owner}/{repo}/actions`);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Display test results
|
|
141
|
+
*/
|
|
142
|
+
async function displayTestResult(result, testPath, prNumber, issueService, editorService, testCommandTime) {
|
|
143
|
+
logger.blank();
|
|
144
|
+
logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
145
|
+
if (result.passed) {
|
|
146
|
+
logger.success("✅ Test PASSED");
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.error("❌ Test FAILED");
|
|
150
|
+
}
|
|
151
|
+
logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
152
|
+
logger.blank();
|
|
153
|
+
logger.info(`Test: ${testPath}`);
|
|
154
|
+
logger.info(`Duration: ${result.duration}s`);
|
|
155
|
+
logger.info(`Workflow: ${result.workflowUrl}`);
|
|
156
|
+
logger.blank();
|
|
157
|
+
// Fetch the GitHub Actions bot comment with test results
|
|
158
|
+
logger.info("📄 Fetching test result details from GitHub Actions...");
|
|
159
|
+
const testResultComment = await fetchTestResultComment(prNumber, issueService, testCommandTime);
|
|
160
|
+
if (testResultComment) {
|
|
161
|
+
// Save to temp file and open in editor
|
|
162
|
+
const tempFile = join(tmpdir(), `hublaunch-test-result-pr${prNumber}.md`);
|
|
163
|
+
await writeFile(tempFile, testResultComment);
|
|
164
|
+
logger.success(`Test results saved to: ${tempFile}`);
|
|
165
|
+
// Open in editor in preview mode
|
|
166
|
+
try {
|
|
167
|
+
await editorService.openFileInPreview(tempFile);
|
|
168
|
+
logger.success("✓ Test results opened in editor");
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
logger.warning(`Could not open in editor: ${error instanceof Error ? error.message : String(error)}`);
|
|
172
|
+
logger.info(`View manually: ${tempFile}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
logger.warning("Could not fetch detailed test results from GitHub Actions comment");
|
|
177
|
+
}
|
|
178
|
+
logger.blank();
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Fetch the GitHub Actions bot comment with test results
|
|
182
|
+
*/
|
|
183
|
+
async function fetchTestResultComment(prNumber, issueService, afterTime) {
|
|
184
|
+
const maxAttempts = 40; // 40 attempts with 3s interval = 2 minutes
|
|
185
|
+
let attemptCount = 0;
|
|
186
|
+
// Add buffer to afterTime to account for clock skew (subtract 5 seconds)
|
|
187
|
+
const adjustedAfterTime = new Date(afterTime.getTime() - 5000);
|
|
188
|
+
while (attemptCount < maxAttempts) {
|
|
189
|
+
const comments = await issueService.getComments(prNumber);
|
|
190
|
+
// Look for test result comments posted after test command
|
|
191
|
+
// The comments are posted by the workflow using the user's PAT token, so we check content instead of user
|
|
192
|
+
// Support both old format (with @copilot) and new format (without @copilot)
|
|
193
|
+
const testResultComments = comments.filter((c) => {
|
|
194
|
+
const commentTime = new Date(c.created_at);
|
|
195
|
+
const hasTestResult = c.body.includes("## ✅ Integration Test Passed") ||
|
|
196
|
+
c.body.includes("## ✅ Unit Test Passed") ||
|
|
197
|
+
c.body.includes("## ❌ Integration Test Failed") ||
|
|
198
|
+
c.body.includes("## ❌ Unit Test Failed");
|
|
199
|
+
// Also check for old format with @copilot
|
|
200
|
+
const hasOldFormat = c.body.includes("@copilot Please analyze the test failure");
|
|
201
|
+
return commentTime > adjustedAfterTime && (hasTestResult || hasOldFormat);
|
|
202
|
+
});
|
|
203
|
+
if (testResultComments.length > 0) {
|
|
204
|
+
// Return the most recent test result comment
|
|
205
|
+
const sortedComments = testResultComments.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
206
|
+
return sortedComments[0]?.body ?? null;
|
|
207
|
+
}
|
|
208
|
+
// Wait before next attempt (show progress every 5 attempts)
|
|
209
|
+
attemptCount++;
|
|
210
|
+
if (attemptCount % 5 === 0) {
|
|
211
|
+
logger.debug(`Still waiting for test result comment... (${attemptCount * 3}s elapsed)`);
|
|
212
|
+
}
|
|
213
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Interactive watch loop with menu
|
|
219
|
+
*/
|
|
220
|
+
async function watchLoop(_issueNumber, prNumber, _config, services, timeoutSeconds = 900) {
|
|
221
|
+
let running = true;
|
|
222
|
+
while (running) {
|
|
223
|
+
// Show menu
|
|
224
|
+
logger.section("─────────────────────────────────────────");
|
|
225
|
+
logger.info("What would you like to do next?");
|
|
226
|
+
logger.blank();
|
|
227
|
+
const action = await select("Select an action:", [
|
|
228
|
+
"d) View diffs - See code changes in this PR",
|
|
229
|
+
"t) Run test - Run tests again",
|
|
230
|
+
"o) Respond - Send message to Copilot",
|
|
231
|
+
"q) Quit - Exit watch mode",
|
|
232
|
+
]);
|
|
233
|
+
const choice = action.charAt(0);
|
|
234
|
+
try {
|
|
235
|
+
switch (choice) {
|
|
236
|
+
case "d":
|
|
237
|
+
await handleViewDiffs(prNumber, services.prService, services.diffService, services.editorService);
|
|
238
|
+
break;
|
|
239
|
+
case "t":
|
|
240
|
+
await handleRunTest(prNumber, services.issueService, services.actionsService, services.editorService, timeoutSeconds);
|
|
241
|
+
break;
|
|
242
|
+
case "o":
|
|
243
|
+
await handleRespond(_issueNumber, prNumber, services.issueService, _config);
|
|
244
|
+
break;
|
|
245
|
+
case "q":
|
|
246
|
+
logger.success("✓ Exiting watch mode");
|
|
247
|
+
running = false;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
logger.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
253
|
+
logger.blank();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Exit cleanly without waiting for input
|
|
257
|
+
logger.blank();
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Handle view diffs action
|
|
261
|
+
*/
|
|
262
|
+
async function handleViewDiffs(prNumber, _prService, diffService, editorService) {
|
|
263
|
+
logger.blank();
|
|
264
|
+
logger.section("📄 Viewing Diffs");
|
|
265
|
+
// Get diff and files
|
|
266
|
+
logger.info("Fetching diff content...");
|
|
267
|
+
const [diff, files] = await Promise.all([
|
|
268
|
+
diffService.getDiff(prNumber),
|
|
269
|
+
diffService.getFiles(prNumber),
|
|
270
|
+
]);
|
|
271
|
+
logger.info(`Found ${files.length} changed files`);
|
|
272
|
+
// Format diff with links
|
|
273
|
+
const formattedDiff = await diffService.formatDiffWithLinks(prNumber, diff, files, "vscode");
|
|
274
|
+
// Save to temp file
|
|
275
|
+
const tempFile = join(tmpdir(), `hublaunch-diff-pr${prNumber}.md`);
|
|
276
|
+
await writeFile(tempFile, formattedDiff);
|
|
277
|
+
logger.success(`Diff saved to: ${tempFile}`);
|
|
278
|
+
// Open in editor in preview mode
|
|
279
|
+
try {
|
|
280
|
+
await editorService.openFileInPreview(tempFile);
|
|
281
|
+
logger.success("✓ Diff opened in preview mode");
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
logger.warning(`Could not open in editor, view manually: ${tempFile}`);
|
|
285
|
+
}
|
|
286
|
+
logger.blank();
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Handle run test action
|
|
290
|
+
*/
|
|
291
|
+
async function handleRunTest(prNumber, issueService, actionsService, editorService, timeoutSeconds = 900) {
|
|
292
|
+
logger.blank();
|
|
293
|
+
// Prompt for test path
|
|
294
|
+
const inquirer = await import("inquirer");
|
|
295
|
+
const { testPath } = await inquirer.default.prompt([
|
|
296
|
+
{
|
|
297
|
+
type: "input",
|
|
298
|
+
name: "testPath",
|
|
299
|
+
message: "Enter test path:",
|
|
300
|
+
default: "integrationTest/",
|
|
301
|
+
},
|
|
302
|
+
]);
|
|
303
|
+
if (testPath.trim()) {
|
|
304
|
+
await runTestCycle(prNumber, testPath.trim(), issueService, actionsService, editorService, timeoutSeconds);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
logger.warning("No test path provided");
|
|
308
|
+
}
|
|
309
|
+
logger.blank();
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Handle respond to Copilot action
|
|
313
|
+
*/
|
|
314
|
+
async function handleRespond(_issueNumber, prNumber, issueService, config) {
|
|
315
|
+
logger.blank();
|
|
316
|
+
logger.section("📨 Respond to Copilot");
|
|
317
|
+
// Import compose functions
|
|
318
|
+
const { selectComposeMode, openEditorForMessage, composeInTerminal } = await import("../utils/editor.js");
|
|
319
|
+
// Ask user how they want to compose
|
|
320
|
+
const mode = await selectComposeMode();
|
|
321
|
+
if (!mode) {
|
|
322
|
+
// User cancelled
|
|
323
|
+
logger.warning("Message composition cancelled");
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
logger.blank();
|
|
327
|
+
// Compose based on selected mode
|
|
328
|
+
let message;
|
|
329
|
+
if (mode === "editor") {
|
|
330
|
+
message = await openEditorForMessage(config, "@copilot ");
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
// Terminal mode
|
|
334
|
+
message = await composeInTerminal("@copilot ");
|
|
335
|
+
}
|
|
336
|
+
if (!message?.trim()) {
|
|
337
|
+
logger.warning("Message composition cancelled");
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
// Ensure @copilot prefix
|
|
341
|
+
let finalMessage = message.trim();
|
|
342
|
+
if (!finalMessage.startsWith("@copilot")) {
|
|
343
|
+
finalMessage = `@copilot ${finalMessage}`;
|
|
344
|
+
}
|
|
345
|
+
logger.info("Posting comment...");
|
|
346
|
+
await issueService.addComment(prNumber, finalMessage);
|
|
347
|
+
logger.success("✓ Comment posted to PR");
|
|
348
|
+
// Update tracking status to 'waiting' after responding to Copilot
|
|
349
|
+
try {
|
|
350
|
+
const { TrackingService } = await import("../services/tracking/TrackingService.js");
|
|
351
|
+
const { TrackingAdapterFactory } = await import("../services/tracking/TrackingAdapterFactory.js");
|
|
352
|
+
const { STATUS } = await import("../types/index.js");
|
|
353
|
+
const adapter = TrackingAdapterFactory.create(config);
|
|
354
|
+
const trackingService = new TrackingService(adapter);
|
|
355
|
+
const issue = await trackingService.getByNumber(_issueNumber);
|
|
356
|
+
if (issue) {
|
|
357
|
+
await trackingService.updateStatus(_issueNumber, STATUS.WAITING);
|
|
358
|
+
logger.info("✓ Updated tracking status to 'waiting'");
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
// Don't fail if status update fails, just log it
|
|
363
|
+
logger.debug(`Failed to update tracking status: ${error instanceof Error ? error.message : String(error)}`);
|
|
364
|
+
}
|
|
365
|
+
logger.blank();
|
|
366
|
+
// Poll for Copilot response
|
|
367
|
+
logger.info("⏳ Waiting for Copilot response...");
|
|
368
|
+
const response = await pollForCopilotResponse(prNumber, issueService, 1200);
|
|
369
|
+
if (response) {
|
|
370
|
+
displayCopilotResponse(response);
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
logger.warning("⏱️ No response from Copilot yet");
|
|
374
|
+
logger.info("Copilot may still be processing. Check the PR later.");
|
|
375
|
+
}
|
|
376
|
+
logger.blank();
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Format elapsed seconds into a readable time string
|
|
380
|
+
*/
|
|
381
|
+
function formatElapsedTime(seconds) {
|
|
382
|
+
if (seconds < 60) {
|
|
383
|
+
return `${seconds}s`;
|
|
384
|
+
}
|
|
385
|
+
const minutes = Math.floor(seconds / 60);
|
|
386
|
+
const remainingSeconds = seconds % 60;
|
|
387
|
+
return `${minutes}m ${remainingSeconds}s`;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Poll for Copilot response
|
|
391
|
+
*/
|
|
392
|
+
async function pollForCopilotResponse(prNumber, issueService, timeoutSeconds) {
|
|
393
|
+
const startTime = Date.now();
|
|
394
|
+
const pollInterval = 15000; // 15 seconds
|
|
395
|
+
// Get initial comment count
|
|
396
|
+
const initialComments = await issueService.getComments(prNumber);
|
|
397
|
+
const lastCommentTime = initialComments.length > 0
|
|
398
|
+
? new Date(initialComments[initialComments.length - 1]?.created_at ?? new Date())
|
|
399
|
+
: new Date();
|
|
400
|
+
while (Date.now() - startTime < timeoutSeconds * 1000) {
|
|
401
|
+
const comments = await issueService.getComments(prNumber);
|
|
402
|
+
// Look for new comments from Copilot (github-actions bot)
|
|
403
|
+
const newComments = comments.filter((c) => {
|
|
404
|
+
const commentTime = new Date(c.created_at);
|
|
405
|
+
return (commentTime > lastCommentTime &&
|
|
406
|
+
(c.user.login === "github-actions[bot]" ||
|
|
407
|
+
c.user.login === "copilot" ||
|
|
408
|
+
c.body.toLowerCase().includes("copilot")));
|
|
409
|
+
});
|
|
410
|
+
if (newComments.length > 0 && newComments[0]) {
|
|
411
|
+
process.stdout.write("\r" + " ".repeat(50) + "\r");
|
|
412
|
+
return {
|
|
413
|
+
body: newComments[0].body,
|
|
414
|
+
created_at: newComments[0].created_at,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
const elapsedSeconds = Math.floor((Date.now() - startTime) / 1000);
|
|
418
|
+
const formattedTime = formatElapsedTime(elapsedSeconds);
|
|
419
|
+
process.stdout.write(`\r⏳ Checking... (${formattedTime} elapsed)`);
|
|
420
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
421
|
+
}
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Display Copilot response
|
|
426
|
+
*/
|
|
427
|
+
function displayCopilotResponse(response) {
|
|
428
|
+
logger.blank();
|
|
429
|
+
logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
430
|
+
logger.info("📨 Copilot Response");
|
|
431
|
+
logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
432
|
+
logger.blank();
|
|
433
|
+
// Display the response body
|
|
434
|
+
logger.info(response.body);
|
|
435
|
+
logger.blank();
|
|
436
|
+
logger.section("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { Config } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Worktree commands for plan and fix isolation
|
|
5
|
+
*/
|
|
6
|
+
export declare function worktreeCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6HtE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { resolve, isAbsolute } from 'path';
|
|
2
|
+
import { WorktreeService } from '../services/git/WorktreeService.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { getRepoInfo } from '../utils/github-cli.js';
|
|
5
|
+
import { getRepoRoot } from '../utils/shell.js';
|
|
6
|
+
/**
|
|
7
|
+
* Worktree commands for plan and fix isolation
|
|
8
|
+
*/
|
|
9
|
+
export function worktreeCommand(program, config) {
|
|
10
|
+
const rawWorktreeBasePath = config.worktreeBasePath ?? '.hula-worktrees';
|
|
11
|
+
const worktree = program
|
|
12
|
+
.command('worktree')
|
|
13
|
+
.description('Manage plan worktrees');
|
|
14
|
+
worktree
|
|
15
|
+
.command('setup')
|
|
16
|
+
.description('Create a worktree for plan creation')
|
|
17
|
+
.action(async () => {
|
|
18
|
+
try {
|
|
19
|
+
const worktreeService = new WorktreeService();
|
|
20
|
+
if (await worktreeService.worktreeExists()) {
|
|
21
|
+
const path = await worktreeService.getWorktreePath();
|
|
22
|
+
logger.info(`Worktree already exists at: ${path}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const path = await worktreeService.createPlanWorktree();
|
|
26
|
+
logger.success(`Worktree created at: ${path}`);
|
|
27
|
+
logger.info('Plan files should be saved under this path.');
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.error('Failed to setup worktree:');
|
|
31
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
worktree
|
|
36
|
+
.command('cleanup')
|
|
37
|
+
.description('Remove the plan worktree and all orphaned hula worktrees')
|
|
38
|
+
.action(async () => {
|
|
39
|
+
try {
|
|
40
|
+
// Clean up legacy plan worktree
|
|
41
|
+
const worktreeService = new WorktreeService();
|
|
42
|
+
if (await worktreeService.worktreeExists()) {
|
|
43
|
+
await worktreeService.removeWorktree();
|
|
44
|
+
logger.success('Plan worktree removed');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logger.info('No legacy plan worktree to clean up');
|
|
48
|
+
}
|
|
49
|
+
// Clean up any orphaned hula worktrees
|
|
50
|
+
const repoInfo = await getRepoInfo().catch(() => null);
|
|
51
|
+
const repoRoot = await getRepoRoot();
|
|
52
|
+
const worktreeBasePath = isAbsolute(rawWorktreeBasePath)
|
|
53
|
+
? rawWorktreeBasePath
|
|
54
|
+
: resolve(repoRoot, rawWorktreeBasePath);
|
|
55
|
+
const genericService = new WorktreeService({ basePath: worktreeBasePath, repoName: repoInfo?.name ?? '' });
|
|
56
|
+
const hulaWorktrees = await genericService.listHulaWorktrees();
|
|
57
|
+
if (hulaWorktrees.length > 0) {
|
|
58
|
+
logger.info(`Found ${hulaWorktrees.length} hula worktree(s) to remove:`);
|
|
59
|
+
for (const wt of hulaWorktrees) {
|
|
60
|
+
try {
|
|
61
|
+
await genericService.removeWorktreeAt(wt);
|
|
62
|
+
logger.success(` Removed: ${wt}`);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.warning(` Failed to remove ${wt}: ${error instanceof Error ? error.message : String(error)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
logger.info('No orphaned hula worktrees found');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
logger.error('Failed to cleanup worktree:');
|
|
75
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
worktree
|
|
80
|
+
.command('status')
|
|
81
|
+
.description('Show worktree status (plan worktree + active hula worktrees)')
|
|
82
|
+
.action(async () => {
|
|
83
|
+
try {
|
|
84
|
+
// Show legacy plan worktree status
|
|
85
|
+
const worktreeService = new WorktreeService();
|
|
86
|
+
if (await worktreeService.worktreeExists()) {
|
|
87
|
+
const path = await worktreeService.getWorktreePath();
|
|
88
|
+
const hasChanges = await worktreeService.hasWorktreeChanges();
|
|
89
|
+
logger.info(`Plan worktree path: ${path}`);
|
|
90
|
+
logger.info(`Has uncommitted changes: ${hasChanges ? 'Yes' : 'No'}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
logger.info('No active plan worktree');
|
|
94
|
+
}
|
|
95
|
+
// Show hula worktrees
|
|
96
|
+
const repoInfo = await getRepoInfo().catch(() => null);
|
|
97
|
+
const repoRoot = await getRepoRoot();
|
|
98
|
+
const worktreeBasePath = isAbsolute(rawWorktreeBasePath)
|
|
99
|
+
? rawWorktreeBasePath
|
|
100
|
+
: resolve(repoRoot, rawWorktreeBasePath);
|
|
101
|
+
const genericService = new WorktreeService({ basePath: worktreeBasePath, repoName: repoInfo?.name ?? '' });
|
|
102
|
+
const hulaWorktrees = await genericService.listHulaWorktrees();
|
|
103
|
+
if (hulaWorktrees.length > 0) {
|
|
104
|
+
logger.blank();
|
|
105
|
+
logger.info('Active hula worktrees:');
|
|
106
|
+
for (const wt of hulaWorktrees) {
|
|
107
|
+
const hasChanges = await genericService.hasChangesAt(wt);
|
|
108
|
+
logger.listItem(`${wt} (${hasChanges ? 'has changes' : 'clean'})`, 1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
logger.info('No active hula worktrees');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
logger.error('Failed to get worktree status:');
|
|
117
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../src/commands/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized command names configuration
|
|
3
|
+
* All command aliases and names are defined here for easy maintenance
|
|
4
|
+
*/
|
|
5
|
+
export declare const COMMAND_NAMES: {
|
|
6
|
+
readonly primary: readonly ["hula", "hub-launch", "hl"];
|
|
7
|
+
readonly subcommands: {
|
|
8
|
+
readonly merge: "merge";
|
|
9
|
+
readonly init: "init";
|
|
10
|
+
readonly launch: "launch";
|
|
11
|
+
readonly execute: "execute";
|
|
12
|
+
readonly logs: "logs";
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export type SubcommandName = keyof typeof COMMAND_NAMES.subcommands;
|
|
16
|
+
//# sourceMappingURL=command-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-names.d.ts","sourceRoot":"","sources":["../../src/config/command-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,aAAa;;;;;;;;;CAYhB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,aAAa,CAAC,WAAW,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized command names configuration
|
|
3
|
+
* All command aliases and names are defined here for easy maintenance
|
|
4
|
+
*/
|
|
5
|
+
export const COMMAND_NAMES = {
|
|
6
|
+
// Primary aliases (user-configurable)
|
|
7
|
+
primary: ["hula", "hub-launch", "hl"],
|
|
8
|
+
// Subcommands
|
|
9
|
+
subcommands: {
|
|
10
|
+
merge: "merge",
|
|
11
|
+
init: "init",
|
|
12
|
+
launch: "launch",
|
|
13
|
+
execute: "execute",
|
|
14
|
+
logs: "logs",
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=command-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-names.js","sourceRoot":"","sources":["../../src/config/command-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,sCAAsC;IACtC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC;IAErC,cAAc;IACd,WAAW,EAAE;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;KACb;CACO,CAAC"}
|