@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.
- package/README.md +304 -1
- package/bin/boss-claude.js +1138 -0
- package/bin/commands/mode.js +250 -0
- package/bin/onyx-guard.js +259 -0
- package/bin/onyx-guard.sh +251 -0
- package/bin/prompts.js +284 -0
- package/bin/rollback.js +85 -0
- package/bin/setup-wizard.js +492 -0
- package/config/.env.example +17 -0
- package/lib/README.md +83 -0
- package/lib/agent-logger.js +61 -0
- package/lib/agents/memory-engineers/github-memory-engineer.js +251 -0
- package/lib/agents/memory-engineers/postgres-memory-engineer.js +633 -0
- package/lib/agents/memory-engineers/qdrant-memory-engineer.js +358 -0
- package/lib/agents/memory-engineers/redis-memory-engineer.js +383 -0
- package/lib/agents/memory-supervisor.js +526 -0
- package/lib/agents/registry.js +135 -0
- package/lib/auto-monitor.js +131 -0
- package/lib/checkpoint-hook.js +112 -0
- package/lib/checkpoint.js +319 -0
- package/lib/commentator.js +213 -0
- package/lib/context-scribe.js +120 -0
- package/lib/delegation-strategies.js +326 -0
- package/lib/hierarchy-validator.js +643 -0
- package/lib/index.js +15 -0
- package/lib/init-with-mode.js +261 -0
- package/lib/init.js +44 -6
- package/lib/memory-result-aggregator.js +252 -0
- package/lib/memory.js +35 -7
- package/lib/mode-enforcer.js +473 -0
- package/lib/onyx-banner.js +169 -0
- package/lib/onyx-identity.js +214 -0
- package/lib/onyx-monitor.js +381 -0
- package/lib/onyx-reminder.js +188 -0
- package/lib/onyx-tool-interceptor.js +341 -0
- package/lib/onyx-wrapper.js +315 -0
- package/lib/orchestrator-gate.js +334 -0
- package/lib/output-formatter.js +296 -0
- package/lib/postgres.js +1 -1
- package/lib/prompt-injector.js +220 -0
- package/lib/prompts.js +532 -0
- package/lib/session.js +153 -6
- package/lib/setup/README.md +187 -0
- package/lib/setup/env-manager.js +785 -0
- package/lib/setup/error-recovery.js +630 -0
- package/lib/setup/explain-scopes.js +385 -0
- package/lib/setup/github-instructions.js +333 -0
- package/lib/setup/github-repo.js +254 -0
- package/lib/setup/import-credentials.js +498 -0
- package/lib/setup/index.js +62 -0
- package/lib/setup/init-postgres.js +785 -0
- package/lib/setup/init-redis.js +456 -0
- package/lib/setup/integration-test.js +652 -0
- package/lib/setup/progress.js +357 -0
- package/lib/setup/rollback.js +670 -0
- package/lib/setup/rollback.test.js +452 -0
- package/lib/setup/setup-with-rollback.example.js +351 -0
- package/lib/setup/summary.js +400 -0
- package/lib/setup/test-github-setup.js +10 -0
- package/lib/setup/test-postgres-init.js +98 -0
- package/lib/setup/verify-setup.js +102 -0
- package/lib/task-agent-worker.js +235 -0
- package/lib/token-monitor.js +466 -0
- package/lib/tool-wrapper-integration.js +369 -0
- package/lib/tool-wrapper.js +387 -0
- package/lib/validators/README.md +497 -0
- package/lib/validators/config.js +583 -0
- package/lib/validators/config.test.js +175 -0
- package/lib/validators/github.js +310 -0
- package/lib/validators/github.test.js +61 -0
- package/lib/validators/index.js +15 -0
- package/lib/validators/postgres.js +525 -0
- package/package.json +98 -13
- package/scripts/benchmark-memory.js +433 -0
- package/scripts/check-secrets.sh +12 -0
- package/scripts/fetch-todos.mjs +148 -0
- package/scripts/graceful-shutdown.sh +156 -0
- package/scripts/install-onyx-hooks.js +373 -0
- package/scripts/install.js +119 -18
- package/scripts/redis-monitor.js +284 -0
- package/scripts/redis-setup.js +412 -0
- package/scripts/test-memory-retrieval.js +201 -0
- package/scripts/validate-exports.js +68 -0
- package/scripts/validate-package.js +120 -0
- package/scripts/verify-onyx-deployment.js +309 -0
- package/scripts/verify-redis-deployment.js +354 -0
- 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
|
+
};
|