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,206 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { TrackingService } from "../services/tracking/TrackingService.js";
|
|
3
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
4
|
+
import { confirm, UserCancelledError } from "../utils/prompts.js";
|
|
5
|
+
import { HookExecutor } from "../services/hooks/HookExecutor.js";
|
|
6
|
+
import { globalCache } from "../utils/cache.js";
|
|
7
|
+
import { AuthorizationError } from "../services/api/HulaApiClient.js";
|
|
8
|
+
import { execSync } from "child_process";
|
|
9
|
+
/**
|
|
10
|
+
* Clean command - Remove closed/merged issues from tracking and clean up browser processes
|
|
11
|
+
*/
|
|
12
|
+
export function cleanCommand(program, config) {
|
|
13
|
+
program
|
|
14
|
+
.command("clean")
|
|
15
|
+
.description("Remove closed/merged issues from tracking and clean up browser processes")
|
|
16
|
+
.option("--force", "Skip confirmation")
|
|
17
|
+
.option("--browsers", "Only clean up orphaned browser processes")
|
|
18
|
+
.action(async (options) => {
|
|
19
|
+
try {
|
|
20
|
+
await executeClean(config, options);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof UserCancelledError) {
|
|
24
|
+
logger.info('\nCancelled.');
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
logger.error("Failed to clean:");
|
|
28
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function executeClean(config, options) {
|
|
34
|
+
// If --browsers flag, only clean up browser processes
|
|
35
|
+
if (options.browsers) {
|
|
36
|
+
await cleanupBrowsers();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
logger.section("Clean Closed Issues");
|
|
40
|
+
// Initialize tracking service
|
|
41
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
42
|
+
// Get all issues
|
|
43
|
+
const allIssues = await trackingService.getAll();
|
|
44
|
+
// Deduplicate by issue name (owner/repo#number) BEFORE API calls —
|
|
45
|
+
// server may return duplicates and each would trigger a GitHub API request
|
|
46
|
+
const seenNames = new Set();
|
|
47
|
+
const dedupedIssues = allIssues.filter(issue => {
|
|
48
|
+
if (issue.name == null || seenNames.has(issue.name))
|
|
49
|
+
return false;
|
|
50
|
+
seenNames.add(issue.name);
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
// Check GitHub state for each issue
|
|
54
|
+
const { IssueService } = await import("../services/github/IssueService.js");
|
|
55
|
+
const issueService = new IssueService();
|
|
56
|
+
const uniqueIssuesToRemove = [];
|
|
57
|
+
logger.info("Checking issue states on GitHub...");
|
|
58
|
+
let skippedCount = 0;
|
|
59
|
+
for (const issue of dedupedIssues) {
|
|
60
|
+
if (issue.number == null) {
|
|
61
|
+
skippedCount++;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// Clear IssueService cache so we always get the current GitHub state
|
|
65
|
+
const cacheKey = IssueService.getCacheKey(issue.number, issue.projectOwner, issue.projectName);
|
|
66
|
+
globalCache.delete(cacheKey);
|
|
67
|
+
try {
|
|
68
|
+
const githubIssue = await issueService.get(issue.number, issue.projectOwner, issue.projectName);
|
|
69
|
+
// Remove if closed on GitHub
|
|
70
|
+
if (githubIssue.state === "closed") {
|
|
71
|
+
uniqueIssuesToRemove.push({ issue, freshState: githubIssue.state });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
// If issue doesn't exist (404 or deleted), remove it
|
|
76
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
77
|
+
if (errorMessage.includes("404") || errorMessage.includes("Not Found") || errorMessage.includes("deleted")) {
|
|
78
|
+
logger.debug(`Issue #${issue.number} not found on GitHub, will remove`);
|
|
79
|
+
uniqueIssuesToRemove.push({ issue, freshState: "deleted" });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
logger.warning(`Failed to check issue #${issue.number}: ${errorMessage}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (skippedCount > 0) {
|
|
87
|
+
logger.debug(`Skipped ${skippedCount} issue(s) with no GitHub issue number (standalone jobs)`);
|
|
88
|
+
}
|
|
89
|
+
if (uniqueIssuesToRemove.length === 0) {
|
|
90
|
+
logger.info("No closed or deleted issues to clean.");
|
|
91
|
+
logger.blank();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// Pre-filter against the current user. With the server-side relaxation,
|
|
95
|
+
// CLOSED issues are cleanable by any authenticated user — but on older
|
|
96
|
+
// servers the per-issue DELETE may still 403. We only skip up-front when
|
|
97
|
+
// the row is owned by another user AND is still open on GitHub (which
|
|
98
|
+
// `clean` doesn't process anyway). The per-issue try/catch below is the
|
|
99
|
+
// real safety net.
|
|
100
|
+
const currentUserId = trackingService.getCurrentUserId();
|
|
101
|
+
const ownedByOthers = [];
|
|
102
|
+
const cleanable = [];
|
|
103
|
+
for (const entry of uniqueIssuesToRemove) {
|
|
104
|
+
if (currentUserId &&
|
|
105
|
+
entry.issue.createdById &&
|
|
106
|
+
entry.issue.createdById !== currentUserId &&
|
|
107
|
+
entry.freshState !== "closed" &&
|
|
108
|
+
entry.freshState !== "deleted") {
|
|
109
|
+
ownedByOthers.push(entry);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
cleanable.push(entry);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (ownedByOthers.length > 0) {
|
|
116
|
+
logger.info(`Skipping ${ownedByOthers.length} issue(s) tracked by other users that you cannot untrack.`);
|
|
117
|
+
}
|
|
118
|
+
if (cleanable.length === 0) {
|
|
119
|
+
logger.blank();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
logger.info(`Found ${cleanable.length} closed/deleted issue(s) to remove.`);
|
|
123
|
+
logger.blank();
|
|
124
|
+
// Show issues to be removed
|
|
125
|
+
for (const { issue, freshState } of cleanable) {
|
|
126
|
+
logger.log(` #${issue.number} ${issue.name} [${freshState}]`);
|
|
127
|
+
}
|
|
128
|
+
logger.blank();
|
|
129
|
+
// Confirm unless force flag
|
|
130
|
+
if (!options.force) {
|
|
131
|
+
const confirmed = await confirm(`Remove ${cleanable.length} issue(s) from tracking?`, true);
|
|
132
|
+
if (!confirmed) {
|
|
133
|
+
logger.info("Cancelled.");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Remove issues from tracking (use name for cross-repo safety)
|
|
138
|
+
let failCount = 0;
|
|
139
|
+
let permissionDeniedCount = 0;
|
|
140
|
+
for (const { issue } of cleanable) {
|
|
141
|
+
try {
|
|
142
|
+
await trackingService.removeByName(issue.name);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof AuthorizationError) {
|
|
146
|
+
logger.warning(`Skipped ${issue.name}: not permitted to untrack (owned by another user).`);
|
|
147
|
+
permissionDeniedCount++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
logger.warning(`Failed to remove ${issue.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
151
|
+
failCount++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const removed = cleanable.length - failCount - permissionDeniedCount;
|
|
156
|
+
logger.blank();
|
|
157
|
+
if (failCount > 0) {
|
|
158
|
+
logger.warning(`Failed to remove ${failCount} issue(s). Re-run to retry.`);
|
|
159
|
+
}
|
|
160
|
+
if (permissionDeniedCount > 0) {
|
|
161
|
+
logger.warning(`${permissionDeniedCount} issue(s) skipped — these are tracked by another user. ` +
|
|
162
|
+
`Ask the original tracker (or a workspace admin) to remove them.`);
|
|
163
|
+
}
|
|
164
|
+
if (removed > 0) {
|
|
165
|
+
logger.success(`✨ Removed ${removed} issue(s) from tracking`);
|
|
166
|
+
}
|
|
167
|
+
logger.blank();
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Clean up orphaned browser processes from hublaunch preview
|
|
171
|
+
*/
|
|
172
|
+
async function cleanupBrowsers() {
|
|
173
|
+
logger.section("Clean Up Browser Processes");
|
|
174
|
+
// First, clean up any tracked background hook processes
|
|
175
|
+
logger.info("Cleaning up tracked background processes...");
|
|
176
|
+
HookExecutor.cleanup();
|
|
177
|
+
// Then, try to kill any Playwright Chromium processes
|
|
178
|
+
logger.info("Looking for orphaned Playwright Chromium processes...");
|
|
179
|
+
try {
|
|
180
|
+
// Get count of playwright chromium processes
|
|
181
|
+
const countResult = execSync('ps aux | grep -i "ms-playwright.*Chromium" | grep -v grep | wc -l', { encoding: 'utf-8' }).trim();
|
|
182
|
+
const processCount = parseInt(countResult, 10);
|
|
183
|
+
if (processCount > 0) {
|
|
184
|
+
logger.info(`Found ${processCount} Playwright Chromium process(es)`);
|
|
185
|
+
// Kill them
|
|
186
|
+
try {
|
|
187
|
+
execSync('pkill -f "ms-playwright.*Chromium"', { encoding: 'utf-8' });
|
|
188
|
+
logger.success(`✓ Killed ${processCount} Playwright Chromium process(es)`);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// pkill returns non-zero if no processes matched, which is fine
|
|
192
|
+
logger.success("✓ Cleaned up Playwright processes");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
logger.info("No orphaned Playwright Chromium processes found");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
logger.info("No orphaned Playwright Chromium processes found");
|
|
201
|
+
}
|
|
202
|
+
logger.blank();
|
|
203
|
+
logger.success("✨ Browser cleanup complete");
|
|
204
|
+
logger.blank();
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.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
|
+
* Close command - Close issue and remove from tracking
|
|
5
|
+
*/
|
|
6
|
+
export declare function closeCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=close.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../src/commands/close.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBnE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { IssueService } from "../services/github/IssueService.js";
|
|
3
|
+
import { TrackingService } from "../services/tracking/TrackingService.js";
|
|
4
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
5
|
+
import { confirm, numberInput, UserCancelledError } from "../utils/prompts.js";
|
|
6
|
+
import { AuthorizationError } from "../services/api/HulaApiClient.js";
|
|
7
|
+
/**
|
|
8
|
+
* Close command - Close issue and remove from tracking
|
|
9
|
+
*/
|
|
10
|
+
export function closeCommand(program, config) {
|
|
11
|
+
program
|
|
12
|
+
.command("close [issueNumber]")
|
|
13
|
+
.description("Close issue and remove from tracking")
|
|
14
|
+
.action(async (issueNumber) => {
|
|
15
|
+
try {
|
|
16
|
+
await executeClose(config, issueNumber);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof UserCancelledError) {
|
|
20
|
+
logger.info('\nCancelled.');
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
logger.error("Failed to close issue:");
|
|
24
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function executeClose(config, issueNumberArg) {
|
|
30
|
+
logger.section("Close Issue");
|
|
31
|
+
// Initialize services
|
|
32
|
+
const issueService = new IssueService();
|
|
33
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
34
|
+
// Get issue number
|
|
35
|
+
let issueNumber;
|
|
36
|
+
if (issueNumberArg) {
|
|
37
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
38
|
+
if (isNaN(issueNumber)) {
|
|
39
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
issueNumber = await numberInput("Enter issue number to close:");
|
|
44
|
+
}
|
|
45
|
+
// Check if tracked
|
|
46
|
+
const trackedIssue = await trackingService.getByNumber(issueNumber);
|
|
47
|
+
if (!trackedIssue) {
|
|
48
|
+
logger.warning(`Issue #${issueNumber} is not tracked.`);
|
|
49
|
+
const shouldContinue = await confirm("Close it anyway?", false);
|
|
50
|
+
if (!shouldContinue) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Only confirm if not called from interactive mode (which already confirms)
|
|
56
|
+
// Interactive mode passes --remove flag
|
|
57
|
+
// if (options.remove) {
|
|
58
|
+
// const confirmed = await confirm(`Close issue #${issueNumber}?`, false);
|
|
59
|
+
// if (!confirmed) {
|
|
60
|
+
// logger.info("Cancelled.");
|
|
61
|
+
// return;
|
|
62
|
+
// }
|
|
63
|
+
// }
|
|
64
|
+
}
|
|
65
|
+
// Close issue on GitHub (use tracked issue's repo info for cross-repo safety)
|
|
66
|
+
logger.info(`Closing issue #${issueNumber}...`);
|
|
67
|
+
try {
|
|
68
|
+
await issueService.close(issueNumber, trackedIssue?.projectOwner, trackedIssue?.projectName);
|
|
69
|
+
logger.success(`Closed issue #${issueNumber}`);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
73
|
+
// Check if issue was deleted (HTTP 410)
|
|
74
|
+
if (errorMessage.includes("410") || errorMessage.includes("deleted")) {
|
|
75
|
+
logger.warning(`Issue #${issueNumber} has been deleted`);
|
|
76
|
+
}
|
|
77
|
+
else if (errorMessage.includes("404") ||
|
|
78
|
+
errorMessage.includes("not found")) {
|
|
79
|
+
logger.warning(`Issue #${issueNumber} not found (may have been deleted)`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Re-throw if it's a different error
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Remove from tracking (we don't track closed issues). The GitHub close
|
|
87
|
+
// already happened — the server-side webhook will also flip tracking
|
|
88
|
+
// state — so a 403 here is informational, not fatal.
|
|
89
|
+
if (trackedIssue) {
|
|
90
|
+
logger.info("Removing from tracking...");
|
|
91
|
+
try {
|
|
92
|
+
await trackingService.removeByName(trackedIssue.name);
|
|
93
|
+
logger.success("Removed from tracking");
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
if (error instanceof AuthorizationError) {
|
|
97
|
+
logger.warning("You don't have permission to manually untrack this issue, but the server's GitHub webhook will mark it closed automatically.");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
logger.error(`Failed to remove from tracking: ${error instanceof Error ? error.message : String(error)}`);
|
|
101
|
+
logger.info(`(Issue #${issueNumber} was successfully closed on GitHub.)`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
logger.blank();
|
|
106
|
+
logger.success("✨ Issue closed successfully!");
|
|
107
|
+
logger.blank();
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../src/commands/close.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
|
+
* Create command - Create GitHub issue from plan file
|
|
5
|
+
*/
|
|
6
|
+
export declare function createCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,OAAO,KAAK,EAAE,MAAM,EAA+B,MAAM,mBAAmB,CAAC;AAW7E;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2CpE"}
|