@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,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scout command - Analyze project structure for vibecoding
|
|
4
|
+
* Gathers context about project type, tech stack, dependencies, and directory structure
|
|
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.scoutCommand = scoutCommand;
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const ora_1 = __importDefault(require("ora"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
15
|
+
const project_detector_1 = require("../utils/project-detector");
|
|
16
|
+
const dependency_analyzer_1 = require("../utils/dependency-analyzer");
|
|
17
|
+
const directory_analyzer_1 = require("../utils/directory-analyzer");
|
|
18
|
+
const constants_1 = require("../config/constants");
|
|
19
|
+
/**
|
|
20
|
+
* Scout command - Main entry point
|
|
21
|
+
* Analyzes project structure and outputs context to JSON
|
|
22
|
+
*
|
|
23
|
+
* @param options - Command options
|
|
24
|
+
*/
|
|
25
|
+
async function scoutCommand(options = {}) {
|
|
26
|
+
console.log(chalk_1.default.bold.cyan('\n🔍 Scouting Project...\n'));
|
|
27
|
+
const projectRoot = process.cwd();
|
|
28
|
+
const outputPath = options.output || path_1.default.join(projectRoot, constants_1.CONSTANTS.STATE_DIR, 'scout-context.json');
|
|
29
|
+
try {
|
|
30
|
+
// Step 1: Validate state directory
|
|
31
|
+
const spinner1 = (0, ora_1.default)('Validating project structure').start();
|
|
32
|
+
const stateDir = path_1.default.join(projectRoot, constants_1.CONSTANTS.STATE_DIR);
|
|
33
|
+
if (!await fs_extra_1.default.pathExists(stateDir)) {
|
|
34
|
+
spinner1.fail('Project not initialized');
|
|
35
|
+
throw new Error('Run `csvibe init` first to set up project');
|
|
36
|
+
}
|
|
37
|
+
spinner1.succeed('Project structure validated');
|
|
38
|
+
// Step 2: Detect project type
|
|
39
|
+
const spinner2 = (0, ora_1.default)('Detecting project type').start();
|
|
40
|
+
const projectType = await (0, project_detector_1.detectProjectType)(projectRoot);
|
|
41
|
+
spinner2.succeed(`Project type: ${chalk_1.default.cyan(projectType)}`);
|
|
42
|
+
// Step 3: Analyze directories
|
|
43
|
+
const spinner3 = (0, ora_1.default)('Analyzing directory structure').start();
|
|
44
|
+
const directories = await (0, directory_analyzer_1.analyzeDirectories)(projectRoot, projectType);
|
|
45
|
+
const sourceCount = directories.source.length;
|
|
46
|
+
spinner3.succeed(`Found ${chalk_1.default.cyan(sourceCount)} source ${sourceCount === 1 ? 'directory' : 'directories'}`);
|
|
47
|
+
// Step 4: Analyze dependencies
|
|
48
|
+
const spinner4 = (0, ora_1.default)('Extracting dependencies').start();
|
|
49
|
+
const dependencies = await (0, dependency_analyzer_1.analyzeDependencies)(projectRoot, projectType);
|
|
50
|
+
const depCount = Object.keys(dependencies).length;
|
|
51
|
+
spinner4.succeed(`Extracted ${chalk_1.default.cyan(depCount)} ${depCount === 1 ? 'dependency' : 'dependencies'}`);
|
|
52
|
+
// Step 5: Infer tech stack
|
|
53
|
+
const spinner5 = (0, ora_1.default)('Inferring tech stack').start();
|
|
54
|
+
const techStack = (0, dependency_analyzer_1.inferTechStack)(dependencies, projectType);
|
|
55
|
+
if (techStack.length > 0) {
|
|
56
|
+
spinner5.succeed(`Tech stack: ${chalk_1.default.cyan(techStack.join(', '))}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
spinner5.succeed('Tech stack: None detected');
|
|
60
|
+
}
|
|
61
|
+
// Step 6: Detect build tool
|
|
62
|
+
const spinner6 = (0, ora_1.default)('Detecting build tool').start();
|
|
63
|
+
const buildTool = await (0, dependency_analyzer_1.detectBuildTool)(projectRoot, projectType);
|
|
64
|
+
spinner6.succeed(`Build tool: ${chalk_1.default.cyan(buildTool)}`);
|
|
65
|
+
// Step 7: Generate architecture summary
|
|
66
|
+
const architecture = generateArchitectureSummary(projectType, directories, techStack);
|
|
67
|
+
// Step 8: Write output
|
|
68
|
+
const spinner7 = (0, ora_1.default)('Writing context file').start();
|
|
69
|
+
const context = {
|
|
70
|
+
projectType,
|
|
71
|
+
techStack,
|
|
72
|
+
directories,
|
|
73
|
+
dependencies,
|
|
74
|
+
buildTool,
|
|
75
|
+
architecture
|
|
76
|
+
};
|
|
77
|
+
await fs_extra_1.default.ensureDir(path_1.default.dirname(outputPath));
|
|
78
|
+
await fs_extra_1.default.writeJson(outputPath, context, { spaces: 2 });
|
|
79
|
+
spinner7.succeed('Context saved');
|
|
80
|
+
// Success message
|
|
81
|
+
console.log(chalk_1.default.bold.green('\n✓ Scout phase complete!\n'));
|
|
82
|
+
console.log(chalk_1.default.gray('Context saved to: ') + chalk_1.default.cyan(path_1.default.relative(process.cwd(), outputPath)));
|
|
83
|
+
console.log(chalk_1.default.gray('\nNext step: ') + chalk_1.default.cyan('csvibe run --phase=brainstorm\n'));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
console.error(chalk_1.default.red(`\n✗ Error: ${error.message}\n`));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.error(chalk_1.default.red('\n✗ An unexpected error occurred during scout phase\n'));
|
|
91
|
+
}
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate human-readable architecture summary
|
|
97
|
+
*
|
|
98
|
+
* @param projectType - Detected project type
|
|
99
|
+
* @param directories - Analyzed directory structure
|
|
100
|
+
* @param techStack - Inferred tech stack
|
|
101
|
+
* @returns Architecture summary string
|
|
102
|
+
*/
|
|
103
|
+
function generateArchitectureSummary(projectType, directories, techStack) {
|
|
104
|
+
const parts = [projectType];
|
|
105
|
+
// Add primary technologies (limit to top 3)
|
|
106
|
+
if (techStack.length > 0) {
|
|
107
|
+
const topTech = techStack.slice(0, 3).join(', ');
|
|
108
|
+
parts.push(`with ${topTech}`);
|
|
109
|
+
}
|
|
110
|
+
// Add structure info for monorepos
|
|
111
|
+
if (directories.source.length > 1) {
|
|
112
|
+
parts.push('(multi-package structure)');
|
|
113
|
+
}
|
|
114
|
+
return parts.join(' ');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=scout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.js","sourceRoot":"","sources":["../../src/commands/scout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration file generation
|
|
3
|
+
*/
|
|
4
|
+
import type { ConfigOptions, CSVibeConfig } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Generate config.yml from template and options
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateConfig(template: string, options: ConfigOptions): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if CSVibe is already initialized
|
|
11
|
+
*/
|
|
12
|
+
export declare function isInitialized(dir?: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Load existing config
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadConfig(dir?: string): Promise<CSVibeConfig>;
|
|
17
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/domains/config/generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE3D;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAInF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration file generation
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.generateConfig = generateConfig;
|
|
10
|
+
exports.isInitialized = isInitialized;
|
|
11
|
+
exports.loadConfig = loadConfig;
|
|
12
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
15
|
+
/**
|
|
16
|
+
* Generate config.yml from template and options
|
|
17
|
+
*/
|
|
18
|
+
async function generateConfig(template, options) {
|
|
19
|
+
const targetDir = options.targetDir || process.cwd();
|
|
20
|
+
const configPath = path_1.default.join(targetDir, '.csvibe', 'config.yml');
|
|
21
|
+
// Ensure .csvibe directory exists
|
|
22
|
+
await fs_extra_1.default.ensureDir(path_1.default.join(targetDir, '.csvibe'));
|
|
23
|
+
// Replace template placeholders
|
|
24
|
+
let config = template
|
|
25
|
+
.replace(/{{GENERATED_DATE}}/g, new Date().toISOString())
|
|
26
|
+
.replace(/{{PROJECT_NAME}}/g, options.projectName)
|
|
27
|
+
.replace(/{{PROJECT_TYPE}}/g, options.projectType)
|
|
28
|
+
.replace(/{{PROJECT_VERSION}}/g, options.projectVersion);
|
|
29
|
+
// Replace Jira placeholders if credentials provided
|
|
30
|
+
if (options.jiraCredentials) {
|
|
31
|
+
config = config
|
|
32
|
+
.replace(/{{JIRA_URL}}/g, options.jiraCredentials.url)
|
|
33
|
+
.replace(/{{JIRA_EMAIL}}/g, options.jiraCredentials.email)
|
|
34
|
+
.replace(/{{JIRA_API_TOKEN}}/g, options.jiraCredentials.apiToken)
|
|
35
|
+
.replace(/{{JIRA_PROJECT_KEY}}/g, options.jiraCredentials.projectKey);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Use placeholder values for unconfigured Jira
|
|
39
|
+
config = config
|
|
40
|
+
.replace(/{{JIRA_URL}}/g, '')
|
|
41
|
+
.replace(/{{JIRA_EMAIL}}/g, '')
|
|
42
|
+
.replace(/{{JIRA_API_TOKEN}}/g, '')
|
|
43
|
+
.replace(/{{JIRA_PROJECT_KEY}}/g, '');
|
|
44
|
+
}
|
|
45
|
+
// Write config file
|
|
46
|
+
await fs_extra_1.default.writeFile(configPath, config, 'utf-8');
|
|
47
|
+
// Set restrictive permissions (config contains sensitive data)
|
|
48
|
+
if (process.platform !== 'win32') {
|
|
49
|
+
await fs_extra_1.default.chmod(configPath, 0o600); // rw------- (owner only)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if CSVibe is already initialized
|
|
54
|
+
*/
|
|
55
|
+
async function isInitialized(dir = process.cwd()) {
|
|
56
|
+
const configPath = path_1.default.join(dir, '.csvibe', 'config.yml');
|
|
57
|
+
return await fs_extra_1.default.pathExists(configPath);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load existing config
|
|
61
|
+
*/
|
|
62
|
+
async function loadConfig(dir = process.cwd()) {
|
|
63
|
+
const configPath = path_1.default.join(dir, '.csvibe', 'config.yml');
|
|
64
|
+
const content = await fs_extra_1.default.readFile(configPath, 'utf-8');
|
|
65
|
+
return yaml_1.default.parse(content);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/domains/config/generator.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAUH,wCAwCC;AAKD,sCAGC;AAKD,gCAIC;AAjED,wDAA0B;AAC1B,gDAAwB;AACxB,gDAAwB;AAGxB;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,OAAsB;IAEtB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAEjE,kCAAkC;IAClC,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAEpD,gCAAgC;IAChC,IAAI,MAAM,GAAG,QAAQ;SAClB,OAAO,CAAC,qBAAqB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SACxD,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC;SACjD,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC;SACjD,OAAO,CAAC,sBAAsB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE3D,oDAAoD;IACpD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,GAAG,MAAM;aACZ,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC;aACrD,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC;aACzD,OAAO,CAAC,qBAAqB,EAAE,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC;aAChE,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,MAAM,GAAG,MAAM;aACZ,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;aAClC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,oBAAoB;IACpB,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhD,+DAA+D;IAC/D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,kBAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,yBAAyB;IAC9D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,cAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config domain facade
|
|
3
|
+
* Public API for configuration management
|
|
4
|
+
*/
|
|
5
|
+
export { generateConfig, isInitialized, loadConfig } from './generator';
|
|
6
|
+
export { validateConfig, isValidConfig, type ValidationError } from './validator';
|
|
7
|
+
export type { ConfigOptions, CSVibeConfig } from './types';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Config domain facade
|
|
4
|
+
* Public API for configuration management
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.isValidConfig = exports.validateConfig = exports.loadConfig = exports.isInitialized = exports.generateConfig = void 0;
|
|
8
|
+
var generator_1 = require("./generator");
|
|
9
|
+
Object.defineProperty(exports, "generateConfig", { enumerable: true, get: function () { return generator_1.generateConfig; } });
|
|
10
|
+
Object.defineProperty(exports, "isInitialized", { enumerable: true, get: function () { return generator_1.isInitialized; } });
|
|
11
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return generator_1.loadConfig; } });
|
|
12
|
+
var validator_1 = require("./validator");
|
|
13
|
+
Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return validator_1.validateConfig; } });
|
|
14
|
+
Object.defineProperty(exports, "isValidConfig", { enumerable: true, get: function () { return validator_1.isValidConfig; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAAwE;AAA/D,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA;AAClD,yCAAkF;AAAzE,2GAAA,cAAc,OAAA;AAAE,0GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config domain types
|
|
3
|
+
*/
|
|
4
|
+
import type { JiraCredentials } from '../../utils/prompts';
|
|
5
|
+
import type { ProjectType } from '../../utils/project-detector';
|
|
6
|
+
export interface ConfigOptions {
|
|
7
|
+
projectName: string;
|
|
8
|
+
projectType: ProjectType;
|
|
9
|
+
projectVersion: string;
|
|
10
|
+
jiraCredentials: JiraCredentials | null;
|
|
11
|
+
targetDir?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CSVibeConfig {
|
|
14
|
+
project: {
|
|
15
|
+
name: string;
|
|
16
|
+
type: string;
|
|
17
|
+
version: string;
|
|
18
|
+
};
|
|
19
|
+
github: {
|
|
20
|
+
private_repo: string;
|
|
21
|
+
branch: string;
|
|
22
|
+
};
|
|
23
|
+
jira: {
|
|
24
|
+
url: string;
|
|
25
|
+
email: string;
|
|
26
|
+
api_token: string;
|
|
27
|
+
project_key: string;
|
|
28
|
+
};
|
|
29
|
+
pipeline: {
|
|
30
|
+
phases: string[];
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
dry_run: boolean;
|
|
33
|
+
};
|
|
34
|
+
vscode: {
|
|
35
|
+
copilot_required: boolean;
|
|
36
|
+
workspace_path: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domains/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,MAAM,EAAE;QACN,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domains/config/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration validation
|
|
3
|
+
*/
|
|
4
|
+
import type { CSVibeConfig } from './types';
|
|
5
|
+
export interface ValidationError {
|
|
6
|
+
field: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Validate config structure
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateConfig(config: CSVibeConfig): ValidationError[];
|
|
13
|
+
/**
|
|
14
|
+
* Check if config is valid (no errors)
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidConfig(config: CSVibeConfig): boolean;
|
|
17
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/domains/config/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,CAyCtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration validation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateConfig = validateConfig;
|
|
7
|
+
exports.isValidConfig = isValidConfig;
|
|
8
|
+
/**
|
|
9
|
+
* Validate config structure
|
|
10
|
+
*/
|
|
11
|
+
function validateConfig(config) {
|
|
12
|
+
const errors = [];
|
|
13
|
+
// Validate project section
|
|
14
|
+
if (!config.project?.name) {
|
|
15
|
+
errors.push({ field: 'project.name', message: 'Project name is required' });
|
|
16
|
+
}
|
|
17
|
+
if (!config.project?.type) {
|
|
18
|
+
errors.push({ field: 'project.type', message: 'Project type is required' });
|
|
19
|
+
}
|
|
20
|
+
if (!config.project?.version) {
|
|
21
|
+
errors.push({ field: 'project.version', message: 'Project version is required' });
|
|
22
|
+
}
|
|
23
|
+
// Validate Jira section
|
|
24
|
+
if (!config.jira?.url) {
|
|
25
|
+
errors.push({ field: 'jira.url', message: 'Jira URL is required' });
|
|
26
|
+
}
|
|
27
|
+
else if (!config.jira.url.startsWith('http')) {
|
|
28
|
+
errors.push({ field: 'jira.url', message: 'Jira URL must start with http:// or https://' });
|
|
29
|
+
}
|
|
30
|
+
if (!config.jira?.email) {
|
|
31
|
+
errors.push({ field: 'jira.email', message: 'Jira email is required' });
|
|
32
|
+
}
|
|
33
|
+
else if (!config.jira.email.includes('@')) {
|
|
34
|
+
errors.push({ field: 'jira.email', message: 'Jira email must be valid' });
|
|
35
|
+
}
|
|
36
|
+
if (!config.jira?.api_token) {
|
|
37
|
+
errors.push({ field: 'jira.api_token', message: 'Jira API token is required' });
|
|
38
|
+
}
|
|
39
|
+
if (!config.jira?.project_key) {
|
|
40
|
+
errors.push({ field: 'jira.project_key', message: 'Jira project key is required' });
|
|
41
|
+
}
|
|
42
|
+
// Validate pipeline section
|
|
43
|
+
if (!Array.isArray(config.pipeline?.phases)) {
|
|
44
|
+
errors.push({ field: 'pipeline.phases', message: 'Pipeline phases must be an array' });
|
|
45
|
+
}
|
|
46
|
+
return errors;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if config is valid (no errors)
|
|
50
|
+
*/
|
|
51
|
+
function isValidConfig(config) {
|
|
52
|
+
return validateConfig(config).length === 0;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/domains/config/validator.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAYH,wCAyCC;AAKD,sCAEC;AAnDD;;GAEG;AACH,SAAgB,cAAc,CAAC,MAAoB;IACjD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,MAAoB;IAChD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-tier GitHub authentication system
|
|
3
|
+
* Implements 5-tier fallback: gh CLI → env → config → keychain → prompt
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthMethod, GitHubTokenInfo } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Get GitHub token using 5-tier fallback strategy
|
|
8
|
+
* @throws {GitHubAuthError} if no authentication method available
|
|
9
|
+
*/
|
|
10
|
+
export declare function getGitHubToken(): Promise<GitHubTokenInfo>;
|
|
11
|
+
/**
|
|
12
|
+
* Validate GitHub token by making a test API call
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateToken(token: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Get authentication method description for logging
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAuthMethodDescription(method: AuthMethod): string;
|
|
19
|
+
//# sourceMappingURL=auth-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-api.d.ts","sourceRoot":"","sources":["../../../src/domains/github/auth-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE3D;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAkC/D;AA+FD;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAUnE"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-tier GitHub authentication system
|
|
4
|
+
* Implements 5-tier fallback: gh CLI → env → config → keychain → prompt
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.getGitHubToken = getGitHubToken;
|
|
44
|
+
exports.validateToken = validateToken;
|
|
45
|
+
exports.getAuthMethodDescription = getAuthMethodDescription;
|
|
46
|
+
const child_process_1 = require("child_process");
|
|
47
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
48
|
+
const path_1 = __importDefault(require("path"));
|
|
49
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
50
|
+
const p = __importStar(require("@clack/prompts"));
|
|
51
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
52
|
+
const errors_1 = require("../../utils/errors");
|
|
53
|
+
const keychain_1 = require("./keychain");
|
|
54
|
+
/**
|
|
55
|
+
* Get GitHub token using 5-tier fallback strategy
|
|
56
|
+
* @throws {GitHubAuthError} if no authentication method available
|
|
57
|
+
*/
|
|
58
|
+
async function getGitHubToken() {
|
|
59
|
+
// Tier 1: GitHub CLI
|
|
60
|
+
const ghCliToken = tryGitHubCLI();
|
|
61
|
+
if (ghCliToken) {
|
|
62
|
+
return { token: ghCliToken, method: 'gh-cli' };
|
|
63
|
+
}
|
|
64
|
+
// Tier 2: Environment Variables
|
|
65
|
+
const envToken = tryEnvironmentVariable();
|
|
66
|
+
if (envToken) {
|
|
67
|
+
return { token: envToken, method: 'env-var' };
|
|
68
|
+
}
|
|
69
|
+
// Tier 3: Config File
|
|
70
|
+
const configToken = await tryConfigFile();
|
|
71
|
+
if (configToken) {
|
|
72
|
+
return { token: configToken, method: 'config' };
|
|
73
|
+
}
|
|
74
|
+
// Tier 4: OS Keychain
|
|
75
|
+
const keychainToken = await tryKeychain();
|
|
76
|
+
if (keychainToken) {
|
|
77
|
+
return { token: keychainToken, method: 'keychain' };
|
|
78
|
+
}
|
|
79
|
+
// Tier 5: User Prompt
|
|
80
|
+
const promptedToken = await promptForToken();
|
|
81
|
+
if (promptedToken) {
|
|
82
|
+
// Save to keychain for future use
|
|
83
|
+
await (0, keychain_1.saveTokenToKeychain)(promptedToken);
|
|
84
|
+
return { token: promptedToken, method: 'prompt' };
|
|
85
|
+
}
|
|
86
|
+
throw new errors_1.GitHubAuthError('No GitHub authentication method available');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Tier 1: Try GitHub CLI authentication
|
|
90
|
+
*/
|
|
91
|
+
function tryGitHubCLI() {
|
|
92
|
+
try {
|
|
93
|
+
const token = (0, child_process_1.execSync)('gh auth token', {
|
|
94
|
+
encoding: 'utf-8',
|
|
95
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
96
|
+
}).trim();
|
|
97
|
+
if (token && token.length > 0 && !token.includes('not logged in')) {
|
|
98
|
+
return token;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// gh CLI not available or not authenticated
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Tier 2: Try environment variables
|
|
108
|
+
*/
|
|
109
|
+
function tryEnvironmentVariable() {
|
|
110
|
+
const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
111
|
+
return token && token.length > 0 ? token : null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Tier 3: Try config file
|
|
115
|
+
*/
|
|
116
|
+
async function tryConfigFile() {
|
|
117
|
+
try {
|
|
118
|
+
const configPath = path_1.default.join(process.cwd(), '.csvibe', 'config.yml');
|
|
119
|
+
if (!(await fs_extra_1.default.pathExists(configPath))) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const configContent = await fs_extra_1.default.readFile(configPath, 'utf-8');
|
|
123
|
+
const config = yaml_1.default.parse(configContent);
|
|
124
|
+
const token = config?.github?.token || config?.github?.access_token;
|
|
125
|
+
return token && token.length > 0 ? token : null;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Tier 4: Try OS keychain
|
|
133
|
+
*/
|
|
134
|
+
async function tryKeychain() {
|
|
135
|
+
return await (0, keychain_1.readTokenFromKeychain)();
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Tier 5: Prompt user for token
|
|
139
|
+
*/
|
|
140
|
+
async function promptForToken() {
|
|
141
|
+
p.intro(chalk_1.default.bold.cyan('GitHub Authentication Required'));
|
|
142
|
+
p.note(chalk_1.default.gray('To create a GitHub Personal Access Token:\n' +
|
|
143
|
+
'1. Go to: ' +
|
|
144
|
+
chalk_1.default.cyan('https://github.com/settings/tokens/new') +
|
|
145
|
+
'\n' +
|
|
146
|
+
'2. Select scopes: ' +
|
|
147
|
+
chalk_1.default.yellow('repo, read:org') +
|
|
148
|
+
'\n' +
|
|
149
|
+
'3. Generate and copy the token'), chalk_1.default.bold('📝 Setup Instructions'));
|
|
150
|
+
const token = await p.password({
|
|
151
|
+
message: 'GitHub Personal Access Token',
|
|
152
|
+
validate: (value) => {
|
|
153
|
+
if (!value)
|
|
154
|
+
return 'Token is required';
|
|
155
|
+
if (value.length < 20) {
|
|
156
|
+
return 'Token seems too short. Please enter a valid GitHub token.';
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
if (p.isCancel(token)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return token;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Validate GitHub token by making a test API call
|
|
167
|
+
*/
|
|
168
|
+
async function validateToken(token) {
|
|
169
|
+
try {
|
|
170
|
+
const response = await fetch('https://api.github.com/user', {
|
|
171
|
+
headers: {
|
|
172
|
+
Authorization: `Bearer ${token}`,
|
|
173
|
+
Accept: 'application/vnd.github+json',
|
|
174
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
return response.ok;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get authentication method description for logging
|
|
185
|
+
*/
|
|
186
|
+
function getAuthMethodDescription(method) {
|
|
187
|
+
const descriptions = {
|
|
188
|
+
'gh-cli': 'GitHub CLI (gh auth token)',
|
|
189
|
+
'env-var': 'Environment variable (GITHUB_TOKEN/GH_TOKEN)',
|
|
190
|
+
config: 'Config file (.csvibe/config.yml)',
|
|
191
|
+
keychain: 'OS Keychain (secure storage)',
|
|
192
|
+
prompt: 'User prompt (saved to keychain)',
|
|
193
|
+
};
|
|
194
|
+
return descriptions[method] || 'Unknown';
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=auth-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-api.js","sourceRoot":"","sources":["../../../src/domains/github/auth-api.ts"],"names":[],"mappings":"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"}
|