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.
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 +377 -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 +46 -0
  42. package/package.json +35 -67
  43. package/postinstall.js +190 -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 +455 -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 +55 -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,121 +0,0 @@
1
- #!/usr/bin/env tsx
2
- /**
3
- * Cleanup Script: Remove Empty System Activity Logs
4
- *
5
- * This script scans all SPEC files and removes "System activity logged" entries
6
- * from the enhanced_activities array. These are noise logs created by
7
- * bob.dashboard.update calls without meaningful summaries.
8
- *
9
- * Usage: npm run cleanup:system-logs
10
- */
11
-
12
- import fs from 'fs-extra';
13
- import path from 'path';
14
-
15
- interface EnhancedActivity {
16
- id: string;
17
- timestamp: string;
18
- role: string;
19
- type: string;
20
- summary: string;
21
- files_changed?: any[];
22
- [key: string]: any;
23
- }
24
-
25
- interface SpecData {
26
- spec_id: string;
27
- enhanced_activities?: EnhancedActivity[];
28
- [key: string]: any;
29
- }
30
-
31
- async function cleanupSystemLogs() {
32
- console.log('🧹 Starting cleanup of empty system activity logs...\n');
33
-
34
- const specsDir = path.resolve(process.cwd(), '.bob/specs');
35
-
36
- // Check if specs directory exists
37
- if (!await fs.pathExists(specsDir)) {
38
- console.error(`āŒ Specs directory not found: ${specsDir}`);
39
- process.exit(1);
40
- }
41
-
42
- const allFiles = await fs.readdir(specsDir);
43
- const specFiles = allFiles
44
- .filter(file => file.startsWith('SPEC-') && file.endsWith('.json'))
45
- .map(file => path.join(specsDir, file));
46
-
47
- if (specFiles.length === 0) {
48
- console.log('ā„¹ļø No SPEC files found.');
49
- return;
50
- }
51
-
52
- console.log(`šŸ“‚ Found ${specFiles.length} SPEC files to process\n`);
53
-
54
- let totalRemoved = 0;
55
- let filesModified = 0;
56
-
57
- for (const specFile of specFiles) {
58
- try {
59
- const specData: SpecData = await fs.readJson(specFile);
60
-
61
- if (!specData.enhanced_activities || specData.enhanced_activities.length === 0) {
62
- continue;
63
- }
64
-
65
- const originalLength = specData.enhanced_activities.length;
66
-
67
- // Filter out empty system logs
68
- specData.enhanced_activities = specData.enhanced_activities.filter((activity: EnhancedActivity) => {
69
- // Keep activity if ANY of these conditions are true:
70
- // 1. Role is NOT system
71
- // 2. Has a meaningful summary (not "System activity logged" and not empty)
72
- // 3. Has file changes
73
- const keepActivity = !(
74
- activity.role === 'system' &&
75
- (activity.summary === 'System activity logged' || !activity.summary || activity.summary.trim() === '') &&
76
- (!activity.files_changed || activity.files_changed.length === 0)
77
- );
78
-
79
- return keepActivity;
80
- });
81
-
82
- const removed = originalLength - specData.enhanced_activities.length;
83
-
84
- if (removed > 0) {
85
- // Update timestamp
86
- specData.updated_at = new Date().toISOString();
87
-
88
- // Write back to file
89
- await fs.writeJson(specFile, specData, { spaces: 2 });
90
-
91
- totalRemoved += removed;
92
- filesModified++;
93
-
94
- const fileName = path.basename(specFile);
95
- console.log(`āœ“ ${fileName}: Removed ${removed} empty system log${removed > 1 ? 's' : ''}`);
96
- }
97
- } catch (error) {
98
- console.error(`āŒ Error processing ${path.basename(specFile)}:`, error);
99
- }
100
- }
101
-
102
- console.log('\n' + '='.repeat(60));
103
- console.log('āœ… Cleanup complete!');
104
- console.log('='.repeat(60));
105
- console.log(`šŸ“Š Files modified: ${filesModified}`);
106
- console.log(`šŸ—‘ļø Empty system logs removed: ${totalRemoved}`);
107
- console.log(`šŸ“ Files unchanged: ${specFiles.length - filesModified}`);
108
- console.log('='.repeat(60) + '\n');
109
-
110
- if (totalRemoved === 0) {
111
- console.log('šŸŽ‰ No empty system logs found - your SPEC files are already clean!');
112
- } else {
113
- console.log('šŸŽ‰ Dashboard activity timeline should now be cleaner!');
114
- }
115
- }
116
-
117
- // Run the cleanup
118
- cleanupSystemLogs().catch((error) => {
119
- console.error('āŒ Fatal error during cleanup:', error);
120
- process.exit(1);
121
- });
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { fileURLToPath } from 'url';
4
- import { dirname, join } from 'path';
5
- import fs from 'fs-extra';
6
-
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = dirname(__filename);
9
-
10
- async function initializeWorkspace() {
11
- console.log('šŸ”§ Initializing Bob\'s Workshop workspace...');
12
-
13
- try {
14
- const projectRoot = join(__dirname, '..');
15
- const bobDir = join(projectRoot, '.bob');
16
- const specsDir = join(bobDir, 'specs');
17
- const manualsDir = join(bobDir, 'manuals');
18
- const worktreesDir = join(bobDir, 'worktrees');
19
- const indexFile = join(specsDir, 'index.json');
20
-
21
- // Create all necessary directories
22
- await fs.ensureDir(specsDir);
23
- await fs.ensureDir(manualsDir);
24
- await fs.ensureDir(worktreesDir);
25
-
26
- // Create specs index if it doesn't exist (preserve existing data)
27
- if (!await fs.pathExists(indexFile)) {
28
- await fs.writeJson(indexFile, {
29
- specs: [],
30
- created_at: new Date().toISOString(),
31
- version: "1.0"
32
- }, { spaces: 2 });
33
- console.log('šŸ“ Created new specs index');
34
- } else {
35
- console.log('šŸ“ Existing specs index preserved');
36
- }
37
-
38
- // Create .gitkeep files to ensure directories are preserved in git
39
- const gitkeepFiles = [
40
- join(manualsDir, '.gitkeep'),
41
- join(worktreesDir, '.gitkeep')
42
- ];
43
-
44
- for (const gitkeepFile of gitkeepFiles) {
45
- if (!await fs.pathExists(gitkeepFile)) {
46
- await fs.writeFile(gitkeepFile, '# This file ensures the directory is preserved in git\n');
47
- }
48
- }
49
-
50
- console.log('āœ… Bob\'s Workshop workspace initialized');
51
- console.log('');
52
- console.log('šŸš€ Ready to use! Try:');
53
- console.log(' bobs workshop # Launch dashboard');
54
- console.log(' bobs --help # See all commands');
55
- console.log('');
56
-
57
- } catch (error) {
58
- console.error('āš ļø Workspace initialization failed:', error.message);
59
- console.log('šŸ’” This won\'t prevent Bob\'s Workshop from working');
60
- }
61
- }
62
-
63
- initializeWorkspace();
@@ -1,116 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import { exec } from 'child_process';
4
- import { promisify } from 'util';
5
- import { existsSync } from 'fs';
6
- import path from 'path';
7
- import { fileURLToPath } from 'url';
8
-
9
- const execAsync = promisify(exec);
10
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
-
12
- console.log('šŸ”§ Setting up Bob\'s MCP search tools...\n');
13
-
14
- async function checkCommand(command, name) {
15
- try {
16
- await execAsync(`${command} --version`);
17
- console.log(`āœ… ${name} is already installed`);
18
- return true;
19
- } catch (error) {
20
- console.log(`āŒ ${name} not found`);
21
- return false;
22
- }
23
- }
24
-
25
- async function installSemgrep() {
26
- console.log('šŸ“¦ Installing semgrep...');
27
-
28
- // Try different installation methods
29
- const methods = [
30
- {
31
- cmd: 'brew install semgrep',
32
- name: 'Homebrew',
33
- check: () => execAsync('which brew')
34
- },
35
- {
36
- cmd: 'pip3 install semgrep',
37
- name: 'pip3',
38
- check: () => execAsync('which pip3')
39
- },
40
- {
41
- cmd: 'python3 -m pip install semgrep',
42
- name: 'Python pip',
43
- check: () => execAsync('which python3')
44
- }
45
- ];
46
-
47
- for (const method of methods) {
48
- try {
49
- await method.check();
50
- console.log(`šŸ“¦ Trying to install semgrep via ${method.name}...`);
51
- await execAsync(method.cmd);
52
-
53
- // Verify installation
54
- if (await checkCommand('semgrep', 'semgrep')) {
55
- console.log(`āœ… Successfully installed semgrep via ${method.name}`);
56
- return true;
57
- }
58
- } catch (error) {
59
- console.log(`āš ļø ${method.name} installation failed or not available`);
60
- continue;
61
- }
62
- }
63
-
64
- console.log(`āš ļø Could not automatically install semgrep. Please install manually:
65
- • macOS: brew install semgrep
66
- • Linux/other: pip3 install semgrep
67
- • Or visit: https://semgrep.dev/docs/getting-started/`);
68
- return false;
69
- }
70
-
71
- async function checkRipgrep() {
72
- console.log('šŸ“¦ Checking ripgrep...');
73
-
74
- // Check if the npm package is available
75
- const ripgrepPkgPath = path.resolve(__dirname, '../node_modules/@lvce-editor/ripgrep');
76
- if (existsSync(ripgrepPkgPath)) {
77
- console.log('āœ… Ripgrep installed via npm package (@lvce-editor/ripgrep)');
78
- return true;
79
- }
80
-
81
- // Check if ripgrep is available in system PATH
82
- if (await checkCommand('rg', 'ripgrep')) {
83
- return true;
84
- }
85
-
86
- console.log(`āš ļø Ripgrep not found. This is usually provided by Claude Code.
87
- If you need to install it manually:
88
- • macOS: brew install ripgrep
89
- • Linux: apt install ripgrep / yum install ripgrep
90
- • Or visit: https://github.com/BurntSushi/ripgrep`);
91
- return false;
92
- }
93
-
94
- async function main() {
95
- let semgrepOk = await checkCommand('semgrep', 'semgrep');
96
- let ripgrepOk = await checkRipgrep();
97
-
98
- if (!semgrepOk) {
99
- semgrepOk = await installSemgrep();
100
- }
101
-
102
- console.log('\nšŸ“Š Setup Summary:');
103
- console.log(` Semgrep: ${semgrepOk ? 'āœ… Ready' : 'āŒ Not available'}`);
104
- console.log(` Ripgrep: ${ripgrepOk ? 'āœ… Ready' : 'āŒ Not available'}`);
105
-
106
- if (semgrepOk && ripgrepOk) {
107
- console.log('\nšŸŽ‰ All search tools are ready! Bob\'s MCP can now perform advanced code searches.');
108
- } else {
109
- console.log('\nāš ļø Some search tools are missing. Bob\'s MCP will work with limited search functionality.');
110
- console.log(' Run `npm run install-search-tools` again after installing missing tools.');
111
- }
112
-
113
- console.log('\nšŸš€ Run `npm run dev` or `npm start` to start Bob\'s MCP server.');
114
- }
115
-
116
- main().catch(console.error);