@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.
Files changed (90) hide show
  1. package/README.md +99 -0
  2. package/dist/commands/adr.d.ts +2 -0
  3. package/dist/commands/adr.d.ts.map +1 -0
  4. package/dist/commands/adr.js +48 -0
  5. package/dist/commands/adr.js.map +1 -0
  6. package/dist/commands/architect.d.ts +2 -0
  7. package/dist/commands/architect.d.ts.map +1 -0
  8. package/dist/commands/architect.js +83 -0
  9. package/dist/commands/architect.js.map +1 -0
  10. package/dist/commands/code.d.ts +2 -0
  11. package/dist/commands/code.d.ts.map +1 -0
  12. package/dist/commands/code.js +111 -0
  13. package/dist/commands/code.js.map +1 -0
  14. package/dist/commands/config.d.ts +11 -0
  15. package/dist/commands/config.d.ts.map +1 -0
  16. package/dist/commands/config.js +101 -0
  17. package/dist/commands/config.js.map +1 -0
  18. package/dist/commands/doctor.d.ts +2 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +36 -0
  21. package/dist/commands/doctor.js.map +1 -0
  22. package/dist/commands/explain.d.ts +2 -0
  23. package/dist/commands/explain.d.ts.map +1 -0
  24. package/dist/commands/explain.js +41 -0
  25. package/dist/commands/explain.js.map +1 -0
  26. package/dist/commands/feature.d.ts +2 -0
  27. package/dist/commands/feature.d.ts.map +1 -0
  28. package/dist/commands/feature.js +49 -0
  29. package/dist/commands/feature.js.map +1 -0
  30. package/dist/commands/init.d.ts +2 -0
  31. package/dist/commands/init.d.ts.map +1 -0
  32. package/dist/commands/init.js +63 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/plan.d.ts +2 -0
  35. package/dist/commands/plan.d.ts.map +1 -0
  36. package/dist/commands/plan.js +61 -0
  37. package/dist/commands/plan.js.map +1 -0
  38. package/dist/commands/review.d.ts +2 -0
  39. package/dist/commands/review.d.ts.map +1 -0
  40. package/dist/commands/review.js +41 -0
  41. package/dist/commands/review.js.map +1 -0
  42. package/dist/commands/test.d.ts +2 -0
  43. package/dist/commands/test.d.ts.map +1 -0
  44. package/dist/commands/test.js +48 -0
  45. package/dist/commands/test.js.map +1 -0
  46. package/dist/commands/update.d.ts +2 -0
  47. package/dist/commands/update.d.ts.map +1 -0
  48. package/dist/commands/update.js +31 -0
  49. package/dist/commands/update.js.map +1 -0
  50. package/dist/commands/verify.d.ts +2 -0
  51. package/dist/commands/verify.d.ts.map +1 -0
  52. package/dist/commands/verify.js +64 -0
  53. package/dist/commands/verify.js.map +1 -0
  54. package/dist/config/loader.d.ts +8 -0
  55. package/dist/config/loader.d.ts.map +1 -0
  56. package/dist/config/loader.js +35 -0
  57. package/dist/config/loader.js.map +1 -0
  58. package/dist/config/schema.d.ts +25 -0
  59. package/dist/config/schema.d.ts.map +1 -0
  60. package/dist/config/schema.js +19 -0
  61. package/dist/config/schema.js.map +1 -0
  62. package/dist/core/llm/client.d.ts +14 -0
  63. package/dist/core/llm/client.d.ts.map +1 -0
  64. package/dist/core/llm/client.js +28 -0
  65. package/dist/core/llm/client.js.map +1 -0
  66. package/dist/core/prompts/roles.d.ts +11 -0
  67. package/dist/core/prompts/roles.d.ts.map +1 -0
  68. package/dist/core/prompts/roles.js +238 -0
  69. package/dist/core/prompts/roles.js.map +1 -0
  70. package/dist/core/rules.d.ts +14 -0
  71. package/dist/core/rules.d.ts.map +1 -0
  72. package/dist/core/rules.js +39 -0
  73. package/dist/core/rules.js.map +1 -0
  74. package/dist/core/scanner.d.ts +6 -0
  75. package/dist/core/scanner.d.ts.map +1 -0
  76. package/dist/core/scanner.js +21 -0
  77. package/dist/core/scanner.js.map +1 -0
  78. package/dist/core/scope.d.ts +11 -0
  79. package/dist/core/scope.d.ts.map +1 -0
  80. package/dist/core/scope.js +34 -0
  81. package/dist/core/scope.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +121 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/repl.d.ts +2 -0
  87. package/dist/repl.d.ts.map +1 -0
  88. package/dist/repl.js +148 -0
  89. package/dist/repl.js.map +1 -0
  90. 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,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -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,2 @@
1
+ export declare function planCommand(task: string): Promise<void>;
2
+ //# sourceMappingURL=plan.d.ts.map
@@ -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,2 @@
1
+ export declare function reviewCommand(file: string): Promise<void>;
2
+ //# sourceMappingURL=review.d.ts.map
@@ -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,2 @@
1
+ export declare function testCommand(file: string): Promise<void>;
2
+ //# sourceMappingURL=test.d.ts.map
@@ -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,2 @@
1
+ export declare function updateCommand(): Promise<void>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -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,2 @@
1
+ export declare function verifyCommand(): Promise<void>;
2
+ //# sourceMappingURL=verify.d.ts.map
@@ -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,8 @@
1
+ import { CodeCraftConfig } from './schema';
2
+ export declare class ConfigLoader {
3
+ private configPath;
4
+ constructor(cwd?: string);
5
+ load(): CodeCraftConfig | null;
6
+ exists(): boolean;
7
+ }
8
+ //# sourceMappingURL=loader.d.ts.map
@@ -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"}