codingbuddy 0.0.0-dev.20251219012240.c5ea765 → 0.0.0-dev.20251219020401.c1905b0

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 (60) hide show
  1. package/dist/src/cli/cli.d.ts +10 -0
  2. package/dist/src/cli/cli.js +98 -0
  3. package/dist/src/cli/cli.js.map +1 -0
  4. package/dist/src/cli/cli.spec.d.ts +1 -0
  5. package/dist/src/cli/cli.spec.js +84 -0
  6. package/dist/src/cli/cli.spec.js.map +1 -0
  7. package/dist/src/cli/cli.types.d.ts +18 -0
  8. package/dist/src/cli/cli.types.js +3 -0
  9. package/dist/src/cli/cli.types.js.map +1 -0
  10. package/dist/src/cli/index.d.ts +6 -0
  11. package/dist/src/cli/index.js +15 -0
  12. package/dist/src/cli/index.js.map +1 -0
  13. package/dist/src/cli/init/config.generator.d.ts +16 -0
  14. package/dist/src/cli/init/config.generator.js +70 -0
  15. package/dist/src/cli/init/config.generator.js.map +1 -0
  16. package/dist/src/cli/init/config.generator.spec.d.ts +1 -0
  17. package/dist/src/cli/init/config.generator.spec.js +182 -0
  18. package/dist/src/cli/init/config.generator.spec.js.map +1 -0
  19. package/dist/src/cli/init/config.writer.d.ts +10 -0
  20. package/dist/src/cli/init/config.writer.js +40 -0
  21. package/dist/src/cli/init/config.writer.js.map +1 -0
  22. package/dist/src/cli/init/config.writer.spec.d.ts +1 -0
  23. package/dist/src/cli/init/config.writer.spec.js +112 -0
  24. package/dist/src/cli/init/config.writer.spec.js.map +1 -0
  25. package/dist/src/cli/init/index.d.ts +5 -0
  26. package/dist/src/cli/init/index.js +16 -0
  27. package/dist/src/cli/init/index.js.map +1 -0
  28. package/dist/src/cli/init/init.command.d.ts +3 -0
  29. package/dist/src/cli/init/init.command.js +80 -0
  30. package/dist/src/cli/init/init.command.js.map +1 -0
  31. package/dist/src/cli/init/init.command.spec.d.ts +1 -0
  32. package/dist/src/cli/init/init.command.spec.js +227 -0
  33. package/dist/src/cli/init/init.command.spec.js.map +1 -0
  34. package/dist/src/cli/init/prompt.builder.d.ts +7 -0
  35. package/dist/src/cli/init/prompt.builder.js +222 -0
  36. package/dist/src/cli/init/prompt.builder.js.map +1 -0
  37. package/dist/src/cli/init/prompt.builder.spec.d.ts +1 -0
  38. package/dist/src/cli/init/prompt.builder.spec.js +199 -0
  39. package/dist/src/cli/init/prompt.builder.spec.js.map +1 -0
  40. package/dist/src/cli/utils/console.d.ts +18 -0
  41. package/dist/src/cli/utils/console.js +83 -0
  42. package/dist/src/cli/utils/console.js.map +1 -0
  43. package/dist/src/cli/utils/console.spec.d.ts +1 -0
  44. package/dist/src/cli/utils/console.spec.js +100 -0
  45. package/dist/src/cli/utils/console.spec.js.map +1 -0
  46. package/dist/src/cli/utils/index.d.ts +2 -0
  47. package/dist/src/cli/utils/index.js +7 -0
  48. package/dist/src/cli/utils/index.js.map +1 -0
  49. package/dist/src/config/config.schema.d.ts +30 -30
  50. package/dist/src/main.js +0 -0
  51. package/dist/src/mcp/mcp.module.js +2 -1
  52. package/dist/src/mcp/mcp.module.js.map +1 -1
  53. package/dist/src/mcp/mcp.service.d.ts +10 -1
  54. package/dist/src/mcp/mcp.service.js +139 -64
  55. package/dist/src/mcp/mcp.service.js.map +1 -1
  56. package/dist/src/mcp/mcp.service.spec.d.ts +1 -0
  57. package/dist/src/mcp/mcp.service.spec.js +262 -0
  58. package/dist/src/mcp/mcp.service.spec.js.map +1 -0
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +7 -5
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import type { InitOptions } from './cli.types';
3
+ export interface ParsedArgs {
4
+ command: 'init' | 'help' | 'version';
5
+ options: Partial<InitOptions>;
6
+ }
7
+ export declare function parseArgs(args: string[]): ParsedArgs;
8
+ export declare function printUsage(): void;
9
+ export declare function printVersion(): void;
10
+ export declare function main(args?: string[]): Promise<void>;
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.parseArgs = parseArgs;
5
+ exports.printUsage = printUsage;
6
+ exports.printVersion = printVersion;
7
+ exports.main = main;
8
+ const init_1 = require("./init");
9
+ const VERSION = '1.0.0';
10
+ function parseArgs(args) {
11
+ const options = {
12
+ projectRoot: process.cwd(),
13
+ format: 'js',
14
+ force: false,
15
+ };
16
+ if (args.includes('--help') || args.includes('-h')) {
17
+ return { command: 'help', options };
18
+ }
19
+ if (args.includes('--version') || args.includes('-v')) {
20
+ return { command: 'version', options };
21
+ }
22
+ const command = args[0];
23
+ if (command !== 'init') {
24
+ return { command: 'help', options };
25
+ }
26
+ for (let i = 1; i < args.length; i++) {
27
+ const arg = args[i];
28
+ if (arg === '--force' || arg === '-f') {
29
+ options.force = true;
30
+ }
31
+ else if (arg === '--format') {
32
+ const format = args[++i];
33
+ if (format === 'js' || format === 'json') {
34
+ options.format = format;
35
+ }
36
+ }
37
+ else if (arg === '--api-key') {
38
+ options.apiKey = args[++i];
39
+ }
40
+ else if (!arg.startsWith('-')) {
41
+ options.projectRoot = arg;
42
+ }
43
+ }
44
+ return { command: 'init', options };
45
+ }
46
+ function printUsage() {
47
+ const usage = `
48
+ CodingBuddy CLI - AI-powered project configuration generator
49
+
50
+ Usage:
51
+ codingbuddy init [path] [options] Initialize configuration
52
+ codingbuddy --help Show this help
53
+ codingbuddy --version Show version
54
+
55
+ Options:
56
+ --format <js|json> Output format (default: js)
57
+ --force, -f Overwrite existing config
58
+ --api-key <key> Anthropic API key (or set ANTHROPIC_API_KEY env)
59
+
60
+ Examples:
61
+ codingbuddy init Initialize in current directory
62
+ codingbuddy init ./my-project Initialize in specific directory
63
+ codingbuddy init --format json Generate JSON config
64
+ codingbuddy init --force Overwrite existing config
65
+
66
+ Environment:
67
+ ANTHROPIC_API_KEY API key for AI generation
68
+ `;
69
+ process.stdout.write(usage + '\n');
70
+ }
71
+ function printVersion() {
72
+ process.stdout.write(`codingbuddy v${VERSION}\n`);
73
+ }
74
+ async function main(args = process.argv.slice(2)) {
75
+ const { command, options } = parseArgs(args);
76
+ switch (command) {
77
+ case 'help':
78
+ printUsage();
79
+ break;
80
+ case 'version':
81
+ printVersion();
82
+ break;
83
+ case 'init': {
84
+ const result = await (0, init_1.runInit)(options);
85
+ if (!result.success) {
86
+ process.exitCode = 1;
87
+ }
88
+ break;
89
+ }
90
+ }
91
+ }
92
+ if (require.main === module) {
93
+ main().catch((error) => {
94
+ console.error('Fatal error:', error);
95
+ process.exitCode = 1;
96
+ });
97
+ }
98
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const cli_1 = require("./cli");
5
+ (0, vitest_1.describe)('cli', () => {
6
+ (0, vitest_1.describe)('parseArgs', () => {
7
+ (0, vitest_1.it)('should parse init command', () => {
8
+ const result = (0, cli_1.parseArgs)(['init']);
9
+ (0, vitest_1.expect)(result.command).toBe('init');
10
+ });
11
+ (0, vitest_1.it)('should parse init with --force flag', () => {
12
+ const result = (0, cli_1.parseArgs)(['init', '--force']);
13
+ (0, vitest_1.expect)(result.command).toBe('init');
14
+ (0, vitest_1.expect)(result.options.force).toBe(true);
15
+ });
16
+ (0, vitest_1.it)('should parse init with --format option', () => {
17
+ const result = (0, cli_1.parseArgs)(['init', '--format', 'json']);
18
+ (0, vitest_1.expect)(result.command).toBe('init');
19
+ (0, vitest_1.expect)(result.options.format).toBe('json');
20
+ });
21
+ (0, vitest_1.it)('should parse init with --api-key option', () => {
22
+ const result = (0, cli_1.parseArgs)(['init', '--api-key', 'test-key']);
23
+ (0, vitest_1.expect)(result.command).toBe('init');
24
+ (0, vitest_1.expect)(result.options.apiKey).toBe('test-key');
25
+ });
26
+ (0, vitest_1.it)('should parse help command', () => {
27
+ const result = (0, cli_1.parseArgs)(['--help']);
28
+ (0, vitest_1.expect)(result.command).toBe('help');
29
+ });
30
+ (0, vitest_1.it)('should parse version command', () => {
31
+ const result = (0, cli_1.parseArgs)(['--version']);
32
+ (0, vitest_1.expect)(result.command).toBe('version');
33
+ });
34
+ (0, vitest_1.it)('should return help for empty args', () => {
35
+ const result = (0, cli_1.parseArgs)([]);
36
+ (0, vitest_1.expect)(result.command).toBe('help');
37
+ });
38
+ (0, vitest_1.it)('should return help for unknown command', () => {
39
+ const result = (0, cli_1.parseArgs)(['unknown']);
40
+ (0, vitest_1.expect)(result.command).toBe('help');
41
+ });
42
+ (0, vitest_1.it)('should use current directory as default projectRoot', () => {
43
+ const result = (0, cli_1.parseArgs)(['init']);
44
+ (0, vitest_1.expect)(result.options.projectRoot).toBe(process.cwd());
45
+ });
46
+ (0, vitest_1.it)('should parse custom project root', () => {
47
+ const result = (0, cli_1.parseArgs)(['init', '/custom/path']);
48
+ (0, vitest_1.expect)(result.options.projectRoot).toBe('/custom/path');
49
+ });
50
+ });
51
+ (0, vitest_1.describe)('printUsage', () => {
52
+ let stdoutWrite;
53
+ (0, vitest_1.beforeEach)(() => {
54
+ stdoutWrite = vitest_1.vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
55
+ });
56
+ (0, vitest_1.afterEach)(() => {
57
+ vitest_1.vi.restoreAllMocks();
58
+ });
59
+ (0, vitest_1.it)('should print usage information', () => {
60
+ (0, cli_1.printUsage)();
61
+ (0, vitest_1.expect)(stdoutWrite).toHaveBeenCalled();
62
+ const output = stdoutWrite.mock.calls.map((c) => c[0]).join('');
63
+ (0, vitest_1.expect)(output).toContain('codingbuddy');
64
+ (0, vitest_1.expect)(output).toContain('init');
65
+ (0, vitest_1.expect)(output).toContain('--help');
66
+ });
67
+ });
68
+ (0, vitest_1.describe)('printVersion', () => {
69
+ let stdoutWrite;
70
+ (0, vitest_1.beforeEach)(() => {
71
+ stdoutWrite = vitest_1.vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
72
+ });
73
+ (0, vitest_1.afterEach)(() => {
74
+ vitest_1.vi.restoreAllMocks();
75
+ });
76
+ (0, vitest_1.it)('should print version', () => {
77
+ (0, cli_1.printVersion)();
78
+ (0, vitest_1.expect)(stdoutWrite).toHaveBeenCalled();
79
+ const output = stdoutWrite.mock.calls.map((c) => c[0]).join('');
80
+ (0, vitest_1.expect)(output).toMatch(/\d+\.\d+\.\d+/);
81
+ });
82
+ });
83
+ });
84
+ //# sourceMappingURL=cli.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.spec.js","sourceRoot":"","sources":["../../../src/cli/cli.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type CommandHandler = (args: string[]) => Promise<void>;
2
+ export interface CliCommand {
3
+ name: string;
4
+ description: string;
5
+ handler: CommandHandler;
6
+ }
7
+ export interface InitOptions {
8
+ projectRoot: string;
9
+ format: 'js' | 'json';
10
+ force: boolean;
11
+ apiKey?: string;
12
+ }
13
+ export interface InitResult {
14
+ success: boolean;
15
+ configPath?: string;
16
+ error?: string;
17
+ }
18
+ export type LogLevel = 'info' | 'success' | 'warn' | 'error';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=cli.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.types.js","sourceRoot":"","sources":["../../../src/cli/cli.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export { main, parseArgs, printUsage, printVersion } from './cli';
2
+ export type { ParsedArgs } from './cli';
3
+ export type { InitOptions, InitResult, CliCommand, CommandHandler, LogLevel } from './cli.types';
4
+ export { runInit, getApiKey } from './init';
5
+ export { createConsoleUtils, consoleUtils } from './utils';
6
+ export type { ConsoleUtils } from './utils';
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.consoleUtils = exports.createConsoleUtils = exports.getApiKey = exports.runInit = exports.printVersion = exports.printUsage = exports.parseArgs = exports.main = void 0;
4
+ var cli_1 = require("./cli");
5
+ Object.defineProperty(exports, "main", { enumerable: true, get: function () { return cli_1.main; } });
6
+ Object.defineProperty(exports, "parseArgs", { enumerable: true, get: function () { return cli_1.parseArgs; } });
7
+ Object.defineProperty(exports, "printUsage", { enumerable: true, get: function () { return cli_1.printUsage; } });
8
+ Object.defineProperty(exports, "printVersion", { enumerable: true, get: function () { return cli_1.printVersion; } });
9
+ var init_1 = require("./init");
10
+ Object.defineProperty(exports, "runInit", { enumerable: true, get: function () { return init_1.runInit; } });
11
+ Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return init_1.getApiKey; } });
12
+ var utils_1 = require("./utils");
13
+ Object.defineProperty(exports, "createConsoleUtils", { enumerable: true, get: function () { return utils_1.createConsoleUtils; } });
14
+ Object.defineProperty(exports, "consoleUtils", { enumerable: true, get: function () { return utils_1.consoleUtils; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";;;AAAA,6BAAkE;AAAzD,2FAAA,IAAI,OAAA;AAAE,gGAAA,SAAS,OAAA;AAAE,iGAAA,UAAU,OAAA;AAAE,mGAAA,YAAY,OAAA;AAGlD,+BAA4C;AAAnC,+FAAA,OAAO,OAAA;AAAE,iGAAA,SAAS,OAAA;AAC3B,iCAA2D;AAAlD,2GAAA,kBAAkB,OAAA;AAAE,qGAAA,YAAY,OAAA"}
@@ -0,0 +1,16 @@
1
+ import type { ProjectAnalysis } from '../../analyzer';
2
+ import type { CodingBuddyConfig } from '../../config';
3
+ export interface ConfigGeneratorOptions {
4
+ apiKey: string;
5
+ model?: string;
6
+ maxTokens?: number;
7
+ }
8
+ export declare function extractJsonFromResponse(response: string): string | null;
9
+ export declare function parseJsonResponse(response: string): CodingBuddyConfig;
10
+ export declare class ConfigGenerator {
11
+ private client;
12
+ private model;
13
+ private maxTokens;
14
+ constructor(options: ConfigGeneratorOptions);
15
+ generate(analysis: ProjectAnalysis): Promise<CodingBuddyConfig>;
16
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigGenerator = void 0;
4
+ exports.extractJsonFromResponse = extractJsonFromResponse;
5
+ exports.parseJsonResponse = parseJsonResponse;
6
+ const sdk_1 = require("@anthropic-ai/sdk");
7
+ const config_schema_1 = require("../../config/config.schema");
8
+ const prompt_builder_1 = require("./prompt.builder");
9
+ const DEFAULT_MODEL = 'claude-sonnet-4-20250514';
10
+ const DEFAULT_MAX_TOKENS = 4096;
11
+ function extractJsonFromResponse(response) {
12
+ const codeBlockMatch = response.match(/```(?:json)?\s*([\s\S]*?)```/);
13
+ if (codeBlockMatch) {
14
+ return codeBlockMatch[1].trim();
15
+ }
16
+ const jsonMatch = response.match(/\{[\s\S]*\}/);
17
+ if (jsonMatch) {
18
+ return jsonMatch[0];
19
+ }
20
+ return null;
21
+ }
22
+ function parseJsonResponse(response) {
23
+ const jsonString = extractJsonFromResponse(response);
24
+ if (!jsonString) {
25
+ throw new Error('No valid JSON found in response');
26
+ }
27
+ let parsed;
28
+ try {
29
+ parsed = JSON.parse(jsonString);
30
+ }
31
+ catch {
32
+ throw new Error(`Invalid JSON in response: ${jsonString.substring(0, 100)}...`);
33
+ }
34
+ const validation = (0, config_schema_1.validateConfig)(parsed);
35
+ if (!validation.success) {
36
+ console.warn('Config validation warnings:', validation.errors);
37
+ }
38
+ return validation.data ?? parsed;
39
+ }
40
+ class ConfigGenerator {
41
+ constructor(options) {
42
+ this.client = new sdk_1.default({
43
+ apiKey: options.apiKey,
44
+ });
45
+ this.model = options.model ?? DEFAULT_MODEL;
46
+ this.maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
47
+ }
48
+ async generate(analysis) {
49
+ const systemPrompt = (0, prompt_builder_1.buildSystemPrompt)();
50
+ const userPrompt = (0, prompt_builder_1.buildAnalysisPrompt)(analysis);
51
+ const response = await this.client.messages.create({
52
+ model: this.model,
53
+ max_tokens: this.maxTokens,
54
+ system: systemPrompt,
55
+ messages: [
56
+ {
57
+ role: 'user',
58
+ content: userPrompt,
59
+ },
60
+ ],
61
+ });
62
+ const textContent = response.content.find((block) => block.type === 'text');
63
+ if (!textContent || textContent.type !== 'text') {
64
+ throw new Error('No text content in AI response');
65
+ }
66
+ return parseJsonResponse(textContent.text);
67
+ }
68
+ }
69
+ exports.ConfigGenerator = ConfigGenerator;
70
+ //# sourceMappingURL=config.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.generator.js","sourceRoot":"","sources":["../../../../src/cli/init/config.generator.ts"],"names":[],"mappings":";;;AAqCA,0DAcC;AAKD,8CAwBC;AA1ED,2CAA0C;AAG1C,8DAA4D;AAC5D,qDAA0E;AAiB1E,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAKjD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAKhC,SAAgB,uBAAuB,CAAC,QAAgB;IAEtD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACtE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAGD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAKD,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAErD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,6BAA6B,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IAGD,MAAM,UAAU,GAAG,IAAA,8BAAc,EAAC,MAAM,CAAC,CAAC;IAE1C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAGxB,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,IAAK,MAA4B,CAAC;AAC1D,CAAC;AAKD,MAAa,eAAe;IAK1B,YAAY,OAA+B;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,aAAS,CAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC3D,CAAC;IAKD,KAAK,CAAC,QAAQ,CAAC,QAAyB;QACtC,MAAM,YAAY,GAAG,IAAA,kCAAiB,GAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAA,oCAAmB,EAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,UAAU;iBACpB;aACF;SACF,CAAC,CAAC;QAGH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAE5E,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;CACF;AAzCD,0CAyCC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const config_generator_1 = require("./config.generator");
5
+ const mockCreate = vitest_1.vi.fn();
6
+ vitest_1.vi.mock('@anthropic-ai/sdk', () => ({
7
+ default: class MockAnthropic {
8
+ constructor() {
9
+ this.messages = {
10
+ create: mockCreate,
11
+ };
12
+ }
13
+ },
14
+ }));
15
+ (0, vitest_1.describe)('config.generator', () => {
16
+ const mockAnalysis = {
17
+ packageInfo: {
18
+ name: 'test-app',
19
+ version: '1.0.0',
20
+ dependencies: { react: '^18.0.0' },
21
+ devDependencies: { typescript: '^5.0.0' },
22
+ scripts: { dev: 'next dev' },
23
+ detectedFrameworks: [{ name: 'React', category: 'frontend', version: '^18.0.0' }],
24
+ },
25
+ directoryStructure: {
26
+ rootDirs: ['src', 'components'],
27
+ rootFiles: ['package.json'],
28
+ allFiles: ['src/index.ts'],
29
+ patterns: [],
30
+ totalFiles: 10,
31
+ totalDirs: 5,
32
+ },
33
+ configFiles: {
34
+ detected: ['tsconfig.json'],
35
+ },
36
+ codeSamples: [],
37
+ detectedPatterns: ['React Project'],
38
+ };
39
+ (0, vitest_1.describe)('extractJsonFromResponse', () => {
40
+ (0, vitest_1.it)('should extract JSON from plain JSON response', () => {
41
+ const response = '{"projectName": "test"}';
42
+ const result = (0, config_generator_1.extractJsonFromResponse)(response);
43
+ (0, vitest_1.expect)(result).toBe('{"projectName": "test"}');
44
+ });
45
+ (0, vitest_1.it)('should extract JSON from markdown code block', () => {
46
+ const response = '```json\n{"projectName": "test"}\n```';
47
+ const result = (0, config_generator_1.extractJsonFromResponse)(response);
48
+ (0, vitest_1.expect)(result).toBe('{"projectName": "test"}');
49
+ });
50
+ (0, vitest_1.it)('should extract JSON from response with surrounding text', () => {
51
+ const response = 'Here is the config:\n```json\n{"projectName": "test"}\n```\nEnjoy!';
52
+ const result = (0, config_generator_1.extractJsonFromResponse)(response);
53
+ (0, vitest_1.expect)(result).toBe('{"projectName": "test"}');
54
+ });
55
+ (0, vitest_1.it)('should handle response without code block markers', () => {
56
+ const response = 'Some text {"projectName": "test"} more text';
57
+ const result = (0, config_generator_1.extractJsonFromResponse)(response);
58
+ (0, vitest_1.expect)(result).toBe('{"projectName": "test"}');
59
+ });
60
+ (0, vitest_1.it)('should return null for invalid response', () => {
61
+ const response = 'No JSON here';
62
+ const result = (0, config_generator_1.extractJsonFromResponse)(response);
63
+ (0, vitest_1.expect)(result).toBeNull();
64
+ });
65
+ });
66
+ (0, vitest_1.describe)('parseJsonResponse', () => {
67
+ (0, vitest_1.it)('should parse valid JSON response', () => {
68
+ const response = '{"projectName": "test", "language": "ko"}';
69
+ const result = (0, config_generator_1.parseJsonResponse)(response);
70
+ (0, vitest_1.expect)(result).toEqual({ projectName: 'test', language: 'ko' });
71
+ });
72
+ (0, vitest_1.it)('should parse JSON from markdown code block', () => {
73
+ const response = '```json\n{"projectName": "test"}\n```';
74
+ const result = (0, config_generator_1.parseJsonResponse)(response);
75
+ (0, vitest_1.expect)(result).toEqual({ projectName: 'test' });
76
+ });
77
+ (0, vitest_1.it)('should parse complex nested config', () => {
78
+ const response = JSON.stringify({
79
+ projectName: 'my-app',
80
+ techStack: {
81
+ frontend: ['React', 'TypeScript'],
82
+ },
83
+ conventions: {
84
+ naming: {
85
+ files: 'kebab-case',
86
+ },
87
+ },
88
+ });
89
+ const result = (0, config_generator_1.parseJsonResponse)(response);
90
+ (0, vitest_1.expect)(result.projectName).toBe('my-app');
91
+ (0, vitest_1.expect)(result.techStack?.frontend).toContain('React');
92
+ (0, vitest_1.expect)(result.conventions?.naming?.files).toBe('kebab-case');
93
+ });
94
+ (0, vitest_1.it)('should throw on invalid JSON', () => {
95
+ const response = 'not valid json';
96
+ (0, vitest_1.expect)(() => (0, config_generator_1.parseJsonResponse)(response)).toThrow();
97
+ });
98
+ (0, vitest_1.it)('should validate against schema and filter invalid fields', () => {
99
+ const response = JSON.stringify({
100
+ projectName: 'test',
101
+ invalidField: 'should be ignored',
102
+ techStack: {
103
+ frontend: ['React'],
104
+ },
105
+ });
106
+ const result = (0, config_generator_1.parseJsonResponse)(response);
107
+ (0, vitest_1.expect)(result.projectName).toBe('test');
108
+ (0, vitest_1.expect)(result.techStack?.frontend).toContain('React');
109
+ });
110
+ });
111
+ (0, vitest_1.describe)('ConfigGenerator', () => {
112
+ let generator;
113
+ (0, vitest_1.beforeEach)(() => {
114
+ mockCreate.mockReset();
115
+ generator = new config_generator_1.ConfigGenerator({ apiKey: 'test-key' });
116
+ });
117
+ (0, vitest_1.it)('should generate config from analysis', async () => {
118
+ const mockResponse = {
119
+ content: [
120
+ {
121
+ type: 'text',
122
+ text: JSON.stringify({
123
+ projectName: 'test-app',
124
+ language: 'en',
125
+ techStack: {
126
+ frontend: ['React'],
127
+ },
128
+ }),
129
+ },
130
+ ],
131
+ };
132
+ mockCreate.mockResolvedValue(mockResponse);
133
+ const result = await generator.generate(mockAnalysis);
134
+ (0, vitest_1.expect)(result.projectName).toBe('test-app');
135
+ (0, vitest_1.expect)(result.techStack?.frontend).toContain('React');
136
+ });
137
+ (0, vitest_1.it)('should call Anthropic API with correct parameters', async () => {
138
+ const mockResponse = {
139
+ content: [{ type: 'text', text: '{"projectName": "test"}' }],
140
+ };
141
+ mockCreate.mockResolvedValue(mockResponse);
142
+ await generator.generate(mockAnalysis);
143
+ (0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
144
+ model: vitest_1.expect.any(String),
145
+ max_tokens: vitest_1.expect.any(Number),
146
+ system: vitest_1.expect.any(String),
147
+ messages: vitest_1.expect.arrayContaining([
148
+ vitest_1.expect.objectContaining({
149
+ role: 'user',
150
+ content: vitest_1.expect.any(String),
151
+ }),
152
+ ]),
153
+ }));
154
+ });
155
+ (0, vitest_1.it)('should throw on API error', async () => {
156
+ mockCreate.mockRejectedValue(new Error('API Error'));
157
+ await (0, vitest_1.expect)(generator.generate(mockAnalysis)).rejects.toThrow('API Error');
158
+ });
159
+ (0, vitest_1.it)('should throw on empty response', async () => {
160
+ const mockResponse = {
161
+ content: [],
162
+ };
163
+ mockCreate.mockResolvedValue(mockResponse);
164
+ await (0, vitest_1.expect)(generator.generate(mockAnalysis)).rejects.toThrow();
165
+ });
166
+ (0, vitest_1.it)('should use custom model when specified', async () => {
167
+ const customGenerator = new config_generator_1.ConfigGenerator({
168
+ apiKey: 'test-key',
169
+ model: 'claude-3-opus-20240229',
170
+ });
171
+ const mockResponse = {
172
+ content: [{ type: 'text', text: '{"projectName": "test"}' }],
173
+ };
174
+ mockCreate.mockResolvedValue(mockResponse);
175
+ await customGenerator.generate(mockAnalysis);
176
+ (0, vitest_1.expect)(mockCreate).toHaveBeenCalledWith(vitest_1.expect.objectContaining({
177
+ model: 'claude-3-opus-20240229',
178
+ }));
179
+ });
180
+ });
181
+ });
182
+ //# sourceMappingURL=config.generator.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.generator.spec.js","sourceRoot":"","sources":["../../../../src/cli/init/config.generator.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CodingBuddyConfig } from '../../config';
2
+ export declare const CONFIG_FILE_NAMES: readonly ["codingbuddy.config.js", "codingbuddy.config.json"];
3
+ export type ConfigFormat = 'js' | 'json';
4
+ export interface WriteConfigOptions {
5
+ format?: ConfigFormat;
6
+ }
7
+ export declare function formatConfigAsJs(config: CodingBuddyConfig): string;
8
+ export declare function formatConfigAsJson(config: CodingBuddyConfig): string;
9
+ export declare function findExistingConfig(projectRoot: string): Promise<string | null>;
10
+ export declare function writeConfig(projectRoot: string, config: CodingBuddyConfig, options?: WriteConfigOptions): Promise<string>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_FILE_NAMES = void 0;
4
+ exports.formatConfigAsJs = formatConfigAsJs;
5
+ exports.formatConfigAsJson = formatConfigAsJson;
6
+ exports.findExistingConfig = findExistingConfig;
7
+ exports.writeConfig = writeConfig;
8
+ const fs = require("fs/promises");
9
+ const path = require("path");
10
+ exports.CONFIG_FILE_NAMES = ['codingbuddy.config.js', 'codingbuddy.config.json'];
11
+ function formatConfigAsJs(config) {
12
+ const jsonContent = JSON.stringify(config, null, 2);
13
+ return `/** @type {import('codingbuddy').CodingBuddyConfig} */
14
+ module.exports = ${jsonContent};
15
+ `;
16
+ }
17
+ function formatConfigAsJson(config) {
18
+ return JSON.stringify(config, null, 2) + '\n';
19
+ }
20
+ async function findExistingConfig(projectRoot) {
21
+ for (const fileName of exports.CONFIG_FILE_NAMES) {
22
+ const filePath = path.join(projectRoot, fileName);
23
+ try {
24
+ await fs.access(filePath);
25
+ return filePath;
26
+ }
27
+ catch {
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ async function writeConfig(projectRoot, config, options = {}) {
33
+ const format = options.format ?? 'js';
34
+ const fileName = format === 'json' ? 'codingbuddy.config.json' : 'codingbuddy.config.js';
35
+ const content = format === 'json' ? formatConfigAsJson(config) : formatConfigAsJs(config);
36
+ const filePath = path.join(projectRoot, fileName);
37
+ await fs.writeFile(filePath, content, 'utf-8');
38
+ return filePath;
39
+ }
40
+ //# sourceMappingURL=config.writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.writer.js","sourceRoot":"","sources":["../../../../src/cli/init/config.writer.ts"],"names":[],"mappings":";;;AA+BA,4CAMC;AAKD,gDAEC;AAOD,gDAWC;AAUD,kCAgBC;AAlFD,kCAAkC;AAClC,6BAA6B;AAMhB,QAAA,iBAAiB,GAAG,CAAC,uBAAuB,EAAE,yBAAyB,CAAU,CAAC;AAkB/F,SAAgB,gBAAgB,CAAC,MAAyB;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,OAAO;mBACU,WAAW;CAC7B,CAAC;AACF,CAAC;AAKD,SAAgB,kBAAkB,CAAC,MAAyB;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAOM,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,KAAK,MAAM,QAAQ,IAAI,yBAAiB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;QAET,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAUM,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,MAAyB,EACzB,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAEzF,MAAM,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE1F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAElD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};