resolve-solo 0.3.0 → 0.4.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.
@@ -0,0 +1,366 @@
1
+ /**
2
+ * Shared command handlers for all modes (CLI, REPL, MCP)
3
+ *
4
+ * Handlers contain business logic only and return structured results.
5
+ * Each mode is responsible for formatting and displaying results appropriately.
6
+ */
7
+ import { generateDemoData } from './demo-generator.js';
8
+ import { saveDemoData, loadDemoData, deleteDemoData, demoDataExists, } from './storage.js';
9
+ import { buildTimeline, deduplicateTimeline } from './timeline.js';
10
+ import { generateInvestigationPaths, findRecallMatches, detectMissingSignals, generateSuggestions, } from './investigation.js';
11
+ import { saveSession, getActiveSession, getTimelineItem, addNote as dbAddNote, getNotes, closeSession as dbCloseSession, } from './database.js';
12
+ /**
13
+ * Handle demo command - automated investigation
14
+ */
15
+ export async function handleDemo(context) {
16
+ try {
17
+ // Seed data if needed
18
+ if (!demoDataExists()) {
19
+ const dataset = generateDemoData();
20
+ saveDemoData(dataset);
21
+ }
22
+ // Load demo data
23
+ const dataset = loadDemoData();
24
+ if (!dataset) {
25
+ return {
26
+ success: false,
27
+ message: 'Failed to load demo data',
28
+ error: 'Try running demo reset',
29
+ };
30
+ }
31
+ // Run investigation
32
+ const query = 'API Gateway timeout spike';
33
+ const rawTimeline = buildTimeline(dataset, {
34
+ hoursAgo: 48,
35
+ maxItems: 20,
36
+ });
37
+ const timeline = deduplicateTimeline(rawTimeline);
38
+ const paths = generateInvestigationPaths(timeline, dataset);
39
+ const recall = findRecallMatches(query, dataset);
40
+ const missingSignals = detectMissingSignals(timeline);
41
+ const suggestions = generateSuggestions(timeline);
42
+ const result = {
43
+ mode: 'demo',
44
+ sessionId: `demo-${Date.now()}`,
45
+ query,
46
+ timeWindow: 'Last 48 hours',
47
+ timeline,
48
+ paths,
49
+ recall,
50
+ missingSignals,
51
+ suggestions,
52
+ };
53
+ return {
54
+ success: true,
55
+ message: 'Demo investigation complete',
56
+ data: result,
57
+ };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ success: false,
62
+ message: 'Demo failed',
63
+ error: error instanceof Error ? error.message : String(error),
64
+ };
65
+ }
66
+ }
67
+ /**
68
+ * Handle investigate command - custom query
69
+ */
70
+ export async function handleInvestigate(query, context) {
71
+ try {
72
+ // Check for demo data
73
+ if (!demoDataExists()) {
74
+ return {
75
+ success: false,
76
+ message: 'No demo data found',
77
+ error: 'Run demo seed first, or use demo mode',
78
+ };
79
+ }
80
+ // Load demo data
81
+ const dataset = loadDemoData();
82
+ if (!dataset) {
83
+ return {
84
+ success: false,
85
+ message: 'Failed to load demo data',
86
+ error: 'Try running demo reset',
87
+ };
88
+ }
89
+ // Build timeline with query filtering
90
+ const timeline = buildTimeline(dataset, {
91
+ hoursAgo: 48,
92
+ maxItems: 15,
93
+ query,
94
+ });
95
+ const dedupedTimeline = deduplicateTimeline(timeline, { maxPerService: 3 });
96
+ // Generate investigation data
97
+ const paths = generateInvestigationPaths(dedupedTimeline, dataset);
98
+ const recall = findRecallMatches(query, dataset);
99
+ const missingSignals = detectMissingSignals(dedupedTimeline);
100
+ const suggestions = generateSuggestions(dedupedTimeline);
101
+ // Create investigation result
102
+ const result = {
103
+ mode: 'demo',
104
+ sessionId: context.sessionId || `inv-${Date.now()}`,
105
+ query,
106
+ timeWindow: 'Last 48 hours',
107
+ timeline: dedupedTimeline,
108
+ paths,
109
+ recall,
110
+ missingSignals,
111
+ suggestions,
112
+ };
113
+ // Save session to database
114
+ saveSession(result);
115
+ return {
116
+ success: true,
117
+ message: 'Investigation complete',
118
+ data: result,
119
+ };
120
+ }
121
+ catch (error) {
122
+ return {
123
+ success: false,
124
+ message: 'Investigation failed',
125
+ error: error instanceof Error ? error.message : String(error),
126
+ };
127
+ }
128
+ }
129
+ /**
130
+ * Handle show details command
131
+ */
132
+ export async function handleDetails(itemNumber, context) {
133
+ try {
134
+ // Get active session
135
+ const session = getActiveSession();
136
+ if (!session) {
137
+ return {
138
+ success: false,
139
+ message: 'No active investigation session',
140
+ error: 'Run investigate command first',
141
+ };
142
+ }
143
+ // Validate item number
144
+ if (isNaN(itemNumber) || itemNumber < 1) {
145
+ return {
146
+ success: false,
147
+ message: 'Invalid item number',
148
+ error: 'Item number must be a positive integer',
149
+ };
150
+ }
151
+ // Get timeline item
152
+ const item = getTimelineItem(session.sessionId, itemNumber);
153
+ if (!item) {
154
+ return {
155
+ success: false,
156
+ message: `Item ${itemNumber} not found`,
157
+ error: 'Check timeline for available items',
158
+ };
159
+ }
160
+ return {
161
+ success: true,
162
+ message: `Details for item ${itemNumber}`,
163
+ data: {
164
+ itemNumber,
165
+ sessionId: session.sessionId,
166
+ item,
167
+ },
168
+ };
169
+ }
170
+ catch (error) {
171
+ return {
172
+ success: false,
173
+ message: 'Failed to get details',
174
+ error: error instanceof Error ? error.message : String(error),
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * Handle note command
180
+ */
181
+ export async function handleNote(note, context) {
182
+ try {
183
+ if (!note.trim()) {
184
+ return {
185
+ success: false,
186
+ message: 'Note cannot be empty',
187
+ error: 'Provide note text',
188
+ };
189
+ }
190
+ // Get active session
191
+ const session = getActiveSession();
192
+ if (!session) {
193
+ return {
194
+ success: false,
195
+ message: 'No active investigation session',
196
+ error: 'Run investigate command first',
197
+ };
198
+ }
199
+ // Add note
200
+ dbAddNote(session.sessionId, note);
201
+ return {
202
+ success: true,
203
+ message: 'Note added',
204
+ data: {
205
+ sessionId: session.sessionId,
206
+ note,
207
+ },
208
+ };
209
+ }
210
+ catch (error) {
211
+ return {
212
+ success: false,
213
+ message: 'Failed to add note',
214
+ error: error instanceof Error ? error.message : String(error),
215
+ };
216
+ }
217
+ }
218
+ /**
219
+ * Handle close command
220
+ */
221
+ export async function handleClose(resolution, context) {
222
+ try {
223
+ // Get active session
224
+ const session = getActiveSession();
225
+ if (!session) {
226
+ return {
227
+ success: false,
228
+ message: 'No active investigation session',
229
+ error: 'Run investigate command first',
230
+ };
231
+ }
232
+ const finalResolution = resolution.trim() || 'Investigation closed';
233
+ // Get all notes
234
+ const notes = getNotes(session.sessionId);
235
+ // For now, use a default time saved (15 min)
236
+ // In CLI/REPL modes, this will be prompted interactively
237
+ const timeSaved = 15;
238
+ // Close session
239
+ dbCloseSession(session.sessionId, finalResolution, timeSaved);
240
+ return {
241
+ success: true,
242
+ message: 'Investigation closed',
243
+ data: {
244
+ sessionId: session.sessionId,
245
+ query: session.query,
246
+ resolution: finalResolution,
247
+ notes,
248
+ timeSaved,
249
+ },
250
+ };
251
+ }
252
+ catch (error) {
253
+ return {
254
+ success: false,
255
+ message: 'Failed to close investigation',
256
+ error: error instanceof Error ? error.message : String(error),
257
+ };
258
+ }
259
+ }
260
+ /**
261
+ * Handle demo seed command
262
+ */
263
+ export function handleDemoSeed(context) {
264
+ try {
265
+ const alreadyExists = demoDataExists();
266
+ if (alreadyExists) {
267
+ return {
268
+ success: false,
269
+ message: 'Demo data already exists',
270
+ error: 'Use demo reset to regenerate',
271
+ };
272
+ }
273
+ const dataset = generateDemoData();
274
+ saveDemoData(dataset);
275
+ return {
276
+ success: true,
277
+ message: 'Demo data seeded successfully',
278
+ data: {
279
+ services: dataset.services.length,
280
+ deploys: dataset.deploys.length,
281
+ logs: dataset.logs.length,
282
+ incidents: dataset.incidents.length,
283
+ },
284
+ };
285
+ }
286
+ catch (error) {
287
+ return {
288
+ success: false,
289
+ message: 'Failed to seed demo data',
290
+ error: error instanceof Error ? error.message : String(error),
291
+ };
292
+ }
293
+ }
294
+ /**
295
+ * Handle demo reset command
296
+ */
297
+ export function handleDemoReset(context) {
298
+ try {
299
+ const exists = demoDataExists();
300
+ if (exists) {
301
+ deleteDemoData();
302
+ }
303
+ const dataset = generateDemoData();
304
+ saveDemoData(dataset);
305
+ return {
306
+ success: true,
307
+ message: 'Demo data reset successfully',
308
+ data: {
309
+ services: dataset.services.length,
310
+ deploys: dataset.deploys.length,
311
+ logs: dataset.logs.length,
312
+ incidents: dataset.incidents.length,
313
+ },
314
+ };
315
+ }
316
+ catch (error) {
317
+ return {
318
+ success: false,
319
+ message: 'Failed to reset demo data',
320
+ error: error instanceof Error ? error.message : String(error),
321
+ };
322
+ }
323
+ }
324
+ /**
325
+ * Handle setup command - configure Claude Code integration
326
+ */
327
+ export async function handleSetup(context) {
328
+ try {
329
+ const setup = await import('./setup.js');
330
+ const { setupClaudeIntegration, verifyBinaryAccessible, getManualInstructions } = setup;
331
+ // First verify the binary is accessible
332
+ if (!verifyBinaryAccessible()) {
333
+ return {
334
+ success: false,
335
+ message: 'resolve-solo-mcp binary not found in PATH',
336
+ error: 'Try running: npm install -g resolve-solo',
337
+ };
338
+ }
339
+ // Attempt auto-configuration
340
+ const result = setupClaudeIntegration();
341
+ if (result.success) {
342
+ return {
343
+ success: true,
344
+ message: result.message,
345
+ data: {
346
+ method: result.method,
347
+ configPath: result.configPath,
348
+ },
349
+ };
350
+ }
351
+ // Auto-config failed, return manual instructions
352
+ return {
353
+ success: false,
354
+ message: 'Could not automatically configure Claude Code',
355
+ error: getManualInstructions(),
356
+ };
357
+ }
358
+ catch (error) {
359
+ return {
360
+ success: false,
361
+ message: 'Setup failed',
362
+ error: error instanceof Error ? error.message : String(error),
363
+ };
364
+ }
365
+ }
366
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Tool Definitions and Execution
3
+ *
4
+ * Defines the tools exposed to Claude Code and routes execution to handlers.
5
+ */
6
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
7
+ import type { HandlerResult } from '../handlers.js';
8
+ /**
9
+ * Register all available MCP tools
10
+ */
11
+ export declare function registerTools(): Tool[];
12
+ /**
13
+ * Execute a tool by name with given arguments
14
+ */
15
+ export declare function executeTool(name: string, args: Record<string, unknown>): Promise<HandlerResult>;
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAmEtC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * MCP Tool Definitions and Execution
3
+ *
4
+ * Defines the tools exposed to Claude Code and routes execution to handlers.
5
+ */
6
+ import * as handlers from '../handlers.js';
7
+ /**
8
+ * Register all available MCP tools
9
+ */
10
+ export function registerTools() {
11
+ return [
12
+ {
13
+ name: 'investigate',
14
+ description: 'Start investigation for an incident or issue. Creates a new investigation session with timeline of relevant events, suggested investigation paths, and recall of similar past incidents.',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ query: {
19
+ type: 'string',
20
+ description: 'What to investigate (e.g., "timeouts on api gateway", "database connection errors", "payment service crashes")',
21
+ },
22
+ },
23
+ required: ['query'],
24
+ },
25
+ },
26
+ {
27
+ name: 'get_details',
28
+ description: 'Get detailed information for a specific timeline item from the current investigation. Shows full event details including type, target, timestamp, summary, and additional metadata.',
29
+ inputSchema: {
30
+ type: 'object',
31
+ properties: {
32
+ item_number: {
33
+ type: 'number',
34
+ description: 'Timeline item number (1-based index from the investigation timeline)',
35
+ },
36
+ },
37
+ required: ['item_number'],
38
+ },
39
+ },
40
+ {
41
+ name: 'add_note',
42
+ description: 'Add a note to the current investigation session. Notes are saved with the session and included in the final incident report.',
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ note: {
47
+ type: 'string',
48
+ description: 'Note content (e.g., "checked connection pool config", "found memory leak in worker process")',
49
+ },
50
+ },
51
+ required: ['note'],
52
+ },
53
+ },
54
+ {
55
+ name: 'close_incident',
56
+ description: 'Close the current investigation with a resolution. Saves the session to memory for future recall, records time saved, and makes investigation available for similar incident matching.',
57
+ inputSchema: {
58
+ type: 'object',
59
+ properties: {
60
+ resolution: {
61
+ type: 'string',
62
+ description: 'How the incident was resolved (e.g., "increased connection pool size", "rollback to previous version", "restarted crashed service")',
63
+ },
64
+ },
65
+ required: ['resolution'],
66
+ },
67
+ },
68
+ {
69
+ name: 'generate_report',
70
+ description: 'Generate a weekly incident report showing all closed investigations, time saved, and common patterns. Useful for IT/Security stakeholders.',
71
+ inputSchema: {
72
+ type: 'object',
73
+ properties: {},
74
+ },
75
+ },
76
+ ];
77
+ }
78
+ /**
79
+ * Execute a tool by name with given arguments
80
+ */
81
+ export async function executeTool(name, args) {
82
+ const context = {
83
+ mode: 'mcp',
84
+ };
85
+ switch (name) {
86
+ case 'investigate':
87
+ return handlers.handleInvestigate(String(args.query), context);
88
+ case 'get_details':
89
+ return handlers.handleDetails(Number(args.item_number), context);
90
+ case 'add_note':
91
+ return handlers.handleNote(String(args.note), context);
92
+ case 'close_incident':
93
+ return handlers.handleClose(String(args.resolution), context);
94
+ case 'generate_report':
95
+ // TODO: Implement in M8 (Weekly Report)
96
+ return {
97
+ success: false,
98
+ message: 'Weekly reports not yet implemented',
99
+ error: 'This feature will be available in v0.5.0',
100
+ };
101
+ default:
102
+ throw new Error(`Unknown tool: ${name}`);
103
+ }
104
+ }
105
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,0LAA0L;YACvM,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,gHAAgH;qBAC9H;iBACF;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;SACF;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,qLAAqL;YAClM,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,sEAAsE;qBACpF;iBACF;gBACD,QAAQ,EAAE,CAAC,aAAa,CAAC;aAC1B;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,8HAA8H;YAC3I,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8FAA8F;qBAC5G;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,wLAAwL;YACrM,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,qIAAqI;qBACnJ;iBACF;gBACD,QAAQ,EAAE,CAAC,YAAY,CAAC;aACzB;SACF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,4IAA4I;YACzJ,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,IAA6B;IAE7B,MAAM,OAAO,GAA4B;QACvC,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAEjE,KAAK,aAAa;YAChB,OAAO,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAEnE,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAEzD,KAAK,gBAAgB;YACnB,OAAO,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAEhE,KAAK,iBAAiB;YACpB,wCAAwC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oCAAoC;gBAC7C,KAAK,EAAE,0CAA0C;aAClD,CAAC;QAEJ;YACE,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server Binary Entry Point
4
+ *
5
+ * Standalone entry point for the resolve-solo-mcp binary.
6
+ * This file is referenced in package.json bin field.
7
+ */
8
+ import './mcp-server.js';
9
+ //# sourceMappingURL=mcp-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-cli.d.ts","sourceRoot":"","sources":["../src/mcp-cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server Binary Entry Point
4
+ *
5
+ * Standalone entry point for the resolve-solo-mcp binary.
6
+ * This file is referenced in package.json bin field.
7
+ */
8
+ import './mcp-server.js';
9
+ //# sourceMappingURL=mcp-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-cli.js","sourceRoot":"","sources":["../src/mcp-cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server Entry Point
4
+ *
5
+ * Exposes Resolve Solo functionality as MCP tools for Claude Code integration.
6
+ * Uses stdio transport for subprocess communication.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}