@grafema/mcp 0.2.5-beta → 0.2.6-beta

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 (79) hide show
  1. package/README.md +49 -25
  2. package/dist/analysis-worker.js +8 -4
  3. package/dist/analysis-worker.js.map +1 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +15 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/definitions.d.ts.map +1 -1
  8. package/dist/definitions.js +69 -0
  9. package/dist/definitions.js.map +1 -1
  10. package/dist/handlers/analysis-handlers.d.ts +9 -0
  11. package/dist/handlers/analysis-handlers.d.ts.map +1 -0
  12. package/dist/handlers/analysis-handlers.js +73 -0
  13. package/dist/handlers/analysis-handlers.js.map +1 -0
  14. package/dist/handlers/context-handlers.d.ts +21 -0
  15. package/dist/handlers/context-handlers.d.ts.map +1 -0
  16. package/dist/handlers/context-handlers.js +330 -0
  17. package/dist/handlers/context-handlers.js.map +1 -0
  18. package/dist/handlers/coverage-handlers.d.ts +6 -0
  19. package/dist/handlers/coverage-handlers.d.ts.map +1 -0
  20. package/dist/handlers/coverage-handlers.js +42 -0
  21. package/dist/handlers/coverage-handlers.js.map +1 -0
  22. package/dist/handlers/dataflow-handlers.d.ts +8 -0
  23. package/dist/handlers/dataflow-handlers.d.ts.map +1 -0
  24. package/dist/handlers/dataflow-handlers.js +140 -0
  25. package/dist/handlers/dataflow-handlers.js.map +1 -0
  26. package/dist/handlers/documentation-handlers.d.ts +6 -0
  27. package/dist/handlers/documentation-handlers.d.ts.map +1 -0
  28. package/dist/handlers/documentation-handlers.js +79 -0
  29. package/dist/handlers/documentation-handlers.js.map +1 -0
  30. package/dist/handlers/guarantee-handlers.d.ts +21 -0
  31. package/dist/handlers/guarantee-handlers.d.ts.map +1 -0
  32. package/dist/handlers/guarantee-handlers.js +251 -0
  33. package/dist/handlers/guarantee-handlers.js.map +1 -0
  34. package/dist/handlers/guard-handlers.d.ts +14 -0
  35. package/dist/handlers/guard-handlers.d.ts.map +1 -0
  36. package/dist/handlers/guard-handlers.js +77 -0
  37. package/dist/handlers/guard-handlers.js.map +1 -0
  38. package/dist/handlers/index.d.ts +14 -0
  39. package/dist/handlers/index.d.ts.map +1 -0
  40. package/dist/handlers/index.js +14 -0
  41. package/dist/handlers/index.js.map +1 -0
  42. package/dist/handlers/issue-handlers.d.ts +6 -0
  43. package/dist/handlers/issue-handlers.d.ts.map +1 -0
  44. package/dist/handlers/issue-handlers.js +66 -0
  45. package/dist/handlers/issue-handlers.js.map +1 -0
  46. package/dist/handlers/project-handlers.d.ts +7 -0
  47. package/dist/handlers/project-handlers.d.ts.map +1 -0
  48. package/dist/handlers/project-handlers.js +153 -0
  49. package/dist/handlers/project-handlers.js.map +1 -0
  50. package/dist/handlers/query-handlers.d.ts +8 -0
  51. package/dist/handlers/query-handlers.d.ts.map +1 -0
  52. package/dist/handlers/query-handlers.js +171 -0
  53. package/dist/handlers/query-handlers.js.map +1 -0
  54. package/dist/handlers.d.ts +3 -1
  55. package/dist/handlers.d.ts.map +1 -1
  56. package/dist/handlers.js +199 -4
  57. package/dist/handlers.js.map +1 -1
  58. package/dist/server.js +7 -1
  59. package/dist/server.js.map +1 -1
  60. package/dist/types.d.ts +9 -0
  61. package/dist/types.d.ts.map +1 -1
  62. package/package.json +3 -3
  63. package/src/analysis-worker.ts +10 -2
  64. package/src/config.ts +24 -0
  65. package/src/definitions.ts +70 -0
  66. package/src/handlers/analysis-handlers.ts +105 -0
  67. package/src/handlers/context-handlers.ts +410 -0
  68. package/src/handlers/coverage-handlers.ts +56 -0
  69. package/src/handlers/dataflow-handlers.ts +193 -0
  70. package/src/handlers/documentation-handlers.ts +89 -0
  71. package/src/handlers/guarantee-handlers.ts +278 -0
  72. package/src/handlers/guard-handlers.ts +100 -0
  73. package/src/handlers/index.ts +14 -0
  74. package/src/handlers/issue-handlers.ts +81 -0
  75. package/src/handlers/project-handlers.ts +200 -0
  76. package/src/handlers/query-handlers.ts +232 -0
  77. package/src/server.ts +13 -1
  78. package/src/types.ts +15 -0
  79. package/src/handlers.ts +0 -1373
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MCP Documentation Handlers
3
+ */
4
+ import { getOnboardingInstruction } from '@grafema/core';
5
+ import { textResult, } from '../utils.js';
6
+ // === DOCUMENTATION ===
7
+ export async function handleGetDocumentation(args) {
8
+ const { topic = 'overview' } = args;
9
+ const docs = {
10
+ onboarding: getOnboardingInstruction(),
11
+ overview: `
12
+ # Grafema Code Analysis
13
+
14
+ Grafema is a static code analyzer that builds a graph of your codebase.
15
+
16
+ ## Key Tools
17
+ - query_graph: Execute Datalog queries
18
+ - find_calls: Find function/method calls
19
+ - trace_alias: Trace variable aliases
20
+ - check_invariant: Verify code invariants
21
+
22
+ ## Quick Start
23
+ 1. Use get_stats to see graph size
24
+ 2. Use find_nodes to explore the codebase
25
+ 3. Use query_graph for complex queries
26
+ `,
27
+ queries: `
28
+ # Datalog Queries
29
+
30
+ ## Syntax
31
+ violation(X) :- node(X, "TYPE"), attr(X, "name", "value").
32
+
33
+ ## Available Predicates
34
+ - node(Id, Type) - match nodes
35
+ - edge(Src, Dst, Type) - match edges
36
+ - attr(Id, Name, Value) - match attributes
37
+ - \\+ - negation (not)
38
+
39
+ ## Examples
40
+ Find all functions:
41
+ violation(X) :- node(X, "FUNCTION").
42
+
43
+ Find unresolved calls:
44
+ violation(X) :- node(X, "CALL"), \\+ edge(X, _, "CALLS").
45
+ `,
46
+ types: `
47
+ # Node & Edge Types
48
+
49
+ ## Core Node Types
50
+ - MODULE, FUNCTION, CLASS, METHOD, VARIABLE
51
+ - CALL, PROPERTY_ACCESS, IMPORT, EXPORT, PARAMETER
52
+
53
+ ## HTTP/Network
54
+ - http:route, http:request, db:query
55
+
56
+ ## Edge Types
57
+ - CONTAINS, CALLS, DEPENDS_ON
58
+ - ASSIGNED_FROM, INSTANCE_OF, PASSES_ARGUMENT
59
+ `,
60
+ guarantees: `
61
+ # Code Guarantees
62
+
63
+ Guarantees are persistent code invariants.
64
+
65
+ ## Create
66
+ Use create_guarantee with a name and Datalog rule.
67
+
68
+ ## Check
69
+ Use check_guarantees to verify all guarantees.
70
+
71
+ ## Example
72
+ Name: no-eval
73
+ Rule: violation(X) :- node(X, "CALL"), attr(X, "name", "eval").
74
+ `,
75
+ };
76
+ const content = docs[topic] || docs.overview;
77
+ return textResult(content.trim());
78
+ }
79
+ //# sourceMappingURL=documentation-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentation-handlers.js","sourceRoot":"","sources":["../../src/handlers/documentation-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,UAAU,GACX,MAAM,aAAa,CAAC;AAMrB,wBAAwB;AAExB,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAA0B;IACrE,MAAM,EAAE,KAAK,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;IAEpC,MAAM,IAAI,GAA2B;QACnC,UAAU,EAAE,wBAAwB,EAAE;QACtC,QAAQ,EAAE;;;;;;;;;;;;;;;CAeb;QACG,OAAO,EAAE;;;;;;;;;;;;;;;;;;CAkBZ;QACG,KAAK,EAAE;;;;;;;;;;;;;CAaV;QACG,UAAU,EAAE;;;;;;;;;;;;;;CAcf;KACE,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;IAC7C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MCP Guarantee Handlers
3
+ */
4
+ import type { ToolResult, CreateGuaranteeArgs, CheckGuaranteesArgs, DeleteGuaranteeArgs } from '../types.js';
5
+ /**
6
+ * Create a new guarantee (Datalog-based or contract-based)
7
+ */
8
+ export declare function handleCreateGuarantee(args: CreateGuaranteeArgs): Promise<ToolResult>;
9
+ /**
10
+ * List all guarantees (both Datalog-based and contract-based)
11
+ */
12
+ export declare function handleListGuarantees(): Promise<ToolResult>;
13
+ /**
14
+ * Check guarantees (both Datalog-based and contract-based)
15
+ */
16
+ export declare function handleCheckGuarantees(args: CheckGuaranteesArgs): Promise<ToolResult>;
17
+ /**
18
+ * Delete a guarantee
19
+ */
20
+ export declare function handleDeleteGuarantee(args: DeleteGuaranteeArgs): Promise<ToolResult>;
21
+ //# sourceMappingURL=guarantee-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarantee-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/guarantee-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAKrB;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8D1F;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,CA0ChE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyG1F;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+B1F"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * MCP Guarantee Handlers
3
+ */
4
+ import { getOrCreateBackend, getGuaranteeManager, getGuaranteeAPI } from '../state.js';
5
+ import { textResult, errorResult, } from '../utils.js';
6
+ import { isGuaranteeType } from '@grafema/core';
7
+ // === GUARANTEE HANDLERS ===
8
+ /**
9
+ * Create a new guarantee (Datalog-based or contract-based)
10
+ */
11
+ export async function handleCreateGuarantee(args) {
12
+ await getOrCreateBackend(); // Ensure managers are initialized
13
+ const { name, rule, type, priority, status, owner, schema, condition, description, governs, severity } = args;
14
+ try {
15
+ // Determine if this is a contract-based guarantee
16
+ if (type && isGuaranteeType(type)) {
17
+ // Contract-based guarantee
18
+ const api = getGuaranteeAPI();
19
+ if (!api) {
20
+ return errorResult('GuaranteeAPI not initialized');
21
+ }
22
+ const guarantee = await api.createGuarantee({
23
+ type,
24
+ name,
25
+ priority,
26
+ status,
27
+ owner,
28
+ schema,
29
+ condition,
30
+ description,
31
+ governs,
32
+ });
33
+ return textResult(`✅ Created contract-based guarantee: ${guarantee.id}\n` +
34
+ `Type: ${guarantee.type}\n` +
35
+ `Priority: ${guarantee.priority}\n` +
36
+ `Status: ${guarantee.status}` +
37
+ (guarantee.description ? `\nDescription: ${guarantee.description}` : ''));
38
+ }
39
+ else {
40
+ // Datalog-based guarantee
41
+ if (!rule) {
42
+ return errorResult('Datalog-based guarantee requires "rule" field');
43
+ }
44
+ const manager = getGuaranteeManager();
45
+ if (!manager) {
46
+ return errorResult('GuaranteeManager not initialized');
47
+ }
48
+ const guarantee = await manager.create({
49
+ id: name,
50
+ name,
51
+ rule,
52
+ severity: severity || 'warning',
53
+ governs: governs || ['**/*.js'],
54
+ });
55
+ return textResult(`✅ Created Datalog-based guarantee: ${guarantee.id}\n` +
56
+ `Rule: ${guarantee.rule}\n` +
57
+ `Severity: ${guarantee.severity}`);
58
+ }
59
+ }
60
+ catch (error) {
61
+ const message = error instanceof Error ? error.message : String(error);
62
+ return errorResult(`Failed to create guarantee: ${message}`);
63
+ }
64
+ }
65
+ /**
66
+ * List all guarantees (both Datalog-based and contract-based)
67
+ */
68
+ export async function handleListGuarantees() {
69
+ await getOrCreateBackend(); // Ensure managers are initialized
70
+ const results = [];
71
+ try {
72
+ // List Datalog-based guarantees
73
+ const manager = getGuaranteeManager();
74
+ if (manager) {
75
+ const datalogGuarantees = await manager.list();
76
+ if (datalogGuarantees.length > 0) {
77
+ results.push('## Datalog-based Guarantees\n');
78
+ for (const g of datalogGuarantees) {
79
+ results.push(`- **${g.id}** (${g.severity})`);
80
+ results.push(` Rule: ${g.rule.substring(0, 80)}${g.rule.length > 80 ? '...' : ''}`);
81
+ }
82
+ }
83
+ }
84
+ // List contract-based guarantees
85
+ const api = getGuaranteeAPI();
86
+ if (api) {
87
+ const contractGuarantees = await api.findGuarantees();
88
+ if (contractGuarantees.length > 0) {
89
+ if (results.length > 0)
90
+ results.push('\n');
91
+ results.push('## Contract-based Guarantees\n');
92
+ for (const g of contractGuarantees) {
93
+ results.push(`- **${g.id}** [${g.priority}] (${g.status})`);
94
+ if (g.description)
95
+ results.push(` ${g.description}`);
96
+ }
97
+ }
98
+ }
99
+ if (results.length === 0) {
100
+ return textResult('No guarantees defined yet.');
101
+ }
102
+ return textResult(results.join('\n'));
103
+ }
104
+ catch (error) {
105
+ const message = error instanceof Error ? error.message : String(error);
106
+ return errorResult(`Failed to list guarantees: ${message}`);
107
+ }
108
+ }
109
+ /**
110
+ * Check guarantees (both Datalog-based and contract-based)
111
+ */
112
+ export async function handleCheckGuarantees(args) {
113
+ await getOrCreateBackend(); // Ensure managers are initialized
114
+ const { names } = args;
115
+ const results = [];
116
+ let totalPassed = 0;
117
+ let totalFailed = 0;
118
+ try {
119
+ const manager = getGuaranteeManager();
120
+ const api = getGuaranteeAPI();
121
+ if (names && names.length > 0) {
122
+ // Check specific guarantees
123
+ for (const name of names) {
124
+ // Try Datalog-based first
125
+ if (manager) {
126
+ try {
127
+ const result = await manager.check(name);
128
+ if (result.passed) {
129
+ totalPassed++;
130
+ results.push(`✅ ${result.guaranteeId}: PASSED`);
131
+ }
132
+ else {
133
+ totalFailed++;
134
+ results.push(`❌ ${result.guaranteeId}: FAILED (${result.violationCount} violations)`);
135
+ for (const v of result.violations.slice(0, 5)) {
136
+ results.push(` - ${v.file}:${v.line} (${v.type})`);
137
+ }
138
+ if (result.violationCount > 5) {
139
+ results.push(` ... and ${result.violationCount - 5} more`);
140
+ }
141
+ }
142
+ continue;
143
+ }
144
+ catch {
145
+ // Not a Datalog guarantee, try contract-based
146
+ }
147
+ }
148
+ // Try contract-based
149
+ if (api) {
150
+ try {
151
+ const result = await api.checkGuarantee(name);
152
+ if (result.passed) {
153
+ totalPassed++;
154
+ results.push(`✅ ${result.id}: PASSED`);
155
+ }
156
+ else {
157
+ totalFailed++;
158
+ results.push(`❌ ${result.id}: FAILED`);
159
+ for (const err of result.errors.slice(0, 5)) {
160
+ results.push(` - ${err}`);
161
+ }
162
+ }
163
+ }
164
+ catch {
165
+ results.push(`⚠️ ${name}: Not found`);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ else {
171
+ // Check all guarantees
172
+ if (manager) {
173
+ const datalogResult = await manager.checkAll();
174
+ totalPassed += datalogResult.passed;
175
+ totalFailed += datalogResult.failed;
176
+ if (datalogResult.total > 0) {
177
+ results.push('## Datalog Guarantees\n');
178
+ for (const r of datalogResult.results) {
179
+ if (r.passed) {
180
+ results.push(`✅ ${r.guaranteeId}: PASSED`);
181
+ }
182
+ else {
183
+ results.push(`❌ ${r.guaranteeId}: FAILED (${r.violationCount} violations)`);
184
+ }
185
+ }
186
+ }
187
+ }
188
+ if (api) {
189
+ const contractResult = await api.checkAllGuarantees();
190
+ totalPassed += contractResult.passed;
191
+ totalFailed += contractResult.failed;
192
+ if (contractResult.total > 0) {
193
+ if (results.length > 0)
194
+ results.push('\n');
195
+ results.push('## Contract Guarantees\n');
196
+ for (const r of contractResult.results) {
197
+ if (r.passed) {
198
+ results.push(`✅ ${r.id}: PASSED`);
199
+ }
200
+ else {
201
+ results.push(`❌ ${r.id}: FAILED`);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ }
207
+ if (results.length === 0) {
208
+ return textResult('No guarantees to check.');
209
+ }
210
+ const summary = `\n---\nTotal: ${totalPassed + totalFailed} | ✅ Passed: ${totalPassed} | ❌ Failed: ${totalFailed}`;
211
+ return textResult(results.join('\n') + summary);
212
+ }
213
+ catch (error) {
214
+ const message = error instanceof Error ? error.message : String(error);
215
+ return errorResult(`Failed to check guarantees: ${message}`);
216
+ }
217
+ }
218
+ /**
219
+ * Delete a guarantee
220
+ */
221
+ export async function handleDeleteGuarantee(args) {
222
+ await getOrCreateBackend(); // Ensure managers are initialized
223
+ const { name } = args;
224
+ try {
225
+ // Try Datalog-based first
226
+ const manager = getGuaranteeManager();
227
+ if (manager) {
228
+ try {
229
+ await manager.delete(name);
230
+ return textResult(`✅ Deleted Datalog guarantee: ${name}`);
231
+ }
232
+ catch {
233
+ // Not found in Datalog, try contract-based
234
+ }
235
+ }
236
+ // Try contract-based
237
+ const api = getGuaranteeAPI();
238
+ if (api) {
239
+ const deleted = await api.deleteGuarantee(name);
240
+ if (deleted) {
241
+ return textResult(`✅ Deleted contract guarantee: ${name}`);
242
+ }
243
+ }
244
+ return errorResult(`Guarantee not found: ${name}`);
245
+ }
246
+ catch (error) {
247
+ const message = error instanceof Error ? error.message : String(error);
248
+ return errorResult(`Failed to delete guarantee: ${message}`);
249
+ }
250
+ }
251
+ //# sourceMappingURL=guarantee-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guarantee-handlers.js","sourceRoot":"","sources":["../../src/handlers/guarantee-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP Guard Handlers
3
+ */
4
+ import type { ToolResult, FindGuardsArgs } from '../types.js';
5
+ /**
6
+ * Find conditional guards protecting a node.
7
+ *
8
+ * Walks up the containment tree via CONTAINS edges, collecting
9
+ * SCOPE nodes that have conditional=true (if_statement, else_statement, etc.).
10
+ *
11
+ * Returns guards in inner-to-outer order.
12
+ */
13
+ export declare function handleFindGuards(args: FindGuardsArgs): Promise<ToolResult>;
14
+ //# sourceMappingURL=guard-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/guard-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EAEf,MAAM,aAAa,CAAC;AAIrB;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAyEhF"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * MCP Guard Handlers
3
+ */
4
+ import { getOrCreateBackend } from '../state.js';
5
+ import { serializeBigInt, textResult, errorResult, } from '../utils.js';
6
+ // === FIND GUARDS (REG-274) ===
7
+ /**
8
+ * Find conditional guards protecting a node.
9
+ *
10
+ * Walks up the containment tree via CONTAINS edges, collecting
11
+ * SCOPE nodes that have conditional=true (if_statement, else_statement, etc.).
12
+ *
13
+ * Returns guards in inner-to-outer order.
14
+ */
15
+ export async function handleFindGuards(args) {
16
+ const db = await getOrCreateBackend();
17
+ const { nodeId } = args;
18
+ // Verify target node exists
19
+ const targetNode = await db.getNode(nodeId);
20
+ if (!targetNode) {
21
+ return errorResult(`Node not found: ${nodeId}`);
22
+ }
23
+ const guards = [];
24
+ const visited = new Set();
25
+ let currentId = nodeId;
26
+ // Walk up the containment tree
27
+ while (true) {
28
+ if (visited.has(currentId))
29
+ break;
30
+ visited.add(currentId);
31
+ // Get parent via incoming CONTAINS edge
32
+ const incomingEdges = await db.getIncomingEdges(currentId, ['CONTAINS']);
33
+ if (incomingEdges.length === 0)
34
+ break;
35
+ const parentId = incomingEdges[0].src;
36
+ const parentNode = await db.getNode(parentId);
37
+ if (!parentNode)
38
+ break;
39
+ // Check if this is a conditional scope
40
+ if (parentNode.conditional) {
41
+ // Parse constraints if stored as string
42
+ let constraints = parentNode.constraints;
43
+ if (typeof constraints === 'string') {
44
+ try {
45
+ constraints = JSON.parse(constraints);
46
+ }
47
+ catch {
48
+ // Keep as string if not valid JSON
49
+ }
50
+ }
51
+ guards.push({
52
+ scopeId: parentNode.id,
53
+ scopeType: parentNode.scopeType || 'unknown',
54
+ condition: parentNode.condition,
55
+ constraints: constraints,
56
+ file: parentNode.file || '',
57
+ line: parentNode.line || 0,
58
+ });
59
+ }
60
+ currentId = parentId;
61
+ }
62
+ if (guards.length === 0) {
63
+ return textResult(`No guards found for node: ${nodeId}\n` +
64
+ `The node is not protected by any conditional scope (if/else/switch/etc.).`);
65
+ }
66
+ const summary = guards.map((g, i) => {
67
+ const indent = ' '.repeat(i);
68
+ return `${indent}${i + 1}. ${g.scopeType} at ${g.file}:${g.line}` +
69
+ (g.condition ? `\n${indent} condition: ${g.condition}` : '');
70
+ }).join('\n');
71
+ return textResult(`Found ${guards.length} guard(s) for node: ${nodeId}\n` +
72
+ `(inner to outer order)\n\n` +
73
+ summary +
74
+ `\n\n` +
75
+ JSON.stringify(serializeBigInt(guards), null, 2));
76
+ }
77
+ //# sourceMappingURL=guard-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-handlers.js","sourceRoot":"","sources":["../../src/handlers/guard-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAC;AAOrB,gCAAgC;AAEhC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAoB;IACzD,MAAM,EAAE,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,4BAA4B;IAC5B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,SAAS,GAAG,MAAM,CAAC;IAEvB,+BAA+B;IAC/B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,MAAM;QAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvB,wCAAwC;QACxC,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QACzE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAEtC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC,UAAU;YAAE,MAAM;QAEvB,uCAAuC;QACvC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,wCAAwC;YACxC,IAAI,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;YACzC,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;YACH,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,UAAU,CAAC,EAAE;gBACtB,SAAS,EAAG,UAAU,CAAC,SAAoB,IAAI,SAAS;gBACxD,SAAS,EAAE,UAAU,CAAC,SAA+B;gBACrD,WAAW,EAAE,WAAoC;gBACjD,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;gBAC3B,IAAI,EAAG,UAAU,CAAC,IAAe,IAAI,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;QAED,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CACf,6BAA6B,MAAM,IAAI;YACvC,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;YAC/D,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,iBAAiB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,UAAU,CACf,SAAS,MAAM,CAAC,MAAM,uBAAuB,MAAM,IAAI;QACvD,4BAA4B;QAC5B,OAAO;QACP,MAAM;QACN,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP Tool Handlers — barrel export
3
+ */
4
+ export { handleQueryGraph, handleFindCalls, handleFindNodes } from './query-handlers.js';
5
+ export { handleTraceAlias, handleTraceDataFlow, handleCheckInvariant } from './dataflow-handlers.js';
6
+ export { handleAnalyzeProject, handleGetAnalysisStatus, handleGetStats, handleGetSchema } from './analysis-handlers.js';
7
+ export { handleCreateGuarantee, handleListGuarantees, handleCheckGuarantees, handleDeleteGuarantee } from './guarantee-handlers.js';
8
+ export { handleGetFunctionDetails, handleGetContext, handleGetFileOverview } from './context-handlers.js';
9
+ export { handleReadProjectStructure, handleWriteConfig } from './project-handlers.js';
10
+ export { handleGetCoverage } from './coverage-handlers.js';
11
+ export { handleFindGuards } from './guard-handlers.js';
12
+ export { handleGetDocumentation } from './documentation-handlers.js';
13
+ export { handleReportIssue } from './issue-handlers.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACpI,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP Tool Handlers — barrel export
3
+ */
4
+ export { handleQueryGraph, handleFindCalls, handleFindNodes } from './query-handlers.js';
5
+ export { handleTraceAlias, handleTraceDataFlow, handleCheckInvariant } from './dataflow-handlers.js';
6
+ export { handleAnalyzeProject, handleGetAnalysisStatus, handleGetStats, handleGetSchema } from './analysis-handlers.js';
7
+ export { handleCreateGuarantee, handleListGuarantees, handleCheckGuarantees, handleDeleteGuarantee } from './guarantee-handlers.js';
8
+ export { handleGetFunctionDetails, handleGetContext, handleGetFileOverview } from './context-handlers.js';
9
+ export { handleReadProjectStructure, handleWriteConfig } from './project-handlers.js';
10
+ export { handleGetCoverage } from './coverage-handlers.js';
11
+ export { handleFindGuards } from './guard-handlers.js';
12
+ export { handleGetDocumentation } from './documentation-handlers.js';
13
+ export { handleReportIssue } from './issue-handlers.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxH,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACpI,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Issue Handlers
3
+ */
4
+ import type { ToolResult, ReportIssueArgs } from '../types.js';
5
+ export declare function handleReportIssue(args: ReportIssueArgs): Promise<ToolResult>;
6
+ //# sourceMappingURL=issue-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/issue-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAChB,MAAM,aAAa,CAAC;AAIrB,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAkElF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * MCP Issue Handlers
3
+ */
4
+ import { textResult, } from '../utils.js';
5
+ // === BUG REPORTING ===
6
+ export async function handleReportIssue(args) {
7
+ const { title, description, context, labels = ['bug'] } = args;
8
+ // Use user's token if provided, otherwise fall back to project's issue-only token
9
+ const GRAFEMA_ISSUE_TOKEN = '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';
10
+ const githubToken = process.env.GITHUB_TOKEN || GRAFEMA_ISSUE_TOKEN;
11
+ const repo = 'Disentinel/grafema';
12
+ // Build issue body
13
+ const body = `## Description
14
+ ${description}
15
+
16
+ ${context ? `## Context\n\`\`\`\n${context}\n\`\`\`\n` : ''}
17
+ ## Environment
18
+ - Grafema version: 0.1.0-alpha.1
19
+ - Reported via: MCP tool
20
+
21
+ ---
22
+ *This issue was automatically created via Grafema MCP server.*`;
23
+ // Try GitHub API if token is available
24
+ if (githubToken) {
25
+ try {
26
+ const response = await fetch(`https://api.github.com/repos/${repo}/issues`, {
27
+ method: 'POST',
28
+ headers: {
29
+ 'Authorization': `token ${githubToken}`,
30
+ 'Content-Type': 'application/json',
31
+ 'Accept': 'application/vnd.github.v3+json',
32
+ },
33
+ body: JSON.stringify({
34
+ title,
35
+ body,
36
+ labels: labels.filter(l => ['bug', 'enhancement', 'documentation', 'question'].includes(l)),
37
+ }),
38
+ });
39
+ if (response.ok) {
40
+ const issue = await response.json();
41
+ return textResult(`✅ Issue created successfully!\n\n` +
42
+ `**Issue #${issue.number}**: ${issue.html_url}\n\n` +
43
+ `Thank you for reporting this issue.`);
44
+ }
45
+ else {
46
+ const error = await response.text();
47
+ throw new Error(`GitHub API error: ${response.status} - ${error}`);
48
+ }
49
+ }
50
+ catch (error) {
51
+ // Fall through to manual template if API fails
52
+ console.error('[report_issue] GitHub API failed:', error);
53
+ }
54
+ }
55
+ // Fallback: return template for manual submission
56
+ const issueUrl = `https://github.com/${repo}/issues/new`;
57
+ const encodedTitle = encodeURIComponent(title);
58
+ const encodedBody = encodeURIComponent(body);
59
+ const encodedLabels = encodeURIComponent(labels.join(','));
60
+ const directUrl = `${issueUrl}?title=${encodedTitle}&body=${encodedBody}&labels=${encodedLabels}`;
61
+ return textResult(`⚠️ Failed to create issue automatically. Please create it manually:\n\n` +
62
+ `**Quick link** (may truncate long descriptions):\n${directUrl}\n\n` +
63
+ `**Or copy this template to** ${issueUrl}:\n\n` +
64
+ `---\n**Title:** ${title}\n\n${body}\n---`);
65
+ }
66
+ //# sourceMappingURL=issue-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-handlers.js","sourceRoot":"","sources":["../../src/handlers/issue-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,UAAU,GACX,MAAM,aAAa,CAAC;AAMrB,wBAAwB;AAExB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAqB;IAC3D,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;IAC/D,kFAAkF;IAClF,MAAM,mBAAmB,GAAG,+FAA+F,CAAC;IAC5H,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;IACpE,MAAM,IAAI,GAAG,oBAAoB,CAAC;IAElC,mBAAmB;IACnB,MAAM,IAAI,GAAG;EACb,WAAW;;EAEX,OAAO,CAAC,CAAC,CAAC,uBAAuB,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE;;;;;;+DAMI,CAAC;IAE9D,uCAAuC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,IAAI,SAAS,EAAE;gBAC1E,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,SAAS,WAAW,EAAE;oBACvC,cAAc,EAAE,kBAAkB;oBAClC,QAAQ,EAAE,gCAAgC;iBAC3C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,IAAI;oBACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;iBAC5F,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA0C,CAAC;gBAC5E,OAAO,UAAU,CACf,mCAAmC;oBACnC,YAAY,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,QAAQ,MAAM;oBACnD,qCAAqC,CACtC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+CAA+C;YAC/C,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,sBAAsB,IAAI,aAAa,CAAC;IACzD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,GAAG,QAAQ,UAAU,YAAY,SAAS,WAAW,WAAW,aAAa,EAAE,CAAC;IAElG,OAAO,UAAU,CACf,yEAAyE;QACzE,qDAAqD,SAAS,MAAM;QACpE,gCAAgC,QAAQ,OAAO;QAC/C,mBAAmB,KAAK,OAAO,IAAI,OAAO,CAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP Project Handlers
3
+ */
4
+ import type { ToolResult, ReadProjectStructureArgs, WriteConfigArgs } from '../types.js';
5
+ export declare function handleReadProjectStructure(args: ReadProjectStructureArgs): Promise<ToolResult>;
6
+ export declare function handleWriteConfig(args: WriteConfigArgs): Promise<ToolResult>;
7
+ //# sourceMappingURL=project-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/project-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,KAAK,EACV,UAAU,EACV,wBAAwB,EACxB,eAAe,EAChB,MAAM,aAAa,CAAC;AAIrB,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,UAAU,CAAC,CA8ErB;AAID,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,UAAU,CAAC,CA2FrB"}