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.
Files changed (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +238 -0
  3. package/dist/bin/cmdr.d.ts +9 -0
  4. package/dist/bin/cmdr.d.ts.map +1 -0
  5. package/dist/bin/cmdr.js +49 -0
  6. package/dist/bin/cmdr.js.map +1 -0
  7. package/dist/src/cli/args.d.ts +19 -0
  8. package/dist/src/cli/args.d.ts.map +1 -0
  9. package/dist/src/cli/args.js +89 -0
  10. package/dist/src/cli/args.js.map +1 -0
  11. package/dist/src/cli/commands.d.ts +12 -0
  12. package/dist/src/cli/commands.d.ts.map +1 -0
  13. package/dist/src/cli/commands.js +400 -0
  14. package/dist/src/cli/commands.js.map +1 -0
  15. package/dist/src/cli/renderer.d.ts +8 -0
  16. package/dist/src/cli/renderer.d.ts.map +1 -0
  17. package/dist/src/cli/renderer.js +47 -0
  18. package/dist/src/cli/renderer.js.map +1 -0
  19. package/dist/src/cli/repl.d.ts +18 -0
  20. package/dist/src/cli/repl.d.ts.map +1 -0
  21. package/dist/src/cli/repl.js +751 -0
  22. package/dist/src/cli/repl.js.map +1 -0
  23. package/dist/src/cli/spinner.d.ts +16 -0
  24. package/dist/src/cli/spinner.d.ts.map +1 -0
  25. package/dist/src/cli/spinner.js +233 -0
  26. package/dist/src/cli/spinner.js.map +1 -0
  27. package/dist/src/cli/theme.d.ts +95 -0
  28. package/dist/src/cli/theme.d.ts.map +1 -0
  29. package/dist/src/cli/theme.js +178 -0
  30. package/dist/src/cli/theme.js.map +1 -0
  31. package/dist/src/communication/message-bus.d.ts +35 -0
  32. package/dist/src/communication/message-bus.d.ts.map +1 -0
  33. package/dist/src/communication/message-bus.js +60 -0
  34. package/dist/src/communication/message-bus.js.map +1 -0
  35. package/dist/src/communication/shared-memory.d.ts +19 -0
  36. package/dist/src/communication/shared-memory.d.ts.map +1 -0
  37. package/dist/src/communication/shared-memory.js +37 -0
  38. package/dist/src/communication/shared-memory.js.map +1 -0
  39. package/dist/src/communication/task-queue.d.ts +50 -0
  40. package/dist/src/communication/task-queue.d.ts.map +1 -0
  41. package/dist/src/communication/task-queue.js +158 -0
  42. package/dist/src/communication/task-queue.js.map +1 -0
  43. package/dist/src/config/config-loader.d.ts +23 -0
  44. package/dist/src/config/config-loader.d.ts.map +1 -0
  45. package/dist/src/config/config-loader.js +91 -0
  46. package/dist/src/config/config-loader.js.map +1 -0
  47. package/dist/src/config/defaults.d.ts +6 -0
  48. package/dist/src/config/defaults.d.ts.map +1 -0
  49. package/dist/src/config/defaults.js +21 -0
  50. package/dist/src/config/defaults.js.map +1 -0
  51. package/dist/src/config/schema.d.ts +135 -0
  52. package/dist/src/config/schema.d.ts.map +1 -0
  53. package/dist/src/config/schema.js +35 -0
  54. package/dist/src/config/schema.js.map +1 -0
  55. package/dist/src/config/telemetry.d.ts +41 -0
  56. package/dist/src/config/telemetry.d.ts.map +1 -0
  57. package/dist/src/config/telemetry.js +57 -0
  58. package/dist/src/config/telemetry.js.map +1 -0
  59. package/dist/src/core/agent-pool.d.ts +40 -0
  60. package/dist/src/core/agent-pool.d.ts.map +1 -0
  61. package/dist/src/core/agent-pool.js +66 -0
  62. package/dist/src/core/agent-pool.js.map +1 -0
  63. package/dist/src/core/agent-runner.d.ts +51 -0
  64. package/dist/src/core/agent-runner.d.ts.map +1 -0
  65. package/dist/src/core/agent-runner.js +251 -0
  66. package/dist/src/core/agent-runner.js.map +1 -0
  67. package/dist/src/core/agent.d.ts +34 -0
  68. package/dist/src/core/agent.d.ts.map +1 -0
  69. package/dist/src/core/agent.js +143 -0
  70. package/dist/src/core/agent.js.map +1 -0
  71. package/dist/src/core/intent.d.ts +33 -0
  72. package/dist/src/core/intent.d.ts.map +1 -0
  73. package/dist/src/core/intent.js +91 -0
  74. package/dist/src/core/intent.js.map +1 -0
  75. package/dist/src/core/orchestrator.d.ts +43 -0
  76. package/dist/src/core/orchestrator.d.ts.map +1 -0
  77. package/dist/src/core/orchestrator.js +115 -0
  78. package/dist/src/core/orchestrator.js.map +1 -0
  79. package/dist/src/core/permissions.d.ts +36 -0
  80. package/dist/src/core/permissions.d.ts.map +1 -0
  81. package/dist/src/core/permissions.js +129 -0
  82. package/dist/src/core/permissions.js.map +1 -0
  83. package/dist/src/core/presets.d.ts +12 -0
  84. package/dist/src/core/presets.d.ts.map +1 -0
  85. package/dist/src/core/presets.js +148 -0
  86. package/dist/src/core/presets.js.map +1 -0
  87. package/dist/src/core/team.d.ts +44 -0
  88. package/dist/src/core/team.d.ts.map +1 -0
  89. package/dist/src/core/team.js +156 -0
  90. package/dist/src/core/team.js.map +1 -0
  91. package/dist/src/core/types.d.ts +257 -0
  92. package/dist/src/core/types.d.ts.map +1 -0
  93. package/dist/src/core/types.js +7 -0
  94. package/dist/src/core/types.js.map +1 -0
  95. package/dist/src/index.d.ts +44 -0
  96. package/dist/src/index.d.ts.map +1 -0
  97. package/dist/src/index.js +45 -0
  98. package/dist/src/index.js.map +1 -0
  99. package/dist/src/llm/adapter.d.ts +5 -0
  100. package/dist/src/llm/adapter.d.ts.map +1 -0
  101. package/dist/src/llm/adapter.js +5 -0
  102. package/dist/src/llm/adapter.js.map +1 -0
  103. package/dist/src/llm/model-registry.d.ts +14 -0
  104. package/dist/src/llm/model-registry.d.ts.map +1 -0
  105. package/dist/src/llm/model-registry.js +30 -0
  106. package/dist/src/llm/model-registry.js.map +1 -0
  107. package/dist/src/llm/ollama.d.ts +26 -0
  108. package/dist/src/llm/ollama.d.ts.map +1 -0
  109. package/dist/src/llm/ollama.js +375 -0
  110. package/dist/src/llm/ollama.js.map +1 -0
  111. package/dist/src/llm/token-counter.d.ts +11 -0
  112. package/dist/src/llm/token-counter.d.ts.map +1 -0
  113. package/dist/src/llm/token-counter.js +35 -0
  114. package/dist/src/llm/token-counter.js.map +1 -0
  115. package/dist/src/plugins/mcp-client.d.ts +38 -0
  116. package/dist/src/plugins/mcp-client.d.ts.map +1 -0
  117. package/dist/src/plugins/mcp-client.js +113 -0
  118. package/dist/src/plugins/mcp-client.js.map +1 -0
  119. package/dist/src/plugins/plugin-manager.d.ts +37 -0
  120. package/dist/src/plugins/plugin-manager.d.ts.map +1 -0
  121. package/dist/src/plugins/plugin-manager.js +146 -0
  122. package/dist/src/plugins/plugin-manager.js.map +1 -0
  123. package/dist/src/scheduling/semaphore.d.ts +20 -0
  124. package/dist/src/scheduling/semaphore.d.ts.map +1 -0
  125. package/dist/src/scheduling/semaphore.js +52 -0
  126. package/dist/src/scheduling/semaphore.js.map +1 -0
  127. package/dist/src/scheduling/strategies.d.ts +39 -0
  128. package/dist/src/scheduling/strategies.d.ts.map +1 -0
  129. package/dist/src/scheduling/strategies.js +88 -0
  130. package/dist/src/scheduling/strategies.js.map +1 -0
  131. package/dist/src/session/compaction.d.ts +32 -0
  132. package/dist/src/session/compaction.d.ts.map +1 -0
  133. package/dist/src/session/compaction.js +172 -0
  134. package/dist/src/session/compaction.js.map +1 -0
  135. package/dist/src/session/cost-tracker.d.ts +41 -0
  136. package/dist/src/session/cost-tracker.d.ts.map +1 -0
  137. package/dist/src/session/cost-tracker.js +76 -0
  138. package/dist/src/session/cost-tracker.js.map +1 -0
  139. package/dist/src/session/project-context.d.ts +6 -0
  140. package/dist/src/session/project-context.d.ts.map +1 -0
  141. package/dist/src/session/project-context.js +147 -0
  142. package/dist/src/session/project-context.js.map +1 -0
  143. package/dist/src/session/prompt-builder.d.ts +11 -0
  144. package/dist/src/session/prompt-builder.d.ts.map +1 -0
  145. package/dist/src/session/prompt-builder.js +30 -0
  146. package/dist/src/session/prompt-builder.js.map +1 -0
  147. package/dist/src/session/session-manager.d.ts +32 -0
  148. package/dist/src/session/session-manager.d.ts.map +1 -0
  149. package/dist/src/session/session-manager.js +84 -0
  150. package/dist/src/session/session-manager.js.map +1 -0
  151. package/dist/src/session/session-persistence.d.ts +44 -0
  152. package/dist/src/session/session-persistence.d.ts.map +1 -0
  153. package/dist/src/session/session-persistence.js +150 -0
  154. package/dist/src/session/session-persistence.js.map +1 -0
  155. package/dist/src/session/undo-manager.d.ts +35 -0
  156. package/dist/src/session/undo-manager.d.ts.map +1 -0
  157. package/dist/src/session/undo-manager.js +79 -0
  158. package/dist/src/session/undo-manager.js.map +1 -0
  159. package/dist/src/tools/built-in/ask-user.d.ts +7 -0
  160. package/dist/src/tools/built-in/ask-user.d.ts.map +1 -0
  161. package/dist/src/tools/built-in/ask-user.js +28 -0
  162. package/dist/src/tools/built-in/ask-user.js.map +1 -0
  163. package/dist/src/tools/built-in/bash.d.ts +9 -0
  164. package/dist/src/tools/built-in/bash.d.ts.map +1 -0
  165. package/dist/src/tools/built-in/bash.js +67 -0
  166. package/dist/src/tools/built-in/bash.js.map +1 -0
  167. package/dist/src/tools/built-in/file-edit.d.ts +9 -0
  168. package/dist/src/tools/built-in/file-edit.d.ts.map +1 -0
  169. package/dist/src/tools/built-in/file-edit.js +39 -0
  170. package/dist/src/tools/built-in/file-edit.js.map +1 -0
  171. package/dist/src/tools/built-in/file-read.d.ts +9 -0
  172. package/dist/src/tools/built-in/file-read.d.ts.map +1 -0
  173. package/dist/src/tools/built-in/file-read.js +41 -0
  174. package/dist/src/tools/built-in/file-read.js.map +1 -0
  175. package/dist/src/tools/built-in/file-write.d.ts +8 -0
  176. package/dist/src/tools/built-in/file-write.d.ts.map +1 -0
  177. package/dist/src/tools/built-in/file-write.js +29 -0
  178. package/dist/src/tools/built-in/file-write.js.map +1 -0
  179. package/dist/src/tools/built-in/git-commit.d.ts +12 -0
  180. package/dist/src/tools/built-in/git-commit.d.ts.map +1 -0
  181. package/dist/src/tools/built-in/git-commit.js +96 -0
  182. package/dist/src/tools/built-in/git-commit.js.map +1 -0
  183. package/dist/src/tools/built-in/git-diff.d.ts +8 -0
  184. package/dist/src/tools/built-in/git-diff.d.ts.map +1 -0
  185. package/dist/src/tools/built-in/git-diff.js +43 -0
  186. package/dist/src/tools/built-in/git-diff.js.map +1 -0
  187. package/dist/src/tools/built-in/git-log.d.ts +8 -0
  188. package/dist/src/tools/built-in/git-log.d.ts.map +1 -0
  189. package/dist/src/tools/built-in/git-log.js +39 -0
  190. package/dist/src/tools/built-in/git-log.js.map +1 -0
  191. package/dist/src/tools/built-in/glob.d.ts +8 -0
  192. package/dist/src/tools/built-in/glob.d.ts.map +1 -0
  193. package/dist/src/tools/built-in/glob.js +60 -0
  194. package/dist/src/tools/built-in/glob.js.map +1 -0
  195. package/dist/src/tools/built-in/grep.d.ts +9 -0
  196. package/dist/src/tools/built-in/grep.d.ts.map +1 -0
  197. package/dist/src/tools/built-in/grep.js +115 -0
  198. package/dist/src/tools/built-in/grep.js.map +1 -0
  199. package/dist/src/tools/built-in/index.d.ts +21 -0
  200. package/dist/src/tools/built-in/index.d.ts.map +1 -0
  201. package/dist/src/tools/built-in/index.js +30 -0
  202. package/dist/src/tools/built-in/index.js.map +1 -0
  203. package/dist/src/tools/built-in/think.d.ts +7 -0
  204. package/dist/src/tools/built-in/think.d.ts.map +1 -0
  205. package/dist/src/tools/built-in/think.js +18 -0
  206. package/dist/src/tools/built-in/think.js.map +1 -0
  207. package/dist/src/tools/built-in/web-fetch.d.ts +11 -0
  208. package/dist/src/tools/built-in/web-fetch.d.ts.map +1 -0
  209. package/dist/src/tools/built-in/web-fetch.js +70 -0
  210. package/dist/src/tools/built-in/web-fetch.js.map +1 -0
  211. package/dist/src/tools/executor.d.ts +25 -0
  212. package/dist/src/tools/executor.d.ts.map +1 -0
  213. package/dist/src/tools/executor.js +61 -0
  214. package/dist/src/tools/executor.js.map +1 -0
  215. package/dist/src/tools/registry.d.ts +25 -0
  216. package/dist/src/tools/registry.d.ts.map +1 -0
  217. package/dist/src/tools/registry.js +135 -0
  218. package/dist/src/tools/registry.js.map +1 -0
  219. 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
+ [![CI](https://github.com/reyyanxahmed/cmdr/actions/workflows/ci.yml/badge.svg)](https://github.com/reyyanxahmed/cmdr/actions/workflows/ci.yml)
4
+ [![npm](https://img.shields.io/npm/v/cmdr-agent)](https://www.npmjs.com/package/cmdr-agent)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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,9 @@
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
+ export {};
9
+ //# sourceMappingURL=cmdr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmdr.d.ts","sourceRoot":"","sources":["../../bin/cmdr.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -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"}