# QwenClaw Integration Skill ## Overview This skill enables **Qwen Code** to directly trigger, control, and communicate with the **QwenClaw daemon**. It provides seamless integration between your interactive Qwen Code session and the persistent QwenClaw background processes. **Version:** 1.0.0 **Category:** Integration **Author:** QwenClaw Team --- ## Features ### 1. **Daemon Control** - Start QwenClaw daemon from within Qwen Code - Check daemon status - Stop daemon gracefully - Auto-restart if daemon crashes ### 2. **Message Passing** - Send prompts to running daemon - Receive responses asynchronously - Forward responses to Telegram - Queue messages when daemon is offline ### 3. **Task Orchestration** - Delegate long-running tasks to daemon - Monitor task progress - Receive completion notifications - Handle task failures gracefully ### 4. **Shared Context** - Share session context between Qwen Code and QwenClaw - Synchronize settings and preferences - Share skill configurations - Unified logging and debugging --- ## Installation ### Prerequisites 1. **QwenClaw installed:** ```bash git clone https://github.rommark.dev/admin/QwenClaw-with-Auth.git cd QwenClaw-with-Auth bun install ``` 2. **Qwen Code installed:** ```bash # Follow Qwen Code installation guide ``` ### Setup 1. **Copy skill to Qwen Code:** ```bash # Copy this skill to Qwen Code skills directory cp -r skills/qwenclaw-integration ~/.qwen/skills/qwenclaw-integration ``` 2. **Enable in Qwen Code:** Edit `~/.qwen/settings.json`: ```json { "enabledSkills": [ "qwenclaw-integration" ] } ``` 3. **Configure paths:** Create `~/.qwen/skills/qwenclaw-integration/config.json`: ```json { "qwenclawPath": "/path/to/qwenclaw", "autoStart": true, "checkInterval": 30000, "forwardToTelegram": false } ``` --- ## Usage ### From Qwen Code Chat #### Start QwenClaw ``` Use qwenclaw-integration to start the daemon with web UI ``` #### Check Status ``` Use qwenclaw-integration to check if QwenClaw is running ``` #### Send Task ``` Use qwenclaw-integration to send this task to QwenClaw: "Monitor my GitHub notifications and summarize new issues" ``` #### Schedule Task ``` Use qwenclaw-integration to schedule a daily standup at 9 AM ``` #### Forward to Telegram ``` Use qwenclaw-integration to forward the response to Telegram ``` --- ## API Reference ### QwenClawClient Class ```typescript import { QwenClawClient } from './qwenclaw-integration'; const client = new QwenClawClient({ qwenclawPath: '/path/to/qwenclaw', autoStart: true, }); // Check if daemon is running const status = await client.getStatus(); console.log(status); // { running: true, pid: 12345, ... } // Start daemon await client.start({ web: true, webPort: 4632 }); // Send message const response = await client.send('Check my pending tasks'); console.log(response); // { success: true, output: '...' } // Stop daemon await client.stop(); ``` ### Methods #### `getStatus(): Promise` Check if QwenClaw daemon is running. **Returns:** ```typescript interface DaemonStatus { running: boolean; pid?: number; uptime?: number; webEnabled?: boolean; webPort?: number; telegramEnabled?: boolean; jobsCount?: number; } ``` #### `start(options?: StartOptions): Promise` Start QwenClaw daemon. **Options:** ```typescript interface StartOptions { web?: boolean; webPort?: number; telegram?: boolean; debug?: boolean; trigger?: boolean; prompt?: string; } ``` #### `stop(): Promise` Stop QwenClaw daemon gracefully. #### `send(message: string, options?: SendOptions): Promise` Send message to running daemon. **Options:** ```typescript interface SendOptions { telegram?: boolean; waitForResponse?: boolean; timeout?: number; } ``` **Returns:** ```typescript interface SendResult { success: boolean; output?: string; error?: string; exitCode?: number; } ``` #### `schedule(job: ScheduledJob): Promise` Schedule a new job with QwenClaw. **Job:** ```typescript interface ScheduledJob { name: string; schedule: string; // Cron expression prompt: string; recurring: boolean; notify: boolean | 'error'; } ``` #### `listJobs(): Promise` List all scheduled jobs. #### `cancelJob(name: string): Promise` Cancel a scheduled job. --- ## Examples ### Example 1: Auto-Start Daemon ```typescript import { QwenClawClient } from './qwenclaw-integration'; const client = new QwenClawClient({ autoStart: true }); // This will automatically start QwenClaw if not running const status = await client.getStatus(); console.log(`QwenClaw is ${status.running ? 'running' : 'stopped'}`); ``` ### Example 2: Delegate Long Task ```typescript const client = new QwenClawClient(); // Delegate code review to daemon const result = await client.send( 'Review all TypeScript files in src/ for potential bugs and suggest improvements', { waitForResponse: true, timeout: 300000 } ); console.log(result.output); ``` ### Example 3: Schedule Daily Report ```typescript await client.schedule({ name: 'daily-report', schedule: '0 9 * * 1-5', // Weekdays at 9 AM prompt: 'Generate a daily report of my GitHub activity, pending PRs, and tasks', recurring: true, notify: true, }); ``` ### Example 4: Forward to Telegram ```typescript const result = await client.send( 'Summarize my calendar for today', { telegram: true } ); // Response will be sent to your Telegram ``` --- ## Integration Patterns ### Pattern 1: Interactive + Background ``` ┌─────────────────┐ ┌─────────────────┐ │ Qwen Code │────────▶│ QwenClaw │ │ (Interactive) │◀────────│ (Background) │ └─────────────────┘ └─────────────────┘ │ │ ▼ ▼ User Chat Long Tasks Quick Questions Scheduled Jobs Code Review Monitoring ``` **Use Case:** Use Qwen Code for interactive work, delegate long-running tasks to QwenClaw. ### Pattern 2: Multi-Session Coordination ``` ┌─────────────────┐ │ Qwen Code │ │ Session 1 │────┐ └─────────────────┘ │ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Qwen Code │──▶│ QwenClaw │ │ Session 2 │ │ (Shared) │ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Telegram │ │ Notifications │ └─────────────────┘ ``` **Use Case:** Multiple Qwen Code sessions share a single QwenClaw daemon for consistency. ### Pattern 3: Task Pipeline ``` User Request │ ▼ ┌─────────────────┐ │ Qwen Code │──▶ Analyze & Plan └─────────────────┘ │ ▼ ┌─────────────────┐ │ QwenClaw │──▶ Execute Long Task └─────────────────┘ │ ▼ ┌─────────────────┐ │ Telegram │◀── Notify Completion └─────────────────┘ ``` **Use Case:** Complex workflows spanning multiple systems. --- ## Configuration ### config.json ```json { "qwenclawPath": "/absolute/path/to/qwenclaw", "autoStart": true, "checkInterval": 30000, "forwardToTelegram": false, "telegramBotToken": "", "telegramAllowedUserIds": [], "webDashboard": { "enabled": true, "port": 4632, "host": "127.0.0.1" }, "logging": { "level": "info", "file": "~/.qwen/qwenclaw/integration.log" } } ``` ### Environment Variables | Variable | Description | Default | |----------|-------------|---------| | `QWENCLAW_PATH` | Path to QwenClaw installation | `~/qwenclaw` | | `QWENCLAW_AUTO_START` | Auto-start daemon | `true` | | `QWENCLAW_CHECK_INTERVAL` | Status check interval (ms) | `30000` | | `QWENCLAW_TELEGRAM_TOKEN` | Telegram bot token | - | | `QWENCLAW_LOG_LEVEL` | Logging level | `info` | --- ## Troubleshooting ### Issue: "Daemon not found" **Solution:** ```bash # Verify QwenClaw installation cd /path/to/qwenclaw bun run status # Reinstall if needed bun install ``` ### Issue: "Cannot start daemon" **Solution:** ```bash # Check if port is in use lsof -i :4632 # Check logs cat ~/.qwen/qwenclaw/logs/*.log ``` ### Issue: "Messages not delivered" **Solution:** 1. Check daemon is running: `qwenclaw status` 2. Verify network connectivity 3. Check firewall settings 4. Review integration logs --- ## Best Practices ### 1. **Use for Appropriate Tasks** ✅ **Good for QwenClaw:** - Long-running analyses - Scheduled monitoring - Background notifications - Multi-step workflows ❌ **Better for Qwen Code:** - Quick questions - Interactive coding - Real-time collaboration - Exploratory work ### 2. **Manage Resources** ```typescript // Don't spawn too many daemon tasks const client = new QwenClawClient(); // Queue tasks instead of parallel execution await client.send('Task 1'); await client.send('Task 2'); // Waits for Task 1 ``` ### 3. **Handle Errors Gracefully** ```typescript try { const result = await client.send('Complex task'); if (!result.success) { console.error('Task failed:', result.error); } } catch (err) { console.error('Communication error:', err); // Fallback to direct Qwen Code execution } ``` ### 4. **Monitor Daemon Health** ```typescript setInterval(async () => { const status = await client.getStatus(); if (!status.running) { console.log('Daemon stopped, restarting...'); await client.start(); } }, 60000); // Check every minute ``` --- ## Security Considerations ### 1. **API Key Protection** Never commit API keys to version control: ```bash # Use environment variables export QWEN_API_KEY="your-key" export TELEGRAM_BOT_TOKEN="your-token" ``` ### 2. **Access Control** Limit Telegram access to trusted users: ```json { "telegramAllowedUserIds": [123456789, 987654321] } ``` ### 3. **Network Security** Bind web dashboard to localhost: ```json { "webDashboard": { "host": "127.0.0.1", "port": 4632 } } ``` --- ## Resources - **QwenClaw Repo:** https://github.rommark.dev/admin/QwenClaw-with-Auth - **Documentation:** `docs/README.md` in QwenClaw repo - **Skills:** `skills/` directory - **Issues:** https://github.rommark.dev/admin/QwenClaw-with-Auth/issues --- ## Changelog ### v1.0.0 (2026-02-26) - Initial release - Daemon control (start/stop/status) - Message passing - Task scheduling - Telegram forwarding - Shared context --- ## License MIT License - See LICENSE file for details. --- **Skill ready for Qwen Code integration!** 🐾🤖