statecli-mcp-server 0.1.2 → 0.3.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 (45) hide show
  1. package/README.md +334 -153
  2. package/dist/cross-file-impact.d.ts +85 -0
  3. package/dist/cross-file-impact.d.ts.map +1 -0
  4. package/dist/cross-file-impact.js +338 -0
  5. package/dist/cross-file-impact.js.map +1 -0
  6. package/dist/dependency-tracker.d.ts +78 -0
  7. package/dist/dependency-tracker.d.ts.map +1 -0
  8. package/dist/dependency-tracker.js +334 -0
  9. package/dist/dependency-tracker.js.map +1 -0
  10. package/dist/enhanced-mcp-server.d.ts +50 -0
  11. package/dist/enhanced-mcp-server.d.ts.map +1 -0
  12. package/dist/enhanced-mcp-server.js +664 -0
  13. package/dist/enhanced-mcp-server.js.map +1 -0
  14. package/dist/error-recovery.d.ts +66 -0
  15. package/dist/error-recovery.d.ts.map +1 -0
  16. package/dist/error-recovery.js +210 -0
  17. package/dist/error-recovery.js.map +1 -0
  18. package/dist/file-tracker.d.ts +81 -0
  19. package/dist/file-tracker.d.ts.map +1 -0
  20. package/dist/file-tracker.js +252 -0
  21. package/dist/file-tracker.js.map +1 -0
  22. package/dist/git-integration.d.ts +95 -0
  23. package/dist/git-integration.d.ts.map +1 -0
  24. package/dist/git-integration.js +219 -0
  25. package/dist/git-integration.js.map +1 -0
  26. package/dist/index-enhanced.d.ts +12 -0
  27. package/dist/index-enhanced.d.ts.map +1 -0
  28. package/dist/index-enhanced.js +27 -0
  29. package/dist/index-enhanced.js.map +1 -0
  30. package/dist/rollback-preview.d.ts +77 -0
  31. package/dist/rollback-preview.d.ts.map +1 -0
  32. package/dist/rollback-preview.js +244 -0
  33. package/dist/rollback-preview.js.map +1 -0
  34. package/dist/session-memory.d.ts +85 -0
  35. package/dist/session-memory.d.ts.map +1 -0
  36. package/dist/session-memory.js +325 -0
  37. package/dist/session-memory.js.map +1 -0
  38. package/dist/test-awareness.d.ts +85 -0
  39. package/dist/test-awareness.d.ts.map +1 -0
  40. package/dist/test-awareness.js +329 -0
  41. package/dist/test-awareness.js.map +1 -0
  42. package/dist/types.d.ts +11 -8
  43. package/dist/types.d.ts.map +1 -1
  44. package/dist/types.js.map +1 -1
  45. package/package.json +3 -2
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+ /**
3
+ * Session Memory - Cross-session persistence and memory
4
+ *
5
+ * Remembers what happened across sessions and provides memory queries
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.SessionMemory = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ class SessionMemory {
45
+ statecli;
46
+ sessionId;
47
+ sessionStartTime;
48
+ memoryDir;
49
+ constructor(statecli, memoryDir) {
50
+ this.statecli = statecli;
51
+ this.sessionId = this.generateSessionId();
52
+ this.sessionStartTime = new Date().toISOString();
53
+ this.memoryDir = memoryDir || path.join(process.cwd(), '.statecli', 'memory');
54
+ this.ensureMemoryDir();
55
+ this.recordSessionStart();
56
+ }
57
+ /**
58
+ * Get current session ID
59
+ */
60
+ getSessionId() {
61
+ return this.sessionId;
62
+ }
63
+ /**
64
+ * Query memory across sessions
65
+ */
66
+ queryMemory(query) {
67
+ const sessions = this.getSessions();
68
+ const matchingSessions = [];
69
+ const matchingChanges = [];
70
+ for (const session of sessions) {
71
+ // Load session data
72
+ const sessionData = this.loadSessionData(session.id);
73
+ if (!sessionData)
74
+ continue;
75
+ let sessionMatches = false;
76
+ for (const change of sessionData.changes) {
77
+ if (this.changeMatchesQuery(change, query)) {
78
+ matchingChanges.push(change);
79
+ sessionMatches = true;
80
+ }
81
+ }
82
+ if (sessionMatches) {
83
+ matchingSessions.push(session);
84
+ }
85
+ }
86
+ const summary = this.createQuerySummary(query, matchingSessions, matchingChanges);
87
+ return {
88
+ query,
89
+ sessions: matchingSessions,
90
+ changes: matchingChanges,
91
+ summary
92
+ };
93
+ }
94
+ /**
95
+ * Ask a natural language question about past actions
96
+ */
97
+ ask(question) {
98
+ // Parse question into query
99
+ const query = this.parseQuestion(question);
100
+ return this.queryMemory(query);
101
+ }
102
+ /**
103
+ * Get all recorded sessions
104
+ */
105
+ getSessions() {
106
+ const sessions = [];
107
+ try {
108
+ const files = fs.readdirSync(this.memoryDir);
109
+ for (const file of files) {
110
+ if (file.endsWith('.session.json')) {
111
+ const sessionPath = path.join(this.memoryDir, file);
112
+ const data = JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
113
+ sessions.push(data.info);
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Memory dir might not exist yet
119
+ }
120
+ return sessions.sort((a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime());
121
+ }
122
+ /**
123
+ * Get session data by ID
124
+ */
125
+ getSession(sessionId) {
126
+ return this.loadSessionData(sessionId);
127
+ }
128
+ /**
129
+ * Save current session data
130
+ */
131
+ saveSession() {
132
+ // Get all changes from current session
133
+ const allEntities = this.statecli.listEntities();
134
+ const allChanges = [];
135
+ for (const entity of allEntities) {
136
+ const replay = this.statecli.replay(entity);
137
+ for (const change of replay.changes) {
138
+ // Only include changes from current session
139
+ if (change.timestamp >= this.sessionStartTime) {
140
+ allChanges.push({
141
+ id: change.id || `${entity}-${change.step}`,
142
+ entity,
143
+ entityType: entity.split(':')[0],
144
+ entityId: entity.split(':')[1] || '',
145
+ timestamp: change.timestamp,
146
+ before: change.before,
147
+ after: change.after,
148
+ actor: change.actor
149
+ });
150
+ }
151
+ }
152
+ }
153
+ const sessionInfo = {
154
+ id: this.sessionId,
155
+ startTime: this.sessionStartTime,
156
+ endTime: new Date().toISOString(),
157
+ summary: `Session with ${allChanges.length} changes across ${allEntities.length} entities`,
158
+ changesCount: allChanges.length,
159
+ entities: allEntities
160
+ };
161
+ const sessionData = {
162
+ info: sessionInfo,
163
+ changes: allChanges
164
+ };
165
+ const sessionPath = path.join(this.memoryDir, `${this.sessionId}.session.json`);
166
+ fs.writeFileSync(sessionPath, JSON.stringify(sessionData, null, 2));
167
+ }
168
+ /**
169
+ * End current session
170
+ */
171
+ endSession() {
172
+ this.saveSession();
173
+ const sessions = this.getSessions();
174
+ return sessions.find(s => s.id === this.sessionId) || {
175
+ id: this.sessionId,
176
+ startTime: this.sessionStartTime,
177
+ endTime: new Date().toISOString(),
178
+ summary: 'Session ended',
179
+ changesCount: 0,
180
+ entities: []
181
+ };
182
+ }
183
+ /**
184
+ * Get recent activity summary
185
+ */
186
+ getRecentActivity(hours = 24) {
187
+ const cutoff = new Date(Date.now() - hours * 60 * 60 * 1000).toISOString();
188
+ return this.queryMemory({
189
+ timeRange: {
190
+ start: cutoff,
191
+ end: new Date().toISOString()
192
+ }
193
+ });
194
+ }
195
+ /**
196
+ * Get activity for a specific entity across all sessions
197
+ */
198
+ getEntityHistory(entityPattern) {
199
+ return this.queryMemory({ entityPattern });
200
+ }
201
+ generateSessionId() {
202
+ const timestamp = Date.now().toString(36);
203
+ const random = Math.random().toString(36).substring(2, 8);
204
+ return `session-${timestamp}-${random}`;
205
+ }
206
+ ensureMemoryDir() {
207
+ if (!fs.existsSync(this.memoryDir)) {
208
+ fs.mkdirSync(this.memoryDir, { recursive: true });
209
+ }
210
+ }
211
+ recordSessionStart() {
212
+ this.statecli.track('session', this.sessionId, {
213
+ event: 'start',
214
+ startTime: this.sessionStartTime
215
+ }, 'session-memory');
216
+ }
217
+ loadSessionData(sessionId) {
218
+ const sessionPath = path.join(this.memoryDir, `${sessionId}.session.json`);
219
+ try {
220
+ if (fs.existsSync(sessionPath)) {
221
+ return JSON.parse(fs.readFileSync(sessionPath, 'utf-8'));
222
+ }
223
+ }
224
+ catch {
225
+ // File might be corrupted
226
+ }
227
+ return null;
228
+ }
229
+ changeMatchesQuery(change, query) {
230
+ // Entity filter
231
+ if (query.entity && change.entity !== query.entity) {
232
+ return false;
233
+ }
234
+ // Entity pattern filter
235
+ if (query.entityPattern) {
236
+ const pattern = query.entityPattern.replace('*', '.*');
237
+ const regex = new RegExp(pattern);
238
+ if (!regex.test(change.entity)) {
239
+ return false;
240
+ }
241
+ }
242
+ // Time range filter
243
+ if (query.timeRange) {
244
+ const changeTime = new Date(change.timestamp).getTime();
245
+ const startTime = new Date(query.timeRange.start).getTime();
246
+ const endTime = new Date(query.timeRange.end).getTime();
247
+ if (changeTime < startTime || changeTime > endTime) {
248
+ return false;
249
+ }
250
+ }
251
+ // Actor filter
252
+ if (query.actor && change.actor !== query.actor) {
253
+ return false;
254
+ }
255
+ // Keyword filter (search in state values)
256
+ if (query.keyword) {
257
+ const stateStr = JSON.stringify(change.after).toLowerCase();
258
+ if (!stateStr.includes(query.keyword.toLowerCase())) {
259
+ return false;
260
+ }
261
+ }
262
+ return true;
263
+ }
264
+ parseQuestion(question) {
265
+ const query = {};
266
+ const lowerQ = question.toLowerCase();
267
+ // Parse time references
268
+ if (lowerQ.includes('yesterday')) {
269
+ const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000);
270
+ query.timeRange = {
271
+ start: yesterday.toISOString(),
272
+ end: new Date().toISOString()
273
+ };
274
+ }
275
+ else if (lowerQ.includes('last week')) {
276
+ const lastWeek = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
277
+ query.timeRange = {
278
+ start: lastWeek.toISOString(),
279
+ end: new Date().toISOString()
280
+ };
281
+ }
282
+ else if (lowerQ.includes('today')) {
283
+ const today = new Date();
284
+ today.setHours(0, 0, 0, 0);
285
+ query.timeRange = {
286
+ start: today.toISOString(),
287
+ end: new Date().toISOString()
288
+ };
289
+ }
290
+ // Parse entity references
291
+ const entityMatch = question.match(/(?:to|on|for|in)\s+(\w+[:\w]*)/i);
292
+ if (entityMatch) {
293
+ query.entityPattern = entityMatch[1].includes(':')
294
+ ? entityMatch[1]
295
+ : `${entityMatch[1]}:*`;
296
+ }
297
+ // Parse actor references
298
+ if (lowerQ.includes('i did') || lowerQ.includes('my ')) {
299
+ query.actor = 'ai-agent';
300
+ }
301
+ return query;
302
+ }
303
+ createQuerySummary(query, sessions, changes) {
304
+ const lines = [];
305
+ lines.push(`Memory Query Results`);
306
+ lines.push(`====================`);
307
+ lines.push(`Found ${changes.length} changes across ${sessions.length} sessions`);
308
+ if (query.timeRange) {
309
+ lines.push(`Time range: ${query.timeRange.start} to ${query.timeRange.end}`);
310
+ }
311
+ if (query.entityPattern) {
312
+ lines.push(`Entity pattern: ${query.entityPattern}`);
313
+ }
314
+ if (changes.length > 0) {
315
+ lines.push(``);
316
+ lines.push(`Recent changes:`);
317
+ for (const change of changes.slice(-5)) {
318
+ lines.push(` - ${change.timestamp}: ${change.entity} (${change.actor})`);
319
+ }
320
+ }
321
+ return lines.join('\n');
322
+ }
323
+ }
324
+ exports.SessionMemory = SessionMemory;
325
+ //# sourceMappingURL=session-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-memory.js","sourceRoot":"","sources":["../src/session-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Test Awareness - Track test pass/fail after edits
3
+ *
4
+ * Monitors test results and correlates them with code changes.
5
+ */
6
+ import { StateCLI } from './statecli';
7
+ export interface TestResult {
8
+ testName: string;
9
+ status: 'passed' | 'failed' | 'skipped';
10
+ duration: number;
11
+ errorMessage?: string;
12
+ file?: string;
13
+ }
14
+ export interface TestRunSummary {
15
+ timestamp: string;
16
+ total: number;
17
+ passed: number;
18
+ failed: number;
19
+ skipped: number;
20
+ duration: number;
21
+ results: TestResult[];
22
+ relatedChanges: string[];
23
+ }
24
+ export interface TestImpact {
25
+ changedFile: string;
26
+ affectedTests: string[];
27
+ previousStatus: 'passed' | 'failed' | 'unknown';
28
+ currentStatus: 'passed' | 'failed' | 'unknown';
29
+ recommendation: string;
30
+ }
31
+ export declare class TestAwareness {
32
+ private statecli;
33
+ private projectPath;
34
+ private testHistory;
35
+ private testCommand;
36
+ private testFramework;
37
+ constructor(statecli: StateCLI, projectPath?: string, options?: {
38
+ testCommand?: string;
39
+ testFramework?: 'jest' | 'mocha' | 'pytest' | 'vitest' | 'custom';
40
+ });
41
+ /**
42
+ * Run tests and track results
43
+ */
44
+ runTests(options?: {
45
+ files?: string[];
46
+ grep?: string;
47
+ trackChanges?: boolean;
48
+ }): TestRunSummary;
49
+ /**
50
+ * Get test impact for a changed file
51
+ */
52
+ analyzeTestImpact(changedFile: string): TestImpact;
53
+ /**
54
+ * Run tests for specific changed files and compare results
55
+ */
56
+ testAfterChange(changedFiles: string[]): Promise<{
57
+ impacts: TestImpact[];
58
+ summary: TestRunSummary;
59
+ regressions: TestResult[];
60
+ }>;
61
+ /**
62
+ * Get test history
63
+ */
64
+ getTestHistory(limit?: number): TestRunSummary[];
65
+ /**
66
+ * Get failing tests
67
+ */
68
+ getFailingTests(): TestResult[];
69
+ /**
70
+ * Suggest which tests to run based on recent changes
71
+ */
72
+ suggestTests(): {
73
+ suggested: string[];
74
+ reason: string;
75
+ coverage: 'full' | 'partial' | 'none';
76
+ };
77
+ private detectTestFramework;
78
+ private getDefaultTestCommand;
79
+ private executeTests;
80
+ private parseTestOutput;
81
+ private findAffectedTests;
82
+ private findRegressions;
83
+ private getRecentChanges;
84
+ }
85
+ //# sourceMappingURL=test-awareness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-awareness.d.ts","sourceRoot":"","sources":["../src/test-awareness.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChD,aAAa,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAoD;gBAGvE,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,MAAY,EACzB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;KACnE;IAQH;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,cAAc;IAkClB;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU;IAoClD;;OAEG;IACG,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACrD,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,OAAO,EAAE,cAAc,CAAC;QACxB,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B,CAAC;IA6BF;;OAEG;IACH,cAAc,CAAC,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE;IAIpD;;OAEG;IACH,eAAe,IAAI,UAAU,EAAE;IAM/B;;OAEG;IACH,YAAY,IAAI;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;KACvC;IA2BD,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,YAAY;IAqBpB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;CAOzB"}