hoomanjs 1.40.2 → 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.
Files changed (160) hide show
  1. package/README.md +27 -655
  2. package/dist/acp/acp-agent.d.ts +16 -3
  3. package/dist/acp/acp-agent.js +369 -172
  4. package/dist/acp/acp-agent.js.map +1 -1
  5. package/dist/acp/commands.d.ts +6 -3
  6. package/dist/acp/commands.js +6 -24
  7. package/dist/acp/commands.js.map +1 -1
  8. package/dist/acp/meta/vscode.d.ts +10 -0
  9. package/dist/acp/meta/vscode.js +16 -0
  10. package/dist/acp/meta/vscode.js.map +1 -0
  11. package/dist/acp/questions.d.ts +18 -0
  12. package/dist/acp/questions.js +80 -0
  13. package/dist/acp/questions.js.map +1 -0
  14. package/dist/acp/session-config.d.ts +3 -1
  15. package/dist/acp/session-config.js +20 -8
  16. package/dist/acp/session-config.js.map +1 -1
  17. package/dist/acp/sessions/replay.js +117 -1
  18. package/dist/acp/sessions/replay.js.map +1 -1
  19. package/dist/acp/sessions/store.d.ts +55 -16
  20. package/dist/acp/sessions/store.js +174 -71
  21. package/dist/acp/sessions/store.js.map +1 -1
  22. package/dist/acp/utils/tool-kind.js +1 -0
  23. package/dist/acp/utils/tool-kind.js.map +1 -1
  24. package/dist/acp/utils/tool-result-content.d.ts +1 -0
  25. package/dist/acp/utils/tool-result-content.js +28 -1
  26. package/dist/acp/utils/tool-result-content.js.map +1 -1
  27. package/dist/chat/app.d.ts +3 -1
  28. package/dist/chat/app.js +84 -43
  29. package/dist/chat/app.js.map +1 -1
  30. package/dist/chat/components/BottomChrome.d.ts +12 -3
  31. package/dist/chat/components/BottomChrome.js +2 -2
  32. package/dist/chat/components/BottomChrome.js.map +1 -1
  33. package/dist/chat/components/ChromePicker.d.ts +5 -1
  34. package/dist/chat/components/ChromePicker.js +6 -2
  35. package/dist/chat/components/ChromePicker.js.map +1 -1
  36. package/dist/chat/components/QuestionPrompt.d.ts +8 -0
  37. package/dist/chat/components/QuestionPrompt.js +41 -0
  38. package/dist/chat/components/QuestionPrompt.js.map +1 -0
  39. package/dist/chat/components/StatusBar.d.ts +8 -3
  40. package/dist/chat/components/StatusBar.js +55 -26
  41. package/dist/chat/components/StatusBar.js.map +1 -1
  42. package/dist/chat/index.d.ts +2 -0
  43. package/dist/chat/index.js +1 -1
  44. package/dist/chat/index.js.map +1 -1
  45. package/dist/chat/questions.d.ts +24 -0
  46. package/dist/chat/questions.js +71 -0
  47. package/dist/chat/questions.js.map +1 -0
  48. package/dist/cli.js +11 -0
  49. package/dist/cli.js.map +1 -1
  50. package/dist/core/agent/index.d.ts +3 -0
  51. package/dist/core/agent/index.js +11 -11
  52. package/dist/core/agent/index.js.map +1 -1
  53. package/dist/core/agent/prompt-cache-plugin.d.ts +1 -1
  54. package/dist/core/agent/prompt-cache-plugin.js +1 -1
  55. package/dist/core/agent/session-title-plugin.d.ts +27 -0
  56. package/dist/core/agent/session-title-plugin.js +77 -0
  57. package/dist/core/agent/session-title-plugin.js.map +1 -0
  58. package/dist/core/config.d.ts +33 -1
  59. package/dist/core/config.js +2 -0
  60. package/dist/core/config.js.map +1 -1
  61. package/dist/core/index.d.ts +12 -0
  62. package/dist/core/index.js +7 -2
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/mcp/index.d.ts +3 -3
  65. package/dist/core/mcp/index.js +2 -2
  66. package/dist/core/mcp/index.js.map +1 -1
  67. package/dist/core/mcp/manager.d.ts +28 -0
  68. package/dist/core/mcp/manager.js +171 -2
  69. package/dist/core/mcp/manager.js.map +1 -1
  70. package/dist/core/models/anthropic.d.ts +4 -3
  71. package/dist/core/models/anthropic.js.map +1 -1
  72. package/dist/core/models/azure.js +5 -1
  73. package/dist/core/models/azure.js.map +1 -1
  74. package/dist/core/models/groq.js +5 -1
  75. package/dist/core/models/groq.js.map +1 -1
  76. package/dist/core/models/minimax.d.ts +2 -1
  77. package/dist/core/models/minimax.js +49 -7
  78. package/dist/core/models/minimax.js.map +1 -1
  79. package/dist/core/models/moonshot.js +5 -1
  80. package/dist/core/models/moonshot.js.map +1 -1
  81. package/dist/core/models/openai.js +6 -1
  82. package/dist/core/models/openai.js.map +1 -1
  83. package/dist/core/models/openrouter.js +5 -1
  84. package/dist/core/models/openrouter.js.map +1 -1
  85. package/dist/core/models/types.d.ts +54 -6
  86. package/dist/core/models/types.js +18 -2
  87. package/dist/core/models/types.js.map +1 -1
  88. package/dist/core/models/usage.d.ts +10 -0
  89. package/dist/core/models/usage.js +45 -0
  90. package/dist/core/models/usage.js.map +1 -0
  91. package/dist/core/models/xai.js +5 -1
  92. package/dist/core/models/xai.js.map +1 -1
  93. package/dist/core/modes/definitions.js +2 -0
  94. package/dist/core/modes/definitions.js.map +1 -1
  95. package/dist/core/prompts/environment.d.ts +10 -1
  96. package/dist/core/prompts/environment.js +15 -1
  97. package/dist/core/prompts/environment.js.map +1 -1
  98. package/dist/core/prompts/static/ask-user.md +7 -0
  99. package/dist/core/prompts/static/environment.md +2 -1
  100. package/dist/core/prompts/static/filesystem.md +1 -1
  101. package/dist/core/prompts/static/web-search.md +1 -1
  102. package/dist/core/prompts/system.d.ts +6 -0
  103. package/dist/core/prompts/system.js +12 -1
  104. package/dist/core/prompts/system.js.map +1 -1
  105. package/dist/core/sessions/generate-title.d.ts +10 -0
  106. package/dist/core/sessions/generate-title.js +113 -0
  107. package/dist/core/sessions/generate-title.js.map +1 -0
  108. package/dist/core/sessions/list-cli-sessions.js +13 -1
  109. package/dist/core/sessions/list-cli-sessions.js.map +1 -1
  110. package/dist/core/skills/built-in/hooman-config/providers.md +17 -0
  111. package/dist/core/skills/built-in/hooman-mcp/SKILL.md +20 -0
  112. package/dist/core/skills/built-in/hooman-skills/SKILL.md +1 -1
  113. package/dist/core/state/session-title.d.ts +17 -0
  114. package/dist/core/state/session-title.js +15 -0
  115. package/dist/core/state/session-title.js.map +1 -0
  116. package/dist/core/state/tool-approvals.js +3 -0
  117. package/dist/core/state/tool-approvals.js.map +1 -1
  118. package/dist/core/tools/ask-user.d.ts +46 -0
  119. package/dist/core/tools/ask-user.js +66 -0
  120. package/dist/core/tools/ask-user.js.map +1 -0
  121. package/dist/core/tools/filesystem.d.ts +26 -1
  122. package/dist/core/tools/filesystem.js +44 -23
  123. package/dist/core/tools/filesystem.js.map +1 -1
  124. package/dist/core/tools/index.d.ts +1 -0
  125. package/dist/core/tools/index.js +1 -0
  126. package/dist/core/tools/index.js.map +1 -1
  127. package/dist/core/tools/shell.d.ts +41 -0
  128. package/dist/core/tools/shell.js +8 -1
  129. package/dist/core/tools/shell.js.map +1 -1
  130. package/dist/core/tools/time.js +1 -1
  131. package/dist/core/tools/time.js.map +1 -1
  132. package/dist/core/utils/billing.d.ts +49 -0
  133. package/dist/core/utils/billing.js +295 -0
  134. package/dist/core/utils/billing.js.map +1 -0
  135. package/dist/core/utils/edit-replace.d.ts +6 -0
  136. package/dist/core/utils/edit-replace.js +88 -6
  137. package/dist/core/utils/edit-replace.js.map +1 -1
  138. package/dist/core/utils/paths.d.ts +1 -0
  139. package/dist/core/utils/paths.js +1 -0
  140. package/dist/core/utils/paths.js.map +1 -1
  141. package/dist/core/{models → utils}/reasoning-effort.d.ts +9 -0
  142. package/dist/core/utils/reasoning-effort.js.map +1 -0
  143. package/dist/daemon/questions.d.ts +18 -0
  144. package/dist/daemon/questions.js +44 -0
  145. package/dist/daemon/questions.js.map +1 -0
  146. package/dist/exec/questions.d.ts +9 -0
  147. package/dist/exec/questions.js +50 -0
  148. package/dist/exec/questions.js.map +1 -0
  149. package/dist/index.d.ts +7 -6
  150. package/dist/index.js +6 -5
  151. package/dist/index.js.map +1 -1
  152. package/package.json +3 -2
  153. package/dist/core/models/reasoning-effort.js.map +0 -1
  154. package/dist/core/tools/terminal-backend.d.ts +0 -41
  155. package/dist/core/tools/terminal-backend.js +0 -9
  156. package/dist/core/tools/terminal-backend.js.map +0 -1
  157. package/dist/core/tools/text-fs-backend.d.ts +0 -25
  158. package/dist/core/tools/text-fs-backend.js +0 -9
  159. package/dist/core/tools/text-fs-backend.js.map +0 -1
  160. /package/dist/core/{models → utils}/reasoning-effort.js +0 -0
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  <div align="center">
2
+ <img src=".github/logo.svg" alt="Hooman logo" width="128" />
2
3
  <h1>Hooman</h1>
3
4
  <p>
4
- 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>.
5
6
  </p>
6
7
  <p>
7
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>
@@ -14,683 +15,54 @@
14
15
  <p>
15
16
  <img src=".github/screenshot.png" alt="Hooman screenshot" />
16
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>
17
23
  </div>
18
24
 
19
- It gives you a practical toolkit to build and run agent workflows:
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`.
20
26
 
21
27
  - a one-shot `exec` command for single prompts
22
- - 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
23
29
  - a `daemon` command for channel-driven MCP automation
24
- - an in-chat `/config` workflow (Ink-powered) for general settings, models, MCP servers, and installed skills
25
- - an `acp` command for running Hooman as an Agent Client Protocol (ACP) agent over stdio
26
-
27
- ## Related
28
-
29
- **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).
30
-
31
- ## Features
32
-
33
- - Multiple LLM providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `minimax`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai`
34
- - Local configuration under `~/.hooman`
35
- - Optional web search tool with provider selection (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
36
- - MCP server support via `stdio`, `streamable-http`, and `sse`
37
- - MCP server `instructions` support: server-provided instructions are appended to the agent system prompt
38
- - MCP channel notifications: `hooman daemon` subscribes to servers that advertise `hooman/channel`
39
- - Runtime skills via Strands `AgentSkills`, loading bundled built-in skills plus local `~/.hooman/skills`
40
- - Bundled prompt harness toggles (`behaviour`, `communication`, `execution`, `guardrails`); coding guidance ships as the built-in `hooman-coding` skill
41
- - Built-in read-only subagent tools (`subagent_research`, `subagent_review`, `subagent_test_investigator`)
42
- - Built-in `grep` tool backed by ripgrep (`rg`), with runtime bootstrap when `rg` is not available on PATH
43
- - Toolkit-oriented architecture with configurable tools, prompts, and transports
44
- - 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)
45
31
 
46
- ## Requirements
47
-
48
- - [Node.js](https://nodejs.org) `>= 24`
49
- - npm for package installs and JavaScript tooling
50
- - Provider credentials or local model runtime depending on the LLM you choose
51
-
52
- ## Usage
53
-
54
- Fastest way to get started without cloning the repo:
32
+ ## Quick start
55
33
 
56
34
  ```bash
57
35
  npx hoomanjs
58
-
59
- # or install globally
60
- npm i -g hoomanjs
61
- ```
62
-
63
- Or with Bun:
64
-
65
- ```bash
66
- bunx hoomanjs
67
- ```
68
-
69
- Recommended first run:
70
-
71
- 1. Start chatting with `hooman` (same as `hooman chat`).
72
- 2. Run `/config` in chat to choose your LLM provider and model, and to manage MCP servers and skills.
73
- 3. Use `hooman exec "your prompt"` for one-off tasks.
74
-
75
- ## Must have
76
-
77
- For the best experience, set up both:
78
-
79
- 1. **MCP servers** for on-demand tools in `chat` / `exec` (task APIs, messaging, schedulers, etc.).
80
- 2. **MCP channels** for event-driven automation with `hooman daemon` (notifications become agent prompts).
81
-
82
- Suggested MCP servers from this ecosystem:
83
-
84
- - [`cronmcp`](https://github.com/vaibhavpandeyvpz/cronmcp) - lets Hooman schedule recurring prompts and automations, so routine checks and follow-ups run on time.
85
- - [`jiraxmcp`](https://github.com/vaibhavpandeyvpz/jiraxmcp) - gives Hooman direct Jira Cloud access to search issues, update tickets, and help drive sprint workflows.
86
- - [`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.
87
- - [`tgfmcp`](https://github.com/vaibhavpandeyvpz/tgfmcp) - enables Telegram bot workflows, making it easy to route notifications and respond from agent-driven chats.
88
- - [`wappmcp`](https://github.com/vaibhavpandeyvpz/wappmcp) - brings WhatsApp Web messaging into Hooman for customer or team communication automations.
89
-
90
- For production deployments, still review permissions and use least-privilege credentials/tokens for each integration.
91
-
92
- ## Install
93
-
94
- ```bash
95
- npm install
96
- ```
97
-
98
- Run locally:
99
-
100
- ```bash
101
- npm run dev -- --help
102
- ```
103
-
104
- Or use the dev alias:
105
-
106
- ```bash
107
- npm run build
108
- node dist/cli.js --help
109
- ```
110
-
111
- Link the CLI locally:
112
-
113
- ```bash
114
- npm link
115
- hooman --help
116
- ```
117
-
118
- ## Commands
119
-
120
- ### `hooman exec`
121
-
122
- Run a single prompt once.
123
-
124
- ```bash
125
- hooman exec "Summarize the current repository"
126
- ```
127
-
128
- Use a specific session id:
129
-
130
- ```bash
131
- hooman exec "What changed?" --session my-session
132
- ```
133
-
134
- Skip interactive tool approval (allows every tool call; use only when you trust the prompt and environment):
135
-
136
- ```bash
137
- hooman exec "Summarize this repo" --yolo
138
- ```
139
-
140
- Start in **ask** mode (narrower tool surface, no plan lifecycle tools; see [Session mode](#session-mode)):
141
-
142
- ```bash
143
- hooman exec "Map the architecture" --mode ask
144
- ```
145
-
146
- ### `hooman chat`
147
-
148
- Start an interactive stateful chat session.
149
-
150
- ```bash
151
- hooman
152
- ```
153
-
154
- Equivalent explicit form:
155
-
156
- ```bash
157
- hooman chat
158
- ```
159
-
160
- Optional initial prompt:
161
-
162
- ```bash
163
- hooman chat "Help me prioritize the next task"
164
- ```
165
-
166
- Resume or pin a session id:
167
-
168
- ```bash
169
- hooman chat --session my-session
170
- ```
171
-
172
- Skip the in-chat tool approval UI (same semantics as `exec --yolo`):
173
-
174
- ```bash
175
- hooman chat --yolo
176
- ```
177
-
178
- Start in ask mode:
179
-
180
- ```bash
181
- hooman chat --mode ask
182
- ```
183
-
184
- ### Chat commands
185
-
186
- Inside an interactive `chat` session, type `/` to discover slash commands:
187
-
188
- - `/model` - pick or set the chat model for this session.
189
- - `/mode` - switch the session mode (`agent`, `ask`, `plan`); see [Session mode](#session-mode).
190
- - `/yolo` - toggle auto-approve of tool calls (`on` / `off`).
191
- - `/init` - generate or refresh `AGENTS.md` for the current project.
192
- - `/compact` - compact the conversation history now and persist the result.
193
- - `/new` - start a fresh chat session.
194
- - `/config` - launch the configuration workflow (see below).
195
-
196
- ### Session mode
197
-
198
- `exec`, `chat`, and `daemon` accept **`-m` / `--mode`** with:
199
-
200
- - **`agent`** (default): normal tool surface and approvals.
201
- - **`plan`**: planning workflow with a reduced tool surface plus `enter_plan_mode` / `exit_plan_mode`.
202
- - **`ask`**: read-oriented, narrower surface (similar to interactive **plan** mode) but **without** `enter_plan_mode` / `exit_plan_mode`.
203
-
204
- In **`chat`**, `/mode` can switch between **agent**, **ask**, and **plan**. **ACP** sessions can set `hooman.sessionMode` to `agent`, `plan`, or `ask`.
205
-
206
- ### `hooman daemon`
207
-
208
- 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.
209
-
210
- ```bash
211
- hooman daemon
212
- ```
213
-
214
- Resume or pin a session id:
215
-
216
- ```bash
217
- hooman daemon --session my-daemon
218
- ```
219
-
220
- Skip remote channel permission relay and allow every tool call from daemon turns (same risk profile as `exec` / `chat` with `--yolo`):
221
-
222
- ```bash
223
- hooman daemon --yolo
224
- ```
225
-
226
- Optional `--mode ask` matches `exec` / `chat` (narrow surface without plan lifecycle tools).
227
-
228
- Log raw notification payloads:
229
-
230
- ```bash
231
- hooman daemon --debug
232
- ```
233
-
234
- ### `hooman config`
235
-
236
- Print the effective runtime `config.json` for the current working directory in
237
- the same shape as `config.json`, with credential-like values redacted.
238
-
239
- ```bash
240
- hooman config
241
36
  ```
242
37
 
243
- ### Feature Flags
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/).
244
39
 
245
- Runtime tool and prompt switches are controlled from `config.json`:
246
-
247
- - `search.enabled`
248
- - `search.provider` (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
249
- - `search.brave.apiKey`
250
- - `search.exa.apiKey`
251
- - `search.firecrawl.apiKey`
252
- - `search.serper.apiKey`
253
- - `search.tavily.apiKey`
254
- - `prompts.behaviour`
255
- - `prompts.communication`
256
- - `prompts.execution`
257
- - `prompts.guardrails`
258
- - `tools.todo.enabled`
259
- - `tools.fetch.enabled`
260
- - `tools.filesystem.enabled`
261
- - `tools.shell.enabled`
262
- - `tools.sleep.enabled`
263
- - `tools.subagents.enabled` (enables built-in subagent tools)
264
-
265
- ### `/config`
266
-
267
- 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.
268
-
269
- ```text
270
- /config
271
- ```
272
-
273
- The configuration UI currently lets you:
274
-
275
- - manage general settings such as name, prompts, tools, and compaction
276
- - manage models and providers with field-by-field editors
277
- - choose search provider and set its API key
278
- - toggle bundled harness prompts (`behaviour`, `communication`, `execution`, `guardrails`)
279
- - edit `instructions.md` in your `$VISUAL` / `$EDITOR` (cross-platform fallback included)
280
- - add, edit, and delete MCP servers with field-by-field editors and confirmation
281
- - search, install, refresh, and remove skills
282
-
283
- ### `hooman acp`
284
-
285
- Run Hooman as an Agent Client Protocol (ACP) agent over stdio.
286
-
287
- ```bash
288
- hooman acp
289
- ```
290
-
291
- ACP notes:
292
-
293
- - ACP sessions are stored under the active project's session directory in `sessions/acp/` (see [Configuration Layout](#configuration-layout))
294
- - ACP loads MCP servers passed on `session/new` and `session/load`, in addition to Hooman's local `mcp.json`
295
- - ACP `session/new` and `session/load` support `_meta.userId`
296
- - session configuration includes `hooman.sessionMode` (`agent`, `plan`, or `ask`); see [Session mode](#session-mode)
297
-
298
- ## Configuration Layout
299
-
300
- Hooman stores its data in:
301
-
302
- ```text
303
- ~/.hooman/
304
- ```
305
-
306
- Important files and folders:
307
-
308
- - `config.json` - app name, reusable provider configs, model configs, tool flags, and compaction
309
- - `instructions.md` - system instructions used to build the agent prompt
310
- - `mcp.json` - MCP server definitions
311
- - `skills/` - installed skills
312
- - `bin/` - runtime-managed helper binaries (including bootstrapped `rg` for the `grep` tool when system `rg` is unavailable)
313
- - `cache/` - runtime caches used by tools and subsystems
314
- - `projects.json` - registry mapping each project root to a stable UUID
315
- - `projects/<uuid>/` - per-project storage, scoped to the project (git root, falling back to cwd) the session runs in:
316
- - `sessions/` - persisted session data (including ACP sessions under `sessions/acp/` and offloaded tool output under `sessions/offloaded-content/`)
317
- - `memory/` - durable extracted memory store
318
- - `attachments/` - saved attachments (e.g. clipboard images)
319
- - `plans/` - plan-mode markdown documents
320
-
321
- ### Project-scoped storage
322
-
323
- `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).
324
-
325
- ### Repo-local runtime overlays
326
-
327
- At runtime, Hooman resolves configuration in this order:
328
-
329
- 1. `~/.hooman/config.json` and `~/.hooman/mcp.json`
330
- 2. `<git-root>/.hooman/config.json` and `<git-root>/.hooman/mcp.json` (if present)
331
- 3. matching `.hooman/config.json` and `.hooman/mcp.json` files in nested directories from git root to current working directory
332
-
333
- Nearest files win when keys overlap.
334
-
335
- For app config (`config.json`):
336
-
337
- - plain objects are deep-merged
338
- - scalar values are overridden by the nearest file
339
- - `providers` and `llms` are merged by `name` (nearest entry with the same name replaces inherited entries)
340
-
341
- For MCP config (`mcp.json`):
342
-
343
- - `mcpServers` is merged by server name (nearest entry with the same name wins)
344
-
345
- Notes:
346
-
347
- - Runtime overlays apply to `chat`, `exec`, `daemon`, and `acp` bootstraps.
348
- - `hooman config` prints only the merged effective `config.json` shape with credential-like values redacted.
349
- - The `/config` UI and `hooman mcp auth/logout/auth-status` still target home config (`~/.hooman/*`) directly.
350
- - Keep secrets in home config unless you explicitly want project-scoped credentials.
351
-
352
- `grep` tool binary resolution order:
353
-
354
- 1. Use system `rg` when available.
355
- 2. Else use cached `~/.hooman/bin/rg` (or `rg.exe` on Windows).
356
- 3. Else download and verify a platform-specific ripgrep release into `~/.hooman/bin/`.
357
-
358
- ## Example `config.json`
359
-
360
- 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.
361
-
362
- ```json
363
- {
364
- "name": "Hooman",
365
- "providers": [
366
- {
367
- "name": "Ollama",
368
- "provider": "ollama",
369
- "options": {}
370
- }
371
- ],
372
- "llms": [
373
- {
374
- "name": "Default",
375
- "provider": "Ollama",
376
- "options": {
377
- "model": "gemma4:e4b"
378
- },
379
- "default": true
380
- }
381
- ],
382
- "search": {
383
- "enabled": false,
384
- "provider": "brave",
385
- "brave": {},
386
- "exa": {},
387
- "firecrawl": {},
388
- "serper": {},
389
- "tavily": {}
390
- },
391
- "prompts": {
392
- "behaviour": true,
393
- "communication": true,
394
- "execution": true,
395
- "guardrails": true
396
- },
397
- "tools": {
398
- "todo": { "enabled": true },
399
- "fetch": { "enabled": true },
400
- "filesystem": { "enabled": true },
401
- "shell": { "enabled": true },
402
- "sleep": { "enabled": true },
403
- "subagents": { "enabled": true }
404
- },
405
- "compaction": {
406
- "ratio": 0.75,
407
- "keep": 5
408
- }
409
- }
410
- ```
411
-
412
- Tool approvals are session-scoped and are not persisted in `config.json`.
413
-
414
- Hooman enables Strands `ContextOffloader` by default with file-backed storage under the project-scoped `~/.hooman/projects/<uuid>/sessions/offloaded-content`, so large tool results can be previewed in-context and retrieved later without bloating the active conversation window.
415
-
416
- Supported `providers[].provider` values registered in this release (see `src/core/models/index.ts`):
417
-
418
- - `anthropic`
419
- - `azure`
420
- - `bedrock`
421
- - `google`
422
- - `groq`
423
- - `minimax`
424
- - `moonshot`
425
- - `ollama`
426
- - `openai`
427
- - `openrouter`
428
- - `xai`
429
-
430
- Supported `search.provider` values:
431
-
432
- - `brave`
433
- - `exa`
434
- - `firecrawl`
435
- - `serper`
436
- - `tavily`
437
-
438
- ## Provider Notes
439
-
440
- Provider entries now look like:
441
-
442
- ```json
443
- {
444
- "name": "MiniMax",
445
- "provider": "minimax",
446
- "options": {
447
- "apiKey": "..."
448
- }
449
- }
450
- ```
451
-
452
- LLM entries reference a provider by name and carry normalized model options:
453
-
454
- ```json
455
- {
456
- "name": "MiniMax M3",
457
- "provider": "MiniMax",
458
- "options": {
459
- "model": "MiniMax-M3",
460
- "temperature": 1,
461
- "maxTokens": 4096
462
- },
463
- "default": true
464
- }
465
- ```
466
-
467
- Supported provider option fields:
468
-
469
- 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.
470
-
471
- - `anthropic`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
472
- - `azure`: optional `resourceName`, optional `baseURL`, optional `apiKey`, optional `headers`, optional `apiVersion`, optional `useDeploymentBasedUrls`, optional `reasoning`
473
- - `bedrock`: `region`, `accessKeyId`, `secretAccessKey`, optional `sessionToken`, optional `apiKey`, optional `reasoning`
474
- - `google`: `apiKey`, optional `reasoning`
475
- - `groq`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
476
- - `minimax`: `apiKey`, optional `headers`, optional `reasoning`
477
- - `moonshot`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
478
- - `ollama`: optional `baseURL`, optional `reasoning`
479
- - `openai`: `apiKey`, optional `baseURL`, optional `headers`, optional `api` (`"responses"` (default) or `"chat"`), optional `reasoning`
480
- - `openrouter`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
481
- - `xai`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
482
-
483
- Normalized LLM option fields:
484
-
485
- - `model`
486
- - optional `temperature`
487
- - optional `maxTokens`
488
-
489
- Notes:
490
-
491
- - Google maps normalized `maxTokens` to the SDK's `maxOutputTokens` internally.
492
- - 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.
493
- - Ollama maps normalized `temperature` into Ollama `options.temperature`.
494
- - MiniMax uses the Anthropic-compatible endpoint `https://api.minimax.io/anthropic` automatically.
495
- - 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.
496
- - 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.
497
- - 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.
498
- - `reasoning.display` is for Bedrock Claude (Opus 4.7+ hide reasoning by default) and MiniMax; the native Anthropic API rejects it.
499
- - Bedrock can rely on the AWS default credential chain when explicit credentials are not provided.
500
-
501
- ## MCP Configuration
502
-
503
- Detailed design notes for planned OAuth-enabled remote MCP support live in [docs/mcp-oauth-design.md](docs/mcp-oauth-design.md).
504
-
505
- `mcp.json` is stored as:
506
-
507
- ```json
508
- {
509
- "mcpServers": {}
510
- }
511
- ```
512
-
513
- 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.
514
-
515
- ### Example stdio server
516
-
517
- ```json
518
- {
519
- "mcpServers": {
520
- "filesystem": {
521
- "type": "stdio",
522
- "command": "npx",
523
- "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
524
- "env": {
525
- "EXAMPLE": "1"
526
- },
527
- "cwd": "/tmp"
528
- }
529
- }
530
- }
531
- ```
532
-
533
- ### Example streamable HTTP server
534
-
535
- ```json
536
- {
537
- "mcpServers": {
538
- "remote": {
539
- "type": "streamable-http",
540
- "url": "https://example.com/mcp",
541
- "headers": {
542
- "Authorization": "Bearer token"
543
- }
544
- }
545
- }
546
- }
547
- ```
548
-
549
- ### Example OAuth-capable remote server
550
-
551
- ```json
552
- {
553
- "mcpServers": {
554
- "linear": {
555
- "type": "streamable-http",
556
- "url": "https://example.com/mcp",
557
- "oauth": {
558
- "enabled": true,
559
- "clientId": "optional-pre-registered-client",
560
- "scopes": ["read", "write"],
561
- "callbackPort": 19876
562
- }
563
- }
564
- }
565
- }
566
- ```
567
-
568
- ### How the client identity is established
569
-
570
- When authorizing a remote server, the MCP SDK needs a `client_id`. Hooman resolves one in this order:
571
-
572
- 1. **Pre-registered client** — if `oauth.clientId` (and optionally `clientSecret`) is set, it is used as-is and no registration happens.
573
- 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.
574
- 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.
575
-
576
- If a server supports none of these, authorization fails with `Incompatible auth server: does not support dynamic client registration` — supply a `clientId` or `clientMetadataUrl`.
577
-
578
- ### Hosting a CIMD document (GitHub Pages)
579
-
580
- 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`.
581
-
582
- Requirements when hosting your own:
583
-
584
- - The URL must be **HTTPS with a non-root path** (a bare domain is rejected).
585
- - The document's own `client_id` field must equal the hosted URL **exactly** (self-referential).
586
- - `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`).
587
- - `token_endpoint_auth_method` is `"none"` (public client — the document is public and holds no secrets).
588
-
589
- Override the default per server:
590
-
591
- ```json
592
- {
593
- "mcpServers": {
594
- "slack": {
595
- "type": "streamable-http",
596
- "url": "https://mcp.slack.com/mcp",
597
- "oauth": {
598
- "enabled": true,
599
- "clientMetadataUrl": "https://vaibhavpandey.com/hooman/oauth/client-metadata.json"
600
- }
601
- }
602
- }
603
- }
604
- ```
605
-
606
- ### Example SSE server
607
-
608
- ```json
609
- {
610
- "mcpServers": {
611
- "legacy": {
612
- "type": "sse",
613
- "url": "https://example.com/sse",
614
- "headers": {
615
- "Authorization": "Bearer token"
616
- }
617
- }
618
- }
619
- }
620
- ```
621
-
622
- ## MCP Notes
623
-
624
- - MCP server `instructions` from the protocol `initialize` response are appended to Hooman's system prompt, after local `instructions.md` and session-specific prompt overrides.
625
- - Hooman reads these instructions automatically from connected MCP servers when building the agent.
626
- - Remote MCP OAuth helpers are available via:
627
- - `hooman mcp auth <server>`
628
- - `hooman mcp logout <server>`
629
- - `hooman mcp auth-status`
630
- - `hooman daemon` subscribes to MCP servers that advertise the experimental `hooman/channel` capability (always on; there is no opt-out flag).
631
- - Hooman also reads `hooman/user`, `hooman/session`, and `hooman/thread` capability paths so daemon turns preserve origin metadata from the source channel.
632
- - 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.
633
- - Daemon mode processes notifications sequentially and reuses the same agent session over time.
634
- - 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.
635
- - `exec`, `chat`, and `daemon` accept `--yolo` to bypass those approval paths and allow all tools without prompting or relay.
636
-
637
- ## Skills
638
-
639
- Skills are installed under:
640
-
641
- ```text
642
- ~/.hooman/skills
643
- ```
644
-
645
- At runtime, Hooman uses the Strands `AgentSkills` plugin to load:
646
-
647
- - bundled built-in skills shipped with Hooman
648
- - user-installed skills under `~/.hooman/skills`
40
+ ## Features
649
41
 
650
- The local skills folder is treated as a parent directory of skill subdirectories, where each installed skill should live in its own folder containing `SKILL.md`.
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/)
651
48
 
652
- When a session starts, the plugin injects available skill metadata into the system prompt and exposes the `skills` tool so the model can activate a skill and load its full instructions on demand.
49
+ See the [full documentation](https://vaibhavpandey.com/hooman/) for CLI commands, configuration layout, provider setup, and more.
653
50
 
654
- The `/config` workflow can:
51
+ ## Related
655
52
 
656
- - search the public skills catalog
657
- - install a skill from a source string, repo, URL, or local path
658
- - refresh installed skills
659
- - 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).
660
54
 
661
55
  ## Development
662
56
 
663
- Install dependencies:
664
-
665
57
  ```bash
666
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/
667
62
  ```
668
63
 
669
- Run the CLI:
670
-
671
- ```bash
672
- npm run dev -- --help
673
- ```
674
-
675
- Run typecheck:
676
-
677
- ```bash
678
- npm run typecheck
679
- ```
680
-
681
- Build the project:
682
-
683
- ```bash
684
- npm run build
685
- ```
686
-
687
- After making any code change, run both verification steps:
688
-
689
- ```bash
690
- npm run typecheck
691
- npm run build
692
- ```
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.
693
65
 
694
66
  ## License
695
67
 
696
- MIT. See `LICENSE`.
68
+ MIT. See [`LICENSE`](LICENSE).