@thanhvn14/csvibe 0.1.0 → 0.1.2
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/.csvibe/state/approaches.json +1 -0
- package/README.md +142 -3
- package/dist/commands/brainstorm.d.ts +16 -0
- package/dist/commands/brainstorm.d.ts.map +1 -0
- package/dist/commands/brainstorm.js +186 -0
- package/dist/commands/brainstorm.js.map +1 -0
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +72 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +13 -7
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init/index.d.ts +7 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +10 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/init-command.d.ts +10 -0
- package/dist/commands/init/init-command.d.ts.map +1 -0
- package/dist/commands/init/init-command.js +75 -0
- package/dist/commands/init/init-command.js.map +1 -0
- package/dist/commands/init/phases/config-handler.d.ts +10 -0
- package/dist/commands/init/phases/config-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/config-handler.js +21 -0
- package/dist/commands/init/phases/config-handler.js.map +1 -0
- package/dist/commands/init/phases/detection-handler.d.ts +10 -0
- package/dist/commands/init/phases/detection-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/detection-handler.js +80 -0
- package/dist/commands/init/phases/detection-handler.js.map +1 -0
- package/dist/commands/init/phases/download-handler.d.ts +9 -0
- package/dist/commands/init/phases/download-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/download-handler.js +16 -0
- package/dist/commands/init/phases/download-handler.js.map +1 -0
- package/dist/commands/init/phases/prompt-handler.d.ts +10 -0
- package/dist/commands/init/phases/prompt-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/prompt-handler.js +24 -0
- package/dist/commands/init/phases/prompt-handler.js.map +1 -0
- package/dist/commands/init/phases/scaffold-handler.d.ts +9 -0
- package/dist/commands/init/phases/scaffold-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/scaffold-handler.js +18 -0
- package/dist/commands/init/phases/scaffold-handler.js.map +1 -0
- package/dist/commands/init/phases/validation-handler.d.ts +14 -0
- package/dist/commands/init/phases/validation-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/validation-handler.js +50 -0
- package/dist/commands/init/phases/validation-handler.js.map +1 -0
- package/dist/commands/init/phases/vscode-handler.d.ts +9 -0
- package/dist/commands/init/phases/vscode-handler.d.ts.map +1 -0
- package/dist/commands/init/phases/vscode-handler.js +16 -0
- package/dist/commands/init/phases/vscode-handler.js.map +1 -0
- package/dist/commands/init/types.d.ts +28 -0
- package/dist/commands/init/types.d.ts.map +1 -0
- package/dist/commands/init/types.js +6 -0
- package/dist/commands/init/types.js.map +1 -0
- package/dist/commands/scout.d.ts +30 -0
- package/dist/commands/scout.d.ts.map +1 -0
- package/dist/commands/scout.js +116 -0
- package/dist/commands/scout.js.map +1 -0
- package/dist/config/constants.d.ts +3 -3
- package/dist/config/constants.js +3 -3
- package/dist/config/constants.js.map +1 -1
- package/dist/domains/config/generator.d.ts +17 -0
- package/dist/domains/config/generator.d.ts.map +1 -0
- package/dist/domains/config/generator.js +67 -0
- package/dist/domains/config/generator.js.map +1 -0
- package/dist/domains/config/index.d.ts +8 -0
- package/dist/domains/config/index.d.ts.map +1 -0
- package/dist/domains/config/index.js +15 -0
- package/dist/domains/config/index.js.map +1 -0
- package/dist/domains/config/types.d.ts +39 -0
- package/dist/domains/config/types.d.ts.map +1 -0
- package/dist/domains/config/types.js +6 -0
- package/dist/domains/config/types.js.map +1 -0
- package/dist/domains/config/validator.d.ts +17 -0
- package/dist/domains/config/validator.d.ts.map +1 -0
- package/dist/domains/config/validator.js +54 -0
- package/dist/domains/config/validator.js.map +1 -0
- package/dist/domains/github/auth-api.d.ts +19 -0
- package/dist/domains/github/auth-api.d.ts.map +1 -0
- package/dist/domains/github/auth-api.js +196 -0
- package/dist/domains/github/auth-api.js.map +1 -0
- package/dist/domains/github/github-client.d.ts +323 -0
- package/dist/domains/github/github-client.d.ts.map +1 -0
- package/dist/domains/github/github-client.js +192 -0
- package/dist/domains/github/github-client.js.map +1 -0
- package/dist/domains/github/index.d.ts +9 -0
- package/dist/domains/github/index.d.ts.map +1 -0
- package/dist/domains/github/index.js +23 -0
- package/dist/domains/github/index.js.map +1 -0
- package/dist/domains/github/keychain.d.ts +19 -0
- package/dist/domains/github/keychain.d.ts.map +1 -0
- package/dist/domains/github/keychain.js +132 -0
- package/dist/domains/github/keychain.js.map +1 -0
- package/dist/domains/github/types.d.ts +40 -0
- package/dist/domains/github/types.d.ts.map +1 -0
- package/dist/domains/github/types.js +6 -0
- package/dist/domains/github/types.js.map +1 -0
- package/dist/domains/health-checks/auto-healer.d.ts +14 -0
- package/dist/domains/health-checks/auto-healer.d.ts.map +1 -0
- package/dist/domains/health-checks/auto-healer.js +160 -0
- package/dist/domains/health-checks/auto-healer.js.map +1 -0
- package/dist/domains/health-checks/check-runner.d.ts +10 -0
- package/dist/domains/health-checks/check-runner.d.ts.map +1 -0
- package/dist/domains/health-checks/check-runner.js +31 -0
- package/dist/domains/health-checks/check-runner.js.map +1 -0
- package/dist/domains/health-checks/checkers/auth-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/auth-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/auth-checker.js +90 -0
- package/dist/domains/health-checks/checkers/auth-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/deps-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/deps-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/deps-checker.js +150 -0
- package/dist/domains/health-checks/checkers/deps-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/project-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/project-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/project-checker.js +124 -0
- package/dist/domains/health-checks/checkers/project-checker.js.map +1 -0
- package/dist/domains/health-checks/checkers/system-checker.d.ts +10 -0
- package/dist/domains/health-checks/checkers/system-checker.d.ts.map +1 -0
- package/dist/domains/health-checks/checkers/system-checker.js +135 -0
- package/dist/domains/health-checks/checkers/system-checker.js.map +1 -0
- package/dist/domains/health-checks/index.d.ts +9 -0
- package/dist/domains/health-checks/index.d.ts.map +1 -0
- package/dist/domains/health-checks/index.js +21 -0
- package/dist/domains/health-checks/index.js.map +1 -0
- package/dist/domains/health-checks/report-generator.d.ts +18 -0
- package/dist/domains/health-checks/report-generator.d.ts.map +1 -0
- package/dist/domains/health-checks/report-generator.js +117 -0
- package/dist/domains/health-checks/report-generator.js.map +1 -0
- package/dist/domains/health-checks/types.d.ts +35 -0
- package/dist/domains/health-checks/types.d.ts.map +1 -0
- package/dist/domains/health-checks/types.js +6 -0
- package/dist/domains/health-checks/types.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/approaches-validator.d.ts +40 -0
- package/dist/utils/approaches-validator.d.ts.map +1 -0
- package/dist/utils/approaches-validator.js +101 -0
- package/dist/utils/approaches-validator.js.map +1 -0
- package/dist/utils/dependency-analyzer.d.ts +31 -0
- package/dist/utils/dependency-analyzer.d.ts.map +1 -0
- package/dist/utils/dependency-analyzer.js +294 -0
- package/dist/utils/dependency-analyzer.js.map +1 -0
- package/dist/utils/directory-analyzer.d.ts +23 -0
- package/dist/utils/directory-analyzer.d.ts.map +1 -0
- package/dist/utils/directory-analyzer.js +81 -0
- package/dist/utils/directory-analyzer.js.map +1 -0
- package/dist/utils/downloader.d.ts +3 -3
- package/dist/utils/downloader.d.ts.map +1 -1
- package/dist/utils/downloader.js +35 -65
- package/dist/utils/downloader.js.map +1 -1
- package/dist/utils/errors.d.ts +64 -10
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +136 -22
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/gh-cli.d.ts +4 -2
- package/dist/utils/gh-cli.d.ts.map +1 -1
- package/dist/utils/gh-cli.js +33 -38
- package/dist/utils/gh-cli.js.map +1 -1
- package/dist/utils/progress.d.ts +37 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +121 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/prompts.d.ts +5 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +124 -64
- package/dist/utils/prompts.js.map +1 -1
- package/package.json +7 -3
- package/test-jira-prompt.js +32 -0
- package/dist/commands/init.d.ts +0 -6
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -147
- package/dist/commands/init.js.map +0 -1
package/dist/utils/errors.d.ts
CHANGED
|
@@ -2,25 +2,79 @@
|
|
|
2
2
|
* Error handling utilities and custom error classes
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Abstract base error class for CSVibe CLI errors
|
|
6
|
+
* All custom errors should extend this class
|
|
6
7
|
*/
|
|
7
|
-
export declare class
|
|
8
|
-
readonly code: string;
|
|
8
|
+
export declare abstract class CSVibeError extends Error {
|
|
9
9
|
readonly exitCode: number;
|
|
10
|
-
|
|
10
|
+
abstract code: string;
|
|
11
|
+
abstract recoveryHint: string;
|
|
12
|
+
constructor(message: string, exitCode?: number);
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
15
|
+
* GitHub authentication error
|
|
14
16
|
*/
|
|
15
|
-
export declare class
|
|
16
|
-
|
|
17
|
+
export declare class GitHubAuthError extends CSVibeError {
|
|
18
|
+
code: string;
|
|
19
|
+
recoveryHint: string;
|
|
20
|
+
constructor(message?: string);
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
19
|
-
*
|
|
23
|
+
* Project not found error
|
|
20
24
|
*/
|
|
21
|
-
export declare class
|
|
22
|
-
|
|
25
|
+
export declare class ProjectNotFoundError extends CSVibeError {
|
|
26
|
+
code: string;
|
|
27
|
+
recoveryHint: string;
|
|
28
|
+
constructor(message?: string);
|
|
23
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Config validation error
|
|
32
|
+
*/
|
|
33
|
+
export declare class ConfigValidationError extends CSVibeError {
|
|
34
|
+
code: string;
|
|
35
|
+
recoveryHint: string;
|
|
36
|
+
constructor(message?: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Network error
|
|
40
|
+
*/
|
|
41
|
+
export declare class NetworkError extends CSVibeError {
|
|
42
|
+
code: string;
|
|
43
|
+
recoveryHint: string;
|
|
44
|
+
constructor(message?: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Dependency error
|
|
48
|
+
*/
|
|
49
|
+
export declare class DependencyError extends CSVibeError {
|
|
50
|
+
code: string;
|
|
51
|
+
recoveryHint: string;
|
|
52
|
+
constructor(message?: string);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Legacy error classes for backward compatibility
|
|
56
|
+
*/
|
|
57
|
+
export declare class CsvibeError extends CSVibeError {
|
|
58
|
+
code: string;
|
|
59
|
+
recoveryHint: string;
|
|
60
|
+
constructor(message: string, code?: string, exitCode?: number);
|
|
61
|
+
}
|
|
62
|
+
export declare class GhCliError extends GitHubAuthError {
|
|
63
|
+
constructor(message: string, _code?: string);
|
|
64
|
+
}
|
|
65
|
+
export declare class ValidationError extends CSVibeError {
|
|
66
|
+
code: string;
|
|
67
|
+
recoveryHint: string;
|
|
68
|
+
constructor(message: string, code?: string);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Format error with color-coded output and recovery hints
|
|
72
|
+
*/
|
|
73
|
+
export declare function formatError(error: CSVibeError): string;
|
|
74
|
+
/**
|
|
75
|
+
* Log error to file for debugging
|
|
76
|
+
*/
|
|
77
|
+
export declare function logError(error: Error): Promise<void>;
|
|
24
78
|
/**
|
|
25
79
|
* Global error handler for CLI
|
|
26
80
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;GAGG;AACH,8BAAsB,WAAY,SAAQ,KAAK;aAM3B,QAAQ,EAAE,MAAM;IALlC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAG5B,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAU;CAMvC;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAe;IACnB,YAAY,SAA+F;gBAE/F,OAAO,GAAE,MAAuC;CAG7D;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW;IACnD,IAAI,SAAyB;IAC7B,YAAY,SAAkG;gBAElG,OAAO,GAAE,MAA0C;CAGhE;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,IAAI,SAAsB;IAC1B,YAAY,SAA2E;gBAE3E,OAAO,GAAE,MAA0C;CAGhE;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAW;IAC3C,IAAI,SAAe;IACnB,YAAY,SAAyF;gBAEzF,OAAO,GAAE,MAAiC;CAGvD;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAkB;IACtB,YAAY,SAAiE;gBAEjE,OAAO,GAAE,MAAwC;CAG9D;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,IAAI,SAAe;IACnB,YAAY,SAAmF;gBAG7F,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,GAAE,MAAU;CAKvB;AAED,qBAAa,UAAW,SAAQ,eAAe;gBACjC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;CAG5C;AAED,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAkB;IACtB,YAAY,SAAoD;gBAEpD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;CAI3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAkBtD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAkBjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC1E,EAAE,EAAE,CAAC,GACJ,CAAC,CAQH"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -6,54 +6,168 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
7
|
};
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.ValidationError = exports.GhCliError = exports.CsvibeError = void 0;
|
|
9
|
+
exports.ValidationError = exports.GhCliError = exports.CsvibeError = exports.DependencyError = exports.NetworkError = exports.ConfigValidationError = exports.ProjectNotFoundError = exports.GitHubAuthError = exports.CSVibeError = void 0;
|
|
10
|
+
exports.formatError = formatError;
|
|
11
|
+
exports.logError = logError;
|
|
10
12
|
exports.handleError = handleError;
|
|
11
13
|
exports.withErrorHandling = withErrorHandling;
|
|
12
14
|
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
+
const path_1 = __importDefault(require("path"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
13
18
|
/**
|
|
14
|
-
*
|
|
19
|
+
* Abstract base error class for CSVibe CLI errors
|
|
20
|
+
* All custom errors should extend this class
|
|
15
21
|
*/
|
|
16
|
-
class
|
|
17
|
-
constructor(message,
|
|
22
|
+
class CSVibeError extends Error {
|
|
23
|
+
constructor(message, exitCode = 1) {
|
|
18
24
|
super(message);
|
|
19
|
-
this.code = code;
|
|
20
25
|
this.exitCode = exitCode;
|
|
21
|
-
this.name =
|
|
26
|
+
this.name = this.constructor.name;
|
|
27
|
+
Error.captureStackTrace(this, this.constructor);
|
|
22
28
|
}
|
|
23
29
|
}
|
|
24
|
-
exports.
|
|
30
|
+
exports.CSVibeError = CSVibeError;
|
|
25
31
|
/**
|
|
26
|
-
*
|
|
32
|
+
* GitHub authentication error
|
|
27
33
|
*/
|
|
28
|
-
class
|
|
29
|
-
constructor(message
|
|
30
|
-
super(message,
|
|
31
|
-
this.
|
|
34
|
+
class GitHubAuthError extends CSVibeError {
|
|
35
|
+
constructor(message = 'GitHub authentication failed') {
|
|
36
|
+
super(message, 1);
|
|
37
|
+
this.code = 'E_GH_AUTH';
|
|
38
|
+
this.recoveryHint = 'Run "gh auth login" to authenticate with GitHub, or set GITHUB_TOKEN environment variable';
|
|
32
39
|
}
|
|
33
40
|
}
|
|
34
|
-
exports.
|
|
41
|
+
exports.GitHubAuthError = GitHubAuthError;
|
|
42
|
+
/**
|
|
43
|
+
* Project not found error
|
|
44
|
+
*/
|
|
45
|
+
class ProjectNotFoundError extends CSVibeError {
|
|
46
|
+
constructor(message = 'Project configuration not found') {
|
|
47
|
+
super(message, 1);
|
|
48
|
+
this.code = 'E_PROJECT_NOT_FOUND';
|
|
49
|
+
this.recoveryHint = 'Ensure you are in a valid project directory with package.json, pyproject.toml, or Cargo.toml';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ProjectNotFoundError = ProjectNotFoundError;
|
|
35
53
|
/**
|
|
36
|
-
*
|
|
54
|
+
* Config validation error
|
|
37
55
|
*/
|
|
38
|
-
class
|
|
56
|
+
class ConfigValidationError extends CSVibeError {
|
|
57
|
+
constructor(message = 'Configuration validation failed') {
|
|
58
|
+
super(message, 1);
|
|
59
|
+
this.code = 'E_CONFIG_INVALID';
|
|
60
|
+
this.recoveryHint = 'Check .csvibe/config.yml for syntax errors or missing required fields';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.ConfigValidationError = ConfigValidationError;
|
|
64
|
+
/**
|
|
65
|
+
* Network error
|
|
66
|
+
*/
|
|
67
|
+
class NetworkError extends CSVibeError {
|
|
68
|
+
constructor(message = 'Network request failed') {
|
|
69
|
+
super(message, 1);
|
|
70
|
+
this.code = 'E_NETWORK';
|
|
71
|
+
this.recoveryHint = 'Check your internet connection and GitHub API status (https://www.githubstatus.com)';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.NetworkError = NetworkError;
|
|
75
|
+
/**
|
|
76
|
+
* Dependency error
|
|
77
|
+
*/
|
|
78
|
+
class DependencyError extends CSVibeError {
|
|
79
|
+
constructor(message = 'Required dependency not found') {
|
|
80
|
+
super(message, 1);
|
|
81
|
+
this.code = 'E_DEPENDENCY';
|
|
82
|
+
this.recoveryHint = 'Install the missing dependency or ensure it is in your PATH';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.DependencyError = DependencyError;
|
|
86
|
+
/**
|
|
87
|
+
* Legacy error classes for backward compatibility
|
|
88
|
+
*/
|
|
89
|
+
class CsvibeError extends CSVibeError {
|
|
90
|
+
constructor(message, code, exitCode = 1) {
|
|
91
|
+
super(message, exitCode);
|
|
92
|
+
this.code = 'E_UNKNOWN';
|
|
93
|
+
this.recoveryHint = 'Please report this issue at https://github.com/thanhvn14/csvibe-engine/issues';
|
|
94
|
+
if (code)
|
|
95
|
+
this.code = code;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.CsvibeError = CsvibeError;
|
|
99
|
+
class GhCliError extends GitHubAuthError {
|
|
100
|
+
constructor(message, _code) {
|
|
101
|
+
super(message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.GhCliError = GhCliError;
|
|
105
|
+
class ValidationError extends CSVibeError {
|
|
39
106
|
constructor(message, code) {
|
|
40
|
-
super(message,
|
|
41
|
-
this.
|
|
107
|
+
super(message, 1);
|
|
108
|
+
this.code = 'E_VALIDATION';
|
|
109
|
+
this.recoveryHint = 'Check the validation error message for details';
|
|
110
|
+
if (code)
|
|
111
|
+
this.code = code;
|
|
42
112
|
}
|
|
43
113
|
}
|
|
44
114
|
exports.ValidationError = ValidationError;
|
|
115
|
+
/**
|
|
116
|
+
* Format error with color-coded output and recovery hints
|
|
117
|
+
*/
|
|
118
|
+
function formatError(error) {
|
|
119
|
+
const lines = [
|
|
120
|
+
'',
|
|
121
|
+
chalk_1.default.red.bold('✗ Error: ') + chalk_1.default.white(error.message),
|
|
122
|
+
chalk_1.default.gray(' Code: ') + chalk_1.default.yellow(error.code),
|
|
123
|
+
'',
|
|
124
|
+
chalk_1.default.cyan('💡 Recovery Hint:'),
|
|
125
|
+
chalk_1.default.white(' ' + error.recoveryHint),
|
|
126
|
+
''
|
|
127
|
+
];
|
|
128
|
+
if (error.stack && process.env.VERBOSE) {
|
|
129
|
+
lines.push(chalk_1.default.gray('Stack trace:'));
|
|
130
|
+
lines.push(chalk_1.default.gray(error.stack));
|
|
131
|
+
lines.push('');
|
|
132
|
+
}
|
|
133
|
+
return lines.join('\n');
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Log error to file for debugging
|
|
137
|
+
*/
|
|
138
|
+
async function logError(error) {
|
|
139
|
+
try {
|
|
140
|
+
const logDir = path_1.default.join(os_1.default.homedir(), '.csvibe', 'logs');
|
|
141
|
+
await fs_extra_1.default.ensureDir(logDir);
|
|
142
|
+
const logFile = path_1.default.join(logDir, 'errors.log');
|
|
143
|
+
const timestamp = new Date().toISOString();
|
|
144
|
+
const logEntry = [
|
|
145
|
+
`[${timestamp}] ${error.name}: ${error.message}`,
|
|
146
|
+
error.stack || '',
|
|
147
|
+
'---',
|
|
148
|
+
''
|
|
149
|
+
].join('\n');
|
|
150
|
+
await fs_extra_1.default.appendFile(logFile, logEntry);
|
|
151
|
+
}
|
|
152
|
+
catch (logErr) {
|
|
153
|
+
// Silent fail - don't crash on logging errors
|
|
154
|
+
}
|
|
155
|
+
}
|
|
45
156
|
/**
|
|
46
157
|
* Global error handler for CLI
|
|
47
158
|
*/
|
|
48
159
|
function handleError(error) {
|
|
49
|
-
if (error instanceof
|
|
50
|
-
//
|
|
51
|
-
console.error(
|
|
160
|
+
if (error instanceof CSVibeError) {
|
|
161
|
+
// Format and display custom errors with recovery hints
|
|
162
|
+
console.error(formatError(error));
|
|
163
|
+
logError(error).catch(() => { }); // Async log, don't wait
|
|
52
164
|
process.exit(error.exitCode);
|
|
53
165
|
}
|
|
54
166
|
else if (error instanceof Error) {
|
|
55
|
-
// Generic errors
|
|
56
|
-
|
|
167
|
+
// Generic errors - wrap in CSVibeError
|
|
168
|
+
const wrappedError = new CsvibeError(error.message);
|
|
169
|
+
console.error(formatError(wrappedError));
|
|
170
|
+
logError(error).catch(() => { });
|
|
57
171
|
process.exit(1);
|
|
58
172
|
}
|
|
59
173
|
else {
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/gh-cli.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GitHub CLI (gh) validation and operations
|
|
3
|
+
* Now uses multi-tier authentication and @octokit/rest
|
|
3
4
|
*/
|
|
4
5
|
/**
|
|
5
6
|
* Check if gh CLI is installed
|
|
@@ -21,9 +22,10 @@ export declare function isGhAuthenticated(): Promise<boolean>;
|
|
|
21
22
|
*/
|
|
22
23
|
export declare function checkRepoAccess(repo: string): Promise<boolean>;
|
|
23
24
|
/**
|
|
24
|
-
* Validate
|
|
25
|
+
* Validate GitHub authentication and repository access
|
|
26
|
+
* Uses multi-tier authentication (gh CLI → env → config → keychain → prompt)
|
|
25
27
|
* @param repo - Repository to check access (default: csvibe-engine)
|
|
26
|
-
* @throws {
|
|
28
|
+
* @throws {GitHubAuthError} If validation fails
|
|
27
29
|
*/
|
|
28
30
|
export declare function validateGhCli(repo?: string): Promise<void>;
|
|
29
31
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh-cli.d.ts","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gh-cli.d.ts","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAOtD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS3D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO1D;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,MAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrF;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAO5D"}
|
package/dist/utils/gh-cli.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* GitHub CLI (gh) validation and operations
|
|
4
|
+
* Now uses multi-tier authentication and @octokit/rest
|
|
4
5
|
*/
|
|
5
6
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -17,6 +18,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
17
18
|
const constants_1 = require("../config/constants");
|
|
18
19
|
const errors_1 = require("./errors");
|
|
19
20
|
const logger_1 = require("./logger");
|
|
21
|
+
const github_1 = require("../domains/github");
|
|
20
22
|
/**
|
|
21
23
|
* Check if gh CLI is installed
|
|
22
24
|
*/
|
|
@@ -76,56 +78,49 @@ async function checkRepoAccess(repo) {
|
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
80
|
/**
|
|
79
|
-
* Validate
|
|
81
|
+
* Validate GitHub authentication and repository access
|
|
82
|
+
* Uses multi-tier authentication (gh CLI → env → config → keychain → prompt)
|
|
80
83
|
* @param repo - Repository to check access (default: csvibe-engine)
|
|
81
|
-
* @throws {
|
|
84
|
+
* @throws {GitHubAuthError} If validation fails
|
|
82
85
|
*/
|
|
83
86
|
async function validateGhCli(repo = constants_1.CONSTANTS.REPO_FULL) {
|
|
84
|
-
|
|
85
|
-
if (!(await isGhInstalled())) {
|
|
86
|
-
throw new errors_1.GhCliError(chalk_1.default.red('✗ Error: gh CLI not found\n\n') +
|
|
87
|
-
' CSVibe requires GitHub CLI (gh) to download vibecoding assets.\n\n' +
|
|
88
|
-
' Install gh CLI:\n' +
|
|
89
|
-
chalk_1.default.cyan(' • macOS: ') + 'brew install gh\n' +
|
|
90
|
-
chalk_1.default.cyan(' • Windows: ') + 'winget install GitHub.cli\n' +
|
|
91
|
-
chalk_1.default.cyan(' • Linux: ') + constants_1.CONSTANTS.GH_CLI_INSTALL + '\n\n' +
|
|
92
|
-
' After installing, authenticate:\n' +
|
|
93
|
-
chalk_1.default.cyan(' gh auth login'), 'GH_NOT_INSTALLED');
|
|
94
|
-
}
|
|
95
|
-
// Check authenticated
|
|
96
|
-
if (!(await isGhAuthenticated())) {
|
|
97
|
-
throw new errors_1.GhCliError(chalk_1.default.red('✗ Error: gh CLI not authenticated\n\n') +
|
|
98
|
-
' Please authenticate GitHub CLI:\n' +
|
|
99
|
-
chalk_1.default.cyan(' gh auth login\n\n') +
|
|
100
|
-
' Then try again:\n' +
|
|
101
|
-
chalk_1.default.cyan(' csvibe init'), 'GH_NOT_AUTHENTICATED');
|
|
102
|
-
}
|
|
103
|
-
// Check repo access
|
|
104
|
-
const spinner = logger_1.logger.spinner(`Checking access to ${repo}...`);
|
|
87
|
+
const spinner = logger_1.logger.spinner('Authenticating with GitHub...');
|
|
105
88
|
try {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
89
|
+
// Try multi-tier authentication
|
|
90
|
+
const { token, method } = await (0, github_1.getGitHubToken)();
|
|
91
|
+
spinner.succeed(`Authenticated via ${chalk_1.default.cyan((0, github_1.getAuthMethodDescription)(method))}`);
|
|
92
|
+
// Check repo access using GitHub client
|
|
93
|
+
const repoSpinner = logger_1.logger.spinner(`Checking access to ${repo}...`);
|
|
94
|
+
try {
|
|
95
|
+
const client = await github_1.GitHubClient.create();
|
|
96
|
+
const [owner, repoName] = repo.split('/');
|
|
97
|
+
const hasAccess = await client.hasRepoAccess(owner, repoName);
|
|
98
|
+
if (!hasAccess) {
|
|
99
|
+
repoSpinner.fail();
|
|
100
|
+
throw new errors_1.GitHubAuthError(chalk_1.default.red(`✗ Error: Cannot access private repository '${repo}'\n\n`) +
|
|
101
|
+
' Possible causes:\n' +
|
|
102
|
+
' 1. Repository doesn\'t exist\n' +
|
|
103
|
+
' 2. Your GitHub account lacks access\n' +
|
|
104
|
+
' 3. Token lacks required scopes (needs: repo, read:org)\n\n' +
|
|
105
|
+
' Contact repository administrator for access.');
|
|
106
|
+
}
|
|
107
|
+
repoSpinner.succeed(`Access to ${repo} verified`);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
repoSpinner.fail();
|
|
111
|
+
throw error;
|
|
115
112
|
}
|
|
116
|
-
spinner.succeed(`Access to ${repo} verified`);
|
|
117
113
|
}
|
|
118
114
|
catch (error) {
|
|
119
115
|
spinner.fail();
|
|
120
|
-
// Re-throw if already a
|
|
121
|
-
if (error instanceof errors_1.
|
|
116
|
+
// Re-throw if already a GitHubAuthError
|
|
117
|
+
if (error instanceof errors_1.GitHubAuthError) {
|
|
122
118
|
throw error;
|
|
123
119
|
}
|
|
124
120
|
// Generic network/API errors
|
|
125
|
-
throw new errors_1.
|
|
126
|
-
` Repository: ${repo}\n` +
|
|
121
|
+
throw new errors_1.GitHubAuthError(chalk_1.default.red(`✗ Error: Failed to authenticate with GitHub\n\n`) +
|
|
127
122
|
` Details: ${error instanceof Error ? error.message : String(error)}\n\n` +
|
|
128
|
-
' Check your internet connection and
|
|
123
|
+
' Check your internet connection and authentication method.');
|
|
129
124
|
}
|
|
130
125
|
}
|
|
131
126
|
/**
|
package/dist/utils/gh-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh-cli.js","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"gh-cli.js","sourceRoot":"","sources":["../../src/utils/gh-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress indicators and spinners using cli-progress
|
|
3
|
+
*/
|
|
4
|
+
import * as cliProgress from 'cli-progress';
|
|
5
|
+
export interface ProgressOptions {
|
|
6
|
+
label: string;
|
|
7
|
+
total: number;
|
|
8
|
+
unit?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a progress bar with ETA
|
|
12
|
+
*/
|
|
13
|
+
export declare function createProgressBar(options: ProgressOptions): cliProgress.SingleBar;
|
|
14
|
+
/**
|
|
15
|
+
* Create a download progress bar with file size
|
|
16
|
+
*/
|
|
17
|
+
export declare function createDownloadProgress(label: string, totalBytes: number): cliProgress.SingleBar;
|
|
18
|
+
/**
|
|
19
|
+
* Update download progress with speed calculation
|
|
20
|
+
*/
|
|
21
|
+
export declare function updateDownloadProgress(bar: cliProgress.SingleBar, downloaded: number, total: number, startTime: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* Multi-bar progress for parallel operations
|
|
24
|
+
*/
|
|
25
|
+
export declare class MultiProgress {
|
|
26
|
+
private multibar;
|
|
27
|
+
constructor();
|
|
28
|
+
/**
|
|
29
|
+
* Add a progress bar to the multi-bar
|
|
30
|
+
*/
|
|
31
|
+
addBar(label: string, total: number): cliProgress.SingleBar;
|
|
32
|
+
/**
|
|
33
|
+
* Stop all progress bars
|
|
34
|
+
*/
|
|
35
|
+
stop(): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAAC,SAAS,CAiBjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS,CAoB/F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,WAAW,CAAC,SAAS,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,IAAI,CAUN;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAuB;;IAavC;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,SAAS;IAI3D;;OAEG;IACH,IAAI,IAAI,IAAI;CAGb"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Progress indicators and spinners using cli-progress
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.MultiProgress = void 0;
|
|
43
|
+
exports.createProgressBar = createProgressBar;
|
|
44
|
+
exports.createDownloadProgress = createDownloadProgress;
|
|
45
|
+
exports.updateDownloadProgress = updateDownloadProgress;
|
|
46
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
47
|
+
const cliProgress = __importStar(require("cli-progress"));
|
|
48
|
+
/**
|
|
49
|
+
* Create a progress bar with ETA
|
|
50
|
+
*/
|
|
51
|
+
function createProgressBar(options) {
|
|
52
|
+
const { label, total, unit = 'items' } = options;
|
|
53
|
+
const bar = new cliProgress.SingleBar({
|
|
54
|
+
format: `${chalk_1.default.cyan(label)} [{bar}] {percentage}% | ETA: {eta}s | {value}/{total} ${unit}`,
|
|
55
|
+
barCompleteChar: '\u2588',
|
|
56
|
+
barIncompleteChar: '\u2591',
|
|
57
|
+
hideCursor: true,
|
|
58
|
+
clearOnComplete: false,
|
|
59
|
+
stopOnComplete: true,
|
|
60
|
+
}, cliProgress.Presets.shades_classic);
|
|
61
|
+
bar.start(total, 0);
|
|
62
|
+
return bar;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a download progress bar with file size
|
|
66
|
+
*/
|
|
67
|
+
function createDownloadProgress(label, totalBytes) {
|
|
68
|
+
const bar = new cliProgress.SingleBar({
|
|
69
|
+
format: `${chalk_1.default.cyan(label)} [{bar}] {percentage}% | ETA: {eta}s | {downloadedMB}/{totalMB} MB | {speedMBps} MB/s`,
|
|
70
|
+
barCompleteChar: '\u2588',
|
|
71
|
+
barIncompleteChar: '\u2591',
|
|
72
|
+
hideCursor: true,
|
|
73
|
+
clearOnComplete: false,
|
|
74
|
+
stopOnComplete: true,
|
|
75
|
+
}, cliProgress.Presets.shades_classic);
|
|
76
|
+
bar.start(totalBytes, 0, {
|
|
77
|
+
downloadedMB: '0.00',
|
|
78
|
+
totalMB: (totalBytes / (1024 * 1024)).toFixed(2),
|
|
79
|
+
speedMBps: '0.00',
|
|
80
|
+
});
|
|
81
|
+
return bar;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update download progress with speed calculation
|
|
85
|
+
*/
|
|
86
|
+
function updateDownloadProgress(bar, downloaded, total, startTime) {
|
|
87
|
+
const elapsedSeconds = (Date.now() - startTime) / 1000;
|
|
88
|
+
const speedBytesPerSecond = downloaded / elapsedSeconds;
|
|
89
|
+
const speedMBps = (speedBytesPerSecond / (1024 * 1024)).toFixed(2);
|
|
90
|
+
bar.update(downloaded, {
|
|
91
|
+
downloadedMB: (downloaded / (1024 * 1024)).toFixed(2),
|
|
92
|
+
totalMB: (total / (1024 * 1024)).toFixed(2),
|
|
93
|
+
speedMBps,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Multi-bar progress for parallel operations
|
|
98
|
+
*/
|
|
99
|
+
class MultiProgress {
|
|
100
|
+
constructor() {
|
|
101
|
+
this.multibar = new cliProgress.MultiBar({
|
|
102
|
+
clearOnComplete: false,
|
|
103
|
+
hideCursor: true,
|
|
104
|
+
format: '{label} [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}',
|
|
105
|
+
}, cliProgress.Presets.shades_grey);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Add a progress bar to the multi-bar
|
|
109
|
+
*/
|
|
110
|
+
addBar(label, total) {
|
|
111
|
+
return this.multibar.create(total, 0, { label: chalk_1.default.cyan(label) });
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Stop all progress bars
|
|
115
|
+
*/
|
|
116
|
+
stop() {
|
|
117
|
+
this.multibar.stop();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.MultiProgress = MultiProgress;
|
|
121
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/utils/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/prompts.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Interactive prompt utilities
|
|
2
|
+
* Interactive prompt utilities using @clack/prompts
|
|
3
3
|
*/
|
|
4
4
|
export interface JiraCredentials {
|
|
5
5
|
url: string;
|
|
@@ -15,6 +15,10 @@ export declare function promptJiraCredentials(): Promise<JiraCredentials>;
|
|
|
15
15
|
* Confirm overwrite of existing setup
|
|
16
16
|
*/
|
|
17
17
|
export declare function confirmOverwrite(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Confirm Jira setup (optional configuration)
|
|
20
|
+
*/
|
|
21
|
+
export declare function confirmJiraSetup(): Promise<boolean>;
|
|
18
22
|
/**
|
|
19
23
|
* Show API token creation instructions
|
|
20
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CA0EtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAYzD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAYzD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C"}
|