statecli-mcp-server 0.4.0 → 0.4.1
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 +1 -0
- package/dist/file-watcher.d.ts +1 -0
- package/dist/file-watcher.d.ts.map +1 -1
- package/dist/file-watcher.js +70 -25
- package/dist/file-watcher.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
package/dist/file-watcher.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,aAAa,CAAkC;gBAE3C,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa;IAKrD,KAAK,IAAI,IAAI;IAiEb,IAAI,IAAI,IAAI;YAOE,gBAAgB;YAuBhB,aAAa;YAsBb,gBAAgB;YAahB,cAAc;IAc5B,QAAQ,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,IAAI,CAAA;KAAE;CAM7D"}
|
package/dist/file-watcher.js
CHANGED
|
@@ -32,45 +32,80 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
39
|
exports.FileWatcher = void 0;
|
|
37
40
|
const fs = __importStar(require("fs"));
|
|
38
41
|
const path = __importStar(require("path"));
|
|
39
|
-
const
|
|
42
|
+
const node_watch_1 = __importDefault(require("node-watch"));
|
|
40
43
|
class FileWatcher {
|
|
41
44
|
watcher = null;
|
|
42
45
|
stateCLI;
|
|
43
46
|
config;
|
|
44
47
|
lastCheckpoint = Date.now();
|
|
48
|
+
fileSnapshots = new Map();
|
|
45
49
|
constructor(stateCLI, config) {
|
|
46
50
|
this.stateCLI = stateCLI;
|
|
47
51
|
this.config = config;
|
|
48
52
|
}
|
|
49
53
|
start() {
|
|
50
54
|
const watchPaths = this.config.paths;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'
|
|
54
|
-
'
|
|
55
|
-
'
|
|
56
|
-
'
|
|
57
|
-
'
|
|
55
|
+
// Basic ignore list - substrings to ignore
|
|
56
|
+
const ignoredSubstrings = [
|
|
57
|
+
'node_modules',
|
|
58
|
+
'.git',
|
|
59
|
+
'dist',
|
|
60
|
+
'build',
|
|
61
|
+
'.next',
|
|
62
|
+
'coverage',
|
|
63
|
+
'.statecli'
|
|
58
64
|
];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
// Filter function for node-watch
|
|
66
|
+
// Return true to include/watch, false to ignore
|
|
67
|
+
const filter = (name) => {
|
|
68
|
+
for (const ignored of ignoredSubstrings) {
|
|
69
|
+
// Check if path contains the ignored substring
|
|
70
|
+
// Using platform specific separator check might be safer but substring is usually ok for these standard names
|
|
71
|
+
if (name.includes(ignored))
|
|
72
|
+
return false;
|
|
67
73
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
// Also ignore changes to specific files like .DS_Store
|
|
75
|
+
if (name.endsWith('.DS_Store'))
|
|
76
|
+
return false;
|
|
77
|
+
return true;
|
|
78
|
+
};
|
|
79
|
+
console.log(`🔍 StateCLI watching: ${watchPaths.join(', ')}`);
|
|
80
|
+
try {
|
|
81
|
+
this.watcher = (0, node_watch_1.default)(watchPaths, {
|
|
82
|
+
recursive: true,
|
|
83
|
+
filter: filter,
|
|
84
|
+
delay: 200 // Wait 200ms for file write to finish/debounce
|
|
85
|
+
});
|
|
86
|
+
this.watcher.on('change', (evt, name) => {
|
|
87
|
+
// name is the full path
|
|
88
|
+
if (evt === 'update') {
|
|
89
|
+
// Check if it's a new file or existing
|
|
90
|
+
if (this.fileSnapshots.has(name)) {
|
|
91
|
+
console.log(`📝 File changed: ${name}`);
|
|
92
|
+
this.handleFileChange(name);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log(`➕ File added: ${name}`);
|
|
96
|
+
this.handleFileAdd(name);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (evt === 'remove') {
|
|
100
|
+
console.log(`🗑️ File deleted: ${name}`);
|
|
101
|
+
this.handleFileDelete(name);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
console.log('✅ Watcher ready (using node-watch)');
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Failed to start watcher:', error);
|
|
108
|
+
}
|
|
74
109
|
// Auto-checkpoint timer
|
|
75
110
|
if (this.config.autoCheckpoint) {
|
|
76
111
|
setInterval(() => this.autoCheckpoint(), (this.config.checkpointInterval || 15) * 60 * 1000);
|
|
@@ -86,12 +121,18 @@ class FileWatcher {
|
|
|
86
121
|
const relativePath = path.relative(process.cwd(), filePath);
|
|
87
122
|
console.log(`📝 Changed: ${relativePath}`);
|
|
88
123
|
try {
|
|
124
|
+
// Read new content
|
|
89
125
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
90
126
|
const entity = `file:${relativePath}`;
|
|
91
|
-
//
|
|
92
|
-
this.
|
|
127
|
+
// Get previous content from snapshots or use empty string
|
|
128
|
+
const previousContent = this.fileSnapshots.get(filePath) || '';
|
|
129
|
+
// Track the file change with proper before/after
|
|
130
|
+
this.stateCLI.trackFile(entity, previousContent, content);
|
|
131
|
+
// Update snapshot
|
|
132
|
+
this.fileSnapshots.set(filePath, content);
|
|
93
133
|
}
|
|
94
134
|
catch (error) {
|
|
135
|
+
// If file was deleted rapidly or read failed
|
|
95
136
|
console.error(`Error tracking ${filePath}:`, error);
|
|
96
137
|
}
|
|
97
138
|
}
|
|
@@ -100,6 +141,8 @@ class FileWatcher {
|
|
|
100
141
|
console.log(`➕ Added: ${relativePath}`);
|
|
101
142
|
try {
|
|
102
143
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
144
|
+
// Initialize snapshot
|
|
145
|
+
this.fileSnapshots.set(filePath, content);
|
|
103
146
|
this.stateCLI.track('file', relativePath, {
|
|
104
147
|
action: 'created',
|
|
105
148
|
timestamp: new Date().toISOString(),
|
|
@@ -108,12 +151,14 @@ class FileWatcher {
|
|
|
108
151
|
}, 'watcher');
|
|
109
152
|
}
|
|
110
153
|
catch (error) {
|
|
111
|
-
|
|
154
|
+
// File might be deleted immediately
|
|
155
|
+
// console.error(`Error tracking ${filePath}:`, error);
|
|
112
156
|
}
|
|
113
157
|
}
|
|
114
158
|
async handleFileDelete(filePath) {
|
|
115
159
|
const relativePath = path.relative(process.cwd(), filePath);
|
|
116
160
|
console.log(`🗑️ Deleted: ${relativePath}`);
|
|
161
|
+
this.fileSnapshots.delete(filePath);
|
|
117
162
|
this.stateCLI.track('file', relativePath, {
|
|
118
163
|
action: 'deleted',
|
|
119
164
|
timestamp: new Date().toISOString(),
|
package/dist/file-watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../src/file-watcher.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "statecli-mcp-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"mcpName": "io.github.charo360/statecli",
|
|
5
5
|
"description": "Memory and self-awareness layer for AI agents - MCP server for state tracking, replay, and undo",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"better-sqlite3": "^11.0.0",
|
|
50
50
|
"chokidar": "^4.0.3",
|
|
51
51
|
"commander": "^12.0.0",
|
|
52
|
+
"node-watch": "^0.7.4",
|
|
52
53
|
"uuid": "^9.0.0"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
@@ -80,4 +81,4 @@
|
|
|
80
81
|
"publishConfig": {
|
|
81
82
|
"access": "public"
|
|
82
83
|
}
|
|
83
|
-
}
|
|
84
|
+
}
|