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,367 @@
|
|
|
1
|
+
import { dirname } from 'path';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
|
+
import { IssueService } from '../services/github/IssueService.js';
|
|
4
|
+
import { CopilotService } from '../services/github/CopilotService.js';
|
|
5
|
+
import { ProjectService } from '../services/github/ProjectService.js';
|
|
6
|
+
import { AssetUploadService } from '../services/github/AssetUploadService.js';
|
|
7
|
+
import { PlanService } from '../services/plan/PlanService.js';
|
|
8
|
+
import { TrackingService } from '../services/tracking/TrackingService.js';
|
|
9
|
+
import { TrackingAdapterFactory } from '../services/tracking/TrackingAdapterFactory.js';
|
|
10
|
+
import { GitService } from '../services/git/GitService.js';
|
|
11
|
+
import { executeUpload } from './upload.js';
|
|
12
|
+
import { STATUS } from '../types/common.schema.js';
|
|
13
|
+
import { confirm, multiSelect, input, selectPriority, UserCancelledError, } from '../utils/prompts.js';
|
|
14
|
+
import { getRepoInfo } from '../utils/github-cli.js';
|
|
15
|
+
import { ConflictError } from '../services/api/HulaApiClient.js';
|
|
16
|
+
/**
|
|
17
|
+
* Create command - Create GitHub issue from plan file
|
|
18
|
+
*/
|
|
19
|
+
export function createCommand(program, config) {
|
|
20
|
+
program
|
|
21
|
+
.command('create [assignee]')
|
|
22
|
+
.description('Create GitHub issue from plan file')
|
|
23
|
+
.option('--plan <file>', 'Specific plan file to use')
|
|
24
|
+
.option('--name <name>', 'Local tracking name for the issue')
|
|
25
|
+
.option('--handoff <username>', 'Team member to hand off to')
|
|
26
|
+
.option('--priority <level>', 'Priority level (Critical, High, Medium, Low, Minimal)')
|
|
27
|
+
.option('--no-copilot', 'Skip Copilot assignment')
|
|
28
|
+
.option('--no-track', "Don't add to tracking")
|
|
29
|
+
.option('--attach <files...>', 'Image files to attach to the issue (png, jpg, gif, webp)')
|
|
30
|
+
.action(async (assignee, options) => {
|
|
31
|
+
try {
|
|
32
|
+
await executeCreate(config, assignee, options);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof UserCancelledError) {
|
|
36
|
+
logger.info('\nCancelled.');
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
logger.error('Failed to create issue:');
|
|
40
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async function executeCreate(config, assigneeArg, options) {
|
|
46
|
+
logger.section('Create GitHub Issue from Plan');
|
|
47
|
+
// Initialize services
|
|
48
|
+
const issueService = new IssueService();
|
|
49
|
+
const copilotService = new CopilotService(config);
|
|
50
|
+
const planService = new PlanService(config.planPath);
|
|
51
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
52
|
+
// Select plan file
|
|
53
|
+
logger.info('Selecting plan file...');
|
|
54
|
+
let planFile;
|
|
55
|
+
if (options.plan) {
|
|
56
|
+
planFile = await planService.getPlanByFilename(options.plan);
|
|
57
|
+
if (!planFile) {
|
|
58
|
+
throw new Error(`Plan file not found: ${options.plan}\n` +
|
|
59
|
+
`Searched in: ${config.planPath}\n` +
|
|
60
|
+
`Also checked direct path.\n` +
|
|
61
|
+
`Make sure you created the plan with /hula-plan first.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
planFile = await planService.selectPlan(config.createIssuesPreference, config.planChoices);
|
|
66
|
+
}
|
|
67
|
+
logger.success(`Selected: ${planFile.filename}`);
|
|
68
|
+
// Parse plan
|
|
69
|
+
const plan = await planService.parsePlan(planFile.path);
|
|
70
|
+
// --- Attachment Processing ---
|
|
71
|
+
// Must happen BEFORE the plan sync to origin/main so the synced version
|
|
72
|
+
// contains GitHub URLs instead of broken local paths.
|
|
73
|
+
const assetUploadService = new AssetUploadService();
|
|
74
|
+
let processedBody = plan.body;
|
|
75
|
+
// 1. Auto-detect and resolve local image references in the plan body
|
|
76
|
+
const planDir = dirname(planFile.path);
|
|
77
|
+
processedBody = await assetUploadService.resolveLocalImages(processedBody, planDir);
|
|
78
|
+
// 2. Upload explicit --attach files and append to body
|
|
79
|
+
if (options.attach && options.attach.length > 0) {
|
|
80
|
+
logger.blank();
|
|
81
|
+
logger.section('Uploading Attachments');
|
|
82
|
+
// Validate all files first (fail fast)
|
|
83
|
+
const validatedPaths = [];
|
|
84
|
+
for (const filePath of options.attach) {
|
|
85
|
+
const resolved = assetUploadService.validateImageFile(filePath);
|
|
86
|
+
validatedPaths.push(resolved);
|
|
87
|
+
}
|
|
88
|
+
// Upload all validated files
|
|
89
|
+
const uploaded = await assetUploadService.uploadImages(validatedPaths);
|
|
90
|
+
// Append attachments section to body
|
|
91
|
+
if (uploaded.length > 0) {
|
|
92
|
+
const attachmentLines = uploaded.map((a) => a.markdown).join('\n');
|
|
93
|
+
processedBody += '\n\n## Attachments\n\n' + attachmentLines;
|
|
94
|
+
logger.success(`${uploaded.length} attachment(s) uploaded`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// 3. If any images were resolved in the plan body, write the updated plan
|
|
98
|
+
// back to disk so the plan sync to origin/main below includes the
|
|
99
|
+
// GitHub URLs.
|
|
100
|
+
if (processedBody !== plan.body) {
|
|
101
|
+
const { writeFileSync } = await import('fs');
|
|
102
|
+
const fileContent = processedBody.startsWith('# ')
|
|
103
|
+
? processedBody
|
|
104
|
+
: `# ${plan.title}\n\n${processedBody}`;
|
|
105
|
+
writeFileSync(planFile.path, fileContent, 'utf-8');
|
|
106
|
+
logger.debug('Updated plan file with resolved image URLs');
|
|
107
|
+
}
|
|
108
|
+
// Check if plan needs to be synced to origin/main (like launch does)
|
|
109
|
+
const planSyncStatus = await checkPlanSyncStatus(config, planFile.path);
|
|
110
|
+
if (!planSyncStatus.synced) {
|
|
111
|
+
if (planSyncStatus.location === 'not-found') {
|
|
112
|
+
// Plan file exists locally (we just read it) but not tracked in git
|
|
113
|
+
// This is fine for create - we just need the content to create the issue
|
|
114
|
+
logger.debug('Plan not found on origin/main, but available locally');
|
|
115
|
+
}
|
|
116
|
+
else if (planSyncStatus.location === 'local-main') {
|
|
117
|
+
// Auto-upload the plan so it's available on origin/main
|
|
118
|
+
logger.info('Plan not yet on origin/main, uploading...');
|
|
119
|
+
try {
|
|
120
|
+
await executeUpload(config, planFile.path);
|
|
121
|
+
logger.success('Plan synced to origin/main');
|
|
122
|
+
logger.blank();
|
|
123
|
+
}
|
|
124
|
+
catch (uploadError) {
|
|
125
|
+
// Upload failure is non-fatal for create - we can still create the issue
|
|
126
|
+
// from the local plan content
|
|
127
|
+
logger.warning('Could not upload plan to origin/main (continuing with local plan)');
|
|
128
|
+
logger.debug(uploadError instanceof Error
|
|
129
|
+
? uploadError.message
|
|
130
|
+
: String(uploadError));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Determine if running in non-interactive mode
|
|
135
|
+
const isNonInteractive = options.name !== undefined;
|
|
136
|
+
// Prompt for issue name/reference (or use provided --name)
|
|
137
|
+
logger.blank();
|
|
138
|
+
const issueName = isNonInteractive
|
|
139
|
+
? options.name
|
|
140
|
+
: await input("Enter a short name to reference this issue (e.g., 'feature-x' or 'bug-fix-y'):");
|
|
141
|
+
if (!issueName || issueName.trim() === '') {
|
|
142
|
+
throw new Error('Issue name cannot be empty');
|
|
143
|
+
}
|
|
144
|
+
// Select priority (or use provided --priority)
|
|
145
|
+
logger.blank();
|
|
146
|
+
const priorityLevels = config.priorityLevels ?? [
|
|
147
|
+
{ name: 'Critical', emoji: '🔴', color: 'red' },
|
|
148
|
+
{ name: 'High', emoji: '🟠', color: 'orange' },
|
|
149
|
+
{ name: 'Medium', emoji: '🟡', color: 'yellow' },
|
|
150
|
+
{ name: 'Low', emoji: '🟢', color: 'green' },
|
|
151
|
+
{ name: 'Minimal', emoji: '⚪', color: 'gray' },
|
|
152
|
+
];
|
|
153
|
+
let priority;
|
|
154
|
+
if (isNonInteractive && options.priority) {
|
|
155
|
+
// Validate priority
|
|
156
|
+
const providedPriority = options.priority.toLowerCase();
|
|
157
|
+
const matchedPriority = priorityLevels.find((p) => p.name.toLowerCase() === providedPriority);
|
|
158
|
+
if (!matchedPriority) {
|
|
159
|
+
throw new Error(`Invalid priority: ${options.priority}. Valid options: ${priorityLevels
|
|
160
|
+
.map((p) => p.name)
|
|
161
|
+
.join(', ')}`);
|
|
162
|
+
}
|
|
163
|
+
priority = matchedPriority.name;
|
|
164
|
+
logger.info(`Using priority: ${matchedPriority.emoji} ${priority}`);
|
|
165
|
+
}
|
|
166
|
+
else if (isNonInteractive) {
|
|
167
|
+
// Default to Medium for non-interactive mode
|
|
168
|
+
priority = 'Medium';
|
|
169
|
+
logger.info(`Using default priority: 🟡 ${priority}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
logger.section('Set Issue Priority');
|
|
173
|
+
priority = await selectPriority('Select priority for this issue:', priorityLevels);
|
|
174
|
+
logger.success(`Selected priority: ${priorityLevels.find((p) => p.name === priority)?.emoji} ${priority}`);
|
|
175
|
+
}
|
|
176
|
+
// Select team members if configured
|
|
177
|
+
// Note: "handoff" is the conceptual term used - it represents assigning someone for follow-up
|
|
178
|
+
// Copilot is always assigned automatically
|
|
179
|
+
let assignees = [];
|
|
180
|
+
if (options.handoff) {
|
|
181
|
+
// Non-interactive mode with --handoff flag
|
|
182
|
+
assignees = [options.handoff];
|
|
183
|
+
logger.info(`Handing off to: ${options.handoff}`);
|
|
184
|
+
}
|
|
185
|
+
else if (assigneeArg) {
|
|
186
|
+
assignees = [assigneeArg];
|
|
187
|
+
}
|
|
188
|
+
else if (!isNonInteractive &&
|
|
189
|
+
config.teamMembers &&
|
|
190
|
+
config.teamMembers.length > 0) {
|
|
191
|
+
const shouldAssign = await confirm('Do you want to assign team members?', false);
|
|
192
|
+
if (shouldAssign) {
|
|
193
|
+
assignees = await multiSelect('Select team members to assign:', config.teamMembers);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Create issue
|
|
197
|
+
logger.info('Creating GitHub issue...');
|
|
198
|
+
const issue = await issueService.create({
|
|
199
|
+
title: plan.title,
|
|
200
|
+
body: processedBody,
|
|
201
|
+
assignees,
|
|
202
|
+
});
|
|
203
|
+
logger.success(`Created issue #${issue.number}: ${issue.title}`);
|
|
204
|
+
logger.info(`URL: ${issue.url}`);
|
|
205
|
+
// Update issue body to include self-reference for Copilot PR linking
|
|
206
|
+
logger.blank();
|
|
207
|
+
logger.info('Updating issue with reference for Copilot...');
|
|
208
|
+
try {
|
|
209
|
+
const updatedBody = `Fixes #${issue.number}\n\n${issue.body}`;
|
|
210
|
+
await issueService.updateBody(issue.number, updatedBody);
|
|
211
|
+
logger.success('Added issue reference for Copilot linking');
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
logger.warning('Could not update issue body with reference');
|
|
215
|
+
logger.debug(error instanceof Error ? error.message : String(error));
|
|
216
|
+
}
|
|
217
|
+
// Assign Copilot if requested
|
|
218
|
+
let copilotAssignedResult = false;
|
|
219
|
+
if (options.copilot) {
|
|
220
|
+
logger.blank();
|
|
221
|
+
logger.info('Assigning GitHub Copilot...');
|
|
222
|
+
// Wait for GitHub to propagate the newly created issue
|
|
223
|
+
// This prevents 404 errors when the browser tries to load the issue immediately
|
|
224
|
+
logger.info('Waiting for GitHub to propagate the issue...');
|
|
225
|
+
await new Promise((resolve) => setTimeout(resolve, 20000)); // Wait 20 seconds for GitHub propagation
|
|
226
|
+
try {
|
|
227
|
+
copilotAssignedResult = await copilotService.assignToIssue(issue.number);
|
|
228
|
+
if (copilotAssignedResult) {
|
|
229
|
+
logger.success('GitHub Copilot assigned successfully');
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
logger.warning('Could not assign GitHub Copilot automatically');
|
|
233
|
+
logger.info('You may need to assign Copilot manually in the GitHub UI');
|
|
234
|
+
// Check for debug screenshot
|
|
235
|
+
const { tmpdir } = await import('os');
|
|
236
|
+
const { join } = await import('path');
|
|
237
|
+
const { existsSync } = await import('fs');
|
|
238
|
+
const debugPath = join(tmpdir(), 'github-copilot-not-found.png');
|
|
239
|
+
if (existsSync(debugPath)) {
|
|
240
|
+
logger.info(`📸 Debug screenshot saved to: ${debugPath}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
logger.error(`Failed to assign Copilot: ${error instanceof Error ? error.message : String(error)}`);
|
|
246
|
+
// Check for debug screenshot on error
|
|
247
|
+
try {
|
|
248
|
+
const { tmpdir } = await import('os');
|
|
249
|
+
const { join } = await import('path');
|
|
250
|
+
const { existsSync } = await import('fs');
|
|
251
|
+
const debugPath = join(tmpdir(), 'github-copilot-not-found.png');
|
|
252
|
+
if (existsSync(debugPath)) {
|
|
253
|
+
logger.info(`📸 Debug screenshot saved to: ${debugPath}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Ignore errors checking for screenshot
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Add to tracking if requested
|
|
262
|
+
if (options.track) {
|
|
263
|
+
logger.blank();
|
|
264
|
+
logger.info('Adding to tracking...');
|
|
265
|
+
// Get repo info for remote tracking (owner/repo#number format)
|
|
266
|
+
const repo = await getRepoInfo();
|
|
267
|
+
const internalName = `${repo.owner}/${repo.name}#${issue.number}`;
|
|
268
|
+
// Convert to repo-relative path (server expects e.g. .hublaunch/plans/foo.md)
|
|
269
|
+
const relPlanPath = planService.getRelativePath(planFile.path);
|
|
270
|
+
const trackedIssue = {
|
|
271
|
+
name: internalName,
|
|
272
|
+
trackingName: issueName, // User's custom name
|
|
273
|
+
number: issue.number,
|
|
274
|
+
title: issue.title,
|
|
275
|
+
planPath: relPlanPath,
|
|
276
|
+
copilotAssigned: options.copilot ? copilotAssignedResult : false,
|
|
277
|
+
trackingStatus: STATUS.UNASSIGNED,
|
|
278
|
+
priority: priority,
|
|
279
|
+
createdAt: issue.createdAt,
|
|
280
|
+
updatedAt: issue.updatedAt,
|
|
281
|
+
assignees: issue.assignees,
|
|
282
|
+
};
|
|
283
|
+
try {
|
|
284
|
+
await trackingService.add(trackedIssue);
|
|
285
|
+
}
|
|
286
|
+
catch (addError) {
|
|
287
|
+
if (addError instanceof ConflictError) {
|
|
288
|
+
logger.warning('Plan already registered on tracking server (continuing...)');
|
|
289
|
+
logger.debug(addError instanceof Error ? addError.message : String(addError));
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
throw addError;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Manual project sync only if auto-sync is disabled
|
|
296
|
+
// (If auto-sync is enabled, TrackingService.add() already handled it)
|
|
297
|
+
if (config.projectNumber && config.projectId && !config.projectAutoSync) {
|
|
298
|
+
logger.blank();
|
|
299
|
+
logger.info('Adding to GitHub Projects...');
|
|
300
|
+
const projectService = new ProjectService();
|
|
301
|
+
try {
|
|
302
|
+
const repo = await getRepoInfo();
|
|
303
|
+
// Add issue to project
|
|
304
|
+
await projectService.addIssueToProject(issue.number, config.projectNumber);
|
|
305
|
+
// Wait a moment for GitHub to process the addition
|
|
306
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
307
|
+
// Find the project item ID
|
|
308
|
+
const itemId = await projectService.findProjectItem(repo.owner, config.projectNumber, issue.number);
|
|
309
|
+
if (!itemId) {
|
|
310
|
+
throw new Error('Could not find project item after adding to project');
|
|
311
|
+
}
|
|
312
|
+
// Determine initial status based on whether Copilot was assigned
|
|
313
|
+
const initialStatus = options.copilot
|
|
314
|
+
? STATUS.INITIAL_WAITING
|
|
315
|
+
: STATUS.UNASSIGNED;
|
|
316
|
+
// Update tracking status field
|
|
317
|
+
await projectService.updateIssueStatus(itemId, initialStatus, config.projectId, repo.owner, config.projectNumber);
|
|
318
|
+
// Update priority field (use the selected priority)
|
|
319
|
+
await projectService.updateIssuePriority(itemId, priority, config.projectId, repo.owner, config.projectNumber);
|
|
320
|
+
logger.success(`Added to project with status: ${initialStatus}, priority: ${priority}`);
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
logger.warning('Could not add to project (continuing...)');
|
|
324
|
+
logger.debug(error instanceof Error ? error.message : String(error));
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
logger.blank();
|
|
329
|
+
logger.success('✨ Issue created successfully!');
|
|
330
|
+
logger.info(`URL: ${issue.url}`);
|
|
331
|
+
logger.blank();
|
|
332
|
+
logger.info('You can go to https://www.hublaunch.site/dashboard to see a summary of your active plans.');
|
|
333
|
+
if (!config.updateNotificationUrl && !process.env.HULA_UPDATE_NOTIFICATION_URL) {
|
|
334
|
+
logger.info('Set updateNotificationUrl in your local hublaunch.config.js file to be able to get update messages about the status.');
|
|
335
|
+
}
|
|
336
|
+
// Clean up local plan file — it's now on origin/main and submitted as issue
|
|
337
|
+
planService.deletePlan(planFile.path);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Check if plan is synced to origin/main
|
|
341
|
+
* Reused logic from launch command to ensure consistency
|
|
342
|
+
*/
|
|
343
|
+
async function checkPlanSyncStatus(config, planPath) {
|
|
344
|
+
const gitService = new GitService();
|
|
345
|
+
const planService = new PlanService(config.planPath);
|
|
346
|
+
try {
|
|
347
|
+
// Fetch latest from origin
|
|
348
|
+
await gitService.fetch('origin', 'main');
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// If fetch fails (e.g., no network), continue with local checks
|
|
352
|
+
logger.debug('Could not fetch from origin, checking local state only');
|
|
353
|
+
}
|
|
354
|
+
// Check if plan exists on origin/main
|
|
355
|
+
const relativePath = planService.getRelativePath(planPath);
|
|
356
|
+
const onOrigin = await gitService.fileExistsOnRef('origin/main', relativePath);
|
|
357
|
+
if (onOrigin) {
|
|
358
|
+
return { synced: true, location: 'origin-main' };
|
|
359
|
+
}
|
|
360
|
+
// Check local main
|
|
361
|
+
const onLocalMain = await gitService.fileExistsOnRef('main', relativePath);
|
|
362
|
+
if (onLocalMain) {
|
|
363
|
+
return { synced: false, location: 'local-main' };
|
|
364
|
+
}
|
|
365
|
+
return { synced: false, location: 'not-found' };
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAiB,MAAM,2BAA2B,CAAC;AAClE,OAAO,EACL,OAAO,EACP,WAAW,EACX,KAAK,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,MAAc;IAC5D,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,mCAAmC,CAAC;SAC5D,MAAM,CAAC,sBAAsB,EAAE,4BAA4B,CAAC;SAC5D,MAAM,CACL,oBAAoB,EACpB,uDAAuD,CACxD;SACA,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAC;SACjD,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC;SAC7C,MAAM,CACL,qBAAqB,EACrB,0DAA0D,CAC3D;SACA,MAAM,CACL,KAAK,EACH,QAA4B,EAC5B,OAQC,EACD,EAAE;QACF,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,MAAc,EACd,WAA+B,EAC/B,OAQC;IAED,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAEhD,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAI,eAAe,CACzC,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC,CACtC,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtC,IAAI,QAAQ,CAAC;IAEb,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,QAAQ,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,IAAI,IAAI;gBACtC,gBAAgB,MAAM,CAAC,QAAQ,IAAI;gBACnC,6BAA6B;gBAC7B,uDAAuD,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CACrC,MAAM,CAAC,sBAAsB,EAC7B,MAAM,CAAC,WAAW,CACnB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEjD,aAAa;IACb,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAExD,gCAAgC;IAChC,wEAAwE;IACxE,sDAAsD;IACtD,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACpD,IAAI,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC;IAE9B,qEAAqE;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,GAAG,MAAM,kBAAkB,CAAC,kBAAkB,CACzD,aAAa,EACb,OAAO,CACR,CAAC;IAEF,uDAAuD;IACvD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAExC,uCAAuC;QACvC,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAChE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAEvE,qCAAqC;QACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,aAAa,IAAI,wBAAwB,GAAG,eAAe,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,qEAAqE;IACrE,kBAAkB;IAClB,IAAI,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,OAAO,aAAa,EAAE,CAAC;QAC1C,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC7D,CAAC;IAED,qEAAqE;IACrE,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAExE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,cAAc,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC5C,oEAAoE;YACpE,yEAAyE;YACzE,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACvE,CAAC;aAAM,IAAI,cAAc,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACpD,wDAAwD;YACxD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3C,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;gBAC7C,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,yEAAyE;gBACzE,8BAA8B;gBAC9B,MAAM,CAAC,OAAO,CACZ,mEAAmE,CACpE,CAAC;gBACF,MAAM,CAAC,KAAK,CACV,WAAW,YAAY,KAAK;oBAC1B,CAAC,CAAC,WAAW,CAAC,OAAO;oBACrB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CACxB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;IAEpD,2DAA2D;IAC3D,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,SAAS,GAAG,gBAAgB;QAChC,CAAC,CAAC,OAAO,CAAC,IAAI;QACd,CAAC,CAAC,MAAM,KAAK,CACT,gFAAgF,CACjF,CAAC;IAEN,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,+CAA+C;IAC/C,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI;QAC9C,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;QAC/C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChD,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;KAC/C,CAAC;IAEF,IAAI,QAAkB,CAAC;IACvB,IAAI,gBAAgB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzC,oBAAoB;QACpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,eAAe,GAAG,cAAc,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,gBAAgB,CACjD,CAAC;QAEF,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,qBAAqB,OAAO,CAAC,QAAQ,oBAAoB,cAAc;iBACpE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;QACD,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,mBAAmB,eAAe,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,6CAA6C;QAC7C,QAAQ,GAAG,QAAQ,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACrC,QAAQ,GAAG,MAAM,cAAc,CAC7B,iCAAiC,EACjC,cAAc,CACf,CAAC;QACF,MAAM,CAAC,OAAO,CACZ,sBACE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,KACnD,IAAI,QAAQ,EAAE,CACf,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,8FAA8F;IAC9F,2CAA2C;IAC3C,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,2CAA2C;QAC3C,SAAS,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,SAAS,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;SAAM,IACL,CAAC,gBAAgB;QACjB,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,qCAAqC,EACrC,KAAK,CACN,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,SAAS,GAAG,MAAM,WAAW,CAC3B,gCAAgC,EAChC,MAAM,CAAC,WAAW,CACnB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC;QACtC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,aAAa;QACnB,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,kBAAkB,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAEjC,qEAAqE;IACrE,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,UAAU,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9D,MAAM,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,8BAA8B;IAC9B,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAE3C,uDAAuD;QACvD,gFAAgF;QAChF,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,yCAAyC;QAErG,IAAI,CAAC;YACH,qBAAqB,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAEzE,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;gBAChE,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;gBAExE,6BAA6B;gBAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC;gBACjE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;YAEF,sCAAsC;YACtC,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC;gBACjE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wCAAwC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAErC,+DAA+D;QAC/D,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAElE,8EAA8E;QAC9E,MAAM,WAAW,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE/D,MAAM,YAAY,GAAiB;YACjC,IAAI,EAAE,YAAY;YAClB,YAAY,EAAE,SAAS,EAAE,qBAAqB;YAC9C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,WAAW;YACrB,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK;YAChE,cAAc,EAAE,MAAM,CAAC,UAAU;YACjC,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,IAAI,QAAQ,YAAY,aAAa,EAAE,CAAC;gBACtC,MAAM,CAAC,OAAO,CACZ,4DAA4D,CAC7D,CAAC;gBACF,MAAM,CAAC,KAAK,CACV,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAChE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,CAAC;YACjB,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,sEAAsE;QACtE,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACxE,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;YAE5C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;gBAEjC,uBAAuB;gBACvB,MAAM,cAAc,CAAC,iBAAiB,CACpC,KAAK,CAAC,MAAM,EACZ,MAAM,CAAC,aAAa,CACrB,CAAC;gBAEF,mDAAmD;gBACnD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAE1D,2BAA2B;gBAC3B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CACjD,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,aAAa,EACpB,KAAK,CAAC,MAAM,CACb,CAAC;gBAEF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAC;gBACJ,CAAC;gBAED,iEAAiE;gBACjE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO;oBACnC,CAAC,CAAC,MAAM,CAAC,eAAe;oBACxB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBAEtB,+BAA+B;gBAC/B,MAAM,cAAc,CAAC,iBAAiB,CACpC,MAAM,EACN,aAAa,EACb,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,aAAa,CACrB,CAAC;gBAEF,oDAAoD;gBACpD,MAAM,cAAc,CAAC,mBAAmB,CACtC,MAAM,EACN,QAAQ,EACR,MAAM,CAAC,SAAS,EAChB,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,aAAa,CACrB,CAAC;gBAEF,MAAM,CAAC,OAAO,CACZ,iCAAiC,aAAa,eAAe,QAAQ,EAAE,CACxE,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;gBAC3D,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,IAAI,CACT,2FAA2F,CAC5F,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC/E,MAAM,CAAC,IAAI,CACT,sHAAsH,CACvH,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAUD;;;GAGG;AACH,KAAK,UAAU,mBAAmB,CAChC,MAAc,EACd,QAAgB;IAEhB,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACzE,CAAC;IAED,sCAAsC;IACtC,MAAM,YAAY,GAAG,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,eAAe,CAC/C,aAAa,EACb,YAAY,CACb,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IACnD,CAAC;IAED,mBAAmB;IACnB,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3E,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { Config } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Diff command - View PR code changes with clickable file links
|
|
5
|
+
*/
|
|
6
|
+
export declare function diffCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBlE"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { writeFile } from "fs/promises";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
import { PRService } from "../services/github/PRService.js";
|
|
6
|
+
import { DiffService } from "../services/diff/DiffService.js";
|
|
7
|
+
import { EditorService } from "../services/editor/EditorService.js";
|
|
8
|
+
import { TrackingService } from "../services/tracking/TrackingService.js";
|
|
9
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
10
|
+
import { searchSelect, UserCancelledError } from "../utils/prompts.js";
|
|
11
|
+
/**
|
|
12
|
+
* Diff command - View PR code changes with clickable file links
|
|
13
|
+
*/
|
|
14
|
+
export function diffCommand(program, config) {
|
|
15
|
+
program
|
|
16
|
+
.command("diff [issueNumber]")
|
|
17
|
+
.description("View PR code changes with clickable file links")
|
|
18
|
+
.option("--editor <editor>", "Editor to use (vscode or cursor)", "vscode")
|
|
19
|
+
.action(async (issueNumber, options) => {
|
|
20
|
+
try {
|
|
21
|
+
await executeDiff(config, issueNumber, options);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof UserCancelledError) {
|
|
25
|
+
logger.info('\nCancelled.');
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
logger.error("Failed to generate diff:");
|
|
29
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async function executeDiff(config, issueNumberArg, options) {
|
|
35
|
+
logger.section("View PR Diff");
|
|
36
|
+
// Initialize services
|
|
37
|
+
const prService = new PRService();
|
|
38
|
+
const diffService = new DiffService();
|
|
39
|
+
const editorService = new EditorService(config.editorCommand);
|
|
40
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
41
|
+
// Get issue number
|
|
42
|
+
let issueNumber;
|
|
43
|
+
if (issueNumberArg) {
|
|
44
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
45
|
+
if (isNaN(issueNumber)) {
|
|
46
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Show tracked issues and let user select
|
|
51
|
+
const trackedIssues = await trackingService.getAll();
|
|
52
|
+
if (trackedIssues.length === 0) {
|
|
53
|
+
throw new Error("No tracked issues found. Run 'hublaunch track' first.");
|
|
54
|
+
}
|
|
55
|
+
const choices = trackedIssues
|
|
56
|
+
.filter((issue) => issue.number !== undefined)
|
|
57
|
+
.map((issue) => ({
|
|
58
|
+
name: `#${issue.number} - ${issue.name}`,
|
|
59
|
+
value: issue.number.toString(),
|
|
60
|
+
}));
|
|
61
|
+
const selected = await searchSelect("Select issue to view diff:", choices);
|
|
62
|
+
issueNumber = parseInt(selected, 10);
|
|
63
|
+
}
|
|
64
|
+
// Get PR for issue
|
|
65
|
+
logger.info(`Fetching PR for issue #${issueNumber}...`);
|
|
66
|
+
const pr = await prService.getByIssue(issueNumber);
|
|
67
|
+
if (!pr) {
|
|
68
|
+
throw new Error(`No PR found for issue #${issueNumber}`);
|
|
69
|
+
}
|
|
70
|
+
logger.info(`Found PR #${pr.number}: ${pr.title}`);
|
|
71
|
+
logger.blank();
|
|
72
|
+
// Get diff and files
|
|
73
|
+
logger.info("Fetching diff content...");
|
|
74
|
+
const [diff, files] = await Promise.all([
|
|
75
|
+
diffService.getDiff(pr.number),
|
|
76
|
+
diffService.getFiles(pr.number),
|
|
77
|
+
]);
|
|
78
|
+
logger.info(`Found ${files.length} changed files`);
|
|
79
|
+
logger.blank();
|
|
80
|
+
// Format diff with links
|
|
81
|
+
logger.info("Generating formatted diff...");
|
|
82
|
+
const editor = options.editor === "cursor" ? "cursor" : "vscode";
|
|
83
|
+
const formattedDiff = await diffService.formatDiffWithLinks(pr.number, diff, files, editor);
|
|
84
|
+
// Save to temp file
|
|
85
|
+
const tempFile = join(tmpdir(), `hublaunch-diff-pr${pr.number}-issue${issueNumber}.md`);
|
|
86
|
+
await writeFile(tempFile, formattedDiff);
|
|
87
|
+
logger.success(`Diff saved to: ${tempFile}`);
|
|
88
|
+
// Open in editor in preview mode
|
|
89
|
+
try {
|
|
90
|
+
await editorService.openFileInPreview(tempFile);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger.warning(`Could not open in editor: ${error instanceof Error ? error.message : String(error)}`);
|
|
94
|
+
logger.info(`You can manually open: ${tempFile}`);
|
|
95
|
+
}
|
|
96
|
+
logger.success("✨ Diff generated successfully!");
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.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
|
+
* Execute command — trigger or manage execute-action runs on hula-project server
|
|
5
|
+
*/
|
|
6
|
+
export declare function executeCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=execute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqDhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8DrE"}
|