@holt-os/holt 0.8.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +240 -7
  2. package/dist/cli.js +3993 -289
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -90,6 +90,7 @@ holt memory # stats for this folder
90
90
  holt memory facts # show the distilled facts (facts.md)
91
91
  holt memory search <query> # find remembered moments
92
92
  holt memory embed # embed older moments for semantic recall
93
+ holt memory global # share high-value facts across your folders
93
94
  holt memory clear # wipe this folder's memory
94
95
  ```
95
96
 
@@ -97,6 +98,30 @@ Turns saved before semantic memory was enabled are upgraded in one pass with `ho
97
98
 
98
99
  Long conversations stay cheap: only recent turns are replayed verbatim, older context comes back through recall.
99
100
 
101
+ ### Optional global memory (`holt memory global`)
102
+
103
+ By default every folder's memory is **isolated**: recall never crosses folders. If you want a folder to draw on what you learned elsewhere, opt it into a shared store:
104
+
105
+ ```bash
106
+ holt memory global on # this folder now contributes + reads shared facts
107
+ holt memory global status # who is sharing, and global store stats
108
+ holt memory global off # stop sharing + reading (recall goes local-only)
109
+ holt memory global off --purge # also delete this folder's rows from the store
110
+ ```
111
+
112
+ What opting in does:
113
+
114
+ - **Facts only.** Only distilled facts (the `fact` rows, which includes wiki pages) are promoted, never raw turns. Each promoted fact is **tagged with the absolute path of the folder it came from**, so you always know its origin.
115
+ - **One switch = contribute + read.** An opted-in folder both pushes its facts to the shared store and, during recall, also scores the shared store and merges the hits, so `holt memory search` and chat recall surface knowledge from your *other* opted-in folders. Your own folder's rows are excluded from the global read (they are already in local memory, so there is no double counting). Global hits are shown tagged with their source folder.
116
+ - **`on` backfills** the folder's existing facts, then new facts mirror automatically. Saving the same fact twice does not duplicate it (dedup by normalized content + folder).
117
+
118
+ Everything lives outside your projects, so a folder that never opts in is completely unaffected:
119
+
120
+ - **Store:** `~/.holt/global/turns.jsonl`, one row per promoted fact plus a `workspace` field.
121
+ - **Registry:** `~/.holt/memory-scopes.json`, shape `{ "enabled": ["<abs folder path>", ...] }`. This is the whole list of folders that participate. Per-folder `config.json` is not touched.
122
+
123
+ A missing or corrupt global store degrades silently to local-only recall. Per-folder isolation stays the default.
124
+
100
125
  ## Brains
101
126
 
102
127
  A brain is an agent CLI installed and logged in on your machine. No API keys to paste.
@@ -122,7 +147,60 @@ A brain can also be a direct provider connection: no CLI install, your own key.
122
147
  - Turns that mean similar things (when local embeddings exist) get a strong link.
123
148
  - Drag to pan, scroll to zoom, click a turn to read it in full, click a concept to light up its turns, and search to highlight matching memory live.
124
149
 
125
- Options: `--out <path>` to write elsewhere, `--no-open` to skip the browser.
150
+ Options: `--out <path>` to write elsewhere, `--no-open` to skip the browser. When a wiki exists (see below), the graph auto-includes wiki pages as green nodes wired by their `[[links]]`; force it on or off with `--wiki` / `--no-wiki`. This is the graph as a view over your wiki.
151
+
152
+ ### Richer graph: code, docs, and communities
153
+
154
+ Plain `holt graph` is unchanged: it draws this folder's memory (plus the wiki when one exists). To also see the folder's *own source and docs* as a graph, opt in with flags:
155
+
156
+ - `holt graph --code` walks the folder and adds a node per source file (orange), with dependency edges from the imports it can resolve.
157
+ - `holt graph --docs` adds a node per doc (blue: `.md` / `.mdx` / `.txt` / `.rst`), with edges from Markdown links and `[[wikilinks]]` between them.
158
+ - `holt graph --all` does both. All three still render the memory + wiki graph too, so code, docs, and memory sit in one picture.
159
+
160
+ **What gets ingested.** The walk skips `node_modules`, `.git`, `.holt`, `dist`, `build`, `.next`, `coverage`, other build/vendor dirs, and any dotfolder. It caps out at 2000 files and 400KB per file for safety, and logs what it skipped. Code files (`js`, `ts`, `jsx`, `tsx`, `mjs`, `cjs`, `py`, `go`, `rb`, `rs`, `java`, and more) become file nodes. Dependency edges are best-effort per language: for JS/TS it reads `import ... from`, `export ... from`, `require()`, and dynamic `import()`, resolving only *relative* specifiers (`./`, `../`) to files in the set (trying common extensions and `index.*`); bare/package imports (`react`, `node:fs`) are intentionally dropped. For Python it maps `import x` and `from x import ...` to local module files where they resolve. Unresolved imports are silently dropped, never fatal.
161
+
162
+ **Communities.** Once code or docs are ingested, Holt runs **label propagation** (a deterministic, zero-dependency community-detection algorithm) over the whole graph and tints each node's ring by its community, so tightly-coupled files cluster visibly. (Label propagation was chosen over Louvain because it is near-linear, trivially deterministic in stable node order, and keeps the code tiny.)
163
+
164
+ ### God-node report: `holt graph report`
165
+
166
+ `holt graph report` ingests this folder's code and docs, detects communities, and writes a `GRAPH_REPORT.md` (use `--out <path>` to write elsewhere). The report summarizes node / edge / community counts, lists the **god nodes** (highest-degree files: your core abstractions) with their community, and gives a per-community summary (size + representative files). It is safe on an empty folder (it says so, no crash). This is the graphify-grade view of a codebase, generated natively in TypeScript with zero dependencies.
167
+
168
+ ## Knowledge wiki: `holt wiki`
169
+
170
+ Memory has three layers, each derived from the one below it:
171
+
172
+ 1. **Raw turns** (`turns.jsonl`): every exchange, append-only, authoritative.
173
+ 2. **Facts** (`facts.md`): 1 to 5 durable facts distilled per session.
174
+ 3. **Wiki** (`.holt/wiki/`): a cross-linked set of Markdown pages, synthesized and maintained by an LLM. This is the "kept and connected" layer.
175
+
176
+ The core rule: **wiki pages are derived and regenerable, never a sole source of truth.** Turns and facts stay authoritative. Every page records which fact ids it drew from (frontmatter `sources:`), so `holt wiki rebuild` can regenerate the whole wiki from scratch. A bad synthesis is therefore never lossy: rebuild recovers it. Pages are plain Obsidian-compatible Markdown with `[[wikilinks]]` and an `index.md`, so you can point Obsidian at `.holt/wiki` as a vault, or edit pages by hand (a rebuild will overwrite hand-edits, so keep the folder under git if you edit).
177
+
178
+ ```bash
179
+ holt wiki # status: maintainer, model, auto-sync, page count, last sync, RAM hint
180
+ holt wiki sync # fold new facts into pages (route + merge)
181
+ holt wiki auto [on|off] # auto-sync the wiki when a session ends (wiki.autoSync)
182
+ holt wiki rebuild # wipe and regenerate every page from facts (asks first)
183
+ holt wiki lint [--fix] # audit for contradictions, duplicates, gaps; --fix applies the fixes
184
+ holt wiki list # list pages (title, updated, size)
185
+ holt wiki show <page> # print one page
186
+ holt wiki open # open the wiki in your default app (Obsidian reads it natively)
187
+ holt wiki setup # recommend a local model for this machine's RAM
188
+ ```
189
+
190
+ **How sync works.** `holt wiki sync` gathers facts added since the last sync (a marker in `.holt/wiki/.state.json`), embeds each one locally, and routes it to the nearest existing page by cosine similarity. Related facts land on the same page; a fact that matches nothing new starts a fresh page. Facts are grouped by target page and the maintainer is called **once per changed page** (not once per fact), so it only rewrites the few pages that actually changed. Routing is always local and free, which is what keeps the maintainer's cost minimal. `holt wiki rebuild` folds every fact from scratch.
191
+
192
+ **Self-maintaining (auto-sync).** Turn on `holt wiki auto on` (persists `wiki.autoSync: true` for the folder) and the wiki keeps itself current with no manual command. It syncs **after fact distillation** at the end of a `holt chat` session, and ambiently when the Claude Code **Stop** hook fires (`holt hook capture`), so newly captured facts fold straight into pages. Auto-sync is silent, best-effort, and never blocks exit: it reuses the exact same sync engine as `holt wiki sync`, so there is no behavior drift. Left off (the default), nothing changes and you sync by hand. `holt wiki auto` with no argument shows the current state; `holt wiki status` surfaces it too.
193
+
194
+ **Lint that can fix.** `holt wiki lint` audits pages for contradictions, duplicates, and gaps and prints a report only (files untouched). Add `--fix` and Holt asks the maintainer to return corrected page bodies and **applies them**, rewriting the affected pages (provenance/`sources` is preserved). Because pages are derived and regenerable, applying is safe: a bad `--fix` is fully recoverable with `holt wiki rebuild`, and the command prints a git/backup nudge before writing. Only pages that actually change are rewritten.
195
+
196
+ **Who maintains it (the key knob).** Synthesis is a reasoning task, and you choose who does it with `wiki.maintainer`:
197
+
198
+ - `brain` (default): the folder's configured brain, exactly like fact distillation. When the brain is the Claude Code CLI this rides your existing Claude plan, so there are no marginal dollars per sync.
199
+ - `local`: a local generative model via Ollama (set `wiki.localModel`, default `qwen2.5:7b`). Free and offline, lower quality, and it trades dollars for RAM. If the model is not pulled, Holt prints the exact `ollama pull` line and falls back to the brain rather than failing.
200
+
201
+ `holt wiki setup` (or the hint in `holt wiki status`) reads your total RAM and recommends a model: under 16 GB it discourages local (use the brain); 16 GB suggests `qwen2.5:7b` (tight alongside the embed model, an always-on machine is a better host); 24 to 32 GB suggests `qwen2.5:14b`; 48 GB and up suggests `qwen2.5:32b`.
202
+
203
+ Wiki pages also participate in recall: each page is embedded and indexed like a high-value fact, so `holt memory search` and chat recall can surface synthesized knowledge, not just raw turns.
126
204
 
127
205
  ## Skills
128
206
 
@@ -131,15 +209,46 @@ A skill is a folder with a `SKILL.md`: YAML frontmatter (`name`, `description`)
131
209
  Holt looks in two places (workspace wins on a name clash): `./.holt/skills/` for this folder, `~/.holt/skills/` for every folder (`--global`).
132
210
 
133
211
  ```
134
- holt skill list list installed skills
135
- holt skill show <name> print a skill
136
- holt skill create <name> [--global] scaffold a new skill
137
- holt skill add <src> [--global] install from a git URL or local path
138
- holt skill remove <name> delete a skill
212
+ holt skill list list installed skills
213
+ holt skill show <name> print a skill
214
+ holt skill create <name> [--global] scaffold a new skill
215
+ holt skill search <query> find skills in the registry
216
+ holt skill add <src|name> [--global] install from a git URL, path, or registry name
217
+ holt skill publish [<name>] prepare a skill for the registry (prints a PR entry)
218
+ holt skill remove <name> delete a skill
139
219
  ```
140
220
 
141
221
  In chat, run one with `/skill <name> [your input]`. Available skills are also listed to the brain each turn, so it knows what it can be asked to follow.
142
222
 
223
+ ### Skill registry (`holt skill search` / `publish`)
224
+
225
+ Beyond pasting URLs, Holt can discover and share skills through a **git-based registry**: a single JSON index living in a git repo. No server, no infra, in keeping with the rest of Holt.
226
+
227
+ The index is a JSON document:
228
+
229
+ ```json
230
+ {
231
+ "version": 1,
232
+ "skills": [
233
+ {
234
+ "name": "hello-registry",
235
+ "description": "A tiny demo skill.",
236
+ "source": "https://github.com/you/hello-registry.git",
237
+ "author": "you",
238
+ "tags": ["demo"]
239
+ }
240
+ ]
241
+ }
242
+ ```
243
+
244
+ `source` is anything `holt skill add` already accepts: a git URL (its `SKILL.md` may sit in one subfolder) or a local path. `tags` is optional. Only `name` and `source` are required per entry; malformed rows are skipped rather than failing the whole index.
245
+
246
+ - **Find:** `holt skill search <query>` fetches the index and lists skills whose name, description, or tags match (case-insensitive substring, name matches first). An empty query lists everything. It prints name, author, description, and source.
247
+ - **Install by name:** `holt skill add <name>` resolves the name in the registry to its `source`, then installs through the exact same clone/copy path as `holt skill add <url|path>`. A git URL or an existing local path is still installed directly, unchanged.
248
+ - **Publish (zero-infra):** `holt skill publish [<name>]` validates a skill's `SKILL.md` (needs a `name` and `description`) and prints the exact JSON entry plus instructions to open a PR against the community registry repo. Holt never pushes anywhere; you add the entry via a pull request. With no name, it publishes the `SKILL.md` in the current directory.
249
+
250
+ The default index is the community registry (`https://raw.githubusercontent.com/holt-os/registry/main/registry.json`). Override it with `HOLT_REGISTRY_URL` (a URL, a `file://` URL, or a plain path) to point at your own index or a local file. The fetched index is cached at `~/.holt/registry-cache.json` for one hour; `--refresh` forces a re-fetch. If no registry is reachable (for example, the community index is not live yet), search and install-by-name fail cleanly with a clear message rather than crashing.
251
+
143
252
  ## Use Holt from your other tools (MCP)
144
253
 
145
254
  Holt can run as an [MCP](https://modelcontextprotocol.io) server, so Claude Code, Cursor, and Codex can recall and remember from Holt's memory for the folder without leaving those tools.
@@ -173,6 +282,28 @@ claude mcp add holt -- holt mcp
173
282
 
174
283
  Point the client at the folder whose memory you want it to use; Holt serves whatever folder the server process starts in.
175
284
 
285
+ ## Ambient memory for Claude Code (`holt hook`)
286
+
287
+ The MCP server above lets Claude Code recall and remember **when it decides to**. `holt hook` goes further: it makes Holt's per-folder memory work **ambiently**, with no `holt chat` and no manual tool call. Two directions, both wired as [Claude Code hooks](https://docs.claude.com/en/docs/claude-code/hooks):
288
+
289
+ - **Inject** (`UserPromptSubmit`): before each prompt, Holt quietly recalls the most relevant remembered notes for the current folder and adds them to the model's context.
290
+ - **Capture** (`Stop`): when a session ends, Holt distills durable facts from the transcript (via this folder's configured brain) and saves them to the folder's memory.
291
+
292
+ ```bash
293
+ holt hook install # install both hooks into ~/.claude/settings.json
294
+ holt hook install --inject-only # only the before-prompt recall hook
295
+ holt hook install --capture-only # only the end-of-session fact hook
296
+ holt hook install --project # write ./.claude/settings.json instead of the global one
297
+ holt hook status # show what is installed and which directions are active
298
+ holt hook remove # remove ONLY Holt's hooks, leaving everything else intact
299
+ ```
300
+
301
+ Install **merges** into any existing `hooks` config, never clobbers unrelated settings or other hooks, is **idempotent** (re-running does not duplicate), and backs the file up to `settings.json.holt-bak` before writing. `remove` deletes only the entries whose command is `holt hook inject` / `holt hook capture`.
302
+
303
+ **Trusted-folder guard (important).** The two runtime hooks (`holt hook inject` and `holt hook capture`, invoked by Claude Code, not you) no-op **silently** unless the folder is a trusted Holt workspace with an existing `.holt/memory`. So Holt never injects your private notes into an unrelated project, and never creates memory in a folder you never set up. To make a folder ambient, run `holt init` (or `holt chat`) there once so it becomes trusted and gets its `.holt/memory`. The inject hook keeps stdout clean (only the context block is printed, since Claude Code injects it verbatim); all diagnostics go to stderr, and both hooks always exit 0 so a memory step never blocks or slows your prompt.
304
+
305
+ To uninstall, run `holt hook remove` (add `--project` if you installed with `--project`).
306
+
176
307
  ## Output format
177
308
 
178
309
  Replies print as markdown. `/output html` (or `markdown`) switches the save format and persists it. `/save [name]` writes the last reply to the current folder: `.md`, or a small self-contained dark-theme `.html` page.
@@ -216,6 +347,99 @@ holt run "daily brief" | holt notify # pipe any output to your phone
216
347
 
217
348
  The token is stored in `~/.holt/telegram.json` (mode 600) and never printed in full.
218
349
 
350
+ ### holt routine
351
+
352
+ A routine is a named, reusable job: it bundles the pieces above into one object you can run by name or on a schedule. A routine is a **task source** (an installed skill or an inline prompt) plus an optional **daily schedule** plus **output routing** (stdout, a file, or Telegram). It is the generic version of a recurring "agent" such as a daily brief.
353
+
354
+ ```bash
355
+ # an inline task you can rerun by name
356
+ holt routine add brief --task "summarize what changed and what is open here" --notify
357
+
358
+ # a routine backed by an installed skill
359
+ holt routine add triage --skill inbox-triage --out triage.md
360
+
361
+ # a scheduled routine: installs an OS timer that fires "holt routine run digest --quiet"
362
+ holt routine add digest --task "digest today's changes" --at 07:00 --notify
363
+
364
+ # a built-in template (daily-brief or standup)
365
+ holt routine add myday --template daily-brief
366
+
367
+ holt routine run brief # run it now and stream the reply
368
+ holt routine run brief --out b.md # also write the reply to a file this run
369
+ holt routine list # name, source, schedule, outputs, workspace
370
+ holt routine show brief # full detail
371
+ holt routine remove brief # deletes the routine and its OS timer, if any
372
+ ```
373
+
374
+ Sources: give exactly one of `--skill <name>`, `--task "<prompt>"`, or `--template <t>`. A skill routine splices that skill's `SKILL.md` body into the prompt at run time; a task routine uses the prompt as-is.
375
+
376
+ Scheduling: `--at HH:MM` (24h, daily) installs an OS timer through the same scheduler `holt schedule` uses (launchd on macOS, cron on Linux) whose command is `holt routine run <name> --quiet`. Omit `--at` for a manual, run-on-demand routine. Removing the routine removes its timer.
377
+
378
+ Output routing: by default the result prints to stdout. `--out <file>` also writes it to a file (relative to the routine's workspace); `--notify` pushes it to Telegram (guarded cleanly when Telegram is not set up). Both `--out` and `--notify` can also be passed to `holt routine run` for a single run. In `--quiet` mode (what the scheduler uses) stdout is suppressed but `--out` and `--notify` still fire.
379
+
380
+ Routines are stored in `~/.holt/routines.json` (one entry per routine, each carrying its absolute workspace). A routine with a schedule also produces an entry in `~/.holt/schedules.json`, keyed by the routine name; the two are kept consistent.
381
+
382
+ ## Machine check (`holt doctor`)
383
+
384
+ Not sure how best to run Holt on your hardware? `holt doctor` looks at this machine and its installed tools and tells you, in plain language, what to do.
385
+
386
+ ```bash
387
+ holt doctor
388
+ ```
389
+
390
+ It reports, section by section:
391
+
392
+ - **Machine**: platform, CPU, RAM (total and free), and Node version.
393
+ - **Brains**: which agent CLIs (`claude`, `codex`, `gemini`) are installed, plus a recommendation (prefer an installed CLI brain; otherwise install one or add an API brain).
394
+ - **Semantic memory**: whether a local Ollama with the embed model is reachable, and how to enable it (`ollama pull nomic-embed-text`) so recall is semantic and fully private.
395
+ - **Knowledge wiki maintainer**: `brain` (the default, best quality, rides your existing plan) versus a local model sized to your RAM. On a 16 GB machine it names `qwen2.5:7b`; more RAM gets a larger model; under 16 GB it steers you to `brain`.
396
+ - **Always-on / Telegram**: whether a Telegram bot is set up, and a note on hosting the bot on a low-power always-on machine while keeping heavy local models on a bigger one.
397
+ - **Recommended next steps**: a short checklist built from whatever gaps it found.
398
+
399
+ It is read-only advice: it changes nothing, needs no trust, and always exits cleanly even when a probe fails.
400
+
401
+ The RAM-to-model table lives in `src/specs.ts` (`LOCAL_MODEL_RECS` / `recommendLocalModel`), the single source of truth the wiki maintainer reads too.
402
+
403
+ ## Your writing voice (`holt voice` + `holt write`)
404
+
405
+ Holt can learn how *you* write, then draft in that voice while steering clear of the patterns that make text read as machine written.
406
+
407
+ ### Teach it your voice: `holt voice`
408
+
409
+ At the end of `holt init` you are offered a short optional interview. You can also run or redo it anytime:
410
+
411
+ ```bash
412
+ holt voice # run the interview, or add samples, or both
413
+ holt voice add <file> # learn from a writing sample you already have
414
+ holt voice show # print your profile
415
+ holt voice edit # show where the profile lives (it is a plain JSON file)
416
+ holt voice clear # remove it
417
+ ```
418
+
419
+ The interview asks you to pick a **depth** up front: `quick` (a few questions) or `detailed` (more). Questions are about **writing and communication style only**: tone, sentence length, first vs third person, emoji habits, words you love or ban, who you write for, and what you want to sound like and not sound like.
420
+
421
+ Privacy is a hard rule. The interview never asks for personal details (no name, job, location, or life story). If you happen to mention something personal in an answer, Holt stores only what you typed and never asks follow ups.
422
+
423
+ You can also feed it real writing. `holt voice add <file>` reads a file; inside the interview you can paste a sample instead. Samples are stored as a hash and length by default; an excerpt is kept only if you say yes, so Holt can match your rhythm directly.
424
+
425
+ From the answers and samples, Holt asks your configured brain to build a **style profile**: tone, formality (1 to 5), average sentence length, person, emoji and formatting habits, signature moves, banned words, target audiences, and a short "sounds like / does not sound like" summary. If no brain is set yet, your raw answers are saved and the profile synthesizes the next time you run `holt voice` with a brain configured.
426
+
427
+ The profile lives at `~/.holt/voice.json` (mode 600, since it can hold writing excerpts). It is global to you, not per folder, and you can hand edit it.
428
+
429
+ ### Draft in your voice: `holt write`
430
+
431
+ ```bash
432
+ holt write "a linkedin post about shipping Holt" --type linkedin
433
+ holt write "a reply to a customer asking for a refund" --type email --out reply.txt
434
+ holt write "a short post about testing" --fast
435
+ ```
436
+
437
+ `holt write` composes three things into one prompt: your voice profile, a built in **anti-AI rubric**, and your request. Then it runs your default brain. `--type` shapes length and format (`linkedin`, `email`, `tweet`, `blog`, `generic`), `--out` also writes the draft to a file, and `--brain <id>` picks a brain.
438
+
439
+ By default a second pass checks the draft against the rubric and fixes any tells; `--fast` skips it for a single call. The anti-AI rubric bans em-dashes, "rule of three" cliches, "in today's fast-paced world" openers, "it is not X, it is Y" reframes, tidy bow-tie conclusions, uniform sentence rhythm, hedging filler, corporate buzzwords, and emoji unless your profile allows them. The output is always em-dash free.
440
+
441
+ With no profile yet, `holt write` still works using a plain, natural voice.
442
+
219
443
  ## Commands
220
444
 
221
445
  ```
@@ -223,12 +447,20 @@ holt init set up (trust, brains, sign-in, defaults) for this folder
223
447
  holt chat start a session that remembers past ones
224
448
  holt run <task> run one task non-interactively (recall, brain, remember)
225
449
  holt schedule run a task on a timer: add | list | remove
450
+ holt routine named, reusable, scheduled jobs: add | run | list | show | remove
226
451
  holt telegram chat with Holt from your phone: telegram [setup]
227
452
  holt notify [msg] push a message to your phone over Telegram (stdin-friendly)
453
+ holt doctor check this machine and recommend how best to run Holt here
454
+ holt voice teach Holt your writing voice: add <file> | show | edit | clear
455
+ holt write <what> draft content in your voice with anti-AI checks (--type, --out, --fast)
228
456
  holt graph see your memory as an interactive knowledge graph
457
+ (--code / --docs / --all to ingest this folder's code + docs;
458
+ "holt graph report" writes GRAPH_REPORT.md)
229
459
  holt mcp run an MCP server so other tools use this folder's memory (holt mcp setup)
460
+ holt hook ambient memory for Claude Code: install | remove | status
230
461
  holt skill manage skills: list | show | create | add | remove
231
462
  holt memory inspect memory: holt memory [search <query> | facts | embed | clear]
463
+ holt wiki derived knowledge wiki: holt wiki [sync | auto | rebuild | lint | list | show | status]
232
464
  holt setting configure brains, API brains, and launch command
233
465
  holt login <brain> sign in to claude, codex, or gemini
234
466
  holt version print version
@@ -253,7 +485,8 @@ Built in always-shippable phases toward a full-vision v1:
253
485
  3. **Skills**: portable SKILL.md skills, create/add/run *(shipped)*
254
486
  4. **Knowledge graph**: see and navigate your own memory with `holt graph` *(shipped)*
255
487
  5. **Everywhere**: MCP server so other tools read Holt's memory, plus `holt run`, scheduling, and Telegram *(shipped)*
256
- 6. **Next**: docs site, skill registry publishing, more channels
488
+ 6. **Knowledge wiki**: LLM-maintained, cross-linked, regenerable pages over your memory with `holt wiki` *(shipped)*
489
+ 7. **Next**: docs site, skill registry publishing, more channels
257
490
 
258
491
  ## Contributing
259
492