UNPKG

claude-collab

Version:

Claude Collab - The AI collaboration framework that prevents echo chambers

265 lines (219 loc) • 6.52 kB
# šŸš€ Claude-Collab Quick Start Improvements ## Today's Implementation Priority ### 1. Fix Connection Issues (30 minutes) ```typescript // src/commands/utils/connection-helper.ts export async function ensureServerRunning() { try { // Check if server is running await fetch('http://localhost:8765/health'); } catch (error) { console.log('Starting Claude-Collab server...'); // Start server in background const server = spawn('node', ['src/api/server.js'], { detached: true, stdio: 'ignore' }); server.unref(); // Wait for server to be ready await waitForServer(); } } async function waitForServer(maxAttempts = 30) { for (let i = 0; i < maxAttempts; i++) { try { await fetch('http://localhost:8765/health'); return; } catch (error) { await new Promise(resolve => setTimeout(resolve, 1000)); } } throw new Error('Server failed to start'); } ``` ### 2. Better Error Messages (15 minutes) ```typescript // src/utils/error-messages.ts export const ERROR_MESSAGES = { ECONNREFUSED: { message: "Can't connect to Claude-Collab server", solution: "Run 'cc server' in another terminal or use 'cc server --daemon'", docs: "https://docs.claude-collab.ai/troubleshooting#connection" }, VERSION_MISMATCH: { message: "Version mismatch between client and server", solution: "Run 'npm update -g claude-collab' to update", docs: "https://docs.claude-collab.ai/troubleshooting#version" } }; // src/utils/error-handler.ts export function handleError(error: any) { const errorInfo = ERROR_MESSAGES[error.code] || { message: error.message, solution: "Check the docs or file an issue" }; console.error(`\nāŒ ${errorInfo.message}`); console.log(`šŸ’” ${errorInfo.solution}`); if (errorInfo.docs) { console.log(`šŸ“š ${errorInfo.docs}\n`); } } ``` ### 3. One-Command Agent Creation (20 minutes) ```typescript // src/commands/quick.ts export async function quickAgent(name: string, options: QuickAgentOptions) { // Ensure server is running await ensureServerRunning(); // Register and join in one go const agent = await registerAgent(name); await joinAsAgent(name, { role: options.role || 'general', perspective: options.perspective || 'balanced' }); // Auto-send introduction if (options.autoIntro) { await sendMessage(`Hi! I'm ${name}, a ${options.role} with ${options.perspective} perspective.`); } console.log(`āœ… ${name} is ready to collaborate!`); } // CLI: cc quick alice architect visionary --auto-intro ``` ### 4. Live Status Dashboard (45 minutes) ```typescript // src/commands/watch.ts import blessed from 'blessed'; export function watchCollaboration() { const screen = blessed.screen({ smartCSR: true }); // Create layout const agentBox = blessed.box({ label: ' Active Agents ', top: 0, left: 0, width: '30%', height: '50%', border: { type: 'line' } }); const messageBox = blessed.box({ label: ' Live Messages ', top: 0, left: '30%', width: '70%', height: '70%', border: { type: 'line' }, scrollable: true }); const metricsBox = blessed.box({ label: ' Collaboration Metrics ', top: '50%', left: 0, width: '30%', height: '50%', border: { type: 'line' } }); // Connect to WebSocket const ws = new WebSocket('ws://localhost:8765'); ws.on('message', (data) => { const event = JSON.parse(data); if (event.type === 'agent-joined') { updateAgentList(); } else if (event.type === 'message') { addMessage(event); } updateMetrics(); screen.render(); }); // Quit on Escape, q, or Control-C screen.key(['escape', 'q', 'C-c'], () => process.exit(0)); screen.render(); } ``` ### 5. Auto Conversation Starter (10 minutes) ```typescript // src/utils/conversation-starters.ts export const CONVERSATION_STARTERS = { 'web-dev': [ "What framework should we use for the frontend?", "How should we structure the API?", "What's our deployment strategy?" ], 'brainstorm': [ "What problem are we trying to solve?", "Who is our target audience?", "What makes our solution unique?" ], 'code-review': [ "What are the main concerns with this code?", "How can we improve performance?", "Are there any security issues?" ] }; // src/commands/start-discussion.ts export async function startDiscussion(topic: string, template?: string) { const starters = CONVERSATION_STARTERS[template] || [ `Let's discuss: ${topic}`, "What are your initial thoughts?", "What approach should we take?" ]; // Send starter messages with delays for (const [index, message] of starters.entries()) { setTimeout(() => { sendSystemMessage(message); }, index * 2000); } } ``` ## šŸŽÆ Immediate Impact Changes ### 1. Update Package.json Scripts ```json { "scripts": { "dev": "nodemon src/api/server.js", "quick-start": "npm run build && node scripts/quick-setup.js", "dashboard": "next dev -p 3001", "test:watch": "jest --watch" } } ``` ### 2. Add Health Check Endpoint ```typescript // src/api/server.js app.get('/health', (req, res) => { res.json({ status: 'healthy', version: package.version, agents: getActiveAgentCount(), uptime: process.uptime() }); }); ``` ### 3. Create Daemon Mode ```bash #!/usr/bin/env node // bin/cc-daemon const { spawn } = require('child_process'); const path = require('path'); const serverPath = path.join(__dirname, '../src/api/server.js'); const out = fs.openSync('./claude-collab.log', 'a'); const err = fs.openSync('./claude-collab-error.log', 'a'); const child = spawn('node', [serverPath], { detached: true, stdio: ['ignore', out, err] }); child.unref(); console.log(`Claude-Collab server started (PID: ${child.pid})`); fs.writeFileSync('./.claude-collab.pid', child.pid.toString()); ``` ## šŸ”„ Start Now! 1. **Pick one improvement** from above 2. **Implement in 30 minutes** 3. **Test with the community** 4. **Iterate based on feedback** The key is to start small and ship improvements daily. Each enhancement makes Claude-Collab more reliable and delightful to use! ## šŸ“Š Measuring Success Track these metrics after each improvement: - Connection success rate - Time to first message - User error rate - Command completion rate Remember: **Small improvements compound into massive transformations!** šŸš€