bobs-workshop 0.3.2 → 3.1.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/LICENSE +2 -2
- package/README.md +199 -210
- package/bin/bobs-workshop.js +109 -0
- package/config/agents.json +27 -0
- package/dist/plugins/bobs-workshop.js +34 -0
- package/dist/tools/background-agent/cancel.d.ts +3 -0
- package/dist/tools/background-agent/cancel.d.ts.map +1 -0
- package/dist/tools/background-agent/cancel.js +52 -0
- package/dist/tools/background-agent/concurrency.d.ts +15 -0
- package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
- package/dist/tools/background-agent/concurrency.js +61 -0
- package/dist/tools/background-agent/index.d.ts +8 -0
- package/dist/tools/background-agent/index.d.ts.map +1 -0
- package/dist/tools/background-agent/index.js +7 -0
- package/dist/tools/background-agent/launch.d.ts +6 -0
- package/dist/tools/background-agent/launch.d.ts.map +1 -0
- package/dist/tools/background-agent/launch.js +33 -0
- package/dist/tools/background-agent/list.d.ts +7 -0
- package/dist/tools/background-agent/list.d.ts.map +1 -0
- package/dist/tools/background-agent/list.js +40 -0
- package/dist/tools/background-agent/manager.d.ts +29 -0
- package/dist/tools/background-agent/manager.d.ts.map +1 -0
- package/dist/tools/background-agent/manager.js +377 -0
- package/dist/tools/background-agent/output.d.ts +3 -0
- package/dist/tools/background-agent/output.d.ts.map +1 -0
- package/dist/tools/background-agent/output.js +41 -0
- package/dist/tools/background-agent/types.d.ts +46 -0
- package/dist/tools/background-agent/types.d.ts.map +1 -0
- package/dist/tools/background-agent/types.js +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/manual/index.d.ts +3 -0
- package/dist/tools/manual/index.d.ts.map +1 -0
- package/dist/tools/manual/index.js +2 -0
- package/dist/tools/manual/manual-update.d.ts +4 -0
- package/dist/tools/manual/manual-update.d.ts.map +1 -0
- package/dist/tools/manual/manual-update.js +190 -0
- package/dist/tools/manual/verify-manual.d.ts +4 -0
- package/dist/tools/manual/verify-manual.d.ts.map +1 -0
- package/dist/tools/manual/verify-manual.js +46 -0
- package/package.json +35 -67
- package/postinstall.js +190 -0
- package/src/agents/alice.md +466 -0
- package/src/agents/bob-rev.md +493 -0
- package/src/agents/bob-send.md +277 -0
- package/src/agents/bob.md +442 -0
- package/src/agents/trace.md +451 -0
- package/src/plugins/bobs-workshop.ts +45 -0
- package/src/skills/api-patterns/SKILL.md +376 -0
- package/src/skills/architecture/SKILL.md +271 -0
- package/src/skills/bobs-workshop/performance/icon.svg +3 -0
- package/src/skills/brainstorming/SKILL.md +210 -0
- package/src/skills/clean-code/SKILL.md +151 -0
- package/src/skills/code-review-checklist/SKILL.md +220 -0
- package/src/skills/database-design/SKILL.md +271 -0
- package/src/skills/exploration/SKILL.md +257 -0
- package/src/skills/frontend-ui-ux/SKILL.md +78 -0
- package/src/skills/git-master/SKILL.md +1105 -0
- package/src/skills/performance/SKILL.md +144 -0
- package/src/skills/performance/icon.svg +3 -0
- package/src/skills/plan-writing/SKILL.md +225 -0
- package/src/skills/security/SKILL.md +410 -0
- package/src/skills/simplification/SKILL.md +238 -0
- package/src/skills/systematic-debugging/SKILL.md +175 -0
- package/src/skills/testing-patterns/SKILL.md +305 -0
- package/src/skills/verification/SKILL.md +286 -0
- package/src/tools/background-agent/cancel.ts +67 -0
- package/src/tools/background-agent/concurrency.ts +71 -0
- package/src/tools/background-agent/index.ts +7 -0
- package/src/tools/background-agent/launch.ts +39 -0
- package/src/tools/background-agent/list.ts +50 -0
- package/src/tools/background-agent/manager.ts +455 -0
- package/src/tools/background-agent/output.ts +57 -0
- package/src/tools/background-agent/types.ts +55 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/manual/index.ts +2 -0
- package/src/tools/manual/manual-update.ts +197 -0
- package/src/tools/manual/verify-manual.ts +55 -0
- package/uninstall.js +64 -0
- package/Claude.md +0 -162
- package/bin/bobs-mcp-server.js +0 -11
- package/bin/bobs-mcp.js +0 -130
- package/dist/api/taskLogger.js +0 -106
- package/dist/api/taskLogger.js.map +0 -1
- package/dist/cli/checker.js +0 -401
- package/dist/cli/checker.js.map +0 -1
- package/dist/cli/cleanup.js +0 -131
- package/dist/cli/cleanup.js.map +0 -1
- package/dist/cli/debug.js +0 -157
- package/dist/cli/debug.js.map +0 -1
- package/dist/cli/health.js +0 -97
- package/dist/cli/health.js.map +0 -1
- package/dist/cli/setup.js +0 -81
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/workshop.js +0 -42
- package/dist/cli/workshop.js.map +0 -1
- package/dist/dashboard/server.js +0 -1203
- package/dist/dashboard/server.js.map +0 -1
- package/dist/index.js +0 -960
- package/dist/index.js.map +0 -1
- package/dist/prompts/architect.js +0 -221
- package/dist/prompts/architect.js.map +0 -1
- package/dist/prompts/debugger.js +0 -257
- package/dist/prompts/debugger.js.map +0 -1
- package/dist/prompts/engineer.js +0 -249
- package/dist/prompts/engineer.js.map +0 -1
- package/dist/prompts/orchestrator.js +0 -304
- package/dist/prompts/orchestrator.js.map +0 -1
- package/dist/prompts/reviewer.js +0 -289
- package/dist/prompts/reviewer.js.map +0 -1
- package/dist/services/activitySummarizer.js +0 -388
- package/dist/services/activitySummarizer.js.map +0 -1
- package/dist/services/changeValidator.js +0 -396
- package/dist/services/changeValidator.js.map +0 -1
- package/dist/services/claudeOrchestrator.js +0 -343
- package/dist/services/claudeOrchestrator.js.map +0 -1
- package/dist/services/fileMonitor.js +0 -250
- package/dist/services/fileMonitor.js.map +0 -1
- package/dist/services/implementationSummarizer.js +0 -306
- package/dist/services/implementationSummarizer.js.map +0 -1
- package/dist/services/liveMonitor.js +0 -315
- package/dist/services/liveMonitor.js.map +0 -1
- package/dist/services/mcpAuditLogger.js +0 -104
- package/dist/services/mcpAuditLogger.js.map +0 -1
- package/dist/services/mcpLogger.js +0 -223
- package/dist/services/mcpLogger.js.map +0 -1
- package/dist/services/tmuxManager.js +0 -541
- package/dist/services/tmuxManager.js.map +0 -1
- package/dist/tools/approvalTools.js +0 -244
- package/dist/tools/approvalTools.js.map +0 -1
- package/dist/tools/autoDebugger.js +0 -147
- package/dist/tools/autoDebugger.js.map +0 -1
- package/dist/tools/cleanupService.js +0 -221
- package/dist/tools/cleanupService.js.map +0 -1
- package/dist/tools/dashboardTools.js +0 -342
- package/dist/tools/dashboardTools.js.map +0 -1
- package/dist/tools/developmentNudges.js +0 -336
- package/dist/tools/developmentNudges.js.map +0 -1
- package/dist/tools/gitTools.js +0 -741
- package/dist/tools/gitTools.js.map +0 -1
- package/dist/tools/orchestratorTools.js +0 -832
- package/dist/tools/orchestratorTools.js.map +0 -1
- package/dist/tools/searchCache.js +0 -64
- package/dist/tools/searchCache.js.map +0 -1
- package/dist/tools/searchTools.js +0 -1107
- package/dist/tools/searchTools.js.map +0 -1
- package/dist/tools/semgrep-patterns.js +0 -296
- package/dist/tools/semgrep-patterns.js.map +0 -1
- package/dist/tools/specTools.js +0 -332
- package/dist/tools/specTools.js.map +0 -1
- package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
- package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
- package/dist/tools/structural/cache.js +0 -226
- package/dist/tools/structural/cache.js.map +0 -1
- package/dist/tools/structural/engines/python/index.js +0 -118
- package/dist/tools/structural/engines/python/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
- package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
- package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
- package/dist/tools/structural/engines/typescript/index.js +0 -381
- package/dist/tools/structural/engines/typescript/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/utils.js +0 -279
- package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
- package/dist/tools/structural/index.js +0 -248
- package/dist/tools/structural/index.js.map +0 -1
- package/dist/tools/structural/types.js +0 -18
- package/dist/tools/structural/types.js.map +0 -1
- package/dist/tools/tmuxTools.js +0 -100
- package/dist/tools/tmuxTools.js.map +0 -1
- package/dist/tools/workRecorder.js +0 -215
- package/dist/tools/workRecorder.js.map +0 -1
- package/dist/tools/worktreeTools.js +0 -705
- package/dist/tools/worktreeTools.js.map +0 -1
- package/dist/utils/__tests__/integration.test.js +0 -57
- package/dist/utils/__tests__/integration.test.js.map +0 -1
- package/dist/utils/__tests__/serverDetection.test.js +0 -151
- package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
- package/dist/utils/errorHandling.js +0 -336
- package/dist/utils/errorHandling.js.map +0 -1
- package/dist/utils/processManager.js +0 -172
- package/dist/utils/processManager.js.map +0 -1
- package/dist/utils/reliability.js +0 -263
- package/dist/utils/reliability.js.map +0 -1
- package/dist/utils/responseFormatter.js +0 -250
- package/dist/utils/responseFormatter.js.map +0 -1
- package/dist/utils/serverDetection.js +0 -133
- package/dist/utils/serverDetection.js.map +0 -1
- package/dist/utils/specMigration.js +0 -105
- package/dist/utils/specMigration.js.map +0 -1
- package/dist/validation/schemas.js +0 -299
- package/dist/validation/schemas.js.map +0 -1
- package/public/.well-known/mcp/manifest.json +0 -473
- package/public/index.html +0 -3157
- package/public/index.html.backup +0 -2805
- package/public/index.html.backup2 +0 -1292
- package/scripts/cleanup-system-logs.ts +0 -121
- package/scripts/init-workspace.js +0 -63
- package/scripts/install-search-tools.js +0 -116
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
// src/services/implementationSummarizer.ts
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import fs from 'fs-extra';
|
|
4
|
-
import simpleGit from 'simple-git';
|
|
5
|
-
import { changeValidator } from './changeValidator.js';
|
|
6
|
-
import { mcpLogger } from './mcpLogger.js';
|
|
7
|
-
const git = simpleGit();
|
|
8
|
-
export class ImplementationSummarizer {
|
|
9
|
-
constructor(projectRoot = process.cwd()) {
|
|
10
|
-
this.projectRoot = projectRoot;
|
|
11
|
-
}
|
|
12
|
-
async generateSummaryForSpec(spec_id, lookbackHours = 24) {
|
|
13
|
-
try {
|
|
14
|
-
const periodEnd = new Date();
|
|
15
|
-
const periodStart = new Date(periodEnd.getTime() - lookbackHours * 60 * 60 * 1000);
|
|
16
|
-
// Get recent file changes from chokidar observations
|
|
17
|
-
const recentChanges = await this.getRecentChangesForSpec(spec_id, periodStart, periodEnd);
|
|
18
|
-
// Get git commits from the same period
|
|
19
|
-
const gitCommits = await this.getRecentCommitsForSpec(spec_id, periodStart, periodEnd);
|
|
20
|
-
// Analyze each file change for compliance
|
|
21
|
-
const filesChanged = [];
|
|
22
|
-
for (const change of recentChanges) {
|
|
23
|
-
const analysis = await this.analyzeFileChange(change, spec_id);
|
|
24
|
-
filesChanged.push(analysis);
|
|
25
|
-
}
|
|
26
|
-
// Generate compliance overview
|
|
27
|
-
const complianceOverview = this.generateComplianceOverview(filesChanged);
|
|
28
|
-
// Generate implementation notes
|
|
29
|
-
const implementationNotes = this.generateImplementationNotes(filesChanged, gitCommits);
|
|
30
|
-
// Generate actionable insights
|
|
31
|
-
const actionableInsights = this.generateActionableInsights(filesChanged, complianceOverview);
|
|
32
|
-
const summary = {
|
|
33
|
-
spec_id,
|
|
34
|
-
period_start: periodStart.toISOString(),
|
|
35
|
-
period_end: periodEnd.toISOString(),
|
|
36
|
-
files_changed: filesChanged,
|
|
37
|
-
implementation_notes: implementationNotes,
|
|
38
|
-
compliance_overview: complianceOverview,
|
|
39
|
-
git_commits: gitCommits,
|
|
40
|
-
actionable_insights: actionableInsights
|
|
41
|
-
};
|
|
42
|
-
await mcpLogger.info(`Generated implementation summary for ${spec_id}`, {
|
|
43
|
-
spec_id,
|
|
44
|
-
files_count: filesChanged.length,
|
|
45
|
-
commits_count: gitCommits.length,
|
|
46
|
-
compliance: complianceOverview.overall_status
|
|
47
|
-
}, 'implementation_summarizer');
|
|
48
|
-
return summary;
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
await mcpLogger.error(`Failed to generate implementation summary for ${spec_id}`, {
|
|
52
|
-
spec_id,
|
|
53
|
-
error: error instanceof Error ? error.message : String(error)
|
|
54
|
-
}, 'implementation_summarizer');
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async getRecentChangesForSpec(spec_id, periodStart, periodEnd) {
|
|
59
|
-
try {
|
|
60
|
-
const specPath = path.join(this.projectRoot, '.bob/specs', `${spec_id}.json`);
|
|
61
|
-
if (!(await fs.pathExists(specPath))) {
|
|
62
|
-
return [];
|
|
63
|
-
}
|
|
64
|
-
const specData = await fs.readJson(specPath);
|
|
65
|
-
const fileChanges = specData.file_changes || [];
|
|
66
|
-
return fileChanges.filter((change) => {
|
|
67
|
-
const changeTime = new Date(change.timestamp);
|
|
68
|
-
return changeTime >= periodStart && changeTime <= periodEnd;
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async getRecentCommitsForSpec(spec_id, periodStart, periodEnd) {
|
|
76
|
-
try {
|
|
77
|
-
// Get commits from the relevant branch or all recent commits
|
|
78
|
-
const log = await git.log({
|
|
79
|
-
from: periodStart.toISOString(),
|
|
80
|
-
to: periodEnd.toISOString(),
|
|
81
|
-
format: {
|
|
82
|
-
hash: '%H',
|
|
83
|
-
message: '%s',
|
|
84
|
-
author_name: '%an',
|
|
85
|
-
author_email: '%ae',
|
|
86
|
-
date: '%ai'
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
return log.all.map(commit => ({
|
|
90
|
-
hash: commit.hash.substring(0, 8),
|
|
91
|
-
message: commit.message,
|
|
92
|
-
timestamp: commit.date,
|
|
93
|
-
files: [] // Could be enhanced to get files per commit
|
|
94
|
-
}));
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
return [];
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async analyzeFileChange(change, spec_id) {
|
|
101
|
-
const filePath = change.file;
|
|
102
|
-
const changeType = change.type;
|
|
103
|
-
try {
|
|
104
|
-
// Use the change validator for compliance analysis
|
|
105
|
-
const validationResult = await changeValidator.validateChangesForSpec(spec_id);
|
|
106
|
-
const fileAnalysis = validationResult.file_analyses.find(analysis => analysis.file === filePath);
|
|
107
|
-
// Get git diff for line count
|
|
108
|
-
const diff = await this.getFileDiff(filePath);
|
|
109
|
-
const linesChanged = this.countLinesChanged(diff);
|
|
110
|
-
// Generate human-readable description
|
|
111
|
-
const humanDescription = this.generateFileChangeDescription(filePath, changeType, linesChanged);
|
|
112
|
-
return {
|
|
113
|
-
file: filePath,
|
|
114
|
-
change_type: changeType,
|
|
115
|
-
lines_changed: linesChanged,
|
|
116
|
-
human_description: humanDescription,
|
|
117
|
-
compliance_status: fileAnalysis?.compliance || 'unknown'
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
catch (error) {
|
|
121
|
-
return {
|
|
122
|
-
file: filePath,
|
|
123
|
-
change_type: changeType,
|
|
124
|
-
lines_changed: 0,
|
|
125
|
-
human_description: `${this.getChangeIcon(changeType)} ${path.basename(filePath)}`,
|
|
126
|
-
compliance_status: 'unknown'
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
async getFileDiff(filePath) {
|
|
131
|
-
try {
|
|
132
|
-
const diff = await git.diff(['HEAD~1', 'HEAD', '--', filePath]);
|
|
133
|
-
return diff || '';
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
return '';
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
countLinesChanged(diff) {
|
|
140
|
-
if (!diff)
|
|
141
|
-
return 0;
|
|
142
|
-
const lines = diff.split('\n');
|
|
143
|
-
return lines.filter(line => line.startsWith('+') || line.startsWith('-')).length;
|
|
144
|
-
}
|
|
145
|
-
generateFileChangeDescription(filePath, changeType, linesChanged) {
|
|
146
|
-
const fileName = path.basename(filePath);
|
|
147
|
-
const fileExt = path.extname(filePath);
|
|
148
|
-
const icon = this.getChangeIcon(changeType);
|
|
149
|
-
const fileType = this.getFileTypeDescription(fileExt);
|
|
150
|
-
const lineInfo = linesChanged > 0 ? ` (${linesChanged} lines)` : '';
|
|
151
|
-
return `${icon} ${this.getActionDescription(changeType)} ${fileType} ${fileName}${lineInfo}`;
|
|
152
|
-
}
|
|
153
|
-
getChangeIcon(changeType) {
|
|
154
|
-
switch (changeType) {
|
|
155
|
-
case 'added': return '➕';
|
|
156
|
-
case 'changed': return '✏️';
|
|
157
|
-
case 'unlinked': return '🗑️';
|
|
158
|
-
default: return '📝';
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
getActionDescription(changeType) {
|
|
162
|
-
switch (changeType) {
|
|
163
|
-
case 'added': return 'Created';
|
|
164
|
-
case 'changed': return 'Modified';
|
|
165
|
-
case 'unlinked': return 'Deleted';
|
|
166
|
-
default: return 'Updated';
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
getFileTypeDescription(ext) {
|
|
170
|
-
const typeMap = {
|
|
171
|
-
'.ts': 'TypeScript file',
|
|
172
|
-
'.js': 'JavaScript file',
|
|
173
|
-
'.json': 'config file',
|
|
174
|
-
'.md': 'documentation',
|
|
175
|
-
'.css': 'stylesheet',
|
|
176
|
-
'.html': 'HTML file',
|
|
177
|
-
'.vue': 'Vue component',
|
|
178
|
-
'.jsx': 'React component',
|
|
179
|
-
'.tsx': 'React component',
|
|
180
|
-
'.yml': 'config file',
|
|
181
|
-
'.yaml': 'config file',
|
|
182
|
-
'.xml': 'XML file',
|
|
183
|
-
'.sql': 'SQL script'
|
|
184
|
-
};
|
|
185
|
-
return typeMap[ext] || 'file';
|
|
186
|
-
}
|
|
187
|
-
generateComplianceOverview(filesChanged) {
|
|
188
|
-
const totalFiles = filesChanged.length;
|
|
189
|
-
const compliantFiles = filesChanged.filter(f => f.compliance_status === 'compliant').length;
|
|
190
|
-
const deviationFiles = filesChanged.filter(f => f.compliance_status === 'deviation').length;
|
|
191
|
-
const unexpectedFiles = filesChanged.filter(f => f.compliance_status === 'unexpected').length;
|
|
192
|
-
let overallStatus;
|
|
193
|
-
if (compliantFiles === totalFiles) {
|
|
194
|
-
overallStatus = 'compliant';
|
|
195
|
-
}
|
|
196
|
-
else if (compliantFiles > 0) {
|
|
197
|
-
overallStatus = 'partial';
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
overallStatus = 'non_compliant';
|
|
201
|
-
}
|
|
202
|
-
return {
|
|
203
|
-
total_files: totalFiles,
|
|
204
|
-
compliant_files: compliantFiles,
|
|
205
|
-
deviation_files: deviationFiles,
|
|
206
|
-
unexpected_files: unexpectedFiles,
|
|
207
|
-
overall_status: overallStatus
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
generateImplementationNotes(filesChanged, gitCommits) {
|
|
211
|
-
const notes = [];
|
|
212
|
-
// Summarize file changes by type
|
|
213
|
-
const addedFiles = filesChanged.filter(f => f.change_type === 'added');
|
|
214
|
-
const modifiedFiles = filesChanged.filter(f => f.change_type === 'changed');
|
|
215
|
-
const deletedFiles = filesChanged.filter(f => f.change_type === 'unlinked');
|
|
216
|
-
if (addedFiles.length > 0) {
|
|
217
|
-
notes.push(`📁 Created ${addedFiles.length} new file(s): ${addedFiles.map(f => path.basename(f.file)).join(', ')}`);
|
|
218
|
-
}
|
|
219
|
-
if (modifiedFiles.length > 0) {
|
|
220
|
-
const totalLines = modifiedFiles.reduce((sum, f) => sum + f.lines_changed, 0);
|
|
221
|
-
notes.push(`✏️ Modified ${modifiedFiles.length} file(s) with ${totalLines} line changes`);
|
|
222
|
-
}
|
|
223
|
-
if (deletedFiles.length > 0) {
|
|
224
|
-
notes.push(`🗑️ Removed ${deletedFiles.length} file(s): ${deletedFiles.map(f => path.basename(f.file)).join(', ')}`);
|
|
225
|
-
}
|
|
226
|
-
// Add commit information
|
|
227
|
-
if (gitCommits.length > 0) {
|
|
228
|
-
notes.push(`🔄 ${gitCommits.length} git commit(s) made during this period`);
|
|
229
|
-
}
|
|
230
|
-
return notes;
|
|
231
|
-
}
|
|
232
|
-
generateActionableInsights(filesChanged, complianceOverview) {
|
|
233
|
-
const insights = [];
|
|
234
|
-
// Compliance insights
|
|
235
|
-
if (complianceOverview.deviation_files > 0) {
|
|
236
|
-
insights.push(`⚠️ ${complianceOverview.deviation_files} file(s) deviate from manual - review implementation approach`);
|
|
237
|
-
}
|
|
238
|
-
if (complianceOverview.unexpected_files > 0) {
|
|
239
|
-
insights.push(`🔍 ${complianceOverview.unexpected_files} unexpected file(s) changed - consider updating manual documentation`);
|
|
240
|
-
}
|
|
241
|
-
// File pattern insights
|
|
242
|
-
const jsFiles = filesChanged.filter(f => f.file.endsWith('.js') || f.file.endsWith('.ts'));
|
|
243
|
-
const configFiles = filesChanged.filter(f => f.file.includes('config') || f.file.endsWith('.json'));
|
|
244
|
-
const testFiles = filesChanged.filter(f => f.file.includes('test') || f.file.includes('spec'));
|
|
245
|
-
if (jsFiles.length > 3) {
|
|
246
|
-
insights.push(`💡 Significant code changes detected (${jsFiles.length} source files) - consider running tests`);
|
|
247
|
-
}
|
|
248
|
-
if (configFiles.length > 0) {
|
|
249
|
-
insights.push(`⚙️ Configuration changes detected - verify environment compatibility`);
|
|
250
|
-
}
|
|
251
|
-
if (testFiles.length === 0 && jsFiles.length > 0) {
|
|
252
|
-
insights.push(`🧪 No test files modified - consider adding tests for new functionality`);
|
|
253
|
-
}
|
|
254
|
-
if (insights.length === 0) {
|
|
255
|
-
insights.push(`✅ Implementation appears to be on track with no major concerns`);
|
|
256
|
-
}
|
|
257
|
-
return insights;
|
|
258
|
-
}
|
|
259
|
-
async updateSpecWithSummary(summary) {
|
|
260
|
-
try {
|
|
261
|
-
const specPath = path.join(this.projectRoot, '.bob/specs', `${summary.spec_id}.json`);
|
|
262
|
-
if (!(await fs.pathExists(specPath))) {
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
const specData = await fs.readJson(specPath);
|
|
266
|
-
// Add summary to implementation logs
|
|
267
|
-
const executionLog = {
|
|
268
|
-
timestamp: summary.period_end,
|
|
269
|
-
engineer: 'implementation_summarizer',
|
|
270
|
-
action: 'generated_summary',
|
|
271
|
-
task_id: 'implementation_summary',
|
|
272
|
-
files_changed: summary.files_changed.map(f => f.file),
|
|
273
|
-
commit_hash: summary.git_commits.length > 0 ? summary.git_commits[0].hash : 'none',
|
|
274
|
-
note: `📊 Implementation Summary: ${summary.implementation_notes.join('; ')}. Compliance: ${summary.compliance_overview.overall_status}. ${summary.actionable_insights.join('; ')}`
|
|
275
|
-
};
|
|
276
|
-
if (!specData.execution_logs) {
|
|
277
|
-
specData.execution_logs = [];
|
|
278
|
-
}
|
|
279
|
-
specData.execution_logs.push(executionLog);
|
|
280
|
-
// Add detailed summary section
|
|
281
|
-
if (!specData.implementation_summaries) {
|
|
282
|
-
specData.implementation_summaries = [];
|
|
283
|
-
}
|
|
284
|
-
specData.implementation_summaries.push(summary);
|
|
285
|
-
// Keep only last 10 summaries
|
|
286
|
-
if (specData.implementation_summaries.length > 10) {
|
|
287
|
-
specData.implementation_summaries = specData.implementation_summaries.slice(-10);
|
|
288
|
-
}
|
|
289
|
-
specData.updated_at = summary.period_end;
|
|
290
|
-
await fs.writeJson(specPath, specData, { spaces: 2 });
|
|
291
|
-
await mcpLogger.info(`Updated manual ${summary.spec_id} with implementation summary`, {
|
|
292
|
-
spec_id: summary.spec_id,
|
|
293
|
-
files_count: summary.files_changed.length,
|
|
294
|
-
compliance: summary.compliance_overview.overall_status
|
|
295
|
-
}, 'implementation_summarizer');
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
await mcpLogger.error(`Failed to update manual with implementation summary`, {
|
|
299
|
-
spec_id: summary.spec_id,
|
|
300
|
-
error: error instanceof Error ? error.message : String(error)
|
|
301
|
-
}, 'implementation_summarizer');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
export const implementationSummarizer = new ImplementationSummarizer();
|
|
306
|
-
//# sourceMappingURL=implementationSummarizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"implementationSummarizer.js","sourceRoot":"","sources":["../../src/services/implementationSummarizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
// src/services/liveMonitor.ts
|
|
2
|
-
import { exec } from "child_process";
|
|
3
|
-
import { promisify } from "util";
|
|
4
|
-
import { EventEmitter } from "events";
|
|
5
|
-
const execAsync = promisify(exec);
|
|
6
|
-
/**
|
|
7
|
-
* Live Monitor Service
|
|
8
|
-
* Captures and streams tmux session output in real-time with intelligent buffering
|
|
9
|
-
*/
|
|
10
|
-
export class LiveMonitor extends EventEmitter {
|
|
11
|
-
constructor() {
|
|
12
|
-
super();
|
|
13
|
-
this.buffers = new Map();
|
|
14
|
-
this.streamingIntervals = new Map();
|
|
15
|
-
this.DEFAULT_MAX_LINES = 1000;
|
|
16
|
-
this.CAPTURE_INTERVAL = 1000; // 1 second
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Start monitoring a tmux session for live output
|
|
20
|
-
*/
|
|
21
|
-
async startMonitoring(sessionName, callback, maxLines = this.DEFAULT_MAX_LINES) {
|
|
22
|
-
try {
|
|
23
|
-
// Verify session exists
|
|
24
|
-
await this.verifySessionExists(sessionName);
|
|
25
|
-
// Initialize buffer for this session
|
|
26
|
-
const buffer = {
|
|
27
|
-
sessionName,
|
|
28
|
-
content: '',
|
|
29
|
-
lastUpdated: new Date().toISOString(),
|
|
30
|
-
lineCount: 0,
|
|
31
|
-
maxLines
|
|
32
|
-
};
|
|
33
|
-
this.buffers.set(sessionName, buffer);
|
|
34
|
-
// Start streaming interval
|
|
35
|
-
const streamInterval = setInterval(async () => {
|
|
36
|
-
try {
|
|
37
|
-
await this.captureAndStreamOutput(sessionName, callback);
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
console.error(`Live monitor error for session ${sessionName}:`, error);
|
|
41
|
-
// If session no longer exists, stop monitoring
|
|
42
|
-
if (error instanceof Error && error.message.includes('no session found')) {
|
|
43
|
-
this.stopMonitoring(sessionName);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}, this.CAPTURE_INTERVAL);
|
|
47
|
-
this.streamingIntervals.set(sessionName, streamInterval);
|
|
48
|
-
// Emit monitoring started event
|
|
49
|
-
this.emit('monitoringStarted', { sessionName, maxLines });
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
throw new Error(`Failed to start monitoring session ${sessionName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Stop monitoring a tmux session
|
|
57
|
-
*/
|
|
58
|
-
stopMonitoring(sessionName) {
|
|
59
|
-
// Clear streaming interval
|
|
60
|
-
const interval = this.streamingIntervals.get(sessionName);
|
|
61
|
-
if (interval) {
|
|
62
|
-
clearInterval(interval);
|
|
63
|
-
this.streamingIntervals.delete(sessionName);
|
|
64
|
-
}
|
|
65
|
-
// Keep buffer for a while but mark as inactive
|
|
66
|
-
const buffer = this.buffers.get(sessionName);
|
|
67
|
-
if (buffer) {
|
|
68
|
-
buffer.lastUpdated = new Date().toISOString();
|
|
69
|
-
}
|
|
70
|
-
// Emit monitoring stopped event
|
|
71
|
-
this.emit('monitoringStopped', { sessionName });
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Capture output from tmux session with options
|
|
75
|
-
*/
|
|
76
|
-
async captureOutput(sessionName, options) {
|
|
77
|
-
try {
|
|
78
|
-
await this.verifySessionExists(sessionName);
|
|
79
|
-
let captureCommand = `tmux capture-pane -t "${sessionName}" -p`;
|
|
80
|
-
// Add line range options
|
|
81
|
-
if (options?.lines) {
|
|
82
|
-
captureCommand += ` -S -${options.lines}`;
|
|
83
|
-
}
|
|
84
|
-
else if (options?.startLine !== undefined) {
|
|
85
|
-
captureCommand += ` -S ${options.startLine}`;
|
|
86
|
-
if (options.lines) {
|
|
87
|
-
captureCommand += ` -E ${options.startLine + options.lines - 1}`;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// Include scrollback history if requested
|
|
91
|
-
if (options?.history) {
|
|
92
|
-
captureCommand += ' -S -'; // Capture entire scrollback
|
|
93
|
-
}
|
|
94
|
-
const { stdout } = await execAsync(captureCommand);
|
|
95
|
-
return stdout;
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
throw new Error(`Failed to capture output from session ${sessionName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get buffered logs for a session
|
|
103
|
-
*/
|
|
104
|
-
getBufferedLogs(sessionName) {
|
|
105
|
-
return this.buffers.get(sessionName) || null;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Get all active monitoring sessions
|
|
109
|
-
*/
|
|
110
|
-
getMonitoringSessions() {
|
|
111
|
-
return Array.from(this.streamingIntervals.keys());
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Clear buffer for a session
|
|
115
|
-
*/
|
|
116
|
-
clearBuffer(sessionName) {
|
|
117
|
-
const buffer = this.buffers.get(sessionName);
|
|
118
|
-
if (buffer) {
|
|
119
|
-
buffer.content = '';
|
|
120
|
-
buffer.lineCount = 0;
|
|
121
|
-
buffer.lastUpdated = new Date().toISOString();
|
|
122
|
-
this.buffers.set(sessionName, buffer);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Get recent lines from buffer
|
|
127
|
-
*/
|
|
128
|
-
getRecentLines(sessionName, count = 10) {
|
|
129
|
-
const buffer = this.buffers.get(sessionName);
|
|
130
|
-
if (!buffer)
|
|
131
|
-
return [];
|
|
132
|
-
const lines = buffer.content.split('\n').filter(line => line.length > 0);
|
|
133
|
-
return lines.slice(-count);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Search logs for pattern
|
|
137
|
-
*/
|
|
138
|
-
searchLogs(sessionName, pattern, caseSensitive = false) {
|
|
139
|
-
const buffer = this.buffers.get(sessionName);
|
|
140
|
-
if (!buffer)
|
|
141
|
-
return [];
|
|
142
|
-
const flags = caseSensitive ? 'g' : 'gi';
|
|
143
|
-
const regex = new RegExp(pattern, flags);
|
|
144
|
-
const lines = buffer.content.split('\n');
|
|
145
|
-
return lines.filter(line => regex.test(line));
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Export logs to string with metadata
|
|
149
|
-
*/
|
|
150
|
-
exportLogs(sessionName) {
|
|
151
|
-
const buffer = this.buffers.get(sessionName);
|
|
152
|
-
if (!buffer)
|
|
153
|
-
return '';
|
|
154
|
-
const metadata = [
|
|
155
|
-
`# tmux Session Logs: ${sessionName}`,
|
|
156
|
-
`# Captured at: ${buffer.lastUpdated}`,
|
|
157
|
-
`# Total lines: ${buffer.lineCount}`,
|
|
158
|
-
`# Max buffer size: ${buffer.maxLines} lines`,
|
|
159
|
-
'# ====================================',
|
|
160
|
-
''
|
|
161
|
-
].join('\n');
|
|
162
|
-
return metadata + buffer.content;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Cleanup old buffers and stop inactive monitoring
|
|
166
|
-
*/
|
|
167
|
-
async cleanup(maxAge = 24 * 60 * 60 * 1000) {
|
|
168
|
-
let cleanedCount = 0;
|
|
169
|
-
const now = Date.now();
|
|
170
|
-
for (const [sessionName, buffer] of this.buffers) {
|
|
171
|
-
const bufferAge = now - new Date(buffer.lastUpdated).getTime();
|
|
172
|
-
if (bufferAge > maxAge) {
|
|
173
|
-
// Check if session still exists
|
|
174
|
-
const sessionExists = await this.sessionExists(sessionName);
|
|
175
|
-
if (!sessionExists) {
|
|
176
|
-
this.stopMonitoring(sessionName);
|
|
177
|
-
this.buffers.delete(sessionName);
|
|
178
|
-
cleanedCount++;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return cleanedCount;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Get monitoring statistics
|
|
186
|
-
*/
|
|
187
|
-
getStats() {
|
|
188
|
-
const totalLines = Array.from(this.buffers.values())
|
|
189
|
-
.reduce((sum, buffer) => sum + buffer.lineCount, 0);
|
|
190
|
-
const totalChars = Array.from(this.buffers.values())
|
|
191
|
-
.reduce((sum, buffer) => sum + buffer.content.length, 0);
|
|
192
|
-
const memoryUsageBytes = totalChars * 2; // Rough estimate (UTF-16)
|
|
193
|
-
const memoryUsage = this.formatBytes(memoryUsageBytes);
|
|
194
|
-
return {
|
|
195
|
-
activeMonitoring: this.streamingIntervals.size,
|
|
196
|
-
totalBuffers: this.buffers.size,
|
|
197
|
-
totalLines,
|
|
198
|
-
memoryUsage
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Capture and stream output for a monitored session
|
|
203
|
-
*/
|
|
204
|
-
async captureAndStreamOutput(sessionName, callback) {
|
|
205
|
-
const buffer = this.buffers.get(sessionName);
|
|
206
|
-
if (!buffer)
|
|
207
|
-
return;
|
|
208
|
-
try {
|
|
209
|
-
// Capture recent output
|
|
210
|
-
const newOutput = await this.captureOutput(sessionName, { lines: 100 });
|
|
211
|
-
// Check if there's new content
|
|
212
|
-
if (newOutput !== buffer.content) {
|
|
213
|
-
// Find what's new
|
|
214
|
-
const newContent = this.extractNewContent(buffer.content, newOutput);
|
|
215
|
-
// Update buffer with circular buffer logic
|
|
216
|
-
this.updateBuffer(buffer, newOutput);
|
|
217
|
-
// Create stream event
|
|
218
|
-
const streamEvent = {
|
|
219
|
-
sessionName,
|
|
220
|
-
newContent,
|
|
221
|
-
fullContent: buffer.content,
|
|
222
|
-
timestamp: new Date().toISOString(),
|
|
223
|
-
lineCount: buffer.lineCount
|
|
224
|
-
};
|
|
225
|
-
// Emit to event listeners
|
|
226
|
-
this.emit('logUpdate', streamEvent);
|
|
227
|
-
// Call provided callback
|
|
228
|
-
if (callback) {
|
|
229
|
-
callback(streamEvent);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
catch (error) {
|
|
234
|
-
// Re-throw to be handled by caller
|
|
235
|
-
throw error;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Extract new content by comparing old and new output
|
|
240
|
-
*/
|
|
241
|
-
extractNewContent(oldContent, newContent) {
|
|
242
|
-
if (!oldContent)
|
|
243
|
-
return newContent;
|
|
244
|
-
// Simple approach: if new content is longer and contains old content,
|
|
245
|
-
// return the difference
|
|
246
|
-
if (newContent.length > oldContent.length && newContent.includes(oldContent)) {
|
|
247
|
-
return newContent.substring(oldContent.length);
|
|
248
|
-
}
|
|
249
|
-
// If content has changed significantly, return all new content
|
|
250
|
-
return newContent;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Update buffer with circular buffer logic
|
|
254
|
-
*/
|
|
255
|
-
updateBuffer(buffer, newContent) {
|
|
256
|
-
buffer.content = newContent;
|
|
257
|
-
buffer.lastUpdated = new Date().toISOString();
|
|
258
|
-
const lines = newContent.split('\n').filter(line => line.length > 0);
|
|
259
|
-
buffer.lineCount = lines.length;
|
|
260
|
-
// Implement circular buffer: keep only the most recent lines
|
|
261
|
-
if (buffer.lineCount > buffer.maxLines) {
|
|
262
|
-
const trimmedLines = lines.slice(-buffer.maxLines);
|
|
263
|
-
buffer.content = trimmedLines.join('\n');
|
|
264
|
-
buffer.lineCount = trimmedLines.length;
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Verify tmux session exists
|
|
269
|
-
*/
|
|
270
|
-
async verifySessionExists(sessionName) {
|
|
271
|
-
const exists = await this.sessionExists(sessionName);
|
|
272
|
-
if (!exists) {
|
|
273
|
-
throw new Error(`tmux session '${sessionName}' does not exist`);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Check if tmux session exists
|
|
278
|
-
*/
|
|
279
|
-
async sessionExists(sessionName) {
|
|
280
|
-
try {
|
|
281
|
-
await execAsync(`tmux has-session -t "${sessionName}"`);
|
|
282
|
-
return true;
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
return false;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Format bytes to human readable string
|
|
290
|
-
*/
|
|
291
|
-
formatBytes(bytes) {
|
|
292
|
-
if (bytes === 0)
|
|
293
|
-
return '0 Bytes';
|
|
294
|
-
const k = 1024;
|
|
295
|
-
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
296
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
297
|
-
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Graceful shutdown - stop all monitoring
|
|
301
|
-
*/
|
|
302
|
-
async shutdown() {
|
|
303
|
-
// Stop all monitoring intervals
|
|
304
|
-
for (const [sessionName] of this.streamingIntervals) {
|
|
305
|
-
this.stopMonitoring(sessionName);
|
|
306
|
-
}
|
|
307
|
-
// Clear all buffers
|
|
308
|
-
this.buffers.clear();
|
|
309
|
-
// Emit shutdown event
|
|
310
|
-
this.emit('shutdown');
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// Export singleton instance
|
|
314
|
-
export const liveMonitor = new LiveMonitor();
|
|
315
|
-
//# sourceMappingURL=liveMonitor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"liveMonitor.js","sourceRoot":"","sources":["../../src/services/liveMonitor.ts"],"names":[],"mappings":"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"}
|