codingbuddy 0.0.0-canary.20251216053424.616ac46

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 (42) hide show
  1. package/README.md +155 -0
  2. package/dist/src/app.module.d.ts +2 -0
  3. package/dist/src/app.module.js +23 -0
  4. package/dist/src/app.module.js.map +1 -0
  5. package/dist/src/keyword/keyword.module.d.ts +3 -0
  6. package/dist/src/keyword/keyword.module.js +40 -0
  7. package/dist/src/keyword/keyword.module.js.map +1 -0
  8. package/dist/src/keyword/keyword.service.d.ts +10 -0
  9. package/dist/src/keyword/keyword.service.js +97 -0
  10. package/dist/src/keyword/keyword.service.js.map +1 -0
  11. package/dist/src/keyword/keyword.service.spec.d.ts +1 -0
  12. package/dist/src/keyword/keyword.service.spec.js +225 -0
  13. package/dist/src/keyword/keyword.service.spec.js.map +1 -0
  14. package/dist/src/keyword/keyword.types.d.ts +22 -0
  15. package/dist/src/keyword/keyword.types.js +5 -0
  16. package/dist/src/keyword/keyword.types.js.map +1 -0
  17. package/dist/src/main.d.ts +2 -0
  18. package/dist/src/main.js +25 -0
  19. package/dist/src/main.js.map +1 -0
  20. package/dist/src/mcp/mcp.controller.d.ts +9 -0
  21. package/dist/src/mcp/mcp.controller.js +57 -0
  22. package/dist/src/mcp/mcp.controller.js.map +1 -0
  23. package/dist/src/mcp/mcp.module.d.ts +2 -0
  24. package/dist/src/mcp/mcp.module.js +26 -0
  25. package/dist/src/mcp/mcp.module.js.map +1 -0
  26. package/dist/src/mcp/mcp.service.d.ts +39 -0
  27. package/dist/src/mcp/mcp.service.js +261 -0
  28. package/dist/src/mcp/mcp.service.js.map +1 -0
  29. package/dist/src/rules/rules.module.d.ts +2 -0
  30. package/dist/src/rules/rules.module.js +21 -0
  31. package/dist/src/rules/rules.module.js.map +1 -0
  32. package/dist/src/rules/rules.service.d.ts +11 -0
  33. package/dist/src/rules/rules.service.js +106 -0
  34. package/dist/src/rules/rules.service.js.map +1 -0
  35. package/dist/src/rules/rules.types.d.ts +13 -0
  36. package/dist/src/rules/rules.types.js +3 -0
  37. package/dist/src/rules/rules.types.js.map +1 -0
  38. package/dist/tsconfig.tsbuildinfo +1 -0
  39. package/dist/vitest.config.d.ts +2 -0
  40. package/dist/vitest.config.js +17 -0
  41. package/dist/vitest.config.js.map +1 -0
  42. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # Codebuddy Rules MCP Server
2
+
3
+ A NestJS-based Model Context Protocol (MCP) server that exposes the Multi-AI Rules System (`.ai-rules/`) to AI clients.
4
+
5
+ ## Features
6
+
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`).
10
+
11
+ ## Prerequisites
12
+
13
+ - Node.js v18+
14
+
15
+ ## Installation
16
+
17
+ ### Option 1: npx (Recommended - No Installation Required)
18
+
19
+ Add the following configuration to your Claude Desktop config:
20
+
21
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
22
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
23
+
24
+ ```json
25
+ {
26
+ "mcpServers": {
27
+ "codebuddy-rules": {
28
+ "command": "npx",
29
+ "args": ["codingbuddy"]
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### Option 2: Global Installation
36
+
37
+ ```bash
38
+ npm install -g codingbuddy
39
+ ```
40
+
41
+ Then configure Claude Desktop:
42
+
43
+ ```json
44
+ {
45
+ "mcpServers": {
46
+ "codebuddy-rules": {
47
+ "command": "codebuddy-mcp"
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ### Option 3: Local Development (Stdio Mode)
54
+
55
+ ```bash
56
+ cd mcp-server
57
+ yarn install
58
+ yarn build
59
+ ```
60
+
61
+ ```json
62
+ {
63
+ "mcpServers": {
64
+ "codebuddy-rules": {
65
+ "command": "node",
66
+ "args": ["/ABSOLUTE/PATH/TO/codebuddy/mcp-server/dist/main.js"]
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ Replace `/ABSOLUTE/PATH/TO` with your actual path.
73
+
74
+ ### Option 4: AWS Fargate / Docker - SSE Mode
75
+
76
+ Build the Docker image from the **repository root**:
77
+
78
+ ```bash
79
+ # Run from codebuddy root
80
+ docker build -f mcp-server/Dockerfile -t codebuddy-rules-mcp .
81
+ ```
82
+
83
+ Run the container:
84
+
85
+ ```bash
86
+ docker run -p 3000:3000 \
87
+ -e MCP_TRANSPORT=sse \
88
+ -e PORT=3000 \
89
+ codebuddy-rules-mcp
90
+ ```
91
+
92
+ The server will start in SSE mode, exposing:
93
+ - `GET /sse`: SSE Endpoint
94
+ - `POST /messages`: Message Endpoint
95
+
96
+ ## Environment Variables
97
+
98
+ | Variable | Description | Default |
99
+ |----------|-------------|---------|
100
+ | `MCP_TRANSPORT` | Transport mode (`stdio` or `sse`) | `stdio` |
101
+ | `PORT` | HTTP port for SSE mode | `3000` |
102
+ | `CODEBUDDY_RULES_DIR` | Custom path to `.ai-rules` directory | Auto-detected |
103
+
104
+ ## Development
105
+
106
+ ```bash
107
+ # Watch mode
108
+ yarn start:dev
109
+ ```
110
+
111
+ ## Testing
112
+
113
+ ### 1. Using MCP Inspector (Recommended)
114
+
115
+ The [MCP Inspector](https://github.com/modelcontextprotocol/inspector) is a web-based tool to interactively test your MCP server.
116
+
117
+ ```bash
118
+ # Build the server first
119
+ yarn build
120
+
121
+ # Run with Inspector
122
+ npx @modelcontextprotocol/inspector node dist/main.js
123
+ ```
124
+
125
+ ### 2. Manual Test Script
126
+
127
+ A simple script is provided to verify basic connectivity and JSON-RPC responses.
128
+
129
+ ```bash
130
+ # Build the server
131
+ yarn build
132
+
133
+ # Run the test script
134
+ node test/manual-client.js
135
+ ```
136
+
137
+ ## Publishing
138
+
139
+ Automated via GitHub Actions on `master` push.
140
+
141
+ 1. **Update Version**:
142
+ ```bash
143
+ npm version patch # or minor, major
144
+ ```
145
+
146
+ 2. **Push to Master**:
147
+ ```bash
148
+ git push
149
+ ```
150
+
151
+ The workflow will:
152
+ 1. Detect version change.
153
+ 2. Create a GitHub Release (e.g., `v1.0.1`).
154
+ 3. Publish to NPM as `codingbuddy`.
155
+
@@ -0,0 +1,2 @@
1
+ export declare class AppModule {
2
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AppModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("@nestjs/config");
12
+ const rules_module_1 = require("./rules/rules.module");
13
+ const mcp_module_1 = require("./mcp/mcp.module");
14
+ const keyword_module_1 = require("./keyword/keyword.module");
15
+ let AppModule = class AppModule {
16
+ };
17
+ exports.AppModule = AppModule;
18
+ exports.AppModule = AppModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [config_1.ConfigModule.forRoot(), rules_module_1.RulesModule, mcp_module_1.McpModule, keyword_module_1.KeywordModule],
21
+ })
22
+ ], AppModule);
23
+ //# sourceMappingURL=app.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAC9C,uDAAmD;AACnD,iDAA6C;AAC7C,6DAAyD;AAKlD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAHrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,qBAAY,CAAC,OAAO,EAAE,EAAE,0BAAW,EAAE,sBAAS,EAAE,8BAAa,CAAC;KACzE,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,3 @@
1
+ export declare const KEYWORD_SERVICE = "KEYWORD_SERVICE";
2
+ export declare class KeywordModule {
3
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.KeywordModule = exports.KEYWORD_SERVICE = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const rules_module_1 = require("../rules/rules.module");
12
+ const rules_service_1 = require("../rules/rules.service");
13
+ const keyword_service_1 = require("./keyword.service");
14
+ exports.KEYWORD_SERVICE = 'KEYWORD_SERVICE';
15
+ let KeywordModule = class KeywordModule {
16
+ };
17
+ exports.KeywordModule = KeywordModule;
18
+ exports.KeywordModule = KeywordModule = __decorate([
19
+ (0, common_1.Module)({
20
+ imports: [rules_module_1.RulesModule],
21
+ providers: [
22
+ {
23
+ provide: exports.KEYWORD_SERVICE,
24
+ useFactory: (rulesService) => {
25
+ const loadConfig = async () => {
26
+ const content = await rulesService.getRuleContent('keyword-modes.json');
27
+ return JSON.parse(content);
28
+ };
29
+ const loadRule = async (path) => {
30
+ return rulesService.getRuleContent(path);
31
+ };
32
+ return new keyword_service_1.KeywordService(loadConfig, loadRule);
33
+ },
34
+ inject: [rules_service_1.RulesService],
35
+ },
36
+ ],
37
+ exports: [exports.KEYWORD_SERVICE],
38
+ })
39
+ ], KeywordModule);
40
+ //# sourceMappingURL=keyword.module.js.map
@@ -0,0 +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;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,10 @@
1
+ import { type Mode, type RuleContent, type ParseModeResult, type KeywordModesConfig } from './keyword.types';
2
+ export declare class KeywordService {
3
+ private readonly loadConfigFn;
4
+ private readonly loadRuleFn;
5
+ private configCache;
6
+ constructor(loadConfigFn: () => Promise<KeywordModesConfig>, loadRuleFn: (path: string) => Promise<string>);
7
+ parseMode(prompt: string): Promise<ParseModeResult>;
8
+ loadModeConfig(): Promise<KeywordModesConfig>;
9
+ getRulesForMode(mode: Mode): Promise<RuleContent[]>;
10
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeywordService = void 0;
4
+ const keyword_types_1 = require("./keyword.types");
5
+ const DEFAULT_CONFIG = {
6
+ modes: {
7
+ PLAN: {
8
+ description: 'Task planning and design phase',
9
+ instructions: 'Design first approach. Define test cases from TDD perspective. Review architecture before implementation.',
10
+ rules: ['rules/core.md', 'rules/augmented-coding.md'],
11
+ },
12
+ ACT: {
13
+ description: 'Actual task execution phase',
14
+ instructions: 'Follow Red-Green-Refactor cycle. Implement minimally then improve incrementally. Verify quality standards.',
15
+ rules: ['rules/core.md', 'rules/project.md', 'rules/augmented-coding.md'],
16
+ },
17
+ EVAL: {
18
+ description: 'Result review and assessment phase',
19
+ instructions: 'Review code quality. Verify SOLID principles. Check test coverage. Suggest improvements.',
20
+ rules: ['rules/core.md', 'rules/augmented-coding.md'],
21
+ },
22
+ },
23
+ defaultMode: 'PLAN',
24
+ };
25
+ class KeywordService {
26
+ constructor(loadConfigFn, loadRuleFn) {
27
+ this.loadConfigFn = loadConfigFn;
28
+ this.loadRuleFn = loadRuleFn;
29
+ this.configCache = null;
30
+ }
31
+ async parseMode(prompt) {
32
+ const config = await this.loadModeConfig();
33
+ const warnings = [];
34
+ const trimmed = prompt.trim();
35
+ const parts = trimmed.split(/\s+/);
36
+ const firstWord = parts[0]?.toUpperCase() ?? '';
37
+ let mode;
38
+ let originalPrompt;
39
+ const isKeyword = keyword_types_1.KEYWORDS.includes(firstWord);
40
+ if (isKeyword) {
41
+ mode = firstWord;
42
+ originalPrompt = trimmed.slice(parts[0].length).trim();
43
+ if (parts.length > 1) {
44
+ const secondWord = parts[1].toUpperCase();
45
+ if (keyword_types_1.KEYWORDS.includes(secondWord)) {
46
+ warnings.push('Multiple keywords found, using first');
47
+ }
48
+ }
49
+ if (originalPrompt === '') {
50
+ warnings.push('No prompt content after keyword');
51
+ }
52
+ }
53
+ else {
54
+ mode = config.defaultMode;
55
+ originalPrompt = trimmed;
56
+ warnings.push('No keyword found, defaulting to PLAN');
57
+ }
58
+ const modeConfig = config.modes[mode];
59
+ const rules = await this.getRulesForMode(mode);
60
+ return {
61
+ mode,
62
+ originalPrompt,
63
+ instructions: modeConfig.instructions,
64
+ rules,
65
+ ...(warnings.length > 0 ? { warnings } : {}),
66
+ };
67
+ }
68
+ async loadModeConfig() {
69
+ if (this.configCache) {
70
+ return this.configCache;
71
+ }
72
+ try {
73
+ this.configCache = await this.loadConfigFn();
74
+ return this.configCache;
75
+ }
76
+ catch {
77
+ this.configCache = DEFAULT_CONFIG;
78
+ return DEFAULT_CONFIG;
79
+ }
80
+ }
81
+ async getRulesForMode(mode) {
82
+ const config = await this.loadModeConfig();
83
+ const modeConfig = config.modes[mode];
84
+ const rules = [];
85
+ for (const rulePath of modeConfig.rules) {
86
+ try {
87
+ const content = await this.loadRuleFn(rulePath);
88
+ rules.push({ name: rulePath, content });
89
+ }
90
+ catch {
91
+ }
92
+ }
93
+ return rules;
94
+ }
95
+ }
96
+ exports.KeywordService = KeywordService;
97
+ //# sourceMappingURL=keyword.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword.service.js","sourceRoot":"","sources":["../../../src/keyword/keyword.service.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -0,0 +1,22 @@
1
+ export declare const KEYWORDS: readonly ["PLAN", "ACT", "EVAL"];
2
+ export type Mode = (typeof KEYWORDS)[number];
3
+ export interface RuleContent {
4
+ name: string;
5
+ content: string;
6
+ }
7
+ export interface ParseModeResult {
8
+ mode: Mode;
9
+ originalPrompt: string;
10
+ instructions: string;
11
+ rules: RuleContent[];
12
+ warnings?: string[];
13
+ }
14
+ export interface ModeConfig {
15
+ description: string;
16
+ instructions: string;
17
+ rules: string[];
18
+ }
19
+ export interface KeywordModesConfig {
20
+ modes: Record<Mode, ModeConfig>;
21
+ defaultMode: Mode;
22
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KEYWORDS = void 0;
4
+ exports.KEYWORDS = ['PLAN', 'ACT', 'EVAL'];
5
+ //# sourceMappingURL=keyword.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword.types.js","sourceRoot":"","sources":["../../../src/keyword/keyword.types.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};