@cpretzinger/boss-claude 1.0.0 → 1.0.2

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 (87) hide show
  1. package/README.md +304 -1
  2. package/bin/boss-claude.js +1138 -0
  3. package/bin/commands/mode.js +250 -0
  4. package/bin/onyx-guard.js +259 -0
  5. package/bin/onyx-guard.sh +251 -0
  6. package/bin/prompts.js +284 -0
  7. package/bin/rollback.js +85 -0
  8. package/bin/setup-wizard.js +492 -0
  9. package/config/.env.example +17 -0
  10. package/lib/README.md +83 -0
  11. package/lib/agent-logger.js +61 -0
  12. package/lib/agents/memory-engineers/github-memory-engineer.js +251 -0
  13. package/lib/agents/memory-engineers/postgres-memory-engineer.js +633 -0
  14. package/lib/agents/memory-engineers/qdrant-memory-engineer.js +358 -0
  15. package/lib/agents/memory-engineers/redis-memory-engineer.js +383 -0
  16. package/lib/agents/memory-supervisor.js +526 -0
  17. package/lib/agents/registry.js +135 -0
  18. package/lib/auto-monitor.js +131 -0
  19. package/lib/checkpoint-hook.js +112 -0
  20. package/lib/checkpoint.js +319 -0
  21. package/lib/commentator.js +213 -0
  22. package/lib/context-scribe.js +120 -0
  23. package/lib/delegation-strategies.js +326 -0
  24. package/lib/hierarchy-validator.js +643 -0
  25. package/lib/index.js +15 -0
  26. package/lib/init-with-mode.js +261 -0
  27. package/lib/init.js +44 -6
  28. package/lib/memory-result-aggregator.js +252 -0
  29. package/lib/memory.js +35 -7
  30. package/lib/mode-enforcer.js +473 -0
  31. package/lib/onyx-banner.js +169 -0
  32. package/lib/onyx-identity.js +214 -0
  33. package/lib/onyx-monitor.js +381 -0
  34. package/lib/onyx-reminder.js +188 -0
  35. package/lib/onyx-tool-interceptor.js +341 -0
  36. package/lib/onyx-wrapper.js +315 -0
  37. package/lib/orchestrator-gate.js +334 -0
  38. package/lib/output-formatter.js +296 -0
  39. package/lib/postgres.js +1 -1
  40. package/lib/prompt-injector.js +220 -0
  41. package/lib/prompts.js +532 -0
  42. package/lib/session.js +153 -6
  43. package/lib/setup/README.md +187 -0
  44. package/lib/setup/env-manager.js +785 -0
  45. package/lib/setup/error-recovery.js +630 -0
  46. package/lib/setup/explain-scopes.js +385 -0
  47. package/lib/setup/github-instructions.js +333 -0
  48. package/lib/setup/github-repo.js +254 -0
  49. package/lib/setup/import-credentials.js +498 -0
  50. package/lib/setup/index.js +62 -0
  51. package/lib/setup/init-postgres.js +785 -0
  52. package/lib/setup/init-redis.js +456 -0
  53. package/lib/setup/integration-test.js +652 -0
  54. package/lib/setup/progress.js +357 -0
  55. package/lib/setup/rollback.js +670 -0
  56. package/lib/setup/rollback.test.js +452 -0
  57. package/lib/setup/setup-with-rollback.example.js +351 -0
  58. package/lib/setup/summary.js +400 -0
  59. package/lib/setup/test-github-setup.js +10 -0
  60. package/lib/setup/test-postgres-init.js +98 -0
  61. package/lib/setup/verify-setup.js +102 -0
  62. package/lib/task-agent-worker.js +235 -0
  63. package/lib/token-monitor.js +466 -0
  64. package/lib/tool-wrapper-integration.js +369 -0
  65. package/lib/tool-wrapper.js +387 -0
  66. package/lib/validators/README.md +497 -0
  67. package/lib/validators/config.js +583 -0
  68. package/lib/validators/config.test.js +175 -0
  69. package/lib/validators/github.js +310 -0
  70. package/lib/validators/github.test.js +61 -0
  71. package/lib/validators/index.js +15 -0
  72. package/lib/validators/postgres.js +525 -0
  73. package/package.json +98 -13
  74. package/scripts/benchmark-memory.js +433 -0
  75. package/scripts/check-secrets.sh +12 -0
  76. package/scripts/fetch-todos.mjs +148 -0
  77. package/scripts/graceful-shutdown.sh +156 -0
  78. package/scripts/install-onyx-hooks.js +373 -0
  79. package/scripts/install.js +119 -18
  80. package/scripts/redis-monitor.js +284 -0
  81. package/scripts/redis-setup.js +412 -0
  82. package/scripts/test-memory-retrieval.js +201 -0
  83. package/scripts/validate-exports.js +68 -0
  84. package/scripts/validate-package.js +120 -0
  85. package/scripts/verify-onyx-deployment.js +309 -0
  86. package/scripts/verify-redis-deployment.js +354 -0
  87. package/scripts/verify-redis-init.js +219 -0
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BOSS CLAUDE - Setup with Rollback Example
4
+ *
5
+ * Demonstrates how to integrate rollback functionality into setup wizard
6
+ */
7
+
8
+ import { setupGitHubRepo } from './github-repo.js';
9
+ import { EnvManager } from './env-manager.js';
10
+ import { SetupState, RollbackManager } from './rollback.js';
11
+ import chalk from 'chalk';
12
+
13
+ /**
14
+ * Example: GitHub Repository Setup with Rollback
15
+ */
16
+ async function setupGitHubWithRollback() {
17
+ console.log(chalk.bold.cyan('\n🔧 GitHub Setup with Rollback Protection\n'));
18
+
19
+ const state = new SetupState();
20
+ let githubResult = null;
21
+
22
+ try {
23
+ // Step 1: Setup GitHub repository
24
+ console.log(chalk.blue('Setting up GitHub repository...'));
25
+ githubResult = await setupGitHubRepo({ verbose: true });
26
+
27
+ if (!githubResult.success) {
28
+ throw new Error(`GitHub setup failed: ${githubResult.error}`);
29
+ }
30
+
31
+ // Step 2: Record action for potential rollback
32
+ await state.recordAction('github_repo', {
33
+ owner: githubResult.owner,
34
+ repo: githubResult.repo,
35
+ token: process.env.GITHUB_TOKEN,
36
+ wasCreated: githubResult.created // Only rollback if we created it
37
+ });
38
+
39
+ console.log(chalk.green('✓ GitHub repository setup complete'));
40
+
41
+ // Step 3: Save environment variables
42
+ console.log(chalk.blue('\nSaving environment variables...'));
43
+
44
+ const envManager = new EnvManager();
45
+ await envManager.init();
46
+
47
+ await envManager.set('GITHUB_OWNER', githubResult.owner, {
48
+ comment: 'GitHub username for Boss Claude memory repo'
49
+ });
50
+
51
+ await envManager.set('GITHUB_MEMORY_REPO', githubResult.repo, {
52
+ comment: 'Repository name for persistent memory storage'
53
+ });
54
+
55
+ // Record env changes
56
+ await state.recordAction('env_vars', {
57
+ keys: ['GITHUB_OWNER', 'GITHUB_MEMORY_REPO']
58
+ });
59
+
60
+ console.log(chalk.green('✓ Environment variables saved'));
61
+
62
+ // Step 4: Mark setup as completed
63
+ await state.markCompleted();
64
+
65
+ console.log(chalk.green.bold('\n✓ Setup completed successfully!\n'));
66
+
67
+ return {
68
+ success: true,
69
+ github: githubResult
70
+ };
71
+
72
+ } catch (error) {
73
+ console.log(chalk.red.bold('\n✗ Setup failed!\n'));
74
+ console.log(chalk.red(`Error: ${error.message}\n`));
75
+
76
+ // Ask user if they want to rollback
77
+ console.log(chalk.yellow('Would you like to rollback changes? (Add --rollback flag)'));
78
+
79
+ // In production, you'd use a prompt library or CLI flag
80
+ const shouldRollback = process.argv.includes('--rollback');
81
+
82
+ if (shouldRollback) {
83
+ console.log(chalk.yellow('\nRolling back changes...\n'));
84
+
85
+ const manager = new RollbackManager({ verbose: true });
86
+ const rollbackResult = await manager.rollback(state.state);
87
+
88
+ if (rollbackResult.success) {
89
+ console.log(chalk.green('\n✓ Successfully rolled back all changes\n'));
90
+ } else {
91
+ console.log(chalk.red('\n✗ Rollback completed with errors\n'));
92
+ console.log(chalk.gray('Check logs: ~/.boss-claude/rollback.log\n'));
93
+ }
94
+ }
95
+
96
+ throw error;
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Example: Complete Setup Workflow with Rollback
102
+ */
103
+ async function completeSetupWithRollback() {
104
+ console.log(chalk.bold.cyan('\n🚀 BOSS CLAUDE COMPLETE SETUP\n'));
105
+
106
+ const state = new SetupState();
107
+
108
+ try {
109
+ // ========================================================================
110
+ // PHASE 1: GitHub Repository Setup
111
+ // ========================================================================
112
+ console.log(chalk.bold('Phase 1: GitHub Repository\n'));
113
+
114
+ const githubResult = await setupGitHubRepo({ verbose: true });
115
+
116
+ if (!githubResult.success) {
117
+ throw new Error(`GitHub setup failed: ${githubResult.error}`);
118
+ }
119
+
120
+ await state.recordAction('github_repo', {
121
+ owner: githubResult.owner,
122
+ repo: githubResult.repo,
123
+ token: process.env.GITHUB_TOKEN,
124
+ wasCreated: githubResult.created
125
+ });
126
+
127
+ console.log(chalk.green('✓ Phase 1 complete\n'));
128
+
129
+ // ========================================================================
130
+ // PHASE 2: Environment Configuration
131
+ // ========================================================================
132
+ console.log(chalk.bold('Phase 2: Environment Configuration\n'));
133
+
134
+ const envManager = new EnvManager();
135
+ await envManager.init();
136
+
137
+ const envVars = {
138
+ GITHUB_OWNER: githubResult.owner,
139
+ GITHUB_MEMORY_REPO: githubResult.repo,
140
+ BOSS_CLAUDE_VERSION: '1.0.0',
141
+ BOSS_CLAUDE_SETUP_DATE: new Date().toISOString()
142
+ };
143
+
144
+ await envManager.bulkSet(envVars);
145
+
146
+ await state.recordAction('env_vars', {
147
+ keys: Object.keys(envVars)
148
+ });
149
+
150
+ console.log(chalk.green('✓ Phase 2 complete\n'));
151
+
152
+ // ========================================================================
153
+ // PHASE 3: Redis Initialization (optional)
154
+ // ========================================================================
155
+ console.log(chalk.bold('Phase 3: Redis Initialization (optional)\n'));
156
+
157
+ try {
158
+ const redis = await import('redis');
159
+ const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379';
160
+ const client = redis.createClient({ url: redisUrl });
161
+
162
+ await client.connect();
163
+
164
+ // Initialize Boss Claude keys
165
+ await client.set('boss:claude:setup:version', '1.0.0');
166
+ await client.set('boss:claude:setup:timestamp', new Date().toISOString());
167
+
168
+ await state.recordAction('redis_keys', {
169
+ pattern: 'boss:claude:setup:*'
170
+ });
171
+
172
+ await client.quit();
173
+
174
+ console.log(chalk.green('✓ Phase 3 complete (Redis initialized)\n'));
175
+ } catch (error) {
176
+ console.log(chalk.yellow('⚠ Phase 3 skipped (Redis not available)\n'));
177
+ }
178
+
179
+ // ========================================================================
180
+ // COMPLETION
181
+ // ========================================================================
182
+ await state.markCompleted();
183
+
184
+ console.log(chalk.green.bold('═'.repeat(70)));
185
+ console.log(chalk.green.bold(' ✓ SETUP COMPLETED SUCCESSFULLY'));
186
+ console.log(chalk.green.bold('═'.repeat(70)));
187
+ console.log(chalk.white('\nYour Boss Claude installation is ready to use!\n'));
188
+ console.log(chalk.gray('Configuration stored in: ~/.boss-claude/\n'));
189
+
190
+ return {
191
+ success: true,
192
+ github: githubResult,
193
+ env: envVars
194
+ };
195
+
196
+ } catch (error) {
197
+ console.log(chalk.red.bold('\n✗ Setup failed!\n'));
198
+ console.log(chalk.red(`Error: ${error.message}\n`));
199
+
200
+ // Auto-rollback on failure
201
+ console.log(chalk.yellow('Rolling back changes...\n'));
202
+
203
+ const manager = new RollbackManager({ verbose: true });
204
+ const rollbackResult = await manager.rollback(state.state);
205
+
206
+ if (rollbackResult.success) {
207
+ console.log(chalk.green('\n✓ All changes have been rolled back\n'));
208
+ console.log(chalk.white('You can safely retry the setup.\n'));
209
+ } else {
210
+ console.log(chalk.red('\n✗ Rollback completed with errors\n'));
211
+ console.log(chalk.yellow('Some cleanup may be required:\n'));
212
+
213
+ if (rollbackResult.errors) {
214
+ rollbackResult.errors.forEach(err => {
215
+ console.log(chalk.red(` • ${err}`));
216
+ });
217
+ }
218
+
219
+ console.log(chalk.gray('\nCheck logs: ~/.boss-claude/rollback.log\n'));
220
+ }
221
+
222
+ throw error;
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Example: Manual Rollback
228
+ */
229
+ async function manualRollback() {
230
+ console.log(chalk.bold.yellow('\n🔄 Manual Rollback\n'));
231
+
232
+ const manager = new RollbackManager({ verbose: true });
233
+
234
+ // Load existing state
235
+ const existingState = await manager.state.load();
236
+
237
+ if (!existingState || existingState.actions.length === 0) {
238
+ console.log(chalk.yellow('No setup state found. Nothing to rollback.\n'));
239
+ return { success: true, actionCount: 0 };
240
+ }
241
+
242
+ console.log(chalk.white(`Found ${existingState.actions.length} actions to rollback:\n`));
243
+
244
+ existingState.actions.forEach((action, index) => {
245
+ console.log(chalk.cyan(` ${index + 1}. ${action.type}`));
246
+ console.log(chalk.gray(` ${action.timestamp}`));
247
+ });
248
+
249
+ console.log(chalk.yellow('\nExecuting rollback...\n'));
250
+
251
+ const result = await manager.rollback();
252
+
253
+ if (result.success) {
254
+ console.log(chalk.green.bold('\n✓ Rollback completed successfully\n'));
255
+ console.log(chalk.white(` Rolled back: ${result.successful} actions\n`));
256
+ } else {
257
+ console.log(chalk.red.bold('\n✗ Rollback completed with errors\n'));
258
+ console.log(chalk.white(` Successful: ${result.successful}`));
259
+ console.log(chalk.white(` Failed: ${result.failed}\n`));
260
+ }
261
+
262
+ return result;
263
+ }
264
+
265
+ /**
266
+ * Example: Dry Run Rollback
267
+ */
268
+ async function dryRunRollback() {
269
+ console.log(chalk.bold.cyan('\n🔍 Dry Run Rollback (Preview)\n'));
270
+
271
+ const manager = new RollbackManager({
272
+ verbose: true,
273
+ dryRun: true // Preview only, no changes
274
+ });
275
+
276
+ const result = await manager.rollback();
277
+
278
+ console.log(chalk.cyan.bold('\n📋 Preview Summary:\n'));
279
+ console.log(chalk.white(` Total actions: ${result.total}`));
280
+ console.log(chalk.white(` Would rollback: ${result.successful} actions`));
281
+ console.log(chalk.white(` Would skip: ${result.skipped} actions\n`));
282
+
283
+ console.log(chalk.yellow('To execute rollback, run without --dry-run flag\n'));
284
+
285
+ return result;
286
+ }
287
+
288
+ /**
289
+ * Main CLI
290
+ */
291
+ async function main() {
292
+ const command = process.argv[2];
293
+
294
+ try {
295
+ switch (command) {
296
+ case 'setup':
297
+ await completeSetupWithRollback();
298
+ break;
299
+
300
+ case 'setup-github':
301
+ await setupGitHubWithRollback();
302
+ break;
303
+
304
+ case 'rollback':
305
+ await manualRollback();
306
+ break;
307
+
308
+ case 'preview':
309
+ await dryRunRollback();
310
+ break;
311
+
312
+ default:
313
+ console.log(chalk.bold.cyan('\n🔧 BOSS CLAUDE Setup with Rollback Examples\n'));
314
+ console.log(chalk.white('Usage:\n'));
315
+ console.log(chalk.cyan(' node setup-with-rollback.example.js setup'));
316
+ console.log(chalk.gray(' Run complete setup with rollback protection\n'));
317
+ console.log(chalk.cyan(' node setup-with-rollback.example.js setup-github'));
318
+ console.log(chalk.gray(' Run GitHub setup only with rollback\n'));
319
+ console.log(chalk.cyan(' node setup-with-rollback.example.js rollback'));
320
+ console.log(chalk.gray(' Execute manual rollback of previous setup\n'));
321
+ console.log(chalk.cyan(' node setup-with-rollback.example.js preview'));
322
+ console.log(chalk.gray(' Preview what would be rolled back (dry run)\n'));
323
+ process.exit(0);
324
+ }
325
+
326
+ process.exit(0);
327
+
328
+ } catch (error) {
329
+ console.error(chalk.red('\n✗ Error:\n'));
330
+ console.error(chalk.red(error.message));
331
+
332
+ if (process.argv.includes('--verbose') && error.stack) {
333
+ console.error(chalk.gray('\nStack trace:'));
334
+ console.error(chalk.gray(error.stack));
335
+ }
336
+
337
+ process.exit(1);
338
+ }
339
+ }
340
+
341
+ // Run if executed directly
342
+ if (import.meta.url === `file://${process.argv[1]}`) {
343
+ main();
344
+ }
345
+
346
+ export {
347
+ setupGitHubWithRollback,
348
+ completeSetupWithRollback,
349
+ manualRollback,
350
+ dryRunRollback
351
+ };