midas-mcp 2.2.0 → 2.5.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 (75) hide show
  1. package/dist/analyzer.d.ts +14 -0
  2. package/dist/analyzer.d.ts.map +1 -1
  3. package/dist/analyzer.js +182 -67
  4. package/dist/analyzer.js.map +1 -1
  5. package/dist/cli.js +6 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config.js +1 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/context.d.ts +55 -0
  10. package/dist/context.d.ts.map +1 -0
  11. package/dist/context.js +336 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/security.d.ts +29 -0
  14. package/dist/security.d.ts.map +1 -0
  15. package/dist/security.js +72 -0
  16. package/dist/security.js.map +1 -0
  17. package/dist/server.d.ts.map +1 -1
  18. package/dist/server.js +13 -2
  19. package/dist/server.js.map +1 -1
  20. package/dist/tests/analyze.test.d.ts +2 -0
  21. package/dist/tests/analyze.test.d.ts.map +1 -0
  22. package/dist/tests/analyze.test.js +120 -0
  23. package/dist/tests/analyze.test.js.map +1 -0
  24. package/dist/tests/edge-cases.test.d.ts +2 -0
  25. package/dist/tests/edge-cases.test.d.ts.map +1 -0
  26. package/dist/tests/edge-cases.test.js +234 -0
  27. package/dist/tests/edge-cases.test.js.map +1 -0
  28. package/dist/tests/journal.test.d.ts +2 -0
  29. package/dist/tests/journal.test.d.ts.map +1 -0
  30. package/dist/tests/journal.test.js +184 -0
  31. package/dist/tests/journal.test.js.map +1 -0
  32. package/dist/tests/metrics.test.d.ts +2 -0
  33. package/dist/tests/metrics.test.d.ts.map +1 -0
  34. package/dist/tests/metrics.test.js +178 -0
  35. package/dist/tests/metrics.test.js.map +1 -0
  36. package/dist/tests/prompts.test.d.ts +2 -0
  37. package/dist/tests/prompts.test.d.ts.map +1 -0
  38. package/dist/tests/prompts.test.js +157 -0
  39. package/dist/tests/prompts.test.js.map +1 -0
  40. package/dist/tests/security.test.d.ts +2 -0
  41. package/dist/tests/security.test.d.ts.map +1 -0
  42. package/dist/tests/security.test.js +105 -0
  43. package/dist/tests/security.test.js.map +1 -0
  44. package/dist/tests/server.test.d.ts +2 -0
  45. package/dist/tests/server.test.d.ts.map +1 -0
  46. package/dist/tests/server.test.js +93 -0
  47. package/dist/tests/server.test.js.map +1 -0
  48. package/dist/tests/tracker.test.d.ts +2 -0
  49. package/dist/tests/tracker.test.d.ts.map +1 -0
  50. package/dist/tests/tracker.test.js +197 -0
  51. package/dist/tests/tracker.test.js.map +1 -0
  52. package/dist/tools/index.d.ts +1 -0
  53. package/dist/tools/index.d.ts.map +1 -1
  54. package/dist/tools/index.js +2 -0
  55. package/dist/tools/index.js.map +1 -1
  56. package/dist/tools/journal.d.ts.map +1 -1
  57. package/dist/tools/journal.js +15 -10
  58. package/dist/tools/journal.js.map +1 -1
  59. package/dist/tools/phase.d.ts +1 -0
  60. package/dist/tools/phase.d.ts.map +1 -1
  61. package/dist/tools/phase.js +55 -16
  62. package/dist/tools/phase.js.map +1 -1
  63. package/dist/tools/tornado.d.ts +2 -2
  64. package/dist/tools/verify.d.ts +137 -0
  65. package/dist/tools/verify.d.ts.map +1 -0
  66. package/dist/tools/verify.js +151 -0
  67. package/dist/tools/verify.js.map +1 -0
  68. package/dist/tracker.d.ts +86 -0
  69. package/dist/tracker.d.ts.map +1 -1
  70. package/dist/tracker.js +493 -47
  71. package/dist/tracker.js.map +1 -1
  72. package/dist/tui.d.ts.map +1 -1
  73. package/dist/tui.js +131 -15
  74. package/dist/tui.js.map +1 -1
  75. package/package.json +2 -3
@@ -0,0 +1,336 @@
1
+ /**
2
+ * Context Compression and Management for Midas
3
+ *
4
+ * Implements the "Lost in the Middle" principle:
5
+ * - BEGINNING: Stable context (methodology, current phase)
6
+ * - MIDDLE: Project context (summarized)
7
+ * - END: Recent context (full detail)
8
+ */
9
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { loadState } from './state/phase.js';
12
+ import { loadTracker, getGatesStatus, getUnresolvedErrors } from './tracker.js';
13
+ import { getJournalEntries } from './tools/journal.js';
14
+ import { sanitizePath } from './security.js';
15
+ const MIDAS_DIR = '.midas';
16
+ const CACHE_FILE = 'context-cache.json';
17
+ // Token estimation (rough: 1 token ≈ 4 chars for English)
18
+ export function estimateTokens(text) {
19
+ return Math.ceil(text.length / 4);
20
+ }
21
+ function getCachePath(projectPath) {
22
+ return join(projectPath, MIDAS_DIR, CACHE_FILE);
23
+ }
24
+ function loadCache(projectPath) {
25
+ const path = getCachePath(projectPath);
26
+ if (existsSync(path)) {
27
+ try {
28
+ return JSON.parse(readFileSync(path, 'utf-8'));
29
+ }
30
+ catch {
31
+ return {};
32
+ }
33
+ }
34
+ return {};
35
+ }
36
+ function saveCache(projectPath, cache) {
37
+ const dir = join(projectPath, MIDAS_DIR);
38
+ if (!existsSync(dir)) {
39
+ mkdirSync(dir, { recursive: true });
40
+ }
41
+ writeFileSync(getCachePath(projectPath), JSON.stringify(cache, null, 2));
42
+ }
43
+ function getCachedSummary(projectPath, content, maxTokens) {
44
+ const cache = loadCache(projectPath);
45
+ const key = `${simpleHash(content)}-${maxTokens}`;
46
+ const entry = cache[key];
47
+ if (entry && Date.now() - entry.timestamp < 3600000) { // 1 hour cache
48
+ return entry.summary;
49
+ }
50
+ return null;
51
+ }
52
+ function setCachedSummary(projectPath, content, maxTokens, summary) {
53
+ const cache = loadCache(projectPath);
54
+ const key = `${simpleHash(content)}-${maxTokens}`;
55
+ cache[key] = {
56
+ summary,
57
+ timestamp: Date.now(),
58
+ originalTokens: estimateTokens(content),
59
+ summaryTokens: estimateTokens(summary),
60
+ };
61
+ // Keep cache size reasonable (max 100 entries)
62
+ const keys = Object.keys(cache);
63
+ if (keys.length > 100) {
64
+ const oldest = keys
65
+ .sort((a, b) => cache[a].timestamp - cache[b].timestamp)
66
+ .slice(0, 20);
67
+ oldest.forEach(k => delete cache[k]);
68
+ }
69
+ saveCache(projectPath, cache);
70
+ }
71
+ function simpleHash(str) {
72
+ let hash = 0;
73
+ for (let i = 0; i < str.length; i++) {
74
+ const char = str.charCodeAt(i);
75
+ hash = ((hash << 5) - hash) + char;
76
+ hash = hash & hash;
77
+ }
78
+ return Math.abs(hash).toString(36);
79
+ }
80
+ // ============================================================================
81
+ // COMPRESSION STRATEGIES
82
+ // ============================================================================
83
+ /**
84
+ * Truncate text to approximate token limit, preferring sentence boundaries
85
+ */
86
+ export function truncateToTokens(text, maxTokens) {
87
+ const currentTokens = estimateTokens(text);
88
+ if (currentTokens <= maxTokens)
89
+ return text;
90
+ const targetChars = maxTokens * 4;
91
+ let truncated = text.slice(0, targetChars);
92
+ // Try to end at sentence boundary
93
+ const lastPeriod = truncated.lastIndexOf('. ');
94
+ const lastNewline = truncated.lastIndexOf('\n');
95
+ const boundary = Math.max(lastPeriod, lastNewline);
96
+ if (boundary > targetChars * 0.7) {
97
+ truncated = truncated.slice(0, boundary + 1);
98
+ }
99
+ return truncated + '...';
100
+ }
101
+ /**
102
+ * Extract key points from text (simple keyword-based)
103
+ */
104
+ export function extractKeyPoints(text, maxPoints = 5) {
105
+ const lines = text.split('\n').filter(l => l.trim());
106
+ const points = [];
107
+ // Prioritize lines with key indicators
108
+ const keyIndicators = ['error', 'fix', 'implement', 'test', 'build', 'deploy', 'decision', 'chose', 'because'];
109
+ for (const line of lines) {
110
+ if (points.length >= maxPoints)
111
+ break;
112
+ const lower = line.toLowerCase();
113
+ if (keyIndicators.some(k => lower.includes(k))) {
114
+ points.push(line.trim().slice(0, 100));
115
+ }
116
+ }
117
+ // Fill with first lines if not enough
118
+ for (const line of lines) {
119
+ if (points.length >= maxPoints)
120
+ break;
121
+ if (!points.includes(line.trim().slice(0, 100))) {
122
+ points.push(line.trim().slice(0, 100));
123
+ }
124
+ }
125
+ return points;
126
+ }
127
+ /**
128
+ * Summarize journal entries to titles + key decisions
129
+ */
130
+ export function summarizeJournalEntries(entries) {
131
+ if (entries.length === 0)
132
+ return 'No journal entries.';
133
+ const lines = [];
134
+ for (const entry of entries.slice(0, 5)) {
135
+ const date = entry.timestamp.slice(0, 10);
136
+ const keyPoints = extractKeyPoints(entry.conversation, 2);
137
+ lines.push(`- ${date}: ${entry.title}`);
138
+ keyPoints.forEach(p => lines.push(` > ${p.slice(0, 80)}`));
139
+ }
140
+ return lines.join('\n');
141
+ }
142
+ // ============================================================================
143
+ // CONTEXT BUILDING
144
+ // ============================================================================
145
+ const METHODOLOGY_COMPRESSED = `Golden Code: EAGLE_SIGHT (plan) → BUILD (code) → SHIP (deploy) → GROW (iterate)
146
+ BUILD cycle: RULES → INDEX → READ → RESEARCH → IMPLEMENT → TEST → DEBUG
147
+ If stuck: Tornado (research + logs + tests). If output doesn't fit: Horizon (expand context).
148
+ Gates must pass (build/test/lint) before advancing.`;
149
+ export function buildCompressedContext(projectPath, options = {}) {
150
+ const safePath = sanitizePath(projectPath);
151
+ const maxTokens = options.maxTokens || 4000;
152
+ const layers = [];
153
+ let totalTokens = 0;
154
+ // ─────────────────────────────────────────────────────────────────────────
155
+ // BEGINNING: Stable context (high attention)
156
+ // ─────────────────────────────────────────────────────────────────────────
157
+ // Layer 1: Methodology (always, ~100 tokens)
158
+ layers.push({
159
+ name: 'methodology',
160
+ priority: 'critical',
161
+ position: 'beginning',
162
+ content: METHODOLOGY_COMPRESSED,
163
+ tokens: estimateTokens(METHODOLOGY_COMPRESSED),
164
+ });
165
+ // Layer 2: Current state
166
+ const state = loadState(safePath);
167
+ const tracker = loadTracker(safePath);
168
+ const gatesStatus = getGatesStatus(safePath);
169
+ const stateContent = [
170
+ `Phase: ${state.current.phase}${'step' in state.current ? ` → ${state.current.step}` : ''}`,
171
+ `Gates: ${gatesStatus.allPass ? 'ALL PASS' : gatesStatus.failing.length > 0 ? `FAILING: ${gatesStatus.failing.join(', ')}` : 'not run'}`,
172
+ tracker.currentTask ? `Task: ${tracker.currentTask.description}` : '',
173
+ ].filter(Boolean).join('\n');
174
+ layers.push({
175
+ name: 'current_state',
176
+ priority: 'critical',
177
+ position: 'beginning',
178
+ content: stateContent,
179
+ tokens: estimateTokens(stateContent),
180
+ });
181
+ // ─────────────────────────────────────────────────────────────────────────
182
+ // MIDDLE: Project context (lower attention, summarized)
183
+ // ─────────────────────────────────────────────────────────────────────────
184
+ // Layer 3: Journal summaries
185
+ const journalEntries = getJournalEntries({ projectPath: safePath, limit: 5 });
186
+ const journalSummary = summarizeJournalEntries(journalEntries);
187
+ layers.push({
188
+ name: 'journal_summary',
189
+ priority: 'medium',
190
+ position: 'middle',
191
+ content: `Past sessions:\n${journalSummary}`,
192
+ tokens: estimateTokens(journalSummary),
193
+ });
194
+ // Layer 4: Recent files (just names)
195
+ if (tracker.recentFiles.length > 0) {
196
+ const fileList = tracker.recentFiles.slice(0, 10).map(f => f.path).join(', ');
197
+ layers.push({
198
+ name: 'recent_files',
199
+ priority: 'low',
200
+ position: 'middle',
201
+ content: `Recently modified: ${fileList}`,
202
+ tokens: estimateTokens(fileList) + 20,
203
+ });
204
+ }
205
+ // ─────────────────────────────────────────────────────────────────────────
206
+ // END: Recent context (high attention, full detail)
207
+ // ─────────────────────────────────────────────────────────────────────────
208
+ // Layer 5: Unresolved errors (FULL - critical for debugging)
209
+ const errors = getUnresolvedErrors(safePath);
210
+ if (errors.length > 0) {
211
+ const errorContent = errors.slice(0, 3).map(e => {
212
+ const attempts = e.fixAttempts.length > 0
213
+ ? ` (tried ${e.fixAttempts.length}x: ${e.fixAttempts.map(a => a.approach).join(', ')})`
214
+ : '';
215
+ return `ERROR: ${e.error}${attempts}`;
216
+ }).join('\n\n');
217
+ layers.push({
218
+ name: 'errors',
219
+ priority: 'high',
220
+ position: 'end',
221
+ content: errorContent,
222
+ tokens: estimateTokens(errorContent),
223
+ });
224
+ }
225
+ // Layer 6: Recent tool calls
226
+ if (tracker.recentToolCalls.length > 0) {
227
+ const toolContent = tracker.recentToolCalls.slice(0, 5).map(t => {
228
+ const ago = Math.round((Date.now() - t.timestamp) / 60000);
229
+ return `${t.tool} (${ago}m ago)`;
230
+ }).join('\n');
231
+ layers.push({
232
+ name: 'recent_tools',
233
+ priority: 'medium',
234
+ position: 'end',
235
+ content: `Recent actions:\n${toolContent}`,
236
+ tokens: estimateTokens(toolContent) + 20,
237
+ });
238
+ }
239
+ // Layer 7: Current task (if set)
240
+ if (options.taskDescription) {
241
+ layers.push({
242
+ name: 'current_task',
243
+ priority: 'critical',
244
+ position: 'end',
245
+ content: `CURRENT TASK: ${options.taskDescription}`,
246
+ tokens: estimateTokens(options.taskDescription) + 20,
247
+ });
248
+ }
249
+ // ─────────────────────────────────────────────────────────────────────────
250
+ // ASSEMBLE: Fit within token budget
251
+ // ─────────────────────────────────────────────────────────────────────────
252
+ // Sort by priority and position
253
+ const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
254
+ const positionOrder = { beginning: 0, end: 1, middle: 2 };
255
+ layers.sort((a, b) => {
256
+ const priorityDiff = priorityOrder[a.priority] - priorityOrder[b.priority];
257
+ if (priorityDiff !== 0)
258
+ return priorityDiff;
259
+ return positionOrder[a.position] - positionOrder[b.position];
260
+ });
261
+ // Include layers until token limit
262
+ const included = [];
263
+ let usedTokens = 0;
264
+ let truncated = false;
265
+ for (const layer of layers) {
266
+ if (usedTokens + layer.tokens <= maxTokens) {
267
+ included.push(layer);
268
+ usedTokens += layer.tokens;
269
+ }
270
+ else if (layer.priority === 'critical') {
271
+ // Always include critical, even if truncated
272
+ const available = maxTokens - usedTokens;
273
+ if (available > 100) {
274
+ const truncatedContent = truncateToTokens(layer.content, available);
275
+ included.push({
276
+ ...layer,
277
+ content: truncatedContent,
278
+ tokens: estimateTokens(truncatedContent),
279
+ });
280
+ usedTokens += estimateTokens(truncatedContent);
281
+ truncated = true;
282
+ }
283
+ }
284
+ else {
285
+ truncated = true;
286
+ }
287
+ }
288
+ // Re-sort by position for final output
289
+ included.sort((a, b) => positionOrder[a.position] - positionOrder[b.position]);
290
+ return {
291
+ layers: included,
292
+ totalTokens: usedTokens,
293
+ truncated,
294
+ };
295
+ }
296
+ /**
297
+ * Convert compressed context to a single string for the API
298
+ */
299
+ export function contextToString(context) {
300
+ const sections = [];
301
+ const beginning = context.layers.filter(l => l.position === 'beginning');
302
+ const middle = context.layers.filter(l => l.position === 'middle');
303
+ const end = context.layers.filter(l => l.position === 'end');
304
+ if (beginning.length > 0) {
305
+ sections.push('# METHODOLOGY & STATE\n' + beginning.map(l => l.content).join('\n\n'));
306
+ }
307
+ if (middle.length > 0) {
308
+ sections.push('# PROJECT CONTEXT\n' + middle.map(l => l.content).join('\n\n'));
309
+ }
310
+ if (end.length > 0) {
311
+ sections.push('# CURRENT SITUATION\n' + end.map(l => l.content).join('\n\n'));
312
+ }
313
+ return sections.join('\n\n---\n\n');
314
+ }
315
+ /**
316
+ * Get context stats for debugging/monitoring
317
+ */
318
+ export function getContextStats(projectPath) {
319
+ const context = buildCompressedContext(projectPath);
320
+ const layerBreakdown = {};
321
+ for (const layer of context.layers) {
322
+ layerBreakdown[layer.name] = layer.tokens;
323
+ }
324
+ // Estimate what full context would be
325
+ const tracker = loadTracker(projectPath);
326
+ const journal = getJournalEntries({ projectPath, limit: 10 });
327
+ const fullEstimate = estimateTokens(METHODOLOGY_COMPRESSED) * 5 + // Full methodology
328
+ tracker.recentFiles.length * 500 + // File contents
329
+ journal.reduce((sum, j) => sum + estimateTokens(j.conversation), 0);
330
+ return {
331
+ estimatedTokens: context.totalTokens,
332
+ layerBreakdown,
333
+ compressionRatio: fullEstimate > 0 ? context.totalTokens / fullEstimate : 1,
334
+ };
335
+ }
336
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Sanitize and validate a project path to prevent path traversal attacks.
3
+ * Returns a safe, absolute path within allowed boundaries.
4
+ */
5
+ export declare function sanitizePath(inputPath: string | undefined, basePath?: string): string;
6
+ /**
7
+ * Validate a path is safe for shell commands (no metacharacters)
8
+ */
9
+ export declare function isShellSafe(path: string): boolean;
10
+ /**
11
+ * Sanitize a string for use in git commands
12
+ */
13
+ export declare function sanitizeForGit(path: string): string;
14
+ /**
15
+ * Limit string length for storage/processing
16
+ */
17
+ export declare function limitLength(input: string, maxLength: number): string;
18
+ /**
19
+ * Validate that a value is one of the allowed values
20
+ */
21
+ export declare function validateEnum<T extends string>(value: string, allowed: readonly T[]): T | null;
22
+ export declare const LIMITS: {
23
+ readonly CONVERSATION_MAX_LENGTH: 500000;
24
+ readonly TITLE_MAX_LENGTH: 200;
25
+ readonly TAG_MAX_LENGTH: 50;
26
+ readonly MAX_TAGS: 20;
27
+ readonly PATH_MAX_LENGTH: 1000;
28
+ };
29
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA8BrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIjD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAE7F;AAGD,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { resolve, normalize, relative, isAbsolute } from 'path';
2
+ import { existsSync } from 'fs';
3
+ /**
4
+ * Sanitize and validate a project path to prevent path traversal attacks.
5
+ * Returns a safe, absolute path within allowed boundaries.
6
+ */
7
+ export function sanitizePath(inputPath, basePath) {
8
+ const base = basePath || process.cwd();
9
+ if (!inputPath) {
10
+ return base;
11
+ }
12
+ // Normalize to remove .. and . segments
13
+ const normalized = normalize(inputPath);
14
+ // If absolute, verify it doesn't escape intended directories
15
+ if (isAbsolute(normalized)) {
16
+ // For absolute paths, ensure they exist and are directories
17
+ if (!existsSync(normalized)) {
18
+ return base;
19
+ }
20
+ return normalized;
21
+ }
22
+ // For relative paths, resolve against base
23
+ const resolved = resolve(base, normalized);
24
+ // Ensure the resolved path is still within the base
25
+ const rel = relative(base, resolved);
26
+ if (rel.startsWith('..') || isAbsolute(rel)) {
27
+ // Path escapes base - return base instead
28
+ return base;
29
+ }
30
+ return resolved;
31
+ }
32
+ /**
33
+ * Validate a path is safe for shell commands (no metacharacters)
34
+ */
35
+ export function isShellSafe(path) {
36
+ // Reject paths with shell metacharacters
37
+ const dangerousChars = /[;&|`$(){}[\]<>\\!#*?'"]/;
38
+ return !dangerousChars.test(path);
39
+ }
40
+ /**
41
+ * Sanitize a string for use in git commands
42
+ */
43
+ export function sanitizeForGit(path) {
44
+ if (!isShellSafe(path)) {
45
+ throw new Error('Path contains unsafe characters for shell commands');
46
+ }
47
+ return path;
48
+ }
49
+ /**
50
+ * Limit string length for storage/processing
51
+ */
52
+ export function limitLength(input, maxLength) {
53
+ if (input.length <= maxLength) {
54
+ return input;
55
+ }
56
+ return input.slice(0, maxLength) + '... [truncated]';
57
+ }
58
+ /**
59
+ * Validate that a value is one of the allowed values
60
+ */
61
+ export function validateEnum(value, allowed) {
62
+ return allowed.includes(value) ? value : null;
63
+ }
64
+ // Max sizes for various inputs
65
+ export const LIMITS = {
66
+ CONVERSATION_MAX_LENGTH: 500000, // ~500KB
67
+ TITLE_MAX_LENGTH: 200,
68
+ TAG_MAX_LENGTH: 50,
69
+ MAX_TAGS: 20,
70
+ PATH_MAX_LENGTH: 1000,
71
+ };
72
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,SAA6B,EAAE,QAAiB;IAC3E,MAAM,IAAI,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wCAAwC;IACxC,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,6DAA6D;IAC7D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,4DAA4D;QAC5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE3C,oDAAoD;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,0CAA0C;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,yCAAyC;IACzC,MAAM,cAAc,GAAG,0BAA0B,CAAC;IAClD,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,SAAiB;IAC1D,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,iBAAiB,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAmB,KAAa,EAAE,OAAqB;IACjF,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAU,CAAC,CAAC,CAAC,CAAE,KAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,+BAA+B;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,uBAAuB,EAAE,MAAM,EAAE,SAAS;IAC1C,gBAAgB,EAAE,GAAG;IACrB,cAAc,EAAE,EAAE;IAClB,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE,IAAI;CACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqCpE,wBAAgB,YAAY,IAAI,SAAS,CA6KxC"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsDpE,wBAAgB,YAAY,IAAI,SAAS,CAsOxC"}
package/dist/server.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { startProject, startProjectSchema, getPhase, getPhaseSchema, setPhaseManually, setPhaseSchema, audit, auditSchema, checkDocs, checkDocsSchema, constructOneshot, oneshotSchema, triggerTornado, tornadoSchema, expandHorizon, horizonSchema, analyze, analyzeSchema, suggestPrompt, suggestPromptSchema, advancePhase, advancePhaseSchema, saveToJournal, saveJournalSchema, getJournalEntries, getJournalSchema, searchJournal, searchJournalSchema, } from './tools/index.js';
2
+ import { startProject, startProjectSchema, getPhase, getPhaseSchema, setPhaseManually, setPhaseSchema, audit, auditSchema, checkDocs, checkDocsSchema, constructOneshot, oneshotSchema, triggerTornado, tornadoSchema, expandHorizon, horizonSchema, analyze, analyzeSchema, suggestPrompt, suggestPromptSchema, advancePhase, advancePhaseSchema, saveToJournal, saveJournalSchema, getJournalEntries, getJournalSchema, searchJournal, searchJournalSchema,
3
+ // New verification and smart suggestion tools
4
+ verify, verifySchema, smartSuggest, smartSuggestSchema, setTask, setTaskSchema, updateTask, updateTaskSchema, clearTask, clearTaskSchema, recordErrorTool, recordErrorSchema, recordFix, recordFixSchema, getStuck, getStuckSchema, } from './tools/index.js';
3
5
  import { registerAllPrompts } from './prompts/index.js';
4
6
  import { registerAllResources } from './resources/index.js';
5
7
  import { logger } from './logger.js';
@@ -80,13 +82,22 @@ export function createServer() {
80
82
  server.tool('midas_journal_save', 'Save a full conversation to the project journal. Use this after important discussions, decisions, or implementations to preserve context for future sessions.', saveJournalSchema.shape, wrapTool('midas_journal_save', saveToJournal));
81
83
  server.tool('midas_journal_list', 'Get recent journal entries to understand project history and past decisions', getJournalSchema.shape, wrapTool('midas_journal_list', getJournalEntries));
82
84
  server.tool('midas_journal_search', 'Search journal entries for specific topics, decisions, or implementations', searchJournalSchema.shape, wrapTool('midas_journal_search', searchJournal));
85
+ // Verification and smart suggestion tools
86
+ server.tool('midas_verify', 'Run verification gates: build, test, lint. Returns pass/fail status and auto-advances phase if all pass.', verifySchema.shape, wrapTool('midas_verify', verify));
87
+ server.tool('midas_smart_suggest', 'Get an intelligent prompt suggestion based on current gates, errors, and phase. Prioritizes fixing broken builds/tests.', smartSuggestSchema.shape, wrapTool('midas_smart_suggest', smartSuggest));
88
+ server.tool('midas_set_task', 'Set the current task focus. Helps Midas track what you are working on.', setTaskSchema.shape, wrapTool('midas_set_task', setTask));
89
+ server.tool('midas_update_task', 'Update the current task phase (plan, implement, verify, reflect).', updateTaskSchema.shape, wrapTool('midas_update_task', updateTask));
90
+ server.tool('midas_clear_task', 'Clear the current task focus when done.', clearTaskSchema.shape, wrapTool('midas_clear_task', clearTask));
91
+ server.tool('midas_record_error', 'Record an error for tracking. Helps Midas remember what errors occurred and suggest Tornado when stuck.', recordErrorSchema.shape, wrapTool('midas_record_error', recordErrorTool));
92
+ server.tool('midas_record_fix', 'Record a fix attempt for an error. Helps Midas track what approaches have been tried.', recordFixSchema.shape, wrapTool('midas_record_fix', recordFix));
93
+ server.tool('midas_get_stuck', 'Get errors that have had multiple failed fix attempts. These are candidates for Tornado debugging.', getStuckSchema.shape, wrapTool('midas_get_stuck', getStuck));
83
94
  // Register prompts
84
95
  registerAllPrompts(server);
85
96
  logger.debug('Registered prompts');
86
97
  // Register resources
87
98
  registerAllResources(server);
88
99
  logger.debug('Registered resources');
89
- logger.info('Midas MCP server ready', { tools: 14, prompts: 17, resources: 5 });
100
+ logger.info('Midas MCP server ready', { tools: 22, prompts: 17, resources: 5 });
90
101
  return server;
91
102
  }
92
103
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyze.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.test.d.ts","sourceRoot":"","sources":["../../src/tests/analyze.test.ts"],"names":[],"mappings":""}