bobs-workshop 0.1.4
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/LICENSE +21 -0
- package/README.md +252 -0
- package/bin/bobs-mcp.js +130 -0
- package/dist/api/taskLogger.js +106 -0
- package/dist/api/taskLogger.js.map +1 -0
- package/dist/cli/checker.js +401 -0
- package/dist/cli/checker.js.map +1 -0
- package/dist/cli/cleanup.js +131 -0
- package/dist/cli/cleanup.js.map +1 -0
- package/dist/cli/debug.js +157 -0
- package/dist/cli/debug.js.map +1 -0
- package/dist/cli/health.js +97 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/setup.js +81 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/workshop.js +42 -0
- package/dist/cli/workshop.js.map +1 -0
- package/dist/dashboard/server.js +1206 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/index.js +757 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/architect.js +157 -0
- package/dist/prompts/architect.js.map +1 -0
- package/dist/prompts/debugger.js +201 -0
- package/dist/prompts/debugger.js.map +1 -0
- package/dist/prompts/engineer.js +171 -0
- package/dist/prompts/engineer.js.map +1 -0
- package/dist/prompts/orchestrator.js +225 -0
- package/dist/prompts/orchestrator.js.map +1 -0
- package/dist/prompts/reviewer.js +199 -0
- package/dist/prompts/reviewer.js.map +1 -0
- package/dist/services/activitySummarizer.js +353 -0
- package/dist/services/activitySummarizer.js.map +1 -0
- package/dist/services/changeValidator.js +396 -0
- package/dist/services/changeValidator.js.map +1 -0
- package/dist/services/claudeOrchestrator.js +343 -0
- package/dist/services/claudeOrchestrator.js.map +1 -0
- package/dist/services/fileMonitor.js +250 -0
- package/dist/services/fileMonitor.js.map +1 -0
- package/dist/services/implementationSummarizer.js +306 -0
- package/dist/services/implementationSummarizer.js.map +1 -0
- package/dist/services/liveMonitor.js +315 -0
- package/dist/services/liveMonitor.js.map +1 -0
- package/dist/services/mcpAuditLogger.js +104 -0
- package/dist/services/mcpAuditLogger.js.map +1 -0
- package/dist/services/mcpLogger.js +223 -0
- package/dist/services/mcpLogger.js.map +1 -0
- package/dist/services/tmuxManager.js +541 -0
- package/dist/services/tmuxManager.js.map +1 -0
- package/dist/tools/approvalTools.js +244 -0
- package/dist/tools/approvalTools.js.map +1 -0
- package/dist/tools/autoDebugger.js +147 -0
- package/dist/tools/autoDebugger.js.map +1 -0
- package/dist/tools/cleanupService.js +221 -0
- package/dist/tools/cleanupService.js.map +1 -0
- package/dist/tools/dashboardTools.js +359 -0
- package/dist/tools/dashboardTools.js.map +1 -0
- package/dist/tools/developmentNudges.js +336 -0
- package/dist/tools/developmentNudges.js.map +1 -0
- package/dist/tools/gitTools.js +741 -0
- package/dist/tools/gitTools.js.map +1 -0
- package/dist/tools/orchestratorTools.js +765 -0
- package/dist/tools/orchestratorTools.js.map +1 -0
- package/dist/tools/searchTools.js +788 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/specTools.js +350 -0
- package/dist/tools/specTools.js.map +1 -0
- package/dist/tools/tmuxTools.js +100 -0
- package/dist/tools/tmuxTools.js.map +1 -0
- package/dist/tools/workRecorder.js +215 -0
- package/dist/tools/workRecorder.js.map +1 -0
- package/dist/tools/worktreeTools.js +705 -0
- package/dist/tools/worktreeTools.js.map +1 -0
- package/dist/utils/__tests__/integration.test.js +57 -0
- package/dist/utils/__tests__/integration.test.js.map +1 -0
- package/dist/utils/__tests__/serverDetection.test.js +151 -0
- package/dist/utils/__tests__/serverDetection.test.js.map +1 -0
- package/dist/utils/errorHandling.js +336 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/processManager.js +172 -0
- package/dist/utils/processManager.js.map +1 -0
- package/dist/utils/reliability.js +263 -0
- package/dist/utils/reliability.js.map +1 -0
- package/dist/utils/responseFormatter.js +250 -0
- package/dist/utils/responseFormatter.js.map +1 -0
- package/dist/utils/serverDetection.js +133 -0
- package/dist/utils/serverDetection.js.map +1 -0
- package/dist/utils/specMigration.js +105 -0
- package/dist/utils/specMigration.js.map +1 -0
- package/dist/validation/schemas.js +299 -0
- package/dist/validation/schemas.js.map +1 -0
- package/package.json +79 -0
- package/scripts/init-workspace.js +63 -0
- package/scripts/install-search-tools.js +116 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
// src/services/changeValidator.ts
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import simpleGit from 'simple-git';
|
|
5
|
+
import { mcpLogger } from './mcpLogger.js';
|
|
6
|
+
const git = simpleGit();
|
|
7
|
+
export class ChangeValidator {
|
|
8
|
+
constructor(projectRoot = process.cwd()) {
|
|
9
|
+
this.projectRoot = projectRoot;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate recent changes against a manual
|
|
13
|
+
*/
|
|
14
|
+
async validateChangesForSpec(spec_id) {
|
|
15
|
+
try {
|
|
16
|
+
// Load the manual
|
|
17
|
+
const specData = await this.loadSpec(spec_id);
|
|
18
|
+
if (!specData) {
|
|
19
|
+
throw new Error(`Manual ${spec_id} not found`);
|
|
20
|
+
}
|
|
21
|
+
// Get recent file changes for this manual
|
|
22
|
+
const recentChanges = await this.getRecentChangesForSpec(spec_id);
|
|
23
|
+
// Analyze each file change
|
|
24
|
+
const fileAnalyses = [];
|
|
25
|
+
for (const change of recentChanges) {
|
|
26
|
+
const analysis = await this.analyzeFileChange(change, specData);
|
|
27
|
+
fileAnalyses.push(analysis);
|
|
28
|
+
}
|
|
29
|
+
// Generate overall compliance assessment
|
|
30
|
+
const compliantFiles = fileAnalyses.filter(a => a.compliance === 'compliant').length;
|
|
31
|
+
const deviationFiles = fileAnalyses.filter(a => a.compliance === 'deviation').length;
|
|
32
|
+
const unexpectedFiles = fileAnalyses.filter(a => a.compliance === 'unexpected').length;
|
|
33
|
+
let overallCompliance;
|
|
34
|
+
if (compliantFiles === fileAnalyses.length) {
|
|
35
|
+
overallCompliance = 'compliant';
|
|
36
|
+
}
|
|
37
|
+
else if (compliantFiles > 0) {
|
|
38
|
+
overallCompliance = 'partial';
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
overallCompliance = 'non_compliant';
|
|
42
|
+
}
|
|
43
|
+
// Generate human-readable summaries
|
|
44
|
+
const humanReadableChanges = fileAnalyses.map(a => a.humanSummary);
|
|
45
|
+
// Generate recommendations
|
|
46
|
+
const recommendations = this.generateRecommendations(fileAnalyses, specData);
|
|
47
|
+
const result = {
|
|
48
|
+
spec_id,
|
|
49
|
+
timestamp: new Date().toISOString(),
|
|
50
|
+
overall_compliance: overallCompliance,
|
|
51
|
+
file_analyses: fileAnalyses,
|
|
52
|
+
summary: {
|
|
53
|
+
total_files: fileAnalyses.length,
|
|
54
|
+
compliant_files: compliantFiles,
|
|
55
|
+
deviation_files: deviationFiles,
|
|
56
|
+
unexpected_files: unexpectedFiles,
|
|
57
|
+
human_readable_changes: humanReadableChanges
|
|
58
|
+
},
|
|
59
|
+
recommendations
|
|
60
|
+
};
|
|
61
|
+
await mcpLogger.info(`Change validation completed for ${spec_id}: ${overallCompliance}`, {
|
|
62
|
+
spec_id,
|
|
63
|
+
total_files: fileAnalyses.length,
|
|
64
|
+
compliance: overallCompliance
|
|
65
|
+
}, 'change_validator');
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
await mcpLogger.error(`Change validation failed for ${spec_id}`, {
|
|
70
|
+
spec_id,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error)
|
|
72
|
+
}, 'change_validator');
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Analyze a single file change against the manual expectations
|
|
78
|
+
*/
|
|
79
|
+
async analyzeFileChange(change, specData) {
|
|
80
|
+
const filePath = change.file;
|
|
81
|
+
const changeType = change.type;
|
|
82
|
+
try {
|
|
83
|
+
// Get actual diff for the file
|
|
84
|
+
const actualDiff = await this.getFileDiff(filePath);
|
|
85
|
+
// Check if this file change was expected based on manual
|
|
86
|
+
const expectedFromSpec = this.findExpectedChange(filePath, specData);
|
|
87
|
+
// Determine compliance
|
|
88
|
+
let compliance = 'unknown';
|
|
89
|
+
let reason = '';
|
|
90
|
+
if (expectedFromSpec) {
|
|
91
|
+
// File change was expected, check if it matches expectations
|
|
92
|
+
if (this.matchesExpectation(actualDiff, expectedFromSpec, changeType)) {
|
|
93
|
+
compliance = 'compliant';
|
|
94
|
+
reason = 'Change matches manual expectations';
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
compliance = 'deviation';
|
|
98
|
+
reason = 'Change differs from manual expectations';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Check if it's a reasonable change (utility files, tests, etc.)
|
|
103
|
+
if (this.isReasonableUnexpectedChange(filePath, changeType)) {
|
|
104
|
+
compliance = 'compliant';
|
|
105
|
+
reason = 'Reasonable supporting change not explicitly in manual';
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
compliance = 'unexpected';
|
|
109
|
+
reason = 'Change not mentioned in manual and appears unexpected';
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Generate human-readable summary
|
|
113
|
+
const humanSummary = this.generateHumanSummary(filePath, changeType, actualDiff, compliance);
|
|
114
|
+
// Count lines changed
|
|
115
|
+
const lineCount = this.countLinesChanged(actualDiff);
|
|
116
|
+
return {
|
|
117
|
+
file: filePath,
|
|
118
|
+
changeType,
|
|
119
|
+
actualDiff,
|
|
120
|
+
expectedFromSpec: expectedFromSpec || undefined,
|
|
121
|
+
compliance,
|
|
122
|
+
reason,
|
|
123
|
+
lineCount,
|
|
124
|
+
humanSummary
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
file: filePath,
|
|
130
|
+
changeType,
|
|
131
|
+
compliance: 'unknown',
|
|
132
|
+
reason: `Analysis failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
133
|
+
humanSummary: `❓ Could not analyze changes to ${filePath}`
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get git diff for a specific file
|
|
139
|
+
*/
|
|
140
|
+
async getFileDiff(filePath) {
|
|
141
|
+
try {
|
|
142
|
+
// Get diff between working directory and last commit
|
|
143
|
+
const diff = await git.diff(['HEAD', '--', filePath]);
|
|
144
|
+
return diff || '';
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
// If file is new, get the entire content
|
|
148
|
+
try {
|
|
149
|
+
const fullPath = path.join(this.projectRoot, filePath);
|
|
150
|
+
if (await fs.pathExists(fullPath)) {
|
|
151
|
+
const content = await fs.readFile(fullPath, 'utf8');
|
|
152
|
+
return `+++ ${filePath}\n${content.split('\n').map(line => `+${line}`).join('\n')}`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch { }
|
|
156
|
+
return '';
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Find expected change description in manual
|
|
161
|
+
*/
|
|
162
|
+
findExpectedChange(filePath, specData) {
|
|
163
|
+
// Check implementation plan for file mentions
|
|
164
|
+
const implementationPlan = specData.implementation_plan || [];
|
|
165
|
+
for (const task of implementationPlan) {
|
|
166
|
+
if (task.description && task.description.includes(filePath)) {
|
|
167
|
+
return task.description;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Check execution logs for previous file references
|
|
171
|
+
const executionLogs = specData.execution_logs || specData.execution_log || [];
|
|
172
|
+
for (const log of executionLogs) {
|
|
173
|
+
if (log.files_changed && log.files_changed.includes(filePath)) {
|
|
174
|
+
return log.note || log.action;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Check in architecture analysis or other sections
|
|
178
|
+
const sections = ['architecture_analysis', 'product_specifications'];
|
|
179
|
+
for (const section of sections) {
|
|
180
|
+
const content = specData[section];
|
|
181
|
+
if (typeof content === 'string' && content.includes(filePath)) {
|
|
182
|
+
return `Mentioned in ${section}`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if actual change matches expectation
|
|
189
|
+
*/
|
|
190
|
+
matchesExpectation(actualDiff, expectedFromSpec, changeType) {
|
|
191
|
+
// Simple heuristic matching - can be enhanced
|
|
192
|
+
if (!actualDiff)
|
|
193
|
+
return false;
|
|
194
|
+
// If it's a new file and manual mentions creating it
|
|
195
|
+
if (changeType === 'added' && expectedFromSpec.toLowerCase().includes('create')) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
// If it's a change and manual mentions modifying it
|
|
199
|
+
if (changeType === 'changed' &&
|
|
200
|
+
(expectedFromSpec.toLowerCase().includes('update') ||
|
|
201
|
+
expectedFromSpec.toLowerCase().includes('enhance') ||
|
|
202
|
+
expectedFromSpec.toLowerCase().includes('modify'))) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// Check for keyword matches between diff and expectation
|
|
206
|
+
const diffWords = actualDiff.toLowerCase().split(/\W+/);
|
|
207
|
+
const expectedWords = expectedFromSpec.toLowerCase().split(/\W+/);
|
|
208
|
+
const commonWords = diffWords.filter(word => word.length > 3 && expectedWords.includes(word));
|
|
209
|
+
return commonWords.length > 2; // Threshold for considering it a match
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Check if an unexpected change is reasonable
|
|
213
|
+
*/
|
|
214
|
+
isReasonableUnexpectedChange(filePath, changeType) {
|
|
215
|
+
const reasonablePatterns = [
|
|
216
|
+
/\.test\./, // Test files
|
|
217
|
+
/\.spec\./, // Spec files
|
|
218
|
+
/package\.json$/, // Package dependencies
|
|
219
|
+
/package-lock\.json$/, // Lock files
|
|
220
|
+
/tsconfig\.json$/, // TypeScript config
|
|
221
|
+
/\.gitignore$/, // Git ignore
|
|
222
|
+
/README\.md$/, // Documentation
|
|
223
|
+
/\.d\.ts$/, // Type definitions
|
|
224
|
+
/utils?\//, // Utility files
|
|
225
|
+
/helpers?\//, // Helper files
|
|
226
|
+
/types?\//, // Type files
|
|
227
|
+
/interfaces?\// // Interface files
|
|
228
|
+
];
|
|
229
|
+
return reasonablePatterns.some(pattern => pattern.test(filePath));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Generate human-readable summary of changes
|
|
233
|
+
*/
|
|
234
|
+
generateHumanSummary(filePath, changeType, diff, compliance) {
|
|
235
|
+
const fileName = path.basename(filePath);
|
|
236
|
+
const fileExt = path.extname(filePath);
|
|
237
|
+
const lineCount = this.countLinesChanged(diff);
|
|
238
|
+
let action = '';
|
|
239
|
+
switch (changeType) {
|
|
240
|
+
case 'added':
|
|
241
|
+
action = '➕ Created';
|
|
242
|
+
break;
|
|
243
|
+
case 'changed':
|
|
244
|
+
action = '✏️ Modified';
|
|
245
|
+
break;
|
|
246
|
+
case 'unlinked':
|
|
247
|
+
action = '🗑️ Deleted';
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
let complianceIcon = '';
|
|
251
|
+
switch (compliance) {
|
|
252
|
+
case 'compliant':
|
|
253
|
+
complianceIcon = '✅';
|
|
254
|
+
break;
|
|
255
|
+
case 'deviation':
|
|
256
|
+
complianceIcon = '⚠️';
|
|
257
|
+
break;
|
|
258
|
+
case 'unexpected':
|
|
259
|
+
complianceIcon = '❓';
|
|
260
|
+
break;
|
|
261
|
+
default:
|
|
262
|
+
complianceIcon = '⚪';
|
|
263
|
+
}
|
|
264
|
+
const lineInfo = lineCount > 0 ? ` (${lineCount} lines)` : '';
|
|
265
|
+
const fileTypeInfo = this.getFileTypeDescription(fileExt);
|
|
266
|
+
return `${complianceIcon} ${action} ${fileTypeInfo} ${fileName}${lineInfo}`;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get descriptive file type
|
|
270
|
+
*/
|
|
271
|
+
getFileTypeDescription(ext) {
|
|
272
|
+
const typeMap = {
|
|
273
|
+
'.ts': 'TypeScript file',
|
|
274
|
+
'.js': 'JavaScript file',
|
|
275
|
+
'.json': 'JSON config',
|
|
276
|
+
'.md': 'documentation',
|
|
277
|
+
'.css': 'stylesheet',
|
|
278
|
+
'.html': 'HTML file',
|
|
279
|
+
'.vue': 'Vue component',
|
|
280
|
+
'.jsx': 'React component',
|
|
281
|
+
'.tsx': 'React TypeScript component',
|
|
282
|
+
'.yml': 'YAML config',
|
|
283
|
+
'.yaml': 'YAML config',
|
|
284
|
+
'.xml': 'XML file',
|
|
285
|
+
'.sql': 'SQL script'
|
|
286
|
+
};
|
|
287
|
+
return typeMap[ext] || 'file';
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Count lines changed in diff
|
|
291
|
+
*/
|
|
292
|
+
countLinesChanged(diff) {
|
|
293
|
+
if (!diff)
|
|
294
|
+
return 0;
|
|
295
|
+
const lines = diff.split('\n');
|
|
296
|
+
return lines.filter(line => line.startsWith('+') || line.startsWith('-')).length;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Generate recommendations based on analysis
|
|
300
|
+
*/
|
|
301
|
+
generateRecommendations(analyses, specData) {
|
|
302
|
+
const recommendations = [];
|
|
303
|
+
const deviations = analyses.filter(a => a.compliance === 'deviation');
|
|
304
|
+
const unexpected = analyses.filter(a => a.compliance === 'unexpected');
|
|
305
|
+
if (deviations.length > 0) {
|
|
306
|
+
recommendations.push(`📋 Review ${deviations.length} file(s) that deviate from manual expectations: ${deviations.map(d => d.file).join(', ')}`);
|
|
307
|
+
}
|
|
308
|
+
if (unexpected.length > 0) {
|
|
309
|
+
recommendations.push(`🔍 Consider updating manual to document ${unexpected.length} unexpected change(s): ${unexpected.map(u => u.file).join(', ')}`);
|
|
310
|
+
}
|
|
311
|
+
const newFiles = analyses.filter(a => a.changeType === 'added');
|
|
312
|
+
if (newFiles.length > 0) {
|
|
313
|
+
recommendations.push(`📝 Update implementation plan to reflect ${newFiles.length} new file(s) created`);
|
|
314
|
+
}
|
|
315
|
+
if (analyses.length === 0) {
|
|
316
|
+
recommendations.push('✨ No recent changes detected - implementation may be complete');
|
|
317
|
+
}
|
|
318
|
+
return recommendations;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get recent changes for a specific manual
|
|
322
|
+
*/
|
|
323
|
+
async getRecentChangesForSpec(spec_id) {
|
|
324
|
+
const specData = await this.loadSpec(spec_id);
|
|
325
|
+
if (!specData || !specData.file_changes) {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
// Get changes from last hour
|
|
329
|
+
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
|
330
|
+
return specData.file_changes.filter((change) => new Date(change.timestamp) > oneHourAgo);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Load manual data
|
|
334
|
+
*/
|
|
335
|
+
async loadSpec(spec_id) {
|
|
336
|
+
try {
|
|
337
|
+
const specPath = path.join(this.projectRoot, '.bob/specs', `${spec_id}.json`);
|
|
338
|
+
if (await fs.pathExists(specPath)) {
|
|
339
|
+
return await fs.readJson(specPath);
|
|
340
|
+
}
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Update manual with validation results
|
|
349
|
+
*/
|
|
350
|
+
async updateSpecWithValidation(result) {
|
|
351
|
+
try {
|
|
352
|
+
const specData = await this.loadSpec(result.spec_id);
|
|
353
|
+
if (!specData)
|
|
354
|
+
return;
|
|
355
|
+
// Add validation result to manual
|
|
356
|
+
if (!specData.change_validations) {
|
|
357
|
+
specData.change_validations = [];
|
|
358
|
+
}
|
|
359
|
+
specData.change_validations.push(result);
|
|
360
|
+
// Keep only last 10 validations
|
|
361
|
+
if (specData.change_validations.length > 10) {
|
|
362
|
+
specData.change_validations = specData.change_validations.slice(-10);
|
|
363
|
+
}
|
|
364
|
+
// Update execution log with validation summary
|
|
365
|
+
const executionLog = {
|
|
366
|
+
timestamp: result.timestamp,
|
|
367
|
+
engineer: 'change_validator',
|
|
368
|
+
action: `validation: ${result.overall_compliance}`,
|
|
369
|
+
task_id: 'change_validation',
|
|
370
|
+
files_changed: result.file_analyses.map(f => f.file),
|
|
371
|
+
commit_hash: 'pending',
|
|
372
|
+
note: `🔍 Change validation: ${result.summary.compliant_files}/${result.summary.total_files} files compliant. ${result.summary.human_readable_changes.join('; ')}`
|
|
373
|
+
};
|
|
374
|
+
if (!specData.execution_logs) {
|
|
375
|
+
specData.execution_logs = [];
|
|
376
|
+
}
|
|
377
|
+
specData.execution_logs.push(executionLog);
|
|
378
|
+
specData.updated_at = result.timestamp;
|
|
379
|
+
// Save updated manual
|
|
380
|
+
const specPath = path.join(this.projectRoot, '.bob/specs', `${result.spec_id}.json`);
|
|
381
|
+
await fs.writeJson(specPath, specData, { spaces: 2 });
|
|
382
|
+
await mcpLogger.info(`Updated manual ${result.spec_id} with validation results`, {
|
|
383
|
+
spec_id: result.spec_id,
|
|
384
|
+
compliance: result.overall_compliance
|
|
385
|
+
}, 'change_validator');
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
await mcpLogger.error(`Failed to update manual with validation results`, {
|
|
389
|
+
spec_id: result.spec_id,
|
|
390
|
+
error: error instanceof Error ? error.message : String(error)
|
|
391
|
+
}, 'change_validator');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
export const changeValidator = new ChangeValidator();
|
|
396
|
+
//# sourceMappingURL=changeValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changeValidator.js","sourceRoot":"","sources":["../../src/services/changeValidator.ts"],"names":[],"mappings":"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"}
|