bobs-workshop 0.3.3 → 3.1.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.
Files changed (200) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +199 -210
  3. package/bin/bobs-workshop.js +109 -0
  4. package/config/agents.json +27 -0
  5. package/dist/plugins/bobs-workshop.js +34 -0
  6. package/dist/tools/background-agent/cancel.d.ts +3 -0
  7. package/dist/tools/background-agent/cancel.d.ts.map +1 -0
  8. package/dist/tools/background-agent/cancel.js +52 -0
  9. package/dist/tools/background-agent/concurrency.d.ts +15 -0
  10. package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
  11. package/dist/tools/background-agent/concurrency.js +61 -0
  12. package/dist/tools/background-agent/index.d.ts +8 -0
  13. package/dist/tools/background-agent/index.d.ts.map +1 -0
  14. package/dist/tools/background-agent/index.js +7 -0
  15. package/dist/tools/background-agent/launch.d.ts +6 -0
  16. package/dist/tools/background-agent/launch.d.ts.map +1 -0
  17. package/dist/tools/background-agent/launch.js +33 -0
  18. package/dist/tools/background-agent/list.d.ts +7 -0
  19. package/dist/tools/background-agent/list.d.ts.map +1 -0
  20. package/dist/tools/background-agent/list.js +40 -0
  21. package/dist/tools/background-agent/manager.d.ts +29 -0
  22. package/dist/tools/background-agent/manager.d.ts.map +1 -0
  23. package/dist/tools/background-agent/manager.js +388 -0
  24. package/dist/tools/background-agent/output.d.ts +3 -0
  25. package/dist/tools/background-agent/output.d.ts.map +1 -0
  26. package/dist/tools/background-agent/output.js +41 -0
  27. package/dist/tools/background-agent/types.d.ts +46 -0
  28. package/dist/tools/background-agent/types.d.ts.map +1 -0
  29. package/dist/tools/background-agent/types.js +1 -0
  30. package/dist/tools/index.d.ts +9 -0
  31. package/dist/tools/index.d.ts.map +1 -0
  32. package/dist/tools/index.js +8 -0
  33. package/dist/tools/manual/index.d.ts +3 -0
  34. package/dist/tools/manual/index.d.ts.map +1 -0
  35. package/dist/tools/manual/index.js +2 -0
  36. package/dist/tools/manual/manual-update.d.ts +4 -0
  37. package/dist/tools/manual/manual-update.d.ts.map +1 -0
  38. package/dist/tools/manual/manual-update.js +190 -0
  39. package/dist/tools/manual/verify-manual.d.ts +4 -0
  40. package/dist/tools/manual/verify-manual.d.ts.map +1 -0
  41. package/dist/tools/manual/verify-manual.js +51 -0
  42. package/package.json +34 -66
  43. package/postinstall.js +193 -0
  44. package/src/agents/alice.md +466 -0
  45. package/src/agents/bob-rev.md +493 -0
  46. package/src/agents/bob-send.md +277 -0
  47. package/src/agents/bob.md +442 -0
  48. package/src/agents/trace.md +451 -0
  49. package/src/plugins/bobs-workshop.ts +45 -0
  50. package/src/skills/api-patterns/SKILL.md +376 -0
  51. package/src/skills/architecture/SKILL.md +271 -0
  52. package/src/skills/bobs-workshop/performance/icon.svg +3 -0
  53. package/src/skills/brainstorming/SKILL.md +210 -0
  54. package/src/skills/clean-code/SKILL.md +151 -0
  55. package/src/skills/code-review-checklist/SKILL.md +220 -0
  56. package/src/skills/database-design/SKILL.md +271 -0
  57. package/src/skills/exploration/SKILL.md +257 -0
  58. package/src/skills/frontend-ui-ux/SKILL.md +78 -0
  59. package/src/skills/git-master/SKILL.md +1105 -0
  60. package/src/skills/performance/SKILL.md +144 -0
  61. package/src/skills/performance/icon.svg +3 -0
  62. package/src/skills/plan-writing/SKILL.md +225 -0
  63. package/src/skills/security/SKILL.md +410 -0
  64. package/src/skills/simplification/SKILL.md +238 -0
  65. package/src/skills/systematic-debugging/SKILL.md +175 -0
  66. package/src/skills/testing-patterns/SKILL.md +305 -0
  67. package/src/skills/verification/SKILL.md +286 -0
  68. package/src/tools/background-agent/cancel.ts +67 -0
  69. package/src/tools/background-agent/concurrency.ts +71 -0
  70. package/src/tools/background-agent/index.ts +7 -0
  71. package/src/tools/background-agent/launch.ts +39 -0
  72. package/src/tools/background-agent/list.ts +50 -0
  73. package/src/tools/background-agent/manager.ts +466 -0
  74. package/src/tools/background-agent/output.ts +57 -0
  75. package/src/tools/background-agent/types.ts +55 -0
  76. package/src/tools/index.ts +8 -0
  77. package/src/tools/manual/index.ts +2 -0
  78. package/src/tools/manual/manual-update.ts +197 -0
  79. package/src/tools/manual/verify-manual.ts +60 -0
  80. package/uninstall.js +64 -0
  81. package/Claude.md +0 -162
  82. package/bin/bobs-mcp-server.js +0 -11
  83. package/bin/bobs-mcp.js +0 -130
  84. package/dist/api/taskLogger.js +0 -106
  85. package/dist/api/taskLogger.js.map +0 -1
  86. package/dist/cli/checker.js +0 -401
  87. package/dist/cli/checker.js.map +0 -1
  88. package/dist/cli/cleanup.js +0 -131
  89. package/dist/cli/cleanup.js.map +0 -1
  90. package/dist/cli/debug.js +0 -157
  91. package/dist/cli/debug.js.map +0 -1
  92. package/dist/cli/health.js +0 -97
  93. package/dist/cli/health.js.map +0 -1
  94. package/dist/cli/setup.js +0 -81
  95. package/dist/cli/setup.js.map +0 -1
  96. package/dist/cli/workshop.js +0 -42
  97. package/dist/cli/workshop.js.map +0 -1
  98. package/dist/dashboard/server.js +0 -1203
  99. package/dist/dashboard/server.js.map +0 -1
  100. package/dist/index.js +0 -960
  101. package/dist/index.js.map +0 -1
  102. package/dist/prompts/architect.js +0 -221
  103. package/dist/prompts/architect.js.map +0 -1
  104. package/dist/prompts/debugger.js +0 -257
  105. package/dist/prompts/debugger.js.map +0 -1
  106. package/dist/prompts/engineer.js +0 -249
  107. package/dist/prompts/engineer.js.map +0 -1
  108. package/dist/prompts/orchestrator.js +0 -304
  109. package/dist/prompts/orchestrator.js.map +0 -1
  110. package/dist/prompts/reviewer.js +0 -289
  111. package/dist/prompts/reviewer.js.map +0 -1
  112. package/dist/services/activitySummarizer.js +0 -388
  113. package/dist/services/activitySummarizer.js.map +0 -1
  114. package/dist/services/changeValidator.js +0 -396
  115. package/dist/services/changeValidator.js.map +0 -1
  116. package/dist/services/claudeOrchestrator.js +0 -343
  117. package/dist/services/claudeOrchestrator.js.map +0 -1
  118. package/dist/services/fileMonitor.js +0 -250
  119. package/dist/services/fileMonitor.js.map +0 -1
  120. package/dist/services/implementationSummarizer.js +0 -306
  121. package/dist/services/implementationSummarizer.js.map +0 -1
  122. package/dist/services/liveMonitor.js +0 -315
  123. package/dist/services/liveMonitor.js.map +0 -1
  124. package/dist/services/mcpAuditLogger.js +0 -104
  125. package/dist/services/mcpAuditLogger.js.map +0 -1
  126. package/dist/services/mcpLogger.js +0 -223
  127. package/dist/services/mcpLogger.js.map +0 -1
  128. package/dist/services/tmuxManager.js +0 -541
  129. package/dist/services/tmuxManager.js.map +0 -1
  130. package/dist/tools/approvalTools.js +0 -244
  131. package/dist/tools/approvalTools.js.map +0 -1
  132. package/dist/tools/autoDebugger.js +0 -147
  133. package/dist/tools/autoDebugger.js.map +0 -1
  134. package/dist/tools/cleanupService.js +0 -221
  135. package/dist/tools/cleanupService.js.map +0 -1
  136. package/dist/tools/dashboardTools.js +0 -342
  137. package/dist/tools/dashboardTools.js.map +0 -1
  138. package/dist/tools/developmentNudges.js +0 -336
  139. package/dist/tools/developmentNudges.js.map +0 -1
  140. package/dist/tools/gitTools.js +0 -741
  141. package/dist/tools/gitTools.js.map +0 -1
  142. package/dist/tools/orchestratorTools.js +0 -832
  143. package/dist/tools/orchestratorTools.js.map +0 -1
  144. package/dist/tools/searchCache.js +0 -64
  145. package/dist/tools/searchCache.js.map +0 -1
  146. package/dist/tools/searchTools.js +0 -1107
  147. package/dist/tools/searchTools.js.map +0 -1
  148. package/dist/tools/semgrep-patterns.js +0 -296
  149. package/dist/tools/semgrep-patterns.js.map +0 -1
  150. package/dist/tools/specTools.js +0 -332
  151. package/dist/tools/specTools.js.map +0 -1
  152. package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
  153. package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
  154. package/dist/tools/structural/cache.js +0 -226
  155. package/dist/tools/structural/cache.js.map +0 -1
  156. package/dist/tools/structural/engines/python/index.js +0 -118
  157. package/dist/tools/structural/engines/python/index.js.map +0 -1
  158. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
  159. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
  160. package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
  161. package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
  162. package/dist/tools/structural/engines/typescript/index.js +0 -381
  163. package/dist/tools/structural/engines/typescript/index.js.map +0 -1
  164. package/dist/tools/structural/engines/typescript/utils.js +0 -279
  165. package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
  166. package/dist/tools/structural/index.js +0 -248
  167. package/dist/tools/structural/index.js.map +0 -1
  168. package/dist/tools/structural/types.js +0 -18
  169. package/dist/tools/structural/types.js.map +0 -1
  170. package/dist/tools/tmuxTools.js +0 -100
  171. package/dist/tools/tmuxTools.js.map +0 -1
  172. package/dist/tools/workRecorder.js +0 -215
  173. package/dist/tools/workRecorder.js.map +0 -1
  174. package/dist/tools/worktreeTools.js +0 -705
  175. package/dist/tools/worktreeTools.js.map +0 -1
  176. package/dist/utils/__tests__/integration.test.js +0 -57
  177. package/dist/utils/__tests__/integration.test.js.map +0 -1
  178. package/dist/utils/__tests__/serverDetection.test.js +0 -151
  179. package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
  180. package/dist/utils/errorHandling.js +0 -336
  181. package/dist/utils/errorHandling.js.map +0 -1
  182. package/dist/utils/processManager.js +0 -172
  183. package/dist/utils/processManager.js.map +0 -1
  184. package/dist/utils/reliability.js +0 -263
  185. package/dist/utils/reliability.js.map +0 -1
  186. package/dist/utils/responseFormatter.js +0 -250
  187. package/dist/utils/responseFormatter.js.map +0 -1
  188. package/dist/utils/serverDetection.js +0 -133
  189. package/dist/utils/serverDetection.js.map +0 -1
  190. package/dist/utils/specMigration.js +0 -105
  191. package/dist/utils/specMigration.js.map +0 -1
  192. package/dist/validation/schemas.js +0 -299
  193. package/dist/validation/schemas.js.map +0 -1
  194. package/public/.well-known/mcp/manifest.json +0 -473
  195. package/public/index.html +0 -3157
  196. package/public/index.html.backup +0 -2805
  197. package/public/index.html.backup2 +0 -1292
  198. package/scripts/cleanup-system-logs.ts +0 -121
  199. package/scripts/init-workspace.js +0 -63
  200. 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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"}