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,352 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
import { ProjectService } from '../services/github/ProjectService.js';
|
|
3
|
+
import { getRepoInfo } from '../utils/github-cli.js';
|
|
4
|
+
import { PROJECT_FIELD_OPTIONS } from '../types/common.schema.js';
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { getRepoRoot } from '../utils/shell.js';
|
|
9
|
+
/**
|
|
10
|
+
* Project command - Setup and manage GitHub Projects V2 integration
|
|
11
|
+
*/
|
|
12
|
+
export function projectCommand(program, config) {
|
|
13
|
+
const projectCmd = program
|
|
14
|
+
.command('project')
|
|
15
|
+
.description('Manage GitHub Projects V2 integration');
|
|
16
|
+
projectCmd
|
|
17
|
+
.command('setup')
|
|
18
|
+
.description('Configure GitHub Projects integration')
|
|
19
|
+
.action(async () => {
|
|
20
|
+
try {
|
|
21
|
+
await executeProjectSetup(config);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.error('Failed to setup project:');
|
|
25
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
projectCmd
|
|
30
|
+
.command('status')
|
|
31
|
+
.description('Show project integration status')
|
|
32
|
+
.action(async () => {
|
|
33
|
+
try {
|
|
34
|
+
await showProjectStatus(config);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger.error('Failed to show status:');
|
|
38
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run project setup flow and return configuration values
|
|
45
|
+
* This can be called from both 'project setup' and 'init' commands
|
|
46
|
+
* Returns null if setup is cancelled or fails
|
|
47
|
+
*/
|
|
48
|
+
export async function runProjectSetupFlow() {
|
|
49
|
+
try {
|
|
50
|
+
const projectService = new ProjectService();
|
|
51
|
+
// Ensure GitHub CLI has project scope
|
|
52
|
+
const hasScope = await projectService.ensureProjectScope();
|
|
53
|
+
if (!hasScope) {
|
|
54
|
+
logger.error('Could not configure project scope. Please run: gh auth refresh -s project');
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
logger.blank();
|
|
58
|
+
// Get repository info
|
|
59
|
+
const repo = await getRepoInfo();
|
|
60
|
+
logger.info(`Repository: ${repo.owner}/${repo.name}`);
|
|
61
|
+
logger.blank();
|
|
62
|
+
// Ask if user wants to create new or use existing project
|
|
63
|
+
const { action } = await inquirer.prompt([
|
|
64
|
+
{
|
|
65
|
+
type: 'list',
|
|
66
|
+
name: 'action',
|
|
67
|
+
message: 'What would you like to do?',
|
|
68
|
+
choices: [
|
|
69
|
+
{ name: 'Create new project', value: 'create' },
|
|
70
|
+
{ name: 'Use existing project', value: 'existing' },
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
let projectNumber;
|
|
75
|
+
let projectOwner;
|
|
76
|
+
if (action === 'create') {
|
|
77
|
+
// Ask which account to create project under
|
|
78
|
+
const { createUnder } = await inquirer.prompt([
|
|
79
|
+
{
|
|
80
|
+
type: 'list',
|
|
81
|
+
name: 'createUnder',
|
|
82
|
+
message: 'Create project under which GitHub account?',
|
|
83
|
+
choices: [
|
|
84
|
+
{ name: `Repository owner (${repo.owner})`, value: repo.owner },
|
|
85
|
+
{ name: 'My personal account', value: 'personal' },
|
|
86
|
+
{ name: 'Enter manually', value: 'manual' },
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
]);
|
|
90
|
+
if (createUnder === 'personal') {
|
|
91
|
+
// Get authenticated user
|
|
92
|
+
const { runGh } = await import('../utils/github-cli.js');
|
|
93
|
+
const userInfo = await runGh(['api', 'user', '--jq', '.login']);
|
|
94
|
+
projectOwner = userInfo.trim();
|
|
95
|
+
}
|
|
96
|
+
else if (createUnder === 'manual') {
|
|
97
|
+
const { manualOwner } = await inquirer.prompt([
|
|
98
|
+
{
|
|
99
|
+
type: 'input',
|
|
100
|
+
name: 'manualOwner',
|
|
101
|
+
message: 'Enter GitHub username or organization:',
|
|
102
|
+
validate: (input) => input.trim().length > 0 || 'Username is required',
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
projectOwner = manualOwner.trim();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
projectOwner = repo.owner;
|
|
109
|
+
}
|
|
110
|
+
// Create new project
|
|
111
|
+
projectNumber = await projectService.createProject(projectOwner);
|
|
112
|
+
logger.blank();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Ask which account the project is under
|
|
116
|
+
const { searchUnder } = await inquirer.prompt([
|
|
117
|
+
{
|
|
118
|
+
type: 'list',
|
|
119
|
+
name: 'searchUnder',
|
|
120
|
+
message: 'Search for project under which GitHub account?',
|
|
121
|
+
choices: [
|
|
122
|
+
{ name: `Repository owner (${repo.owner})`, value: repo.owner },
|
|
123
|
+
{ name: 'My personal account', value: 'personal' },
|
|
124
|
+
{ name: 'Enter manually', value: 'manual' },
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
]);
|
|
128
|
+
if (searchUnder === 'personal') {
|
|
129
|
+
// Get authenticated user
|
|
130
|
+
const { runGh } = await import('../utils/github-cli.js');
|
|
131
|
+
const userInfo = await runGh(['api', 'user', '--jq', '.login']);
|
|
132
|
+
projectOwner = userInfo.trim();
|
|
133
|
+
}
|
|
134
|
+
else if (searchUnder === 'manual') {
|
|
135
|
+
const { manualOwner } = await inquirer.prompt([
|
|
136
|
+
{
|
|
137
|
+
type: 'input',
|
|
138
|
+
name: 'manualOwner',
|
|
139
|
+
message: 'Enter GitHub username or organization:',
|
|
140
|
+
validate: (input) => input.trim().length > 0 || 'Username is required',
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
projectOwner = manualOwner.trim();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
projectOwner = repo.owner;
|
|
147
|
+
}
|
|
148
|
+
// Find existing project or create
|
|
149
|
+
const existingProject = await projectService.findExistingProject(projectOwner);
|
|
150
|
+
if (existingProject !== null) {
|
|
151
|
+
const { useExisting } = await inquirer.prompt([
|
|
152
|
+
{
|
|
153
|
+
type: 'confirm',
|
|
154
|
+
name: 'useExisting',
|
|
155
|
+
message: `Found existing project #${existingProject}. Use this project?`,
|
|
156
|
+
default: true,
|
|
157
|
+
},
|
|
158
|
+
]);
|
|
159
|
+
if (useExisting) {
|
|
160
|
+
projectNumber = existingProject;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
projectNumber = await projectService.createProject(projectOwner);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
logger.warning(`No existing 'HubLaunch Issue Tracking' project found under ${projectOwner}.`);
|
|
168
|
+
const { enterManually } = await inquirer.prompt([
|
|
169
|
+
{
|
|
170
|
+
type: 'confirm',
|
|
171
|
+
name: 'enterManually',
|
|
172
|
+
message: 'Do you want to enter a project number manually?',
|
|
173
|
+
default: false,
|
|
174
|
+
},
|
|
175
|
+
]);
|
|
176
|
+
if (enterManually) {
|
|
177
|
+
const { manualProjectNumber } = await inquirer.prompt([
|
|
178
|
+
{
|
|
179
|
+
type: 'input',
|
|
180
|
+
name: 'manualProjectNumber',
|
|
181
|
+
message: 'Enter project number:',
|
|
182
|
+
validate: (input) => {
|
|
183
|
+
const num = parseInt(input, 10);
|
|
184
|
+
return ((!isNaN(num) && num > 0) ||
|
|
185
|
+
'Please enter a valid project number');
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
]);
|
|
189
|
+
projectNumber = parseInt(manualProjectNumber, 10);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const { createNew } = await inquirer.prompt([
|
|
193
|
+
{
|
|
194
|
+
type: 'confirm',
|
|
195
|
+
name: 'createNew',
|
|
196
|
+
message: 'Create new project?',
|
|
197
|
+
default: true,
|
|
198
|
+
},
|
|
199
|
+
]);
|
|
200
|
+
if (!createNew) {
|
|
201
|
+
logger.info('Setup cancelled.');
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
projectNumber = await projectService.createProject(projectOwner);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
logger.blank();
|
|
209
|
+
logger.info('Getting project ID...');
|
|
210
|
+
const projectId = await projectService.getProjectId(projectOwner, projectNumber);
|
|
211
|
+
logger.success(`Project ID: ${projectId}`);
|
|
212
|
+
// Create required fields
|
|
213
|
+
logger.blank();
|
|
214
|
+
logger.info('Setting up project fields...');
|
|
215
|
+
await createProjectFields(projectService, projectOwner, projectNumber, projectId);
|
|
216
|
+
logger.blank();
|
|
217
|
+
// Ask about auto-sync
|
|
218
|
+
const { enableAutoSync } = await inquirer.prompt([
|
|
219
|
+
{
|
|
220
|
+
type: 'confirm',
|
|
221
|
+
name: 'enableAutoSync',
|
|
222
|
+
message: 'Enable automatic sync to GitHub Projects?',
|
|
223
|
+
default: false,
|
|
224
|
+
},
|
|
225
|
+
]);
|
|
226
|
+
return {
|
|
227
|
+
projectNumber,
|
|
228
|
+
projectId,
|
|
229
|
+
projectOwner,
|
|
230
|
+
enableAutoSync,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
logger.error('Project setup failed:');
|
|
235
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Execute project setup command
|
|
241
|
+
*/
|
|
242
|
+
async function executeProjectSetup(_config) {
|
|
243
|
+
logger.section('GitHub Projects V2 Setup');
|
|
244
|
+
const result = await runProjectSetupFlow();
|
|
245
|
+
if (!result) {
|
|
246
|
+
logger.warning('Project setup was not completed.');
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
const { projectNumber, projectId, enableAutoSync } = result;
|
|
250
|
+
// Update config file
|
|
251
|
+
logger.blank();
|
|
252
|
+
logger.info('Updating configuration...');
|
|
253
|
+
await updateConfigFile(projectNumber, projectId, enableAutoSync);
|
|
254
|
+
logger.blank();
|
|
255
|
+
logger.section('Setup Complete!');
|
|
256
|
+
logger.info(`Project Number: ${projectNumber}`);
|
|
257
|
+
logger.info(`Project ID: ${projectId}`);
|
|
258
|
+
logger.info(`Auto-sync: ${enableAutoSync ? 'enabled' : 'disabled'}`);
|
|
259
|
+
logger.blank();
|
|
260
|
+
const repo = await getRepoInfo();
|
|
261
|
+
logger.info(`View project: https://github.com/orgs/${repo.owner}/projects/${projectNumber}`);
|
|
262
|
+
logger.blank();
|
|
263
|
+
if (!enableAutoSync) {
|
|
264
|
+
logger.warning('Auto-sync is disabled. Issues will be tracked locally.');
|
|
265
|
+
logger.info('To enable auto-sync, set projectAutoSync: true in .hublaunch/hublaunch.config.ts');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
logger.success('Auto-sync is enabled. All tracked issues will sync to GitHub Projects.');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Create required project fields
|
|
273
|
+
*/
|
|
274
|
+
async function createProjectFields(projectService, owner, projectNumber, projectId) {
|
|
275
|
+
// Ensure Tracking Name field
|
|
276
|
+
await projectService.ensureTrackingNameField(owner, projectNumber);
|
|
277
|
+
logger.blank();
|
|
278
|
+
// Create trackingStatus field if it doesn't exist
|
|
279
|
+
await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'trackingStatus', PROJECT_FIELD_OPTIONS.TRACKING_STATUS);
|
|
280
|
+
logger.blank();
|
|
281
|
+
// Create priority field if it doesn't exist
|
|
282
|
+
await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'priority', PROJECT_FIELD_OPTIONS.PRIORITY);
|
|
283
|
+
logger.blank();
|
|
284
|
+
// Create OwnerIsTracking field (true/false for whether owner is tracking)
|
|
285
|
+
await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'OwnerIsTracking', ['true', 'false']);
|
|
286
|
+
logger.blank();
|
|
287
|
+
// Create AssigneeIsFollowing field (true/false for whether assignee is following)
|
|
288
|
+
await projectService.ensureSingleSelectField(owner, projectNumber, projectId, 'AssigneeIsFollowing', ['true', 'false']);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Update config file with project settings
|
|
292
|
+
* Directly updates hublaunch.config.js with proper JavaScript object syntax
|
|
293
|
+
*/
|
|
294
|
+
async function updateConfigFile(projectNumber, projectId, enableAutoSync) {
|
|
295
|
+
const repoRoot = await getRepoRoot();
|
|
296
|
+
const configPath = join(repoRoot, '.hublaunch', 'hublaunch.config.js');
|
|
297
|
+
// Read the current config file
|
|
298
|
+
let content = await readFile(configPath, 'utf-8');
|
|
299
|
+
// Update projectNumber
|
|
300
|
+
if (content.includes('projectNumber:')) {
|
|
301
|
+
// Replace existing projectNumber line (commented or uncommented, with number or undefined)
|
|
302
|
+
content = content.replace(/\/\/\s*projectNumber:\s*(?:\d+|undefined),?|projectNumber:\s*\d+,?/, `projectNumber: ${projectNumber},`);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
// Add projectNumber after the config object opening
|
|
306
|
+
content = content.replace(/(export const config[^{]*{)/, `$1\n projectNumber: ${projectNumber},`);
|
|
307
|
+
}
|
|
308
|
+
// Update projectId
|
|
309
|
+
if (content.includes('projectId:')) {
|
|
310
|
+
// Replace existing projectId line (commented or uncommented, with string or undefined)
|
|
311
|
+
content = content.replace(/\/\/\s*projectId:\s*(?:['"][^'"]+['"]|undefined),?|projectId:\s*['"][^'"]+['"],?/, `projectId: '${projectId}',`);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
// Add projectId after projectNumber
|
|
315
|
+
content = content.replace(/(projectNumber:\s*\d+,)/, `$1\n projectId: '${projectId}',`);
|
|
316
|
+
}
|
|
317
|
+
// Update projectAutoSync
|
|
318
|
+
if (content.includes('projectAutoSync:')) {
|
|
319
|
+
// Replace existing projectAutoSync line (commented or uncommented)
|
|
320
|
+
content = content.replace(/\/\/\s*projectAutoSync:\s*(?:true|false),?|projectAutoSync:\s*(?:true|false),?/, `projectAutoSync: ${enableAutoSync},`);
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
// Add projectAutoSync after projectId
|
|
324
|
+
content = content.replace(/(projectId:\s*['"][^'"]+['"],)/, `$1\n projectAutoSync: ${enableAutoSync},`);
|
|
325
|
+
}
|
|
326
|
+
// Write the updated config back
|
|
327
|
+
await writeFile(configPath, content, 'utf-8');
|
|
328
|
+
logger.success('Configuration updated in .hublaunch/hublaunch.config.js');
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Show project integration status
|
|
332
|
+
*/
|
|
333
|
+
async function showProjectStatus(config) {
|
|
334
|
+
logger.section('GitHub Projects Integration Status');
|
|
335
|
+
if (!config.projectNumber || !config.projectId) {
|
|
336
|
+
logger.warning('Not configured');
|
|
337
|
+
logger.info("Run 'hub-launch project setup' to configure");
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const repo = await getRepoInfo();
|
|
341
|
+
logger.info(`Project Number: ${config.projectNumber}`);
|
|
342
|
+
logger.info(`Project ID: ${config.projectId}`);
|
|
343
|
+
logger.info(`Auto-sync: ${config.projectAutoSync ? 'enabled' : 'disabled'}`);
|
|
344
|
+
logger.blank();
|
|
345
|
+
logger.info(`URL: https://github.com/orgs/${repo.owner}/projects/${config.projectNumber}`);
|
|
346
|
+
logger.blank();
|
|
347
|
+
if (!config.projectAutoSync) {
|
|
348
|
+
logger.warning('Auto-sync is disabled. Issues are tracked locally only.');
|
|
349
|
+
logger.info('To enable: set projectAutoSync: true in .hublaunch/hublaunch.config.ts');
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.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
|
+
* Respond command - Respond to Copilot on an issue
|
|
5
|
+
*/
|
|
6
|
+
export declare function respondCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=respond.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/commands/respond.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBrE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { PRService } from "../services/github/PRService.js";
|
|
3
|
+
import { IssueService } from "../services/github/IssueService.js";
|
|
4
|
+
import { TrackingService, } from "../services/tracking/TrackingService.js";
|
|
5
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
6
|
+
import { searchSelect, UserCancelledError } from "../utils/prompts.js";
|
|
7
|
+
/**
|
|
8
|
+
* Respond command - Respond to Copilot on an issue
|
|
9
|
+
*/
|
|
10
|
+
export function respondCommand(program, config) {
|
|
11
|
+
program
|
|
12
|
+
.command("respond [issueNumber]")
|
|
13
|
+
.description("Respond to Copilot on an issue")
|
|
14
|
+
.option("--message <text>", "Message to send (skips editor)")
|
|
15
|
+
.action(async (issueNumber, options) => {
|
|
16
|
+
try {
|
|
17
|
+
await executeRespond(config, issueNumber, options);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error instanceof UserCancelledError) {
|
|
21
|
+
logger.info('\nCancelled.');
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
logger.error("Failed to respond:");
|
|
25
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function executeRespond(config, issueNumberArg, options) {
|
|
31
|
+
logger.section("Respond to Copilot");
|
|
32
|
+
// Initialize services
|
|
33
|
+
const prService = new PRService();
|
|
34
|
+
const issueService = new IssueService();
|
|
35
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
36
|
+
// Get issue number
|
|
37
|
+
let issueNumber;
|
|
38
|
+
if (issueNumberArg) {
|
|
39
|
+
issueNumber = parseInt(issueNumberArg, 10);
|
|
40
|
+
if (isNaN(issueNumber)) {
|
|
41
|
+
throw new Error(`Invalid issue number: ${issueNumberArg}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Show tracked issues and let user select
|
|
46
|
+
const trackedIssues = await trackingService.getAll();
|
|
47
|
+
if (trackedIssues.length === 0) {
|
|
48
|
+
throw new Error("No tracked issues found. Run 'hublaunch track' first.");
|
|
49
|
+
}
|
|
50
|
+
const choices = trackedIssues
|
|
51
|
+
.filter((issue) => issue.number !== undefined)
|
|
52
|
+
.map((issue) => ({
|
|
53
|
+
name: `#${issue.number} - ${issue.name}`,
|
|
54
|
+
value: issue.number.toString(),
|
|
55
|
+
}));
|
|
56
|
+
const selected = await searchSelect("Select issue to respond to:", choices);
|
|
57
|
+
issueNumber = parseInt(selected, 10);
|
|
58
|
+
}
|
|
59
|
+
// Check if there's a PR for this issue
|
|
60
|
+
const pr = await prService.getByIssue(issueNumber);
|
|
61
|
+
if (!pr) {
|
|
62
|
+
logger.error(`No PR found for issue #${issueNumber}. Copilot responses must be posted to PRs.`);
|
|
63
|
+
throw new Error("No PR found for this issue");
|
|
64
|
+
}
|
|
65
|
+
const targetNumber = pr.number;
|
|
66
|
+
logger.info(`Responding to PR #${targetNumber}...`);
|
|
67
|
+
logger.blank();
|
|
68
|
+
// Get message - let user choose compose mode
|
|
69
|
+
let message = options.message;
|
|
70
|
+
if (!message) {
|
|
71
|
+
// Import compose functions
|
|
72
|
+
const { selectComposeMode, openEditorForMessage, composeInTerminal, } = await import("../utils/editor.js");
|
|
73
|
+
// Ask user how they want to compose
|
|
74
|
+
const mode = await selectComposeMode();
|
|
75
|
+
if (!mode) {
|
|
76
|
+
// User cancelled
|
|
77
|
+
logger.warning("Message composition cancelled");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
logger.blank();
|
|
81
|
+
// Compose based on selected mode
|
|
82
|
+
if (mode === "editor") {
|
|
83
|
+
const editorMessage = await openEditorForMessage(config, "@copilot ");
|
|
84
|
+
if (!editorMessage) {
|
|
85
|
+
logger.warning("Message composition cancelled");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
message = editorMessage;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Terminal mode
|
|
92
|
+
const terminalMessage = await composeInTerminal("@copilot ");
|
|
93
|
+
if (!terminalMessage) {
|
|
94
|
+
logger.warning("Message composition cancelled");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
message = terminalMessage;
|
|
98
|
+
}
|
|
99
|
+
logger.blank();
|
|
100
|
+
}
|
|
101
|
+
// Ensure @copilot prefix
|
|
102
|
+
if (!message.trim().startsWith("@copilot")) {
|
|
103
|
+
message = `@copilot ${message}`;
|
|
104
|
+
}
|
|
105
|
+
logger.info("Posting comment...");
|
|
106
|
+
// Post comment to PR
|
|
107
|
+
await issueService.addComment(targetNumber, message);
|
|
108
|
+
logger.blank();
|
|
109
|
+
logger.success(`✓ Comment posted to PR #${targetNumber}`);
|
|
110
|
+
logger.blank();
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/commands/respond.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
|
+
* SetPriority command - Set priority label for tracked issue
|
|
5
|
+
*/
|
|
6
|
+
export declare function setPriorityCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=setPriority.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setPriority.d.ts","sourceRoot":"","sources":["../../src/commands/setPriority.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAC;AAK1D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBzE"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { TrackingService, } from "../services/tracking/TrackingService.js";
|
|
3
|
+
import { TrackingAdapterFactory } from "../services/tracking/TrackingAdapterFactory.js";
|
|
4
|
+
import { searchSelect, selectPriority, UserCancelledError } from "../utils/prompts.js";
|
|
5
|
+
import { DEFAULT_PRIORITY_LEVELS } from "../types/index.js";
|
|
6
|
+
import { HulaApiClient } from "../services/api/HulaApiClient.js";
|
|
7
|
+
/**
|
|
8
|
+
* SetPriority command - Set priority label for tracked issue
|
|
9
|
+
*/
|
|
10
|
+
export function setPriorityCommand(program, config) {
|
|
11
|
+
program
|
|
12
|
+
.command("setPriority [issueNumber] [priority]")
|
|
13
|
+
.description("Set priority label for tracked issue")
|
|
14
|
+
.action(async (issueNumber, priority) => {
|
|
15
|
+
try {
|
|
16
|
+
await executeSetPriority(config, issueNumber, priority);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof UserCancelledError) {
|
|
20
|
+
logger.info('\nCancelled.');
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
logger.error("Failed to set priority:");
|
|
24
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function executeSetPriority(config, issueNumberArg, priorityArg) {
|
|
30
|
+
logger.section("Set Issue Priority");
|
|
31
|
+
// Validate config
|
|
32
|
+
if (!config.hulaProjectUrl || !config.hulaApiKey) {
|
|
33
|
+
throw new Error('Hula project URL and API key are required. Run "hula init" to configure.');
|
|
34
|
+
}
|
|
35
|
+
// Initialize services
|
|
36
|
+
const trackingService = new TrackingService(TrackingAdapterFactory.create(config));
|
|
37
|
+
const apiClient = new HulaApiClient({
|
|
38
|
+
baseUrl: config.hulaProjectUrl,
|
|
39
|
+
apiKey: config.hulaApiKey,
|
|
40
|
+
});
|
|
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 set priority:", choices);
|
|
62
|
+
issueNumber = parseInt(selected, 10);
|
|
63
|
+
}
|
|
64
|
+
// Get tracked issue
|
|
65
|
+
const trackedIssue = await trackingService.getByNumber(issueNumber);
|
|
66
|
+
if (!trackedIssue) {
|
|
67
|
+
throw new Error(`Issue #${issueNumber} is not tracked. Run 'hula track ${issueNumber}' first.`);
|
|
68
|
+
}
|
|
69
|
+
// Get current priority from tracked issue
|
|
70
|
+
if (trackedIssue.priority) {
|
|
71
|
+
const currentLevel = DEFAULT_PRIORITY_LEVELS.find((level) => level.name === trackedIssue.priority);
|
|
72
|
+
if (currentLevel) {
|
|
73
|
+
logger.info(`Current priority: ${currentLevel.emoji} ${trackedIssue.priority}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
logger.info("Current priority: None");
|
|
78
|
+
}
|
|
79
|
+
logger.blank();
|
|
80
|
+
// Get priority
|
|
81
|
+
let priority;
|
|
82
|
+
if (priorityArg) {
|
|
83
|
+
// Validate priority
|
|
84
|
+
const validPriorities = DEFAULT_PRIORITY_LEVELS.map((level) => level.name);
|
|
85
|
+
if (!validPriorities.includes(priorityArg)) {
|
|
86
|
+
throw new Error(`Invalid priority: ${priorityArg}. Valid priorities: ${validPriorities.join(", ")}`);
|
|
87
|
+
}
|
|
88
|
+
priority = priorityArg;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Interactive selection
|
|
92
|
+
priority = await selectPriority("Select new priority:", DEFAULT_PRIORITY_LEVELS);
|
|
93
|
+
}
|
|
94
|
+
const priorityLevel = DEFAULT_PRIORITY_LEVELS.find((level) => level.name === priority);
|
|
95
|
+
if (!priorityLevel) {
|
|
96
|
+
throw new Error(`Invalid priority: ${priority}`);
|
|
97
|
+
}
|
|
98
|
+
// Update priority via hula-project API
|
|
99
|
+
logger.info(`Setting priority to ${priorityLevel.emoji} ${priority}...`);
|
|
100
|
+
// Get the server-side plan ID
|
|
101
|
+
const issues = await apiClient.listPlans();
|
|
102
|
+
const serverIssue = issues.plans.find((i) => i.issueNumber === issueNumber);
|
|
103
|
+
if (!serverIssue) {
|
|
104
|
+
throw new Error(`Plan #${issueNumber} not found on server`);
|
|
105
|
+
}
|
|
106
|
+
await apiClient.updatePlanPriority(serverIssue.id, priority);
|
|
107
|
+
logger.success(`✓ Priority updated successfully`);
|
|
108
|
+
logger.blank();
|
|
109
|
+
logger.success("✨ Priority updated successfully!");
|
|
110
|
+
logger.blank();
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=setPriority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setPriority.js","sourceRoot":"","sources":["../../src/commands/setPriority.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
|
+
* Track command - Add existing GitHub issues to tracking
|
|
5
|
+
*/
|
|
6
|
+
export declare function trackCommand(program: Command, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=track.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/commands/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,OAAO,KAAK,EAAE,MAAM,EAA+B,MAAM,mBAAmB,CAAC;AAQ7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiBnE"}
|