cmdr-agent 1.0.0
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/LICENSE +21 -0
- package/README.md +238 -0
- package/dist/bin/cmdr.d.ts +9 -0
- package/dist/bin/cmdr.d.ts.map +1 -0
- package/dist/bin/cmdr.js +49 -0
- package/dist/bin/cmdr.js.map +1 -0
- package/dist/src/cli/args.d.ts +19 -0
- package/dist/src/cli/args.d.ts.map +1 -0
- package/dist/src/cli/args.js +89 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/cli/commands.d.ts +12 -0
- package/dist/src/cli/commands.d.ts.map +1 -0
- package/dist/src/cli/commands.js +400 -0
- package/dist/src/cli/commands.js.map +1 -0
- package/dist/src/cli/renderer.d.ts +8 -0
- package/dist/src/cli/renderer.d.ts.map +1 -0
- package/dist/src/cli/renderer.js +47 -0
- package/dist/src/cli/renderer.js.map +1 -0
- package/dist/src/cli/repl.d.ts +18 -0
- package/dist/src/cli/repl.d.ts.map +1 -0
- package/dist/src/cli/repl.js +751 -0
- package/dist/src/cli/repl.js.map +1 -0
- package/dist/src/cli/spinner.d.ts +16 -0
- package/dist/src/cli/spinner.d.ts.map +1 -0
- package/dist/src/cli/spinner.js +233 -0
- package/dist/src/cli/spinner.js.map +1 -0
- package/dist/src/cli/theme.d.ts +95 -0
- package/dist/src/cli/theme.d.ts.map +1 -0
- package/dist/src/cli/theme.js +178 -0
- package/dist/src/cli/theme.js.map +1 -0
- package/dist/src/communication/message-bus.d.ts +35 -0
- package/dist/src/communication/message-bus.d.ts.map +1 -0
- package/dist/src/communication/message-bus.js +60 -0
- package/dist/src/communication/message-bus.js.map +1 -0
- package/dist/src/communication/shared-memory.d.ts +19 -0
- package/dist/src/communication/shared-memory.d.ts.map +1 -0
- package/dist/src/communication/shared-memory.js +37 -0
- package/dist/src/communication/shared-memory.js.map +1 -0
- package/dist/src/communication/task-queue.d.ts +50 -0
- package/dist/src/communication/task-queue.d.ts.map +1 -0
- package/dist/src/communication/task-queue.js +158 -0
- package/dist/src/communication/task-queue.js.map +1 -0
- package/dist/src/config/config-loader.d.ts +23 -0
- package/dist/src/config/config-loader.d.ts.map +1 -0
- package/dist/src/config/config-loader.js +91 -0
- package/dist/src/config/config-loader.js.map +1 -0
- package/dist/src/config/defaults.d.ts +6 -0
- package/dist/src/config/defaults.d.ts.map +1 -0
- package/dist/src/config/defaults.js +21 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/config/schema.d.ts +135 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +35 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/config/telemetry.d.ts +41 -0
- package/dist/src/config/telemetry.d.ts.map +1 -0
- package/dist/src/config/telemetry.js +57 -0
- package/dist/src/config/telemetry.js.map +1 -0
- package/dist/src/core/agent-pool.d.ts +40 -0
- package/dist/src/core/agent-pool.d.ts.map +1 -0
- package/dist/src/core/agent-pool.js +66 -0
- package/dist/src/core/agent-pool.js.map +1 -0
- package/dist/src/core/agent-runner.d.ts +51 -0
- package/dist/src/core/agent-runner.d.ts.map +1 -0
- package/dist/src/core/agent-runner.js +251 -0
- package/dist/src/core/agent-runner.js.map +1 -0
- package/dist/src/core/agent.d.ts +34 -0
- package/dist/src/core/agent.d.ts.map +1 -0
- package/dist/src/core/agent.js +143 -0
- package/dist/src/core/agent.js.map +1 -0
- package/dist/src/core/intent.d.ts +33 -0
- package/dist/src/core/intent.d.ts.map +1 -0
- package/dist/src/core/intent.js +91 -0
- package/dist/src/core/intent.js.map +1 -0
- package/dist/src/core/orchestrator.d.ts +43 -0
- package/dist/src/core/orchestrator.d.ts.map +1 -0
- package/dist/src/core/orchestrator.js +115 -0
- package/dist/src/core/orchestrator.js.map +1 -0
- package/dist/src/core/permissions.d.ts +36 -0
- package/dist/src/core/permissions.d.ts.map +1 -0
- package/dist/src/core/permissions.js +129 -0
- package/dist/src/core/permissions.js.map +1 -0
- package/dist/src/core/presets.d.ts +12 -0
- package/dist/src/core/presets.d.ts.map +1 -0
- package/dist/src/core/presets.js +148 -0
- package/dist/src/core/presets.js.map +1 -0
- package/dist/src/core/team.d.ts +44 -0
- package/dist/src/core/team.d.ts.map +1 -0
- package/dist/src/core/team.js +156 -0
- package/dist/src/core/team.js.map +1 -0
- package/dist/src/core/types.d.ts +257 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +7 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/index.d.ts +44 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/llm/adapter.d.ts +5 -0
- package/dist/src/llm/adapter.d.ts.map +1 -0
- package/dist/src/llm/adapter.js +5 -0
- package/dist/src/llm/adapter.js.map +1 -0
- package/dist/src/llm/model-registry.d.ts +14 -0
- package/dist/src/llm/model-registry.d.ts.map +1 -0
- package/dist/src/llm/model-registry.js +30 -0
- package/dist/src/llm/model-registry.js.map +1 -0
- package/dist/src/llm/ollama.d.ts +26 -0
- package/dist/src/llm/ollama.d.ts.map +1 -0
- package/dist/src/llm/ollama.js +375 -0
- package/dist/src/llm/ollama.js.map +1 -0
- package/dist/src/llm/token-counter.d.ts +11 -0
- package/dist/src/llm/token-counter.d.ts.map +1 -0
- package/dist/src/llm/token-counter.js +35 -0
- package/dist/src/llm/token-counter.js.map +1 -0
- package/dist/src/plugins/mcp-client.d.ts +38 -0
- package/dist/src/plugins/mcp-client.d.ts.map +1 -0
- package/dist/src/plugins/mcp-client.js +113 -0
- package/dist/src/plugins/mcp-client.js.map +1 -0
- package/dist/src/plugins/plugin-manager.d.ts +37 -0
- package/dist/src/plugins/plugin-manager.d.ts.map +1 -0
- package/dist/src/plugins/plugin-manager.js +146 -0
- package/dist/src/plugins/plugin-manager.js.map +1 -0
- package/dist/src/scheduling/semaphore.d.ts +20 -0
- package/dist/src/scheduling/semaphore.d.ts.map +1 -0
- package/dist/src/scheduling/semaphore.js +52 -0
- package/dist/src/scheduling/semaphore.js.map +1 -0
- package/dist/src/scheduling/strategies.d.ts +39 -0
- package/dist/src/scheduling/strategies.d.ts.map +1 -0
- package/dist/src/scheduling/strategies.js +88 -0
- package/dist/src/scheduling/strategies.js.map +1 -0
- package/dist/src/session/compaction.d.ts +32 -0
- package/dist/src/session/compaction.d.ts.map +1 -0
- package/dist/src/session/compaction.js +172 -0
- package/dist/src/session/compaction.js.map +1 -0
- package/dist/src/session/cost-tracker.d.ts +41 -0
- package/dist/src/session/cost-tracker.d.ts.map +1 -0
- package/dist/src/session/cost-tracker.js +76 -0
- package/dist/src/session/cost-tracker.js.map +1 -0
- package/dist/src/session/project-context.d.ts +6 -0
- package/dist/src/session/project-context.d.ts.map +1 -0
- package/dist/src/session/project-context.js +147 -0
- package/dist/src/session/project-context.js.map +1 -0
- package/dist/src/session/prompt-builder.d.ts +11 -0
- package/dist/src/session/prompt-builder.d.ts.map +1 -0
- package/dist/src/session/prompt-builder.js +30 -0
- package/dist/src/session/prompt-builder.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +32 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +84 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/session-persistence.d.ts +44 -0
- package/dist/src/session/session-persistence.d.ts.map +1 -0
- package/dist/src/session/session-persistence.js +150 -0
- package/dist/src/session/session-persistence.js.map +1 -0
- package/dist/src/session/undo-manager.d.ts +35 -0
- package/dist/src/session/undo-manager.d.ts.map +1 -0
- package/dist/src/session/undo-manager.js +79 -0
- package/dist/src/session/undo-manager.js.map +1 -0
- package/dist/src/tools/built-in/ask-user.d.ts +7 -0
- package/dist/src/tools/built-in/ask-user.d.ts.map +1 -0
- package/dist/src/tools/built-in/ask-user.js +28 -0
- package/dist/src/tools/built-in/ask-user.js.map +1 -0
- package/dist/src/tools/built-in/bash.d.ts +9 -0
- package/dist/src/tools/built-in/bash.d.ts.map +1 -0
- package/dist/src/tools/built-in/bash.js +67 -0
- package/dist/src/tools/built-in/bash.js.map +1 -0
- package/dist/src/tools/built-in/file-edit.d.ts +9 -0
- package/dist/src/tools/built-in/file-edit.d.ts.map +1 -0
- package/dist/src/tools/built-in/file-edit.js +39 -0
- package/dist/src/tools/built-in/file-edit.js.map +1 -0
- package/dist/src/tools/built-in/file-read.d.ts +9 -0
- package/dist/src/tools/built-in/file-read.d.ts.map +1 -0
- package/dist/src/tools/built-in/file-read.js +41 -0
- package/dist/src/tools/built-in/file-read.js.map +1 -0
- package/dist/src/tools/built-in/file-write.d.ts +8 -0
- package/dist/src/tools/built-in/file-write.d.ts.map +1 -0
- package/dist/src/tools/built-in/file-write.js +29 -0
- package/dist/src/tools/built-in/file-write.js.map +1 -0
- package/dist/src/tools/built-in/git-commit.d.ts +12 -0
- package/dist/src/tools/built-in/git-commit.d.ts.map +1 -0
- package/dist/src/tools/built-in/git-commit.js +96 -0
- package/dist/src/tools/built-in/git-commit.js.map +1 -0
- package/dist/src/tools/built-in/git-diff.d.ts +8 -0
- package/dist/src/tools/built-in/git-diff.d.ts.map +1 -0
- package/dist/src/tools/built-in/git-diff.js +43 -0
- package/dist/src/tools/built-in/git-diff.js.map +1 -0
- package/dist/src/tools/built-in/git-log.d.ts +8 -0
- package/dist/src/tools/built-in/git-log.d.ts.map +1 -0
- package/dist/src/tools/built-in/git-log.js +39 -0
- package/dist/src/tools/built-in/git-log.js.map +1 -0
- package/dist/src/tools/built-in/glob.d.ts +8 -0
- package/dist/src/tools/built-in/glob.d.ts.map +1 -0
- package/dist/src/tools/built-in/glob.js +60 -0
- package/dist/src/tools/built-in/glob.js.map +1 -0
- package/dist/src/tools/built-in/grep.d.ts +9 -0
- package/dist/src/tools/built-in/grep.d.ts.map +1 -0
- package/dist/src/tools/built-in/grep.js +115 -0
- package/dist/src/tools/built-in/grep.js.map +1 -0
- package/dist/src/tools/built-in/index.d.ts +21 -0
- package/dist/src/tools/built-in/index.d.ts.map +1 -0
- package/dist/src/tools/built-in/index.js +30 -0
- package/dist/src/tools/built-in/index.js.map +1 -0
- package/dist/src/tools/built-in/think.d.ts +7 -0
- package/dist/src/tools/built-in/think.d.ts.map +1 -0
- package/dist/src/tools/built-in/think.js +18 -0
- package/dist/src/tools/built-in/think.js.map +1 -0
- package/dist/src/tools/built-in/web-fetch.d.ts +11 -0
- package/dist/src/tools/built-in/web-fetch.d.ts.map +1 -0
- package/dist/src/tools/built-in/web-fetch.js +70 -0
- package/dist/src/tools/built-in/web-fetch.js.map +1 -0
- package/dist/src/tools/executor.d.ts +25 -0
- package/dist/src/tools/executor.d.ts.map +1 -0
- package/dist/src/tools/executor.js +61 -0
- package/dist/src/tools/executor.js.map +1 -0
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +135 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/package.json +63 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Reyyan Ahmed
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# cmdr
|
|
2
|
+
|
|
3
|
+
[](https://github.com/reyyanxahmed/cmdr/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/cmdr-agent)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
> Open-source, Ollama-native, multi-agent coding tool for your terminal.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
██████╗███╗ ███╗██████╗ ██████╗
|
|
11
|
+
██╔════╝████╗ ████║██╔══██╗██╔══██╗
|
|
12
|
+
██║ ██╔████╔██║██║ ██║██████╔╝
|
|
13
|
+
██║ ██║╚██╔╝██║██║ ██║██╔══██╗
|
|
14
|
+
╚██████╗██║ ╚═╝ ██║██████╔╝██║ ██║
|
|
15
|
+
╚═════╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**cmdr** is a local-first AI coding assistant that runs entirely on your machine using [Ollama](https://ollama.ai). No API keys, no cloud, no data leaves your laptop.
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- **Local-first** — powered by Ollama, all inference runs on your hardware
|
|
23
|
+
- **Multi-agent architecture** — extensible agent/runner pipeline with tool calling
|
|
24
|
+
- **Interactive REPL** — streaming output, markdown rendering, AMOLED-friendly theme
|
|
25
|
+
- **Built-in tools** — file read/write/edit, glob, grep, bash, git diff/log/commit/branch, web fetch, think
|
|
26
|
+
- **HITL permissions** — approve, deny, or always-allow each tool call
|
|
27
|
+
- **Context compaction** — multi-stage strategy keeps conversations within context limits
|
|
28
|
+
- **Session persistence** — auto-save, resume, and `--continue` flag
|
|
29
|
+
- **Token cost tracking** — `/cost` command shows per-session usage breakdown
|
|
30
|
+
- **Undo** — `/undo` reverts file changes made by the agent
|
|
31
|
+
- **Multi-agent teams** — built-in presets: code review, full-stack, security audit
|
|
32
|
+
- **Plugin system** — load custom plugins from npm modules or local paths
|
|
33
|
+
- **MCP client** — connect to Model Context Protocol servers for extended tools
|
|
34
|
+
- **Project awareness** — auto-detects language, framework, and reads `CMDR.md` instructions
|
|
35
|
+
- **Whimsical UX** — 150+ spinner verbs, past-tense summaries, collapsed tool output
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Install Ollama (https://ollama.ai)
|
|
41
|
+
ollama pull qwen3-coder:latest
|
|
42
|
+
|
|
43
|
+
# Install cmdr
|
|
44
|
+
npm install -g cmdr-agent
|
|
45
|
+
|
|
46
|
+
# Start coding
|
|
47
|
+
cmdr
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Usage
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cmdr # Interactive REPL
|
|
54
|
+
cmdr "fix the failing tests" # Single prompt, then exit
|
|
55
|
+
cmdr -m llama3.1:8b # Use a specific model
|
|
56
|
+
cmdr -c # Continue most recent session
|
|
57
|
+
cmdr --resume <session-id> # Resume a specific session
|
|
58
|
+
cmdr --team review # Multi-agent code review team
|
|
59
|
+
cmdr --cwd /path/to/project # Override working directory
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### CLI Flags
|
|
63
|
+
|
|
64
|
+
| Flag | Description |
|
|
65
|
+
|------|-------------|
|
|
66
|
+
| `-m, --model <name>` | Set the Ollama model |
|
|
67
|
+
| `-u, --ollama-url <url>` | Ollama server URL |
|
|
68
|
+
| `-p, --prompt <text>` | Run a single prompt and exit |
|
|
69
|
+
| `-r, --resume <id>` | Resume a previous session |
|
|
70
|
+
| `-c, --continue` | Resume most recent session for this directory |
|
|
71
|
+
| `-t, --team <preset>` | Run with a multi-agent team (review, fullstack, security) |
|
|
72
|
+
| `--cwd <path>` | Set working directory |
|
|
73
|
+
| `--verbose` | Print full tool output |
|
|
74
|
+
| `--dangerously-skip-permissions` | Auto-approve all tool calls |
|
|
75
|
+
| `-h, --help` | Show help |
|
|
76
|
+
| `-v, --version` | Show version |
|
|
77
|
+
|
|
78
|
+
### Slash Commands
|
|
79
|
+
|
|
80
|
+
| Command | Description |
|
|
81
|
+
|---------|-------------|
|
|
82
|
+
| `/help` | Show available commands |
|
|
83
|
+
| `/model <name>` | Switch model |
|
|
84
|
+
| `/models` | List available Ollama models |
|
|
85
|
+
| `/status` | Show session info |
|
|
86
|
+
| `/context` | Show context window usage |
|
|
87
|
+
| `/compact` | Manually trigger compaction |
|
|
88
|
+
| `/cost` | Show token usage breakdown |
|
|
89
|
+
| `/undo` | Revert the last file change made by the agent |
|
|
90
|
+
| `/diff` | Show git diff |
|
|
91
|
+
| `/team [preset]` | Switch to a multi-agent team |
|
|
92
|
+
| `/agents` | Show active agents and status |
|
|
93
|
+
| `/tasks` | Show task queue status |
|
|
94
|
+
| `/config` | View configuration |
|
|
95
|
+
| `/plugin list` | List loaded plugins |
|
|
96
|
+
| `/mcp list` | List MCP server connections |
|
|
97
|
+
| `/session save` | Save current session |
|
|
98
|
+
| `/session resume <id>` | Resume a session |
|
|
99
|
+
| `/sessions` | List saved sessions |
|
|
100
|
+
| `/permissions [mode]` | View/set permission mode |
|
|
101
|
+
| `/init` | Create CMDR.md template |
|
|
102
|
+
| `/clear` | Clear conversation |
|
|
103
|
+
| `/quit` | Exit |
|
|
104
|
+
|
|
105
|
+
### Built-in Tools
|
|
106
|
+
|
|
107
|
+
| Tool | Description |
|
|
108
|
+
|------|-------------|
|
|
109
|
+
| `bash` | Execute shell commands with timeout and error handling |
|
|
110
|
+
| `file_read` | Read file contents with offset/limit support |
|
|
111
|
+
| `file_write` | Create or overwrite files (auto-creates directories) |
|
|
112
|
+
| `file_edit` | Surgical string replacement in files |
|
|
113
|
+
| `grep` | Regex search (uses ripgrep when available) |
|
|
114
|
+
| `glob` | Find files by pattern |
|
|
115
|
+
| `git_diff` | Show working tree or staged changes |
|
|
116
|
+
| `git_log` | Recent commit history |
|
|
117
|
+
| `git_commit` | Stage and commit files |
|
|
118
|
+
| `git_branch` | Create, switch, or list branches |
|
|
119
|
+
| `web_fetch` | Fetch a URL (SSRF-protected) |
|
|
120
|
+
| `ask_user` | Ask the user a question |
|
|
121
|
+
| `think` | Extended reasoning scratchpad (no side effects) |
|
|
122
|
+
|
|
123
|
+
## Multi-Agent Teams
|
|
124
|
+
|
|
125
|
+
cmdr supports multi-agent collaboration with built-in presets:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
cmdr --team review # Coder + Reviewer
|
|
129
|
+
cmdr --team fullstack # Planner + Frontend + Backend + Reviewer
|
|
130
|
+
cmdr --team security # Security Scanner + Reviewer
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Or switch teams mid-session with `/team review`.
|
|
134
|
+
|
|
135
|
+
Each agent has its own system prompt, tool access, and optional model. Results flow through shared memory so downstream agents see what upstream agents produced.
|
|
136
|
+
|
|
137
|
+
## Plugins & MCP
|
|
138
|
+
|
|
139
|
+
Load plugins from npm modules or local paths in `~/.cmdr/config.toml`:
|
|
140
|
+
|
|
141
|
+
```toml
|
|
142
|
+
plugins = ["cmdr-plugin-prettier", "./my-local-plugin.js"]
|
|
143
|
+
|
|
144
|
+
[[mcp.servers]]
|
|
145
|
+
name = "my-tools"
|
|
146
|
+
url = "http://localhost:8080"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Plugins can provide tools, slash commands, and lifecycle hooks (beforePrompt, afterResponse, onError, etc.).
|
|
150
|
+
|
|
151
|
+
MCP servers are discovered via the `/tools` endpoint and their tools are registered with a `mcp_` prefix.
|
|
152
|
+
|
|
153
|
+
## CMDR.md
|
|
154
|
+
|
|
155
|
+
Create a `CMDR.md` file in your project root to give cmdr project-specific instructions:
|
|
156
|
+
|
|
157
|
+
```markdown
|
|
158
|
+
# CMDR Instructions
|
|
159
|
+
|
|
160
|
+
## Project Overview
|
|
161
|
+
A TypeScript web app using Next.js and Prisma.
|
|
162
|
+
|
|
163
|
+
## Code Style
|
|
164
|
+
- Use bun instead of npm
|
|
165
|
+
- Prefer functional components with hooks
|
|
166
|
+
- Always add JSDoc comments
|
|
167
|
+
|
|
168
|
+
## Testing
|
|
169
|
+
Run `vitest` after every change.
|
|
170
|
+
|
|
171
|
+
## Rules
|
|
172
|
+
- Never modify files in /core without asking
|
|
173
|
+
- Always run linting before committing
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
You can also use `.cmdr/instructions.md` — both files are loaded and concatenated.
|
|
177
|
+
|
|
178
|
+
## Permission Modes
|
|
179
|
+
|
|
180
|
+
- **normal** (default) — read-only tools auto-approved, write/bash require confirmation
|
|
181
|
+
- **yolo** — all tools auto-approved (use `--dangerously-skip-permissions`)
|
|
182
|
+
- **strict** — all tools require approval (`/permissions strict`)
|
|
183
|
+
|
|
184
|
+
## Configuration
|
|
185
|
+
|
|
186
|
+
cmdr reads config from `~/.cmdr/config.toml` (user) and `.cmdr.toml` (project):
|
|
187
|
+
|
|
188
|
+
```toml
|
|
189
|
+
defaultModel = "qwen3-coder:latest"
|
|
190
|
+
ollamaUrl = "http://localhost:11434"
|
|
191
|
+
|
|
192
|
+
[spinner]
|
|
193
|
+
speed = 150
|
|
194
|
+
|
|
195
|
+
[telemetry]
|
|
196
|
+
enabled = false # opt-in local-only usage stats
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Environment Variables
|
|
200
|
+
|
|
201
|
+
| Variable | Default | Description |
|
|
202
|
+
|----------|---------|-------------|
|
|
203
|
+
| `CMDR_MODEL` | `qwen2.5-coder:14b` | Default model |
|
|
204
|
+
| `CMDR_OLLAMA_URL` | `http://localhost:11434` | Ollama server URL |
|
|
205
|
+
|
|
206
|
+
## Architecture
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
bin/cmdr.ts CLI entry point
|
|
210
|
+
src/
|
|
211
|
+
cli/ REPL, commands, args, spinner, theme, renderer
|
|
212
|
+
core/ Agent, AgentRunner, Orchestrator, Team, presets, permissions
|
|
213
|
+
communication/ MessageBus, SharedMemory, TaskQueue
|
|
214
|
+
scheduling/ Semaphore, agent selection strategies
|
|
215
|
+
config/ Config loader, schema, telemetry
|
|
216
|
+
llm/ OllamaAdapter, model registry, token counter
|
|
217
|
+
plugins/ PluginManager, McpClient
|
|
218
|
+
session/ SessionManager, compaction, persistence, cost tracker, undo
|
|
219
|
+
tools/ ToolRegistry, ToolExecutor, built-in tools
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Development
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
git clone https://github.com/reyyanxahmed/cmdr.git
|
|
226
|
+
cd cmdr
|
|
227
|
+
npm install
|
|
228
|
+
npm run build
|
|
229
|
+
node dist/bin/cmdr.js -m qwen3-coder:latest
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Contributing
|
|
233
|
+
|
|
234
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
[MIT](LICENSE) — Reyyan Ahmed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmdr.d.ts","sourceRoot":"","sources":["../../bin/cmdr.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/dist/bin/cmdr.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* cmdr — CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Open-source multi-agent coding tool for your terminal.
|
|
6
|
+
* Powered by local LLMs via Ollama.
|
|
7
|
+
*/
|
|
8
|
+
import { parseArgs, printHelp } from '../src/cli/args.js';
|
|
9
|
+
import { startRepl } from '../src/cli/repl.js';
|
|
10
|
+
import { GREEN, PURPLE, renderError } from '../src/cli/theme.js';
|
|
11
|
+
const VERSION = '0.1.0';
|
|
12
|
+
async function main() {
|
|
13
|
+
const args = parseArgs(process.argv.slice(2));
|
|
14
|
+
if (args.help) {
|
|
15
|
+
printHelp();
|
|
16
|
+
process.exit(0);
|
|
17
|
+
}
|
|
18
|
+
if (args.version) {
|
|
19
|
+
console.log(`${PURPLE.bold('cmdr')} ${GREEN(`v${VERSION}`)}`);
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
const model = args.model ?? process.env.CMDR_MODEL ?? 'qwen2.5-coder:14b';
|
|
23
|
+
const ollamaUrl = args.ollamaUrl ?? process.env.CMDR_OLLAMA_URL ?? 'http://localhost:11434';
|
|
24
|
+
// Override working directory if --cwd is specified
|
|
25
|
+
if (args.cwd) {
|
|
26
|
+
const { resolve } = await import('path');
|
|
27
|
+
const target = resolve(args.cwd);
|
|
28
|
+
process.chdir(target);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
await startRepl({
|
|
32
|
+
model,
|
|
33
|
+
ollamaUrl,
|
|
34
|
+
initialPrompt: args.prompt,
|
|
35
|
+
dangerouslySkipPermissions: args.dangerouslySkipPermissions,
|
|
36
|
+
resume: args.resume,
|
|
37
|
+
continue: args.continue,
|
|
38
|
+
verbose: args.verbose,
|
|
39
|
+
team: args.team,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
44
|
+
console.error(renderError(msg));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
main();
|
|
49
|
+
//# sourceMappingURL=cmdr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmdr.js","sourceRoot":"","sources":["../../bin/cmdr.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAO,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAErE,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAE7C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,SAAS,EAAE,CAAA;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,mBAAmB,CAAA;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAA;IAE3F,mDAAmD;IACnD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAChC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC;YACd,KAAK;YACL,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,MAAM;YAC1B,0BAA0B,EAAE,IAAI,CAAC,0BAA0B;YAC3D,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI argument parsing.
|
|
3
|
+
*/
|
|
4
|
+
export interface CliArgs {
|
|
5
|
+
model?: string;
|
|
6
|
+
ollamaUrl?: string;
|
|
7
|
+
help?: boolean;
|
|
8
|
+
version?: boolean;
|
|
9
|
+
prompt?: string;
|
|
10
|
+
dangerouslySkipPermissions?: boolean;
|
|
11
|
+
resume?: string;
|
|
12
|
+
continue?: boolean;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
team?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseArgs(argv: string[]): CliArgs;
|
|
18
|
+
export declare function printHelp(): void;
|
|
19
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA8DjD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAyBhC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI argument parsing.
|
|
3
|
+
*/
|
|
4
|
+
export function parseArgs(argv) {
|
|
5
|
+
const args = {};
|
|
6
|
+
let i = 0;
|
|
7
|
+
while (i < argv.length) {
|
|
8
|
+
const arg = argv[i];
|
|
9
|
+
switch (arg) {
|
|
10
|
+
case '--model':
|
|
11
|
+
case '-m':
|
|
12
|
+
args.model = argv[++i];
|
|
13
|
+
break;
|
|
14
|
+
case '--ollama-url':
|
|
15
|
+
case '-u':
|
|
16
|
+
args.ollamaUrl = argv[++i];
|
|
17
|
+
break;
|
|
18
|
+
case '--help':
|
|
19
|
+
case '-h':
|
|
20
|
+
args.help = true;
|
|
21
|
+
break;
|
|
22
|
+
case '--version':
|
|
23
|
+
case '-v':
|
|
24
|
+
args.version = true;
|
|
25
|
+
break;
|
|
26
|
+
case '--prompt':
|
|
27
|
+
case '-p':
|
|
28
|
+
args.prompt = argv[++i];
|
|
29
|
+
break;
|
|
30
|
+
case '--dangerously-skip-permissions':
|
|
31
|
+
args.dangerouslySkipPermissions = true;
|
|
32
|
+
break;
|
|
33
|
+
case '--resume':
|
|
34
|
+
case '-r':
|
|
35
|
+
args.resume = argv[++i];
|
|
36
|
+
break;
|
|
37
|
+
case '--continue':
|
|
38
|
+
case '-c':
|
|
39
|
+
args.continue = true;
|
|
40
|
+
break;
|
|
41
|
+
case '--cwd':
|
|
42
|
+
args.cwd = argv[++i];
|
|
43
|
+
break;
|
|
44
|
+
case '--verbose':
|
|
45
|
+
args.verbose = true;
|
|
46
|
+
break;
|
|
47
|
+
case '--team':
|
|
48
|
+
case '-t':
|
|
49
|
+
args.team = argv[++i];
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
// If no flag prefix, treat as inline prompt
|
|
53
|
+
if (!arg.startsWith('-') && !args.prompt) {
|
|
54
|
+
args.prompt = argv.slice(i).join(' ');
|
|
55
|
+
i = argv.length;
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
return args;
|
|
62
|
+
}
|
|
63
|
+
export function printHelp() {
|
|
64
|
+
console.log(`
|
|
65
|
+
cmdr — local-first multi-agent coding tool
|
|
66
|
+
|
|
67
|
+
Usage:
|
|
68
|
+
cmdr [options] [prompt]
|
|
69
|
+
|
|
70
|
+
Options:
|
|
71
|
+
-m, --model <name> Set the Ollama model (default: qwen2.5-coder:14b)
|
|
72
|
+
-u, --ollama-url <url> Ollama server URL (default: http://localhost:11434)
|
|
73
|
+
-p, --prompt <text> Run a single prompt and exit
|
|
74
|
+
-r, --resume <id> Resume a previous session
|
|
75
|
+
-c, --continue Resume most recent session for this directory
|
|
76
|
+
-t, --team <preset> Run in team mode (review, fullstack, security)
|
|
77
|
+
--cwd <path> Set working directory
|
|
78
|
+
--verbose Print full tool output (default: collapsed)
|
|
79
|
+
-h, --help Show this help
|
|
80
|
+
-v, --version Show version
|
|
81
|
+
--dangerously-skip-permissions Auto-approve all tool calls (yolo mode)
|
|
82
|
+
|
|
83
|
+
Examples:
|
|
84
|
+
cmdr Start interactive REPL
|
|
85
|
+
cmdr "fix the failing tests" Run a single prompt
|
|
86
|
+
cmdr -m llama3.1:8b Start with a specific model
|
|
87
|
+
`);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAY,EAAE,CAAA;IACxB,IAAI,CAAC,GAAG,CAAC,CAAA;IAET,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEnB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,SAAS,CAAC;YACf,KAAK,IAAI;gBACP,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACtB,MAAK;YACP,KAAK,cAAc,CAAC;YACpB,KAAK,IAAI;gBACP,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1B,MAAK;YACP,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;gBAChB,MAAK;YACP,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI;gBACP,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnB,MAAK;YACP,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACvB,MAAK;YACP,KAAK,gCAAgC;gBACnC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAA;gBACtC,MAAK;YACP,KAAK,UAAU,CAAC;YAChB,KAAK,IAAI;gBACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACvB,MAAK;YACP,KAAK,YAAY,CAAC;YAClB,KAAK,IAAI;gBACP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACpB,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpB,MAAK;YACP,KAAK,WAAW;gBACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;gBACnB,MAAK;YACP,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACrB,MAAK;YACP;gBACE,4CAA4C;gBAC5C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACrC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;gBACjB,CAAC;gBACD,MAAK;QACT,CAAC;QAED,CAAC,EAAE,CAAA;IACL,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slash command registry and handlers.
|
|
3
|
+
*/
|
|
4
|
+
import type { SlashCommand } from '../core/types.js';
|
|
5
|
+
export declare function getCommand(name: string): SlashCommand | undefined;
|
|
6
|
+
export declare function getAllCommands(): SlashCommand[];
|
|
7
|
+
export declare function isSlashCommand(input: string): boolean;
|
|
8
|
+
export declare function parseSlashCommand(input: string): {
|
|
9
|
+
name: string;
|
|
10
|
+
args: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA8C,MAAM,kBAAkB,CAAA;AAkBhG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEjE;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAE/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAU/E"}
|