statecli-mcp-server 0.1.2 → 0.2.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/enhanced-mcp-server.d.ts +35 -0
- package/dist/enhanced-mcp-server.d.ts.map +1 -0
- package/dist/enhanced-mcp-server.js +425 -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/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/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,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error Recovery - Integration with error detection
|
|
4
|
+
*
|
|
5
|
+
* Automatically detects errors and suggests rollback actions
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ErrorRecovery = void 0;
|
|
9
|
+
class ErrorRecovery {
|
|
10
|
+
statecli;
|
|
11
|
+
errorHistory = [];
|
|
12
|
+
constructor(statecli) {
|
|
13
|
+
this.statecli = statecli;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Analyze an error and suggest recovery actions
|
|
17
|
+
*/
|
|
18
|
+
analyzeError(error, affectedEntities = []) {
|
|
19
|
+
const errorContext = this.createErrorContext(error, affectedEntities);
|
|
20
|
+
this.errorHistory.push(errorContext);
|
|
21
|
+
// Get recent changes for affected entities
|
|
22
|
+
const recentChanges = [];
|
|
23
|
+
for (const entity of affectedEntities) {
|
|
24
|
+
const replay = this.statecli.replay(entity);
|
|
25
|
+
recentChanges.push(...replay.changes.slice(-5)); // Last 5 changes per entity
|
|
26
|
+
}
|
|
27
|
+
// Generate recovery suggestions
|
|
28
|
+
const suggestions = this.generateSuggestions(errorContext, recentChanges);
|
|
29
|
+
// Create summary
|
|
30
|
+
const summary = this.createSummary(errorContext, recentChanges, suggestions);
|
|
31
|
+
return {
|
|
32
|
+
error: errorContext,
|
|
33
|
+
recentChanges,
|
|
34
|
+
suggestions,
|
|
35
|
+
summary
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Auto-recover from an error using the best suggestion
|
|
40
|
+
*/
|
|
41
|
+
autoRecover(analysis) {
|
|
42
|
+
const bestSuggestion = analysis.suggestions.find(s => s.confidence === 'high');
|
|
43
|
+
if (!bestSuggestion) {
|
|
44
|
+
return {
|
|
45
|
+
success: false,
|
|
46
|
+
action: 'none',
|
|
47
|
+
result: 'No high-confidence recovery suggestion available'
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
switch (bestSuggestion.action) {
|
|
52
|
+
case 'undo':
|
|
53
|
+
const undoResult = this.statecli.undo(bestSuggestion.entity, bestSuggestion.steps || 1);
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
action: 'undo',
|
|
57
|
+
result: undoResult
|
|
58
|
+
};
|
|
59
|
+
case 'restore_checkpoint':
|
|
60
|
+
if (bestSuggestion.checkpointName) {
|
|
61
|
+
const restoreResult = this.statecli.restoreCheckpoint(bestSuggestion.entity, bestSuggestion.checkpointName);
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
action: 'restore_checkpoint',
|
|
65
|
+
result: restoreResult
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
case 'replay_analyze':
|
|
70
|
+
const replay = this.statecli.replay(bestSuggestion.entity);
|
|
71
|
+
return {
|
|
72
|
+
success: true,
|
|
73
|
+
action: 'replay_analyze',
|
|
74
|
+
result: replay
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (recoveryError) {
|
|
79
|
+
return {
|
|
80
|
+
success: false,
|
|
81
|
+
action: bestSuggestion.action,
|
|
82
|
+
result: `Recovery failed: ${recoveryError}`
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
action: 'manual',
|
|
88
|
+
result: 'Manual intervention required'
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create checkpoint before risky operation
|
|
93
|
+
*/
|
|
94
|
+
safeExecute(entityId, operation, operationName = 'risky-operation') {
|
|
95
|
+
// Create checkpoint before operation
|
|
96
|
+
const checkpointName = `before-${operationName}-${Date.now()}`;
|
|
97
|
+
this.statecli.checkpoint(entityId, checkpointName);
|
|
98
|
+
try {
|
|
99
|
+
const result = operation();
|
|
100
|
+
return { success: true, result };
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
// Analyze and attempt recovery
|
|
104
|
+
const analysis = this.analyzeError(error instanceof Error ? error : new Error(String(error)), [entityId]);
|
|
105
|
+
// Try to restore checkpoint
|
|
106
|
+
try {
|
|
107
|
+
this.statecli.restoreCheckpoint(entityId, checkpointName);
|
|
108
|
+
return {
|
|
109
|
+
success: false,
|
|
110
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
111
|
+
recovered: true
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (restoreError) {
|
|
115
|
+
return {
|
|
116
|
+
success: false,
|
|
117
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
118
|
+
recovered: false
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get error history
|
|
125
|
+
*/
|
|
126
|
+
getErrorHistory() {
|
|
127
|
+
return [...this.errorHistory];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clear error history
|
|
131
|
+
*/
|
|
132
|
+
clearErrorHistory() {
|
|
133
|
+
this.errorHistory = [];
|
|
134
|
+
}
|
|
135
|
+
createErrorContext(error, affectedEntities) {
|
|
136
|
+
const isError = error instanceof Error;
|
|
137
|
+
return {
|
|
138
|
+
errorType: isError ? error.name : 'Unknown',
|
|
139
|
+
errorMessage: isError ? error.message : String(error),
|
|
140
|
+
stackTrace: isError ? error.stack : undefined,
|
|
141
|
+
affectedEntities,
|
|
142
|
+
timestamp: new Date().toISOString()
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
generateSuggestions(errorContext, recentChanges) {
|
|
146
|
+
const suggestions = [];
|
|
147
|
+
// If there are recent changes, suggest undo
|
|
148
|
+
if (recentChanges.length > 0) {
|
|
149
|
+
const mostRecentEntity = recentChanges[recentChanges.length - 1].entity || 'unknown';
|
|
150
|
+
suggestions.push({
|
|
151
|
+
action: 'undo',
|
|
152
|
+
entity: mostRecentEntity,
|
|
153
|
+
steps: 1,
|
|
154
|
+
reason: 'Undo the most recent change that may have caused the error',
|
|
155
|
+
confidence: 'medium'
|
|
156
|
+
});
|
|
157
|
+
// If multiple changes, suggest undoing more
|
|
158
|
+
if (recentChanges.length >= 3) {
|
|
159
|
+
suggestions.push({
|
|
160
|
+
action: 'undo',
|
|
161
|
+
entity: mostRecentEntity || 'unknown',
|
|
162
|
+
steps: 3,
|
|
163
|
+
reason: 'Undo the last 3 changes to restore to a known good state',
|
|
164
|
+
confidence: 'low'
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// For each affected entity, suggest replay for analysis
|
|
169
|
+
for (const entity of errorContext.affectedEntities) {
|
|
170
|
+
suggestions.push({
|
|
171
|
+
action: 'replay_analyze',
|
|
172
|
+
entity,
|
|
173
|
+
reason: `Analyze changes to ${entity} to understand what went wrong`,
|
|
174
|
+
confidence: 'high'
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Check for checkpoints
|
|
178
|
+
for (const entity of errorContext.affectedEntities) {
|
|
179
|
+
// Note: In a real implementation, we'd query for available checkpoints
|
|
180
|
+
suggestions.push({
|
|
181
|
+
action: 'restore_checkpoint',
|
|
182
|
+
entity,
|
|
183
|
+
checkpointName: 'latest',
|
|
184
|
+
reason: 'Restore to the latest checkpoint for this entity',
|
|
185
|
+
confidence: 'medium'
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return suggestions;
|
|
189
|
+
}
|
|
190
|
+
createSummary(errorContext, recentChanges, suggestions) {
|
|
191
|
+
const lines = [];
|
|
192
|
+
lines.push(`Error Analysis Summary`);
|
|
193
|
+
lines.push(`======================`);
|
|
194
|
+
lines.push(`Error: ${errorContext.errorType} - ${errorContext.errorMessage}`);
|
|
195
|
+
lines.push(`Time: ${errorContext.timestamp}`);
|
|
196
|
+
lines.push(`Affected entities: ${errorContext.affectedEntities.join(', ') || 'Unknown'}`);
|
|
197
|
+
lines.push(``);
|
|
198
|
+
lines.push(`Recent changes: ${recentChanges.length}`);
|
|
199
|
+
lines.push(`Recovery suggestions: ${suggestions.length}`);
|
|
200
|
+
const highConfidence = suggestions.filter(s => s.confidence === 'high');
|
|
201
|
+
if (highConfidence.length > 0) {
|
|
202
|
+
lines.push(``);
|
|
203
|
+
lines.push(`Recommended action: ${highConfidence[0].action} on ${highConfidence[0].entity}`);
|
|
204
|
+
lines.push(`Reason: ${highConfidence[0].reason}`);
|
|
205
|
+
}
|
|
206
|
+
return lines.join('\n');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.ErrorRecovery = ErrorRecovery;
|
|
210
|
+
//# sourceMappingURL=error-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-recovery.js","sourceRoot":"","sources":["../src/error-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Tracker - Auto-tracking of file edits
|
|
3
|
+
*
|
|
4
|
+
* Automatically tracks file changes and integrates with StateCLI
|
|
5
|
+
*/
|
|
6
|
+
import { StateCLI } from './statecli';
|
|
7
|
+
export interface FileChange {
|
|
8
|
+
filePath: string;
|
|
9
|
+
operation: 'create' | 'modify' | 'delete';
|
|
10
|
+
before: string | null;
|
|
11
|
+
after: string | null;
|
|
12
|
+
diff: string[];
|
|
13
|
+
timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FileTrackerConfig {
|
|
16
|
+
watchPaths: string[];
|
|
17
|
+
ignorePatterns: string[];
|
|
18
|
+
autoCheckpoint: boolean;
|
|
19
|
+
checkpointThreshold: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class FileTracker {
|
|
22
|
+
private statecli;
|
|
23
|
+
private config;
|
|
24
|
+
private fileHashes;
|
|
25
|
+
private changeCount;
|
|
26
|
+
private watchers;
|
|
27
|
+
constructor(statecli: StateCLI, config?: Partial<FileTrackerConfig>);
|
|
28
|
+
/**
|
|
29
|
+
* Start watching files for changes
|
|
30
|
+
*/
|
|
31
|
+
startWatching(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Stop watching files
|
|
34
|
+
*/
|
|
35
|
+
stopWatching(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Track a file change manually
|
|
38
|
+
*/
|
|
39
|
+
trackFileChange(filePath: string, operation: 'create' | 'modify' | 'delete', beforeContent: string | null, afterContent: string | null, actor?: string): FileChange;
|
|
40
|
+
/**
|
|
41
|
+
* Track a file edit with before/after content
|
|
42
|
+
*/
|
|
43
|
+
trackEdit(filePath: string, beforeContent: string, afterContent: string, actor?: string): FileChange;
|
|
44
|
+
/**
|
|
45
|
+
* Track a file creation
|
|
46
|
+
*/
|
|
47
|
+
trackCreate(filePath: string, content: string, actor?: string): FileChange;
|
|
48
|
+
/**
|
|
49
|
+
* Track a file deletion
|
|
50
|
+
*/
|
|
51
|
+
trackDelete(filePath: string, previousContent: string, actor?: string): FileChange;
|
|
52
|
+
/**
|
|
53
|
+
* Get file change history
|
|
54
|
+
*/
|
|
55
|
+
getFileHistory(filePath: string): ReturnType<StateCLI['replay']>;
|
|
56
|
+
/**
|
|
57
|
+
* Compute simple diff between two strings
|
|
58
|
+
*/
|
|
59
|
+
private computeDiff;
|
|
60
|
+
/**
|
|
61
|
+
* Create a hash of file content
|
|
62
|
+
*/
|
|
63
|
+
private hashContent;
|
|
64
|
+
/**
|
|
65
|
+
* Watch a directory for changes
|
|
66
|
+
*/
|
|
67
|
+
private watchDirectory;
|
|
68
|
+
/**
|
|
69
|
+
* Check if a file should be ignored
|
|
70
|
+
*/
|
|
71
|
+
private shouldIgnore;
|
|
72
|
+
/**
|
|
73
|
+
* Handle a file system event
|
|
74
|
+
*/
|
|
75
|
+
private handleFileEvent;
|
|
76
|
+
/**
|
|
77
|
+
* Create an automatic checkpoint
|
|
78
|
+
*/
|
|
79
|
+
private createAutoCheckpoint;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=file-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-tracker.d.ts","sourceRoot":"","sources":["../src/file-tracker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AASD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAKnE;;OAEG;IACH,aAAa,IAAI,IAAI;IAMrB;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,KAAK,GAAE,MAAmB,GACzB,UAAU;IAiCb;;OAEG;IACH,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAmB,GACzB,UAAU;IAIb;;OAEG;IACH,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAmB,GACzB,UAAU;IAIb;;OAEG;IACH,WAAW,CACT,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,KAAK,GAAE,MAAmB,GACzB,UAAU;IAIb;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAIhE;;OAEG;IACH,OAAO,CAAC,WAAW;IAwCnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File Tracker - Auto-tracking of file edits
|
|
4
|
+
*
|
|
5
|
+
* Automatically tracks file changes and integrates with StateCLI
|
|
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.FileTracker = void 0;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const crypto = __importStar(require("crypto"));
|
|
45
|
+
const DEFAULT_CONFIG = {
|
|
46
|
+
watchPaths: ['.'],
|
|
47
|
+
ignorePatterns: ['node_modules', '.git', 'dist', '*.log', '.statecli'],
|
|
48
|
+
autoCheckpoint: true,
|
|
49
|
+
checkpointThreshold: 10
|
|
50
|
+
};
|
|
51
|
+
class FileTracker {
|
|
52
|
+
statecli;
|
|
53
|
+
config;
|
|
54
|
+
fileHashes = new Map();
|
|
55
|
+
changeCount = 0;
|
|
56
|
+
watchers = [];
|
|
57
|
+
constructor(statecli, config) {
|
|
58
|
+
this.statecli = statecli;
|
|
59
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Start watching files for changes
|
|
63
|
+
*/
|
|
64
|
+
startWatching() {
|
|
65
|
+
for (const watchPath of this.config.watchPaths) {
|
|
66
|
+
this.watchDirectory(watchPath);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Stop watching files
|
|
71
|
+
*/
|
|
72
|
+
stopWatching() {
|
|
73
|
+
for (const watcher of this.watchers) {
|
|
74
|
+
watcher.close();
|
|
75
|
+
}
|
|
76
|
+
this.watchers = [];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Track a file change manually
|
|
80
|
+
*/
|
|
81
|
+
trackFileChange(filePath, operation, beforeContent, afterContent, actor = 'ai-agent') {
|
|
82
|
+
const diff = this.computeDiff(beforeContent, afterContent);
|
|
83
|
+
const timestamp = new Date().toISOString();
|
|
84
|
+
const change = {
|
|
85
|
+
filePath: path.normalize(filePath),
|
|
86
|
+
operation,
|
|
87
|
+
before: beforeContent,
|
|
88
|
+
after: afterContent,
|
|
89
|
+
diff,
|
|
90
|
+
timestamp
|
|
91
|
+
};
|
|
92
|
+
// Track in StateCLI
|
|
93
|
+
this.statecli.track('file', filePath, {
|
|
94
|
+
operation,
|
|
95
|
+
contentHash: afterContent ? this.hashContent(afterContent) : null,
|
|
96
|
+
lineCount: afterContent ? afterContent.split('\n').length : 0,
|
|
97
|
+
diff: diff.slice(0, 50), // Store first 50 diff lines
|
|
98
|
+
timestamp
|
|
99
|
+
}, actor);
|
|
100
|
+
this.changeCount++;
|
|
101
|
+
// Auto-checkpoint if threshold reached
|
|
102
|
+
if (this.config.autoCheckpoint &&
|
|
103
|
+
this.changeCount >= this.config.checkpointThreshold) {
|
|
104
|
+
this.createAutoCheckpoint();
|
|
105
|
+
}
|
|
106
|
+
return change;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Track a file edit with before/after content
|
|
110
|
+
*/
|
|
111
|
+
trackEdit(filePath, beforeContent, afterContent, actor = 'ai-agent') {
|
|
112
|
+
return this.trackFileChange(filePath, 'modify', beforeContent, afterContent, actor);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Track a file creation
|
|
116
|
+
*/
|
|
117
|
+
trackCreate(filePath, content, actor = 'ai-agent') {
|
|
118
|
+
return this.trackFileChange(filePath, 'create', null, content, actor);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Track a file deletion
|
|
122
|
+
*/
|
|
123
|
+
trackDelete(filePath, previousContent, actor = 'ai-agent') {
|
|
124
|
+
return this.trackFileChange(filePath, 'delete', previousContent, null, actor);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get file change history
|
|
128
|
+
*/
|
|
129
|
+
getFileHistory(filePath) {
|
|
130
|
+
return this.statecli.replay(`file:${path.normalize(filePath)}`);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Compute simple diff between two strings
|
|
134
|
+
*/
|
|
135
|
+
computeDiff(before, after) {
|
|
136
|
+
const diff = [];
|
|
137
|
+
if (before === null && after !== null) {
|
|
138
|
+
// New file
|
|
139
|
+
const lines = after.split('\n');
|
|
140
|
+
lines.forEach((line, i) => {
|
|
141
|
+
diff.push(`+${i + 1}: ${line}`);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (before !== null && after === null) {
|
|
145
|
+
// Deleted file
|
|
146
|
+
const lines = before.split('\n');
|
|
147
|
+
lines.forEach((line, i) => {
|
|
148
|
+
diff.push(`-${i + 1}: ${line}`);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else if (before !== null && after !== null) {
|
|
152
|
+
// Modified file - simple line-by-line diff
|
|
153
|
+
const beforeLines = before.split('\n');
|
|
154
|
+
const afterLines = after.split('\n');
|
|
155
|
+
const maxLines = Math.max(beforeLines.length, afterLines.length);
|
|
156
|
+
for (let i = 0; i < maxLines; i++) {
|
|
157
|
+
const beforeLine = beforeLines[i];
|
|
158
|
+
const afterLine = afterLines[i];
|
|
159
|
+
if (beforeLine !== afterLine) {
|
|
160
|
+
if (beforeLine !== undefined) {
|
|
161
|
+
diff.push(`-${i + 1}: ${beforeLine}`);
|
|
162
|
+
}
|
|
163
|
+
if (afterLine !== undefined) {
|
|
164
|
+
diff.push(`+${i + 1}: ${afterLine}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return diff;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Create a hash of file content
|
|
173
|
+
*/
|
|
174
|
+
hashContent(content) {
|
|
175
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Watch a directory for changes
|
|
179
|
+
*/
|
|
180
|
+
watchDirectory(dirPath) {
|
|
181
|
+
try {
|
|
182
|
+
const watcher = fs.watch(dirPath, { recursive: true }, (eventType, filename) => {
|
|
183
|
+
if (filename && !this.shouldIgnore(filename)) {
|
|
184
|
+
this.handleFileEvent(path.join(dirPath, filename), eventType);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
this.watchers.push(watcher);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error(`Failed to watch directory ${dirPath}:`, error);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if a file should be ignored
|
|
195
|
+
*/
|
|
196
|
+
shouldIgnore(filePath) {
|
|
197
|
+
for (const pattern of this.config.ignorePatterns) {
|
|
198
|
+
if (pattern.includes('*')) {
|
|
199
|
+
const regex = new RegExp(pattern.replace('*', '.*'));
|
|
200
|
+
if (regex.test(filePath))
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
if (filePath.includes(pattern))
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle a file system event
|
|
212
|
+
*/
|
|
213
|
+
handleFileEvent(filePath, eventType) {
|
|
214
|
+
const normalizedPath = path.normalize(filePath);
|
|
215
|
+
const previousHash = this.fileHashes.get(normalizedPath);
|
|
216
|
+
try {
|
|
217
|
+
if (fs.existsSync(filePath)) {
|
|
218
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
219
|
+
const newHash = this.hashContent(content);
|
|
220
|
+
if (previousHash !== newHash) {
|
|
221
|
+
this.fileHashes.set(normalizedPath, newHash);
|
|
222
|
+
if (previousHash === undefined) {
|
|
223
|
+
// New file or first time seeing it
|
|
224
|
+
this.trackCreate(normalizedPath, content);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Modified file
|
|
228
|
+
this.trackEdit(normalizedPath, '', content); // We don't have old content in watch mode
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else if (previousHash !== undefined) {
|
|
233
|
+
// File was deleted
|
|
234
|
+
this.fileHashes.delete(normalizedPath);
|
|
235
|
+
this.trackDelete(normalizedPath, '');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
// File might be locked or inaccessible
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Create an automatic checkpoint
|
|
244
|
+
*/
|
|
245
|
+
createAutoCheckpoint() {
|
|
246
|
+
const checkpointName = `auto-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
247
|
+
this.statecli.checkpoint('session:current', checkpointName);
|
|
248
|
+
this.changeCount = 0;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
exports.FileTracker = FileTracker;
|
|
252
|
+
//# sourceMappingURL=file-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-tracker.js","sourceRoot":"","sources":["../src/file-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Integration - Track changes between commits
|
|
3
|
+
*
|
|
4
|
+
* Integrates with git to provide commit-level state tracking
|
|
5
|
+
*/
|
|
6
|
+
import { StateCLI } from './statecli';
|
|
7
|
+
export interface GitCommit {
|
|
8
|
+
hash: string;
|
|
9
|
+
shortHash: string;
|
|
10
|
+
message: string;
|
|
11
|
+
author: string;
|
|
12
|
+
date: string;
|
|
13
|
+
files: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface GitDiff {
|
|
16
|
+
file: string;
|
|
17
|
+
additions: number;
|
|
18
|
+
deletions: number;
|
|
19
|
+
changes: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface CommitComparison {
|
|
22
|
+
fromCommit: string;
|
|
23
|
+
toCommit: string;
|
|
24
|
+
files: GitDiff[];
|
|
25
|
+
summary: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class GitIntegration {
|
|
28
|
+
private statecli;
|
|
29
|
+
private repoPath;
|
|
30
|
+
constructor(statecli: StateCLI, repoPath?: string);
|
|
31
|
+
/**
|
|
32
|
+
* Check if current directory is a git repository
|
|
33
|
+
*/
|
|
34
|
+
isGitRepo(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get current branch name
|
|
37
|
+
*/
|
|
38
|
+
getCurrentBranch(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Get current commit hash
|
|
41
|
+
*/
|
|
42
|
+
getCurrentCommit(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Get recent commits
|
|
45
|
+
*/
|
|
46
|
+
getRecentCommits(count?: number): GitCommit[];
|
|
47
|
+
/**
|
|
48
|
+
* Get files changed in a commit
|
|
49
|
+
*/
|
|
50
|
+
getCommitFiles(commitHash: string): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Compare two commits
|
|
53
|
+
*/
|
|
54
|
+
compareCommits(fromCommit: string, toCommit: string): CommitComparison;
|
|
55
|
+
/**
|
|
56
|
+
* Get diff for a specific file between commits
|
|
57
|
+
*/
|
|
58
|
+
getFileDiff(fromCommit: string, toCommit: string, filePath: string): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Track current git state in StateCLI
|
|
61
|
+
*/
|
|
62
|
+
trackGitState(actor?: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Create a checkpoint at current git state
|
|
65
|
+
*/
|
|
66
|
+
createGitCheckpoint(name?: string): {
|
|
67
|
+
checkpointId: string;
|
|
68
|
+
commit: string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Get what happened between two commits in StateCLI format
|
|
72
|
+
*/
|
|
73
|
+
getCommitHistory(fromCommit: string, toCommit: string): {
|
|
74
|
+
commits: GitCommit[];
|
|
75
|
+
comparison: CommitComparison;
|
|
76
|
+
stateChanges: ReturnType<StateCLI['replay']>;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Get commits between two commit hashes
|
|
80
|
+
*/
|
|
81
|
+
private getCommitsBetween;
|
|
82
|
+
/**
|
|
83
|
+
* Get uncommitted changes
|
|
84
|
+
*/
|
|
85
|
+
getUncommittedChanges(): {
|
|
86
|
+
staged: string[];
|
|
87
|
+
unstaged: string[];
|
|
88
|
+
untracked: string[];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Execute a git command
|
|
92
|
+
*/
|
|
93
|
+
private execGit;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=git-integration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-integration.d.ts","sourceRoot":"","sources":["../src/git-integration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAE,MAAY;IAKtD;;OAEG;IACH,SAAS,IAAI,OAAO;IASpB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,CAAC,KAAK,GAAE,MAAW,GAAG,SAAS,EAAE;IAYjD;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAS5C;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAwBtE;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAS7E;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAA0B,GAAG,IAAI;IAiBtD;;OAEG;IACH,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAY5E;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QACtD,OAAO,EAAE,SAAS,EAAE,CAAC;QACrB,UAAU,EAAE,gBAAgB,CAAC;QAC7B,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC9C;IAaD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,qBAAqB,IAAI;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE;IAQtF;;OAEG;IACH,OAAO,CAAC,OAAO;CAWhB"}
|