mcp-adr-analysis-server 2.0.9 → 2.0.10
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/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +434 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/resources/index.d.ts.map +1 -1
- package/dist/src/resources/index.js +71 -1
- package/dist/src/resources/index.js.map +1 -1
- package/dist/src/tools/human-override-tool.d.ts +42 -0
- package/dist/src/tools/human-override-tool.d.ts.map +1 -0
- package/dist/src/tools/human-override-tool.js +431 -0
- package/dist/src/tools/human-override-tool.js.map +1 -0
- package/dist/src/tools/smart-git-push-tool.d.ts +5 -1
- package/dist/src/tools/smart-git-push-tool.d.ts.map +1 -1
- package/dist/src/tools/smart-git-push-tool.js +70 -25
- package/dist/src/tools/smart-git-push-tool.js.map +1 -1
- package/dist/src/tools/smart-score-tool.d.ts +138 -0
- package/dist/src/tools/smart-score-tool.d.ts.map +1 -0
- package/dist/src/tools/smart-score-tool.js +602 -0
- package/dist/src/tools/smart-score-tool.js.map +1 -0
- package/dist/src/tools/todo-management-tool.d.ts +184 -6
- package/dist/src/tools/todo-management-tool.d.ts.map +1 -1
- package/dist/src/tools/todo-management-tool.js +819 -42
- package/dist/src/tools/todo-management-tool.js.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.d.ts +164 -0
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -0
- package/dist/src/tools/tool-chain-orchestrator.js +738 -0
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +150 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +520 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -0
- package/dist/src/types/knowledge-graph-schemas.d.ts +481 -0
- package/dist/src/types/knowledge-graph-schemas.d.ts.map +1 -0
- package/dist/src/types/knowledge-graph-schemas.js +59 -0
- package/dist/src/types/knowledge-graph-schemas.js.map +1 -0
- package/dist/src/utils/json-safe.d.ts +38 -0
- package/dist/src/utils/json-safe.d.ts.map +1 -0
- package/dist/src/utils/json-safe.js +86 -0
- package/dist/src/utils/json-safe.js.map +1 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts +28 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -0
- package/dist/src/utils/knowledge-graph-manager.js +192 -0
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -0
- package/dist/src/utils/mcp-response-validator.d.ts +30 -0
- package/dist/src/utils/mcp-response-validator.d.ts.map +1 -0
- package/dist/src/utils/mcp-response-validator.js +197 -0
- package/dist/src/utils/mcp-response-validator.js.map +1 -0
- package/dist/src/utils/project-health-scoring.d.ts +177 -0
- package/dist/src/utils/project-health-scoring.d.ts.map +1 -0
- package/dist/src/utils/project-health-scoring.js +370 -0
- package/dist/src/utils/project-health-scoring.js.map +1 -0
- package/dist/src/utils/release-readiness-detector.d.ts +2 -0
- package/dist/src/utils/release-readiness-detector.d.ts.map +1 -1
- package/dist/src/utils/release-readiness-detector.js +2 -0
- package/dist/src/utils/release-readiness-detector.js.map +1 -1
- package/dist/src/utils/todo-file-watcher.d.ts +26 -0
- package/dist/src/utils/todo-file-watcher.d.ts.map +1 -0
- package/dist/src/utils/todo-file-watcher.js +163 -0
- package/dist/src/utils/todo-file-watcher.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { KnowledgeGraphManager } from './knowledge-graph-manager.js';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
export class TodoFileWatcher {
|
|
6
|
+
kgManager;
|
|
7
|
+
todoPath;
|
|
8
|
+
watcherActive = false;
|
|
9
|
+
lastKnownHash = '';
|
|
10
|
+
pollInterval = null;
|
|
11
|
+
constructor(todoPath) {
|
|
12
|
+
this.kgManager = new KnowledgeGraphManager();
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
this.todoPath = todoPath || path.join(config.projectPath, 'TODO.md');
|
|
15
|
+
}
|
|
16
|
+
async startWatching(intervalMs = 2000) {
|
|
17
|
+
if (this.watcherActive) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.watcherActive = true;
|
|
21
|
+
// Initialize with current hash
|
|
22
|
+
this.lastKnownHash = await this.kgManager.calculateTodoMdHash(this.todoPath);
|
|
23
|
+
// Start polling for changes
|
|
24
|
+
this.pollInterval = setInterval(async () => {
|
|
25
|
+
try {
|
|
26
|
+
await this.checkForChanges();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error('Error checking TODO.md changes:', error);
|
|
30
|
+
}
|
|
31
|
+
}, intervalMs);
|
|
32
|
+
console.error(`[TodoFileWatcher] Started watching ${this.todoPath}`);
|
|
33
|
+
}
|
|
34
|
+
async stopWatching() {
|
|
35
|
+
if (!this.watcherActive) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.watcherActive = false;
|
|
39
|
+
if (this.pollInterval) {
|
|
40
|
+
clearInterval(this.pollInterval);
|
|
41
|
+
this.pollInterval = null;
|
|
42
|
+
}
|
|
43
|
+
console.error(`[TodoFileWatcher] Stopped watching ${this.todoPath}`);
|
|
44
|
+
}
|
|
45
|
+
async checkForChanges() {
|
|
46
|
+
if (!this.watcherActive) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const detection = await this.kgManager.detectTodoChanges(this.todoPath);
|
|
50
|
+
if (detection.hasChanges) {
|
|
51
|
+
console.error(`[TodoFileWatcher] TODO.md changes detected`);
|
|
52
|
+
// Read the new content
|
|
53
|
+
let todoContent = '';
|
|
54
|
+
try {
|
|
55
|
+
todoContent = await fs.readFile(this.todoPath, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`[TodoFileWatcher] Error reading TODO.md:`, error);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Parse changes and extract task modifications
|
|
62
|
+
const changes = await this.parseChanges(this.lastKnownHash, detection.currentHash, todoContent);
|
|
63
|
+
// Update sync state
|
|
64
|
+
await this.kgManager.updateSyncState({
|
|
65
|
+
lastSyncTimestamp: new Date().toISOString(),
|
|
66
|
+
todoMdHash: detection.currentHash,
|
|
67
|
+
syncStatus: changes.length > 0 ? 'pending' : 'synced',
|
|
68
|
+
lastModifiedBy: 'human',
|
|
69
|
+
version: (await this.kgManager.getSyncState()).version + 1
|
|
70
|
+
});
|
|
71
|
+
// Notify active intents about TODO changes
|
|
72
|
+
await this.notifyActiveIntents(todoContent, changes);
|
|
73
|
+
this.lastKnownHash = detection.currentHash;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async parseChanges(oldHash, newHash, todoContent) {
|
|
77
|
+
const changes = [];
|
|
78
|
+
// Simple change detection by analyzing the TODO content
|
|
79
|
+
// In a more sophisticated implementation, this would diff the actual content
|
|
80
|
+
const lines = todoContent.split('\n');
|
|
81
|
+
const taskLines = lines.filter(line => line.trim().match(/^-\s*\[[\sx]\]/) ||
|
|
82
|
+
line.trim().match(/^\d+\.\s*\[[\sx]\]/) ||
|
|
83
|
+
line.trim().match(/^##\s+/) // Section headers
|
|
84
|
+
);
|
|
85
|
+
// For now, we'll create a generic change record
|
|
86
|
+
if (oldHash !== newHash && taskLines.length > 0) {
|
|
87
|
+
changes.push({
|
|
88
|
+
type: 'modified',
|
|
89
|
+
taskId: `todo-change-${Date.now()}`,
|
|
90
|
+
description: 'TODO.md content modified externally',
|
|
91
|
+
details: {
|
|
92
|
+
taskCount: taskLines.length,
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
contentLength: todoContent.length
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return changes;
|
|
99
|
+
}
|
|
100
|
+
async notifyActiveIntents(todoContent, changes) {
|
|
101
|
+
const activeIntents = await this.kgManager.getActiveIntents();
|
|
102
|
+
for (const intent of activeIntents) {
|
|
103
|
+
// Update TODO snapshot for each active intent
|
|
104
|
+
await this.kgManager.updateTodoSnapshot(intent.intentId, todoContent);
|
|
105
|
+
// Add a tool execution record for the TODO change
|
|
106
|
+
const changeDetails = changes.map(c => `${c.type}: ${c.description}`).join('; ');
|
|
107
|
+
await this.kgManager.addToolExecution(intent.intentId, 'todo_file_watcher_change_detected', { todoPath: this.todoPath }, {
|
|
108
|
+
changes: changes.length,
|
|
109
|
+
changeDetails,
|
|
110
|
+
todoContentLength: todoContent.length,
|
|
111
|
+
detectedAt: new Date().toISOString()
|
|
112
|
+
}, true, [], changes.map(c => c.taskId), undefined);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async manualSync() {
|
|
116
|
+
const detection = await this.kgManager.detectTodoChanges(this.todoPath);
|
|
117
|
+
if (!detection.hasChanges) {
|
|
118
|
+
return {
|
|
119
|
+
changesDetected: false,
|
|
120
|
+
syncStatus: 'no_changes',
|
|
121
|
+
activeIntentsNotified: 0
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
let todoContent = '';
|
|
125
|
+
try {
|
|
126
|
+
todoContent = await fs.readFile(this.todoPath, 'utf-8');
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
changesDetected: true,
|
|
131
|
+
syncStatus: 'error_reading_file',
|
|
132
|
+
activeIntentsNotified: 0
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const changes = await this.parseChanges(this.lastKnownHash, detection.currentHash, todoContent);
|
|
136
|
+
await this.notifyActiveIntents(todoContent, changes);
|
|
137
|
+
await this.kgManager.updateSyncState({
|
|
138
|
+
lastSyncTimestamp: new Date().toISOString(),
|
|
139
|
+
todoMdHash: detection.currentHash,
|
|
140
|
+
syncStatus: 'synced',
|
|
141
|
+
lastModifiedBy: 'sync',
|
|
142
|
+
version: (await this.kgManager.getSyncState()).version + 1
|
|
143
|
+
});
|
|
144
|
+
this.lastKnownHash = detection.currentHash;
|
|
145
|
+
const activeIntents = await this.kgManager.getActiveIntents();
|
|
146
|
+
return {
|
|
147
|
+
changesDetected: true,
|
|
148
|
+
syncStatus: 'synced',
|
|
149
|
+
activeIntentsNotified: activeIntents.length
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async getWatcherStatus() {
|
|
153
|
+
const syncState = await this.kgManager.getSyncState();
|
|
154
|
+
return {
|
|
155
|
+
isActive: this.watcherActive,
|
|
156
|
+
todoPath: this.todoPath,
|
|
157
|
+
lastKnownHash: this.lastKnownHash,
|
|
158
|
+
lastSyncTime: syncState.lastSyncTimestamp,
|
|
159
|
+
syncStatus: syncState.syncStatus
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=todo-file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-file-watcher.js","sourceRoot":"","sources":["../../../src/utils/todo-file-watcher.ts"],"names":[],"mappings":"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"}
|