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.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/bin/bobs-mcp.js +130 -0
  4. package/dist/api/taskLogger.js +106 -0
  5. package/dist/api/taskLogger.js.map +1 -0
  6. package/dist/cli/checker.js +401 -0
  7. package/dist/cli/checker.js.map +1 -0
  8. package/dist/cli/cleanup.js +131 -0
  9. package/dist/cli/cleanup.js.map +1 -0
  10. package/dist/cli/debug.js +157 -0
  11. package/dist/cli/debug.js.map +1 -0
  12. package/dist/cli/health.js +97 -0
  13. package/dist/cli/health.js.map +1 -0
  14. package/dist/cli/setup.js +81 -0
  15. package/dist/cli/setup.js.map +1 -0
  16. package/dist/cli/workshop.js +42 -0
  17. package/dist/cli/workshop.js.map +1 -0
  18. package/dist/dashboard/server.js +1206 -0
  19. package/dist/dashboard/server.js.map +1 -0
  20. package/dist/index.js +757 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/prompts/architect.js +157 -0
  23. package/dist/prompts/architect.js.map +1 -0
  24. package/dist/prompts/debugger.js +201 -0
  25. package/dist/prompts/debugger.js.map +1 -0
  26. package/dist/prompts/engineer.js +171 -0
  27. package/dist/prompts/engineer.js.map +1 -0
  28. package/dist/prompts/orchestrator.js +225 -0
  29. package/dist/prompts/orchestrator.js.map +1 -0
  30. package/dist/prompts/reviewer.js +199 -0
  31. package/dist/prompts/reviewer.js.map +1 -0
  32. package/dist/services/activitySummarizer.js +353 -0
  33. package/dist/services/activitySummarizer.js.map +1 -0
  34. package/dist/services/changeValidator.js +396 -0
  35. package/dist/services/changeValidator.js.map +1 -0
  36. package/dist/services/claudeOrchestrator.js +343 -0
  37. package/dist/services/claudeOrchestrator.js.map +1 -0
  38. package/dist/services/fileMonitor.js +250 -0
  39. package/dist/services/fileMonitor.js.map +1 -0
  40. package/dist/services/implementationSummarizer.js +306 -0
  41. package/dist/services/implementationSummarizer.js.map +1 -0
  42. package/dist/services/liveMonitor.js +315 -0
  43. package/dist/services/liveMonitor.js.map +1 -0
  44. package/dist/services/mcpAuditLogger.js +104 -0
  45. package/dist/services/mcpAuditLogger.js.map +1 -0
  46. package/dist/services/mcpLogger.js +223 -0
  47. package/dist/services/mcpLogger.js.map +1 -0
  48. package/dist/services/tmuxManager.js +541 -0
  49. package/dist/services/tmuxManager.js.map +1 -0
  50. package/dist/tools/approvalTools.js +244 -0
  51. package/dist/tools/approvalTools.js.map +1 -0
  52. package/dist/tools/autoDebugger.js +147 -0
  53. package/dist/tools/autoDebugger.js.map +1 -0
  54. package/dist/tools/cleanupService.js +221 -0
  55. package/dist/tools/cleanupService.js.map +1 -0
  56. package/dist/tools/dashboardTools.js +359 -0
  57. package/dist/tools/dashboardTools.js.map +1 -0
  58. package/dist/tools/developmentNudges.js +336 -0
  59. package/dist/tools/developmentNudges.js.map +1 -0
  60. package/dist/tools/gitTools.js +741 -0
  61. package/dist/tools/gitTools.js.map +1 -0
  62. package/dist/tools/orchestratorTools.js +765 -0
  63. package/dist/tools/orchestratorTools.js.map +1 -0
  64. package/dist/tools/searchTools.js +788 -0
  65. package/dist/tools/searchTools.js.map +1 -0
  66. package/dist/tools/specTools.js +350 -0
  67. package/dist/tools/specTools.js.map +1 -0
  68. package/dist/tools/tmuxTools.js +100 -0
  69. package/dist/tools/tmuxTools.js.map +1 -0
  70. package/dist/tools/workRecorder.js +215 -0
  71. package/dist/tools/workRecorder.js.map +1 -0
  72. package/dist/tools/worktreeTools.js +705 -0
  73. package/dist/tools/worktreeTools.js.map +1 -0
  74. package/dist/utils/__tests__/integration.test.js +57 -0
  75. package/dist/utils/__tests__/integration.test.js.map +1 -0
  76. package/dist/utils/__tests__/serverDetection.test.js +151 -0
  77. package/dist/utils/__tests__/serverDetection.test.js.map +1 -0
  78. package/dist/utils/errorHandling.js +336 -0
  79. package/dist/utils/errorHandling.js.map +1 -0
  80. package/dist/utils/processManager.js +172 -0
  81. package/dist/utils/processManager.js.map +1 -0
  82. package/dist/utils/reliability.js +263 -0
  83. package/dist/utils/reliability.js.map +1 -0
  84. package/dist/utils/responseFormatter.js +250 -0
  85. package/dist/utils/responseFormatter.js.map +1 -0
  86. package/dist/utils/serverDetection.js +133 -0
  87. package/dist/utils/serverDetection.js.map +1 -0
  88. package/dist/utils/specMigration.js +105 -0
  89. package/dist/utils/specMigration.js.map +1 -0
  90. package/dist/validation/schemas.js +299 -0
  91. package/dist/validation/schemas.js.map +1 -0
  92. package/package.json +79 -0
  93. package/scripts/init-workspace.js +63 -0
  94. 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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"}