@thanhvn14/csvibe 0.1.1 ā 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/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
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Directory structure analysis
|
|
4
|
+
* Analyzes project directory structure to identify source, test, and config directories
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.analyzeDirectories = analyzeDirectories;
|
|
11
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const project_detector_1 = require("./project-detector");
|
|
14
|
+
/**
|
|
15
|
+
* Analyze project directory structure
|
|
16
|
+
* Uses predefined candidate lists to identify common directory patterns
|
|
17
|
+
*
|
|
18
|
+
* @param projectRoot - Root directory of the project
|
|
19
|
+
* @param projectType - Detected project type
|
|
20
|
+
* @returns Directory structure with source, test, and config directories
|
|
21
|
+
*/
|
|
22
|
+
async function analyzeDirectories(projectRoot, projectType) {
|
|
23
|
+
const result = {
|
|
24
|
+
source: [],
|
|
25
|
+
tests: [],
|
|
26
|
+
config: ['.'] // Root always has config files
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
const entries = await fs_extra_1.default.readdir(projectRoot, { withFileTypes: true });
|
|
30
|
+
const dirs = entries.filter(e => e.isDirectory()).map(e => e.name);
|
|
31
|
+
// Source directories - common patterns across ecosystems
|
|
32
|
+
const sourceCandidates = ['src', 'lib', 'app', 'components', 'packages', 'apps'];
|
|
33
|
+
for (const candidate of sourceCandidates) {
|
|
34
|
+
if (dirs.includes(candidate)) {
|
|
35
|
+
result.source.push(candidate);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Test directories - common test directory names
|
|
39
|
+
const testCandidates = ['test', 'tests', '__tests__', 'spec', '__test__'];
|
|
40
|
+
for (const candidate of testCandidates) {
|
|
41
|
+
if (dirs.includes(candidate)) {
|
|
42
|
+
result.tests.push(candidate);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Additional config directories for monorepos
|
|
46
|
+
if (projectType === project_detector_1.ProjectType.NodeMonorepo) {
|
|
47
|
+
// Scan packages/ for individual package configs
|
|
48
|
+
if (dirs.includes('packages')) {
|
|
49
|
+
const packagesDir = path_1.default.join(projectRoot, 'packages');
|
|
50
|
+
try {
|
|
51
|
+
const packageDirs = await fs_extra_1.default.readdir(packagesDir, { withFileTypes: true });
|
|
52
|
+
packageDirs
|
|
53
|
+
.filter(e => e.isDirectory())
|
|
54
|
+
.forEach(e => result.config.push(`packages/${e.name}`));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Ignore if packages/ is not accessible
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Scan apps/ for individual app configs
|
|
61
|
+
if (dirs.includes('apps')) {
|
|
62
|
+
const appsDir = path_1.default.join(projectRoot, 'apps');
|
|
63
|
+
try {
|
|
64
|
+
const appDirs = await fs_extra_1.default.readdir(appsDir, { withFileTypes: true });
|
|
65
|
+
appDirs
|
|
66
|
+
.filter(e => e.isDirectory())
|
|
67
|
+
.forEach(e => result.config.push(`apps/${e.name}`));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Ignore if apps/ is not accessible
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Return empty structure on error (graceful degradation)
|
|
77
|
+
console.warn(`Warning: Could not analyze directories: ${error}`);
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=directory-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-analyzer.js","sourceRoot":"","sources":["../../src/utils/directory-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GitHub asset download utilities
|
|
2
|
+
* GitHub asset download utilities using @octokit/rest
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Download .github directory from private repo
|
|
5
|
+
* Download .github directory from private repo using GitHub client
|
|
6
6
|
*/
|
|
7
7
|
export declare function downloadGithubAssets(repo?: string, branch?: string, targetDir?: string): Promise<void>;
|
|
8
8
|
/**
|
|
9
|
-
* Download config template from repo
|
|
9
|
+
* Download config template from repo using GitHub client
|
|
10
10
|
*/
|
|
11
11
|
export declare function downloadConfigTemplate(repo?: string): Promise<string>;
|
|
12
12
|
//# sourceMappingURL=downloader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,MAA4B,EAClC,MAAM,GAAE,MAAe,EACvB,SAAS,GAAE,MAAsB,GAChC,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,MAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
|
package/dist/utils/downloader.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* GitHub asset download utilities
|
|
3
|
+
* GitHub asset download utilities using @octokit/rest
|
|
4
4
|
*/
|
|
5
5
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
6
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -8,98 +8,68 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.downloadGithubAssets = downloadGithubAssets;
|
|
10
10
|
exports.downloadConfigTemplate = downloadConfigTemplate;
|
|
11
|
-
const execa_1 = require("execa");
|
|
12
11
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
13
12
|
const path_1 = __importDefault(require("path"));
|
|
14
13
|
const constants_1 = require("../config/constants");
|
|
15
14
|
const logger_1 = require("./logger");
|
|
15
|
+
const github_1 = require("../domains/github");
|
|
16
|
+
const progress_1 = require("./progress");
|
|
16
17
|
/**
|
|
17
|
-
* Download .github directory from private repo
|
|
18
|
+
* Download .github directory from private repo using GitHub client
|
|
18
19
|
*/
|
|
19
20
|
async function downloadGithubAssets(repo = constants_1.CONSTANTS.REPO_FULL, branch = 'main', targetDir = process.cwd()) {
|
|
20
21
|
const spinner = logger_1.logger.spinner(`Downloading assets from ${repo}...`);
|
|
21
|
-
const tempDir = path_1.default.join(targetDir, '.csvibe-tmp');
|
|
22
22
|
try {
|
|
23
|
-
|
|
24
|
-
await
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'repo',
|
|
29
|
-
'clone',
|
|
30
|
-
repo,
|
|
31
|
-
tempDir,
|
|
32
|
-
'--',
|
|
33
|
-
'--depth=1',
|
|
34
|
-
'--filter=blob:none',
|
|
35
|
-
'--sparse'
|
|
36
|
-
]);
|
|
37
|
-
// Sparse checkout .github/ directory
|
|
38
|
-
await (0, execa_1.execa)('git', [
|
|
39
|
-
'-C',
|
|
40
|
-
tempDir,
|
|
41
|
-
'sparse-checkout',
|
|
42
|
-
'set',
|
|
43
|
-
'.github'
|
|
44
|
-
]);
|
|
45
|
-
// Copy .github/ to target directory
|
|
46
|
-
const sourceGithub = path_1.default.join(tempDir, '.github');
|
|
47
|
-
const targetGithub = path_1.default.join(targetDir, '.github');
|
|
48
|
-
if (await fs_extra_1.default.pathExists(sourceGithub)) {
|
|
49
|
-
// Copy agents
|
|
50
|
-
await copyDirectory(path_1.default.join(sourceGithub, 'agents'), path_1.default.join(targetGithub, 'agents'));
|
|
51
|
-
// Copy prompts (if exists)
|
|
52
|
-
if (await fs_extra_1.default.pathExists(path_1.default.join(sourceGithub, 'prompts'))) {
|
|
53
|
-
await copyDirectory(path_1.default.join(sourceGithub, 'prompts'), path_1.default.join(targetGithub, 'prompts'));
|
|
54
|
-
}
|
|
55
|
-
// Copy instructions (if exists)
|
|
56
|
-
if (await fs_extra_1.default.pathExists(path_1.default.join(sourceGithub, 'instructions'))) {
|
|
57
|
-
await copyDirectory(path_1.default.join(sourceGithub, 'instructions'), path_1.default.join(targetGithub, 'instructions'));
|
|
58
|
-
}
|
|
59
|
-
spinner.succeed('Assets downloaded successfully');
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
23
|
+
const [owner, repoName] = repo.split('/');
|
|
24
|
+
const client = await github_1.GitHubClient.create();
|
|
25
|
+
// Download .github directory contents
|
|
26
|
+
const files = await client.downloadDirectory(owner, repoName, '.github', branch);
|
|
27
|
+
if (files.length === 0) {
|
|
62
28
|
spinner.fail('No .github directory found in repository');
|
|
63
29
|
throw new Error('Repository does not contain .github directory');
|
|
64
30
|
}
|
|
31
|
+
// Create progress bar for file writing
|
|
32
|
+
const progressBar = (0, progress_1.createProgressBar)({
|
|
33
|
+
label: 'Writing files',
|
|
34
|
+
total: files.length,
|
|
35
|
+
unit: 'files',
|
|
36
|
+
});
|
|
37
|
+
let written = 0;
|
|
38
|
+
// Write files to target directory
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
const targetPath = path_1.default.join(targetDir, file.path);
|
|
41
|
+
// Ensure directory exists
|
|
42
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(targetPath));
|
|
43
|
+
// Write file
|
|
44
|
+
await fs_extra_1.default.writeFile(targetPath, file.content);
|
|
45
|
+
// Update progress
|
|
46
|
+
written++;
|
|
47
|
+
progressBar.update(written);
|
|
48
|
+
}
|
|
49
|
+
progressBar.stop();
|
|
50
|
+
spinner.succeed(`Assets downloaded successfully (${files.length} files)`);
|
|
65
51
|
}
|
|
66
52
|
catch (error) {
|
|
67
53
|
spinner.fail('Failed to download assets');
|
|
68
54
|
throw error;
|
|
69
55
|
}
|
|
70
|
-
finally {
|
|
71
|
-
// Cleanup temp directory
|
|
72
|
-
await fs_extra_1.default.remove(tempDir);
|
|
73
|
-
}
|
|
74
56
|
}
|
|
75
57
|
/**
|
|
76
|
-
* Download config template from repo
|
|
58
|
+
* Download config template from repo using GitHub client
|
|
77
59
|
*/
|
|
78
60
|
async function downloadConfigTemplate(repo = constants_1.CONSTANTS.REPO_FULL) {
|
|
79
61
|
try {
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
'.content'
|
|
86
|
-
]);
|
|
87
|
-
// Decode base64 content
|
|
88
|
-
const content = Buffer.from(stdout, 'base64').toString('utf-8');
|
|
89
|
-
return content;
|
|
62
|
+
const [owner, repoName] = repo.split('/');
|
|
63
|
+
const client = await github_1.GitHubClient.create();
|
|
64
|
+
// Download config template
|
|
65
|
+
const content = await client.downloadFile(owner, repoName, 'templates/config.yml.template');
|
|
66
|
+
return content.toString('utf-8');
|
|
90
67
|
}
|
|
91
68
|
catch (error) {
|
|
92
69
|
// Return default template if not found
|
|
93
70
|
return getDefaultConfigTemplate();
|
|
94
71
|
}
|
|
95
72
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Copy directory recursively
|
|
98
|
-
*/
|
|
99
|
-
async function copyDirectory(src, dest) {
|
|
100
|
-
await fs_extra_1.default.ensureDir(dest);
|
|
101
|
-
await fs_extra_1.default.copy(src, dest, { overwrite: true });
|
|
102
|
-
}
|
|
103
73
|
/**
|
|
104
74
|
* Default config template (fallback)
|
|
105
75
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;
|
|
1
|
+
{"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/utils/downloader.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAYH,oDAiDC;AAKD,wDAmBC;AAnFD,wDAA0B;AAC1B,gDAAwB;AACxB,mDAAgD;AAChD,qCAAkC;AAClC,8CAAiD;AACjD,yCAA+C;AAE/C;;GAEG;AACI,KAAK,UAAU,oBAAoB,CACxC,OAAe,qBAAS,CAAC,SAAS,EAClC,SAAiB,MAAM,EACvB,YAAoB,OAAO,CAAC,GAAG,EAAE;IAEjC,MAAM,OAAO,GAAG,eAAM,CAAC,OAAO,CAAC,2BAA2B,IAAI,KAAK,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,MAAM,EAAE,CAAC;QAE3C,sCAAsC;QACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAA,4BAAiB,EAAC;YACpC,KAAK,EAAE,eAAe;YACtB,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,kCAAkC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnD,0BAA0B;YAC1B,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAE7C,aAAa;YACb,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAE7C,kBAAkB;YAClB,OAAO,EAAE,CAAC;YACV,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,WAAW,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,mCAAmC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAe,qBAAS,CAAC,SAAS;IAElC,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,qBAAY,CAAC,MAAM,EAAE,CAAC;QAE3C,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CACvC,KAAK,EACL,QAAQ,EACR,+BAA+B,CAChC,CAAC;QAEF,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uCAAuC;QACvC,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCR,CAAC;AACF,CAAC"}
|
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"}
|