ralph-hero-knowledge-index 0.1.8 → 0.1.11

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 (31) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +1 -1
  3. package/dist/file-scanner.d.ts +1 -0
  4. package/dist/file-scanner.js +19 -0
  5. package/dist/file-scanner.js.map +1 -0
  6. package/dist/generate-indexes.d.ts +8 -0
  7. package/dist/generate-indexes.js +244 -0
  8. package/dist/generate-indexes.js.map +1 -0
  9. package/dist/reindex.d.ts +6 -1
  10. package/dist/reindex.js +65 -28
  11. package/dist/reindex.js.map +1 -1
  12. package/package.json +1 -1
  13. package/skills/setup/SKILL.md +51 -5
  14. package/skills/setup-obsidian/SKILL.md +122 -0
  15. package/skills/setup-workspace/iteration-1/eval-first-time-setup/with_skill/outputs/output.md +88 -0
  16. package/skills/setup-workspace/iteration-1/eval-first-time-setup/with_skill/timing.json +5 -0
  17. package/skills/setup-workspace/iteration-1/eval-first-time-setup/without_skill/outputs/output.md +86 -0
  18. package/skills/setup-workspace/iteration-1/eval-first-time-setup/without_skill/timing.json +5 -0
  19. package/skills/setup-workspace/iteration-1/eval-reindex-explicit-path/with_skill/outputs/output.md +75 -0
  20. package/skills/setup-workspace/iteration-1/eval-reindex-explicit-path/with_skill/timing.json +5 -0
  21. package/skills/setup-workspace/iteration-1/eval-reindex-explicit-path/without_skill/outputs/output.md +71 -0
  22. package/skills/setup-workspace/iteration-1/eval-reindex-explicit-path/without_skill/timing.json +5 -0
  23. package/skills/setup-workspace/iteration-1/eval-troubleshooting/with_skill/outputs/output.md +96 -0
  24. package/skills/setup-workspace/iteration-1/eval-troubleshooting/with_skill/timing.json +5 -0
  25. package/skills/setup-workspace/iteration-1/eval-troubleshooting/without_skill/outputs/output.md +133 -0
  26. package/skills/setup-workspace/iteration-1/eval-troubleshooting/without_skill/timing.json +5 -0
  27. package/src/__tests__/generate-indexes.test.ts +272 -0
  28. package/src/__tests__/reindex.test.ts +35 -0
  29. package/src/file-scanner.ts +18 -0
  30. package/src/generate-indexes.ts +277 -0
  31. package/src/reindex.ts +67 -29
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-knowledge",
3
- "version": "0.1.8",
3
+ "version": "0.1.11",
4
4
  "description": "Knowledge graph for ralph-hero: semantic search, relationship traversal, and document indexing across thoughts/ documents. Optional companion to ralph-hero.",
5
5
  "author": {
6
6
  "name": "Chad Dubiel",
package/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "ralph-knowledge": {
4
4
  "command": "npx",
5
- "args": ["-y", "ralph-hero-knowledge-index@0.1.8"]
5
+ "args": ["-y", "ralph-hero-knowledge-index@0.1.11"]
6
6
  }
7
7
  }
8
8
  }
@@ -0,0 +1 @@
1
+ export declare function findMarkdownFiles(dir: string): string[];
@@ -0,0 +1,19 @@
1
+ import { readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export function findMarkdownFiles(dir) {
4
+ const results = [];
5
+ function walk(d) {
6
+ for (const entry of readdirSync(d, { withFileTypes: true })) {
7
+ const fullPath = join(d, entry.name);
8
+ if (entry.isDirectory() && !entry.name.startsWith(".") && !entry.name.startsWith("_")) {
9
+ walk(fullPath);
10
+ }
11
+ else if (entry.isFile() && entry.name.endsWith(".md") && !entry.name.startsWith("_")) {
12
+ results.push(fullPath);
13
+ }
14
+ }
15
+ }
16
+ walk(dir);
17
+ return results;
18
+ }
19
+ //# sourceMappingURL=file-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../src/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,SAAS,IAAI,CAAC,CAAS;QACrB,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ParsedDocument } from "./parser.js";
2
+ export declare function formatIssueNumber(num: number): string;
3
+ export declare function frontmatter(fields: Record<string, unknown>): string;
4
+ export declare function writeTypeIndex(outDir: string, type: string, heading: string, docs: ParsedDocument[]): void;
5
+ export declare function writeIssueHubs(outDir: string, allDocs: ParsedDocument[]): void;
6
+ export declare function writeMasterIndex(outDir: string, allDocs: ParsedDocument[], hasUncategorized?: boolean): void;
7
+ export declare function writeQueryReference(outDir: string): void;
8
+ export declare function generateIndexes(outDir: string, allDocs: ParsedDocument[]): void;
@@ -0,0 +1,244 @@
1
+ import { writeFileSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { stringify as yamlStringify } from "yaml";
4
+ export function formatIssueNumber(num) {
5
+ return num < 10000 ? `GH-${String(num).padStart(4, "0")}` : `GH-${num}`;
6
+ }
7
+ export function frontmatter(fields) {
8
+ return `---\n${yamlStringify(fields).trimEnd()}\n---\n`;
9
+ }
10
+ export function writeTypeIndex(outDir, type, heading, docs) {
11
+ const active = docs.filter((d) => d.status !== "superseded");
12
+ const superseded = docs.filter((d) => d.status === "superseded");
13
+ const sortByDate = (a, b) => (b.date ?? "").localeCompare(a.date ?? "");
14
+ active.sort(sortByDate);
15
+ superseded.sort(sortByDate);
16
+ const lines = [
17
+ frontmatter({ generated: true, updated: new Date().toISOString().slice(0, 10) }),
18
+ `# ${heading}\n`,
19
+ ];
20
+ if (active.length > 0) {
21
+ lines.push("## Active\n");
22
+ for (const doc of active) {
23
+ const issue = doc.githubIssue ? ` — #${doc.githubIssue}` : "";
24
+ lines.push(`- [[${doc.id}]]${issue} · ${doc.title}`);
25
+ }
26
+ lines.push("");
27
+ }
28
+ if (superseded.length > 0) {
29
+ lines.push("## Superseded\n");
30
+ for (const doc of superseded) {
31
+ const supersededByRel = doc.relationships.find((r) => r.type === "superseded_by");
32
+ const arrow = supersededByRel ? ` → [[${supersededByRel.targetId}]]` : "";
33
+ lines.push(`- ~~[[${doc.id}]]~~${arrow}`);
34
+ }
35
+ lines.push("");
36
+ }
37
+ writeFileSync(join(outDir, `_${type}.md`), lines.join("\n"));
38
+ }
39
+ const TYPE_HEADINGS = {
40
+ research: "Research",
41
+ plan: "Plans",
42
+ idea: "Ideas",
43
+ review: "Reviews",
44
+ report: "Reports",
45
+ };
46
+ export function writeIssueHubs(outDir, allDocs) {
47
+ const byIssue = new Map();
48
+ for (const doc of allDocs) {
49
+ if (doc.githubIssue !== null) {
50
+ const list = byIssue.get(doc.githubIssue) ?? [];
51
+ list.push(doc);
52
+ byIssue.set(doc.githubIssue, list);
53
+ }
54
+ }
55
+ const issuesDir = join(outDir, "_issues");
56
+ mkdirSync(issuesDir, { recursive: true });
57
+ for (const [issueNum, docs] of byIssue) {
58
+ const fileName = `${formatIssueNumber(issueNum)}.md`;
59
+ const lines = [
60
+ frontmatter({ generated: true, github_issue: issueNum, updated: new Date().toISOString().slice(0, 10) }),
61
+ `# GH-${issueNum}\n`,
62
+ ];
63
+ const byType = new Map();
64
+ for (const doc of docs) {
65
+ const t = doc.type ?? "other";
66
+ const list = byType.get(t) ?? [];
67
+ list.push(doc);
68
+ byType.set(t, list);
69
+ }
70
+ for (const [type, heading] of Object.entries(TYPE_HEADINGS)) {
71
+ const typeDocs = byType.get(type);
72
+ if (typeDocs && typeDocs.length > 0) {
73
+ lines.push(`## ${heading}\n`);
74
+ for (const doc of typeDocs) {
75
+ lines.push(`- [[${doc.id}]] — ${doc.title}`);
76
+ }
77
+ lines.push("");
78
+ }
79
+ }
80
+ // Collect docs with null type ("other") or non-standard types (e.g., "meeting")
81
+ const otherDocs = [];
82
+ for (const [type, typeDocs] of byType) {
83
+ if (type !== "other" && TYPE_HEADINGS[type])
84
+ continue;
85
+ otherDocs.push(...typeDocs);
86
+ }
87
+ if (otherDocs.length > 0) {
88
+ lines.push("## Other\n");
89
+ for (const doc of otherDocs) {
90
+ lines.push(`- [[${doc.id}]] — ${doc.title}`);
91
+ }
92
+ lines.push("");
93
+ }
94
+ const allRels = docs.flatMap((d) => d.relationships);
95
+ if (allRels.length > 0) {
96
+ lines.push("## Relationships\n");
97
+ for (const rel of allRels) {
98
+ lines.push(`- ${rel.type}:: [[${rel.targetId}]]`);
99
+ }
100
+ lines.push("");
101
+ }
102
+ writeFileSync(join(issuesDir, fileName), lines.join("\n"));
103
+ }
104
+ }
105
+ const RECENT_LIMIT = 20;
106
+ export function writeMasterIndex(outDir, allDocs, hasUncategorized = false) {
107
+ const sorted = [...allDocs].sort((a, b) => (b.date ?? "").localeCompare(a.date ?? ""));
108
+ const recent = sorted.slice(0, RECENT_LIMIT);
109
+ const lines = [
110
+ frontmatter({ generated: true, updated: new Date().toISOString().slice(0, 10) }),
111
+ "# Knowledge Index\n",
112
+ "## Browse by Type\n",
113
+ "- [[_research]] — Research documents",
114
+ "- [[_plans]] — Implementation plans",
115
+ "- [[_ideas]] — Ideas and drafts",
116
+ "- [[_reviews]] — Code and plan reviews",
117
+ "- [[_reports]] — Status reports",
118
+ "- [[_queries]] — Dataview query snippets",
119
+ ];
120
+ if (hasUncategorized) {
121
+ lines.push("- [[_uncategorized]] — Uncategorized documents");
122
+ }
123
+ lines.push("");
124
+ if (recent.length > 0) {
125
+ lines.push("## Recent Documents\n");
126
+ for (const doc of recent) {
127
+ const type = doc.type ? `[${doc.type}]` : "";
128
+ const issue = doc.githubIssue ? ` #${doc.githubIssue}` : "";
129
+ lines.push(`- [[${doc.id}]] ${type}${issue} — ${doc.title}`);
130
+ }
131
+ lines.push("");
132
+ }
133
+ writeFileSync(join(outDir, "_index.md"), lines.join("\n"));
134
+ }
135
+ export function writeQueryReference(outDir) {
136
+ const content = `${frontmatter({ generated: true, updated: new Date().toISOString().slice(0, 10) })}
137
+ # Knowledge Queries
138
+
139
+ Pre-built Dataview queries. Copy any query block into a note to use it.
140
+ Requires the [Dataview](https://github.com/blacksmithgu/obsidian-dataview) community plugin.
141
+
142
+ ## All Research by Date
143
+
144
+ \`\`\`dataview
145
+ TABLE status, tags, github_issue as "Issue"
146
+ FROM "."
147
+ WHERE type = "research"
148
+ SORT date DESC
149
+ \`\`\`
150
+
151
+ ## Plans by Status
152
+
153
+ \`\`\`dataview
154
+ TABLE status, github_issue as "Issue", date
155
+ FROM "."
156
+ WHERE type = "plan"
157
+ SORT date DESC
158
+ \`\`\`
159
+
160
+ ## Documents by Tag
161
+
162
+ Replace \`"mcp-server"\` with your tag of interest:
163
+
164
+ \`\`\`dataview
165
+ TABLE type, status, date
166
+ FROM "."
167
+ WHERE contains(tags, "mcp-server")
168
+ SORT date DESC
169
+ \`\`\`
170
+
171
+ ## Documents by Issue Number
172
+
173
+ Replace \`564\` with your issue number:
174
+
175
+ \`\`\`dataview
176
+ TABLE type, status, date
177
+ FROM "."
178
+ WHERE github_issue = 564
179
+ SORT type ASC
180
+ \`\`\`
181
+
182
+ ## Draft Documents (Active Work)
183
+
184
+ \`\`\`dataview
185
+ TABLE type, github_issue as "Issue", date
186
+ FROM "."
187
+ WHERE status = "draft" AND !generated
188
+ SORT date DESC
189
+ \`\`\`
190
+
191
+ ## Superseded Documents
192
+
193
+ \`\`\`dataview
194
+ TABLE superseded_by, date
195
+ FROM "."
196
+ WHERE status = "superseded"
197
+ SORT date DESC
198
+ \`\`\`
199
+
200
+ ## Recently Modified
201
+
202
+ \`\`\`dataview
203
+ TABLE type, status, github_issue as "Issue"
204
+ FROM "."
205
+ WHERE !generated
206
+ SORT file.mtime DESC
207
+ LIMIT 20
208
+ \`\`\`
209
+
210
+ ## Issues with Research but No Plan
211
+
212
+ \`\`\`dataview
213
+ TABLE date, status
214
+ FROM "."
215
+ WHERE type = "research" AND github_issue
216
+ GROUP BY github_issue
217
+ FLATTEN github_issue as issue
218
+ WHERE !contains(rows.type, "plan")
219
+ \`\`\`
220
+ `;
221
+ writeFileSync(join(outDir, "_queries.md"), content);
222
+ }
223
+ const TYPE_INDEX_CONFIG = [
224
+ { type: "research", filename: "research", heading: "Research Documents" },
225
+ { type: "plan", filename: "plans", heading: "Implementation Plans" },
226
+ { type: "idea", filename: "ideas", heading: "Ideas & Drafts" },
227
+ { type: "review", filename: "reviews", heading: "Reviews" },
228
+ { type: "report", filename: "reports", heading: "Reports" },
229
+ ];
230
+ export function generateIndexes(outDir, allDocs) {
231
+ for (const { type, filename, heading } of TYPE_INDEX_CONFIG) {
232
+ const typeDocs = allDocs.filter((d) => d.type === type);
233
+ writeTypeIndex(outDir, filename, heading, typeDocs);
234
+ }
235
+ // Documents with type: null go into an "uncategorized" index
236
+ const uncategorized = allDocs.filter((d) => d.type === null || !TYPE_INDEX_CONFIG.some((c) => c.type === d.type));
237
+ if (uncategorized.length > 0) {
238
+ writeTypeIndex(outDir, "uncategorized", "Uncategorized Documents", uncategorized);
239
+ }
240
+ writeMasterIndex(outDir, allDocs, uncategorized.length > 0);
241
+ writeIssueHubs(outDir, allDocs);
242
+ writeQueryReference(outDir);
243
+ }
244
+ //# sourceMappingURL=generate-indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-indexes.js","sourceRoot":"","sources":["../src/generate-indexes.ts"],"names":[],"mappings":"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"}
package/dist/reindex.d.ts CHANGED
@@ -1 +1,6 @@
1
- export {};
1
+ export declare function reindex(dirs: string[], dbPath: string, generate?: boolean): Promise<void>;
2
+ export declare function resolveDirs(): {
3
+ dirs: string[];
4
+ dbPath: string;
5
+ generate: boolean;
6
+ };
package/dist/reindex.js CHANGED
@@ -1,29 +1,15 @@
1
- import { readFileSync, readdirSync } from "node:fs";
2
- import { join, relative, basename } from "node:path";
1
+ import { readFileSync } from "node:fs";
2
+ import { join, relative, resolve, basename } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { KnowledgeDB } from "./db.js";
5
5
  import { FtsSearch } from "./search.js";
6
6
  import { VectorSearch } from "./vector-search.js";
7
7
  import { embed, prepareTextForEmbedding } from "./embedder.js";
8
8
  import { parseDocument } from "./parser.js";
9
- function findMarkdownFiles(dir) {
10
- const results = [];
11
- function walk(d) {
12
- for (const entry of readdirSync(d, { withFileTypes: true })) {
13
- const fullPath = join(d, entry.name);
14
- if (entry.isDirectory() && !entry.name.startsWith(".")) {
15
- walk(fullPath);
16
- }
17
- else if (entry.isFile() && entry.name.endsWith(".md")) {
18
- results.push(fullPath);
19
- }
20
- }
21
- }
22
- walk(dir);
23
- return results;
24
- }
25
- async function reindex(thoughtsDir, dbPath) {
26
- console.log(`Indexing ${thoughtsDir} -> ${dbPath}`);
9
+ import { findMarkdownFiles } from "./file-scanner.js";
10
+ import { generateIndexes } from "./generate-indexes.js";
11
+ export async function reindex(dirs, dbPath, generate = false) {
12
+ console.log(`Indexing ${dirs.join(", ")} -> ${dbPath}`);
27
13
  const db = new KnowledgeDB(dbPath);
28
14
  const fts = new FtsSearch(db);
29
15
  const vec = new VectorSearch(db);
@@ -31,14 +17,35 @@ async function reindex(thoughtsDir, dbPath) {
31
17
  db.clearAll();
32
18
  vec.dropIndex();
33
19
  vec.createIndex();
34
- const files = findMarkdownFiles(thoughtsDir);
35
- console.log(`Found ${files.length} markdown files`);
20
+ const files = [];
21
+ for (const dir of dirs) {
22
+ const found = findMarkdownFiles(dir);
23
+ console.log(` ${dir}: ${found.length} files`);
24
+ files.push(...found);
25
+ }
26
+ console.log(`Found ${files.length} total markdown files`);
27
+ const parsedDocs = [];
36
28
  let indexed = 0;
37
29
  for (const filePath of files) {
38
30
  const raw = readFileSync(filePath, "utf-8");
39
- const relPath = relative(join(thoughtsDir, ".."), filePath);
31
+ const absPath = resolve(filePath);
32
+ const sourceDir = dirs.find(d => absPath.startsWith(resolve(d)));
33
+ const relPath = sourceDir
34
+ ? relative(resolve(sourceDir, ".."), absPath)
35
+ : filePath;
40
36
  const id = basename(filePath, ".md");
41
37
  const parsed = parseDocument(id, relPath, raw);
38
+ parsedDocs.push(parsed);
39
+ const missing = [];
40
+ if (!parsed.date)
41
+ missing.push("date");
42
+ if (!parsed.type)
43
+ missing.push("type");
44
+ if (!parsed.status)
45
+ missing.push("status");
46
+ if (missing.length > 0) {
47
+ console.warn(` Warning: ${id} missing frontmatter: ${missing.join(", ")}`);
48
+ }
42
49
  db.upsertDocument({
43
50
  id: parsed.id,
44
51
  path: parsed.path,
@@ -69,11 +76,41 @@ async function reindex(thoughtsDir, dbPath) {
69
76
  }
70
77
  }
71
78
  fts.rebuildIndex();
72
- console.log(`Done. ${indexed} documents indexed.`);
73
- db.close();
79
+ try {
80
+ if (generate && dirs.length > 0) {
81
+ console.log("Generating index notes...");
82
+ generateIndexes(dirs[0], parsedDocs);
83
+ console.log("Index notes generated.");
84
+ }
85
+ }
86
+ finally {
87
+ console.log(`Done. ${indexed} documents indexed.`);
88
+ db.close();
89
+ }
74
90
  }
75
91
  const DEFAULT_DB_PATH = join(homedir(), ".ralph-hero", "knowledge.db");
76
- const thoughtsDir = process.argv[2] ?? "../../thoughts";
77
- const dbPath = process.argv[3] ?? DEFAULT_DB_PATH;
78
- reindex(thoughtsDir, dbPath).catch(console.error);
92
+ export function resolveDirs() {
93
+ const cliArgs = process.argv.slice(2);
94
+ const noGenerate = cliArgs.includes("--no-generate");
95
+ const positional = cliArgs.filter(a => !a.startsWith("--"));
96
+ const cliDb = positional.find(a => a.endsWith(".db"));
97
+ const cliDirs = positional.filter(a => !a.endsWith(".db"));
98
+ if (cliDirs.length > 0) {
99
+ return { dirs: cliDirs, dbPath: cliDb ?? DEFAULT_DB_PATH, generate: !noGenerate };
100
+ }
101
+ const envDirs = process.env.RALPH_KNOWLEDGE_DIRS;
102
+ if (envDirs) {
103
+ return {
104
+ dirs: envDirs.split(",").map(d => d.trim()).filter(Boolean),
105
+ dbPath: cliDb ?? process.env.RALPH_KNOWLEDGE_DB ?? DEFAULT_DB_PATH,
106
+ generate: !noGenerate,
107
+ };
108
+ }
109
+ return { dirs: ["../../thoughts"], dbPath: cliDb ?? DEFAULT_DB_PATH, generate: !noGenerate };
110
+ }
111
+ const isMain = process.argv[1]?.endsWith("reindex.js");
112
+ if (isMain) {
113
+ const { dirs, dbPath, generate } = resolveDirs();
114
+ reindex(dirs, dbPath, generate).catch(console.error);
115
+ }
79
116
  //# sourceMappingURL=reindex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../src/reindex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../src/reindex.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-hero-knowledge-index",
3
- "version": "0.1.8",
3
+ "version": "0.1.11",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  description: Set up or rebuild the ralph-knowledge index from markdown documents. Use when setting up ralph-knowledge for the first time, reindexing after adding new documents, rebuilding a corrupted knowledge DB, or when knowledge_search returns empty results. Also use when the user mentions "index thoughts", "reindex", "set up knowledge", or "knowledge search not working".
3
- argument-hint: "[thoughts-directory]"
3
+ argument-hint: "[directory1,directory2,...]"
4
4
  ---
5
5
 
6
6
  # Ralph Knowledge Setup
7
7
 
8
- Interactive setup and reindex skill for the ralph-knowledge plugin. Indexes markdown documents from a `thoughts/` directory into a SQLite database with full-text search and semantic embeddings.
8
+ Interactive setup and reindex skill for the ralph-knowledge plugin. Indexes markdown documents from one or more directories into a SQLite database with full-text search and semantic embeddings.
9
9
 
10
10
  ## Prerequisites
11
11
 
@@ -41,6 +41,36 @@ Proceed with indexing?
41
41
 
42
42
  If not found, ask the user for the path.
43
43
 
44
+ ### Step 1b: Additional directories
45
+
46
+ After confirming the thoughts directory, check if `RALPH_KNOWLEDGE_DIRS` is set in the environment. If it contains additional directories beyond the one found in Step 1, note them:
47
+
48
+ ```
49
+ Also indexing from RALPH_KNOWLEDGE_DIRS: docs/plans, docs/adr
50
+ ```
51
+
52
+ If `RALPH_KNOWLEDGE_DIRS` is NOT set, ask:
53
+
54
+ ```
55
+ Would you like to index additional directories alongside thoughts/?
56
+ Common choices: docs/, docs/plans/, docs/adr/
57
+
58
+ Enter comma-separated paths (relative to project root), or press Enter to skip:
59
+ ```
60
+
61
+ If the user provides additional directories, validate each exists. Combine all directories into a single list for Step 3.
62
+
63
+ If the user wants to persist this, suggest:
64
+
65
+ ```
66
+ To persist, add to .claude/settings.local.json:
67
+ {
68
+ "env": {
69
+ "RALPH_KNOWLEDGE_DIRS": "thoughts,docs/plans"
70
+ }
71
+ }
72
+ ```
73
+
44
74
  ### Step 2: Determine the DB path
45
75
 
46
76
  The default DB path is `~/.ralph-hero/knowledge.db`. The directory is auto-created if it doesn't exist.
@@ -55,9 +85,11 @@ The reindex script is bundled in the npm package. Install it to a temp location
55
85
 
56
86
  ```bash
57
87
  cd /tmp && npm install --no-save ralph-hero-knowledge-index@latest 2>&1 | tail -3
58
- node /tmp/node_modules/ralph-hero-knowledge-index/dist/reindex.js [thoughts-dir] [db-path]
88
+ node /tmp/node_modules/ralph-hero-knowledge-index/dist/reindex.js [dir1] [dir2] ... [db-path]
59
89
  ```
60
90
 
91
+ Pass all directories as separate arguments, followed by the database path (ending in `.db`).
92
+
61
93
  Display the output as it runs. The script will:
62
94
  - Scan for all `.md` files recursively (skipping dot-directories)
63
95
  - Parse frontmatter (title, date, type, status, tags)
@@ -89,12 +121,26 @@ Knowledge Index Ready
89
121
  =====================
90
122
  Documents indexed: [N]
91
123
  Database: [db-path]
92
- Thoughts directory: [thoughts-dir]
124
+ Directories indexed:
125
+ - thoughts/
126
+ - docs/plans/
93
127
 
94
128
  Tools available:
95
129
  - knowledge_search: Keyword + semantic search across documents
96
130
  - knowledge_traverse: Walk relationship edges between documents
97
131
 
98
132
  To reindex after adding new documents:
99
- /ralph-knowledge:setup [thoughts-dir]
133
+ /ralph-knowledge:setup
134
+ ```
135
+
136
+ Then suggest:
137
+ ```
138
+ Want to browse your knowledge documents in Obsidian?
139
+ Run /ralph-knowledge:setup-obsidian to set up navigational indexes and vault config.
140
+ ```
141
+
142
+ Then suggest:
143
+ ```
144
+ Want to browse your knowledge documents in Obsidian?
145
+ Run /ralph-knowledge:setup-obsidian to set up navigational indexes and vault config.
100
146
  ```