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,215 @@
|
|
|
1
|
+
// src/tools/workRecorder.ts
|
|
2
|
+
import { specUpdateHandler } from "./specTools.js";
|
|
3
|
+
/**
|
|
4
|
+
* Record detailed work activity with auto-interval logging
|
|
5
|
+
*/
|
|
6
|
+
export class WorkRecorder {
|
|
7
|
+
constructor(context) {
|
|
8
|
+
this.activities = [];
|
|
9
|
+
this.context = context;
|
|
10
|
+
this.lastActivity = new Date();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Start automatic work recording (no periodic updates - rely on explicit logging)
|
|
14
|
+
*/
|
|
15
|
+
startRecording() {
|
|
16
|
+
this.lastActivity = new Date();
|
|
17
|
+
// Auto-stop after 30 minutes of inactivity (no periodic logging noise)
|
|
18
|
+
this.intervalId = setInterval(async () => {
|
|
19
|
+
const now = new Date();
|
|
20
|
+
const minutesSinceLastActivity = (now.getTime() - this.lastActivity.getTime()) / (1000 * 60);
|
|
21
|
+
// Auto-stop recording after 30 minutes of inactivity
|
|
22
|
+
if (minutesSinceLastActivity >= 30) {
|
|
23
|
+
console.log(`[WorkRecorder] Auto-stopping recording for ${this.context.spec_id} after 30 minutes of inactivity`);
|
|
24
|
+
this.stopRecording();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}, 5 * 60 * 1000); // Check every 5 minutes
|
|
28
|
+
// Initial recording
|
|
29
|
+
this.recordActivity("started_work_session", "WORK_SESSION_START", [], `Started ${this.context.phase} phase work session as ${this.context.role}`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Stop automatic recording
|
|
33
|
+
*/
|
|
34
|
+
stopRecording() {
|
|
35
|
+
if (this.intervalId) {
|
|
36
|
+
clearInterval(this.intervalId);
|
|
37
|
+
this.intervalId = undefined;
|
|
38
|
+
}
|
|
39
|
+
this.recordActivity("ended_work_session", "WORK_SESSION_END", [], `Ended ${this.context.phase} phase work session. Total activities: ${this.activities.length}`);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Record a specific work activity
|
|
43
|
+
*/
|
|
44
|
+
async recordActivity(action, task_id, files_changed, note, commit_hash = "pending") {
|
|
45
|
+
this.lastActivity = new Date();
|
|
46
|
+
const activity = {
|
|
47
|
+
timestamp: new Date().toISOString(),
|
|
48
|
+
engineer: this.context.role,
|
|
49
|
+
action: `${this.context.phase}: ${action}`,
|
|
50
|
+
task_id,
|
|
51
|
+
files_changed,
|
|
52
|
+
commit_hash,
|
|
53
|
+
note: `[${this.context.phase}] ${note}`
|
|
54
|
+
};
|
|
55
|
+
this.activities.push(activity);
|
|
56
|
+
// Log to spec
|
|
57
|
+
await specUpdateHandler({
|
|
58
|
+
spec_id: this.context.spec_id,
|
|
59
|
+
execution_log: activity
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record progress on a specific task
|
|
64
|
+
*/
|
|
65
|
+
async recordProgress(task_id, progress_description, files_involved = [], completion_percentage) {
|
|
66
|
+
const progressNote = completion_percentage
|
|
67
|
+
? `${progress_description} (${completion_percentage}% complete)`
|
|
68
|
+
: progress_description;
|
|
69
|
+
await this.recordActivity("task_progress", task_id, files_involved, `📈 Progress: ${progressNote}. Files involved: ${files_involved.join(', ') || 'none'}`);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Record decision made during work
|
|
73
|
+
*/
|
|
74
|
+
async recordDecision(task_id, decision, reasoning, files_affected = []) {
|
|
75
|
+
await this.recordActivity("decision_made", task_id, files_affected, `🧠 Decision: ${decision}. Reasoning: ${reasoning}. Files affected: ${files_affected.join(', ') || 'none'}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Record milestone completion
|
|
79
|
+
*/
|
|
80
|
+
async recordMilestone(task_id, milestone, deliverables, next_steps = []) {
|
|
81
|
+
const nextStepsText = next_steps.length > 0 ? ` Next: ${next_steps.join(', ')}` : "";
|
|
82
|
+
await this.recordActivity("milestone_completed", task_id, deliverables, `🎯 Milestone: ${milestone}. Deliverables: ${deliverables.join(', ')}.${nextStepsText}`);
|
|
83
|
+
// Check if this is a completion milestone
|
|
84
|
+
if (milestone.toLowerCase().includes('complete') || milestone.toLowerCase().includes('finished')) {
|
|
85
|
+
await this.recordActivity("implementation_completed", task_id, deliverables, `✅ Implementation completed: ${milestone}. Work session ending.`);
|
|
86
|
+
// Auto-stop recording for completed implementations
|
|
87
|
+
console.log(`[WorkRecorder] Auto-stopping recording for ${this.context.spec_id} - implementation completed`);
|
|
88
|
+
this.stopRecording();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get recording statistics
|
|
93
|
+
*/
|
|
94
|
+
getStats() {
|
|
95
|
+
const uniqueFiles = [...new Set(this.activities.flatMap(a => a.files_changed))];
|
|
96
|
+
const uniqueTasks = [...new Set(this.activities.map(a => a.task_id))];
|
|
97
|
+
const sessionStart = this.activities[0]?.timestamp ? new Date(this.activities[0].timestamp) : new Date();
|
|
98
|
+
const sessionDuration = (new Date().getTime() - sessionStart.getTime()) / (1000 * 60); // minutes
|
|
99
|
+
return {
|
|
100
|
+
totalActivities: this.activities.length,
|
|
101
|
+
sessionDuration: Math.floor(sessionDuration),
|
|
102
|
+
filesModified: uniqueFiles,
|
|
103
|
+
tasksWorkedOn: uniqueTasks
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Update activity context (e.g., when phase changes)
|
|
108
|
+
*/
|
|
109
|
+
updateContext(newContext) {
|
|
110
|
+
this.context = { ...this.context, ...newContext };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Global work recorder instances by spec_id
|
|
115
|
+
*/
|
|
116
|
+
const activeRecorders = new Map();
|
|
117
|
+
/**
|
|
118
|
+
* Start work recording for a spec
|
|
119
|
+
*/
|
|
120
|
+
export function startWorkRecording(context) {
|
|
121
|
+
const existing = activeRecorders.get(context.spec_id);
|
|
122
|
+
if (existing) {
|
|
123
|
+
existing.stopRecording();
|
|
124
|
+
}
|
|
125
|
+
const recorder = new WorkRecorder(context);
|
|
126
|
+
recorder.startRecording();
|
|
127
|
+
activeRecorders.set(context.spec_id, recorder);
|
|
128
|
+
return recorder;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stop work recording for a spec
|
|
132
|
+
*/
|
|
133
|
+
export function stopWorkRecording(spec_id) {
|
|
134
|
+
const recorder = activeRecorders.get(spec_id);
|
|
135
|
+
if (recorder) {
|
|
136
|
+
recorder.stopRecording();
|
|
137
|
+
activeRecorders.delete(spec_id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get active recorder for a spec
|
|
142
|
+
*/
|
|
143
|
+
export function getWorkRecorder(spec_id) {
|
|
144
|
+
return activeRecorders.get(spec_id);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Record quick activity for a spec (creates recorder if needed)
|
|
148
|
+
*/
|
|
149
|
+
export async function recordQuickActivity(spec_id, action, task_id, files_changed, note, context) {
|
|
150
|
+
let recorder = activeRecorders.get(spec_id);
|
|
151
|
+
if (!recorder && context) {
|
|
152
|
+
const fullContext = {
|
|
153
|
+
spec_id,
|
|
154
|
+
phase: "implementation",
|
|
155
|
+
role: "engineer",
|
|
156
|
+
...context
|
|
157
|
+
};
|
|
158
|
+
recorder = startWorkRecording(fullContext);
|
|
159
|
+
}
|
|
160
|
+
if (recorder) {
|
|
161
|
+
await recorder.recordActivity(action, task_id, files_changed, note);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Cleanup orphaned work recorders (for completed SPECs)
|
|
166
|
+
*/
|
|
167
|
+
export async function cleanupOrphanedRecorders() {
|
|
168
|
+
const stoppedSpecs = [];
|
|
169
|
+
for (const [spec_id, recorder] of activeRecorders.entries()) {
|
|
170
|
+
try {
|
|
171
|
+
// Check if SPEC is completed by reading its file
|
|
172
|
+
const fs = await import('fs-extra');
|
|
173
|
+
const path = await import('path');
|
|
174
|
+
const specsDir = path.resolve(process.cwd(), ".bob/specs");
|
|
175
|
+
const filePath = path.join(specsDir, `${spec_id}.json`);
|
|
176
|
+
if (await fs.pathExists(filePath)) {
|
|
177
|
+
const specData = await fs.readJson(filePath);
|
|
178
|
+
// Stop recording for completed SPECs
|
|
179
|
+
if (specData.state === "completed") {
|
|
180
|
+
console.log(`[WorkRecorder] Stopping orphaned recorder for completed SPEC: ${spec_id}`);
|
|
181
|
+
recorder.stopRecording();
|
|
182
|
+
activeRecorders.delete(spec_id);
|
|
183
|
+
stoppedSpecs.push(spec_id);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.error(`[WorkRecorder] Error checking SPEC ${spec_id}:`, error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
stopped: stoppedSpecs,
|
|
193
|
+
active: activeRecorders.size
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get statistics about active recorders
|
|
198
|
+
*/
|
|
199
|
+
export function getActiveRecorderStats() {
|
|
200
|
+
const stats = {
|
|
201
|
+
total: activeRecorders.size,
|
|
202
|
+
specs: Array.from(activeRecorders.keys()),
|
|
203
|
+
oldestSession: null
|
|
204
|
+
};
|
|
205
|
+
let oldestTime = Infinity;
|
|
206
|
+
for (const [spec_id, recorder] of activeRecorders.entries()) {
|
|
207
|
+
const recorderStats = recorder.getStats();
|
|
208
|
+
if (recorderStats.sessionDuration < oldestTime) {
|
|
209
|
+
oldestTime = recorderStats.sessionDuration;
|
|
210
|
+
stats.oldestSession = { spec_id, duration: recorderStats.sessionDuration };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return stats;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=workRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workRecorder.js","sourceRoot":"","sources":["../../src/tools/workRecorder.ts"],"names":[],"mappings":"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"}
|