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,492 @@
|
|
|
1
|
+
import { runCommand, runCommandWithStdin, commandExists, getRepoRoot, } from './shell.js';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
const repoInfoCache = new Map();
|
|
4
|
+
const REPO_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
5
|
+
const REPO_CACHE_MAX_SIZE = 10; // LRU eviction after 10 entries
|
|
6
|
+
/**
|
|
7
|
+
* Retry helper with exponential backoff for transient failures
|
|
8
|
+
*/
|
|
9
|
+
async function retryWithBackoff(fn, maxRetries = 2, initialDelayMs = 1000) {
|
|
10
|
+
let lastError;
|
|
11
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
12
|
+
try {
|
|
13
|
+
return await fn();
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
17
|
+
const errorMessage = lastError.message.toLowerCase();
|
|
18
|
+
// Don't retry on authentication errors or client errors
|
|
19
|
+
if (errorMessage.includes('authentication') ||
|
|
20
|
+
errorMessage.includes('unauthorized') ||
|
|
21
|
+
errorMessage.includes('http 401') ||
|
|
22
|
+
errorMessage.includes('http 403') ||
|
|
23
|
+
errorMessage.includes('http 404') ||
|
|
24
|
+
errorMessage.includes('not found')) {
|
|
25
|
+
throw lastError;
|
|
26
|
+
}
|
|
27
|
+
// Retry on network errors and server errors
|
|
28
|
+
const isRetryable = errorMessage.includes('enotfound') ||
|
|
29
|
+
errorMessage.includes('etimedout') ||
|
|
30
|
+
errorMessage.includes('econnrefused') ||
|
|
31
|
+
errorMessage.includes('econnreset') ||
|
|
32
|
+
errorMessage.includes('connection reset') ||
|
|
33
|
+
errorMessage.includes('read tcp') ||
|
|
34
|
+
errorMessage.includes('network') ||
|
|
35
|
+
errorMessage.includes('http 5') ||
|
|
36
|
+
errorMessage.includes('api.github.com');
|
|
37
|
+
if (!isRetryable || attempt === maxRetries) {
|
|
38
|
+
throw lastError;
|
|
39
|
+
}
|
|
40
|
+
// Exponential backoff
|
|
41
|
+
const delayMs = initialDelayMs * Math.pow(2, attempt);
|
|
42
|
+
logger.debug(`Retrying after ${delayMs}ms (attempt ${attempt + 1}/${maxRetries})...`);
|
|
43
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw lastError;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if GitHub CLI is installed
|
|
50
|
+
*/
|
|
51
|
+
export async function checkGhCli() {
|
|
52
|
+
const exists = await commandExists('gh');
|
|
53
|
+
if (!exists) {
|
|
54
|
+
logger.error('GitHub CLI (gh) is not installed.');
|
|
55
|
+
logger.info('Install it from: https://cli.github.com/');
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if authenticated with GitHub CLI
|
|
62
|
+
* Automatically attempts to refresh expired tokens before prompting re-login
|
|
63
|
+
*/
|
|
64
|
+
export async function checkGhAuth() {
|
|
65
|
+
try {
|
|
66
|
+
await runCommand('gh auth status', { silent: true });
|
|
67
|
+
// Proactively refresh if the token will expire within 2 hours,
|
|
68
|
+
// so that subsequent git operations don't fail mid-session.
|
|
69
|
+
// This runs in the background — failure is non-fatal.
|
|
70
|
+
const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
|
|
71
|
+
(async () => {
|
|
72
|
+
try {
|
|
73
|
+
const loginModule = await import('../commands/login.js');
|
|
74
|
+
const tokenData = await loginModule.loadGitHubToken();
|
|
75
|
+
if (tokenData?.expires_at &&
|
|
76
|
+
loginModule.isTokenExpiringWithin(tokenData.expires_at, TWO_HOURS_MS)) {
|
|
77
|
+
logger.debug('Token expiring within 2 hours — proactively refreshing');
|
|
78
|
+
await attemptTokenRefresh();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Non-fatal: proactive refresh failure must not block the command
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Attempt automatic token refresh for any gh auth status failure
|
|
89
|
+
const refreshed = await attemptTokenRefresh();
|
|
90
|
+
if (refreshed) {
|
|
91
|
+
logger.success('✅ GitHub token automatically refreshed');
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
// Refresh not possible (no refresh token available or refresh failed)
|
|
95
|
+
logger.blank();
|
|
96
|
+
logger.error('⚠️ GitHub authentication has expired or is unavailable.');
|
|
97
|
+
logger.blank();
|
|
98
|
+
logger.info('Please re-authenticate by running:');
|
|
99
|
+
logger.info(' hula login');
|
|
100
|
+
logger.blank();
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Attempt to refresh the GitHub token automatically
|
|
106
|
+
* Returns true if successful, false otherwise
|
|
107
|
+
*/
|
|
108
|
+
async function attemptTokenRefresh() {
|
|
109
|
+
try {
|
|
110
|
+
// Import login module functions
|
|
111
|
+
const loginModule = await import('../commands/login.js');
|
|
112
|
+
const { loadConfig } = await import('../config/index.js');
|
|
113
|
+
// Load saved token
|
|
114
|
+
const tokenData = await loginModule.loadGitHubToken();
|
|
115
|
+
if (!tokenData || !tokenData.refresh_token) {
|
|
116
|
+
logger.debug('No refresh token available');
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
// Attempt token refresh using the stored refresh token
|
|
120
|
+
logger.info('🔄 Attempting automatic token refresh...');
|
|
121
|
+
// Load config for client ID
|
|
122
|
+
const config = await loadConfig();
|
|
123
|
+
// Refresh the token
|
|
124
|
+
const refreshed = await loginModule.refreshGitHubToken(tokenData.refresh_token, config);
|
|
125
|
+
if (!refreshed) {
|
|
126
|
+
logger.debug('Token refresh failed');
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
// Save the new token directly
|
|
130
|
+
const fs = await import('fs/promises');
|
|
131
|
+
const path = await import('path');
|
|
132
|
+
const os = await import('os');
|
|
133
|
+
const tokenPath = path.join(os.homedir(), '.hublaunch', 'github-token');
|
|
134
|
+
const newTokenData = {
|
|
135
|
+
access_token: refreshed.access_token,
|
|
136
|
+
refresh_token: refreshed.refresh_token,
|
|
137
|
+
expires_at: refreshed.expires_in
|
|
138
|
+
? new Date(Date.now() + refreshed.expires_in * 1000).toISOString()
|
|
139
|
+
: null,
|
|
140
|
+
created_at: new Date().toISOString(),
|
|
141
|
+
};
|
|
142
|
+
await fs.writeFile(tokenPath, JSON.stringify(newTokenData, null, 2), {
|
|
143
|
+
mode: 0o600,
|
|
144
|
+
});
|
|
145
|
+
logger.debug('Saved refreshed token');
|
|
146
|
+
// Re-configure gh CLI
|
|
147
|
+
const { exec } = await import('child_process');
|
|
148
|
+
const { promisify } = await import('util');
|
|
149
|
+
const execAsync = promisify(exec);
|
|
150
|
+
try {
|
|
151
|
+
await execAsync('which gh');
|
|
152
|
+
await execAsync(`echo "${refreshed.access_token}" | gh auth login --with-token`);
|
|
153
|
+
logger.debug('GitHub CLI re-configured with refreshed token');
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
logger.debug('Could not re-configure gh CLI');
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
logger.debug('Token refresh attempt failed: ' + error);
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Validate all GitHub CLI requirements
|
|
167
|
+
*/
|
|
168
|
+
export async function validateGhCli() {
|
|
169
|
+
const cliExists = await checkGhCli();
|
|
170
|
+
if (!cliExists)
|
|
171
|
+
return false;
|
|
172
|
+
const isAuthed = await checkGhAuth();
|
|
173
|
+
if (!isAuthed)
|
|
174
|
+
return false;
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get GitHub CLI version
|
|
179
|
+
* Returns version string like "2.40.1" or null if unable to determine
|
|
180
|
+
*/
|
|
181
|
+
export async function getGhVersion() {
|
|
182
|
+
try {
|
|
183
|
+
const output = await runCommand('gh --version', { silent: true });
|
|
184
|
+
// Output format: "gh version 2.40.1 (2023-12-13)\n..." or "gh version 2.4\n..."
|
|
185
|
+
// Match 2 or 3 part versions
|
|
186
|
+
const match = output.match(/gh version (\d+\.\d+(?:\.\d+)?)/);
|
|
187
|
+
return match?.[1] ?? null;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
logger.debug(`Failed to get gh version: ${error}`);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Check if GitHub CLI version meets minimum requirement
|
|
196
|
+
* @param minVersion - Minimum required version (e.g., "2.4.0")
|
|
197
|
+
* @returns true if version is sufficient, false otherwise
|
|
198
|
+
*/
|
|
199
|
+
export async function checkGhVersion(minVersion = '2.4.0') {
|
|
200
|
+
const version = await getGhVersion();
|
|
201
|
+
if (!version) {
|
|
202
|
+
logger.error('Unable to determine GitHub CLI version.');
|
|
203
|
+
logger.info('Install it from: https://cli.github.com/');
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// Parse version strings into comparable numbers
|
|
207
|
+
// Validate that all parts are numeric
|
|
208
|
+
const parseVersion = (v) => {
|
|
209
|
+
const parts = v.split('.').map((n) => parseInt(n, 10));
|
|
210
|
+
// Ensure all parts are valid numbers
|
|
211
|
+
if (parts.some((n) => isNaN(n))) {
|
|
212
|
+
logger.debug(`Invalid version format: ${v}`);
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
return parts;
|
|
216
|
+
};
|
|
217
|
+
const current = parseVersion(version);
|
|
218
|
+
const required = parseVersion(minVersion);
|
|
219
|
+
// If parsing failed, return false
|
|
220
|
+
if (current.length === 0 || required.length === 0) {
|
|
221
|
+
logger.error('Unable to parse version numbers.');
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
// Compare major.minor.patch
|
|
225
|
+
// Treat missing parts as 0 (e.g., "2.4" becomes [2, 4, 0])
|
|
226
|
+
for (let i = 0; i < 3; i++) {
|
|
227
|
+
const currentPart = current[i] ?? 0;
|
|
228
|
+
const requiredPart = required[i] ?? 0;
|
|
229
|
+
if (currentPart > requiredPart)
|
|
230
|
+
return true;
|
|
231
|
+
if (currentPart < requiredPart) {
|
|
232
|
+
logger.error(`GitHub CLI version ${version} is too old.`);
|
|
233
|
+
logger.error(`Minimum required: ${minVersion} (for GitHub Projects v2 support)`);
|
|
234
|
+
logger.info('');
|
|
235
|
+
logger.info('Upgrade with:');
|
|
236
|
+
logger.info(' brew upgrade gh # macOS with Homebrew');
|
|
237
|
+
logger.info(' winget upgrade GitHub.cli # Windows with winget');
|
|
238
|
+
logger.info(' choco upgrade gh # Windows with Chocolatey');
|
|
239
|
+
logger.info(' gh extension upgrade cli # Using gh extensions');
|
|
240
|
+
logger.info(' See https://cli.github.com/ for other platforms');
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
logger.debug(`GitHub CLI version ${version} meets requirement (>= ${minVersion})`);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Run a GitHub CLI command
|
|
249
|
+
*/
|
|
250
|
+
export async function runGh(args, options = {}) {
|
|
251
|
+
// Properly escape arguments to avoid shell interpretation
|
|
252
|
+
const escapedArgs = args.map((arg) => {
|
|
253
|
+
// If arg contains special characters, quote it
|
|
254
|
+
if (arg.includes(' ') ||
|
|
255
|
+
arg.includes('(') ||
|
|
256
|
+
arg.includes(')') ||
|
|
257
|
+
arg.includes('|') ||
|
|
258
|
+
arg.includes('"') ||
|
|
259
|
+
arg.includes('\t')) {
|
|
260
|
+
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
261
|
+
}
|
|
262
|
+
return arg;
|
|
263
|
+
});
|
|
264
|
+
return runCommand(`gh ${escapedArgs.join(' ')}`, options);
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Run GitHub CLI API command and parse JSON response with retry logic
|
|
268
|
+
*
|
|
269
|
+
* For POST and PATCH requests with fields, we always use JSON input via stdin
|
|
270
|
+
* (`--input -`) to avoid shell escaping issues. This ensures that body content
|
|
271
|
+
* containing special characters (backticks, parentheses, quotes, etc.) is handled
|
|
272
|
+
* correctly without shell interpretation.
|
|
273
|
+
*/
|
|
274
|
+
export async function ghApi(endpoint, options = {}) {
|
|
275
|
+
const executeApi = async () => {
|
|
276
|
+
const { method = 'GET', fields = {} } = options;
|
|
277
|
+
let cmd = `gh api ${endpoint}`;
|
|
278
|
+
if (method !== 'GET') {
|
|
279
|
+
cmd += ` -X ${method}`;
|
|
280
|
+
}
|
|
281
|
+
const hasFields = Object.keys(fields).length > 0;
|
|
282
|
+
let output;
|
|
283
|
+
// Always use JSON input for POST/PATCH/PUT requests with fields to avoid shell
|
|
284
|
+
// escaping issues with special characters (backticks, parentheses, etc.)
|
|
285
|
+
// Especially important on Windows where single quotes don't work correctly
|
|
286
|
+
if (hasFields && (method === 'POST' || method === 'PATCH' || method === 'PUT')) {
|
|
287
|
+
const jsonData = JSON.stringify(fields);
|
|
288
|
+
cmd += ` --input -`;
|
|
289
|
+
output = await runCommandWithStdin(cmd, jsonData);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// For GET requests or requests without fields, use command line arguments
|
|
293
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
294
|
+
if (typeof value === 'string') {
|
|
295
|
+
// Use double quotes for better Windows compatibility
|
|
296
|
+
cmd += ` -f ${key}="${value}"`;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
output = await runCommand(cmd);
|
|
300
|
+
}
|
|
301
|
+
// Handle empty responses (common with DELETE operations that return 204 No Content)
|
|
302
|
+
const trimmedOutput = output.trim();
|
|
303
|
+
if (trimmedOutput === '') {
|
|
304
|
+
// Return undefined for empty responses, cast to T for type safety
|
|
305
|
+
// This is safe because DELETE operations don't return data
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
return JSON.parse(trimmedOutput);
|
|
309
|
+
};
|
|
310
|
+
// Use retry logic unless explicitly disabled or for write operations
|
|
311
|
+
// Don't retry POST/PATCH/DELETE to avoid duplicate operations
|
|
312
|
+
const { method = 'GET', skipRetry = false } = options;
|
|
313
|
+
if (skipRetry || method !== 'GET') {
|
|
314
|
+
return executeApi();
|
|
315
|
+
}
|
|
316
|
+
return retryWithBackoff(executeApi);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Get current GitHub username
|
|
320
|
+
*/
|
|
321
|
+
export async function getGhUsername() {
|
|
322
|
+
const result = await ghApi('/user');
|
|
323
|
+
return result.login;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get repository information with retry logic and caching
|
|
327
|
+
*/
|
|
328
|
+
export async function getRepoInfo() {
|
|
329
|
+
// Get repo root as cache key
|
|
330
|
+
let cacheKey;
|
|
331
|
+
try {
|
|
332
|
+
cacheKey = await getRepoRoot();
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// If we can't get repo root, use process.cwd() as fallback
|
|
336
|
+
cacheKey = process.cwd();
|
|
337
|
+
}
|
|
338
|
+
// Check cache first
|
|
339
|
+
const cached = repoInfoCache.get(cacheKey);
|
|
340
|
+
const now = Date.now();
|
|
341
|
+
if (cached && now - cached.timestamp < REPO_CACHE_TTL_MS) {
|
|
342
|
+
logger.debug('Using cached repo info');
|
|
343
|
+
return cached.data;
|
|
344
|
+
}
|
|
345
|
+
// Fetch with retry logic
|
|
346
|
+
const fetchRepoInfo = async () => {
|
|
347
|
+
logger.debug('Fetching repo info from GitHub CLI');
|
|
348
|
+
try {
|
|
349
|
+
const result = await runCommand('gh repo view --json owner,name', {
|
|
350
|
+
silent: true,
|
|
351
|
+
});
|
|
352
|
+
const parsed = JSON.parse(result);
|
|
353
|
+
const repoInfo = {
|
|
354
|
+
owner: parsed.owner.login,
|
|
355
|
+
name: parsed.name,
|
|
356
|
+
};
|
|
357
|
+
logger.debug(`Fetched repo info: ${repoInfo.owner}/${repoInfo.name}`);
|
|
358
|
+
return repoInfo;
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
362
|
+
// Check if the error is because the repository doesn't exist on GitHub
|
|
363
|
+
if (errorMessage.includes('Could not resolve to a Repository')) {
|
|
364
|
+
// Try to get the repository name from the git remote
|
|
365
|
+
try {
|
|
366
|
+
const remoteUrl = await runCommand('git config --get remote.origin.url', {
|
|
367
|
+
silent: true,
|
|
368
|
+
});
|
|
369
|
+
// Parse the remote URL to extract owner/repo
|
|
370
|
+
const match = remoteUrl.match(/github\.com[:/](.+?)\/(.+?)(\.git)?$/);
|
|
371
|
+
if (match) {
|
|
372
|
+
const owner = match[1];
|
|
373
|
+
const repo = match[2];
|
|
374
|
+
logger.blank();
|
|
375
|
+
logger.error(`Repository not found on GitHub: ${owner}/${repo}`);
|
|
376
|
+
logger.blank();
|
|
377
|
+
logger.info('The repository exists locally but not on GitHub.');
|
|
378
|
+
logger.info('Please create it first using one of these methods:');
|
|
379
|
+
logger.blank();
|
|
380
|
+
logger.info(' 1. Using GitHub CLI:');
|
|
381
|
+
logger.info(` gh repo create ${owner}/${repo} --source=. --push`);
|
|
382
|
+
logger.blank();
|
|
383
|
+
logger.info(' 2. Via GitHub website:');
|
|
384
|
+
logger.info(' https://github.com/new');
|
|
385
|
+
logger.blank();
|
|
386
|
+
throw new Error(`Repository ${owner}/${repo} does not exist on GitHub`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
catch (gitError) {
|
|
390
|
+
// If we can't get the remote URL, just rethrow the original error
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
throw error;
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
try {
|
|
397
|
+
const repoInfo = await retryWithBackoff(fetchRepoInfo, 2, 1000);
|
|
398
|
+
// LRU eviction: remove oldest entry if cache is at max size
|
|
399
|
+
// (do this before adding new entry to maintain max size)
|
|
400
|
+
if (repoInfoCache.size >= REPO_CACHE_MAX_SIZE) {
|
|
401
|
+
let oldestKey = null;
|
|
402
|
+
let oldestTime = Infinity;
|
|
403
|
+
for (const [key, value] of repoInfoCache.entries()) {
|
|
404
|
+
if (value.timestamp < oldestTime) {
|
|
405
|
+
oldestTime = value.timestamp;
|
|
406
|
+
oldestKey = key;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (oldestKey) {
|
|
410
|
+
repoInfoCache.delete(oldestKey);
|
|
411
|
+
logger.debug(`Evicted oldest cache entry: ${oldestKey}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// Update cache with fresh data (timestamp after successful retrieval)
|
|
415
|
+
repoInfoCache.set(cacheKey, {
|
|
416
|
+
data: repoInfo,
|
|
417
|
+
timestamp: Date.now(),
|
|
418
|
+
});
|
|
419
|
+
return repoInfo;
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
// Fallback to cached value if available (even if expired)
|
|
423
|
+
if (cached) {
|
|
424
|
+
logger.warning('Unable to fetch repo info, using cached data (may be stale)');
|
|
425
|
+
return cached.data;
|
|
426
|
+
}
|
|
427
|
+
// No cache available, throw the error
|
|
428
|
+
throw error;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* GraphQL query helper with retry logic
|
|
433
|
+
*/
|
|
434
|
+
export async function ghGraphQL(query, variables = {}, options = {}) {
|
|
435
|
+
const executeQuery = async () => {
|
|
436
|
+
const isWindows = process.platform === 'win32';
|
|
437
|
+
let cmd;
|
|
438
|
+
if (isWindows) {
|
|
439
|
+
// Windows: Use double quotes with backslash escaping
|
|
440
|
+
const escapedQuery = query
|
|
441
|
+
.replace(/\\/g, '\\\\')
|
|
442
|
+
.replace(/"/g, '\\"')
|
|
443
|
+
.replace(/\n/g, ' ')
|
|
444
|
+
.replace(/\r/g, '');
|
|
445
|
+
cmd = `gh api graphql -f query="${escapedQuery}"`;
|
|
446
|
+
// Add variables
|
|
447
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
448
|
+
if (typeof value === 'number') {
|
|
449
|
+
cmd += ` -F ${key}=${value}`;
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
const escapedValue = String(value)
|
|
453
|
+
.replace(/\\/g, '\\\\')
|
|
454
|
+
.replace(/"/g, '\\"');
|
|
455
|
+
cmd += ` -f ${key}="${escapedValue}"`;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
// Mac/Linux: Use single quotes (no escaping needed inside single quotes)
|
|
461
|
+
// Just replace single quotes with '\'' to break out and add escaped quote
|
|
462
|
+
const escapedQuery = query
|
|
463
|
+
.replace(/'/g, "'\\''")
|
|
464
|
+
.replace(/\n/g, ' ')
|
|
465
|
+
.replace(/\r/g, '');
|
|
466
|
+
cmd = `gh api graphql -f query='${escapedQuery}'`;
|
|
467
|
+
// Add variables
|
|
468
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
469
|
+
if (typeof value === 'number') {
|
|
470
|
+
cmd += ` -F ${key}=${value}`;
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
const escapedValue = String(value).replace(/'/g, "'\\''");
|
|
474
|
+
cmd += ` -f ${key}='${escapedValue}'`;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
if (!options.suppressErrors) {
|
|
479
|
+
logger.debug(`GraphQL command: ${cmd.substring(0, 200)}...`);
|
|
480
|
+
}
|
|
481
|
+
const output = await runCommand(cmd, {
|
|
482
|
+
suppressErrors: options.suppressErrors,
|
|
483
|
+
});
|
|
484
|
+
return JSON.parse(output);
|
|
485
|
+
};
|
|
486
|
+
// Use retry logic unless explicitly disabled
|
|
487
|
+
if (options.skipRetry) {
|
|
488
|
+
return executeQuery();
|
|
489
|
+
}
|
|
490
|
+
return retryWithBackoff(executeQuery);
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=github-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-cli.js","sourceRoot":"","sources":["../../src/utils/github-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { IssueStatus, Priority } from '../types/index.js';
|
|
2
|
+
export declare const logger: {
|
|
3
|
+
info: (msg: string) => void;
|
|
4
|
+
success: (msg: string) => void;
|
|
5
|
+
warning: (msg: string) => void;
|
|
6
|
+
error: (msg: string) => void;
|
|
7
|
+
debug: (msg: string) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Print a section header
|
|
10
|
+
*/
|
|
11
|
+
section: (title: string) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Display issue with status indicator
|
|
14
|
+
*/
|
|
15
|
+
issue: (status: IssueStatus, msg: string) => void;
|
|
16
|
+
/**
|
|
17
|
+
* Display priority with colored emoji
|
|
18
|
+
*/
|
|
19
|
+
priority: (level: Priority, emoji: string, msg: string) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Display a list item
|
|
22
|
+
*/
|
|
23
|
+
listItem: (msg: string, indent?: number) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Display a numbered list item
|
|
26
|
+
*/
|
|
27
|
+
numberedItem: (num: number, msg: string, indent?: number) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Print blank line
|
|
30
|
+
*/
|
|
31
|
+
blank: () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Raw console.log passthrough
|
|
34
|
+
*/
|
|
35
|
+
log: (...args: unknown[]) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Create a spinner/loading indicator
|
|
38
|
+
* Returns an object with stop() method to clear the spinner
|
|
39
|
+
*/
|
|
40
|
+
spinner: (msg: string) => {
|
|
41
|
+
stop: (_finalMsg?: string) => void;
|
|
42
|
+
update: (_newMsg: string) => void;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA2B/D,eAAO,MAAM,MAAM;gBACL,MAAM;mBACH,MAAM;mBACN,MAAM;iBACR,MAAM;iBACN,MAAM;IAOnB;;OAEG;qBACc,MAAM;IAMvB;;OAEG;oBACa,WAAW,OAAO,MAAM;IAQxC;;OAEG;sBACe,QAAQ,SAAS,MAAM,OAAO,MAAM;IAMtD;;OAEG;oBACa,MAAM;IAKtB;;OAEG;wBACiB,MAAM,OAAO,MAAM;IAKvC;;OAEG;;IAGH;;OAEG;mBACY,OAAO,EAAE;IAExB;;;OAGG;mBACY,MAAM;2BAQI,MAAM;0BACP,MAAM;;CA2B/B,CAAC"}
|