@gkganesh12/codecraft-cli 1.0.1
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/README.md +99 -0
- package/dist/commands/adr.d.ts +2 -0
- package/dist/commands/adr.d.ts.map +1 -0
- package/dist/commands/adr.js +48 -0
- package/dist/commands/adr.js.map +1 -0
- package/dist/commands/architect.d.ts +2 -0
- package/dist/commands/architect.d.ts.map +1 -0
- package/dist/commands/architect.js +83 -0
- package/dist/commands/architect.js.map +1 -0
- package/dist/commands/code.d.ts +2 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +111 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +101 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +36 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/explain.d.ts +2 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +41 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/feature.d.ts +2 -0
- package/dist/commands/feature.d.ts.map +1 -0
- package/dist/commands/feature.js +49 -0
- package/dist/commands/feature.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +63 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +61 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/review.d.ts +2 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +41 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +48 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +31 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +2 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +64 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +35 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +25 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +19 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/llm/client.d.ts +14 -0
- package/dist/core/llm/client.d.ts.map +1 -0
- package/dist/core/llm/client.js +28 -0
- package/dist/core/llm/client.js.map +1 -0
- package/dist/core/prompts/roles.d.ts +11 -0
- package/dist/core/prompts/roles.d.ts.map +1 -0
- package/dist/core/prompts/roles.js +238 -0
- package/dist/core/prompts/roles.js.map +1 -0
- package/dist/core/rules.d.ts +14 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +39 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/scanner.d.ts +6 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +21 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/scope.d.ts +11 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +34 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/repl.d.ts +2 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +148 -0
- package/dist/repl.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.featureCommand = featureCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const loader_1 = require("../config/loader");
|
|
11
|
+
const client_1 = require("../core/llm/client");
|
|
12
|
+
const roles_1 = require("../core/prompts/roles");
|
|
13
|
+
const ora_1 = __importDefault(require("ora"));
|
|
14
|
+
async function featureCommand(description) {
|
|
15
|
+
const spinner = (0, ora_1.default)('Designing feature...').start();
|
|
16
|
+
const configLoader = new loader_1.ConfigLoader();
|
|
17
|
+
const config = configLoader.load();
|
|
18
|
+
if (!config) {
|
|
19
|
+
spinner.fail('No config found.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const apiKey = process.env.CODECRAFT_API_KEY || process.env.OPENAI_API_KEY;
|
|
23
|
+
if (!apiKey) {
|
|
24
|
+
spinner.fail('API Key missing.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const ai = new client_1.OpenAIAdapter(apiKey);
|
|
28
|
+
const prompt = [
|
|
29
|
+
{ role: 'system', content: roles_1.FEATURE_PROMPT },
|
|
30
|
+
{ role: 'user', content: `Feature Description: ${description}` }
|
|
31
|
+
];
|
|
32
|
+
try {
|
|
33
|
+
const spec = await ai.complete(prompt);
|
|
34
|
+
// Save to docs/features/
|
|
35
|
+
const featuresDir = path_1.default.join(process.cwd(), 'docs', 'features');
|
|
36
|
+
fs_extra_1.default.ensureDirSync(featuresDir);
|
|
37
|
+
// simple sanitization for filename
|
|
38
|
+
const filename = `feature-${Date.now()}.md`;
|
|
39
|
+
const filePath = path_1.default.join(featuresDir, filename);
|
|
40
|
+
fs_extra_1.default.writeFileSync(filePath, spec);
|
|
41
|
+
spinner.succeed('Feature Spec generated! 📝');
|
|
42
|
+
console.log(chalk_1.default.dim(`Saved to ${filePath}`));
|
|
43
|
+
console.log('\n' + spec.substring(0, 500) + '...\n'); // Preview
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
spinner.fail(`Feature generation failed: ${err.message}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../../src/commands/feature.ts"],"names":[],"mappings":";;;;;AASA,wCAyCC;AAjDD,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AACxB,6CAAgD;AAChD,+CAA8D;AAC9D,iDAAuD;AACvD,8CAAsB;AAEf,KAAK,UAAU,cAAc,CAAC,WAAmB;IACpD,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,sBAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAgB;QACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAc,EAAE;QAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,WAAW,EAAE,EAAE;KACnE,CAAC;IAEF,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,yBAAyB;QACzB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACjE,kBAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAE9B,mCAAmC;QACnC,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;QAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAElD,kBAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU;IAEpE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,kBAwDhC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initCommand = initCommand;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
async function initCommand() {
|
|
12
|
+
console.log(chalk_1.default.green('Welcome to CodeCraft Setup! 🚀'));
|
|
13
|
+
const answers = await inquirer_1.default.prompt([
|
|
14
|
+
{
|
|
15
|
+
type: 'list',
|
|
16
|
+
name: 'projectType',
|
|
17
|
+
message: 'What type of project is this?',
|
|
18
|
+
choices: ['monorepo', 'standard', 'unknown'],
|
|
19
|
+
default: 'standard'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
type: 'confirm',
|
|
23
|
+
name: 'autoLock',
|
|
24
|
+
message: 'Enable Scope Guard auto-lock?',
|
|
25
|
+
default: true
|
|
26
|
+
}
|
|
27
|
+
]);
|
|
28
|
+
const config = {
|
|
29
|
+
projectType: answers.projectType,
|
|
30
|
+
layers: {
|
|
31
|
+
frontend: ['src/ui/**/*', 'pages/**/*'],
|
|
32
|
+
backend: ['src/api/**/*', 'server/**/*']
|
|
33
|
+
},
|
|
34
|
+
rules: [
|
|
35
|
+
{
|
|
36
|
+
name: 'no-secrets',
|
|
37
|
+
description: 'Do not commit .env files',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
check: 'grep -r ".env" .'
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
scopeGuard: {
|
|
43
|
+
protectedPaths: ['package.json', 'tsconfig.json', '.env'],
|
|
44
|
+
autoLock: answers.autoLock
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const configPath = path_1.default.join(process.cwd(), 'codecraft.config.json');
|
|
48
|
+
if (fs_extra_1.default.existsSync(configPath)) {
|
|
49
|
+
const overwrite = await inquirer_1.default.prompt([{
|
|
50
|
+
type: 'confirm',
|
|
51
|
+
name: 'confirm',
|
|
52
|
+
message: 'Config file already exists. Overwrite?',
|
|
53
|
+
default: false
|
|
54
|
+
}]);
|
|
55
|
+
if (!overwrite.confirm) {
|
|
56
|
+
console.log(chalk_1.default.yellow('Skipping initialization.'));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
fs_extra_1.default.writeJSONSync(configPath, config, { spaces: 2 });
|
|
61
|
+
console.log(chalk_1.default.green(`✅ Created codecraft.config.json at ${configPath}`));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAOA,kCAwDC;AA9DD,wDAAgC;AAChC,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AAGjB,KAAK,UAAU,WAAW;IAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAClC;YACI,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC;YAC5C,OAAO,EAAE,UAAU;SACtB;QACD;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,+BAA+B;YACxC,OAAO,EAAE,IAAI;SAChB;KACJ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAoB;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,MAAM,EAAE;YACJ,QAAQ,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC;YACvC,OAAO,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC;SAC3C;QACD,KAAK,EAAE;YACH;gBACI,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,0BAA0B;gBACvC,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,kBAAkB;aAC5B;SACJ;QACD,UAAU,EAAE;YACR,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,MAAM,CAAC;YACzD,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC7B;KACJ,CAAC;IAEF,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;IAErE,IAAI,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,wCAAwC;gBACjD,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACtD,OAAO;QACX,CAAC;IACL,CAAC;IAED,kBAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAUA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,iBAsD7C"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.planCommand = planCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const loader_1 = require("../config/loader");
|
|
11
|
+
const scanner_1 = require("../core/scanner");
|
|
12
|
+
const client_1 = require("../core/llm/client");
|
|
13
|
+
const ora_1 = __importDefault(require("ora"));
|
|
14
|
+
const roles_1 = require("../core/prompts/roles");
|
|
15
|
+
async function planCommand(task) {
|
|
16
|
+
const spinner = (0, ora_1.default)('Loading configuration...').start();
|
|
17
|
+
// 1. Load Config
|
|
18
|
+
const configLoader = new loader_1.ConfigLoader();
|
|
19
|
+
const config = configLoader.load();
|
|
20
|
+
if (!config) {
|
|
21
|
+
spinner.fail('No codecraft.config.json found. Run "codecraft init" first.');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// 2. Scan Project
|
|
25
|
+
spinner.text = 'Scanning project structure...';
|
|
26
|
+
const scanner = new scanner_1.ProjectScanner();
|
|
27
|
+
const files = await scanner.scan();
|
|
28
|
+
// Limit files context effectively (only top level trees or summary)
|
|
29
|
+
const fileList = files.slice(0, 50).join('\n'); // mvp hack
|
|
30
|
+
// 3. AI Planning
|
|
31
|
+
spinner.text = 'Generating plan with AI...';
|
|
32
|
+
const apiKey = process.env.CODECRAFT_API_KEY || process.env.OPENAI_API_KEY;
|
|
33
|
+
if (!apiKey) {
|
|
34
|
+
spinner.fail('CODECRAFT_API_KEY or OPENAI_API_KEY not set.');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const ai = new client_1.OpenAIAdapter(apiKey);
|
|
38
|
+
const prompt = [
|
|
39
|
+
{
|
|
40
|
+
role: 'system',
|
|
41
|
+
content: roles_1.PM_ROLE
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
role: 'user',
|
|
45
|
+
content: `Task: ${task}`
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
try {
|
|
49
|
+
const plan = await ai.complete(prompt);
|
|
50
|
+
// 4. Save Plan
|
|
51
|
+
const planPath = path_1.default.join(process.cwd(), 'plan.md');
|
|
52
|
+
fs_extra_1.default.writeFileSync(planPath, plan);
|
|
53
|
+
spinner.succeed(chalk_1.default.green('Plan generated successfully! 📝'));
|
|
54
|
+
console.log(chalk_1.default.dim(`Saved to ${planPath}`));
|
|
55
|
+
console.log('\nRun "codecraft architect" to validate this plan.');
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
spinner.fail(`AI Planning Failed: ${err.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":";;;;;AAUA,kCAsDC;AA/DD,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AACxB,6CAAgD;AAChD,6CAAiD;AACjD,+CAA8D;AAC9D,8CAAsB;AACtB,iDAAgD;AAEzC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,iBAAiB;IACjB,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC5E,OAAO;IACX,CAAC;IAED,kBAAkB;IAClB,OAAO,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,wBAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACnC,oEAAoE;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW;IAE3D,iBAAiB;IACjB,OAAO,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,sBAAa,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,MAAM,GAAgB;QACxB;YACI,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,eAAO;SACnB;QACD;YACI,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS,IAAI,EAAE;SAC3B;KACJ,CAAC;IAEF,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEvC,eAAe;QACf,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;QACrD,kBAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEjC,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAEtE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,iBA+B/C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.reviewCommand = reviewCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const client_1 = require("../core/llm/client");
|
|
11
|
+
const roles_1 = require("../core/prompts/roles");
|
|
12
|
+
const ora_1 = __importDefault(require("ora"));
|
|
13
|
+
async function reviewCommand(file) {
|
|
14
|
+
const spinner = (0, ora_1.default)('Reviewing code...').start();
|
|
15
|
+
const filePath = path_1.default.resolve(file);
|
|
16
|
+
if (!fs_extra_1.default.existsSync(filePath)) {
|
|
17
|
+
spinner.fail(`File not found: ${file}`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const apiKey = process.env.CODECRAFT_API_KEY || process.env.OPENAI_API_KEY;
|
|
21
|
+
if (!apiKey) {
|
|
22
|
+
spinner.fail('API Key missing.');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const content = fs_extra_1.default.readFileSync(filePath, 'utf-8');
|
|
26
|
+
const ai = new client_1.OpenAIAdapter(apiKey);
|
|
27
|
+
const prompt = [
|
|
28
|
+
{ role: 'system', content: roles_1.REVIEW_PROMPT },
|
|
29
|
+
{ role: 'user', content: `Review this code:\n\n${content}` }
|
|
30
|
+
];
|
|
31
|
+
try {
|
|
32
|
+
const review = await ai.complete(prompt);
|
|
33
|
+
spinner.stop();
|
|
34
|
+
console.log(chalk_1.default.bold.hex('#F59E0B')('\n🧐 Code Review Findings\n'));
|
|
35
|
+
console.log(review);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
spinner.fail(`Review failed: ${err.message}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":";;;;;AAQA,sCA+BC;AAtCD,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AACxB,+CAA8D;AAC9D,iDAAsD;AACtD,8CAAsB;AAEf,KAAK,UAAU,aAAa,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,IAAI,sBAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAgB;QACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAa,EAAE;QAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,OAAO,EAAE,EAAE;KAC/D,CAAC;IAEF,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAExB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AASA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,iBAyC7C"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.testCommand = testCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const loader_1 = require("../config/loader");
|
|
11
|
+
const client_1 = require("../core/llm/client");
|
|
12
|
+
const roles_1 = require("../core/prompts/roles");
|
|
13
|
+
const ora_1 = __importDefault(require("ora"));
|
|
14
|
+
async function testCommand(file) {
|
|
15
|
+
const spinner = (0, ora_1.default)('Writing tests...').start();
|
|
16
|
+
const filePath = path_1.default.resolve(file);
|
|
17
|
+
if (!fs_extra_1.default.existsSync(filePath)) {
|
|
18
|
+
spinner.fail(`File not found: ${file}`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const configLoader = new loader_1.ConfigLoader();
|
|
22
|
+
const config = configLoader.load(); // Assuming config is needed for context later
|
|
23
|
+
const apiKey = process.env.CODECRAFT_API_KEY || process.env.OPENAI_API_KEY;
|
|
24
|
+
if (!apiKey) {
|
|
25
|
+
spinner.fail('API Key missing.');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const content = fs_extra_1.default.readFileSync(filePath, 'utf-8');
|
|
29
|
+
const ai = new client_1.OpenAIAdapter(apiKey);
|
|
30
|
+
const prompt = [
|
|
31
|
+
{ role: 'system', content: roles_1.UNIT_TEST_PROMPT },
|
|
32
|
+
{ role: 'user', content: `Generate tests for this file:\n\n${content}` }
|
|
33
|
+
];
|
|
34
|
+
try {
|
|
35
|
+
const tests = await ai.complete(prompt);
|
|
36
|
+
// Heuristic for test filename
|
|
37
|
+
const parsed = path_1.default.parse(filePath);
|
|
38
|
+
const testFilename = `${parsed.name}.test${parsed.ext}`;
|
|
39
|
+
const testFilePath = path_1.default.join(parsed.dir, testFilename);
|
|
40
|
+
fs_extra_1.default.writeFileSync(testFilePath, tests.replace(/```(typescript|ts|javascript|js)?\n/g, '').replace(/```$/g, ''));
|
|
41
|
+
spinner.succeed('Tests generated! 🧪');
|
|
42
|
+
console.log(chalk_1.default.dim(`Saved to ${testFilePath}`));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
spinner.fail(`Test generation failed: ${err.message}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":";;;;;AASA,kCAyCC;AAjDD,kDAA0B;AAC1B,wDAA0B;AAC1B,gDAAwB;AACxB,6CAAgD;AAChD,+CAA8D;AAC9D,iDAAyD;AACzD,8CAAsB;AAEf,KAAK,UAAU,WAAW,CAAC,IAAY;IAC1C,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhD,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO;IACX,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,8CAA8C;IAElF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,EAAE,GAAG,IAAI,sBAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,MAAM,GAAgB;QACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAgB,EAAE;QAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oCAAoC,OAAO,EAAE,EAAE;KAC3E,CAAC;IAEF,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAExC,8BAA8B;QAC9B,MAAM,MAAM,GAAG,cAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,GAAG,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,GAAG,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAEzD,kBAAE,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAE/G,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC;IAEvD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,kBAsBlC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.updateCommand = updateCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
async function updateCommand() {
|
|
12
|
+
const spinner = (0, ora_1.default)('Checking for updates...').start();
|
|
13
|
+
// Simulate network delay
|
|
14
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
15
|
+
// For now, we mock the update check
|
|
16
|
+
// In a real app, we would check npm registry or github releases
|
|
17
|
+
const packageJsonPath = path_1.default.join(__dirname, '../../package.json');
|
|
18
|
+
let currentVersion = '1.0.0';
|
|
19
|
+
if (fs_extra_1.default.existsSync(packageJsonPath)) {
|
|
20
|
+
try {
|
|
21
|
+
const pkg = fs_extra_1.default.readJsonSync(packageJsonPath);
|
|
22
|
+
currentVersion = pkg.version;
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
// ignore
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
spinner.succeed(`You are on the latest version (${currentVersion}).`);
|
|
29
|
+
console.log(chalk_1.default.dim('No updates available.'));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;;;AAMA,sCAsBC;AA3BD,kDAA0B;AAC1B,8CAAsB;AACtB,wDAA0B;AAC1B,gDAAwB;AAEjB,KAAK,UAAU,aAAa;IAC/B,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvD,yBAAyB;IACzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAExD,oCAAoC;IACpC,gEAAgE;IAChE,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACnE,IAAI,cAAc,GAAG,OAAO,CAAC;IAE7B,IAAI,kBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,kBAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YAC7C,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,SAAS;QACb,CAAC;IACL,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,kCAAkC,cAAc,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,kBAmDlC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.verifyCommand = verifyCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const rules_1 = require("../core/rules");
|
|
9
|
+
const loader_1 = require("../config/loader");
|
|
10
|
+
const client_1 = require("../core/llm/client");
|
|
11
|
+
const roles_1 = require("../core/prompts/roles");
|
|
12
|
+
async function verifyCommand() {
|
|
13
|
+
console.log(chalk_1.default.blue('Verification Phase... 🛡️'));
|
|
14
|
+
const configLoader = new loader_1.ConfigLoader();
|
|
15
|
+
const config = configLoader.load();
|
|
16
|
+
if (!config)
|
|
17
|
+
return;
|
|
18
|
+
// 1. Run Rule Validator
|
|
19
|
+
console.log('Running Architecture Rules...');
|
|
20
|
+
const validator = new rules_1.RuleValidator(config);
|
|
21
|
+
const violations = validator.validate();
|
|
22
|
+
if (violations.length === 0) {
|
|
23
|
+
console.log(chalk_1.default.green('✅ No architectural violations found.'));
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(chalk_1.default.red(`❌ Found ${violations.length} violations:`));
|
|
27
|
+
violations.forEach(v => {
|
|
28
|
+
console.log(chalk_1.default.red(` [${v.severity.toUpperCase()}] ${v.ruleName}: ${v.description}`));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
// 2. Run Tests (Mock)
|
|
32
|
+
try {
|
|
33
|
+
console.log('\nRunning Project Tests...');
|
|
34
|
+
// execSync('npm test', { stdio: 'inherit' }); // Commented out for MVP safety
|
|
35
|
+
console.log(chalk_1.default.yellow('ℹ️ Skipped "npm test" (configure in settings)'));
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
console.log(chalk_1.default.red('Tests Failed.'));
|
|
39
|
+
}
|
|
40
|
+
// 3. AI Auditor Risk Assessment
|
|
41
|
+
console.log(chalk_1.default.blue('\n🤖 AI Auditor is assessing risk...'));
|
|
42
|
+
const apiKey = process.env.CODECRAFT_API_KEY || process.env.OPENAI_API_KEY;
|
|
43
|
+
if (apiKey) {
|
|
44
|
+
const ai = new client_1.OpenAIAdapter(apiKey);
|
|
45
|
+
// We'd ideally feed the diff, but for now we feed the plan and rule violations
|
|
46
|
+
const prompt = [
|
|
47
|
+
{ role: 'system', content: roles_1.QA_ROLE },
|
|
48
|
+
{ role: 'user', content: `Analyze the risk of this deployment based on these violations:\n${JSON.stringify(violations)}` }
|
|
49
|
+
];
|
|
50
|
+
try {
|
|
51
|
+
const audit = await ai.complete(prompt);
|
|
52
|
+
console.log(chalk_1.default.cyan('\n📋 QA Audit Report:\n'));
|
|
53
|
+
console.log(audit);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
console.error(chalk_1.default.red('AI Audit Failed.'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(chalk_1.default.yellow('Skipping AI Audit (No API Key).'));
|
|
61
|
+
console.log(chalk_1.default.green('RISK SCORE: 4/100 (LOW) [MOCK]'));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAyB,MAAM,UAAU,CAAC;AAGlE,qBAAa,YAAY;IACrB,OAAO,CAAC,UAAU,CAAS;gBAEf,GAAG,GAAE,MAAsB;IAIvC,IAAI,IAAI,eAAe,GAAG,IAAI;IAgB9B,MAAM,IAAI,OAAO;CAGpB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigLoader = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const schema_1 = require("./schema");
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
class ConfigLoader {
|
|
12
|
+
constructor(cwd = process.cwd()) {
|
|
13
|
+
this.configPath = path_1.default.join(cwd, 'codecraft.config.json');
|
|
14
|
+
}
|
|
15
|
+
load() {
|
|
16
|
+
if (!(0, fs_1.existsSync)(this.configPath)) {
|
|
17
|
+
return null; // No config found
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const rawConfig = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
|
|
21
|
+
const jsonConfig = JSON.parse(rawConfig);
|
|
22
|
+
const parsedConfig = schema_1.CodeCraftConfigSchema.parse(jsonConfig);
|
|
23
|
+
return parsedConfig;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(chalk_1.default.red('Error loading codecraft.config.json:'), error);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exists() {
|
|
31
|
+
return (0, fs_1.existsSync)(this.configPath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.ConfigLoader = ConfigLoader;
|
|
35
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":";;;;;;AACA,2BAA8C;AAC9C,gDAAwB;AACxB,qCAAkE;AAClE,kDAA0B;AAE1B,MAAa,YAAY;IAGrB,YAAY,MAAc,OAAO,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI;QACA,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,CAAC,kBAAkB;QACnC,CAAC;QAED,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,8BAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC7D,OAAO,YAAY,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,EAAE,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,MAAM;QACF,OAAO,IAAA,eAAU,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;CACJ;AA1BD,oCA0BC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const CodeCraftConfigSchema: z.ZodObject<{
|
|
3
|
+
projectType: z.ZodDefault<z.ZodEnum<{
|
|
4
|
+
monorepo: "monorepo";
|
|
5
|
+
standard: "standard";
|
|
6
|
+
unknown: "unknown";
|
|
7
|
+
}>>;
|
|
8
|
+
layers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
9
|
+
rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
description: z.ZodString;
|
|
12
|
+
severity: z.ZodEnum<{
|
|
13
|
+
error: "error";
|
|
14
|
+
warn: "warn";
|
|
15
|
+
info: "info";
|
|
16
|
+
}>;
|
|
17
|
+
check: z.ZodString;
|
|
18
|
+
}, z.core.$strip>>>;
|
|
19
|
+
scopeGuard: z.ZodDefault<z.ZodObject<{
|
|
20
|
+
protectedPaths: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
21
|
+
autoLock: z.ZodDefault<z.ZodBoolean>;
|
|
22
|
+
}, z.core.$strip>>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export type CodeCraftConfig = z.infer<typeof CodeCraftConfigSchema>;
|
|
25
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;iBAahC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodeCraftConfigSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
exports.CodeCraftConfigSchema = zod_1.z.object({
|
|
6
|
+
projectType: zod_1.z.enum(['monorepo', 'standard', 'unknown']).default('standard'),
|
|
7
|
+
layers: zod_1.z.record(zod_1.z.string(), zod_1.z.array(zod_1.z.string())).optional(),
|
|
8
|
+
rules: zod_1.z.array(zod_1.z.object({
|
|
9
|
+
name: zod_1.z.string(),
|
|
10
|
+
description: zod_1.z.string(),
|
|
11
|
+
severity: zod_1.z.enum(['error', 'warn', 'info']),
|
|
12
|
+
check: zod_1.z.string()
|
|
13
|
+
})).default([]),
|
|
14
|
+
scopeGuard: zod_1.z.object({
|
|
15
|
+
protectedPaths: zod_1.z.array(zod_1.z.string()).default([]),
|
|
16
|
+
autoLock: zod_1.z.boolean().default(true)
|
|
17
|
+
}).default({ protectedPaths: [], autoLock: true })
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":";;;AACA,6BAAwB;AAEX,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC5E,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5D,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,CAAC;QACtB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACf,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;QACnB,cAAc,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,QAAQ,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACpC,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface AIMessage {
|
|
2
|
+
role: 'system' | 'user' | 'assistant';
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface AIClient {
|
|
6
|
+
complete(messages: AIMessage[]): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
export declare class OpenAIAdapter implements AIClient {
|
|
9
|
+
private client;
|
|
10
|
+
private model;
|
|
11
|
+
constructor(apiKey: string, model?: string);
|
|
12
|
+
complete(messages: AIMessage[]): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/llm/client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED,qBAAa,aAAc,YAAW,QAAQ;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgB;IAK7C,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAYzD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenAIAdapter = void 0;
|
|
7
|
+
const openai_1 = __importDefault(require("openai"));
|
|
8
|
+
class OpenAIAdapter {
|
|
9
|
+
constructor(apiKey, model = 'gpt-4') {
|
|
10
|
+
this.client = new openai_1.default({ apiKey });
|
|
11
|
+
this.model = model;
|
|
12
|
+
}
|
|
13
|
+
async complete(messages) {
|
|
14
|
+
try {
|
|
15
|
+
const response = await this.client.chat.completions.create({
|
|
16
|
+
model: this.model,
|
|
17
|
+
messages: messages,
|
|
18
|
+
});
|
|
19
|
+
return response.choices[0]?.message?.content || '';
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
console.error('OpenAI API Error:', error);
|
|
23
|
+
throw new Error('Failed to complete AI request');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.OpenAIAdapter = OpenAIAdapter;
|
|
28
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/llm/client.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAW5B,MAAa,aAAa;IAItB,YAAY,MAAc,EAAE,QAAgB,OAAO;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAqB;QAChC,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACvD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,QAAQ;aACrB,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;CACJ;AArBD,sCAqBC"}
|