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.
- package/README.md +334 -153
- package/dist/cross-file-impact.d.ts +85 -0
- package/dist/cross-file-impact.d.ts.map +1 -0
- package/dist/cross-file-impact.js +338 -0
- package/dist/cross-file-impact.js.map +1 -0
- package/dist/dependency-tracker.d.ts +78 -0
- package/dist/dependency-tracker.d.ts.map +1 -0
- package/dist/dependency-tracker.js +334 -0
- package/dist/dependency-tracker.js.map +1 -0
- package/dist/enhanced-mcp-server.d.ts +50 -0
- package/dist/enhanced-mcp-server.d.ts.map +1 -0
- package/dist/enhanced-mcp-server.js +664 -0
- package/dist/enhanced-mcp-server.js.map +1 -0
- package/dist/error-recovery.d.ts +66 -0
- package/dist/error-recovery.d.ts.map +1 -0
- package/dist/error-recovery.js +210 -0
- package/dist/error-recovery.js.map +1 -0
- package/dist/file-tracker.d.ts +81 -0
- package/dist/file-tracker.d.ts.map +1 -0
- package/dist/file-tracker.js +252 -0
- package/dist/file-tracker.js.map +1 -0
- package/dist/git-integration.d.ts +95 -0
- package/dist/git-integration.d.ts.map +1 -0
- package/dist/git-integration.js +219 -0
- package/dist/git-integration.js.map +1 -0
- package/dist/index-enhanced.d.ts +12 -0
- package/dist/index-enhanced.d.ts.map +1 -0
- package/dist/index-enhanced.js +27 -0
- package/dist/index-enhanced.js.map +1 -0
- package/dist/rollback-preview.d.ts +77 -0
- package/dist/rollback-preview.d.ts.map +1 -0
- package/dist/rollback-preview.js +244 -0
- package/dist/rollback-preview.js.map +1 -0
- package/dist/session-memory.d.ts +85 -0
- package/dist/session-memory.d.ts.map +1 -0
- package/dist/session-memory.js +325 -0
- package/dist/session-memory.js.map +1 -0
- package/dist/test-awareness.d.ts +85 -0
- package/dist/test-awareness.d.ts.map +1 -0
- package/dist/test-awareness.js +329 -0
- package/dist/test-awareness.js.map +1 -0
- package/dist/types.d.ts +11 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AA+B7B,MAAa,aAAa;IAChB,QAAQ,CAAW;IACnB,SAAS,CAAS;IAClB,gBAAgB,CAAS;IACzB,SAAS,CAAS;IAE1B,YAAY,QAAkB,EAAE,SAAkB;QAChD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE9E,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAkB;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,gBAAgB,GAAkB,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAkB,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,oBAAoB;YACpB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC3C,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC7B,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,IAAI,cAAc,EAAE,CAAC;gBACnB,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAElF,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,gBAAgB;YAC1B,OAAO,EAAE,eAAe;YACxB,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,QAAgB;QAClB,4BAA4B;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;oBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;oBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC/D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,uCAAuC;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACjD,MAAM,UAAU,GAAkB,EAAE,CAAC;QAErC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,4CAA4C;gBAC5C,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC9C,UAAU,CAAC,IAAI,CAAC;wBACd,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;wBAC3C,MAAM;wBACN,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAChC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACpC,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;qBACL,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAgB;YAC/B,EAAE,EAAE,IAAI,CAAC,SAAS;YAClB,SAAS,EAAE,IAAI,CAAC,gBAAgB;YAChC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,gBAAgB,UAAU,CAAC,MAAM,mBAAmB,WAAW,CAAC,MAAM,WAAW;YAC1F,YAAY,EAAE,UAAU,CAAC,MAAM;YAC/B,QAAQ,EAAE,WAAW;SACtB,CAAC;QAEF,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,UAAU;SACpB,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,eAAe,CAAC,CAAC;QAChF,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI;YACpD,EAAE,EAAE,IAAI,CAAC,SAAS;YAClB,SAAS,EAAE,IAAI,CAAC,gBAAgB;YAChC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,OAAO,EAAE,eAAe;YACxB,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAgB,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAE3E,OAAO,IAAI,CAAC,WAAW,CAAC;YACtB,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM;gBACb,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC9B;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,aAAqB;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,iBAAiB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,SAAS,IAAI,MAAM,EAAE,CAAC;IAC1C,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC7C,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,IAAI,CAAC,gBAAgB;SACjC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,SAAiB;QACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,eAAe,CAAC,CAAC;QAE3E,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,MAAmB,EAAE,KAAkB;QAChE,gBAAgB;QAChB,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAExD,IAAI,UAAU,GAAG,SAAS,IAAI,UAAU,GAAG,OAAO,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0CAA0C;QAC1C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACpD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,aAAa,CAAC,QAAgB;QACpC,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEtC,wBAAwB;QACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7D,KAAK,CAAC,SAAS,GAAG;gBAChB,KAAK,EAAE,SAAS,CAAC,WAAW,EAAE;gBAC9B,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC9B,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAChE,KAAK,CAAC,SAAS,GAAG;gBAChB,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE;gBAC7B,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC9B,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;YACzB,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,KAAK,CAAC,SAAS,GAAG;gBAChB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;gBAC1B,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC9B,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAChD,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;gBAChB,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5B,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;QAC3B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,kBAAkB,CACxB,KAAkB,EAClB,QAAuB,EACvB,OAAsB;QAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,mBAAmB,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,SAAS,CAAC,KAAK,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAzUD,sCAyUC"}
|
|
@@ -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"}
|