diff --git a/README.md b/README.md index 0d563b53..53b7de23 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ Press `n` to create a new pane, type a prompt, pick one or more agents (or none dmux creates a tmux pane for each task. Every pane gets its own git worktree and branch so agents work in complete isolation. When a task is done, open the pane menu with `m` and choose Merge to bring it back into your main branch, or Create GitHub PR to push the branch and file a pull request. - **Worktree isolation** — each pane is a full working copy, no conflicts between agents -- **Agent support** — Claude Code, Codex, OpenCode, Cline CLI, Gemini CLI, Qwen CLI, Amp CLI, pi CLI, Cursor CLI, Copilot CLI, and Crush CLI +- **Agent support** — Claude Code, Codex, OpenCode, Cline CLI, Gemini CLI, Qwen CLI, Amp CLI, pi CLI, Cursor CLI, Copilot CLI, Crush CLI, and Deep Code - **Goal launches** — optionally start supported agents in goal mode from the initial prompt - **Multi-select launches** — choose any combination of enabled agents per prompt - **AI naming** — branches and commit messages generated automatically @@ -87,7 +87,7 @@ dmux can use default branch behavior or let you override branch details when cre - tmux 3.0+ - Node.js 18+ - Git 2.20+ -- At least one supported agent CLI (for example [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [Grok Build](https://docs.x.ai/build/overview), [OpenCode](https://github.com/opencode-ai/opencode), [Cline CLI](https://docs.cline.bot/cline-cli/getting-started), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Qwen CLI](https://github.com/QwenLM/qwen-code), [Amp CLI](https://ampcode.com/manual), [pi CLI](https://www.npmjs.com/package/@mariozechner/pi-coding-agent), [Cursor CLI](https://docs.cursor.com/en/cli/overview), [Copilot CLI](https://github.com/github/copilot-cli), [Crush CLI](https://github.com/charmbracelet/crush)) +- At least one supported agent CLI (for example [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex](https://github.com/openai/codex), [Grok Build](https://docs.x.ai/build/overview), [OpenCode](https://github.com/opencode-ai/opencode), [Cline CLI](https://docs.cline.bot/cline-cli/getting-started), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Qwen CLI](https://github.com/QwenLM/qwen-code), [Amp CLI](https://ampcode.com/manual), [pi CLI](https://www.npmjs.com/package/@mariozechner/pi-coding-agent), [Cursor CLI](https://docs.cursor.com/en/cli/overview), [Copilot CLI](https://github.com/github/copilot-cli), [Crush CLI](https://github.com/charmbracelet/crush), [Deep Code](https://github.com/deepcode-ai/deepcode)) - [OpenRouter API key](https://openrouter.ai/) (optional, for AI branch names and commit messages) ## Documentation diff --git a/__tests__/agentLaunch.test.ts b/__tests__/agentLaunch.test.ts index b2684636..206e3462 100644 --- a/__tests__/agentLaunch.test.ts +++ b/__tests__/agentLaunch.test.ts @@ -34,6 +34,7 @@ describe('agent launch utils', () => { expect(getAgentSlugSuffix('codex')).toBe('codex'); expect(getAgentSlugSuffix('grok')).toBe('grok-build'); expect(getAgentSlugSuffix('gemini')).toBe('gemini'); + expect(getAgentSlugSuffix('deepcode')).toBe('deepcode'); }); it('returns default-enabled registry agents', () => { @@ -186,6 +187,16 @@ describe('getPermissionFlags', () => { expect(getPermissionFlags('gemini', 'bypassPermissions')).toBe('--approval-mode yolo'); }); }); + + describe('deepcode', () => { + it('returns no flags for all modes', () => { + expect(getPermissionFlags('deepcode', '')).toBe(''); + expect(getPermissionFlags('deepcode', undefined)).toBe(''); + expect(getPermissionFlags('deepcode', 'plan')).toBe(''); + expect(getPermissionFlags('deepcode', 'acceptEdits')).toBe(''); + expect(getPermissionFlags('deepcode', 'bypassPermissions')).toBe(''); + }); + }); }); describe('command builders', () => { @@ -218,6 +229,16 @@ describe('command builders', () => { expect(getSendKeysReadyDelayMs('crush')).toBe(1200); }); + it('uses send-keys startup mode for deepcode initial prompts', () => { + expect(getPromptTransport('deepcode')).toBe('send-keys'); + expect(buildInitialPromptCommand('deepcode', '"fix it"', '')).toBe( + 'deepcode' + ); + expect(getSendKeysSubmit('deepcode')).toEqual(['Enter']); + expect(getSendKeysPostPasteDelayMs('deepcode')).toBe(200); + expect(getSendKeysReadyDelayMs('deepcode')).toBe(2000); + }); + it('uses send-keys startup mode for cline initial prompts', () => { expect(getPromptTransport('cline')).toBe('send-keys'); expect(buildInitialPromptCommand('cline', '"fix it"', 'acceptEdits')).toBe( diff --git a/docs/public/agents/deepcode.svg b/docs/public/agents/deepcode.svg new file mode 100644 index 00000000..cabdba13 --- /dev/null +++ b/docs/public/agents/deepcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/public/agents/png/deepcode.png b/docs/public/agents/png/deepcode.png new file mode 100644 index 00000000..7d53976b Binary files /dev/null and b/docs/public/agents/png/deepcode.png differ diff --git a/docs/src/content/agents.js b/docs/src/content/agents.js index 193c961e..5af0738b 100644 --- a/docs/src/content/agents.js +++ b/docs/src/content/agents.js @@ -3,7 +3,7 @@ export const meta = { title: 'Agents' }; export function render() { return `

Agents

-

dmux supports 12 AI coding agents. Each agent is automatically detected if its CLI is installed and available in your PATH.

+

dmux supports 13 AI coding agents. Each agent is automatically detected if its CLI is installed and available in your PATH.

Agent Detection

dmux automatically detects installed agents by searching:

diff --git a/docs/src/content/introduction.js b/docs/src/content/introduction.js index 9e75a9ca..7a0f0e5c 100644 --- a/docs/src/content/introduction.js +++ b/docs/src/content/introduction.js @@ -55,6 +55,10 @@ export function render() { Crush + + + Deep Code +
diff --git a/src/utils/agentLaunch.ts b/src/utils/agentLaunch.ts index f1fa0120..d94f6023 100644 --- a/src/utils/agentLaunch.ts +++ b/src/utils/agentLaunch.ts @@ -24,6 +24,7 @@ export const AGENT_IDS = [ 'cursor', 'copilot', 'crush', + 'deepcode', ] as const; export type AgentName = typeof AGENT_IDS[number]; @@ -351,6 +352,28 @@ export const AGENT_REGISTRY: Readonly> = { }, defaultEnabled: false, }, + deepcode: { + id: 'deepcode', + name: 'Deep Code', + shortLabel: 'dc', + description: 'Deep Code CLI (deepseek-v4)', + slugSuffix: 'deepcode', + installTestCommand: 'command -v deepcode 2>/dev/null || which deepcode 2>/dev/null', + commonPaths: [ + ...homePath('.local/bin/deepcode'), + '/usr/local/bin/deepcode', + '/opt/homebrew/bin/deepcode', + ...homePath('.npm-global/bin/deepcode'), + ...homePath('bin/deepcode'), + ], + promptCommand: 'deepcode', + promptTransport: 'send-keys', + sendKeysSubmit: ['Enter'], + sendKeysPostPasteDelayMs: 200, + sendKeysReadyDelayMs: 2000, + permissionFlags: {}, + defaultEnabled: false, + }, }; for (const agentId of AGENT_IDS) { diff --git a/src/utils/paneAttentionHeuristics.ts b/src/utils/paneAttentionHeuristics.ts index 7cce8c6e..cde4151c 100644 --- a/src/utils/paneAttentionHeuristics.ts +++ b/src/utils/paneAttentionHeuristics.ts @@ -237,6 +237,7 @@ export function hasAgentWorkingIndicators(content: string, agent?: AgentName): b case 'amp': case 'pi': case 'crush': + case 'deepcode': return lines.some((line) => progressWordPattern.test(line)); default: return lines.some((line) => progressWordPattern.test(line));