Skip to content

maruakshay/miii-cli

Repository files navigation

miii

Cursor / Claude Code, but local.
An offline AI pair-programmer in your terminal, powered by Ollama.
Private by default. Free forever.

npm version license node version powered by Ollama

miii demo


What is this?

miii lives in your terminal and codes alongside you — reading files, writing features, running tests, fixing bugs. The twist: it runs on your hardware, powered by Ollama (or any local OpenAI-compatible server like llama.cpp / LM Studio).

Your code never leaves your disk. There's nothing to log in to. Pull a model, type miii, go.

Try it in 30 seconds

ollama pull qwen2.5-coder:14b   # any coding model works
npm install -g miii-agent
miii

Then just talk to it:

> refactor the auth module to use async/await
> @src/server.ts add rate limiting to all POST routes
> why are my tests failing in utils/parser.ts

Needs: Node ≥ 18 and Ollama running locally.

Why local-first?

Most "AI coding tools" are just wrappers around a cloud API — slow, metered, and they ship your private codebase to someone else's server.

Cloud agents miii
Your code Sent to a third party Never leaves your machine
Cost Per-token billing Free — runs on your hardware
Setup API keys, accounts npm i -g miii-agent
Offline No Yes
Latency Network + queue Your GPU only

It doesn't just chat, either — it decomposes the problem, calls tools, and checks its own work before claiming victory.

Five letters, five ideas

small · simple · smart · strategic · semantic — a tiny codebase you can read in an afternoon, no config ceremony, plans before it acts, and operates on the meaning of your code, not blind text matching.

A few things that make it fun

  • 🧪 miii doctor — not every local model can drive an agent. Doctor runs your models through real engineering tasks and tells you which ones actually deliver.
    miii doctor                  # grade every installed model
    miii doctor qwen2.5-coder:7b # grade one
  • 💧 Lossless output spill — that 50K-line test log won't get truncated and leave the model guessing. miii spills the full output to disk and lets the model page through it. Nothing is ever lost.
  • 🔒 Permission-gated tools — you approve what the agent can touch; "always" approvals persist. File tools are confined to your working directory.
  • 📄 MIII.md — drop one in your repo to teach miii your conventions, build/test commands, and do's & don'ts. Same idea as CLAUDE.md, read every turn.

Going deeper

Built-in tools
Tool Function
read_file Read any file in your workspace
write_file Create new files
edit_file Precise string-level edits, whitespace-tolerant
glob Pattern-match files across the project
grep Regex search across files
run_bash Execute shell commands

File tools (read_file, write_file, edit_file) reject ../ traversal and absolute paths outside the workspace. run_bash is not path-confined — its only boundary is the permission prompt, so review commands before approving (especially "always"). Saved rules live in ~/.miii/permissions.json.

Keyboard shortcuts
Key Action
Enter Send prompt
@filename Attach file to context
/models Switch active model
/clear Reset conversation
Esc Stop generation or tool run
Ctrl+O Toggle full tool output
Ctrl+C Quit
Configuration & other backends

Settings live in ~/.miii/config.json, created on first run:

{
  "model": "qwen2.5-coder:14b",
  "ollamaHost": "http://localhost:11434",
  "effort": "medium"
}

effort (low | medium | high) controls temperature and limits.

miii talks to any OpenAI-compatible local server too. Start llama-server, then point a named provider at it:

{
  "model": "qwen2.5-coder-14b",
  "provider": "llamacpp",
  "providers": {
    "llamacpp": { "type": "openai", "baseUrl": "http://localhost:8080" }
  }
}

Switch at launch with miii --provider llamacpp. Any openai-type provider on localhost counts as local — no key, no cloud.

How it spills output

When a tool result exceeds the inline budget (~10K bytes), the full output is written to ~/.miii/output/<id>.txt. Only a head + tail preview is inlined, with a pointer:

[command output truncated: 5184 lines / 412900 bytes.
 Full output at ~/.miii/output/9f3a1c.txt — read it with
 read_file offset/limit to see the elided middle.]

The model pages through the middle with ranged read_file reads. Spill files are garbage-collected after 24 hours.

Development
git clone https://github.com/maruakshay/miii-cli.git
cd miii-cli
npm install
npm run dev
npm run build       # production build
npm run typecheck   # type-check src + eval
npm run eval        # regression gate (powers `miii doctor`)

To run your local working tree against the global miii:

npm run build && npm link   # restore later with: npm install -g miii-agent

Status

MVP. Core agent loop is stable; actively refining tool execution, streaming, and the permission model. PRs welcome — fork it, break it, improve it.

License

MIT © maruakshay

Built for engineers who'd rather own their tools than rent them.