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,401 @@
1
+ // src/cli/checker.ts
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import { existsSync } from 'fs';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import fs from 'fs-extra';
8
+ const execAsync = promisify(exec);
9
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
+ export async function runInstallationCheck() {
11
+ console.log('๐Ÿ”ง Bob\'s MCP Installation Check\n');
12
+ console.log('โ”'.repeat(50));
13
+ const results = [];
14
+ // Run all checks
15
+ results.push(await checkNodeVersion());
16
+ results.push(await checkNpmRegistry());
17
+ results.push(await checkNpxCompatibility());
18
+ results.push(await checkDependencies());
19
+ results.push(await checkSearchTools());
20
+ results.push(await checkMcpServer());
21
+ results.push(await checkDashboard());
22
+ results.push(await checkSpecSystem());
23
+ // Display results
24
+ console.log('\n๐Ÿ“Š Installation Check Results:\n');
25
+ let passCount = 0;
26
+ let failCount = 0;
27
+ let warningCount = 0;
28
+ for (const result of results) {
29
+ const icon = result.status === 'pass' ? 'โœ…' : result.status === 'fail' ? 'โŒ' : 'โš ๏ธ';
30
+ console.log(`${icon} ${result.name}: ${result.message}`);
31
+ if (result.details) {
32
+ console.log(` ${result.details}`);
33
+ }
34
+ if (result.actionable) {
35
+ console.log(` ๐Ÿ’ก Action: ${result.actionable}`);
36
+ }
37
+ if (result.status === 'pass')
38
+ passCount++;
39
+ else if (result.status === 'fail')
40
+ failCount++;
41
+ else
42
+ warningCount++;
43
+ console.log('');
44
+ }
45
+ // Summary
46
+ console.log('โ”'.repeat(50));
47
+ console.log(`๐Ÿ“ˆ Summary: ${passCount} passed, ${warningCount} warnings, ${failCount} failed\n`);
48
+ if (failCount === 0) {
49
+ console.log('๐ŸŽ‰ Bob\'s MCP is ready to use!');
50
+ console.log('\nNext steps:');
51
+ console.log('โ€ข Add Bob\'s MCP to your Claude Code configuration');
52
+ console.log('โ€ข Run "npx bobs-mcp --setup" for guided configuration');
53
+ console.log('โ€ข Start using: npm run dev or npm start');
54
+ }
55
+ else {
56
+ console.log('๐Ÿ”ง Some issues need attention before Bob\'s MCP will work properly.');
57
+ console.log('\nRun "npx bobs-mcp --setup" for automatic fixes, or address the issues above.');
58
+ }
59
+ }
60
+ async function checkNodeVersion() {
61
+ try {
62
+ const { stdout } = await execAsync('node --version');
63
+ const version = stdout.trim();
64
+ const majorVersion = parseInt(version.slice(1).split('.')[0]);
65
+ if (majorVersion >= 18) {
66
+ return {
67
+ name: 'Node.js Version',
68
+ status: 'pass',
69
+ message: `${version} (compatible)`,
70
+ };
71
+ }
72
+ else {
73
+ return {
74
+ name: 'Node.js Version',
75
+ status: 'fail',
76
+ message: `${version} (requires Node.js 18+)`,
77
+ actionable: 'Update to Node.js 18 or later'
78
+ };
79
+ }
80
+ }
81
+ catch (error) {
82
+ return {
83
+ name: 'Node.js Version',
84
+ status: 'fail',
85
+ message: 'Node.js not found',
86
+ actionable: 'Install Node.js 18 or later'
87
+ };
88
+ }
89
+ }
90
+ async function checkNpmRegistry() {
91
+ try {
92
+ await execAsync('npm --version');
93
+ return {
94
+ name: 'npm Registry',
95
+ status: 'pass',
96
+ message: 'npm available',
97
+ };
98
+ }
99
+ catch (error) {
100
+ return {
101
+ name: 'npm Registry',
102
+ status: 'fail',
103
+ message: 'npm not available',
104
+ actionable: 'Install npm or use yarn'
105
+ };
106
+ }
107
+ }
108
+ async function checkNpxCompatibility() {
109
+ try {
110
+ // Check if npx is available and can execute bobs-mcp
111
+ await execAsync('npx --version');
112
+ try {
113
+ // Test if bobs-mcp can be found and executed via npx
114
+ const { stdout } = await execAsync('npx bobs-mcp --version', { timeout: 10000 });
115
+ if (stdout.includes('Bob\'s MCP')) {
116
+ return {
117
+ name: 'npx Compatibility',
118
+ status: 'pass',
119
+ message: 'bobs-mcp accessible via npx',
120
+ };
121
+ }
122
+ else {
123
+ return {
124
+ name: 'npx Compatibility',
125
+ status: 'warning',
126
+ message: 'npx works but bobs-mcp version check failed',
127
+ details: 'The package may be installed but not properly configured',
128
+ actionable: 'Try: npm install -g bobs-mcp'
129
+ };
130
+ }
131
+ }
132
+ catch (error) {
133
+ // Check if package is globally installed
134
+ try {
135
+ await execAsync('npm list -g bobs-mcp');
136
+ return {
137
+ name: 'npx Compatibility',
138
+ status: 'pass',
139
+ message: 'bobs-mcp globally installed (npx should work)',
140
+ details: 'Package found in global npm packages'
141
+ };
142
+ }
143
+ catch {
144
+ return {
145
+ name: 'npx Compatibility',
146
+ status: 'warning',
147
+ message: 'npx available but bobs-mcp not found',
148
+ details: 'Package may need to be installed globally or locally',
149
+ actionable: 'Try: npm install -g bobs-mcp or install locally in your project'
150
+ };
151
+ }
152
+ }
153
+ }
154
+ catch (error) {
155
+ return {
156
+ name: 'npx Compatibility',
157
+ status: 'fail',
158
+ message: 'npx not available',
159
+ actionable: 'Install npm 5.2+ which includes npx, or install npx separately'
160
+ };
161
+ }
162
+ }
163
+ async function checkDependencies() {
164
+ try {
165
+ const projectRoot = path.resolve(__dirname, '../..');
166
+ const nodeModulesPath = path.join(projectRoot, 'node_modules');
167
+ if (!existsSync(nodeModulesPath)) {
168
+ return {
169
+ name: 'Dependencies',
170
+ status: 'fail',
171
+ message: 'node_modules not found',
172
+ actionable: 'Run "npm install" to install dependencies'
173
+ };
174
+ }
175
+ // Check critical dependencies
176
+ const criticalDeps = ['@modelcontextprotocol/sdk', 'express', 'chokidar'];
177
+ const missing = [];
178
+ for (const dep of criticalDeps) {
179
+ const depPath = path.join(nodeModulesPath, dep);
180
+ if (!existsSync(depPath)) {
181
+ missing.push(dep);
182
+ }
183
+ }
184
+ if (missing.length > 0) {
185
+ return {
186
+ name: 'Dependencies',
187
+ status: 'fail',
188
+ message: `Missing: ${missing.join(', ')}`,
189
+ actionable: 'Run "npm install" to install missing dependencies'
190
+ };
191
+ }
192
+ return {
193
+ name: 'Dependencies',
194
+ status: 'pass',
195
+ message: 'All critical dependencies installed',
196
+ };
197
+ }
198
+ catch (error) {
199
+ return {
200
+ name: 'Dependencies',
201
+ status: 'fail',
202
+ message: 'Error checking dependencies',
203
+ details: error instanceof Error ? error.message : String(error),
204
+ };
205
+ }
206
+ }
207
+ async function checkSearchTools() {
208
+ const issues = [];
209
+ const warnings = [];
210
+ // Check semgrep
211
+ try {
212
+ await execAsync('semgrep --version');
213
+ }
214
+ catch (error) {
215
+ issues.push('semgrep not found');
216
+ }
217
+ // Check ripgrep
218
+ const projectRoot = path.resolve(__dirname, '../..');
219
+ const ripgrepPkgPath = path.join(projectRoot, 'node_modules/@lvce-editor/ripgrep');
220
+ let ripgrepOk = false;
221
+ if (existsSync(ripgrepPkgPath)) {
222
+ ripgrepOk = true;
223
+ }
224
+ else {
225
+ try {
226
+ await execAsync('rg --version');
227
+ ripgrepOk = true;
228
+ }
229
+ catch (error) {
230
+ issues.push('ripgrep not found');
231
+ }
232
+ }
233
+ if (issues.length === 0) {
234
+ return {
235
+ name: 'Search Tools',
236
+ status: 'pass',
237
+ message: 'semgrep and ripgrep available',
238
+ };
239
+ }
240
+ else if (issues.length === 1) {
241
+ return {
242
+ name: 'Search Tools',
243
+ status: 'warning',
244
+ message: `${issues[0]} (limited functionality)`,
245
+ actionable: 'Run "npm run install-search-tools" to install missing tools'
246
+ };
247
+ }
248
+ else {
249
+ return {
250
+ name: 'Search Tools',
251
+ status: 'fail',
252
+ message: 'Both semgrep and ripgrep missing',
253
+ actionable: 'Run "npm run install-search-tools" to install search tools'
254
+ };
255
+ }
256
+ }
257
+ async function checkMcpServer() {
258
+ try {
259
+ const projectRoot = path.resolve(__dirname, '../..');
260
+ const distPath = path.join(projectRoot, 'dist');
261
+ const mainFile = path.join(distPath, 'index.js');
262
+ if (!existsSync(distPath)) {
263
+ return {
264
+ name: 'MCP Server',
265
+ status: 'fail',
266
+ message: 'Project not built',
267
+ actionable: 'Run "npm run build" to compile TypeScript'
268
+ };
269
+ }
270
+ if (!existsSync(mainFile)) {
271
+ return {
272
+ name: 'MCP Server',
273
+ status: 'fail',
274
+ message: 'Main server file missing',
275
+ actionable: 'Run "npm run build" to compile TypeScript'
276
+ };
277
+ }
278
+ // Quick syntax check without starting server
279
+ try {
280
+ await execAsync(`node -c "${mainFile}"`);
281
+ return {
282
+ name: 'MCP Server',
283
+ status: 'pass',
284
+ message: 'Server files compiled and ready',
285
+ };
286
+ }
287
+ catch (error) {
288
+ return {
289
+ name: 'MCP Server',
290
+ status: 'fail',
291
+ message: 'Server files have syntax errors',
292
+ details: error instanceof Error ? error.message : String(error),
293
+ actionable: 'Run "npm run build" to recompile'
294
+ };
295
+ }
296
+ }
297
+ catch (error) {
298
+ return {
299
+ name: 'MCP Server',
300
+ status: 'fail',
301
+ message: 'Error checking server files',
302
+ details: error instanceof Error ? error.message : String(error),
303
+ };
304
+ }
305
+ }
306
+ async function checkDashboard() {
307
+ try {
308
+ const projectRoot = path.resolve(__dirname, '../..');
309
+ const dashboardFile = path.join(projectRoot, 'dist/dashboard/server.js');
310
+ if (!existsSync(dashboardFile)) {
311
+ return {
312
+ name: 'Dashboard',
313
+ status: 'fail',
314
+ message: 'Dashboard not built',
315
+ actionable: 'Run "npm run build" to compile dashboard'
316
+ };
317
+ }
318
+ // Quick syntax check
319
+ try {
320
+ await execAsync(`node -c "${dashboardFile}"`);
321
+ return {
322
+ name: 'Dashboard',
323
+ status: 'pass',
324
+ message: 'Dashboard ready',
325
+ };
326
+ }
327
+ catch (error) {
328
+ return {
329
+ name: 'Dashboard',
330
+ status: 'fail',
331
+ message: 'Dashboard has syntax errors',
332
+ details: error instanceof Error ? error.message : String(error),
333
+ actionable: 'Run "npm run build" to recompile'
334
+ };
335
+ }
336
+ }
337
+ catch (error) {
338
+ return {
339
+ name: 'Dashboard',
340
+ status: 'fail',
341
+ message: 'Error checking dashboard',
342
+ details: error instanceof Error ? error.message : String(error),
343
+ };
344
+ }
345
+ }
346
+ async function checkSpecSystem() {
347
+ try {
348
+ const projectRoot = path.resolve(__dirname, '../..');
349
+ const bobDir = path.join(projectRoot, '.bob');
350
+ if (!existsSync(bobDir)) {
351
+ // Create .bob directory if it doesn't exist
352
+ try {
353
+ await fs.ensureDir(path.join(bobDir, 'specs'));
354
+ await fs.writeJson(path.join(bobDir, 'specs', 'index.json'), { specs: [] });
355
+ return {
356
+ name: 'SPEC System',
357
+ status: 'pass',
358
+ message: 'SPEC directory initialized',
359
+ };
360
+ }
361
+ catch (error) {
362
+ return {
363
+ name: 'SPEC System',
364
+ status: 'fail',
365
+ message: 'Cannot create SPEC directory',
366
+ details: error instanceof Error ? error.message : String(error),
367
+ actionable: 'Check file system permissions'
368
+ };
369
+ }
370
+ }
371
+ const specsDir = path.join(bobDir, 'specs');
372
+ const indexFile = path.join(specsDir, 'index.json');
373
+ if (!existsSync(indexFile)) {
374
+ try {
375
+ await fs.writeJson(indexFile, { specs: [] });
376
+ }
377
+ catch (error) {
378
+ return {
379
+ name: 'SPEC System',
380
+ status: 'warning',
381
+ message: 'SPEC index needs initialization',
382
+ actionable: 'SPEC system will initialize on first use'
383
+ };
384
+ }
385
+ }
386
+ return {
387
+ name: 'SPEC System',
388
+ status: 'pass',
389
+ message: 'SPEC directory ready',
390
+ };
391
+ }
392
+ catch (error) {
393
+ return {
394
+ name: 'SPEC System',
395
+ status: 'fail',
396
+ message: 'Error checking SPEC system',
397
+ details: error instanceof Error ? error.message : String(error),
398
+ };
399
+ }
400
+ }
401
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/cli/checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ // src/cli/cleanup.ts
2
+ import { cleanupService } from '../tools/cleanupService.js';
3
+ export async function runCleanup(options = {}) {
4
+ if (options.stats) {
5
+ await showCleanupStats();
6
+ }
7
+ else {
8
+ await performCleanup(options);
9
+ }
10
+ }
11
+ async function showCleanupStats() {
12
+ console.log('๐Ÿงน Bob\'s Workshop Cleanup Statistics\n');
13
+ console.log('โ”'.repeat(50));
14
+ try {
15
+ const stats = await cleanupService.getCleanupStats();
16
+ console.log('\n๐Ÿ“Š System Resource Statistics:\n');
17
+ // Display stats in a user-friendly format
18
+ console.log('๐ŸŒณ Worktrees:');
19
+ console.log(` Total: ${stats.totalWorktrees || 0}`);
20
+ console.log(` Stale: ${stats.staleWorktrees || 0}`);
21
+ console.log(` Recent: ${(stats.totalWorktrees || 0) - (stats.staleWorktrees || 0)}`);
22
+ console.log('');
23
+ console.log('๐Ÿ“บ Work Recorders:');
24
+ console.log(` Active: ${stats.activeRecorders || 0}`);
25
+ console.log('');
26
+ // Recommendations
27
+ console.log('๐Ÿ’ก Cleanup Recommendations:');
28
+ if (stats.recommendations && stats.recommendations.length > 0) {
29
+ stats.recommendations.forEach(rec => {
30
+ console.log(` โ€ข ${rec}`);
31
+ });
32
+ }
33
+ else {
34
+ console.log(' โœ… System is clean - no cleanup needed');
35
+ }
36
+ if (stats.recommendations && stats.recommendations.length > 0) {
37
+ console.log('\nRun "bobs cleanup" to clean up the above items.');
38
+ }
39
+ }
40
+ catch (error) {
41
+ console.log('โŒ Failed to get cleanup statistics:');
42
+ console.log(` Error: ${error instanceof Error ? error.message : String(error)}`);
43
+ }
44
+ }
45
+ async function performCleanup(options) {
46
+ console.log('๐Ÿงน Bob\'s Workshop System Cleanup\n');
47
+ console.log('โ”'.repeat(50));
48
+ const cleanupOptions = {
49
+ maxWorktreeAge: options.maxAge || 7,
50
+ cleanTempFiles: options.cleanTemp !== false,
51
+ stopOrphanedRecorders: options.stopRecorders !== false,
52
+ forceCleanup: options.force || false
53
+ };
54
+ console.log('\n๐Ÿ”ง Cleanup Configuration:');
55
+ console.log(` Max worktree age: ${cleanupOptions.maxWorktreeAge} days`);
56
+ console.log(` Clean temp files: ${cleanupOptions.cleanTempFiles ? 'Yes' : 'No'}`);
57
+ console.log(` Stop orphaned recorders: ${cleanupOptions.stopOrphanedRecorders ? 'Yes' : 'No'}`);
58
+ console.log(` Force cleanup: ${cleanupOptions.forceCleanup ? 'Yes' : 'No'}`);
59
+ console.log('');
60
+ try {
61
+ console.log('๐Ÿš€ Starting cleanup...\n');
62
+ const result = await cleanupService.performCleanup(cleanupOptions);
63
+ console.log('๐Ÿ“Š Cleanup Results:\n');
64
+ // Display results in a user-friendly format
65
+ if (result.staleWorktrees !== undefined) {
66
+ const icon = result.staleWorktrees > 0 ? '๐ŸŒณ' : 'โœ…';
67
+ console.log(`${icon} Worktrees: ${result.staleWorktrees} cleaned`);
68
+ }
69
+ if (result.tempFilesCleared !== undefined) {
70
+ const icon = result.tempFilesCleared > 0 ? '๐Ÿ“' : 'โœ…';
71
+ console.log(`${icon} Temp Files: ${result.tempFilesCleared} cleaned`);
72
+ }
73
+ if (result.orphanedRecorders !== undefined) {
74
+ const icon = result.orphanedRecorders > 0 ? '๐Ÿ“บ' : 'โœ…';
75
+ console.log(`${icon} Work Recorders: ${result.orphanedRecorders} stopped`);
76
+ }
77
+ if (result.errors && result.errors.length > 0) {
78
+ console.log('\nโš ๏ธ Cleanup Warnings:');
79
+ result.errors.forEach(error => {
80
+ console.log(` โ€ข ${error}`);
81
+ });
82
+ }
83
+ console.log('\nโ”'.repeat(50));
84
+ console.log('๐ŸŽ‰ Cleanup completed successfully!');
85
+ }
86
+ catch (error) {
87
+ console.log('โŒ Cleanup failed:');
88
+ console.log(` Error: ${error instanceof Error ? error.message : String(error)}`);
89
+ console.log('\nSome cleanup operations may have partially completed.');
90
+ }
91
+ }
92
+ function formatBytes(bytes) {
93
+ if (bytes === 0)
94
+ return '0 B';
95
+ const k = 1024;
96
+ const sizes = ['B', 'KB', 'MB', 'GB'];
97
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
98
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
99
+ }
100
+ export function parseCleanupArgs(args) {
101
+ const options = {};
102
+ for (let i = 0; i < args.length; i++) {
103
+ const arg = args[i];
104
+ switch (arg) {
105
+ case '--stats':
106
+ case '-s':
107
+ options.stats = true;
108
+ break;
109
+ case '--max-age':
110
+ case '-a':
111
+ const ageValue = args[i + 1];
112
+ if (ageValue && !isNaN(parseInt(ageValue))) {
113
+ options.maxAge = parseInt(ageValue);
114
+ i++; // Skip next arg since we consumed it
115
+ }
116
+ break;
117
+ case '--no-temp':
118
+ options.cleanTemp = false;
119
+ break;
120
+ case '--no-recorders':
121
+ options.stopRecorders = false;
122
+ break;
123
+ case '--force':
124
+ case '-f':
125
+ options.force = true;
126
+ break;
127
+ }
128
+ }
129
+ return options;
130
+ }
131
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/cli/cleanup.ts"],"names":[],"mappings":"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"}