hoomanjs 1.41.0 → 1.41.1
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/README.md +26 -701
- package/dist/acp/acp-agent.js +27 -29
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/chat/app.js +19 -26
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/components/StatusBar.js +5 -5
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent/index.js +0 -6
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/agent/prompt-cache-plugin.d.ts +1 -1
- package/dist/core/agent/prompt-cache-plugin.js +1 -1
- package/dist/core/config.d.ts +3 -0
- package/dist/core/mcp/index.d.ts +3 -3
- package/dist/core/mcp/index.js +2 -2
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +28 -0
- package/dist/core/mcp/manager.js +171 -2
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/models/anthropic.d.ts +4 -3
- package/dist/core/models/anthropic.js.map +1 -1
- package/dist/core/models/minimax.d.ts +2 -1
- package/dist/core/models/minimax.js +49 -7
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/types.d.ts +10 -6
- package/dist/core/models/types.js +3 -2
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/prompts/environment.d.ts +10 -1
- package/dist/core/prompts/environment.js +15 -1
- package/dist/core/prompts/environment.js.map +1 -1
- package/dist/core/prompts/static/environment.md +2 -1
- package/dist/core/prompts/static/web-search.md +1 -1
- package/dist/core/prompts/system.d.ts +6 -0
- package/dist/core/prompts/system.js +7 -1
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/skills/built-in/hooman-mcp/SKILL.md +20 -0
- package/dist/core/tools/ask-user.d.ts +8 -0
- package/dist/core/tools/ask-user.js +8 -4
- package/dist/core/tools/ask-user.js.map +1 -1
- package/dist/core/tools/time.js +1 -1
- package/dist/core/tools/time.js.map +1 -1
- package/dist/daemon/questions.d.ts +18 -0
- package/dist/daemon/questions.js +44 -0
- package/dist/daemon/questions.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<img src=".github/logo.svg" alt="Hooman logo" width="128" />
|
|
3
3
|
<h1>Hooman</h1>
|
|
4
4
|
<p>
|
|
5
|
-
Hooman is a hackable AI agent toolkit for local workflows. It is built with TypeScript, <a href="https://www.npmjs.com/package/@strands-agents/sdk">Strands Agents SDK</a>, and <a href="https://github.com/vadimdemedes/ink">Ink</a>.
|
|
5
|
+
Hooman is a hackable, local-first AI agent toolkit for local workflows. It is built with TypeScript, <a href="https://www.npmjs.com/package/@strands-agents/sdk">Strands Agents SDK</a>, and <a href="https://github.com/vadimdemedes/ink">Ink</a>.
|
|
6
6
|
</p>
|
|
7
7
|
<p>
|
|
8
8
|
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/runtime-Node.js-5FA04E?logo=nodedotjs&logoColor=white" alt="Node.js" /></a>
|
|
@@ -15,729 +15,54 @@
|
|
|
15
15
|
<p>
|
|
16
16
|
<img src=".github/screenshot.png" alt="Hooman screenshot" />
|
|
17
17
|
</p>
|
|
18
|
+
<p>
|
|
19
|
+
<strong><a href="https://vaibhavpandey.com/hooman/">Website</a></strong> ·
|
|
20
|
+
<strong><a href="https://vaibhavpandey.com/hooman/getting-started/">Docs</a></strong> ·
|
|
21
|
+
<strong><a href="https://vaibhavpandey.com/hooman/guides/vscode/">VS Code Extension</a></strong>
|
|
22
|
+
</p>
|
|
18
23
|
</div>
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
Hooman reads your codebase, edits files, and runs commands — from a terminal, VS Code, or any [Agent Client Protocol](https://agentclientprotocol.com) client. Bring your own model; your config, keys, and sessions never leave `~/.hooman`.
|
|
21
26
|
|
|
22
27
|
- a one-shot `exec` command for single prompts
|
|
23
|
-
- a stateful `chat` interface for iterative sessions
|
|
28
|
+
- a stateful `chat` interface for iterative sessions, with an in-chat `/config` workflow for models, MCP servers, and skills
|
|
24
29
|
- a `daemon` command for channel-driven MCP automation
|
|
25
|
-
- an
|
|
26
|
-
- an `acp` command for running Hooman as an Agent Client Protocol (ACP) agent over stdio
|
|
27
|
-
|
|
28
|
-
## Related
|
|
29
|
-
|
|
30
|
-
**Looking for a focused web UI** for chat and agent configuration with lighter surface on top of the same stack? See [**Zero**](https://github.com/vaibhavpandeyvpz/zero) — [README](https://github.com/vaibhavpandeyvpz/zero#readme).
|
|
31
|
-
|
|
32
|
-
## Features
|
|
33
|
-
|
|
34
|
-
- Multiple LLM providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `minimax`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai`
|
|
35
|
-
- Local configuration under `~/.hooman`
|
|
36
|
-
- Optional web search tool with provider selection (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
|
|
37
|
-
- MCP server support via `stdio`, `streamable-http`, and `sse`
|
|
38
|
-
- MCP server `instructions` support: server-provided instructions are appended to the agent system prompt
|
|
39
|
-
- MCP channel notifications: `hooman daemon` subscribes to servers that advertise `hooman/channel`
|
|
40
|
-
- Runtime skills via Strands `AgentSkills`, loading bundled built-in skills plus local `~/.hooman/skills`
|
|
41
|
-
- Bundled prompt harness toggles (`behaviour`, `communication`, `execution`, `guardrails`); coding guidance ships as the built-in `hooman-coding` skill
|
|
42
|
-
- Built-in read-only subagent tools (`subagent_research`, `subagent_review`, `subagent_test_investigator`)
|
|
43
|
-
- Built-in `grep` tool backed by ripgrep (`rg`), with runtime bootstrap when `rg` is not available on PATH
|
|
44
|
-
- Built-in `ask_user` tool: the agent can ask you a multiple-choice question mid-task and wait for the answer — inline picker in `chat`, numbered prompt in `exec`, question card in ACP clients (Zed, the VS Code extension); environments without a human (daemon, non-TTY `exec`, subagents) report "no user available" so the agent proceeds on its own
|
|
45
|
-
- Context-window utilization and session-cost tracking backed by [models.dev](https://models.dev) (daily-cached catalog, optional per-model `billing` overrides) — shown in the chat status bar, the VS Code extension footer, and sent to ACP clients via `usage_update`
|
|
46
|
-
- Toolkit-oriented architecture with configurable tools, prompts, and transports
|
|
47
|
-
- Interactive terminal UI for chat and configuration
|
|
30
|
+
- an `acp` command for running Hooman as an Agent Client Protocol agent over stdio (used by the [VS Code extension](https://vaibhavpandey.com/hooman/guides/vscode/) and editors like Zed)
|
|
48
31
|
|
|
49
|
-
##
|
|
50
|
-
|
|
51
|
-
- [Node.js](https://nodejs.org) `>= 24`
|
|
52
|
-
- npm for package installs and JavaScript tooling
|
|
53
|
-
- Provider credentials or local model runtime depending on the LLM you choose
|
|
54
|
-
|
|
55
|
-
## Usage
|
|
56
|
-
|
|
57
|
-
Fastest way to get started without cloning the repo:
|
|
32
|
+
## Quick start
|
|
58
33
|
|
|
59
34
|
```bash
|
|
60
35
|
npx hoomanjs
|
|
61
|
-
|
|
62
|
-
# or install globally
|
|
63
|
-
npm i -g hoomanjs
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Or with Bun:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
bunx hoomanjs
|
|
70
36
|
```
|
|
71
37
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
1. Start chatting with `hooman` (same as `hooman chat`).
|
|
75
|
-
2. Run `/config` in chat to choose your LLM provider and model, and to manage MCP servers and skills.
|
|
76
|
-
3. Use `hooman exec "your prompt"` for one-off tasks.
|
|
77
|
-
|
|
78
|
-
## Must have
|
|
79
|
-
|
|
80
|
-
For the best experience, set up both:
|
|
81
|
-
|
|
82
|
-
1. **MCP servers** for on-demand tools in `chat` / `exec` (task APIs, messaging, schedulers, etc.).
|
|
83
|
-
2. **MCP channels** for event-driven automation with `hooman daemon` (notifications become agent prompts).
|
|
84
|
-
|
|
85
|
-
Suggested MCP servers from this ecosystem:
|
|
86
|
-
|
|
87
|
-
- [`cronmcp`](https://github.com/vaibhavpandeyvpz/cronmcp) - lets Hooman schedule recurring prompts and automations, so routine checks and follow-ups run on time.
|
|
88
|
-
- [`jiraxmcp`](https://github.com/vaibhavpandeyvpz/jiraxmcp) - gives Hooman direct Jira Cloud access to search issues, update tickets, and help drive sprint workflows.
|
|
89
|
-
- [`slackxmcp`](https://github.com/vaibhavpandeyvpz/slackxmcp) - connects Hooman to Slack so it can read channel context, draft updates, and post actions where your team already works.
|
|
90
|
-
- [`tgfmcp`](https://github.com/vaibhavpandeyvpz/tgfmcp) - enables Telegram bot workflows, making it easy to route notifications and respond from agent-driven chats.
|
|
91
|
-
- [`wappmcp`](https://github.com/vaibhavpandeyvpz/wappmcp) - brings WhatsApp Web messaging into Hooman for customer or team communication automations.
|
|
92
|
-
|
|
93
|
-
For production deployments, still review permissions and use least-privilege credentials/tokens for each integration.
|
|
94
|
-
|
|
95
|
-
## Install
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
npm install
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Run locally:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
npm run dev -- --help
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Or use the dev alias:
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
npm run build
|
|
111
|
-
node dist/cli.js --help
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Link the CLI locally:
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
npm link
|
|
118
|
-
hooman --help
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Commands
|
|
122
|
-
|
|
123
|
-
### `hooman exec`
|
|
124
|
-
|
|
125
|
-
Run a single prompt once.
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
hooman exec "Summarize the current repository"
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
Use a specific session id:
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
hooman exec "What changed?" --session my-session
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Skip interactive tool approval (allows every tool call; use only when you trust the prompt and environment):
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
hooman exec "Summarize this repo" --yolo
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
Start in **ask** mode (narrower tool surface, no plan lifecycle tools; see [Session mode](#session-mode)):
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
hooman exec "Map the architecture" --mode ask
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### `hooman chat`
|
|
150
|
-
|
|
151
|
-
Start an interactive stateful chat session.
|
|
152
|
-
|
|
153
|
-
```bash
|
|
154
|
-
hooman
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Equivalent explicit form:
|
|
158
|
-
|
|
159
|
-
```bash
|
|
160
|
-
hooman chat
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Optional initial prompt:
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
hooman chat "Help me prioritize the next task"
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
Resume or pin a session id:
|
|
170
|
-
|
|
171
|
-
```bash
|
|
172
|
-
hooman chat --session my-session
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
Skip the in-chat tool approval UI (same semantics as `exec --yolo`):
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
hooman chat --yolo
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
Start in ask mode:
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
hooman chat --mode ask
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
The status bar under the composer shows the active model, effort, mode, and yolo state; a usage row with `context: N% (used/size)`, cumulative `tokens` (`in`/`cin`/`out`), and session `cost: $…` (each segment appears once it has data — context and cost require resolvable billing metadata, see the [`billing` block](#provider-notes)); and an mcp/tools/skills row with a live `elapsed` timer while a turn runs.
|
|
188
|
-
|
|
189
|
-
### Chat commands
|
|
190
|
-
|
|
191
|
-
Inside an interactive `chat` session, type `/` to discover slash commands:
|
|
192
|
-
|
|
193
|
-
- `/model` - pick or set the chat model for this session.
|
|
194
|
-
- `/effort` - pick or set the reasoning effort for the active model's provider (`off`, `minimal`, `low`, `medium`, `high`); Shift+Tab cycles it.
|
|
195
|
-
- `/mode` - switch the session mode (`agent`, `ask`, `plan`); see [Session mode](#session-mode).
|
|
196
|
-
- `/yolo` - toggle auto-approve of tool calls (`on` / `off`).
|
|
197
|
-
- `/init` - generate or refresh `AGENTS.md` for the current project.
|
|
198
|
-
- `/compact` - compact the conversation history now and persist the result.
|
|
199
|
-
- `/new` - start a fresh chat session.
|
|
200
|
-
- `/sessions` - browse and resume saved sessions.
|
|
201
|
-
- `/config` - launch the configuration workflow (see below).
|
|
202
|
-
|
|
203
|
-
### Session mode
|
|
204
|
-
|
|
205
|
-
`exec`, `chat`, and `daemon` accept **`-m` / `--mode`** with:
|
|
206
|
-
|
|
207
|
-
- **`agent`** (default): normal tool surface and approvals.
|
|
208
|
-
- **`plan`**: planning workflow with a reduced tool surface plus `enter_plan_mode` / `exit_plan_mode`.
|
|
209
|
-
- **`ask`**: read-oriented, narrower surface (similar to interactive **plan** mode) but **without** `enter_plan_mode` / `exit_plan_mode`.
|
|
210
|
-
|
|
211
|
-
In **`chat`**, `/mode` can switch between **agent**, **ask**, and **plan**. **ACP** sessions can set `hooman.sessionMode` to `agent`, `plan`, or `ask`.
|
|
212
|
-
|
|
213
|
-
### `hooman daemon`
|
|
214
|
-
|
|
215
|
-
Run a long-lived daemon that **always** subscribes to MCP servers advertising the `hooman/channel` capability and feeds each received notification into the agent as a queued prompt.
|
|
216
|
-
|
|
217
|
-
```bash
|
|
218
|
-
hooman daemon
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
Resume or pin a session id:
|
|
222
|
-
|
|
223
|
-
```bash
|
|
224
|
-
hooman daemon --session my-daemon
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
Skip remote channel permission relay and allow every tool call from daemon turns (same risk profile as `exec` / `chat` with `--yolo`):
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
hooman daemon --yolo
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
Optional `--mode ask` matches `exec` / `chat` (narrow surface without plan lifecycle tools).
|
|
234
|
-
|
|
235
|
-
Log raw notification payloads:
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
hooman daemon --debug
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### `hooman config`
|
|
242
|
-
|
|
243
|
-
Print the effective runtime `config.json` for the current working directory in
|
|
244
|
-
the same shape as `config.json`, with credential-like values redacted.
|
|
245
|
-
|
|
246
|
-
```bash
|
|
247
|
-
hooman config
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
### Feature Flags
|
|
251
|
-
|
|
252
|
-
Runtime tool and prompt switches are controlled from `config.json`:
|
|
253
|
-
|
|
254
|
-
- `search.enabled`
|
|
255
|
-
- `search.provider` (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
|
|
256
|
-
- `search.brave.apiKey`
|
|
257
|
-
- `search.exa.apiKey`
|
|
258
|
-
- `search.firecrawl.apiKey`
|
|
259
|
-
- `search.serper.apiKey`
|
|
260
|
-
- `search.tavily.apiKey`
|
|
261
|
-
- `prompts.behaviour`
|
|
262
|
-
- `prompts.communication`
|
|
263
|
-
- `prompts.execution`
|
|
264
|
-
- `prompts.guardrails`
|
|
265
|
-
- `tools.todo.enabled`
|
|
266
|
-
- `tools.fetch.enabled`
|
|
267
|
-
- `tools.filesystem.enabled`
|
|
268
|
-
- `tools.shell.enabled`
|
|
269
|
-
- `tools.sleep.enabled`
|
|
270
|
-
- `tools.subagents.enabled` (enables built-in subagent tools)
|
|
271
|
-
|
|
272
|
-
### `/config`
|
|
273
|
-
|
|
274
|
-
The interactive configuration workflow is launched from inside a `chat` session with the `/config` slash command (there is no separate top-level `configure` command). It takes over the terminal on the alternate screen buffer while open, and restores the chat session on exit. Any config changes are picked up when the session re-bootstraps.
|
|
275
|
-
|
|
276
|
-
```text
|
|
277
|
-
/config
|
|
278
|
-
```
|
|
38
|
+
Or install globally (`npm i -g hoomanjs`), or via Bun (`bunx hoomanjs`). Then run `/config` inside the chat to pick a provider and model. Full walkthrough: [Getting Started](https://vaibhavpandey.com/hooman/getting-started/).
|
|
279
39
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
- manage general settings such as name, prompts, tools, and compaction
|
|
283
|
-
- manage models and providers with field-by-field editors
|
|
284
|
-
- choose search provider and set its API key
|
|
285
|
-
- toggle bundled harness prompts (`behaviour`, `communication`, `execution`, `guardrails`)
|
|
286
|
-
- edit `instructions.md` in your `$VISUAL` / `$EDITOR` (cross-platform fallback included)
|
|
287
|
-
- add, edit, and delete MCP servers with field-by-field editors and confirmation
|
|
288
|
-
- search, install, refresh, and remove skills
|
|
289
|
-
|
|
290
|
-
### `hooman acp`
|
|
291
|
-
|
|
292
|
-
Run Hooman as an Agent Client Protocol (ACP) agent over stdio.
|
|
293
|
-
|
|
294
|
-
```bash
|
|
295
|
-
hooman acp
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
ACP notes:
|
|
299
|
-
|
|
300
|
-
- ACP session metadata is indexed in the active project's `sessions/acp/sessions.jsonl`; conversation history lives in the regular per-session snapshots (see [Configuration Layout](#configuration-layout))
|
|
301
|
-
- ACP loads MCP servers passed on `session/new` and `session/load`, in addition to Hooman's local `mcp.json`
|
|
302
|
-
- ACP `session/new` and `session/load` support `_meta.userId`
|
|
303
|
-
- session configuration includes `hooman.sessionMode` (`agent`, `plan`, or `ask`); see [Session mode](#session-mode)
|
|
304
|
-
- each turn ends with a `usage_update` carrying context-window utilization (`used`/`size`), cumulative session `cost`, and cumulative token totals under `_meta["hoomanjs/tokens"]` — `size` and `cost` come from the model's [`billing` metadata](#provider-notes) (models.dev-backed) and are omitted (`size: 0`, no `cost`) when unresolved; a model switch pushes a fresh `usage_update` so clients can rescale immediately
|
|
305
|
-
|
|
306
|
-
## VS Code Extension
|
|
307
|
-
|
|
308
|
-
`src/vscode/` ships a self-contained VS Code extension (`hooman-vscode`) that bridges `hooman acp` into the editor with a **Hooman chat panel** — its own webview view in the activity bar with streaming markdown, collapsible thinking, tool-call cards, plan checklists, usage, session list/load, mode/model/effort pickers, slash-command autocomplete, and inline permission prompts. Works in **stable VS Code, Insiders, and compatible forks** — no proposed APIs and no special subscription required.
|
|
309
|
-
|
|
310
|
-
It's not published to the marketplace yet. Quick start:
|
|
311
|
-
|
|
312
|
-
```bash
|
|
313
|
-
# from the repo root
|
|
314
|
-
npm install && npm run build && npm link
|
|
315
|
-
|
|
316
|
-
# from src/vscode
|
|
317
|
-
cd src/vscode
|
|
318
|
-
npm install && npm run compile
|
|
319
|
-
code . # open src/vscode as its own workspace, then press F5
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
Or package and install a `.vsix` into any VS Code-compatible editor: `npm run package` in `src/vscode`, then `code --install-extension hooman-vscode-<version>.vsix`.
|
|
323
|
-
|
|
324
|
-
Full setup, settings, and architecture notes: [`src/vscode/README.md`](src/vscode/README.md).
|
|
325
|
-
|
|
326
|
-
## Configuration Layout
|
|
327
|
-
|
|
328
|
-
Hooman stores its data in:
|
|
329
|
-
|
|
330
|
-
```text
|
|
331
|
-
~/.hooman/
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
Important files and folders:
|
|
335
|
-
|
|
336
|
-
- `config.json` - app name, reusable provider configs, model configs, tool flags, and compaction
|
|
337
|
-
- `instructions.md` - system instructions used to build the agent prompt
|
|
338
|
-
- `mcp.json` - MCP server definitions
|
|
339
|
-
- `skills/` - installed skills
|
|
340
|
-
- `bin/` - runtime-managed helper binaries (including bootstrapped `rg` for the `grep` tool when system `rg` is unavailable)
|
|
341
|
-
- `cache/` - runtime caches used by tools and subsystems
|
|
342
|
-
- `projects.json` - registry mapping each project root to a stable UUID
|
|
343
|
-
- `projects/<uuid>/` - per-project storage, scoped to the project (git root, falling back to cwd) the session runs in:
|
|
344
|
-
- `sessions/` - persisted session data (per-session snapshots and the ACP session index at `sessions/acp/sessions.jsonl`)
|
|
345
|
-
- `offloaded-content/` - offloaded tool output (large tool results retrievable via `retrieve_offloaded_content`)
|
|
346
|
-
- `memory/` - durable extracted memory store
|
|
347
|
-
- `attachments/` - saved attachments (e.g. clipboard images)
|
|
348
|
-
- `plans/` - plan-mode markdown documents
|
|
349
|
-
|
|
350
|
-
### Project-scoped storage
|
|
351
|
-
|
|
352
|
-
`sessions`, `memory`, `attachments`, and `plans` are scoped per project rather than shared globally. On first use in a working directory, Hooman resolves the project root (the nearest git root, falling back to the cwd), mints a UUID for it, and records the mapping in `~/.hooman/projects.json`. All four folders then live under `~/.hooman/projects/<uuid>/`, so unrelated projects never see each other's sessions, memory, attachments, or plans. Config and MCP resolution are unaffected (see repo-local overlays below).
|
|
353
|
-
|
|
354
|
-
### Repo-local runtime overlays
|
|
355
|
-
|
|
356
|
-
At runtime, Hooman resolves configuration in this order:
|
|
357
|
-
|
|
358
|
-
1. `~/.hooman/config.json` and `~/.hooman/mcp.json`
|
|
359
|
-
2. `<git-root>/.hooman/config.json` and `<git-root>/.hooman/mcp.json` (if present)
|
|
360
|
-
3. matching `.hooman/config.json` and `.hooman/mcp.json` files in nested directories from git root to current working directory
|
|
361
|
-
|
|
362
|
-
Nearest files win when keys overlap.
|
|
363
|
-
|
|
364
|
-
For app config (`config.json`):
|
|
365
|
-
|
|
366
|
-
- plain objects are deep-merged
|
|
367
|
-
- scalar values are overridden by the nearest file
|
|
368
|
-
- `providers` and `llms` are merged by `name` (nearest entry with the same name replaces inherited entries)
|
|
369
|
-
|
|
370
|
-
For MCP config (`mcp.json`):
|
|
371
|
-
|
|
372
|
-
- `mcpServers` is merged by server name (nearest entry with the same name wins)
|
|
373
|
-
|
|
374
|
-
Notes:
|
|
375
|
-
|
|
376
|
-
- Runtime overlays apply to `chat`, `exec`, `daemon`, and `acp` bootstraps.
|
|
377
|
-
- `hooman config` prints only the merged effective `config.json` shape with credential-like values redacted.
|
|
378
|
-
- The `/config` UI and `hooman mcp auth/logout/auth-status` still target home config (`~/.hooman/*`) directly.
|
|
379
|
-
- Keep secrets in home config unless you explicitly want project-scoped credentials.
|
|
380
|
-
|
|
381
|
-
`grep` tool binary resolution order:
|
|
382
|
-
|
|
383
|
-
1. Use system `rg` when available.
|
|
384
|
-
2. Else use cached `~/.hooman/bin/rg` (or `rg.exe` on Windows).
|
|
385
|
-
3. Else download and verify a platform-specific ripgrep release into `~/.hooman/bin/`.
|
|
386
|
-
|
|
387
|
-
## Example `config.json`
|
|
388
|
-
|
|
389
|
-
The on-disk shape uses a reusable **`providers`** array plus a non-empty **`llms`** array. Each provider stores a runtime `provider` id plus provider-specific `options`; each LLM references a provider by name, stores its model `options`, and marks one entry as the default. The bundled **hooman-config** skill documents the full schema.
|
|
390
|
-
|
|
391
|
-
```json
|
|
392
|
-
{
|
|
393
|
-
"name": "Hooman",
|
|
394
|
-
"providers": [
|
|
395
|
-
{
|
|
396
|
-
"name": "Ollama",
|
|
397
|
-
"provider": "ollama",
|
|
398
|
-
"options": {}
|
|
399
|
-
}
|
|
400
|
-
],
|
|
401
|
-
"llms": [
|
|
402
|
-
{
|
|
403
|
-
"name": "Default",
|
|
404
|
-
"provider": "Ollama",
|
|
405
|
-
"options": {
|
|
406
|
-
"model": "gemma4:e4b"
|
|
407
|
-
},
|
|
408
|
-
"default": true
|
|
409
|
-
}
|
|
410
|
-
],
|
|
411
|
-
"search": {
|
|
412
|
-
"enabled": false,
|
|
413
|
-
"provider": "brave",
|
|
414
|
-
"brave": {},
|
|
415
|
-
"exa": {},
|
|
416
|
-
"firecrawl": {},
|
|
417
|
-
"serper": {},
|
|
418
|
-
"tavily": {}
|
|
419
|
-
},
|
|
420
|
-
"prompts": {
|
|
421
|
-
"behaviour": true,
|
|
422
|
-
"communication": true,
|
|
423
|
-
"execution": true,
|
|
424
|
-
"guardrails": true
|
|
425
|
-
},
|
|
426
|
-
"tools": {
|
|
427
|
-
"todo": { "enabled": true },
|
|
428
|
-
"fetch": { "enabled": true },
|
|
429
|
-
"filesystem": { "enabled": true },
|
|
430
|
-
"shell": { "enabled": true },
|
|
431
|
-
"sleep": { "enabled": true },
|
|
432
|
-
"subagents": { "enabled": true }
|
|
433
|
-
},
|
|
434
|
-
"compaction": {
|
|
435
|
-
"ratio": 0.75,
|
|
436
|
-
"keep": 5
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
Tool approvals are session-scoped and are not persisted in `config.json`.
|
|
442
|
-
|
|
443
|
-
Hooman enables Strands `ContextOffloader` by default with file-backed storage under the project-scoped `~/.hooman/projects/<uuid>/offloaded-content`, so large tool results can be previewed in-context and retrieved later without bloating the active conversation window.
|
|
444
|
-
|
|
445
|
-
Supported `providers[].provider` values registered in this release (see `src/core/models/index.ts`):
|
|
446
|
-
|
|
447
|
-
- `anthropic`
|
|
448
|
-
- `azure`
|
|
449
|
-
- `bedrock`
|
|
450
|
-
- `google`
|
|
451
|
-
- `groq`
|
|
452
|
-
- `minimax`
|
|
453
|
-
- `moonshot`
|
|
454
|
-
- `ollama`
|
|
455
|
-
- `openai`
|
|
456
|
-
- `openrouter`
|
|
457
|
-
- `xai`
|
|
458
|
-
|
|
459
|
-
Supported `search.provider` values:
|
|
460
|
-
|
|
461
|
-
- `brave`
|
|
462
|
-
- `exa`
|
|
463
|
-
- `firecrawl`
|
|
464
|
-
- `serper`
|
|
465
|
-
- `tavily`
|
|
466
|
-
|
|
467
|
-
## Provider Notes
|
|
468
|
-
|
|
469
|
-
Provider entries now look like:
|
|
470
|
-
|
|
471
|
-
```json
|
|
472
|
-
{
|
|
473
|
-
"name": "MiniMax",
|
|
474
|
-
"provider": "minimax",
|
|
475
|
-
"options": {
|
|
476
|
-
"apiKey": "..."
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
LLM entries reference a provider by name and carry normalized model options:
|
|
482
|
-
|
|
483
|
-
```json
|
|
484
|
-
{
|
|
485
|
-
"name": "MiniMax M3",
|
|
486
|
-
"provider": "MiniMax",
|
|
487
|
-
"options": {
|
|
488
|
-
"model": "MiniMax-M3",
|
|
489
|
-
"temperature": 1,
|
|
490
|
-
"maxTokens": 4096
|
|
491
|
-
},
|
|
492
|
-
"default": true
|
|
493
|
-
}
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
Supported provider option fields:
|
|
497
|
-
|
|
498
|
-
All reasoning-capable providers share a common optional `reasoning` object (`{ effort?, summary?, display? }`). `effort` is `"minimal" | "low" | "medium" | "high"` and its presence enables thinking; Hooman translates it to each backend's native shape. `summary` (`"auto" | "concise" | "detailed" | "none"`) is only honored by the OpenAI/Azure Responses API. `display` (`"summarized" | "omitted"`) applies to Bedrock Claude / MiniMax only. See the bundled **hooman-config** skill for the exact per-provider mapping.
|
|
499
|
-
|
|
500
|
-
- `anthropic`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
|
|
501
|
-
- `azure`: optional `resourceName`, optional `baseURL`, optional `apiKey`, optional `headers`, optional `apiVersion`, optional `useDeploymentBasedUrls`, optional `reasoning`
|
|
502
|
-
- `bedrock`: `region`, `accessKeyId`, `secretAccessKey`, optional `sessionToken`, optional `apiKey`, optional `reasoning`
|
|
503
|
-
- `google`: `apiKey`, optional `reasoning`
|
|
504
|
-
- `groq`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
|
|
505
|
-
- `minimax`: `apiKey`, optional `headers`, optional `reasoning`
|
|
506
|
-
- `moonshot`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
|
|
507
|
-
- `ollama`: optional `baseURL`, optional `reasoning`
|
|
508
|
-
- `openai`: `apiKey`, optional `baseURL`, optional `headers`, optional `api` (`"responses"` (default) or `"chat"`), optional `reasoning`
|
|
509
|
-
- `openrouter`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
|
|
510
|
-
- `xai`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
|
|
511
|
-
|
|
512
|
-
Normalized LLM option fields:
|
|
513
|
-
|
|
514
|
-
- `model`
|
|
515
|
-
- optional `temperature`
|
|
516
|
-
- optional `maxTokens`
|
|
517
|
-
|
|
518
|
-
Each LLM entry may also carry an optional **`billing`** block used to display context-window utilization and cumulative session cost (in the chat TUI status bar and the VS Code extension footer, and sent to ACP clients via `usage_update`):
|
|
519
|
-
|
|
520
|
-
```json
|
|
521
|
-
{
|
|
522
|
-
"name": "Haiku 4.5",
|
|
523
|
-
"provider": "LiteLLM Anthropic",
|
|
524
|
-
"billing": {
|
|
525
|
-
"name": "claude-haiku-4.5",
|
|
526
|
-
"context": 200000,
|
|
527
|
-
"costs": { "input/m": 1, "cache/m": 0.1, "output/m": 5 }
|
|
528
|
-
},
|
|
529
|
-
"options": { "model": "claude-haiku-4.5" },
|
|
530
|
-
"default": true
|
|
531
|
-
}
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
`billing.name` is required when the block is present and is the identifier looked up in the [models.dev](https://models.dev) catalog (cached under `~/.hooman/cache/` and refreshed at most once daily); when `billing` is omitted, `options.model` is used as the lookup name. `context` (window size in tokens) and `costs` (USD per million tokens; `"cache/m"` prices cached-input reads) override whatever models.dev resolves. If neither the config nor models.dev yields the data, context usage and cost are simply not shown.
|
|
535
|
-
|
|
536
|
-
Notes:
|
|
537
|
-
|
|
538
|
-
- Google maps normalized `maxTokens` to the SDK's `maxOutputTokens` internally.
|
|
539
|
-
- Azure uses the Vercel AI SDK `@ai-sdk/azure` provider. Set the LLM `model` to your Azure deployment name, not the raw OpenAI model id.
|
|
540
|
-
- Ollama maps normalized `temperature` into Ollama `options.temperature`.
|
|
541
|
-
- MiniMax uses the Anthropic-compatible endpoint `https://api.minimax.io/anthropic` automatically.
|
|
542
|
-
- Moonshot defaults `baseURL` to `https://api.moonshot.ai/v1` when it is omitted. It is served through the reasoning-aware openai-compatible adapter, so Kimi's `reasoning_content` streams as thinking — this makes it the right provider for reaching Kimi through an OpenAI-compatible proxy (e.g. LiteLLM), where the `openai` provider's Chat adapter would drop reasoning.
|
|
543
|
-
- OpenRouter defaults `baseURL` to `https://openrouter.ai/api/v1` when it is omitted, and model names are usually provider-qualified ids such as `anthropic/claude-3.5-sonnet`. It also uses the openai-compatible adapter, so reasoning streams for reasoning models.
|
|
544
|
-
- The `openai` provider defaults to the Responses API (`api: "responses"`), which surfaces reasoning. `api: "chat"` does NOT surface reasoning (the Chat adapter drops `reasoning_content`); route such proxies through `moonshot`/`openrouter` instead.
|
|
545
|
-
- `reasoning.display` is for Bedrock Claude (Opus 4.7+ hide reasoning by default) and MiniMax; the native Anthropic API rejects it.
|
|
546
|
-
- Bedrock can rely on the AWS default credential chain when explicit credentials are not provided.
|
|
547
|
-
|
|
548
|
-
## MCP Configuration
|
|
549
|
-
|
|
550
|
-
Detailed design notes for planned OAuth-enabled remote MCP support live in [docs/mcp-oauth-design.md](docs/mcp-oauth-design.md).
|
|
551
|
-
|
|
552
|
-
`mcp.json` is stored as:
|
|
553
|
-
|
|
554
|
-
```json
|
|
555
|
-
{
|
|
556
|
-
"mcpServers": {}
|
|
557
|
-
}
|
|
558
|
-
```
|
|
559
|
-
|
|
560
|
-
At runtime, project-local `.hooman/mcp.json` files are merged on top of `~/.hooman/mcp.json` from git root to current directory. On name conflicts, the nearest `mcpServers.<name>` entry wins.
|
|
561
|
-
|
|
562
|
-
### Example stdio server
|
|
563
|
-
|
|
564
|
-
```json
|
|
565
|
-
{
|
|
566
|
-
"mcpServers": {
|
|
567
|
-
"filesystem": {
|
|
568
|
-
"type": "stdio",
|
|
569
|
-
"command": "npx",
|
|
570
|
-
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
|
|
571
|
-
"env": {
|
|
572
|
-
"EXAMPLE": "1"
|
|
573
|
-
},
|
|
574
|
-
"cwd": "/tmp"
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
### Example streamable HTTP server
|
|
581
|
-
|
|
582
|
-
```json
|
|
583
|
-
{
|
|
584
|
-
"mcpServers": {
|
|
585
|
-
"remote": {
|
|
586
|
-
"type": "streamable-http",
|
|
587
|
-
"url": "https://example.com/mcp",
|
|
588
|
-
"headers": {
|
|
589
|
-
"Authorization": "Bearer token"
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
```
|
|
595
|
-
|
|
596
|
-
### Example OAuth-capable remote server
|
|
597
|
-
|
|
598
|
-
```json
|
|
599
|
-
{
|
|
600
|
-
"mcpServers": {
|
|
601
|
-
"linear": {
|
|
602
|
-
"type": "streamable-http",
|
|
603
|
-
"url": "https://example.com/mcp",
|
|
604
|
-
"oauth": {
|
|
605
|
-
"enabled": true,
|
|
606
|
-
"clientId": "optional-pre-registered-client",
|
|
607
|
-
"scopes": ["read", "write"],
|
|
608
|
-
"callbackPort": 19876
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
### How the client identity is established
|
|
616
|
-
|
|
617
|
-
When authorizing a remote server, the MCP SDK needs a `client_id`. Hooman resolves one in this order:
|
|
618
|
-
|
|
619
|
-
1. **Pre-registered client** — if `oauth.clientId` (and optionally `clientSecret`) is set, it is used as-is and no registration happens.
|
|
620
|
-
2. **Dynamic Client Registration (DCR)** — if the auth server advertises a `registration_endpoint`, Hooman registers a client on the fly. The redirect URI it registers is reused on later authorizations (persisted in `~/.hooman/mcp-oauth.json`), so keep it stable — set `oauth.callbackPort` or `oauth.redirectUri` if a server pins the redirect.
|
|
621
|
-
3. **Client ID Metadata Document (CIMD / SEP-991)** — some servers (e.g. Slack) support neither a static client nor DCR, and instead advertise `client_id_metadata_document_supported: true`. For these, the client presents an HTTPS URL that hosts a JSON metadata document; that URL becomes the `client_id`. Hooman sends `oauth.clientMetadataUrl` (falling back to a bundled default) whenever the server supports it.
|
|
622
|
-
|
|
623
|
-
If a server supports none of these, authorization fails with `Incompatible auth server: does not support dynamic client registration` — supply a `clientId` or `clientMetadataUrl`.
|
|
624
|
-
|
|
625
|
-
### Hosting a CIMD document (GitHub Pages)
|
|
626
|
-
|
|
627
|
-
The metadata document is a static JSON file served over HTTPS. A copy ships in this repo at [`docs/oauth/client-metadata.json`](docs/oauth/client-metadata.json) and is published via GitHub Pages at `https://vaibhavpandey.com/hooman/oauth/client-metadata.json`, which is the default `clientMetadataUrl`.
|
|
628
|
-
|
|
629
|
-
Requirements when hosting your own:
|
|
630
|
-
|
|
631
|
-
- The URL must be **HTTPS with a non-root path** (a bare domain is rejected).
|
|
632
|
-
- The document's own `client_id` field must equal the hosted URL **exactly** (self-referential).
|
|
633
|
-
- `redirect_uris` must include Hooman's loopback callback path `/mcp/oauth/callback`. Per RFC 8252 the loopback port is matched flexibly, so list the port-less hosts (`http://127.0.0.1/mcp/oauth/callback` and `http://localhost/mcp/oauth/callback`).
|
|
634
|
-
- `token_endpoint_auth_method` is `"none"` (public client — the document is public and holds no secrets).
|
|
635
|
-
|
|
636
|
-
Override the default per server:
|
|
637
|
-
|
|
638
|
-
```json
|
|
639
|
-
{
|
|
640
|
-
"mcpServers": {
|
|
641
|
-
"slack": {
|
|
642
|
-
"type": "streamable-http",
|
|
643
|
-
"url": "https://mcp.slack.com/mcp",
|
|
644
|
-
"oauth": {
|
|
645
|
-
"enabled": true,
|
|
646
|
-
"clientMetadataUrl": "https://vaibhavpandey.com/hooman/oauth/client-metadata.json"
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
### Example SSE server
|
|
654
|
-
|
|
655
|
-
```json
|
|
656
|
-
{
|
|
657
|
-
"mcpServers": {
|
|
658
|
-
"legacy": {
|
|
659
|
-
"type": "sse",
|
|
660
|
-
"url": "https://example.com/sse",
|
|
661
|
-
"headers": {
|
|
662
|
-
"Authorization": "Bearer token"
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
```
|
|
668
|
-
|
|
669
|
-
## MCP Notes
|
|
670
|
-
|
|
671
|
-
- MCP server `instructions` from the protocol `initialize` response are appended to Hooman's system prompt, after local `instructions.md` and session-specific prompt overrides.
|
|
672
|
-
- Hooman reads these instructions automatically from connected MCP servers when building the agent.
|
|
673
|
-
- Remote MCP OAuth helpers are available via:
|
|
674
|
-
- `hooman mcp auth <server>`
|
|
675
|
-
- `hooman mcp logout <server>`
|
|
676
|
-
- `hooman mcp auth-status`
|
|
677
|
-
- `hooman daemon` subscribes to MCP servers that advertise the experimental `hooman/channel` capability (always on; there is no opt-out flag).
|
|
678
|
-
- Hooman also reads `hooman/user`, `hooman/session`, and `hooman/thread` capability paths so daemon turns preserve origin metadata from the source channel.
|
|
679
|
-
- When a matching notification is received, Hooman uses `params.content` as the prompt if it is a string; otherwise it JSON-stringifies the notification params and sends that to the agent.
|
|
680
|
-
- Daemon mode processes notifications sequentially and reuses the same agent session over time.
|
|
681
|
-
- Tool calls from daemon turns are no longer blanket auto-approved: if the originating MCP server supports `hooman/channel/permission`, Hooman relays a remote approval request back to that source; otherwise the tool call is denied.
|
|
682
|
-
- `exec`, `chat`, and `daemon` accept `--yolo` to bypass those approval paths and allow all tools without prompting or relay.
|
|
683
|
-
|
|
684
|
-
## Skills
|
|
685
|
-
|
|
686
|
-
Skills are installed under:
|
|
687
|
-
|
|
688
|
-
```text
|
|
689
|
-
~/.hooman/skills
|
|
690
|
-
```
|
|
691
|
-
|
|
692
|
-
At runtime, Hooman uses the Strands `AgentSkills` plugin to load:
|
|
693
|
-
|
|
694
|
-
- bundled built-in skills shipped with Hooman
|
|
695
|
-
- user-installed skills under `~/.hooman/skills`
|
|
40
|
+
## Features
|
|
696
41
|
|
|
697
|
-
|
|
42
|
+
- Multiple LLM providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `minimax`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai` — see [Models](https://vaibhavpandey.com/hooman/guides/configuration/models/)
|
|
43
|
+
- MCP server support (`stdio`, `streamable-http`, `sse`) with OAuth (DCR + CIMD) and channel-driven automation via `hooman daemon` — see [MCP](https://vaibhavpandey.com/hooman/guides/mcp/)
|
|
44
|
+
- Runtime [Skills](https://vaibhavpandey.com/hooman/guides/skills/): bundled built-ins plus a local `~/.hooman/skills` catalog
|
|
45
|
+
- Built-in read-only subagents, a ripgrep-backed `grep` tool, and an `ask_user` tool for mid-task questions — see [Tools](https://vaibhavpandey.com/hooman/guides/tools/)
|
|
46
|
+
- Context-window utilization and session-cost tracking backed by [models.dev](https://models.dev), shown live in every surface
|
|
47
|
+
- Interactive terminal UI for chat and configuration, plus a native [VS Code chat panel](https://vaibhavpandey.com/hooman/guides/vscode/)
|
|
698
48
|
|
|
699
|
-
|
|
49
|
+
See the [full documentation](https://vaibhavpandey.com/hooman/) for CLI commands, configuration layout, provider setup, and more.
|
|
700
50
|
|
|
701
|
-
|
|
51
|
+
## Related
|
|
702
52
|
|
|
703
|
-
|
|
704
|
-
- install a skill from a source string, repo, URL, or local path
|
|
705
|
-
- refresh installed skills
|
|
706
|
-
- remove installed skills with confirmation
|
|
53
|
+
**Looking for a focused web UI** for chat and agent configuration with a lighter surface on top of the same stack? See [**Zero**](https://github.com/vaibhavpandeyvpz/zero) — [README](https://github.com/vaibhavpandeyvpz/zero#readme).
|
|
707
54
|
|
|
708
55
|
## Development
|
|
709
56
|
|
|
710
|
-
Install dependencies:
|
|
711
|
-
|
|
712
57
|
```bash
|
|
713
58
|
npm install
|
|
59
|
+
npm run dev -- --help # run the CLI with tsx
|
|
60
|
+
npm run typecheck # tsc --noEmit
|
|
61
|
+
npm run build # tsc + copy bundled assets to dist/
|
|
714
62
|
```
|
|
715
63
|
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
```bash
|
|
719
|
-
npm run dev -- --help
|
|
720
|
-
```
|
|
721
|
-
|
|
722
|
-
Run typecheck:
|
|
723
|
-
|
|
724
|
-
```bash
|
|
725
|
-
npm run typecheck
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
Build the project:
|
|
729
|
-
|
|
730
|
-
```bash
|
|
731
|
-
npm run build
|
|
732
|
-
```
|
|
733
|
-
|
|
734
|
-
After making any code change, run both verification steps:
|
|
735
|
-
|
|
736
|
-
```bash
|
|
737
|
-
npm run typecheck
|
|
738
|
-
npm run build
|
|
739
|
-
```
|
|
64
|
+
After making any code change, run both `npm run typecheck` and `npm run build`. See [`AGENTS.md`](AGENTS.md) for the full repository layout and contributor notes, and [Development](https://vaibhavpandey.com/hooman/development/) in the docs for the release workflow.
|
|
740
65
|
|
|
741
66
|
## License
|
|
742
67
|
|
|
743
|
-
MIT. See `LICENSE
|
|
68
|
+
MIT. See [`LICENSE`](LICENSE).
|