claude-second-brain 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,7 +63,7 @@ The CLI will ask:
63
63
  - **qmd index path** — where to store the local search index (default: `~/.cache/qmd/index.sqlite`)
64
64
  - **GitHub repo** — optionally create a private repo and push automatically (requires `gh` CLI)
65
65
 
66
- Then scaffolds the vault, installs `mise` + `bun`, and runs `git init`.
66
+ Then scaffolds the vault, installs `mise` + `node` + `pnpm`, runs `pnpm install`, and `git init`.
67
67
 
68
68
  **Step 2 — Initialize inside Claude Code**
69
69
 
package/bin/create.js CHANGED
@@ -173,13 +173,19 @@ async function main() {
173
173
  else spin.stop("Failed to install mise — run: npm install -g @jdxcode/mise", 1)
174
174
  }
175
175
 
176
- // Run mise install inside the new vault to install bun
177
- spin.start("Installing bun via mise")
176
+ // Run mise install inside the new vault to install node + pnpm
177
+ spin.start("Installing node + pnpm via mise")
178
178
  run(["mise", "trust"], targetDir)
179
179
  const miseOk = run(["mise", "install"], targetDir)
180
- if (miseOk) spin.stop("bun installed")
180
+ if (miseOk) spin.stop("node + pnpm installed")
181
181
  else spin.stop("mise install failed — run it manually inside your vault", 1)
182
182
 
183
+ // Install vault dependencies via pnpm
184
+ spin.start("Installing vault dependencies")
185
+ const pnpmOk = run(["mise", "exec", "--", "pnpm", "install"], targetDir)
186
+ if (pnpmOk) spin.stop("dependencies installed")
187
+ else spin.stop("pnpm install failed — run it manually inside your vault", 1)
188
+
183
189
  // Git init
184
190
  spin.start("Initializing git repo")
185
191
  const gitOk = run(["git", "init"], targetDir)
package/package.json CHANGED
@@ -1,19 +1,25 @@
1
1
  {
2
2
  "name": "claude-second-brain",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "The fastest way to start your personal knowledge base powered by Obsidian, Claude Code, qmd, and GitHub.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "claude-second-brain": "./bin/create.js"
8
8
  },
9
+ "scripts": {
10
+ "docs:dev": "vocs dev",
11
+ "docs:build": "vocs build",
12
+ "docs:preview": "vocs preview"
13
+ },
9
14
  "files": [
10
15
  "bin/",
11
16
  "template/",
12
17
  "image.png"
13
18
  ],
14
19
  "engines": {
15
- "node": ">=18.0.0"
20
+ "node": ">=22.0.0"
16
21
  },
22
+ "packageManager": "pnpm@10.8.0",
17
23
  "dependencies": {
18
24
  "@clack/prompts": "^1.2.0",
19
25
  "picocolors": "^1.1.1"
@@ -22,5 +28,12 @@
22
28
  "repository": {
23
29
  "type": "git",
24
30
  "url": "https://github.com/jessepinkman9900/claude-second-brain"
31
+ },
32
+ "devDependencies": {
33
+ "@types/react": "^19.2.14",
34
+ "react": "^19.2.5",
35
+ "react-dom": "^19.2.5",
36
+ "typescript": "^6.0.2",
37
+ "vocs": "1.4.1"
25
38
  }
26
39
  }
@@ -35,7 +35,7 @@ Runs the full 9-step ingest workflow defined in CLAUDE.md. Do not skip steps.
35
35
  - Add the new source to the Sources Ingested section: one-line description + `[[wiki/sources/slug]]` link
36
36
 
37
37
  **Step 5 — Identify affected wiki pages**
38
- - Run: `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<source topic and key claims>"`
38
+ - Run: `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<source topic and key claims>"`
39
39
  - Also Glob `wiki/*.md` and `wiki/sources/*.md` to catch anything qmd missed
40
40
  - List all pages to create or update before proceeding
41
41
 
@@ -25,9 +25,9 @@ All commands run from the vault root.
25
25
  - Read `CLAUDE.md` to understand the documented schema and any references to collection names
26
26
  - List current state from qmd:
27
27
  ```bash
28
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection list
29
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context list
30
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd status
28
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection list
29
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context list
30
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd status
31
31
  ```
32
32
 
33
33
  ### Step 2 — Analyze the wiki
@@ -74,20 +74,20 @@ If collection names changed:
74
74
  For each existing collection that no longer fits the new schema:
75
75
 
76
76
  ```bash
77
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection remove <old-name>
77
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection remove <old-name>
78
78
  ```
79
79
 
80
80
  For each obsolete context:
81
81
 
82
82
  ```bash
83
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context rm <path>
83
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context rm <path>
84
84
  ```
85
85
 
86
86
  ### Step 8 — Register the new schema
87
87
 
88
88
  Run:
89
89
  ```bash
90
- bun scripts/qmd/setup.ts
90
+ pnpm qmd:setup
91
91
  ```
92
92
 
93
93
  This is idempotent — collections that already exist (e.g. ones you kept) are skipped; new ones are added; contexts are upserted.
@@ -96,7 +96,7 @@ This is idempotent — collections that already exist (e.g. ones you kept) are s
96
96
 
97
97
  Run:
98
98
  ```bash
99
- bun scripts/qmd/reindex.ts
99
+ pnpm qmd:reindex
100
100
  ```
101
101
 
102
102
  This indexes all files under the new collections and generates fresh embeddings.
@@ -104,9 +104,9 @@ This indexes all files under the new collections and generates fresh embeddings.
104
104
  ### Step 10 — Verify and report
105
105
 
106
106
  ```bash
107
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection list
108
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context list
109
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd status
107
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection list
108
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context list
109
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd status
110
110
  ```
111
111
 
112
112
  Confirm the new collections appear, contexts match the plan, and document/embedding counts are non-zero. Report a summary of what changed (collections added/removed/renamed, contexts updated, files re-indexed, references updated in CLAUDE.md and skills).
@@ -6,7 +6,7 @@ argument-hint: "Optional: 'force' to force re-embedding of every chunk (slow, us
6
6
 
7
7
  # Brain Refresh
8
8
 
9
- Refreshes the qmd index so search reflects the current state of the vault. Wraps `bun scripts/qmd/reindex.ts` (incremental) and the qmd CLI's force-embed flag.
9
+ Refreshes the qmd index so search reflects the current state of the vault. Wraps `pnpm qmd:reindex` (incremental) and the qmd CLI's force-embed flag.
10
10
 
11
11
  ## When to Use
12
12
 
@@ -23,7 +23,7 @@ All commands run from the vault root.
23
23
 
24
24
  Run:
25
25
  ```bash
26
- bun scripts/qmd/reindex.ts
26
+ pnpm qmd:reindex
27
27
  ```
28
28
 
29
29
  This script does two things:
@@ -38,10 +38,10 @@ When the user passes `force`, re-embed **every** chunk — not just the changed
38
38
 
39
39
  ```bash
40
40
  # Step 1 — update the file index first
41
- bun scripts/qmd/reindex.ts
41
+ pnpm qmd:reindex
42
42
 
43
43
  # Step 2 — force re-embed everything
44
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd embed -f
44
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd embed -f
45
45
  ```
46
46
 
47
47
  Force mode is slow — confirm with the user before proceeding if the wiki is large.
@@ -51,7 +51,7 @@ Force mode is slow — confirm with the user before proceeding if the wiki is la
51
51
  After refresh, confirm with:
52
52
 
53
53
  ```bash
54
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd status
54
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd status
55
55
  ```
56
56
 
57
57
  Document and embedding counts should be non-zero and reflect recent activity. If embeddings show as `0` or far below document count, re-run the refresh.
@@ -11,7 +11,7 @@ Runs the 4-step query workflow defined in CLAUDE.md. Answers come with inline `[
11
11
  ## Workflow
12
12
 
13
13
  **Step 1 — Search the wiki**
14
- - Run hybrid search: `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<question>"`
14
+ - Run hybrid search: `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<question>"`
15
15
  - Read `wiki/index.md` to confirm coverage and catch any pages qmd didn't surface
16
16
  - Read the 2–5 most relevant pages in full before synthesizing
17
17
 
@@ -13,10 +13,10 @@ Local semantic document index with hybrid search (BM25 + vector), collection man
13
13
  This vault keeps its index at `__QMD_PATH__`. All CLI commands **must** prefix with `INDEX_PATH=__QMD_PATH__`:
14
14
 
15
15
  ```bash
16
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "..."
16
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "..."
17
17
  ```
18
18
 
19
- The scripts `bun scripts/qmd/setup.ts` and `bun scripts/qmd/reindex.ts` write to this same file. The CLI must match.
19
+ The scripts `pnpm qmd:setup` and `pnpm qmd:reindex` write to this same file. The CLI must match.
20
20
 
21
21
  ---
22
22
 
@@ -24,40 +24,40 @@ The scripts `bun scripts/qmd/setup.ts` and `bun scripts/qmd/reindex.ts` write to
24
24
 
25
25
  ```bash
26
26
  # Create/index a collection
27
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection add <path> --name <name> --mask <glob-pattern>
27
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection add <path> --name <name> --mask <glob-pattern>
28
28
  # e.g.:
29
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection add wiki --name wiki --mask "**/*.md"
29
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection add wiki --name wiki --mask "**/*.md"
30
30
 
31
31
  # List all collections with details
32
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection list
32
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection list
33
33
 
34
34
  # Remove a collection
35
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection remove <name>
35
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection remove <name>
36
36
 
37
37
  # Rename a collection
38
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection rename <old-name> <new-name>
38
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection rename <old-name> <new-name>
39
39
  ```
40
40
 
41
41
  ## Listing Files
42
42
 
43
43
  ```bash
44
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd ls
45
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd ls [collection[/path]]
44
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd ls
45
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd ls [collection[/path]]
46
46
  ```
47
47
 
48
48
  ## Context
49
49
 
50
50
  ```bash
51
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context add [path] "description text"
52
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context list
53
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context rm <path>
51
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context add [path] "description text"
52
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context list
53
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context rm <path>
54
54
  ```
55
55
 
56
56
  ## Retrieving Documents
57
57
 
58
58
  ```bash
59
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd get <file>[:line] [-l N] [--from N]
60
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd multi-get <pattern> [-l N] [--max-bytes N]
59
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd get <file>[:line] [-l N] [--from N]
60
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd multi-get <pattern> [-l N] [--max-bytes N]
61
61
  ```
62
62
 
63
63
  **Multi-get format flags:** `--json`, `--csv`, `--md`, `--xml`, `--files`
@@ -66,16 +66,16 @@ INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd multi-get <pattern> [-l N] [--max-bytes
66
66
 
67
67
  ```bash
68
68
  # Show index status and collections
69
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd status
69
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd status
70
70
 
71
71
  # Re-index all collections
72
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd update [--pull]
72
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd update [--pull]
73
73
 
74
74
  # Create vector embeddings (900 tokens/chunk, 15% overlap)
75
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd embed [-f]
75
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd embed [-f]
76
76
 
77
77
  # Remove cache and orphaned data, vacuum DB
78
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd cleanup
78
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd cleanup
79
79
  ```
80
80
 
81
81
  > After bulk ingest sessions, run `update` then `embed` to keep the index fresh.
@@ -108,28 +108,28 @@ INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd cleanup
108
108
 
109
109
  ```bash
110
110
  # Hybrid search across all collections
111
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query "distributed systems consensus"
111
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query "distributed systems consensus"
112
112
 
113
113
  # Search only the wiki collection, JSON output
114
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "transformer architecture" --json
114
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "transformer architecture" --json
115
115
 
116
116
  # Keyword-only search, top 10, markdown output
117
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd search -c wiki "kafka" -n 10 --md
117
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd search -c wiki "kafka" -n 10 --md
118
118
 
119
119
  # Vector search with full documents
120
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd vsearch "attention mechanism" --full
120
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd vsearch "attention mechanism" --full
121
121
 
122
122
  # Filter by score threshold
123
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query "machine learning" --all --min-score 0.7
123
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query "machine learning" --all --min-score 0.7
124
124
  ```
125
125
 
126
126
  ## MCP Server
127
127
 
128
128
  ```bash
129
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd mcp
130
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd mcp --http [--port N]
131
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd mcp --http --daemon
132
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd mcp stop
129
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd mcp
130
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd mcp --http [--port N]
131
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd mcp --http --daemon
132
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd mcp stop
133
133
  ```
134
134
 
135
135
  ## Global Options
@@ -145,24 +145,24 @@ Note: use `INDEX_PATH` env var rather than `--index` — `INDEX_PATH` accepts a
145
145
  ### First-time setup for this vault
146
146
  ```bash
147
147
  # Handled by the /setup skill:
148
- bun scripts/qmd/setup.ts
149
- bun scripts/qmd/reindex.ts
148
+ pnpm qmd:setup
149
+ pnpm qmd:reindex
150
150
  ```
151
151
 
152
152
  ### After a bulk ingest session
153
153
  ```bash
154
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd update
155
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd embed
154
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd update
155
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd embed
156
156
  ```
157
157
 
158
158
  ### Research workflow
159
159
  ```bash
160
160
  # Discover relevant pages
161
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<topic>"
161
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<topic>"
162
162
 
163
163
  # Get a specific file
164
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd get wiki/distributed-systems.md
164
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd get wiki/distributed-systems.md
165
165
 
166
166
  # Get multiple related files
167
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd multi-get "wiki/kafka.md,wiki/distributed-systems.md" --md
167
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd multi-get "wiki/kafka.md,wiki/distributed-systems.md" --md
168
168
  ```
@@ -21,7 +21,7 @@ All commands run from the vault root.
21
21
 
22
22
  Run:
23
23
  ```bash
24
- bun scripts/qmd/setup.ts
24
+ pnpm qmd:setup
25
25
  ```
26
26
 
27
27
  Registers the two core qmd collections (`wiki`, `raw-sources`) and their path-level context descriptions. Idempotent — safe to re-run.
@@ -30,7 +30,7 @@ Registers the two core qmd collections (`wiki`, `raw-sources`) and their path-le
30
30
 
31
31
  Run:
32
32
  ```bash
33
- bun scripts/qmd/reindex.ts
33
+ pnpm qmd:reindex
34
34
  ```
35
35
 
36
36
  Scans all collections for new/changed files and generates vector embeddings. The first run downloads ~2GB of local GGUF models — this will take a while.
@@ -39,7 +39,7 @@ Scans all collections for new/changed files and generates vector embeddings. The
39
39
 
40
40
  Skip step 1 and run only:
41
41
  ```bash
42
- bun scripts/qmd/reindex.ts
42
+ pnpm qmd:reindex
43
43
  ```
44
44
 
45
45
  Do **not** re-run after every single file edit — batch it after a session.
@@ -50,17 +50,17 @@ Run these three commands to confirm everything is working:
50
50
 
51
51
  ```bash
52
52
  # List registered collections (expect: wiki, raw-sources)
53
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd collection list
53
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd collection list
54
54
 
55
55
  # List registered contexts
56
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd context list
56
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd context list
57
57
 
58
58
  # Show index status and embedding counts
59
- INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd status
59
+ INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd status
60
60
  ```
61
61
 
62
62
  Both collections should appear in `collection list`. `status` should show non-zero document and embedding counts — if embeddings are 0, re-run step 2.
63
63
 
64
64
  ## Notes
65
- - `bun` is managed via `mise` — ensure `mise install` has been run before setup
66
- - If `bunx @tobilu/qmd` commands fail after setup, re-run step 1 then step 2
65
+ - `node` and `pnpm` are managed via `mise` — ensure `mise install` and `pnpm install` have been run before setup
66
+ - If `pnpm dlx @tobilu/qmd` commands fail after setup, re-run step 1 then step 2
@@ -111,7 +111,7 @@ Run this workflow whenever the user adds a new source. Do not skip steps.
111
111
  - Add the new source to the Sources section with a one-line description and link.
112
112
 
113
113
  **Step 5 — Identify affected wiki pages**
114
- - Run `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<source topic and key claims>"` to surface related existing wiki pages.
114
+ - Run `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<source topic and key claims>"` to surface related existing wiki pages.
115
115
  - Also Glob `wiki/*.md` and `wiki/sources/*.md` to ensure completeness.
116
116
  - List all pages to create or update.
117
117
 
@@ -142,7 +142,7 @@ Run this workflow whenever the user adds a new source. Do not skip steps.
142
142
  Run this workflow when the user asks a question against the wiki.
143
143
 
144
144
  **Step 1 — Search the wiki**
145
- - Run `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<question>"` to surface semantically relevant pages.
145
+ - Run `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<question>"` to surface semantically relevant pages.
146
146
  - Read `wiki/index.md` to confirm coverage and catch any pages qmd didn't surface.
147
147
  - Read the 2-5 most relevant pages fully.
148
148
 
@@ -211,21 +211,21 @@ N issues found, N fixed. [Brief summary of notable findings.]
211
211
 
212
212
  ## Search Tool
213
213
 
214
- This vault uses **qmd** (`bunx @tobilu/qmd`) for local semantic and full-text search.
215
- Collections and contexts are registered via `bun scripts/qmd/setup.ts` and stored at `__QMD_PATH__` (gitignored).
214
+ This vault uses **qmd** (`pnpm dlx @tobilu/qmd`) for local semantic and full-text search.
215
+ Collections and contexts are registered via `pnpm qmd:setup` and stored at `__QMD_PATH__` (gitignored).
216
216
 
217
217
  Key commands:
218
218
 
219
219
  | Command | Use |
220
220
  |---------|-----|
221
- | `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd query -c wiki "<question>"` | Hybrid search — best for topic discovery |
222
- | `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd search -c wiki "<terms>"` | Fast keyword search (BM25, no LLM) |
223
- | `INDEX_PATH=__QMD_PATH__ bunx @tobilu/qmd vsearch -c wiki "<question>"` | Pure vector/semantic search |
221
+ | `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd query -c wiki "<question>"` | Hybrid search — best for topic discovery |
222
+ | `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd search -c wiki "<terms>"` | Fast keyword search (BM25, no LLM) |
223
+ | `INDEX_PATH=__QMD_PATH__ pnpm dlx @tobilu/qmd vsearch -c wiki "<question>"` | Pure vector/semantic search |
224
224
 
225
225
  Add `--json` for structured output. Omit `-c wiki` to search all collections (wiki, raw-sources, human, daily-notes).
226
226
 
227
227
  **Re-indexing:** After a bulk ingest session run:
228
228
  ```bash
229
- bun scripts/qmd/reindex.ts
229
+ pnpm qmd:reindex
230
230
  ```
231
231
  Do NOT re-index after every single file edit.
@@ -13,10 +13,13 @@ Inspired by [Andrej Karpathy's approach to LLM-powered knowledge management](htt
13
13
  ## Quick start
14
14
 
15
15
  ```bash
16
- # 1. Install tools
16
+ # 1. Install tools (node + pnpm via mise)
17
17
  mise install
18
18
 
19
- # 2. Open Claude Code
19
+ # 2. Install dependencies
20
+ pnpm install
21
+
22
+ # 3. Open Claude Code
20
23
  claude
21
24
  ```
22
25
 
@@ -185,7 +188,7 @@ After a bulk ingest session, re-index to keep search current:
185
188
  /brain-refresh
186
189
  ```
187
190
 
188
- This wraps `bun scripts/qmd/reindex.ts` — you can also run that command directly if you're not inside Claude Code. Pass `force` to `/brain-refresh` to re-embed every chunk (e.g. after changing the embedding model).
191
+ This wraps `pnpm qmd:reindex` — you can also run that command directly if you're not inside Claude Code. Pass `force` to `/brain-refresh` to re-embed every chunk (e.g. after changing the embedding model).
189
192
 
190
193
  ---
191
194
 
@@ -1,2 +1,3 @@
1
1
  [tools]
2
- bun = "1.3.10"
2
+ node = "22"
3
+ pnpm = "10.8.0"
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "claude-second-brain-vault",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "qmd:setup": "tsx scripts/qmd/setup.ts",
7
+ "qmd:reindex": "tsx scripts/qmd/reindex.ts"
8
+ },
9
+ "dependencies": {
10
+ "@tobilu/qmd": "^2.1.0"
11
+ },
12
+ "devDependencies": {
13
+ "@types/node": "^22.10.2",
14
+ "tsx": "^4.19.2",
15
+ "typescript": "^5.7.2"
16
+ },
17
+ "packageManager": "pnpm@10.8.0",
18
+ "engines": {
19
+ "node": ">=22.0.0"
20
+ },
21
+ "pnpm": {
22
+ "onlyBuiltDependencies": [
23
+ "better-sqlite3",
24
+ "esbuild",
25
+ "node-llama-cpp",
26
+ "tree-sitter-go",
27
+ "tree-sitter-javascript",
28
+ "tree-sitter-python",
29
+ "tree-sitter-rust",
30
+ "tree-sitter-typescript"
31
+ ]
32
+ }
33
+ }
@@ -4,10 +4,10 @@
4
4
  * First run downloads ~2GB of GGUF models — expected, one-time.
5
5
  *
6
6
  * Run from vault root:
7
- * bun scripts/qmd/reindex.ts
7
+ * pnpm qmd:reindex
8
8
  *
9
9
  * Suitable as a cronjob:
10
- * 0 * * * * cd /home/user/my-brain && bun scripts/qmd/reindex.ts
10
+ * 0 * * * * cd /home/user/my-brain && pnpm qmd:reindex
11
11
  */
12
12
 
13
13
  import { createStore } from "@tobilu/qmd"
@@ -3,16 +3,17 @@
3
3
  * Safe to re-run: skips collections that already exist, upserts contexts.
4
4
  *
5
5
  * Run once from vault root:
6
- * bun scripts/qmd/setup.ts
6
+ * pnpm qmd:setup
7
7
  *
8
8
  * After setup, index the vault:
9
- * bun scripts/qmd/reindex.ts
9
+ * pnpm qmd:reindex
10
10
  */
11
11
 
12
12
  import { createStore } from "@tobilu/qmd"
13
- import { join } from "path"
13
+ import { dirname, join } from "node:path"
14
+ import { fileURLToPath } from "node:url"
14
15
 
15
- const VAULT = join(import.meta.dir, "../..")
16
+ const VAULT = join(dirname(fileURLToPath(import.meta.url)), "../..")
16
17
  const DB = "__QMD_PATH__"
17
18
 
18
19
  const store = await createStore({ dbPath: DB })
@@ -53,4 +54,4 @@ await store.addContext("raw-sources", "/articles", "Web articles saved as markdo
53
54
  await store.addContext("raw-sources", "/pdfs", "PDF files or their extracted text")
54
55
  await store.addContext("raw-sources", "/personal", "Personal notes flagged for wiki ingestion")
55
56
 
56
- console.log("\nSetup complete. Run: bun scripts/qmd/reindex.ts")
57
+ console.log("\nSetup complete. Run: pnpm qmd:reindex")
@@ -1,29 +1,19 @@
1
1
  {
2
2
  "compilerOptions": {
3
- // Environment setup & latest features
4
3
  "lib": ["ESNext"],
5
4
  "target": "ESNext",
6
- "module": "Preserve",
5
+ "module": "NodeNext",
6
+ "moduleResolution": "NodeNext",
7
7
  "moduleDetection": "force",
8
- "jsx": "react-jsx",
9
8
  "allowJs": true,
10
9
 
11
- // Bundler mode
12
- "moduleResolution": "bundler",
13
- "allowImportingTsExtensions": true,
14
10
  "verbatimModuleSyntax": true,
15
11
  "noEmit": true,
16
12
 
17
- // Best practices
18
13
  "strict": true,
19
14
  "skipLibCheck": true,
20
15
  "noFallthroughCasesInSwitch": true,
21
16
  "noUncheckedIndexedAccess": true,
22
- "noImplicitOverride": true,
23
-
24
- // Some stricter flags (disabled by default)
25
- "noUnusedLocals": false,
26
- "noUnusedParameters": false,
27
- "noPropertyAccessFromIndexSignature": false
17
+ "noImplicitOverride": true
28
18
  }
29
19
  }
@@ -1,14 +0,0 @@
1
- {
2
- "name": "qmd",
3
- "private": true,
4
- "peerDependencies": {
5
- "typescript": "^5"
6
- },
7
- "dependencies": {
8
- "@tobilu/qmd": "^2.1.0"
9
- },
10
- "devDependencies": {
11
- "@types/node": "^25.6.0",
12
- "@types/bun": "latest"
13
- }
14
- }