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,105 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { HulaApiClient } from '../services/api/HulaApiClient.js';
|
|
6
|
+
import { LogFormatterService } from '../services/logs/LogFormatterService.js';
|
|
7
|
+
import { TempFileService } from '../services/logs/TempFileService.js';
|
|
8
|
+
import { EditorService } from '../services/editor/EditorService.js';
|
|
9
|
+
import { resolveProject } from '../utils/project-resolver.js';
|
|
10
|
+
/**
|
|
11
|
+
* Logs command - View logs for a tracked plan
|
|
12
|
+
*
|
|
13
|
+
* Usage: hula logs <trackingName> [--lines N] [--raw]
|
|
14
|
+
*/
|
|
15
|
+
export function logsCommand(program, config) {
|
|
16
|
+
program
|
|
17
|
+
.command('logs <trackingName>')
|
|
18
|
+
// .alias("g")
|
|
19
|
+
.description('View logs for a tracked plan')
|
|
20
|
+
.option('--lines <number>', 'Number of lines to show (default: 100)', '100')
|
|
21
|
+
.option('-r, --raw', 'Show raw log output only', false)
|
|
22
|
+
.action(async (trackingName, options) => {
|
|
23
|
+
await executeLogs(trackingName, options, config);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Execute logs command - fetch and display logs for a tracked plan
|
|
28
|
+
*
|
|
29
|
+
* @param trackingName - The plan's tracking name (e.g., "fix-button")
|
|
30
|
+
* @param options - Command options (lines, raw)
|
|
31
|
+
* @param config - HubLaunch configuration
|
|
32
|
+
*/
|
|
33
|
+
export async function executeLogs(trackingName, options, config) {
|
|
34
|
+
const serverUrl = config.hulaProjectUrl ?? process.env.HULA_PROJECT_URL;
|
|
35
|
+
const apiKey = config.hulaApiKey ?? process.env.HULA_API_KEY;
|
|
36
|
+
const lines = parseInt(options.lines, 10) || 100;
|
|
37
|
+
if (!serverUrl || !apiKey) {
|
|
38
|
+
logger.error('Server URL and API key are required.');
|
|
39
|
+
logger.info("Run 'hula login' to authenticate with hula-project.");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
logger.info(`📋 Fetching logs for: ${trackingName}`);
|
|
43
|
+
logger.blank();
|
|
44
|
+
const apiClient = new HulaApiClient({
|
|
45
|
+
baseUrl: serverUrl.replace(/\/$/, ''),
|
|
46
|
+
apiKey,
|
|
47
|
+
timeout: 30000,
|
|
48
|
+
});
|
|
49
|
+
const project = await resolveProject(config);
|
|
50
|
+
try {
|
|
51
|
+
const content = await apiClient.fetchTaskLogs(trackingName, {
|
|
52
|
+
type: 'log',
|
|
53
|
+
lines,
|
|
54
|
+
project,
|
|
55
|
+
});
|
|
56
|
+
if (options.raw) {
|
|
57
|
+
process.stdout.write(content);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const formatter = new LogFormatterService();
|
|
61
|
+
const formatted = formatter.formatPlainText(content, {
|
|
62
|
+
trackingName,
|
|
63
|
+
lines,
|
|
64
|
+
});
|
|
65
|
+
const tempFileService = new TempFileService(path.join(os.tmpdir(), 'hublaunch-logs'));
|
|
66
|
+
const filePath = await tempFileService.createTempFile(formatted, trackingName);
|
|
67
|
+
logger.info(`Log file created: ${filePath}`);
|
|
68
|
+
const editorService = new EditorService(config.editorCommand);
|
|
69
|
+
await editorService.openFile(filePath);
|
|
70
|
+
logger.success('✓ Log file opened in editor');
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
handleApiError(error, serverUrl);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function handleApiError(error, serverUrl) {
|
|
78
|
+
if (axios.isAxiosError(error)) {
|
|
79
|
+
if (error.response) {
|
|
80
|
+
const status = error.response.status;
|
|
81
|
+
const data = error.response.data;
|
|
82
|
+
switch (status) {
|
|
83
|
+
case 401:
|
|
84
|
+
logger.error('Authentication failed. Your API key may be invalid.');
|
|
85
|
+
logger.info("Run 'hula login' to re-authenticate.");
|
|
86
|
+
break;
|
|
87
|
+
case 404:
|
|
88
|
+
logger.error(data.error ?? 'Plan not found or no logs available');
|
|
89
|
+
break;
|
|
90
|
+
default:
|
|
91
|
+
logger.error(data.error ?? `Request failed with status ${status}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else if (error.code === 'ECONNREFUSED') {
|
|
95
|
+
logger.error(`Cannot connect to server at ${serverUrl}`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
logger.error(`Network error: ${error.message}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.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
|
+
* Merge command - Merge PR, delete branch, remove from tracking
|
|
5
|
+
*/
|
|
6
|
+
export declare function mergeCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/commands/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBnE"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { PRService } from "../services/github/PRService.js";
|
|
3
|
+
import { TrackingService, } from "../services/tracking/TrackingService.js";
|
|
4
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
5
|
+
import { searchSelect, UserCancelledError } from "../utils/prompts.js";
|
|
6
|
+
import { GitService } from "../services/git/GitService.js";
|
|
7
|
+
import { runCommand } from "../utils/shell.js";
|
|
8
|
+
/**
|
|
9
|
+
* Merge command - Merge PR, delete branch, remove from tracking
|
|
10
|
+
*/
|
|
11
|
+
export function mergeCommand(program, config) {
|
|
12
|
+
program
|
|
13
|
+
.command("merge [issueNumber]")
|
|
14
|
+
.description("Merge PR, delete branch, remove from tracking")
|
|
15
|
+
.option("--no-delete", "Don't delete branch after merge")
|
|
16
|
+
.option("--no-remove", "Don't remove from tracking")
|
|
17
|
+
.action(async (issueNumber, options) => {
|
|
18
|
+
try {
|
|
19
|
+
await executeMerge(config, issueNumber, options);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof UserCancelledError) {
|
|
23
|
+
logger.info('\nCancelled.');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
logger.error("Failed to merge PR:");
|
|
27
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function executeMerge(config, issueNumberArg, options) {
|
|
33
|
+
logger.section("Merge Pull Request");
|
|
34
|
+
// Initialize services
|
|
35
|
+
const prService = new PRService();
|
|
36
|
+
const gitService = new GitService();
|
|
37
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
38
|
+
// Get issue number
|
|
39
|
+
let issueNumber;
|
|
40
|
+
if (issueNumberArg) {
|
|
41
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
42
|
+
if (isNaN(issueNumber)) {
|
|
43
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Show tracked issues and let user select
|
|
48
|
+
const trackedIssues = await trackingService.getAll();
|
|
49
|
+
if (trackedIssues.length === 0) {
|
|
50
|
+
throw new Error("No tracked issues found. Run 'hublaunch track' first.");
|
|
51
|
+
}
|
|
52
|
+
const choices = trackedIssues
|
|
53
|
+
.filter((issue) => issue.number !== undefined)
|
|
54
|
+
.map((issue) => ({
|
|
55
|
+
name: `#${issue.number} - ${issue.name}`,
|
|
56
|
+
value: issue.number.toString(),
|
|
57
|
+
}));
|
|
58
|
+
const selected = await searchSelect("Select issue to merge:", choices);
|
|
59
|
+
issueNumber = parseInt(selected, 10);
|
|
60
|
+
}
|
|
61
|
+
// Get tracked issue
|
|
62
|
+
const trackedIssue = await trackingService.getByNumber(issueNumber);
|
|
63
|
+
if (!trackedIssue) {
|
|
64
|
+
logger.warning(`Issue #${issueNumber} is not tracked. Continuing anyway...`);
|
|
65
|
+
}
|
|
66
|
+
// Get PRs for issue
|
|
67
|
+
logger.info(`Fetching PRs for issue #${issueNumber}...`);
|
|
68
|
+
const prs = await prService.getAllByIssue(issueNumber);
|
|
69
|
+
if (prs.length === 0) {
|
|
70
|
+
throw new Error(`No PRs found for issue #${issueNumber}`);
|
|
71
|
+
}
|
|
72
|
+
// Select PR (prioritize open PRs)
|
|
73
|
+
let prNumber;
|
|
74
|
+
if (prs.length === 1) {
|
|
75
|
+
const firstPR = prs[0];
|
|
76
|
+
if (!firstPR) {
|
|
77
|
+
throw new Error("PR data is invalid");
|
|
78
|
+
}
|
|
79
|
+
prNumber = firstPR.number;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Prioritize open PRs
|
|
83
|
+
const openPRs = prs.filter((pr) => pr.state === "open");
|
|
84
|
+
if (openPRs.length > 0) {
|
|
85
|
+
if (openPRs.length === 1) {
|
|
86
|
+
const firstOpenPR = openPRs[0];
|
|
87
|
+
if (!firstOpenPR) {
|
|
88
|
+
throw new Error("PR data is invalid");
|
|
89
|
+
}
|
|
90
|
+
prNumber = firstOpenPR.number;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Multiple open PRs - let user choose
|
|
94
|
+
logger.warning(`Found ${openPRs.length} open PRs for this issue:`);
|
|
95
|
+
logger.blank();
|
|
96
|
+
openPRs.forEach((pr) => {
|
|
97
|
+
logger.info(` PR #${pr.number}: ${pr.title}`);
|
|
98
|
+
});
|
|
99
|
+
logger.blank();
|
|
100
|
+
const choices = openPRs.map((pr) => ({
|
|
101
|
+
name: `#${pr.number} - ${pr.title}`,
|
|
102
|
+
value: pr.number.toString(),
|
|
103
|
+
}));
|
|
104
|
+
const selected = await searchSelect("Select PR to merge:", choices);
|
|
105
|
+
prNumber = parseInt(selected, 10);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
throw new Error(`No open PRs found for issue #${issueNumber}. All PRs are closed or merged.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const pr = prs.find((p) => p.number === prNumber);
|
|
113
|
+
if (!pr) {
|
|
114
|
+
throw new Error(`PR #${prNumber} not found`);
|
|
115
|
+
}
|
|
116
|
+
logger.blank();
|
|
117
|
+
logger.info("PR Details:");
|
|
118
|
+
logger.info(` Number: #${prNumber}`);
|
|
119
|
+
logger.info(` Title: ${pr.title}`);
|
|
120
|
+
logger.info(` Branch: ${pr.head.ref}`);
|
|
121
|
+
logger.info(` State: ${pr.state}`);
|
|
122
|
+
logger.blank();
|
|
123
|
+
// Check if PR is a draft and mark as ready if needed
|
|
124
|
+
const isDraft = await prService.isDraft(prNumber);
|
|
125
|
+
if (isDraft) {
|
|
126
|
+
logger.warning("This PR is currently in draft state.");
|
|
127
|
+
logger.info("Marking PR as ready for review...");
|
|
128
|
+
try {
|
|
129
|
+
await prService.convertToReady(prNumber);
|
|
130
|
+
logger.success("✓ PR marked as ready for review");
|
|
131
|
+
logger.blank();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
logger.warning("Warning: Could not mark PR as ready. Attempting to merge anyway...");
|
|
135
|
+
logger.blank();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Confirmation prompt
|
|
139
|
+
logger.warning("═══════════════════════════════════════════════════════");
|
|
140
|
+
logger.warning(`Ready to merge PR #${prNumber}`);
|
|
141
|
+
if (trackedIssue) {
|
|
142
|
+
logger.info(` Issue: ${trackedIssue.name} (#${issueNumber})`);
|
|
143
|
+
}
|
|
144
|
+
logger.info(` PR: ${pr.title} (#${prNumber})`);
|
|
145
|
+
logger.blank();
|
|
146
|
+
logger.info("This will:");
|
|
147
|
+
logger.info(" 1. Merge the PR using squash merge");
|
|
148
|
+
if (options.delete) {
|
|
149
|
+
logger.info(" 2. Delete the branch");
|
|
150
|
+
}
|
|
151
|
+
if (options.remove && trackedIssue) {
|
|
152
|
+
logger.info(` 3. Remove issue #${issueNumber} from tracking`);
|
|
153
|
+
}
|
|
154
|
+
logger.blank();
|
|
155
|
+
logger.warning("═══════════════════════════════════════════════════════");
|
|
156
|
+
logger.blank();
|
|
157
|
+
// Perform merge
|
|
158
|
+
logger.blank();
|
|
159
|
+
logger.info(`Merging PR #${prNumber}...`);
|
|
160
|
+
try {
|
|
161
|
+
await prService.merge(prNumber, {
|
|
162
|
+
mergeMethod: "squash",
|
|
163
|
+
deleteBranch: options.delete,
|
|
164
|
+
});
|
|
165
|
+
logger.blank();
|
|
166
|
+
logger.success(`✓ PR #${prNumber} merged successfully!`);
|
|
167
|
+
logger.blank();
|
|
168
|
+
// Delete local branch if it exists
|
|
169
|
+
let localBranchDeleted = false;
|
|
170
|
+
if (options.delete) {
|
|
171
|
+
try {
|
|
172
|
+
const currentBranch = await gitService.getCurrentBranch();
|
|
173
|
+
if (currentBranch === pr.head.ref) {
|
|
174
|
+
// Detect default branch using gh CLI (already a project dependency)
|
|
175
|
+
let defaultBranch = "main";
|
|
176
|
+
try {
|
|
177
|
+
const repoInfo = await runCommand('gh repo view --json defaultBranchRef --jq ".defaultBranchRef.name"', { silent: true });
|
|
178
|
+
if (repoInfo.trim()) {
|
|
179
|
+
defaultBranch = repoInfo.trim();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
logger.debug("Could not detect default branch, falling back to 'main'");
|
|
184
|
+
}
|
|
185
|
+
logger.info(`Switching to ${defaultBranch} before deleting branch...`);
|
|
186
|
+
await gitService.checkout(defaultBranch);
|
|
187
|
+
}
|
|
188
|
+
await gitService.deleteBranch(pr.head.ref, true);
|
|
189
|
+
localBranchDeleted = true;
|
|
190
|
+
logger.success(`✓ Deleted local branch: ${pr.head.ref}`);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
logger.debug(`Could not delete local branch ${pr.head.ref}: ${error instanceof Error ? error.message : String(error)}`);
|
|
194
|
+
// Non-critical — branch may not exist locally (e.g., remote-only PR)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Remove from tracking if requested
|
|
198
|
+
if (options.remove && trackedIssue) {
|
|
199
|
+
logger.info("Removing from tracking...");
|
|
200
|
+
await trackingService.removeByName(trackedIssue.name);
|
|
201
|
+
logger.success(`✓ Removed issue #${issueNumber} from tracking`);
|
|
202
|
+
}
|
|
203
|
+
// Remove from GitHub Project if configured
|
|
204
|
+
// TODO: Implement ProjectService.removeIssue method
|
|
205
|
+
if (trackedIssue && config.projectNumber) {
|
|
206
|
+
logger.debug("Project removal not yet implemented");
|
|
207
|
+
// try {
|
|
208
|
+
// const projectService = new ProjectService();
|
|
209
|
+
// await projectService.removeIssue(config.projectNumber, issueNumber);
|
|
210
|
+
// logger.success("✓ Removed from GitHub Project");
|
|
211
|
+
// } catch (error) {
|
|
212
|
+
// logger.debug(
|
|
213
|
+
// `Could not remove from project: ${error instanceof Error ? error.message : String(error)}`
|
|
214
|
+
// );
|
|
215
|
+
// // Non-critical error, continue
|
|
216
|
+
// }
|
|
217
|
+
}
|
|
218
|
+
logger.blank();
|
|
219
|
+
logger.success("═══════════════════════════════════════════════════════");
|
|
220
|
+
logger.success("✨ Merge Complete!");
|
|
221
|
+
logger.blank();
|
|
222
|
+
logger.info("Summary:");
|
|
223
|
+
logger.info(` ✓ PR #${prNumber} merged and branch deleted remotely`);
|
|
224
|
+
if (options.delete && localBranchDeleted) {
|
|
225
|
+
logger.info(` ✓ Local branch ${pr.head.ref} deleted`);
|
|
226
|
+
}
|
|
227
|
+
if (options.remove && trackedIssue) {
|
|
228
|
+
logger.info(` ✓ Issue #${issueNumber} removed from tracking`);
|
|
229
|
+
}
|
|
230
|
+
logger.blank();
|
|
231
|
+
logger.success("═══════════════════════════════════════════════════════");
|
|
232
|
+
logger.blank();
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
logger.blank();
|
|
236
|
+
logger.error(`Failed to merge PR #${prNumber}`);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/commands/merge.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
|
+
* Preview command - Open PR deployment preview
|
|
5
|
+
*/
|
|
6
|
+
export declare function previewCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBrE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { PRService } from "../services/github/PRService.js";
|
|
3
|
+
import { TrackingService } from "../services/tracking/TrackingService.js";
|
|
4
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
5
|
+
import { PreviewService } from "../services/preview/PreviewService.js";
|
|
6
|
+
import { searchSelect, UserCancelledError } from "../utils/prompts.js";
|
|
7
|
+
import { HookExecutor } from "../services/hooks/HookExecutor.js";
|
|
8
|
+
/**
|
|
9
|
+
* Preview command - Open PR deployment preview
|
|
10
|
+
*/
|
|
11
|
+
export function previewCommand(program, config) {
|
|
12
|
+
program
|
|
13
|
+
.command("preview [issueNumber]")
|
|
14
|
+
.description("Open PR deployment preview with automated login")
|
|
15
|
+
.option("--no-session", "Open in system browser without persistent session")
|
|
16
|
+
.option("--no-hook", "Skip deployment startup hook, use built-in auto-login")
|
|
17
|
+
.option("--background", "Open browser and return immediately")
|
|
18
|
+
.action(async (issueNumber, options) => {
|
|
19
|
+
try {
|
|
20
|
+
await executePreview(config, issueNumber, options);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof UserCancelledError) {
|
|
24
|
+
logger.info('\nCancelled.');
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
logger.error("Failed to open preview:");
|
|
28
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async function executePreview(config, issueNumberArg, options = { session: true, hook: true, background: false }) {
|
|
34
|
+
logger.section("Open Deployment Preview");
|
|
35
|
+
// Initialize services
|
|
36
|
+
const prService = new PRService();
|
|
37
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
38
|
+
const hookExecutor = new HookExecutor();
|
|
39
|
+
const previewService = new PreviewService(config);
|
|
40
|
+
// Get issue number
|
|
41
|
+
let issueNumber;
|
|
42
|
+
if (issueNumberArg) {
|
|
43
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
44
|
+
if (isNaN(issueNumber)) {
|
|
45
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Show tracked issues and let user select
|
|
50
|
+
const trackedIssues = await trackingService.getAll();
|
|
51
|
+
if (trackedIssues.length === 0) {
|
|
52
|
+
throw new Error("No tracked issues found. Run 'hublaunch track' first.");
|
|
53
|
+
}
|
|
54
|
+
const choices = trackedIssues
|
|
55
|
+
.filter((issue) => issue.number !== undefined)
|
|
56
|
+
.map((issue) => ({
|
|
57
|
+
name: `#${issue.number} - ${issue.name}`,
|
|
58
|
+
value: issue.number.toString(),
|
|
59
|
+
}));
|
|
60
|
+
const selected = await searchSelect("Select issue to preview:", choices);
|
|
61
|
+
issueNumber = parseInt(selected, 10);
|
|
62
|
+
}
|
|
63
|
+
// Get PR for issue
|
|
64
|
+
logger.info(`Fetching PR for issue #${issueNumber}...`);
|
|
65
|
+
const pr = await prService.getByIssue(issueNumber);
|
|
66
|
+
if (!pr) {
|
|
67
|
+
throw new Error(`No PR found for issue #${issueNumber}`);
|
|
68
|
+
}
|
|
69
|
+
logger.info(`Found PR #${pr.number}: ${pr.title}`);
|
|
70
|
+
logger.blank();
|
|
71
|
+
// Try to extract Vercel URL from PR
|
|
72
|
+
logger.info("Looking for deployment URL...");
|
|
73
|
+
// Get PR comments to find Vercel deployment URL
|
|
74
|
+
const timeline = await prService.getTimeline(pr.number);
|
|
75
|
+
let deploymentUrl = null;
|
|
76
|
+
// Search for vercel.app URLs in timeline
|
|
77
|
+
for (const event of timeline) {
|
|
78
|
+
if (typeof event === "object" && event !== null && "body" in event) {
|
|
79
|
+
const body = String(event.body);
|
|
80
|
+
const vercelMatch = body.match(/https?:\/\/[^\s]*\.vercel\.app/);
|
|
81
|
+
if (vercelMatch) {
|
|
82
|
+
deploymentUrl = vercelMatch[0];
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!deploymentUrl) {
|
|
88
|
+
logger.warning("Could not find Vercel deployment URL in PR comments");
|
|
89
|
+
logger.info(`Opening PR page instead: ${pr.html_url}`);
|
|
90
|
+
logger.blank();
|
|
91
|
+
// Open PR in browser with auto-login
|
|
92
|
+
if (options.session) {
|
|
93
|
+
if (options.background) {
|
|
94
|
+
await previewService.openInBackground(pr.html_url);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await previewService.openWithAutoLogin(pr.html_url, { keepOpen: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Fallback to system browser
|
|
102
|
+
const open = await import('open');
|
|
103
|
+
await open.default(pr.html_url);
|
|
104
|
+
logger.success("✓ Opened PR in browser");
|
|
105
|
+
}
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
logger.success(`Found deployment: ${deploymentUrl}`);
|
|
109
|
+
logger.blank();
|
|
110
|
+
// Prepare hook context
|
|
111
|
+
const hookContext = {
|
|
112
|
+
issueNumber,
|
|
113
|
+
prNumber: pr.number,
|
|
114
|
+
deploymentUrl,
|
|
115
|
+
prTitle: pr.title,
|
|
116
|
+
prUrl: pr.html_url,
|
|
117
|
+
};
|
|
118
|
+
// Check for configured hook first, then legacy preview-init.ts
|
|
119
|
+
const hookPath = config.hooks?.deploymentStartup ||
|
|
120
|
+
".hublaunch/hooks/deploymentStartupScript.ts";
|
|
121
|
+
const legacyPath = ".hublaunch/preview-init.ts";
|
|
122
|
+
// Try configured hook first, then legacy path (skip if --no-hook)
|
|
123
|
+
if (options.hook && hookExecutor.exists(hookPath)) {
|
|
124
|
+
logger.info("Deployment startup hook found, executing...");
|
|
125
|
+
logger.info("Opening browser in background...");
|
|
126
|
+
logger.blank();
|
|
127
|
+
await hookExecutor.executeBackground(hookPath, hookContext);
|
|
128
|
+
logger.success("✓ Browser is opening...");
|
|
129
|
+
logger.info("You can continue working while the browser is open.");
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
else if (options.hook && hookExecutor.exists(legacyPath)) {
|
|
133
|
+
logger.warning("Found legacy preview-init.ts - consider migrating to hooks/");
|
|
134
|
+
logger.info("Opening browser in background...");
|
|
135
|
+
logger.blank();
|
|
136
|
+
await hookExecutor.executeBackground(legacyPath, hookContext);
|
|
137
|
+
logger.success("✓ Browser is opening...");
|
|
138
|
+
logger.info("You can continue working while the browser is open.");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Use PreviewService with automated login
|
|
142
|
+
logger.info("Opening deployment with auto-login...");
|
|
143
|
+
logger.info("(Uses TEST_USER_EMAIL & TEST_USER_PASSWORD env vars)");
|
|
144
|
+
logger.blank();
|
|
145
|
+
if (options.background) {
|
|
146
|
+
await previewService.openInBackground(deploymentUrl);
|
|
147
|
+
}
|
|
148
|
+
else if (options.session) {
|
|
149
|
+
await previewService.openWithAutoLogin(deploymentUrl, { keepOpen: true });
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// No session mode - use system browser
|
|
153
|
+
const open = await import('open');
|
|
154
|
+
await open.default(deploymentUrl);
|
|
155
|
+
logger.success("✓ Opened deployment in browser");
|
|
156
|
+
}
|
|
157
|
+
logger.blank();
|
|
158
|
+
logger.success("✨ Preview opened!");
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { Config } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Project command - Setup and manage GitHub Projects V2 integration
|
|
5
|
+
*/
|
|
6
|
+
export declare function projectCommand(program: Command, config: Config): void;
|
|
7
|
+
/**
|
|
8
|
+
* Run project setup flow and return configuration values
|
|
9
|
+
* This can be called from both 'project setup' and 'init' commands
|
|
10
|
+
* Returns null if setup is cancelled or fails
|
|
11
|
+
*/
|
|
12
|
+
export declare function runProjectSetupFlow(): Promise<{
|
|
13
|
+
projectNumber: number;
|
|
14
|
+
projectId: string;
|
|
15
|
+
projectOwner: string;
|
|
16
|
+
enableAutoSync: boolean;
|
|
17
|
+
} | null>;
|
|
18
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BrE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,IAAI,CAAC,CAoOR"}
|