codingbuddy 0.0.0-canary.20251219012535.c6f28a6 → 0.0.0-canary.20251219030126.ebde4da

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
package/README.md CHANGED
@@ -1,12 +1,49 @@
1
- # Codingbuddy Rules MCP Server
1
+ # Codingbuddy MCP Server
2
2
 
3
- A NestJS-based Model Context Protocol (MCP) server that exposes the Multi-AI Rules System (`.ai-rules/`) to AI clients.
3
+ A NestJS-based Model Context Protocol (MCP) server that provides AI coding assistants with project-specific context and rules.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Initialize project configuration (AI-powered)
9
+ npx codingbuddy init
10
+
11
+ # This analyzes your project and creates codingbuddy.config.js
12
+ ```
4
13
 
5
14
  ## Features
6
15
 
7
- - **Resources**: Access rule files directly (`rules://core`, `rules://agents/frontend-developer`, etc.)
8
- - **Tools**: Search rules (`search_rules`) and get agent profiles (`get_agent_details`).
9
- - **Prompts**: Activate agents with context (`activate_agent`).
16
+ ### CLI Commands
17
+
18
+ | Command | Description |
19
+ |---------|-------------|
20
+ | `codingbuddy init` | Analyze project and generate configuration |
21
+ | `codingbuddy --help` | Show help |
22
+ | `codingbuddy --version` | Show version |
23
+
24
+ ### MCP Resources
25
+
26
+ | Resource | Description |
27
+ |----------|-------------|
28
+ | `config://project` | Project configuration (tech stack, architecture, language) |
29
+ | `rules://rules/core.md` | Core workflow rules |
30
+ | `rules://rules/project.md` | Project setup rules |
31
+ | `rules://agents/{name}.json` | Specialist agent definitions |
32
+
33
+ ### MCP Tools
34
+
35
+ | Tool | Description |
36
+ |------|-------------|
37
+ | `get_project_config` | Get project configuration settings |
38
+ | `search_rules` | Search through rules and guidelines |
39
+ | `get_agent_details` | Get detailed profile of a specialist agent |
40
+ | `parse_mode` | Parse PLAN/ACT/EVAL workflow mode (includes language setting) |
41
+
42
+ ### MCP Prompts
43
+
44
+ | Prompt | Description |
45
+ |--------|-------------|
46
+ | `activate_agent` | Activate a specialist agent with project context |
10
47
 
11
48
  ## Prerequisites
12
49
 
@@ -26,12 +63,14 @@ Add the following configuration to your Claude Desktop config:
26
63
  "mcpServers": {
27
64
  "codingbuddy-rules": {
28
65
  "command": "npx",
29
- "args": ["codingbuddy"]
66
+ "args": ["codingbuddy-mcp"]
30
67
  }
31
68
  }
32
69
  }
33
70
  ```
34
71
 
72
+ > **Note**: Use `codingbuddy-mcp` for the MCP server. The `codingbuddy` command is for CLI operations like `init`.
73
+
35
74
  ### Option 2: Global Installation
36
75
 
37
76
  ```bash
@@ -63,7 +102,7 @@ yarn build
63
102
  "mcpServers": {
64
103
  "codingbuddy-rules": {
65
104
  "command": "node",
66
- "args": ["/ABSOLUTE/PATH/TO/codingbuddy/mcp-server/dist/main.js"]
105
+ "args": ["/ABSOLUTE/PATH/TO/codingbuddy/mcp-server/dist/src/main.js"]
67
106
  }
68
107
  }
69
108
  }
@@ -100,6 +139,91 @@ The server will start in SSE mode, exposing:
100
139
  | `MCP_TRANSPORT` | Transport mode (`stdio` or `sse`) | `stdio` |
101
140
  | `PORT` | HTTP port for SSE mode | `3000` |
102
141
  | `CODINGBUDDY_RULES_DIR` | Custom path to `.ai-rules` directory | Auto-detected |
142
+ | `CODINGBUDDY_PROJECT_ROOT` | Project root for config loading | Current directory |
143
+ | `ANTHROPIC_API_KEY` | API key for `codingbuddy init` | Required for init |
144
+
145
+ ## Project Configuration
146
+
147
+ ### Initialize Configuration
148
+
149
+ ```bash
150
+ # Basic usage (requires ANTHROPIC_API_KEY env var)
151
+ npx codingbuddy init
152
+
153
+ # With options
154
+ npx codingbuddy init --format json # Output as JSON instead of JS
155
+ npx codingbuddy init --force # Overwrite existing config
156
+ npx codingbuddy init /path/to/project # Specify project path
157
+ npx codingbuddy init --api-key sk-... # Pass API key directly
158
+ ```
159
+
160
+ ### Configuration File
161
+
162
+ The `codingbuddy init` command creates a `codingbuddy.config.js` file:
163
+
164
+ ```javascript
165
+ module.exports = {
166
+ // Response language (ko, en, ja, etc.)
167
+ language: 'ko',
168
+
169
+ // Project metadata
170
+ projectName: 'my-awesome-app',
171
+ description: 'A modern web application',
172
+
173
+ // Technology stack
174
+ techStack: {
175
+ languages: ['TypeScript'],
176
+ frontend: ['React', 'Next.js', 'Tailwind CSS'],
177
+ backend: ['Node.js', 'Prisma'],
178
+ database: ['PostgreSQL'],
179
+ tools: ['ESLint', 'Prettier', 'Vitest'],
180
+ },
181
+
182
+ // Architecture pattern
183
+ architecture: {
184
+ pattern: 'feature-sliced-design',
185
+ structure: ['app', 'widgets', 'features', 'entities', 'shared'],
186
+ },
187
+
188
+ // Coding conventions
189
+ conventions: {
190
+ style: 'airbnb',
191
+ naming: {
192
+ files: 'kebab-case',
193
+ components: 'PascalCase',
194
+ functions: 'camelCase',
195
+ },
196
+ },
197
+
198
+ // Testing strategy
199
+ testStrategy: {
200
+ approach: 'tdd',
201
+ frameworks: ['Vitest', 'Playwright'],
202
+ coverage: 80,
203
+ },
204
+ };
205
+ ```
206
+
207
+ ### File Structure
208
+
209
+ ```
210
+ my-project/
211
+ ├── codingbuddy.config.js # Main configuration
212
+ ├── .codingignore # Files to ignore (gitignore syntax)
213
+ └── .codingbuddy/ # Additional context (optional)
214
+ └── context/
215
+ ├── architecture.md # Architecture documentation
216
+ └── api-guide.md # API usage guide
217
+ ```
218
+
219
+ ### How AI Uses Configuration
220
+
221
+ When you use an AI assistant with this MCP server:
222
+
223
+ 1. **Language**: AI responds in your configured language
224
+ 2. **Tech Stack**: AI provides code examples using your frameworks
225
+ 3. **Architecture**: AI suggests structures following your patterns
226
+ 4. **Conventions**: AI follows your naming and style rules
103
227
 
104
228
  ## Development
105
229
 
@@ -119,7 +243,7 @@ The [MCP Inspector](https://github.com/modelcontextprotocol/inspector) is a web-
119
243
  yarn build
120
244
 
121
245
  # Run with Inspector
122
- npx @modelcontextprotocol/inspector node dist/main.js
246
+ npx @modelcontextprotocol/inspector node dist/src/main.js
123
247
  ```
124
248
 
125
249
  ### 2. Manual Test Script
@@ -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":";;AAAA,mCAAyE;AACzE,+BAA4D;AAE5D,IAAA,iBAAQ,EAAC,KAAK,EAAE,GAAG,EAAE;IACnB,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;QACzB,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAEnC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YAE9C,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAEvD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;YAE5D,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAErC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAExC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,EAAE,CAAC,CAAC;YAE7B,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAEtC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAEnC,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAA,eAAS,EAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;YAEnD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,IAAI,WAAwC,CAAC;QAE7C,IAAA,mBAAU,EAAC,GAAG,EAAE;YACd,WAAW,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;YACb,WAAE,CAAC,eAAe,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,IAAA,gBAAU,GAAE,CAAC;YAEb,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACxC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACjC,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,IAAI,WAAwC,CAAC;QAE7C,IAAA,mBAAU,EAAC,GAAG,EAAE;YACd,WAAW,GAAG,WAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,IAAA,kBAAS,EAAC,GAAG,EAAE;YACb,WAAE,CAAC,eAAe,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAA,WAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,IAAA,kBAAY,GAAE,CAAC;YAEf,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 {};