@thanhvn14/csvibe 0.1.1 ā 0.1.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/.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 +2 -1
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +2 -1
- 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/dist/utils/scaffolder.d.ts.map +1 -1
- package/dist/utils/scaffolder.js +1 -3
- package/dist/utils/scaffolder.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/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"}
|
package/dist/utils/prompts.js
CHANGED
|
@@ -1,100 +1,160 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Interactive prompt utilities
|
|
3
|
+
* Interactive prompt utilities using @clack/prompts
|
|
4
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
|
+
})();
|
|
5
38
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
40
|
};
|
|
8
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
42
|
exports.promptJiraCredentials = promptJiraCredentials;
|
|
10
43
|
exports.confirmOverwrite = confirmOverwrite;
|
|
44
|
+
exports.confirmJiraSetup = confirmJiraSetup;
|
|
11
45
|
exports.showApiTokenInstructions = showApiTokenInstructions;
|
|
12
|
-
const
|
|
46
|
+
const p = __importStar(require("@clack/prompts"));
|
|
13
47
|
const chalk_1 = __importDefault(require("chalk"));
|
|
14
48
|
/**
|
|
15
49
|
* Prompt user for Jira credentials
|
|
16
50
|
*/
|
|
17
51
|
async function promptJiraCredentials() {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
52
|
+
p.intro(chalk_1.default.bold.cyan('Jira Configuration'));
|
|
53
|
+
const url = await p.text({
|
|
54
|
+
message: 'Jira URL',
|
|
55
|
+
placeholder: 'https://company.atlassian.net',
|
|
56
|
+
validate: (value) => {
|
|
57
|
+
if (!value)
|
|
58
|
+
return 'URL is required';
|
|
59
|
+
if (!value.startsWith('http')) {
|
|
60
|
+
return 'URL must start with http:// or https://';
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (p.isCancel(url)) {
|
|
65
|
+
p.cancel('Operation cancelled');
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
const email = await p.text({
|
|
69
|
+
message: 'Jira Email',
|
|
70
|
+
placeholder: 'your.email@company.com',
|
|
71
|
+
validate: (value) => {
|
|
72
|
+
if (!value)
|
|
73
|
+
return 'Email is required';
|
|
74
|
+
if (!value.includes('@')) {
|
|
75
|
+
return 'Please enter a valid email address';
|
|
31
76
|
}
|
|
32
77
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
78
|
+
});
|
|
79
|
+
if (p.isCancel(email)) {
|
|
80
|
+
p.cancel('Operation cancelled');
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
const apiToken = await p.password({
|
|
84
|
+
message: 'Jira API Token',
|
|
85
|
+
validate: (value) => {
|
|
86
|
+
if (!value)
|
|
87
|
+
return 'API token is required';
|
|
88
|
+
if (value.length < 10) {
|
|
89
|
+
return 'API token seems too short. Please enter a valid token.';
|
|
42
90
|
}
|
|
43
91
|
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
92
|
+
});
|
|
93
|
+
if (p.isCancel(apiToken)) {
|
|
94
|
+
p.cancel('Operation cancelled');
|
|
95
|
+
process.exit(0);
|
|
96
|
+
}
|
|
97
|
+
const projectKey = await p.text({
|
|
98
|
+
message: 'Jira Project Key',
|
|
99
|
+
placeholder: 'PROJ',
|
|
100
|
+
validate: (value) => {
|
|
101
|
+
if (!value)
|
|
102
|
+
return 'Project key is required';
|
|
103
|
+
if (!/^[A-Z]+$/i.test(value)) {
|
|
104
|
+
return 'Project key must be letters only (e.g., PROJ, QS)';
|
|
54
105
|
}
|
|
55
106
|
},
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return 'Project key must be uppercase letters only (e.g., PROJ, QS)';
|
|
63
|
-
}
|
|
64
|
-
return true;
|
|
65
|
-
},
|
|
66
|
-
transformer: (input) => input.toUpperCase()
|
|
67
|
-
}
|
|
68
|
-
]);
|
|
107
|
+
});
|
|
108
|
+
if (p.isCancel(projectKey)) {
|
|
109
|
+
p.cancel('Operation cancelled');
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
p.outro(chalk_1.default.green('ā Jira credentials configured'));
|
|
69
113
|
return {
|
|
70
|
-
url:
|
|
71
|
-
email:
|
|
72
|
-
apiToken:
|
|
73
|
-
projectKey:
|
|
114
|
+
url: url,
|
|
115
|
+
email: email,
|
|
116
|
+
apiToken: apiToken,
|
|
117
|
+
projectKey: projectKey.toUpperCase(),
|
|
74
118
|
};
|
|
75
119
|
}
|
|
76
120
|
/**
|
|
77
121
|
* Confirm overwrite of existing setup
|
|
78
122
|
*/
|
|
79
123
|
async function confirmOverwrite() {
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
124
|
+
const confirm = await p.confirm({
|
|
125
|
+
message: 'CSVibe is already initialized. Overwrite existing setup?',
|
|
126
|
+
initialValue: false,
|
|
127
|
+
});
|
|
128
|
+
if (p.isCancel(confirm)) {
|
|
129
|
+
p.cancel('Operation cancelled');
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
132
|
+
return confirm;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Confirm Jira setup (optional configuration)
|
|
136
|
+
*/
|
|
137
|
+
async function confirmJiraSetup() {
|
|
138
|
+
const confirm = await p.confirm({
|
|
139
|
+
message: 'Configure Jira integration now?',
|
|
140
|
+
initialValue: false,
|
|
141
|
+
});
|
|
142
|
+
if (p.isCancel(confirm)) {
|
|
143
|
+
p.cancel('Operation cancelled');
|
|
144
|
+
process.exit(0);
|
|
145
|
+
}
|
|
88
146
|
return confirm;
|
|
89
147
|
}
|
|
90
148
|
/**
|
|
91
149
|
* Show API token creation instructions
|
|
92
150
|
*/
|
|
93
151
|
function showApiTokenInstructions() {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
152
|
+
p.note(chalk_1.default.gray('1. Go to: ' +
|
|
153
|
+
chalk_1.default.cyan('https://id.atlassian.com/manage-profile/security/api-tokens') +
|
|
154
|
+
'\n' +
|
|
155
|
+
'2. Click "Create API token"\n' +
|
|
156
|
+
'3. Give it a name (e.g., "CSVibe CLI")\n' +
|
|
157
|
+
'4. Copy the token and paste it below'), chalk_1.default.bold('š How to create a Jira API Token'));
|
|
158
|
+
console.log(); // spacing
|
|
99
159
|
}
|
|
100
160
|
//# sourceMappingURL=prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":";AAAA;;GAEG
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../src/utils/scaffolder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"scaffolder.d.ts","sourceRoot":"","sources":["../../src/utils/scaffolder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjF;AAgCD;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYtF"}
|
package/dist/utils/scaffolder.js
CHANGED
|
@@ -14,10 +14,9 @@ const path_1 = __importDefault(require("path"));
|
|
|
14
14
|
* Create directory structure for CSVibe
|
|
15
15
|
*/
|
|
16
16
|
async function scaffold(projectRoot = process.cwd()) {
|
|
17
|
-
// Create .github directories
|
|
17
|
+
// Create .github directories (agents includes scripts/ and schemas/ subdirs)
|
|
18
18
|
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, '.github', 'agents'));
|
|
19
19
|
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, '.github', 'prompts'));
|
|
20
|
-
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, '.github', 'instructions'));
|
|
21
20
|
// Create .csvibe directories
|
|
22
21
|
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, '.csvibe', 'state'));
|
|
23
22
|
await fs_extra_1.default.ensureDir(path_1.default.join(projectRoot, '.csvibe', 'cache'));
|
|
@@ -55,7 +54,6 @@ async function cleanScaffold(projectRoot = process.cwd()) {
|
|
|
55
54
|
const dirsToRemove = [
|
|
56
55
|
path_1.default.join(projectRoot, '.github', 'agents'),
|
|
57
56
|
path_1.default.join(projectRoot, '.github', 'prompts'),
|
|
58
|
-
path_1.default.join(projectRoot, '.github', 'instructions'),
|
|
59
57
|
path_1.default.join(projectRoot, '.csvibe')
|
|
60
58
|
];
|
|
61
59
|
for (const dir of dirsToRemove) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/utils/scaffolder.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAQH,
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/utils/scaffolder.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAQH,4BAWC;AAmCD,sCAYC;AAhED,wDAA0B;AAC1B,gDAAwB;AAExB;;GAEG;AACI,KAAK,UAAU,QAAQ,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAChE,6EAA6E;IAC7E,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEjE,6BAA6B;IAC7B,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/D,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAE/D,2BAA2B;IAC3B,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAG;;;;;CAKxB,CAAC;IAEA,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,wCAAwC;IACxC,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEpD,wCAAwC;QACxC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,6BAA6B;QACvC,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,OAAO,IAAI,cAAc,CAAC;IAC1B,MAAM,kBAAE,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACrE,MAAM,YAAY,GAAG;QACnB,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC3C,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;QAC5C,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;KAClC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,kBAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thanhvn14/csvibe",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "CSVibe CLI - GitHub Copilot Vibecoding Workflow",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -27,17 +27,21 @@
|
|
|
27
27
|
"node": ">=16.0.0"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
+
"@clack/prompts": "^0.7.0",
|
|
31
|
+
"@octokit/rest": "^22.0.1",
|
|
30
32
|
"chalk": "^5.0.0",
|
|
33
|
+
"cli-progress": "^3.12.0",
|
|
31
34
|
"commander": "^11.0.0",
|
|
32
35
|
"execa": "^8.0.0",
|
|
33
36
|
"fs-extra": "^11.3.3",
|
|
34
|
-
"
|
|
37
|
+
"keytar": "^7.9.0",
|
|
35
38
|
"ora": "^6.0.0",
|
|
39
|
+
"p-retry": "^6.2.1",
|
|
36
40
|
"yaml": "^2.8.2"
|
|
37
41
|
},
|
|
38
42
|
"devDependencies": {
|
|
43
|
+
"@types/cli-progress": "^3.11.6",
|
|
39
44
|
"@types/fs-extra": "^11.0.4",
|
|
40
|
-
"@types/inquirer": "^9.0.9",
|
|
41
45
|
"@types/node": "^20.0.0",
|
|
42
46
|
"@vitest/coverage-v8": "^1.0.0",
|
|
43
47
|
"tsx": "^4.0.0",
|