midas-mcp 2.9.0 → 3.2.0

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ai.d.ts +2 -0
  3. package/dist/ai.d.ts.map +1 -1
  4. package/dist/ai.js +28 -45
  5. package/dist/ai.js.map +1 -1
  6. package/dist/analyzer.d.ts.map +1 -1
  7. package/dist/analyzer.js +37 -87
  8. package/dist/analyzer.js.map +1 -1
  9. package/dist/config.d.ts +16 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +109 -15
  12. package/dist/config.js.map +1 -1
  13. package/dist/context.d.ts +8 -1
  14. package/dist/context.d.ts.map +1 -1
  15. package/dist/context.js +76 -7
  16. package/dist/context.js.map +1 -1
  17. package/dist/providers.d.ts +46 -0
  18. package/dist/providers.d.ts.map +1 -0
  19. package/dist/providers.js +287 -0
  20. package/dist/providers.js.map +1 -0
  21. package/dist/server.d.ts.map +1 -1
  22. package/dist/server.js +9 -2
  23. package/dist/server.js.map +1 -1
  24. package/dist/tools/config.d.ts +73 -0
  25. package/dist/tools/config.d.ts.map +1 -0
  26. package/dist/tools/config.js +94 -0
  27. package/dist/tools/config.js.map +1 -0
  28. package/dist/tools/index.d.ts +1 -0
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +2 -0
  31. package/dist/tools/index.js.map +1 -1
  32. package/dist/tui.d.ts.map +1 -1
  33. package/dist/tui.js +293 -210
  34. package/dist/tui.js.map +1 -1
  35. package/package.json +17 -5
  36. package/dist/tests/analyze.test.d.ts +0 -2
  37. package/dist/tests/analyze.test.d.ts.map +0 -1
  38. package/dist/tests/analyze.test.js +0 -120
  39. package/dist/tests/analyze.test.js.map +0 -1
  40. package/dist/tests/context.test.d.ts +0 -2
  41. package/dist/tests/context.test.d.ts.map +0 -1
  42. package/dist/tests/context.test.js +0 -213
  43. package/dist/tests/context.test.js.map +0 -1
  44. package/dist/tests/edge-cases.test.d.ts +0 -2
  45. package/dist/tests/edge-cases.test.d.ts.map +0 -1
  46. package/dist/tests/edge-cases.test.js +0 -234
  47. package/dist/tests/edge-cases.test.js.map +0 -1
  48. package/dist/tests/journal.test.d.ts +0 -2
  49. package/dist/tests/journal.test.d.ts.map +0 -1
  50. package/dist/tests/journal.test.js +0 -184
  51. package/dist/tests/journal.test.js.map +0 -1
  52. package/dist/tests/metrics.test.d.ts +0 -2
  53. package/dist/tests/metrics.test.d.ts.map +0 -1
  54. package/dist/tests/metrics.test.js +0 -178
  55. package/dist/tests/metrics.test.js.map +0 -1
  56. package/dist/tests/phase.test.d.ts +0 -2
  57. package/dist/tests/phase.test.d.ts.map +0 -1
  58. package/dist/tests/phase.test.js +0 -110
  59. package/dist/tests/phase.test.js.map +0 -1
  60. package/dist/tests/prompts.test.d.ts +0 -2
  61. package/dist/tests/prompts.test.d.ts.map +0 -1
  62. package/dist/tests/prompts.test.js +0 -157
  63. package/dist/tests/prompts.test.js.map +0 -1
  64. package/dist/tests/search.test.d.ts +0 -2
  65. package/dist/tests/search.test.d.ts.map +0 -1
  66. package/dist/tests/search.test.js +0 -228
  67. package/dist/tests/search.test.js.map +0 -1
  68. package/dist/tests/security.test.d.ts +0 -2
  69. package/dist/tests/security.test.d.ts.map +0 -1
  70. package/dist/tests/security.test.js +0 -105
  71. package/dist/tests/security.test.js.map +0 -1
  72. package/dist/tests/server.test.d.ts +0 -2
  73. package/dist/tests/server.test.d.ts.map +0 -1
  74. package/dist/tests/server.test.js +0 -93
  75. package/dist/tests/server.test.js.map +0 -1
  76. package/dist/tests/techstack.test.d.ts +0 -2
  77. package/dist/tests/techstack.test.d.ts.map +0 -1
  78. package/dist/tests/techstack.test.js +0 -187
  79. package/dist/tests/techstack.test.js.map +0 -1
  80. package/dist/tests/tools.test.d.ts +0 -2
  81. package/dist/tests/tools.test.d.ts.map +0 -1
  82. package/dist/tests/tools.test.js +0 -137
  83. package/dist/tests/tools.test.js.map +0 -1
  84. package/dist/tests/tracker.test.d.ts +0 -2
  85. package/dist/tests/tracker.test.d.ts.map +0 -1
  86. package/dist/tests/tracker.test.js +0 -197
  87. package/dist/tests/tracker.test.js.map +0 -1
@@ -1,105 +0,0 @@
1
- import assert from 'node:assert';
2
- import { test, describe } from 'node:test';
3
- import { sanitizePath, isShellSafe, limitLength, validateEnum, LIMITS } from '../security.js';
4
- import { resolve } from 'path';
5
- describe('Security utilities', () => {
6
- describe('sanitizePath', () => {
7
- test('returns cwd when no path provided', () => {
8
- const result = sanitizePath(undefined);
9
- assert.strictEqual(result, process.cwd());
10
- });
11
- test('resolves relative paths within base', () => {
12
- const base = '/home/user/project';
13
- const result = sanitizePath('src/file.ts', base);
14
- assert.strictEqual(result, resolve(base, 'src/file.ts'));
15
- });
16
- test('blocks path traversal attempts', () => {
17
- const base = '/home/user/project';
18
- const result = sanitizePath('../../../etc/passwd', base);
19
- // Should return base when path escapes
20
- assert.strictEqual(result, base);
21
- });
22
- test('blocks double-dot traversal in middle of path', () => {
23
- const base = '/home/user/project';
24
- const result = sanitizePath('src/../../../etc/passwd', base);
25
- assert.strictEqual(result, base);
26
- });
27
- test('normalizes paths with dots', () => {
28
- const base = '/home/user/project';
29
- const result = sanitizePath('./src/./file.ts', base);
30
- assert.strictEqual(result, resolve(base, 'src/file.ts'));
31
- });
32
- });
33
- describe('isShellSafe', () => {
34
- test('allows safe paths', () => {
35
- assert.strictEqual(isShellSafe('/home/user/project'), true);
36
- assert.strictEqual(isShellSafe('/Users/dev/my-project'), true);
37
- assert.strictEqual(isShellSafe('src/file.ts'), true);
38
- });
39
- test('blocks paths with shell metacharacters', () => {
40
- assert.strictEqual(isShellSafe('/path; rm -rf /'), false);
41
- assert.strictEqual(isShellSafe('/path && malicious'), false);
42
- assert.strictEqual(isShellSafe('/path | grep'), false);
43
- assert.strictEqual(isShellSafe('/path `whoami`'), false);
44
- assert.strictEqual(isShellSafe('/path $(whoami)'), false);
45
- assert.strictEqual(isShellSafe("/path'; drop table"), false);
46
- assert.strictEqual(isShellSafe('/path"'), false);
47
- });
48
- });
49
- describe('limitLength', () => {
50
- test('returns string unchanged if under limit', () => {
51
- assert.strictEqual(limitLength('short', 100), 'short');
52
- });
53
- test('truncates long strings', () => {
54
- const long = 'a'.repeat(200);
55
- const result = limitLength(long, 50);
56
- assert.ok(result.length < 200);
57
- assert.ok(result.includes('[truncated]'));
58
- });
59
- test('handles exact limit', () => {
60
- const exact = 'a'.repeat(50);
61
- assert.strictEqual(limitLength(exact, 50), exact);
62
- });
63
- });
64
- describe('validateEnum', () => {
65
- const allowed = ['A', 'B', 'C'];
66
- test('returns value if valid', () => {
67
- assert.strictEqual(validateEnum('A', allowed), 'A');
68
- assert.strictEqual(validateEnum('B', allowed), 'B');
69
- });
70
- test('returns null for invalid values', () => {
71
- assert.strictEqual(validateEnum('D', allowed), null);
72
- assert.strictEqual(validateEnum('', allowed), null);
73
- assert.strictEqual(validateEnum('a', allowed), null); // case sensitive
74
- });
75
- });
76
- describe('LIMITS constants', () => {
77
- test('has reasonable limits', () => {
78
- assert.ok(LIMITS.CONVERSATION_MAX_LENGTH > 0);
79
- assert.ok(LIMITS.CONVERSATION_MAX_LENGTH <= 1000000); // 1MB max
80
- assert.ok(LIMITS.TITLE_MAX_LENGTH > 0);
81
- assert.ok(LIMITS.PATH_MAX_LENGTH > 0);
82
- });
83
- });
84
- });
85
- describe('Security integration', () => {
86
- test('journal tool rejects path traversal', async () => {
87
- // This test verifies the integration works
88
- // The actual protection happens in sanitizePath
89
- const maliciousPath = '../../../etc';
90
- const safePath = sanitizePath(maliciousPath);
91
- assert.ok(!safePath.includes('/etc'));
92
- assert.strictEqual(safePath, process.cwd());
93
- });
94
- test('phase tool validates step values', async () => {
95
- const { setPhaseManually } = await import('../tools/phase.js');
96
- // Valid step should work
97
- const validResult = setPhaseManually({ phase: 'BUILD', step: 'IMPLEMENT' });
98
- assert.strictEqual(validResult.success, true);
99
- // Invalid step should fail gracefully
100
- const invalidResult = setPhaseManually({ phase: 'BUILD', step: 'INVALID_STEP' });
101
- assert.strictEqual(invalidResult.success, false);
102
- assert.ok(invalidResult.error?.includes('Invalid step'));
103
- });
104
- });
105
- //# sourceMappingURL=security.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"security.test.js","sourceRoot":"","sources":["../../src/tests/security.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=server.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../src/tests/server.test.ts"],"names":[],"mappings":""}
@@ -1,93 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import assert from 'node:assert';
3
- import { createServer } from '../server.js';
4
- describe('MCP Server', () => {
5
- describe('createServer', () => {
6
- it('creates a server instance', () => {
7
- const server = createServer();
8
- assert.notStrictEqual(server, null);
9
- assert.notStrictEqual(server, undefined);
10
- });
11
- it('server has name and version', () => {
12
- const server = createServer();
13
- // The server object is created - basic smoke test
14
- assert.strictEqual(typeof server, 'object');
15
- });
16
- });
17
- describe('Tool Registration', () => {
18
- it('registers all expected tools', () => {
19
- // This is a smoke test - server creation registers tools
20
- // If any tool registration fails, createServer will throw
21
- assert.doesNotThrow(() => {
22
- createServer();
23
- });
24
- });
25
- });
26
- describe('Prompt Registration', () => {
27
- it('registers all prompts without error', () => {
28
- assert.doesNotThrow(() => {
29
- createServer();
30
- });
31
- });
32
- });
33
- describe('Resource Registration', () => {
34
- it('registers all resources without error', () => {
35
- assert.doesNotThrow(() => {
36
- createServer();
37
- });
38
- });
39
- });
40
- });
41
- describe('Tool Schemas', () => {
42
- // Import all schemas to verify they're valid Zod schemas
43
- it('all tool schemas are valid', async () => {
44
- const { startProjectSchema, getPhaseSchema, setPhaseSchema, auditSchema, checkDocsSchema, oneshotSchema, tornadoSchema, horizonSchema, analyzeSchema, suggestPromptSchema, advancePhaseSchema, saveJournalSchema, getJournalSchema, searchJournalSchema, } = await import('../tools/index.js');
45
- // All schemas should have a parse method (Zod schemas)
46
- assert.strictEqual(typeof startProjectSchema.parse, 'function');
47
- assert.strictEqual(typeof getPhaseSchema.parse, 'function');
48
- assert.strictEqual(typeof setPhaseSchema.parse, 'function');
49
- assert.strictEqual(typeof auditSchema.parse, 'function');
50
- assert.strictEqual(typeof checkDocsSchema.parse, 'function');
51
- assert.strictEqual(typeof oneshotSchema.parse, 'function');
52
- assert.strictEqual(typeof tornadoSchema.parse, 'function');
53
- assert.strictEqual(typeof horizonSchema.parse, 'function');
54
- assert.strictEqual(typeof analyzeSchema.parse, 'function');
55
- assert.strictEqual(typeof suggestPromptSchema.parse, 'function');
56
- assert.strictEqual(typeof advancePhaseSchema.parse, 'function');
57
- assert.strictEqual(typeof saveJournalSchema.parse, 'function');
58
- assert.strictEqual(typeof getJournalSchema.parse, 'function');
59
- assert.strictEqual(typeof searchJournalSchema.parse, 'function');
60
- });
61
- it('schemas validate correct input', async () => {
62
- const { startProjectSchema, oneshotSchema, tornadoSchema } = await import('../tools/index.js');
63
- // startProjectSchema
64
- const startInput = { projectName: 'test-app' };
65
- assert.doesNotThrow(() => startProjectSchema.parse(startInput));
66
- // oneshotSchema
67
- const oneshotInput = { originalPrompt: 'test', error: 'error' };
68
- assert.doesNotThrow(() => oneshotSchema.parse(oneshotInput));
69
- // tornadoSchema
70
- const tornadoInput = { problem: 'test problem' };
71
- assert.doesNotThrow(() => tornadoSchema.parse(tornadoInput));
72
- });
73
- it('schemas reject invalid input', async () => {
74
- const { oneshotSchema, tornadoSchema, saveJournalSchema } = await import('../tools/index.js');
75
- // oneshotSchema requires originalPrompt and error
76
- assert.throws(() => oneshotSchema.parse({}));
77
- // tornadoSchema requires problem
78
- assert.throws(() => tornadoSchema.parse({}));
79
- // saveJournalSchema requires title and conversation
80
- assert.throws(() => saveJournalSchema.parse({}));
81
- });
82
- });
83
- describe('Logger', () => {
84
- it('logger exports expected methods', async () => {
85
- const { logger } = await import('../logger.js');
86
- assert.strictEqual(typeof logger.info, 'function');
87
- assert.strictEqual(typeof logger.debug, 'function');
88
- assert.strictEqual(typeof logger.warn, 'function');
89
- assert.strictEqual(typeof logger.error, 'function');
90
- assert.strictEqual(typeof logger.tool, 'function');
91
- });
92
- });
93
- //# sourceMappingURL=server.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../src/tests/server.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=techstack.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"techstack.test.d.ts","sourceRoot":"","sources":["../../src/tests/techstack.test.ts"],"names":[],"mappings":""}
@@ -1,187 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from 'node:test';
2
- import assert from 'node:assert';
3
- import { mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'fs';
4
- import { join } from 'path';
5
- import { tmpdir } from 'os';
6
- import { detectTechStack, generateCursorRules, writeCursorRules } from '../techstack.js';
7
- describe('Tech Stack Detection', () => {
8
- const testDir = join(tmpdir(), 'midas-techstack-test-' + Date.now());
9
- beforeEach(() => {
10
- mkdirSync(testDir, { recursive: true });
11
- });
12
- afterEach(() => {
13
- rmSync(testDir, { recursive: true, force: true });
14
- });
15
- describe('detectTechStack', () => {
16
- it('detects TypeScript from tsconfig.json', () => {
17
- writeFileSync(join(testDir, 'tsconfig.json'), '{}');
18
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({ dependencies: {} }));
19
- const stack = detectTechStack(testDir);
20
- assert.strictEqual(stack.language, 'typescript');
21
- });
22
- it('detects TypeScript from package.json', () => {
23
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
24
- devDependencies: { typescript: '5.0.0' }
25
- }));
26
- const stack = detectTechStack(testDir);
27
- assert.strictEqual(stack.language, 'typescript');
28
- });
29
- it('detects JavaScript without TypeScript', () => {
30
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
31
- dependencies: { express: '4.0.0' }
32
- }));
33
- const stack = detectTechStack(testDir);
34
- assert.strictEqual(stack.language, 'javascript');
35
- });
36
- it('detects React framework', () => {
37
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
38
- dependencies: { react: '18.0.0' }
39
- }));
40
- const stack = detectTechStack(testDir);
41
- assert.strictEqual(stack.framework, 'React');
42
- });
43
- it('detects Next.js framework', () => {
44
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
45
- dependencies: { next: '14.0.0', react: '18.0.0' }
46
- }));
47
- const stack = detectTechStack(testDir);
48
- assert.strictEqual(stack.framework, 'Next.js');
49
- });
50
- it('detects Express framework', () => {
51
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
52
- dependencies: { express: '4.0.0' }
53
- }));
54
- const stack = detectTechStack(testDir);
55
- assert.strictEqual(stack.framework, 'Express');
56
- });
57
- it('detects Python from requirements.txt', () => {
58
- writeFileSync(join(testDir, 'requirements.txt'), 'flask==2.0.0');
59
- const stack = detectTechStack(testDir);
60
- assert.strictEqual(stack.language, 'python');
61
- assert.strictEqual(stack.framework, 'Flask');
62
- });
63
- it('detects Python from pyproject.toml', () => {
64
- writeFileSync(join(testDir, 'pyproject.toml'), '[tool.poetry]');
65
- const stack = detectTechStack(testDir);
66
- assert.strictEqual(stack.language, 'python');
67
- });
68
- it('detects Go from go.mod', () => {
69
- writeFileSync(join(testDir, 'go.mod'), 'module example.com/test');
70
- const stack = detectTechStack(testDir);
71
- assert.strictEqual(stack.language, 'go');
72
- });
73
- it('detects Rust from Cargo.toml', () => {
74
- writeFileSync(join(testDir, 'Cargo.toml'), '[package]');
75
- const stack = detectTechStack(testDir);
76
- assert.strictEqual(stack.language, 'rust');
77
- });
78
- it('detects Swift from Package.swift', () => {
79
- writeFileSync(join(testDir, 'Package.swift'), '// swift package');
80
- const stack = detectTechStack(testDir);
81
- assert.strictEqual(stack.language, 'swift');
82
- });
83
- it('detects tests exist from test script', () => {
84
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
85
- scripts: { test: 'jest' }
86
- }));
87
- const stack = detectTechStack(testDir);
88
- assert.strictEqual(stack.hasTests, true);
89
- });
90
- it('ignores default npm test script', () => {
91
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
92
- scripts: { test: 'echo "Error: no test specified" && exit 1' }
93
- }));
94
- const stack = detectTechStack(testDir);
95
- assert.strictEqual(stack.hasTests, false);
96
- });
97
- it('detects docs from docs directory', () => {
98
- mkdirSync(join(testDir, 'docs'));
99
- const stack = detectTechStack(testDir);
100
- assert.strictEqual(stack.hasDocs, true);
101
- });
102
- it('detects docs from README.md', () => {
103
- writeFileSync(join(testDir, 'README.md'), '# Project');
104
- const stack = detectTechStack(testDir);
105
- assert.strictEqual(stack.hasDocs, true);
106
- });
107
- it('detects CI from GitHub workflows', () => {
108
- mkdirSync(join(testDir, '.github', 'workflows'), { recursive: true });
109
- const stack = detectTechStack(testDir);
110
- assert.strictEqual(stack.hasCI, true);
111
- });
112
- it('returns unknown for empty project', () => {
113
- const stack = detectTechStack(testDir);
114
- assert.strictEqual(stack.language, 'unknown');
115
- });
116
- it('collects dependencies from package.json', () => {
117
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
118
- dependencies: { react: '18.0.0', lodash: '4.0.0' },
119
- devDependencies: { typescript: '5.0.0' }
120
- }));
121
- const stack = detectTechStack(testDir);
122
- assert.strictEqual(stack.dependencies.includes('react'), true);
123
- assert.strictEqual(stack.dependencies.includes('lodash'), true);
124
- assert.strictEqual(stack.dependencies.includes('typescript'), true);
125
- });
126
- });
127
- describe('generateCursorRules', () => {
128
- it('generates rules for TypeScript project', () => {
129
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
130
- devDependencies: { typescript: '5.0.0' }
131
- }));
132
- const rules = generateCursorRules(testDir, 'test-project');
133
- assert.strictEqual(rules.includes('# Project: test-project'), true);
134
- assert.strictEqual(rules.includes('# TypeScript Rules'), true);
135
- assert.strictEqual(rules.includes('No `any` types'), true);
136
- });
137
- it('generates rules for Python project', () => {
138
- writeFileSync(join(testDir, 'requirements.txt'), 'django==4.0.0');
139
- const rules = generateCursorRules(testDir, 'py-project');
140
- assert.strictEqual(rules.includes('# Python Rules'), true);
141
- assert.strictEqual(rules.includes('type hints'), true);
142
- });
143
- it('includes framework-specific rules for Next.js', () => {
144
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
145
- dependencies: { next: '14.0.0' }
146
- }));
147
- const rules = generateCursorRules(testDir, 'next-app');
148
- assert.strictEqual(rules.includes('# Next.js Rules'), true);
149
- assert.strictEqual(rules.includes('App Router'), true);
150
- });
151
- it('includes Midas integration rules', () => {
152
- const rules = generateCursorRules(testDir, 'any-project');
153
- assert.strictEqual(rules.includes('# Midas Integration'), true);
154
- assert.strictEqual(rules.includes('midas_analyze'), true);
155
- });
156
- it('includes security rules', () => {
157
- const rules = generateCursorRules(testDir, 'any-project');
158
- assert.strictEqual(rules.includes('# Security'), true);
159
- assert.strictEqual(rules.includes('API keys'), true);
160
- });
161
- it('includes Golden Code methodology', () => {
162
- const rules = generateCursorRules(testDir, 'any-project');
163
- assert.strictEqual(rules.includes('Golden Code Methodology'), true);
164
- assert.strictEqual(rules.includes('PLAN'), true);
165
- });
166
- });
167
- describe('writeCursorRules', () => {
168
- it('creates .cursorrules file', () => {
169
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
170
- devDependencies: { typescript: '5.0.0' }
171
- }));
172
- const result = writeCursorRules(testDir, 'test-project');
173
- assert.strictEqual(result.success, true);
174
- assert.strictEqual(existsSync(join(testDir, '.cursorrules')), true);
175
- });
176
- it('writes correct content', () => {
177
- writeFileSync(join(testDir, 'package.json'), JSON.stringify({
178
- dependencies: { react: '18.0.0' }
179
- }));
180
- writeCursorRules(testDir, 'my-app');
181
- const content = readFileSync(join(testDir, '.cursorrules'), 'utf-8');
182
- assert.strictEqual(content.includes('# Project: my-app'), true);
183
- assert.strictEqual(content.includes('React'), true);
184
- });
185
- });
186
- });
187
- //# sourceMappingURL=techstack.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"techstack.test.js","sourceRoot":"","sources":["../../src/tests/techstack.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/tests/tools.test.ts"],"names":[],"mappings":""}
@@ -1,137 +0,0 @@
1
- import { describe, it, beforeEach, afterEach } from 'node:test';
2
- import assert from 'node:assert';
3
- import { mkdirSync, rmSync, writeFileSync } from 'fs';
4
- import { join } from 'path';
5
- import { tmpdir } from 'os';
6
- import { startProject } from '../tools/phase.js';
7
- import { audit } from '../tools/audit.js';
8
- import { checkDocs } from '../tools/docs.js';
9
- import { constructOneshot } from '../tools/oneshot.js';
10
- import { triggerTornado } from '../tools/tornado.js';
11
- import { expandHorizon } from '../tools/horizon.js';
12
- describe('MCP Tools', () => {
13
- const testDir = join(tmpdir(), 'midas-tools-test-' + Date.now());
14
- beforeEach(() => {
15
- mkdirSync(testDir, { recursive: true });
16
- });
17
- afterEach(() => {
18
- rmSync(testDir, { recursive: true, force: true });
19
- });
20
- describe('startProject', () => {
21
- it('creates docs directory with templates', () => {
22
- const result = startProject({ projectName: 'test-app', projectPath: testDir });
23
- assert.strictEqual(result.success, true);
24
- assert.strictEqual(result.message.includes('test-app'), true);
25
- });
26
- it('returns next steps', () => {
27
- const result = startProject({ projectName: 'test', projectPath: testDir });
28
- assert.strictEqual(result.nextSteps.length > 0, true);
29
- });
30
- });
31
- describe('audit', () => {
32
- it('returns scores for all 12 ingredients', () => {
33
- const result = audit({ projectPath: testDir });
34
- const keys = Object.keys(result.scores);
35
- assert.strictEqual(keys.length, 12);
36
- });
37
- it('detects missing components', () => {
38
- const result = audit({ projectPath: testDir });
39
- // Empty project should have low scores
40
- assert.strictEqual(result.overall < 30, true);
41
- });
42
- it('detects package.json dependencies', () => {
43
- // Create a package.json with react
44
- const pkg = { dependencies: { react: '18.0.0' } };
45
- writeFileSync(join(testDir, 'package.json'), JSON.stringify(pkg));
46
- const result = audit({ projectPath: testDir });
47
- assert.strictEqual(result.scores['1-frontend'].exists, true);
48
- });
49
- it('assigns appropriate level', () => {
50
- const result = audit({ projectPath: testDir });
51
- assert.strictEqual(['functional', 'integrated', 'protected', 'production'].includes(result.level), true);
52
- });
53
- });
54
- describe('checkDocs', () => {
55
- it('reports missing docs', () => {
56
- const result = checkDocs({ projectPath: testDir });
57
- assert.strictEqual(result.brainlift.exists, false);
58
- assert.strictEqual(result.prd.exists, false);
59
- assert.strictEqual(result.gameplan.exists, false);
60
- assert.strictEqual(result.ready, false);
61
- });
62
- it('detects incomplete docs with placeholders', () => {
63
- // Create docs with unfilled placeholders
64
- mkdirSync(join(testDir, 'docs'), { recursive: true });
65
- writeFileSync(join(testDir, 'docs', 'brainlift.md'), '# Brainlift\n## Contrarian\n[Fill this in]\n## Domain\nSome content\n## Lessons\nMore content');
66
- const result = checkDocs({ projectPath: testDir });
67
- assert.strictEqual(result.brainlift.exists, true);
68
- assert.strictEqual(result.brainlift.complete, false);
69
- assert.strictEqual(result.brainlift.issues.length > 0, true);
70
- });
71
- });
72
- describe('constructOneshot', () => {
73
- it('constructs retry prompt with error', () => {
74
- const result = constructOneshot({
75
- originalPrompt: 'Create a button',
76
- error: 'TypeError: Cannot read property',
77
- });
78
- assert.strictEqual(result.prompt.includes('Create a button'), true);
79
- assert.strictEqual(result.prompt.includes('TypeError'), true);
80
- });
81
- it('includes learnings if provided', () => {
82
- const result = constructOneshot({
83
- originalPrompt: 'Create a button',
84
- error: 'Failed',
85
- learnings: ['Check null values', 'Validate input'],
86
- });
87
- assert.strictEqual(result.prompt.includes('Check null values'), true);
88
- assert.strictEqual(result.prompt.includes('Validate input'), true);
89
- });
90
- });
91
- describe('triggerTornado', () => {
92
- it('starts with research step', () => {
93
- const result = triggerTornado({ problem: 'Button not working' });
94
- assert.strictEqual(result.nextStep, 'research');
95
- });
96
- it('progresses through cycle', () => {
97
- const r1 = triggerTornado({ problem: 'Bug', currentStep: 'research' });
98
- assert.strictEqual(r1.nextStep, 'logs');
99
- const r2 = triggerTornado({ problem: 'Bug', currentStep: 'logs' });
100
- assert.strictEqual(r2.nextStep, 'tests');
101
- const r3 = triggerTornado({ problem: 'Bug', currentStep: 'tests' });
102
- assert.strictEqual(r3.nextStep, 'research'); // Cycles back
103
- });
104
- it('includes relevant guidance and prompt', () => {
105
- const result = triggerTornado({ problem: 'API error' });
106
- assert.strictEqual(typeof result.guidance, 'string');
107
- assert.strictEqual(typeof result.prompt, 'string');
108
- assert.strictEqual(result.prompt.includes('API error'), true);
109
- });
110
- });
111
- describe('expandHorizon', () => {
112
- it('returns checklist categories', () => {
113
- const result = expandHorizon({
114
- currentOutput: 'Generic component',
115
- expectedOutput: 'Component matching our design system',
116
- });
117
- assert.strictEqual(result.checklist.length, 6);
118
- assert.strictEqual(result.checklist.some(c => c.includes('INTEGRATIONS')), true);
119
- });
120
- it('generates expanded prompt', () => {
121
- const result = expandHorizon({
122
- currentOutput: 'Created new util',
123
- expectedOutput: 'Use existing pattern from utils/',
124
- });
125
- assert.strictEqual(result.expandedPrompt.includes('Created new util'), true);
126
- assert.strictEqual(result.expandedPrompt.includes('Patterns'), true);
127
- });
128
- it('identifies missing context', () => {
129
- const result = expandHorizon({
130
- currentOutput: 'generic solution',
131
- expectedOutput: 'specific implementation',
132
- });
133
- assert.strictEqual(result.missingContext.length > 0, true);
134
- });
135
- });
136
- });
137
- //# sourceMappingURL=tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/tests/tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tracker.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracker.test.d.ts","sourceRoot":"","sources":["../../src/tests/tracker.test.ts"],"names":[],"mappings":""}