A CLI agent for Experts
Close to
the modelNo guard rails
Agentic workflows for people who know what they're doing. Bring your own model. File, shell, fetch, optional LSP, task, subagent, and skill tools. Do something twice, make it a skill.
$npm i -g @denizokcu/haze
Three commands.
haze starts intentionally small. Install it, point it at an OpenAI-compatible endpoint, and pick a model.
- 01 $npm i -g @denizokcu/haze Install globally from npm.
- 02 haze Open haze from a project directory.
- 03 /provider then /model Add any OpenAI-compatible endpoint and pick a model. OpenRouter, OpenAI, LM Studio, Ollama, or a proxy.
That's the whole core. There is no Pro plan. Anything more specific is grown with the model through /skills → add skill — the wizard below.
Skills, grown
inside haze.
Run /skills and choose add skill. Two prompts — name and description. The model writes the Markdown. The skill becomes a slash command on equal footing with the built-ins. This is the superpower. No plugin runtime, no schema file, no second binary.
You define skills in plain Markdown, right from the chat.
No plugin. No second binary. No YAML to memorize.
The model invokes a skill naturally during conversation in plain language — no command to type, no menu to open.
Your workflow gets guided and stays expectable.
Heavy lifting moves into the skill.
The conversation itself stays simple and minimal. KISS.
Prefer to be explicit? Skills are also first-class slash commands — type /code-review in the chat and the model loads it on the spot.
Watch it work.
Tool calls are grouped into per-turn activity blocks with compact live summaries.
haze has no permission gates, intentionally.
Assistant Markdown renders as real terminal UI — headings, tables, code, quotes, links.
The transcript stays readable during actual work.
Skills are handed over to the model.
The LLM decides when to use a skill.
Skills are tools written by you.
Create a skill if you have to do it multiple times.
Failures and repeated identical tool calls get recovery hints.
Reuse what already happened, change inputs, or stop cleanly.
Project instructions follow the files being touched.
Global CLAUDE.md and AGENTS.md are loaded up front; nested files are discovered only inside their subtree.
The components.
No hidden tools. What you see is what the model gets. No telemetry; network access is an explicit bounded fetch tool for public URLs.
Recursive project discovery with cursor pagination.
Bounded, numbered UTF-8 reads with nextOffset paging.
Bundled ripgrep search with a true global result cap.
Retrieve paged output omitted from oversized bash, grep, and fetch results.
Optional semantic symbols, definitions, and references via installed user-configured language servers.
Unique text replacements with line-prefix tolerance and recovery hints.
Line-range edits with EOF clamping for slightly-oversized ranges.
Create files and parent directories.
Run commands with classification, cwd, duration, and parsed validation.
Read public http(s) URLs as Markdown, pretty JSON, or text with scheme, DNS, redirect, and private-address SSRF guards.
Replace the workspace task list at meaningful phase changes; IDs are generated server-side and completed lists auto-clear on the next user turn.
Load one installed Markdown workflow, then fetch referenced files only on demand.
Delegate genuinely independent investigations or actions with a capped focused tool loop.
Configure read-only Language Server Protocol navigation with /lsp. Presets cover TypeScript, Rust, Python, Go, and PHP. Haze does not install language servers, and hides LSP tools from the model unless an enabled server command exists on PATH; without LSP it falls back to grep, listFiles, and readFile.
Bring your
own model.
Any OpenAI-compatible endpoint. Configure providers, models, base URLs, and keys via /provider and /model inside Haze — not environment variables. Your key, your bill.
| Provider | Type | Status |
|---|---|---|
| OpenAI | Hosted | Supported |
| Anthropic | via OpenRouter | Supported |
| via OpenRouter | Supported | |
| Mistral AI | Hosted | Supported |
| Meta | via OpenRouter | Supported |
| Ollama | Local | Supported |
| LM Studio | Local | Supported |
| OpenRouter | Aggregator | Supported |
| Groq | Hosted | Supported |
| Any OpenAI-compatible proxy | Custom | Supported |
Every command,
all at once.
Core slash commands plus aliases, model/log subforms, and installed-skill invocations. Tasks are managed by the model via the writeTasks tool — no command for them.
| Agent & Session | |
/help |
Show all slash commands. |
/exit, /quit |
Exit haze. |
/clear |
Clear conversation history and the task list. |
/new |
Start a fresh durable session for this workspace. |
/resume |
Resume the latest saved session. |
/session |
Show the current durable session file. |
/compact [instructions] |
Summarize older model context; keep recent messages. |
/init |
Create or update compact, budget-aware AGENTS.md project instructions. |
/context |
Show a token breakdown of the current request: system prompt, project context, tools (incl. MCP), and chat messages. |
| Configuration | |
/provider |
Choose a provider; add/remove models, set API key, or remove it. |
/model |
Choose a model from all configured providers. |
/model <name-or-provider:name> |
Set a model directly. Also sets its provider. |
/model list |
List all configured models. |
/settings |
Show provider, model, API key status, LSP servers, and loaded context files. |
/settings open |
Open ~/.haze/settings.json with the OS default app. |
/logs [id] |
List recent LLM logs, or summarize one by id. New detailed logs are written only when haze starts with --debug. |
/lsp |
Configure language-server navigation tools. Interactive picker: add a preset (typescript, rust, python, go, php) or a custom command, then enable/disable/remove. LSP tools appear only when an enabled server command is on PATH. |
/mcp |
Configure Model Context Protocol servers like Context7. Interactive picker: add a preset or custom http/sse/stdio server, then enable/disable/remove it or set a masked API key. MCP tools never shadow built-ins. |
| Skills | |
/skills |
Manage Markdown skills in one interactive picker: generate a custom skill from a description, show info, enable/disable, validate, or remove. |
| Dynamic | |
/<skill-name> |
Invoke any installed skill directly — e.g. /code-review. The model can also invoke skills on its own. |
NOTE / Skills trigger naturally during chat in plain language, or explicitly as /<skill-name>. The model picks when they fit — you don't have to memorize anything.