codingbuddy 0.0.0-canary.20251219151055.e4122b3 → 0.0.0-dev.20251217095837.0d8312e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -140
- package/dist/src/keyword/keyword.module.js.map +1 -1
- package/dist/src/keyword/keyword.service.spec.d.ts +1 -0
- package/dist/src/keyword/keyword.service.spec.js +225 -0
- package/dist/src/keyword/keyword.service.spec.js.map +1 -0
- package/dist/src/main.js +0 -0
- package/dist/src/mcp/mcp.module.js +1 -2
- package/dist/src/mcp/mcp.module.js.map +1 -1
- package/dist/src/mcp/mcp.service.d.ts +7 -16
- package/dist/src/mcp/mcp.service.js +65 -140
- package/dist/src/mcp/mcp.service.js.map +1 -1
- package/dist/src/rules/rules.service.js +2 -2
- package/dist/src/rules/rules.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +7 -22
- package/dist/src/analyzer/analyzer.module.d.ts +0 -2
- package/dist/src/analyzer/analyzer.module.js +0 -21
- package/dist/src/analyzer/analyzer.module.js.map +0 -1
- package/dist/src/analyzer/analyzer.service.d.ts +0 -10
- package/dist/src/analyzer/analyzer.service.js +0 -74
- package/dist/src/analyzer/analyzer.service.js.map +0 -1
- package/dist/src/analyzer/analyzer.types.d.ts +0 -70
- package/dist/src/analyzer/analyzer.types.js +0 -3
- package/dist/src/analyzer/analyzer.types.js.map +0 -1
- package/dist/src/analyzer/code.sampler.d.ts +0 -7
- package/dist/src/analyzer/code.sampler.js +0 -161
- package/dist/src/analyzer/code.sampler.js.map +0 -1
- package/dist/src/analyzer/config.analyzer.d.ts +0 -7
- package/dist/src/analyzer/config.analyzer.js +0 -182
- package/dist/src/analyzer/config.analyzer.js.map +0 -1
- package/dist/src/analyzer/directory.analyzer.d.ts +0 -12
- package/dist/src/analyzer/directory.analyzer.js +0 -156
- package/dist/src/analyzer/directory.analyzer.js.map +0 -1
- package/dist/src/analyzer/index.d.ts +0 -7
- package/dist/src/analyzer/index.js +0 -32
- package/dist/src/analyzer/index.js.map +0 -1
- package/dist/src/analyzer/package.analyzer.d.ts +0 -12
- package/dist/src/analyzer/package.analyzer.js +0 -126
- package/dist/src/analyzer/package.analyzer.js.map +0 -1
- package/dist/src/cli/cli.d.ts +0 -10
- package/dist/src/cli/cli.js +0 -98
- package/dist/src/cli/cli.js.map +0 -1
- package/dist/src/cli/cli.types.d.ts +0 -18
- package/dist/src/cli/cli.types.js +0 -3
- package/dist/src/cli/cli.types.js.map +0 -1
- package/dist/src/cli/index.d.ts +0 -6
- package/dist/src/cli/index.js +0 -15
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/init/config.generator.d.ts +0 -16
- package/dist/src/cli/init/config.generator.js +0 -70
- package/dist/src/cli/init/config.generator.js.map +0 -1
- package/dist/src/cli/init/config.writer.d.ts +0 -10
- package/dist/src/cli/init/config.writer.js +0 -43
- package/dist/src/cli/init/config.writer.js.map +0 -1
- package/dist/src/cli/init/index.d.ts +0 -5
- package/dist/src/cli/init/index.js +0 -16
- package/dist/src/cli/init/index.js.map +0 -1
- package/dist/src/cli/init/init.command.d.ts +0 -3
- package/dist/src/cli/init/init.command.js +0 -80
- package/dist/src/cli/init/init.command.js.map +0 -1
- package/dist/src/cli/init/prompt.builder.d.ts +0 -7
- package/dist/src/cli/init/prompt.builder.js +0 -225
- package/dist/src/cli/init/prompt.builder.js.map +0 -1
- package/dist/src/cli/utils/console.d.ts +0 -11
- package/dist/src/cli/utils/console.js +0 -33
- package/dist/src/cli/utils/console.js.map +0 -1
- package/dist/src/cli/utils/index.d.ts +0 -2
- package/dist/src/cli/utils/index.js +0 -7
- package/dist/src/cli/utils/index.js.map +0 -1
- package/dist/src/config/config.loader.d.ts +0 -22
- package/dist/src/config/config.loader.js +0 -105
- package/dist/src/config/config.loader.js.map +0 -1
- package/dist/src/config/config.module.d.ts +0 -2
- package/dist/src/config/config.module.js +0 -21
- package/dist/src/config/config.module.js.map +0 -1
- package/dist/src/config/config.schema.d.ts +0 -544
- package/dist/src/config/config.schema.js +0 -98
- package/dist/src/config/config.schema.js.map +0 -1
- package/dist/src/config/config.service.d.ts +0 -33
- package/dist/src/config/config.service.js +0 -126
- package/dist/src/config/config.service.js.map +0 -1
- package/dist/src/config/config.types.d.ts +0 -2
- package/dist/src/config/config.types.js +0 -6
- package/dist/src/config/config.types.js.map +0 -1
- package/dist/src/config/context.loader.d.ts +0 -23
- package/dist/src/config/context.loader.js +0 -146
- package/dist/src/config/context.loader.js.map +0 -1
- package/dist/src/config/ignore.parser.d.ts +0 -12
- package/dist/src/config/ignore.parser.js +0 -132
- package/dist/src/config/ignore.parser.js.map +0 -1
- package/dist/src/config/index.d.ts +0 -13
- package/dist/src/config/index.js +0 -41
- package/dist/src/config/index.js.map +0 -1
- package/dist/src/shared/file.utils.d.ts +0 -4
- package/dist/src/shared/file.utils.js +0 -37
- package/dist/src/shared/file.utils.js.map +0 -1
- package/dist/src/shared/path.utils.d.ts +0 -2
- package/dist/src/shared/path.utils.js +0 -14
- package/dist/src/shared/path.utils.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -1,49 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Codebuddy Rules MCP Server
|
|
2
2
|
|
|
3
|
-
A NestJS-based Model Context Protocol (MCP) server that
|
|
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
|
-
```
|
|
3
|
+
A NestJS-based Model Context Protocol (MCP) server that exposes the Multi-AI Rules System (`.ai-rules/`) to AI clients.
|
|
13
4
|
|
|
14
5
|
## Features
|
|
15
6
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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 |
|
|
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`).
|
|
47
10
|
|
|
48
11
|
## Prerequisites
|
|
49
12
|
|
|
@@ -61,16 +24,14 @@ Add the following configuration to your Claude Desktop config:
|
|
|
61
24
|
```json
|
|
62
25
|
{
|
|
63
26
|
"mcpServers": {
|
|
64
|
-
"
|
|
27
|
+
"codebuddy-rules": {
|
|
65
28
|
"command": "npx",
|
|
66
|
-
"args": ["codingbuddy
|
|
29
|
+
"args": ["codingbuddy"]
|
|
67
30
|
}
|
|
68
31
|
}
|
|
69
32
|
}
|
|
70
33
|
```
|
|
71
34
|
|
|
72
|
-
> **Note**: Use `codingbuddy-mcp` for the MCP server. The `codingbuddy` command is for CLI operations like `init`.
|
|
73
|
-
|
|
74
35
|
### Option 2: Global Installation
|
|
75
36
|
|
|
76
37
|
```bash
|
|
@@ -82,8 +43,8 @@ Then configure Claude Desktop:
|
|
|
82
43
|
```json
|
|
83
44
|
{
|
|
84
45
|
"mcpServers": {
|
|
85
|
-
"
|
|
86
|
-
"command": "
|
|
46
|
+
"codebuddy-rules": {
|
|
47
|
+
"command": "codebuddy-mcp"
|
|
87
48
|
}
|
|
88
49
|
}
|
|
89
50
|
}
|
|
@@ -100,9 +61,9 @@ yarn build
|
|
|
100
61
|
```json
|
|
101
62
|
{
|
|
102
63
|
"mcpServers": {
|
|
103
|
-
"
|
|
64
|
+
"codebuddy-rules": {
|
|
104
65
|
"command": "node",
|
|
105
|
-
"args": ["/ABSOLUTE/PATH/TO/
|
|
66
|
+
"args": ["/ABSOLUTE/PATH/TO/codebuddy/mcp-server/dist/main.js"]
|
|
106
67
|
}
|
|
107
68
|
}
|
|
108
69
|
}
|
|
@@ -115,8 +76,8 @@ Replace `/ABSOLUTE/PATH/TO` with your actual path.
|
|
|
115
76
|
Build the Docker image from the **repository root**:
|
|
116
77
|
|
|
117
78
|
```bash
|
|
118
|
-
# Run from
|
|
119
|
-
docker build -f mcp-server/Dockerfile -t
|
|
79
|
+
# Run from codebuddy root
|
|
80
|
+
docker build -f mcp-server/Dockerfile -t codebuddy-rules-mcp .
|
|
120
81
|
```
|
|
121
82
|
|
|
122
83
|
Run the container:
|
|
@@ -125,7 +86,7 @@ Run the container:
|
|
|
125
86
|
docker run -p 3000:3000 \
|
|
126
87
|
-e MCP_TRANSPORT=sse \
|
|
127
88
|
-e PORT=3000 \
|
|
128
|
-
|
|
89
|
+
codebuddy-rules-mcp
|
|
129
90
|
```
|
|
130
91
|
|
|
131
92
|
The server will start in SSE mode, exposing:
|
|
@@ -138,92 +99,7 @@ The server will start in SSE mode, exposing:
|
|
|
138
99
|
|----------|-------------|---------|
|
|
139
100
|
| `MCP_TRANSPORT` | Transport mode (`stdio` or `sse`) | `stdio` |
|
|
140
101
|
| `PORT` | HTTP port for SSE mode | `3000` |
|
|
141
|
-
| `
|
|
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
|
|
102
|
+
| `CODEBUDDY_RULES_DIR` | Custom path to `.ai-rules` directory | Auto-detected |
|
|
227
103
|
|
|
228
104
|
## Development
|
|
229
105
|
|
|
@@ -243,7 +119,7 @@ The [MCP Inspector](https://github.com/modelcontextprotocol/inspector) is a web-
|
|
|
243
119
|
yarn build
|
|
244
120
|
|
|
245
121
|
# Run with Inspector
|
|
246
|
-
npx @modelcontextprotocol/inspector node dist/
|
|
122
|
+
npx @modelcontextprotocol/inspector node dist/main.js
|
|
247
123
|
```
|
|
248
124
|
|
|
249
125
|
### 2. Manual Test Script
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyword.module.js","sourceRoot":"","sources":["../../../src/keyword/keyword.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,wDAAoD;AACpD,0DAAsD;AACtD,uDAAmD;AAGtC,QAAA,eAAe,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"keyword.module.js","sourceRoot":"","sources":["../../../src/keyword/keyword.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,wDAAoD;AACpD,0DAAsD;AACtD,uDAAmD;AAGtC,QAAA,eAAe,GAAG,iBAAiB,CAAC;AAwB1C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IAtBzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,0BAAW,CAAC;QACtB,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,uBAAe;gBACxB,UAAU,EAAE,CAAC,YAA0B,EAAE,EAAE;oBACzC,MAAM,UAAU,GAAG,KAAK,IAAiC,EAAE;wBACzD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;wBACxE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;oBACnD,CAAC,CAAC;oBAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAmB,EAAE;wBACvD,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBAC3C,CAAC,CAAC;oBAEF,OAAO,IAAI,gCAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAClD,CAAC;gBACD,MAAM,EAAE,CAAC,4BAAY,CAAC;aACvB;SACF;QACD,OAAO,EAAE,CAAC,uBAAe,CAAC;KAC3B,CAAC;GACW,aAAa,CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const keyword_service_1 = require("./keyword.service");
|
|
5
|
+
const mockConfig = {
|
|
6
|
+
modes: {
|
|
7
|
+
PLAN: {
|
|
8
|
+
description: 'Task planning and design phase',
|
|
9
|
+
instructions: 'Design first approach.',
|
|
10
|
+
rules: ['rules/core.md'],
|
|
11
|
+
},
|
|
12
|
+
ACT: {
|
|
13
|
+
description: 'Actual task execution phase',
|
|
14
|
+
instructions: 'Red-Green-Refactor cycle.',
|
|
15
|
+
rules: ['rules/core.md', 'rules/project.md'],
|
|
16
|
+
},
|
|
17
|
+
EVAL: {
|
|
18
|
+
description: 'Result review and assessment phase',
|
|
19
|
+
instructions: 'Code quality review.',
|
|
20
|
+
rules: ['rules/core.md'],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultMode: 'PLAN',
|
|
24
|
+
};
|
|
25
|
+
const mockRulesContent = {
|
|
26
|
+
'rules/core.md': '# Core Rules\nCore content here.',
|
|
27
|
+
'rules/project.md': '# Project Rules\nProject content here.',
|
|
28
|
+
};
|
|
29
|
+
(0, vitest_1.describe)('KeywordService', () => {
|
|
30
|
+
let service;
|
|
31
|
+
let mockLoadConfig;
|
|
32
|
+
let mockLoadRule;
|
|
33
|
+
(0, vitest_1.beforeEach)(() => {
|
|
34
|
+
mockLoadConfig = vitest_1.vi.fn().mockResolvedValue(mockConfig);
|
|
35
|
+
mockLoadRule = vitest_1.vi.fn().mockImplementation((path) => {
|
|
36
|
+
const content = mockRulesContent[path];
|
|
37
|
+
if (content)
|
|
38
|
+
return Promise.resolve(content);
|
|
39
|
+
return Promise.reject(new Error(`File not found: ${path}`));
|
|
40
|
+
});
|
|
41
|
+
service = new keyword_service_1.KeywordService(mockLoadConfig, mockLoadRule);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.describe)('parseMode', () => {
|
|
44
|
+
(0, vitest_1.describe)('normal cases - each keyword', () => {
|
|
45
|
+
(0, vitest_1.it)('parses PLAN keyword', async () => {
|
|
46
|
+
const result = await service.parseMode('PLAN design auth feature');
|
|
47
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
48
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design auth feature');
|
|
49
|
+
(0, vitest_1.expect)(result.instructions).toBe('Design first approach.');
|
|
50
|
+
(0, vitest_1.expect)(result.rules).toHaveLength(1);
|
|
51
|
+
(0, vitest_1.expect)(result.rules[0].name).toBe('rules/core.md');
|
|
52
|
+
(0, vitest_1.expect)(result.warnings).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)('parses ACT keyword', async () => {
|
|
55
|
+
const result = await service.parseMode('ACT implement login API');
|
|
56
|
+
(0, vitest_1.expect)(result.mode).toBe('ACT');
|
|
57
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('implement login API');
|
|
58
|
+
(0, vitest_1.expect)(result.instructions).toBe('Red-Green-Refactor cycle.');
|
|
59
|
+
(0, vitest_1.expect)(result.rules).toHaveLength(2);
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('parses EVAL keyword', async () => {
|
|
62
|
+
const result = await service.parseMode('EVAL review security');
|
|
63
|
+
(0, vitest_1.expect)(result.mode).toBe('EVAL');
|
|
64
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('review security');
|
|
65
|
+
(0, vitest_1.expect)(result.instructions).toBe('Code quality review.');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.describe)('case insensitive - each keyword', () => {
|
|
69
|
+
(0, vitest_1.it)('parses plan (lowercase)', async () => {
|
|
70
|
+
const result = await service.parseMode('plan design feature');
|
|
71
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
72
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design feature');
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)('parses act (lowercase)', async () => {
|
|
75
|
+
const result = await service.parseMode('act implement feature');
|
|
76
|
+
(0, vitest_1.expect)(result.mode).toBe('ACT');
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('parses eval (lowercase)', async () => {
|
|
79
|
+
const result = await service.parseMode('eval review code');
|
|
80
|
+
(0, vitest_1.expect)(result.mode).toBe('EVAL');
|
|
81
|
+
});
|
|
82
|
+
(0, vitest_1.it)('parses Plan (capitalized)', async () => {
|
|
83
|
+
const result = await service.parseMode('Plan design feature');
|
|
84
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)('parses pLaN (mixed case)', async () => {
|
|
87
|
+
const result = await service.parseMode('pLaN design feature');
|
|
88
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.describe)('default value cases', () => {
|
|
92
|
+
(0, vitest_1.it)('defaults to PLAN with warning when no keyword', async () => {
|
|
93
|
+
const result = await service.parseMode('design auth feature');
|
|
94
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
95
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design auth feature');
|
|
96
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('defaults to PLAN with warning for empty string', async () => {
|
|
99
|
+
const result = await service.parseMode('');
|
|
100
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
101
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('');
|
|
102
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('defaults to PLAN with warning for whitespace only', async () => {
|
|
105
|
+
const result = await service.parseMode(' ');
|
|
106
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
107
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('');
|
|
108
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.describe)('warning cases', () => {
|
|
112
|
+
(0, vitest_1.it)('uses first keyword with warning for multiple keywords', async () => {
|
|
113
|
+
const result = await service.parseMode('PLAN ACT implement feature');
|
|
114
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
115
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('ACT implement feature');
|
|
116
|
+
(0, vitest_1.expect)(result.warnings).toContain('Multiple keywords found, using first');
|
|
117
|
+
});
|
|
118
|
+
(0, vitest_1.it)('warns when no content after keyword', async () => {
|
|
119
|
+
const result = await service.parseMode('PLAN');
|
|
120
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
121
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('');
|
|
122
|
+
(0, vitest_1.expect)(result.warnings).toContain('No prompt content after keyword');
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)('warns when only whitespace after keyword', async () => {
|
|
125
|
+
const result = await service.parseMode('PLAN ');
|
|
126
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
127
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('');
|
|
128
|
+
(0, vitest_1.expect)(result.warnings).toContain('No prompt content after keyword');
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.describe)('edge cases', () => {
|
|
132
|
+
(0, vitest_1.it)('does not recognize keyword in middle of prompt', async () => {
|
|
133
|
+
const result = await service.parseMode('Please PLAN this feature');
|
|
134
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
135
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('Please PLAN this feature');
|
|
136
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)('distinguishes from similar words (PLANNING)', async () => {
|
|
139
|
+
const result = await service.parseMode('PLANNING session today');
|
|
140
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
141
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('PLANNING session today');
|
|
142
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
143
|
+
});
|
|
144
|
+
(0, vitest_1.it)('distinguishes from similar words (ACTION)', async () => {
|
|
145
|
+
const result = await service.parseMode('ACTION items for today');
|
|
146
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
147
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('ACTION items for today');
|
|
148
|
+
(0, vitest_1.expect)(result.warnings).toContain('No keyword found, defaulting to PLAN');
|
|
149
|
+
});
|
|
150
|
+
(0, vitest_1.it)('handles special characters in prompt', async () => {
|
|
151
|
+
const result = await service.parseMode('PLAN design @feature #auth!');
|
|
152
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
153
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design @feature #auth!');
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)('handles newlines in prompt', async () => {
|
|
156
|
+
const result = await service.parseMode('PLAN design feature\nwith auth');
|
|
157
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
158
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design feature\nwith auth');
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)('handles tabs in prompt', async () => {
|
|
161
|
+
const result = await service.parseMode('PLAN\tdesign feature');
|
|
162
|
+
(0, vitest_1.expect)(result.mode).toBe('PLAN');
|
|
163
|
+
(0, vitest_1.expect)(result.originalPrompt).toBe('design feature');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.describe)('loadModeConfig', () => {
|
|
168
|
+
(0, vitest_1.it)('loads keyword-modes.json successfully', async () => {
|
|
169
|
+
const config = await service.loadModeConfig();
|
|
170
|
+
(0, vitest_1.expect)(config).toEqual(mockConfig);
|
|
171
|
+
(0, vitest_1.expect)(mockLoadConfig).toHaveBeenCalled();
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.it)('uses default config when file not found', async () => {
|
|
174
|
+
mockLoadConfig = vitest_1.vi.fn().mockRejectedValue(new Error('File not found'));
|
|
175
|
+
service = new keyword_service_1.KeywordService(mockLoadConfig, mockLoadRule);
|
|
176
|
+
const config = await service.loadModeConfig();
|
|
177
|
+
(0, vitest_1.expect)(config.defaultMode).toBe('PLAN');
|
|
178
|
+
(0, vitest_1.expect)(config.modes.PLAN).toBeDefined();
|
|
179
|
+
(0, vitest_1.expect)(config.modes.ACT).toBeDefined();
|
|
180
|
+
(0, vitest_1.expect)(config.modes.EVAL).toBeDefined();
|
|
181
|
+
});
|
|
182
|
+
(0, vitest_1.it)('uses default config with warning for invalid JSON', async () => {
|
|
183
|
+
mockLoadConfig = vitest_1.vi.fn().mockRejectedValue(new SyntaxError('Invalid JSON'));
|
|
184
|
+
service = new keyword_service_1.KeywordService(mockLoadConfig, mockLoadRule);
|
|
185
|
+
const config = await service.loadModeConfig();
|
|
186
|
+
(0, vitest_1.expect)(config.defaultMode).toBe('PLAN');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.describe)('getRulesForMode', () => {
|
|
190
|
+
(0, vitest_1.it)('returns PLAN mode rules bundle', async () => {
|
|
191
|
+
const rules = await service.getRulesForMode('PLAN');
|
|
192
|
+
(0, vitest_1.expect)(rules).toHaveLength(1);
|
|
193
|
+
(0, vitest_1.expect)(rules[0].name).toBe('rules/core.md');
|
|
194
|
+
(0, vitest_1.expect)(rules[0].content).toBe('# Core Rules\nCore content here.');
|
|
195
|
+
});
|
|
196
|
+
(0, vitest_1.it)('returns ACT mode rules bundle', async () => {
|
|
197
|
+
const rules = await service.getRulesForMode('ACT');
|
|
198
|
+
(0, vitest_1.expect)(rules).toHaveLength(2);
|
|
199
|
+
(0, vitest_1.expect)(rules[0].name).toBe('rules/core.md');
|
|
200
|
+
(0, vitest_1.expect)(rules[1].name).toBe('rules/project.md');
|
|
201
|
+
});
|
|
202
|
+
(0, vitest_1.it)('returns EVAL mode rules bundle', async () => {
|
|
203
|
+
const rules = await service.getRulesForMode('EVAL');
|
|
204
|
+
(0, vitest_1.expect)(rules).toHaveLength(1);
|
|
205
|
+
(0, vitest_1.expect)(rules[0].name).toBe('rules/core.md');
|
|
206
|
+
});
|
|
207
|
+
(0, vitest_1.it)('skips missing rule file with warning', async () => {
|
|
208
|
+
mockLoadConfig = vitest_1.vi.fn().mockResolvedValue({
|
|
209
|
+
...mockConfig,
|
|
210
|
+
modes: {
|
|
211
|
+
...mockConfig.modes,
|
|
212
|
+
PLAN: {
|
|
213
|
+
...mockConfig.modes.PLAN,
|
|
214
|
+
rules: ['rules/core.md', 'rules/missing.md'],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
service = new keyword_service_1.KeywordService(mockLoadConfig, mockLoadRule);
|
|
219
|
+
const rules = await service.getRulesForMode('PLAN');
|
|
220
|
+
(0, vitest_1.expect)(rules).toHaveLength(1);
|
|
221
|
+
(0, vitest_1.expect)(rules[0].name).toBe('rules/core.md');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=keyword.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyword.service.spec.js","sourceRoot":"","sources":["../../../src/keyword/keyword.service.spec.ts"],"names":[],"mappings":"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"}
|
package/dist/src/main.js
CHANGED
|
File without changes
|
|
@@ -12,13 +12,12 @@ const mcp_service_1 = require("./mcp.service");
|
|
|
12
12
|
const mcp_controller_1 = require("./mcp.controller");
|
|
13
13
|
const rules_module_1 = require("../rules/rules.module");
|
|
14
14
|
const keyword_module_1 = require("../keyword/keyword.module");
|
|
15
|
-
const config_module_1 = require("../config/config.module");
|
|
16
15
|
let McpModule = class McpModule {
|
|
17
16
|
};
|
|
18
17
|
exports.McpModule = McpModule;
|
|
19
18
|
exports.McpModule = McpModule = __decorate([
|
|
20
19
|
(0, common_1.Module)({
|
|
21
|
-
imports: [rules_module_1.RulesModule, keyword_module_1.KeywordModule
|
|
20
|
+
imports: [rules_module_1.RulesModule, keyword_module_1.KeywordModule],
|
|
22
21
|
controllers: [mcp_controller_1.McpController],
|
|
23
22
|
providers: [mcp_service_1.McpService],
|
|
24
23
|
exports: [mcp_service_1.McpService],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../../../src/mcp/mcp.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+CAA2C;AAC3C,qDAAiD;AACjD,wDAAoD;AACpD,8DAA0D;
|
|
1
|
+
{"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../../../src/mcp/mcp.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+CAA2C;AAC3C,qDAAiD;AACjD,wDAAoD;AACpD,8DAA0D;AAQnD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IANrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,0BAAW,EAAE,8BAAa,CAAC;QACrC,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,CAAC;QACvB,OAAO,EAAE,CAAC,wBAAU,CAAC;KACtB,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -2,14 +2,12 @@ import { OnModuleInit } from '@nestjs/common';
|
|
|
2
2
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
3
|
import { RulesService } from '../rules/rules.service';
|
|
4
4
|
import { KeywordService } from '../keyword/keyword.service';
|
|
5
|
-
import { ConfigService } from '../config/config.service';
|
|
6
5
|
export declare class McpService implements OnModuleInit {
|
|
7
6
|
private rulesService;
|
|
8
7
|
private keywordService;
|
|
9
|
-
private configService;
|
|
10
8
|
private server;
|
|
11
9
|
private readonly logger;
|
|
12
|
-
constructor(rulesService: RulesService, keywordService: KeywordService
|
|
10
|
+
constructor(rulesService: RulesService, keywordService: KeywordService);
|
|
13
11
|
onModuleInit(): void;
|
|
14
12
|
startStdio(): Promise<void>;
|
|
15
13
|
getServer(): Server<{
|
|
@@ -18,31 +16,24 @@ export declare class McpService implements OnModuleInit {
|
|
|
18
16
|
[x: string]: unknown;
|
|
19
17
|
_meta?: {
|
|
20
18
|
[x: string]: unknown;
|
|
21
|
-
progressToken?: string | number
|
|
22
|
-
}
|
|
23
|
-
}
|
|
19
|
+
progressToken?: string | number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
24
22
|
}, {
|
|
25
23
|
method: string;
|
|
26
24
|
params?: {
|
|
27
25
|
[x: string]: unknown;
|
|
28
26
|
_meta?: {
|
|
29
27
|
[x: string]: unknown;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
28
|
+
};
|
|
29
|
+
};
|
|
32
30
|
}, {
|
|
33
31
|
[x: string]: unknown;
|
|
34
32
|
_meta?: {
|
|
35
33
|
[x: string]: unknown;
|
|
36
|
-
}
|
|
34
|
+
};
|
|
37
35
|
}>;
|
|
38
36
|
private registerResources;
|
|
39
37
|
private registerTools;
|
|
40
38
|
private registerPrompts;
|
|
41
|
-
private handleSearchRules;
|
|
42
|
-
private handleGetAgentDetails;
|
|
43
|
-
private handleParseMode;
|
|
44
|
-
private handleGetProjectConfig;
|
|
45
|
-
private jsonResponse;
|
|
46
|
-
private errorResponse;
|
|
47
|
-
private formatProjectContext;
|
|
48
39
|
}
|