@holt-os/holt 0.16.0 → 0.17.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.
- package/README.md +19 -2
- package/dist/cli.js +72 -11
- package/package.json +1 -1
- package/skills/audit/SKILL.md +111 -0
- package/skills/level-up/SKILL.md +118 -0
- package/skills/onboard/SKILL.md +125 -0
package/README.md
CHANGED
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
- **Private memory you can see.** Per-folder semantic recall and distilled facts, an interactive knowledge graph (`holt graph`), and a self-maintaining wiki (`holt wiki`) over everything you tell it. Nothing leaves your machine.
|
|
23
23
|
- **Ambient by default.** `holt hook` wires memory into Claude Code so it recalls and remembers with no manual step, and an MCP server exposes the same memory to Cursor and Codex.
|
|
24
24
|
- **Runs your work.** Run a task once, on a schedule, or as a named routine, and reach it from your phone over Telegram.
|
|
25
|
-
- **
|
|
25
|
+
- **Useful on day one.** `/skill onboard` interviews you and fills memory in about fifteen minutes, `/skill audit` shows what is still missing, and `/skill level-up` turns one manual chore a week into something Holt does.
|
|
26
|
+
- **Extensible, zero-infra.** Thirteen built-in skills plus a git-based community registry (`holt skill search`) in the portable `SKILL.md` format.
|
|
26
27
|
- **Writes in your voice.** `holt write` drafts in a style Holt learns from you, with built-in anti-AI checks.
|
|
27
28
|
|
|
28
29
|
> **Status:** shipping and usable today. Every capability above works now.
|
|
@@ -43,6 +44,14 @@ Or with npm, if you already have Node:
|
|
|
43
44
|
npm install -g @holt-os/holt
|
|
44
45
|
```
|
|
45
46
|
|
|
47
|
+
**Not comfortable in a terminal?** Install [Claude Code](https://claude.com/claude-code), open it, and paste this:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Set up Holt for me: read https://raw.githubusercontent.com/holt-os/holt/main/docs/INSTALL.md and follow it exactly.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
It installs Holt, checks its own work, and fixes what breaks. Full detail, system requirements, and troubleshooting: [docs/INSTALL.md](./docs/INSTALL.md).
|
|
54
|
+
|
|
46
55
|
## Quickstart
|
|
47
56
|
|
|
48
57
|
```bash
|
|
@@ -139,6 +148,8 @@ Every exchange is saved to `<folder>/.holt/memory/turns.jsonl`, private and loca
|
|
|
139
148
|
|
|
140
149
|
When you end a chat, Holt asks the brain to distill 1 to 5 durable facts from the session (decisions, preferences, key names, numbers) and writes them to a human-readable `<folder>/.holt/memory/facts.md` you can read and edit. Those facts are also embedded and ranked slightly higher than raw turns during recall, so the signal rises to the top over time. See them with `holt memory facts`. Turn it off by setting `memory.extractFacts` to `false` in `config.json`.
|
|
141
150
|
|
|
151
|
+
You do not have to wait for the end of a session. `holt memory add "<fact>"` saves one immediately, and duplicates are ignored, so it is safe to run twice. Piping in several facts, one per line, works too. Prefer this over editing `facts.md` by hand: a fact typed straight into that file is never embedded, so semantic recall will not find it.
|
|
152
|
+
|
|
142
153
|
Two recall modes, picked automatically:
|
|
143
154
|
|
|
144
155
|
- **Semantic** (best): a local [Ollama](https://ollama.com) with an embedding model, which `holt init` offers to set up for you. Recall matches by meaning: asking "who owns my apartment" finds "my landlord is called Pieter". No API keys, nothing leaves your machine.
|
|
@@ -148,6 +159,7 @@ Inspect it any time:
|
|
|
148
159
|
|
|
149
160
|
```bash
|
|
150
161
|
holt memory # stats for this folder
|
|
162
|
+
holt memory add "<fact>" # teach it something durable right now
|
|
151
163
|
holt memory facts # show the distilled facts (facts.md)
|
|
152
164
|
holt memory search <query> # find remembered moments
|
|
153
165
|
holt memory embed # embed older moments for semantic recall
|
|
@@ -315,6 +327,11 @@ Holt ships with a small, curated set of general-purpose skills, available in eve
|
|
|
315
327
|
- **plan**: break a goal into a concrete, ordered set of steps.
|
|
316
328
|
- **rewrite**: tighten and clarify a piece of text without changing its meaning.
|
|
317
329
|
- **decide**: weigh a decision and give a clear recommendation.
|
|
330
|
+
- **onboard**: a guided first-day interview that fills memory with who you are and what you are working on.
|
|
331
|
+
- **audit**: a read-only health check across the four rungs, naming the gaps and the single next fix.
|
|
332
|
+
- **level-up**: a weekly session that turns one recurring manual chore into something Holt does, and ships it.
|
|
333
|
+
|
|
334
|
+
The last three are the setup loop. `onboard` on day one, then `audit` and `level-up` weekly. Holt gets useful in four rungs, in order: **Know** (it holds facts about you), **Reach** (it can see your real material), **Do** (it runs your repeated work), **Run** (it acts while you are away). Automating on top of an empty memory just produces confident nonsense on a timer, so the order matters.
|
|
318
335
|
|
|
319
336
|
### Skill registry (`holt skill search` / `publish`)
|
|
320
337
|
|
|
@@ -578,7 +595,7 @@ holt graph see your memory as an interactive knowledge graph
|
|
|
578
595
|
holt mcp run an MCP server so other tools use this folder's memory (holt mcp setup)
|
|
579
596
|
holt hook ambient memory for Claude Code: install | remove | status
|
|
580
597
|
holt skill manage skills: list | show | create | add | remove
|
|
581
|
-
holt memory inspect memory: holt memory [search <query> | facts | embed | clear]
|
|
598
|
+
holt memory inspect memory: holt memory [add <fact> | search <query> | facts | embed | clear]
|
|
582
599
|
holt wiki derived knowledge wiki: holt wiki [sync | auto | rebuild | lint | list | show | status]
|
|
583
600
|
holt setting configure brains, API brains, and launch command
|
|
584
601
|
holt login <brain> sign in to claude, codex, or gemini
|
package/dist/cli.js
CHANGED
|
@@ -677,7 +677,7 @@ function clearMemory() {
|
|
|
677
677
|
function normalizeFact(s) {
|
|
678
678
|
return (s || "").toLowerCase().replace(/\s+/g, " ").trim().replace(/[.,;:!?]+$/, "");
|
|
679
679
|
}
|
|
680
|
-
var FACTS_HEADER =
|
|
680
|
+
var FACTS_HEADER = '# Holt facts\n\nDistilled memories for this folder. Edit or delete lines freely.\nTo ADD one, use `holt memory add "<fact>"`: a line typed in here by hand is\nnever embedded, so semantic recall will not find it.\n';
|
|
681
681
|
async function saveFact(content, session) {
|
|
682
682
|
const clean = content.trim();
|
|
683
683
|
if (!clean) return false;
|
|
@@ -2515,6 +2515,24 @@ function buildCronLine(job, holtPath) {
|
|
|
2515
2515
|
const command = buildCommand(job, holtPath);
|
|
2516
2516
|
return `${minute} ${hour} * * * ${command} # ${CRON_MARKER}${job.id}`;
|
|
2517
2517
|
}
|
|
2518
|
+
function buildWindowsTaskFields(job, holtPath) {
|
|
2519
|
+
let args;
|
|
2520
|
+
if (job.runArgs && job.runArgs.length > 0) {
|
|
2521
|
+
args = [...job.runArgs, "--quiet"];
|
|
2522
|
+
} else {
|
|
2523
|
+
args = ["run", job.task];
|
|
2524
|
+
if (job.brain) args.push("--brain", job.brain);
|
|
2525
|
+
args.push("--quiet", "--out", logPath(job.id));
|
|
2526
|
+
}
|
|
2527
|
+
const quoted = args.map((a) => /[\s"]/.test(a) ? `"${a.replace(/"/g, '\\"')}"` : a);
|
|
2528
|
+
return {
|
|
2529
|
+
program: holtPath,
|
|
2530
|
+
args: quoted.join(" "),
|
|
2531
|
+
startIn: job.workspace,
|
|
2532
|
+
when: job.when,
|
|
2533
|
+
name: `Holt ${job.id}`
|
|
2534
|
+
};
|
|
2535
|
+
}
|
|
2518
2536
|
function stripCronLines(crontab, id) {
|
|
2519
2537
|
const marker = `# ${CRON_MARKER}${id}`;
|
|
2520
2538
|
const kept = crontab.split("\n").filter((line) => !line.includes(marker));
|
|
@@ -4824,6 +4842,34 @@ async function memoryCmd(sub, rest = []) {
|
|
|
4824
4842
|
close();
|
|
4825
4843
|
return;
|
|
4826
4844
|
}
|
|
4845
|
+
if (action === "add" || action === "remember") {
|
|
4846
|
+
let items = [];
|
|
4847
|
+
const inline = rest.join(" ").trim();
|
|
4848
|
+
if (inline) items = [inline];
|
|
4849
|
+
else if (!process.stdin.isTTY) {
|
|
4850
|
+
items = readFileSync14(0, "utf8").split("\n").map((l) => l.replace(/^\s*[-*]\s+/, "").trim()).filter(Boolean);
|
|
4851
|
+
}
|
|
4852
|
+
if (items.length === 0) {
|
|
4853
|
+
console.log(c.dim('\n Usage: holt memory add "<fact>" (or pipe one fact per line on stdin)\n'));
|
|
4854
|
+
close();
|
|
4855
|
+
return;
|
|
4856
|
+
}
|
|
4857
|
+
const session = newSessionId();
|
|
4858
|
+
let saved = 0;
|
|
4859
|
+
let dupes = 0;
|
|
4860
|
+
for (const item of items) {
|
|
4861
|
+
if (await saveFact(item, session)) saved++;
|
|
4862
|
+
else dupes++;
|
|
4863
|
+
}
|
|
4864
|
+
const dupNote = dupes ? c.dim(` (${dupes} already known)`) : "";
|
|
4865
|
+
console.log("\n" + c.green(` Remembered ${saved} fact${saved === 1 ? "" : "s"}.`) + dupNote);
|
|
4866
|
+
if (saved && !await embeddingsAvailable()) {
|
|
4867
|
+
console.log(c.dim(' Saved in keyword mode. Run "holt doctor --fix" for semantic recall.'));
|
|
4868
|
+
}
|
|
4869
|
+
console.log("");
|
|
4870
|
+
close();
|
|
4871
|
+
return;
|
|
4872
|
+
}
|
|
4827
4873
|
if (action === "facts") {
|
|
4828
4874
|
if (!existsSync13(factsMdPath())) {
|
|
4829
4875
|
console.log(c.dim("\n No facts distilled yet. They form when you end a chat session.\n"));
|
|
@@ -4864,9 +4910,9 @@ async function memoryCmd(sub, rest = []) {
|
|
|
4864
4910
|
close();
|
|
4865
4911
|
return;
|
|
4866
4912
|
}
|
|
4867
|
-
if (action && !["clear", "embed", "facts", "search", "global"].includes(action)) {
|
|
4913
|
+
if (action && !["add", "remember", "clear", "embed", "facts", "search", "global"].includes(action)) {
|
|
4868
4914
|
console.error(`
|
|
4869
|
-
Unknown memory subcommand: "${sub}". Use: search <query> | facts | embed | global | clear
|
|
4915
|
+
Unknown memory subcommand: "${sub}". Use: add <fact> | search <query> | facts | embed | global | clear
|
|
4870
4916
|
`);
|
|
4871
4917
|
process.exitCode = 1;
|
|
4872
4918
|
close();
|
|
@@ -4888,7 +4934,8 @@ async function memoryCmd(sub, rest = []) {
|
|
|
4888
4934
|
}
|
|
4889
4935
|
const gEnabled = isGlobalEnabled(workspace());
|
|
4890
4936
|
console.log(` global ${gEnabled ? c.green("on") + c.dim(" (contributes + reads shared facts)") : c.dim("off (this folder is isolated, the default)")}`);
|
|
4891
|
-
console.log(c.dim(
|
|
4937
|
+
console.log(c.dim('\n holt memory add "<fact>" teach it something durable right now'));
|
|
4938
|
+
console.log(c.dim(" holt memory search <query> find remembered moments"));
|
|
4892
4939
|
console.log(c.dim(" holt memory facts show distilled facts (facts.md)"));
|
|
4893
4940
|
console.log(c.dim(" holt memory embed embed older memories for semantic recall"));
|
|
4894
4941
|
console.log(c.dim(" holt memory global share high-value facts across your folders"));
|
|
@@ -7486,7 +7533,7 @@ function holtTools() {
|
|
|
7486
7533
|
}
|
|
7487
7534
|
|
|
7488
7535
|
// src/version.ts
|
|
7489
|
-
var VERSION = "0.
|
|
7536
|
+
var VERSION = "0.17.0";
|
|
7490
7537
|
|
|
7491
7538
|
// src/commands/mcp.ts
|
|
7492
7539
|
function printSetup() {
|
|
@@ -7801,11 +7848,28 @@ async function addCmd(rest) {
|
|
|
7801
7848
|
console.log(` log ${logPath(job.id)}`);
|
|
7802
7849
|
if (process.platform === "darwin") installDarwin(job, holtPath);
|
|
7803
7850
|
else if (process.platform === "linux") installLinux(job, holtPath);
|
|
7804
|
-
else
|
|
7851
|
+
else printManualInstall(job, holtPath);
|
|
7852
|
+
console.log("");
|
|
7853
|
+
}
|
|
7854
|
+
function printManualInstall(job, holtPath) {
|
|
7855
|
+
if (process.platform !== "win32") {
|
|
7805
7856
|
console.log(c.dim("\n Your OS has no built-in installer. Install this entry yourself:"));
|
|
7806
7857
|
console.log(" " + buildCronLine(job, holtPath));
|
|
7858
|
+
return;
|
|
7859
|
+
}
|
|
7860
|
+
const f = buildWindowsTaskFields(job, holtPath);
|
|
7861
|
+
console.log(c.dim("\n Saved, but not started: Holt cannot install timers on Windows yet."));
|
|
7862
|
+
console.log(c.dim(' Open Task Scheduler, choose "Create Basic Task", and fill in:'));
|
|
7863
|
+
console.log(` Name ${f.name}`);
|
|
7864
|
+
console.log(` Trigger Daily at ${f.when}`);
|
|
7865
|
+
console.log(` Program ${f.program}`);
|
|
7866
|
+
console.log(` Arguments ${f.args}`);
|
|
7867
|
+
console.log(` Start in ${f.startIn}`);
|
|
7868
|
+
if (job.notify) {
|
|
7869
|
+
console.log(
|
|
7870
|
+
c.dim("\n Note: --notify does not carry over to Task Scheduler. Read the log file instead.")
|
|
7871
|
+
);
|
|
7807
7872
|
}
|
|
7808
|
-
console.log("");
|
|
7809
7873
|
}
|
|
7810
7874
|
function listCmd2() {
|
|
7811
7875
|
const jobs = loadJobs();
|
|
@@ -8007,10 +8071,7 @@ function installSchedule(r) {
|
|
|
8007
8071
|
addJob(job);
|
|
8008
8072
|
if (process.platform === "darwin") installDarwin2(job, holtPath);
|
|
8009
8073
|
else if (process.platform === "linux") installLinux2(job, holtPath);
|
|
8010
|
-
else
|
|
8011
|
-
console.log(c.dim("\n Your OS has no built-in installer. Install this entry yourself:"));
|
|
8012
|
-
console.log(" " + buildCronLine(job, holtPath));
|
|
8013
|
-
}
|
|
8074
|
+
else printManualInstall(job, holtPath);
|
|
8014
8075
|
}
|
|
8015
8076
|
function removeScheduleDarwin(id) {
|
|
8016
8077
|
const path = plistPath(id);
|
package/package.json
CHANGED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audit
|
|
3
|
+
description: A read-only health check of your Holt setup across the four rungs (Know, Reach, Do, Run), naming the gaps and the single next thing to fix. Use weekly, or when Holt feels less useful than expected.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# audit
|
|
7
|
+
|
|
8
|
+
## When to use
|
|
9
|
+
|
|
10
|
+
The user wants to know whether Holt is actually set up well, or why it feels
|
|
11
|
+
thin. This skill inspects the real state of the folder and reports back. It
|
|
12
|
+
changes nothing: no files written, no settings altered, no facts saved. If a fix
|
|
13
|
+
is obvious, name the command and let the user run it.
|
|
14
|
+
|
|
15
|
+
## The four rungs
|
|
16
|
+
|
|
17
|
+
Each rung depends on the one below it. A gap low down makes everything above it
|
|
18
|
+
worse, so always report the lowest gap first.
|
|
19
|
+
|
|
20
|
+
1. **Know**: it holds facts about the user and their work.
|
|
21
|
+
2. **Reach**: it can see the real material, not just what is typed at it.
|
|
22
|
+
3. **Do**: it runs their repeated work as skills.
|
|
23
|
+
4. **Run**: it acts without the user being present.
|
|
24
|
+
|
|
25
|
+
## Instructions
|
|
26
|
+
|
|
27
|
+
### Gather the state
|
|
28
|
+
|
|
29
|
+
Run these and read the output. If you cannot run commands in this session, ask
|
|
30
|
+
the user to paste the output of the first three rather than guessing.
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
holt memory facts count, embedded count, recall mode
|
|
34
|
+
holt memory facts what it actually knows
|
|
35
|
+
holt voice show is there a writing profile
|
|
36
|
+
holt hook status ambient memory in Claude Code
|
|
37
|
+
holt skill list which skills exist, and which are built in
|
|
38
|
+
holt routine list named jobs
|
|
39
|
+
holt schedule list timers
|
|
40
|
+
holt doctor machine level problems
|
|
41
|
+
holt wiki status derived knowledge, if used
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Score each rung
|
|
45
|
+
|
|
46
|
+
Be strict. A generous audit is a useless one. Mark each rung **solid**, **thin**,
|
|
47
|
+
or **missing**, and say what the evidence was.
|
|
48
|
+
|
|
49
|
+
- **Know** is solid when memory holds a few dozen facts that are about the
|
|
50
|
+
user's actual work, and recall is running on embeddings rather than keyword
|
|
51
|
+
match. It is thin when the facts are mostly setup trivia, or when
|
|
52
|
+
`holt memory` shows moments that were never embedded. Read the facts, do not
|
|
53
|
+
just count them: fifty facts about one afternoon is still thin.
|
|
54
|
+
- **Reach** is solid when Holt sees material without the user pasting it: the
|
|
55
|
+
hook is installed, or MCP is wired into the tools they use, or the folder
|
|
56
|
+
holds the real files. It is missing when every session starts by pasting
|
|
57
|
+
context in by hand.
|
|
58
|
+
- **Do** is solid when at least one skill exists that the user or their
|
|
59
|
+
registry provided, tuned to their work. Built-in skills alone do not count;
|
|
60
|
+
everyone has those. Note which ones are actually being used.
|
|
61
|
+
- **Run** is solid when something has produced output while they were away, and
|
|
62
|
+
they read it. A routine that exists but has never run is thin, not solid.
|
|
63
|
+
|
|
64
|
+
### Report
|
|
65
|
+
|
|
66
|
+
1. Name the rung they are on: the highest one that is solid, with everything
|
|
67
|
+
below it also solid. Say it in one line.
|
|
68
|
+
2. List the gaps, lowest rung first. For each, state what is missing and the
|
|
69
|
+
command that would close it.
|
|
70
|
+
3. Give **one** next action. Not a menu, not a ranked list of five. The single
|
|
71
|
+
thing that unblocks the most.
|
|
72
|
+
4. Flag anything actively broken separately from anything merely absent. A
|
|
73
|
+
scheduled routine that fails every night is worse than no routine, and a
|
|
74
|
+
memory in keyword mode is quietly degrading every answer.
|
|
75
|
+
|
|
76
|
+
Keep the whole report short enough to read in a minute. It is a dashboard, not
|
|
77
|
+
an essay.
|
|
78
|
+
|
|
79
|
+
### Known traps to check for
|
|
80
|
+
|
|
81
|
+
- **Keyword mode.** If `holt memory` says recall is keyword rather than
|
|
82
|
+
embeddings, semantic recall is off and every answer is worse. `holt doctor
|
|
83
|
+
--fix` usually repairs it.
|
|
84
|
+
- **Unembedded moments.** If embedded count is below total, older memories are
|
|
85
|
+
invisible to semantic recall. `holt memory embed` fixes it in one pass.
|
|
86
|
+
- **Hand-edited facts.** Facts added by editing `facts.md` directly are never
|
|
87
|
+
embedded, so they never come back through recall. They must be re-added with
|
|
88
|
+
`holt memory add`.
|
|
89
|
+
- **Windows and timers.** On Windows, `holt schedule` and a routine's `--at`
|
|
90
|
+
time do not install anything. Anything on rung four there has to run another
|
|
91
|
+
way, so check the platform before calling rung four solid.
|
|
92
|
+
- **Automation above an empty memory.** If Run looks solid while Know is thin,
|
|
93
|
+
say so bluntly. That setup produces confident wrong output on a timer, and it
|
|
94
|
+
is the most expensive failure on this list.
|
|
95
|
+
|
|
96
|
+
## Example
|
|
97
|
+
|
|
98
|
+
You are on rung two. Know and Reach are solid, Do is thin.
|
|
99
|
+
|
|
100
|
+
Know: solid. 41 facts covering the agro project, the job search, and family
|
|
101
|
+
health. Recall is on embeddings.
|
|
102
|
+
Reach: solid. Hook installed, so Claude Code sessions recall automatically.
|
|
103
|
+
Do: thin. Ten skills listed, all built in. Nothing tuned to your work.
|
|
104
|
+
Run: missing. No routines, no schedules.
|
|
105
|
+
|
|
106
|
+
Broken: 12 of 340 moments have no embeddings, so a slice of last month is
|
|
107
|
+
invisible to recall.
|
|
108
|
+
|
|
109
|
+
Next action: run `/skill level-up` and turn the weekly client update into a
|
|
110
|
+
skill. Rung four is not worth touching until something on rung three has earned
|
|
111
|
+
its place.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: level-up
|
|
3
|
+
description: A weekly working session that turns one piece of recurring manual work into something Holt does for you, and ships it before the session ends. Use as a standing ritual once memory has real facts in it.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# level-up
|
|
7
|
+
|
|
8
|
+
## When to use
|
|
9
|
+
|
|
10
|
+
The user has been using Holt and wants it to carry more. This is the ritual that
|
|
11
|
+
compounds: once a week, one drain becomes one shipped capability. Run it after
|
|
12
|
+
memory holds real facts about their work; on an empty folder, run `onboard`
|
|
13
|
+
first.
|
|
14
|
+
|
|
15
|
+
The session fails if it ends in a plan. It succeeds if something exists that did
|
|
16
|
+
not exist an hour ago.
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
### 1. Find the constraint
|
|
21
|
+
|
|
22
|
+
Read what memory already knows. Relevant past notes are injected above; also run
|
|
23
|
+
`holt memory facts` and search for the work they complain about:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
holt memory search <what they keep doing by hand>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Then ask what ate their time this week, and what they did more than once. Pick
|
|
30
|
+
**one**. The best candidate is frequent, rule-shaped, and low-stakes if it comes
|
|
31
|
+
out slightly wrong. Say plainly why you picked it over the others.
|
|
32
|
+
|
|
33
|
+
If several are tempting, choose the boring one. A dull thing that runs every
|
|
34
|
+
week beats an ambitious thing that runs once.
|
|
35
|
+
|
|
36
|
+
### 2. Decide what to do with it
|
|
37
|
+
|
|
38
|
+
Three options, in this order:
|
|
39
|
+
|
|
40
|
+
- **Drop it.** Does this task need to exist? Work that only continues out of
|
|
41
|
+
habit should be stopped, not automated. Ask this first and mean it; the
|
|
42
|
+
cheapest automation is the one you do not build.
|
|
43
|
+
- **Automate it.** Rule-shaped and repeatable, with a checkable output.
|
|
44
|
+
- **Hand it off.** It needs judgement, relationships, or accountability a
|
|
45
|
+
machine should not hold. Say so and move to the next candidate.
|
|
46
|
+
|
|
47
|
+
Automating something that should have been dropped makes the waste permanent
|
|
48
|
+
and harder to see. Push back before building.
|
|
49
|
+
|
|
50
|
+
### 3. Map it before building
|
|
51
|
+
|
|
52
|
+
Walk the task through in the user's own words: what starts it, what information
|
|
53
|
+
it needs, what it produces, and who sees the output. Write the steps down. If
|
|
54
|
+
you cannot state the steps in plain sentences, it is not ready to build.
|
|
55
|
+
|
|
56
|
+
Then set how much rope it gets:
|
|
57
|
+
|
|
58
|
+
- **Drafts, you send.** Anything that leaves the house: email, posts, messages.
|
|
59
|
+
- **Runs, you review.** Produces a file or a note you read afterwards.
|
|
60
|
+
- **Runs unattended.** Only for work that is reversible and already proven by
|
|
61
|
+
hand for a few cycles.
|
|
62
|
+
|
|
63
|
+
Start one level more cautious than feels necessary. Moving up later is easy;
|
|
64
|
+
un-sending is not.
|
|
65
|
+
|
|
66
|
+
### 4. Build it now
|
|
67
|
+
|
|
68
|
+
Pick the lightest thing that works:
|
|
69
|
+
|
|
70
|
+
- A **skill**, when it is a repeatable way of thinking or writing:
|
|
71
|
+
`holt skill create <name>`, then write the instructions into its `SKILL.md`.
|
|
72
|
+
Check the registry first with `holt skill search <topic>`, because the work
|
|
73
|
+
may be done already.
|
|
74
|
+
- A **routine**, when it is a task worth naming and rerunning:
|
|
75
|
+
`holt routine add <name> "<task>"`, run it with `holt routine run <name>`.
|
|
76
|
+
- A **schedule**, when it should happen without being asked:
|
|
77
|
+
`holt schedule add`, or a scheduled routine. Only after it has produced good
|
|
78
|
+
output by hand at least twice.
|
|
79
|
+
- A **connection**, when the blocker is that Holt cannot see the material:
|
|
80
|
+
`holt hook` for ambient memory in Claude Code, `holt mcp setup` for other
|
|
81
|
+
tools. Sometimes the whole win is that it can finally read the thing.
|
|
82
|
+
|
|
83
|
+
Prefer a fixed sequence of steps over an open-ended agent. Predictable and
|
|
84
|
+
slightly dumb beats clever and unrepeatable.
|
|
85
|
+
|
|
86
|
+
### 5. Test it on something real
|
|
87
|
+
|
|
88
|
+
Run it once, now, on genuine input, and read the output with the user. If it is
|
|
89
|
+
wrong, fix it in this session. A capability that has never run on real data is
|
|
90
|
+
not shipped.
|
|
91
|
+
|
|
92
|
+
Then agree how it gets switched off: which command removes it, or which file to
|
|
93
|
+
delete. Anything that runs on a timer needs a way to stop.
|
|
94
|
+
|
|
95
|
+
### 6. Close the loop
|
|
96
|
+
|
|
97
|
+
1. Save what was built and why, so next week starts informed:
|
|
98
|
+
```
|
|
99
|
+
holt memory add "Built the <name> routine on <date>: <what it does, what triggers it>"
|
|
100
|
+
```
|
|
101
|
+
2. Note what to watch for: the failure mode most likely to show up first.
|
|
102
|
+
3. Name the single next candidate from the list you did not pick, so the next
|
|
103
|
+
session starts with a running head start.
|
|
104
|
+
|
|
105
|
+
## Example
|
|
106
|
+
|
|
107
|
+
This week: forty minutes lost to writing the same client update every Friday.
|
|
108
|
+
|
|
109
|
+
Not dropped, it is genuinely wanted. Not handed off, the facts live here.
|
|
110
|
+
Automate it, at drafts-you-send, because it goes to a client.
|
|
111
|
+
|
|
112
|
+
Built as a routine over the folder's memory, run once against this week's real
|
|
113
|
+
work. First draft named the wrong milestone; instructions tightened, second
|
|
114
|
+
draft was sendable. Off switch: `holt routine remove friday-update`.
|
|
115
|
+
|
|
116
|
+
Watch for: it will keep sounding confident about numbers it has not been given.
|
|
117
|
+
|
|
118
|
+
Next week's candidate: the invoice chase.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: onboard
|
|
3
|
+
description: A guided first-day interview that fills Holt's memory with who you are and what you are working on, so recall is useful from day one instead of after weeks of use. Use on a fresh folder, or to top up a thin memory.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# onboard
|
|
7
|
+
|
|
8
|
+
## When to use
|
|
9
|
+
|
|
10
|
+
Holt is installed but it does not know the user yet. An empty memory makes every
|
|
11
|
+
answer generic, which is the most common reason people install Holt and drift
|
|
12
|
+
away. This skill front-loads the knowledge that recall needs, in about fifteen
|
|
13
|
+
minutes, and ends with one real piece of work.
|
|
14
|
+
|
|
15
|
+
Also use it when `holt memory` shows very few facts and answers still feel
|
|
16
|
+
generic, or when the user starts a new folder for a different part of their life.
|
|
17
|
+
|
|
18
|
+
## The ladder
|
|
19
|
+
|
|
20
|
+
Holt gets useful in four rungs, in order. Onboarding is rung one.
|
|
21
|
+
|
|
22
|
+
1. **Know**: it holds facts about you and your work. (`holt memory`)
|
|
23
|
+
2. **Reach**: it can see your real material: files, notes, other tools. (`holt hook`, `holt mcp`)
|
|
24
|
+
3. **Do**: it runs your repeated work as skills. (`holt skill`)
|
|
25
|
+
4. **Run**: it acts without you being there. (`holt routine`, `holt schedule`)
|
|
26
|
+
|
|
27
|
+
Do not skip ahead. Automation on top of an empty memory produces confident
|
|
28
|
+
nonsense on a timer.
|
|
29
|
+
|
|
30
|
+
## Instructions
|
|
31
|
+
|
|
32
|
+
### Before you start
|
|
33
|
+
|
|
34
|
+
1. Check what is already known: run `holt memory` and, if any facts exist,
|
|
35
|
+
`holt memory facts`. If the folder already holds real facts, say so and offer
|
|
36
|
+
a top-up on the thin areas instead of the full interview. Never re-ask
|
|
37
|
+
something already in memory.
|
|
38
|
+
2. Set expectations in two lines: seven questions, about fifteen minutes, and
|
|
39
|
+
they can stop at any point because you save as you go.
|
|
40
|
+
|
|
41
|
+
### Running the interview
|
|
42
|
+
|
|
43
|
+
Ask **one question at a time.** Wait for the answer before moving on. Never
|
|
44
|
+
present the whole list at once; a wall of questions is the main reason people
|
|
45
|
+
abandon setup. Keep your own words short between questions.
|
|
46
|
+
|
|
47
|
+
Ask for the real thing, never a description of it. "Paste the last update you
|
|
48
|
+
sent your team" beats "how would you describe your writing style". Concrete
|
|
49
|
+
input is what makes recall work later.
|
|
50
|
+
|
|
51
|
+
If an answer is thin or abstract, ask one follow-up for a specific name, number,
|
|
52
|
+
or example, then move on. Two follow-ups on one question is too many.
|
|
53
|
+
|
|
54
|
+
The seven questions:
|
|
55
|
+
|
|
56
|
+
1. **Who you are.** What is your work, and what does a normal day actually
|
|
57
|
+
involve? Get the role, and what they are responsible for.
|
|
58
|
+
2. **What is live.** The three to five things genuinely in flight right now, and
|
|
59
|
+
the state of each. Push for status, not just titles.
|
|
60
|
+
3. **Who matters.** The people, clients, teams, or companies that come up
|
|
61
|
+
regularly, and how each relates to them. Names matter here.
|
|
62
|
+
4. **Standing rules.** Decisions and preferences you should never re-ask:
|
|
63
|
+
how they want to be spoken to, what is off limits, choices already made.
|
|
64
|
+
5. **Where the work lives.** Which folders, tools, and accounts hold the real
|
|
65
|
+
material. This becomes the map for rung two, so note what is not reachable
|
|
66
|
+
yet rather than pretending it is.
|
|
67
|
+
6. **What drains the time.** The recurring work they resent doing by hand. Ask
|
|
68
|
+
for the last three times it happened. These are the candidates the `level-up`
|
|
69
|
+
skill will draw from later.
|
|
70
|
+
7. **Their voice.** Ask them to paste two or three samples of their real
|
|
71
|
+
writing: a sent email, a message, a published post. Then run
|
|
72
|
+
`holt voice add <file>` if the samples are in files, or tell them the command
|
|
73
|
+
so their drafts sound like them rather than like a model.
|
|
74
|
+
|
|
75
|
+
### Saving as you go
|
|
76
|
+
|
|
77
|
+
After every two questions, write what you learned to memory with:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
holt memory add "<one durable fact>"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
One fact per call. Several facts can be piped in at once, one per line.
|
|
84
|
+
|
|
85
|
+
Write facts that will still be true in a month and that a future session could
|
|
86
|
+
not guess. "Runs product for a fintech in Bhubaneswar, nine years in" is a fact.
|
|
87
|
+
"Wants to be more productive" is noise. Include names, numbers, and dates. Write
|
|
88
|
+
the fact so it stands alone, because recall will surface it without this
|
|
89
|
+
conversation around it.
|
|
90
|
+
|
|
91
|
+
If you cannot run commands in this session, write the facts out as a block of
|
|
92
|
+
`holt memory add` lines and ask the user to paste them into their terminal.
|
|
93
|
+
Do not hand-edit `facts.md`: facts added that way are never embedded, so
|
|
94
|
+
semantic recall will not find them.
|
|
95
|
+
|
|
96
|
+
### Finishing
|
|
97
|
+
|
|
98
|
+
1. Show what was captured: run `holt memory facts` so they see their own words
|
|
99
|
+
stored in a file they own and can edit.
|
|
100
|
+
2. Prove it works. Ask one question whose answer depends on what they just told
|
|
101
|
+
you, and answer it from memory. This is the moment the tool becomes real, so
|
|
102
|
+
do not skip it.
|
|
103
|
+
3. Do one real thing now. Pick the smallest useful task from what they said
|
|
104
|
+
drains their time and complete it in this session. An artifact beats a plan.
|
|
105
|
+
4. Name rung two. Tell them the single next step, usually `holt hook` so Claude
|
|
106
|
+
Code remembers automatically, or `holt mcp setup` to reach their other tools.
|
|
107
|
+
One step, not a menu.
|
|
108
|
+
5. Point at the ritual: `/skill level-up` weekly turns one drain into one
|
|
109
|
+
automation, and `/skill audit` shows which rung they are on.
|
|
110
|
+
|
|
111
|
+
## Example
|
|
112
|
+
|
|
113
|
+
Not: "Tell me about your business, your projects, your clients, your
|
|
114
|
+
preferences, and your writing style."
|
|
115
|
+
|
|
116
|
+
Instead: "First one. What is your work, and what does a normal Tuesday actually
|
|
117
|
+
look like?" then, after the answer: "Got it. Now the live list: what are the three to five
|
|
118
|
+
things genuinely in flight this week?"
|
|
119
|
+
|
|
120
|
+
Then, quietly, between questions:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
holt memory add "Senior product manager, nine years, currently between roles and job-hunting in the Netherlands"
|
|
124
|
+
holt memory add "Runs Sasyam Agro with an uncle in Bargarh; demo plots are on the uncle's land"
|
|
125
|
+
```
|