codingbuddy 0.0.0-dev.20251219012240.c5ea765 → 0.0.0-dev.20251219022942.ae1c42d

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 (61) hide show
  1. package/README.md +132 -8
  2. package/dist/src/cli/cli.d.ts +10 -0
  3. package/dist/src/cli/cli.js +98 -0
  4. package/dist/src/cli/cli.js.map +1 -0
  5. package/dist/src/cli/cli.spec.d.ts +1 -0
  6. package/dist/src/cli/cli.spec.js +84 -0
  7. package/dist/src/cli/cli.spec.js.map +1 -0
  8. package/dist/src/cli/cli.types.d.ts +18 -0
  9. package/dist/src/cli/cli.types.js +3 -0
  10. package/dist/src/cli/cli.types.js.map +1 -0
  11. package/dist/src/cli/index.d.ts +6 -0
  12. package/dist/src/cli/index.js +15 -0
  13. package/dist/src/cli/index.js.map +1 -0
  14. package/dist/src/cli/init/config.generator.d.ts +16 -0
  15. package/dist/src/cli/init/config.generator.js +70 -0
  16. package/dist/src/cli/init/config.generator.js.map +1 -0
  17. package/dist/src/cli/init/config.generator.spec.d.ts +1 -0
  18. package/dist/src/cli/init/config.generator.spec.js +182 -0
  19. package/dist/src/cli/init/config.generator.spec.js.map +1 -0
  20. package/dist/src/cli/init/config.writer.d.ts +10 -0
  21. package/dist/src/cli/init/config.writer.js +40 -0
  22. package/dist/src/cli/init/config.writer.js.map +1 -0
  23. package/dist/src/cli/init/config.writer.spec.d.ts +1 -0
  24. package/dist/src/cli/init/config.writer.spec.js +112 -0
  25. package/dist/src/cli/init/config.writer.spec.js.map +1 -0
  26. package/dist/src/cli/init/index.d.ts +5 -0
  27. package/dist/src/cli/init/index.js +16 -0
  28. package/dist/src/cli/init/index.js.map +1 -0
  29. package/dist/src/cli/init/init.command.d.ts +3 -0
  30. package/dist/src/cli/init/init.command.js +80 -0
  31. package/dist/src/cli/init/init.command.js.map +1 -0
  32. package/dist/src/cli/init/init.command.spec.d.ts +1 -0
  33. package/dist/src/cli/init/init.command.spec.js +227 -0
  34. package/dist/src/cli/init/init.command.spec.js.map +1 -0
  35. package/dist/src/cli/init/prompt.builder.d.ts +7 -0
  36. package/dist/src/cli/init/prompt.builder.js +222 -0
  37. package/dist/src/cli/init/prompt.builder.js.map +1 -0
  38. package/dist/src/cli/init/prompt.builder.spec.d.ts +1 -0
  39. package/dist/src/cli/init/prompt.builder.spec.js +199 -0
  40. package/dist/src/cli/init/prompt.builder.spec.js.map +1 -0
  41. package/dist/src/cli/utils/console.d.ts +18 -0
  42. package/dist/src/cli/utils/console.js +83 -0
  43. package/dist/src/cli/utils/console.js.map +1 -0
  44. package/dist/src/cli/utils/console.spec.d.ts +1 -0
  45. package/dist/src/cli/utils/console.spec.js +100 -0
  46. package/dist/src/cli/utils/console.spec.js.map +1 -0
  47. package/dist/src/cli/utils/index.d.ts +2 -0
  48. package/dist/src/cli/utils/index.js +7 -0
  49. package/dist/src/cli/utils/index.js.map +1 -0
  50. package/dist/src/config/config.schema.d.ts +30 -30
  51. package/dist/src/main.js +0 -0
  52. package/dist/src/mcp/mcp.module.js +2 -1
  53. package/dist/src/mcp/mcp.module.js.map +1 -1
  54. package/dist/src/mcp/mcp.service.d.ts +10 -1
  55. package/dist/src/mcp/mcp.service.js +139 -64
  56. package/dist/src/mcp/mcp.service.js.map +1 -1
  57. package/dist/src/mcp/mcp.service.spec.d.ts +1 -0
  58. package/dist/src/mcp/mcp.service.spec.js +262 -0
  59. package/dist/src/mcp/mcp.service.spec.js.map +1 -0
  60. package/dist/tsconfig.tsbuildinfo +1 -1
  61. package/package.json +7 -5
@@ -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 {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const fs = require("fs/promises");
5
+ const path = require("path");
6
+ const config_writer_1 = require("./config.writer");
7
+ vitest_1.vi.mock('fs/promises');
8
+ (0, vitest_1.describe)('config.writer', () => {
9
+ const mockConfig = {
10
+ projectName: 'test-app',
11
+ language: 'ko',
12
+ techStack: {
13
+ frontend: ['React', 'TypeScript'],
14
+ },
15
+ conventions: {
16
+ naming: {
17
+ files: 'kebab-case',
18
+ components: 'PascalCase',
19
+ },
20
+ semicolons: true,
21
+ quotes: 'single',
22
+ },
23
+ };
24
+ (0, vitest_1.beforeEach)(() => {
25
+ vitest_1.vi.resetAllMocks();
26
+ });
27
+ (0, vitest_1.describe)('CONFIG_FILE_NAMES', () => {
28
+ (0, vitest_1.it)('should include js and json config file names', () => {
29
+ (0, vitest_1.expect)(config_writer_1.CONFIG_FILE_NAMES).toContain('codingbuddy.config.js');
30
+ (0, vitest_1.expect)(config_writer_1.CONFIG_FILE_NAMES).toContain('codingbuddy.config.json');
31
+ });
32
+ });
33
+ (0, vitest_1.describe)('formatConfigAsJs', () => {
34
+ (0, vitest_1.it)('should format config as JS module export', () => {
35
+ const result = (0, config_writer_1.formatConfigAsJs)(mockConfig);
36
+ (0, vitest_1.expect)(result).toContain('/** @type {import');
37
+ (0, vitest_1.expect)(result).toContain('module.exports');
38
+ (0, vitest_1.expect)(result).toContain('projectName');
39
+ (0, vitest_1.expect)(result).toContain('test-app');
40
+ });
41
+ (0, vitest_1.it)('should include proper JSDoc type annotation', () => {
42
+ const result = (0, config_writer_1.formatConfigAsJs)(mockConfig);
43
+ (0, vitest_1.expect)(result).toMatch(/@type.*CodingBuddyConfig/);
44
+ });
45
+ (0, vitest_1.it)('should format nested objects correctly', () => {
46
+ const result = (0, config_writer_1.formatConfigAsJs)(mockConfig);
47
+ (0, vitest_1.expect)(result).toContain('techStack');
48
+ (0, vitest_1.expect)(result).toContain('frontend');
49
+ (0, vitest_1.expect)(result).toContain('React');
50
+ });
51
+ (0, vitest_1.it)('should handle empty config', () => {
52
+ const result = (0, config_writer_1.formatConfigAsJs)({});
53
+ (0, vitest_1.expect)(result).toContain('module.exports');
54
+ (0, vitest_1.expect)(result).toContain('{}');
55
+ });
56
+ });
57
+ (0, vitest_1.describe)('formatConfigAsJson', () => {
58
+ (0, vitest_1.it)('should format config as JSON with indentation', () => {
59
+ const result = (0, config_writer_1.formatConfigAsJson)(mockConfig);
60
+ (0, vitest_1.expect)(result).toContain('"projectName"');
61
+ (0, vitest_1.expect)(result).toContain('"test-app"');
62
+ (0, vitest_1.expect)(result).toContain('\n');
63
+ });
64
+ (0, vitest_1.it)('should produce valid JSON', () => {
65
+ const result = (0, config_writer_1.formatConfigAsJson)(mockConfig);
66
+ (0, vitest_1.expect)(() => JSON.parse(result)).not.toThrow();
67
+ });
68
+ });
69
+ (0, vitest_1.describe)('findExistingConfig', () => {
70
+ (0, vitest_1.it)('should return path if config file exists', async () => {
71
+ vitest_1.vi.mocked(fs.access).mockResolvedValueOnce(undefined);
72
+ const result = await (0, config_writer_1.findExistingConfig)('/project');
73
+ (0, vitest_1.expect)(result).toBe(path.join('/project', 'codingbuddy.config.js'));
74
+ });
75
+ (0, vitest_1.it)('should check multiple file names', async () => {
76
+ vitest_1.vi.mocked(fs.access)
77
+ .mockRejectedValueOnce(new Error('ENOENT'))
78
+ .mockResolvedValueOnce(undefined);
79
+ const result = await (0, config_writer_1.findExistingConfig)('/project');
80
+ (0, vitest_1.expect)(result).toBe(path.join('/project', 'codingbuddy.config.json'));
81
+ });
82
+ (0, vitest_1.it)('should return null if no config exists', async () => {
83
+ vitest_1.vi.mocked(fs.access).mockRejectedValue(new Error('ENOENT'));
84
+ const result = await (0, config_writer_1.findExistingConfig)('/project');
85
+ (0, vitest_1.expect)(result).toBeNull();
86
+ });
87
+ });
88
+ (0, vitest_1.describe)('writeConfig', () => {
89
+ (0, vitest_1.it)('should write JS config file by default', async () => {
90
+ vitest_1.vi.mocked(fs.writeFile).mockResolvedValue(undefined);
91
+ const result = await (0, config_writer_1.writeConfig)('/project', mockConfig);
92
+ (0, vitest_1.expect)(result).toContain('codingbuddy.config.js');
93
+ (0, vitest_1.expect)(fs.writeFile).toHaveBeenCalledWith(vitest_1.expect.stringContaining('codingbuddy.config.js'), vitest_1.expect.stringContaining('module.exports'), 'utf-8');
94
+ });
95
+ (0, vitest_1.it)('should write JSON config when format is json', async () => {
96
+ vitest_1.vi.mocked(fs.writeFile).mockResolvedValue(undefined);
97
+ const result = await (0, config_writer_1.writeConfig)('/project', mockConfig, { format: 'json' });
98
+ (0, vitest_1.expect)(result).toContain('codingbuddy.config.json');
99
+ (0, vitest_1.expect)(fs.writeFile).toHaveBeenCalledWith(vitest_1.expect.stringContaining('codingbuddy.config.json'), vitest_1.expect.stringContaining('"projectName"'), 'utf-8');
100
+ });
101
+ (0, vitest_1.it)('should return the written file path', async () => {
102
+ vitest_1.vi.mocked(fs.writeFile).mockResolvedValue(undefined);
103
+ const result = await (0, config_writer_1.writeConfig)('/project', mockConfig);
104
+ (0, vitest_1.expect)(result).toBe(path.join('/project', 'codingbuddy.config.js'));
105
+ });
106
+ (0, vitest_1.it)('should throw on write error', async () => {
107
+ vitest_1.vi.mocked(fs.writeFile).mockRejectedValue(new Error('Permission denied'));
108
+ await (0, vitest_1.expect)((0, config_writer_1.writeConfig)('/project', mockConfig)).rejects.toThrow('Permission denied');
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=config.writer.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.writer.spec.js","sourceRoot":"","sources":["../../../../src/cli/init/config.writer.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { runInit, getApiKey } from './init.command';
2
+ export { buildSystemPrompt, buildAnalysisPrompt } from './prompt.builder';
3
+ export { ConfigGenerator } from './config.generator';
4
+ export { writeConfig, findExistingConfig, CONFIG_FILE_NAMES } from './config.writer';
5
+ export type { ConfigFormat, WriteConfigOptions } from './config.writer';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_FILE_NAMES = exports.findExistingConfig = exports.writeConfig = exports.ConfigGenerator = exports.buildAnalysisPrompt = exports.buildSystemPrompt = exports.getApiKey = exports.runInit = void 0;
4
+ var init_command_1 = require("./init.command");
5
+ Object.defineProperty(exports, "runInit", { enumerable: true, get: function () { return init_command_1.runInit; } });
6
+ Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return init_command_1.getApiKey; } });
7
+ var prompt_builder_1 = require("./prompt.builder");
8
+ Object.defineProperty(exports, "buildSystemPrompt", { enumerable: true, get: function () { return prompt_builder_1.buildSystemPrompt; } });
9
+ Object.defineProperty(exports, "buildAnalysisPrompt", { enumerable: true, get: function () { return prompt_builder_1.buildAnalysisPrompt; } });
10
+ var config_generator_1 = require("./config.generator");
11
+ Object.defineProperty(exports, "ConfigGenerator", { enumerable: true, get: function () { return config_generator_1.ConfigGenerator; } });
12
+ var config_writer_1 = require("./config.writer");
13
+ Object.defineProperty(exports, "writeConfig", { enumerable: true, get: function () { return config_writer_1.writeConfig; } });
14
+ Object.defineProperty(exports, "findExistingConfig", { enumerable: true, get: function () { return config_writer_1.findExistingConfig; } });
15
+ Object.defineProperty(exports, "CONFIG_FILE_NAMES", { enumerable: true, get: function () { return config_writer_1.CONFIG_FILE_NAMES; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/init/index.ts"],"names":[],"mappings":";;;AAAA,+CAAoD;AAA3C,uGAAA,OAAO,OAAA;AAAE,yGAAA,SAAS,OAAA;AAC3B,mDAA0E;AAAjE,mHAAA,iBAAiB,OAAA;AAAE,qHAAA,mBAAmB,OAAA;AAC/C,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,iDAAqF;AAA5E,4GAAA,WAAW,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAAE,kHAAA,iBAAiB,OAAA"}
@@ -0,0 +1,3 @@
1
+ import type { InitOptions, InitResult } from '../cli.types';
2
+ export declare function getApiKey(options: InitOptions): string | null;
3
+ export declare function runInit(options: InitOptions): Promise<InitResult>;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getApiKey = getApiKey;
4
+ exports.runInit = runInit;
5
+ const analyzer_1 = require("../../analyzer");
6
+ const config_generator_1 = require("./config.generator");
7
+ const config_writer_1 = require("./config.writer");
8
+ const console_1 = require("../utils/console");
9
+ function getApiKey(options) {
10
+ if (options.apiKey) {
11
+ return options.apiKey;
12
+ }
13
+ if (process.env.ANTHROPIC_API_KEY) {
14
+ return process.env.ANTHROPIC_API_KEY;
15
+ }
16
+ return null;
17
+ }
18
+ async function runInit(options) {
19
+ const console = (0, console_1.createConsoleUtils)();
20
+ try {
21
+ const apiKey = getApiKey(options);
22
+ if (!apiKey) {
23
+ console.log.error('No API key provided.');
24
+ console.log.info('Set ANTHROPIC_API_KEY environment variable or use --api-key option.');
25
+ return {
26
+ success: false,
27
+ error: 'No API key provided. Set ANTHROPIC_API_KEY environment variable.',
28
+ };
29
+ }
30
+ const existingConfig = await (0, config_writer_1.findExistingConfig)(options.projectRoot);
31
+ if (existingConfig && !options.force) {
32
+ console.log.error(`Configuration file already exists: ${existingConfig}`);
33
+ console.log.info('Use --force to overwrite.');
34
+ return {
35
+ success: false,
36
+ error: `Configuration file already exists: ${existingConfig}`,
37
+ };
38
+ }
39
+ if (existingConfig && options.force) {
40
+ console.log.warn(`Overwriting existing config: ${existingConfig}`);
41
+ }
42
+ console.spinner.start('Analyzing project...');
43
+ const analyzer = new analyzer_1.AnalyzerService();
44
+ const analysis = await analyzer.analyzeProject(options.projectRoot);
45
+ console.spinner.succeed('Project analysis complete');
46
+ if (analysis.packageInfo) {
47
+ console.log.step('📦', `Package: ${analysis.packageInfo.name}`);
48
+ }
49
+ if (analysis.detectedPatterns.length > 0) {
50
+ console.log.step('🏗️', `Patterns: ${analysis.detectedPatterns.join(', ')}`);
51
+ }
52
+ console.log.step('📁', `Files: ${analysis.directoryStructure.totalFiles}`);
53
+ console.spinner.start('AI is generating configuration...');
54
+ const generator = new config_generator_1.ConfigGenerator({ apiKey });
55
+ const config = await generator.generate(analysis);
56
+ console.spinner.succeed('Configuration generated');
57
+ console.spinner.start('Writing configuration file...');
58
+ const configPath = await (0, config_writer_1.writeConfig)(options.projectRoot, config, {
59
+ format: options.format,
60
+ });
61
+ console.spinner.succeed(`Configuration saved to ${configPath}`);
62
+ console.log.success('');
63
+ console.log.step('✅', `codingbuddy.config.${options.format} created!`);
64
+ console.log.info('');
65
+ console.log.info('Please review the generated configuration.');
66
+ return {
67
+ success: true,
68
+ configPath,
69
+ };
70
+ }
71
+ catch (error) {
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ console.spinner.fail(`Error: ${message}`);
74
+ return {
75
+ success: false,
76
+ error: message,
77
+ };
78
+ }
79
+ }
80
+ //# sourceMappingURL=init.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../../src/cli/init/init.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};