ralph-hero-knowledge-index 0.1.10 → 0.1.12
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/.claude-plugin/plugin.json +1 -1
- package/.mcp.json +1 -1
- package/dist/file-scanner.d.ts +1 -0
- package/dist/file-scanner.js +19 -0
- package/dist/file-scanner.js.map +1 -0
- package/dist/generate-indexes.d.ts +8 -0
- package/dist/generate-indexes.js +247 -0
- package/dist/generate-indexes.js.map +1 -0
- package/dist/parser.d.ts +1 -0
- package/dist/parser.js +17 -1
- package/dist/parser.js.map +1 -1
- package/dist/reindex.d.ts +2 -2
- package/dist/reindex.js +36 -26
- package/dist/reindex.js.map +1 -1
- package/package.json +1 -1
- package/skills/setup/SKILL.md +12 -0
- package/skills/setup-obsidian/SKILL.md +122 -0
- package/src/__tests__/generate-indexes.test.ts +288 -0
- package/src/__tests__/parser.test.ts +65 -1
- package/src/__tests__/reindex.test.ts +1 -1
- package/src/file-scanner.ts +18 -0
- package/src/generate-indexes.ts +280 -0
- package/src/parser.ts +18 -1
- package/src/reindex.ts +35 -28
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ralph-knowledge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
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
|
@@ -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,247 @@
|
|
|
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
|
+
spec: "Specs",
|
|
43
|
+
idea: "Ideas",
|
|
44
|
+
review: "Reviews",
|
|
45
|
+
report: "Reports",
|
|
46
|
+
};
|
|
47
|
+
export function writeIssueHubs(outDir, allDocs) {
|
|
48
|
+
const byIssue = new Map();
|
|
49
|
+
for (const doc of allDocs) {
|
|
50
|
+
if (doc.githubIssue !== null) {
|
|
51
|
+
const list = byIssue.get(doc.githubIssue) ?? [];
|
|
52
|
+
list.push(doc);
|
|
53
|
+
byIssue.set(doc.githubIssue, list);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const issuesDir = join(outDir, "_issues");
|
|
57
|
+
mkdirSync(issuesDir, { recursive: true });
|
|
58
|
+
for (const [issueNum, docs] of byIssue) {
|
|
59
|
+
const fileName = `${formatIssueNumber(issueNum)}.md`;
|
|
60
|
+
const lines = [
|
|
61
|
+
frontmatter({ generated: true, github_issue: issueNum, updated: new Date().toISOString().slice(0, 10) }),
|
|
62
|
+
`# GH-${issueNum}\n`,
|
|
63
|
+
];
|
|
64
|
+
const byType = new Map();
|
|
65
|
+
for (const doc of docs) {
|
|
66
|
+
const t = doc.type ?? "other";
|
|
67
|
+
const list = byType.get(t) ?? [];
|
|
68
|
+
list.push(doc);
|
|
69
|
+
byType.set(t, list);
|
|
70
|
+
}
|
|
71
|
+
for (const [type, heading] of Object.entries(TYPE_HEADINGS)) {
|
|
72
|
+
const typeDocs = byType.get(type);
|
|
73
|
+
if (typeDocs && typeDocs.length > 0) {
|
|
74
|
+
lines.push(`## ${heading}\n`);
|
|
75
|
+
for (const doc of typeDocs) {
|
|
76
|
+
lines.push(`- [[${doc.id}]] — ${doc.title}`);
|
|
77
|
+
}
|
|
78
|
+
lines.push("");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Collect docs with null type ("other") or non-standard types (e.g., "meeting")
|
|
82
|
+
const otherDocs = [];
|
|
83
|
+
for (const [type, typeDocs] of byType) {
|
|
84
|
+
if (type !== "other" && TYPE_HEADINGS[type])
|
|
85
|
+
continue;
|
|
86
|
+
otherDocs.push(...typeDocs);
|
|
87
|
+
}
|
|
88
|
+
if (otherDocs.length > 0) {
|
|
89
|
+
lines.push("## Other\n");
|
|
90
|
+
for (const doc of otherDocs) {
|
|
91
|
+
lines.push(`- [[${doc.id}]] — ${doc.title}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push("");
|
|
94
|
+
}
|
|
95
|
+
const allRels = docs.flatMap((d) => d.relationships);
|
|
96
|
+
if (allRels.length > 0) {
|
|
97
|
+
lines.push("## Relationships\n");
|
|
98
|
+
for (const rel of allRels) {
|
|
99
|
+
lines.push(`- ${rel.type}:: [[${rel.targetId}]]`);
|
|
100
|
+
}
|
|
101
|
+
lines.push("");
|
|
102
|
+
}
|
|
103
|
+
writeFileSync(join(issuesDir, fileName), lines.join("\n"));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const RECENT_LIMIT = 20;
|
|
107
|
+
export function writeMasterIndex(outDir, allDocs, hasUncategorized = false) {
|
|
108
|
+
const sorted = [...allDocs].sort((a, b) => (b.date ?? "").localeCompare(a.date ?? ""));
|
|
109
|
+
const recent = sorted.slice(0, RECENT_LIMIT);
|
|
110
|
+
const lines = [
|
|
111
|
+
frontmatter({ generated: true, updated: new Date().toISOString().slice(0, 10) }),
|
|
112
|
+
"# Knowledge Index\n",
|
|
113
|
+
"## Browse by Type\n",
|
|
114
|
+
"- [[_research]] — Research documents",
|
|
115
|
+
"- [[_plans]] — Implementation plans",
|
|
116
|
+
"- [[_specs]] — Specifications",
|
|
117
|
+
"- [[_ideas]] — Ideas and drafts",
|
|
118
|
+
"- [[_reviews]] — Code and plan reviews",
|
|
119
|
+
"- [[_reports]] — Status reports",
|
|
120
|
+
"- [[_queries]] — Dataview query snippets",
|
|
121
|
+
];
|
|
122
|
+
if (hasUncategorized) {
|
|
123
|
+
lines.push("- [[_uncategorized]] — Uncategorized documents");
|
|
124
|
+
}
|
|
125
|
+
lines.push("");
|
|
126
|
+
if (recent.length > 0) {
|
|
127
|
+
lines.push("## Recent Documents\n");
|
|
128
|
+
for (const doc of recent) {
|
|
129
|
+
const type = doc.type ? `[${doc.type}]` : "";
|
|
130
|
+
const issue = doc.githubIssue ? ` #${doc.githubIssue}` : "";
|
|
131
|
+
lines.push(`- [[${doc.id}]] ${type}${issue} — ${doc.title}`);
|
|
132
|
+
}
|
|
133
|
+
lines.push("");
|
|
134
|
+
}
|
|
135
|
+
writeFileSync(join(outDir, "_index.md"), lines.join("\n"));
|
|
136
|
+
}
|
|
137
|
+
export function writeQueryReference(outDir) {
|
|
138
|
+
const content = `${frontmatter({ generated: true, updated: new Date().toISOString().slice(0, 10) })}
|
|
139
|
+
# Knowledge Queries
|
|
140
|
+
|
|
141
|
+
Pre-built Dataview queries. Copy any query block into a note to use it.
|
|
142
|
+
Requires the [Dataview](https://github.com/blacksmithgu/obsidian-dataview) community plugin.
|
|
143
|
+
|
|
144
|
+
## All Research by Date
|
|
145
|
+
|
|
146
|
+
\`\`\`dataview
|
|
147
|
+
TABLE status, tags, github_issue as "Issue"
|
|
148
|
+
FROM "."
|
|
149
|
+
WHERE type = "research"
|
|
150
|
+
SORT date DESC
|
|
151
|
+
\`\`\`
|
|
152
|
+
|
|
153
|
+
## Plans by Status
|
|
154
|
+
|
|
155
|
+
\`\`\`dataview
|
|
156
|
+
TABLE status, github_issue as "Issue", date
|
|
157
|
+
FROM "."
|
|
158
|
+
WHERE type = "plan"
|
|
159
|
+
SORT date DESC
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
## Documents by Tag
|
|
163
|
+
|
|
164
|
+
Replace \`"mcp-server"\` with your tag of interest:
|
|
165
|
+
|
|
166
|
+
\`\`\`dataview
|
|
167
|
+
TABLE type, status, date
|
|
168
|
+
FROM "."
|
|
169
|
+
WHERE contains(tags, "mcp-server")
|
|
170
|
+
SORT date DESC
|
|
171
|
+
\`\`\`
|
|
172
|
+
|
|
173
|
+
## Documents by Issue Number
|
|
174
|
+
|
|
175
|
+
Replace \`564\` with your issue number:
|
|
176
|
+
|
|
177
|
+
\`\`\`dataview
|
|
178
|
+
TABLE type, status, date
|
|
179
|
+
FROM "."
|
|
180
|
+
WHERE github_issue = 564
|
|
181
|
+
SORT type ASC
|
|
182
|
+
\`\`\`
|
|
183
|
+
|
|
184
|
+
## Draft Documents (Active Work)
|
|
185
|
+
|
|
186
|
+
\`\`\`dataview
|
|
187
|
+
TABLE type, github_issue as "Issue", date
|
|
188
|
+
FROM "."
|
|
189
|
+
WHERE status = "draft" AND !generated
|
|
190
|
+
SORT date DESC
|
|
191
|
+
\`\`\`
|
|
192
|
+
|
|
193
|
+
## Superseded Documents
|
|
194
|
+
|
|
195
|
+
\`\`\`dataview
|
|
196
|
+
TABLE superseded_by, date
|
|
197
|
+
FROM "."
|
|
198
|
+
WHERE status = "superseded"
|
|
199
|
+
SORT date DESC
|
|
200
|
+
\`\`\`
|
|
201
|
+
|
|
202
|
+
## Recently Modified
|
|
203
|
+
|
|
204
|
+
\`\`\`dataview
|
|
205
|
+
TABLE type, status, github_issue as "Issue"
|
|
206
|
+
FROM "."
|
|
207
|
+
WHERE !generated
|
|
208
|
+
SORT file.mtime DESC
|
|
209
|
+
LIMIT 20
|
|
210
|
+
\`\`\`
|
|
211
|
+
|
|
212
|
+
## Issues with Research but No Plan
|
|
213
|
+
|
|
214
|
+
\`\`\`dataview
|
|
215
|
+
TABLE date, status
|
|
216
|
+
FROM "."
|
|
217
|
+
WHERE type = "research" AND github_issue
|
|
218
|
+
GROUP BY github_issue
|
|
219
|
+
FLATTEN github_issue as issue
|
|
220
|
+
WHERE !contains(rows.type, "plan")
|
|
221
|
+
\`\`\`
|
|
222
|
+
`;
|
|
223
|
+
writeFileSync(join(outDir, "_queries.md"), content);
|
|
224
|
+
}
|
|
225
|
+
const TYPE_INDEX_CONFIG = [
|
|
226
|
+
{ type: "research", filename: "research", heading: "Research Documents" },
|
|
227
|
+
{ type: "plan", filename: "plans", heading: "Implementation Plans" },
|
|
228
|
+
{ type: "spec", filename: "specs", heading: "Specifications" },
|
|
229
|
+
{ type: "idea", filename: "ideas", heading: "Ideas & Drafts" },
|
|
230
|
+
{ type: "review", filename: "reviews", heading: "Reviews" },
|
|
231
|
+
{ type: "report", filename: "reports", heading: "Reports" },
|
|
232
|
+
];
|
|
233
|
+
export function generateIndexes(outDir, allDocs) {
|
|
234
|
+
for (const { type, filename, heading } of TYPE_INDEX_CONFIG) {
|
|
235
|
+
const typeDocs = allDocs.filter((d) => d.type === type);
|
|
236
|
+
writeTypeIndex(outDir, filename, heading, typeDocs);
|
|
237
|
+
}
|
|
238
|
+
// Documents with type: null go into an "uncategorized" index
|
|
239
|
+
const uncategorized = allDocs.filter((d) => d.type === null || !TYPE_INDEX_CONFIG.some((c) => c.type === d.type));
|
|
240
|
+
if (uncategorized.length > 0) {
|
|
241
|
+
writeTypeIndex(outDir, "uncategorized", "Uncategorized Documents", uncategorized);
|
|
242
|
+
}
|
|
243
|
+
writeMasterIndex(outDir, allDocs, uncategorized.length > 0);
|
|
244
|
+
writeIssueHubs(outDir, allDocs);
|
|
245
|
+
writeQueryReference(outDir);
|
|
246
|
+
}
|
|
247
|
+
//# 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/parser.d.ts
CHANGED
package/dist/parser.js
CHANGED
|
@@ -3,6 +3,20 @@ const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---/;
|
|
|
3
3
|
const TITLE_RE = /^# (.+)$/m;
|
|
4
4
|
const WIKILINK_REL_RE = /^- (builds_on|tensions):: \[\[(.+?)\]\]/gm;
|
|
5
5
|
const SUPERSEDED_BY_RE = /\[\[(.+?)\]\]/;
|
|
6
|
+
const PATH_TYPE_MAP = [
|
|
7
|
+
{ segment: "/research/", type: "research" },
|
|
8
|
+
{ segment: "/plans/", type: "plan" },
|
|
9
|
+
{ segment: "/ideas/", type: "idea" },
|
|
10
|
+
{ segment: "/reviews/", type: "review" },
|
|
11
|
+
{ segment: "/reports/", type: "report" },
|
|
12
|
+
];
|
|
13
|
+
export function inferTypeFromPath(path) {
|
|
14
|
+
for (const { segment, type } of PATH_TYPE_MAP) {
|
|
15
|
+
if (path.includes(segment))
|
|
16
|
+
return type;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
6
20
|
export function parseDocument(id, path, raw) {
|
|
7
21
|
const fmMatch = raw.match(FRONTMATTER_RE);
|
|
8
22
|
const frontmatter = fmMatch ? parseYaml(fmMatch[1]) ?? {} : {};
|
|
@@ -30,7 +44,9 @@ export function parseDocument(id, path, raw) {
|
|
|
30
44
|
return {
|
|
31
45
|
id, path, title,
|
|
32
46
|
date: frontmatter.date ? String(frontmatter.date) : null,
|
|
33
|
-
type: frontmatter.type
|
|
47
|
+
type: (typeof frontmatter.type === "string" && frontmatter.type.length > 0)
|
|
48
|
+
? frontmatter.type
|
|
49
|
+
: inferTypeFromPath(path),
|
|
34
50
|
status: frontmatter.status ?? null,
|
|
35
51
|
githubIssue: typeof frontmatter.github_issue === "number"
|
|
36
52
|
? frontmatter.github_issue
|
package/dist/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAqB1C,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC;AAC7B,MAAM,eAAe,GAAG,2CAA2C,CAAC;AACpE,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,IAAY,EAAE,GAAW;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErD,MAAM,aAAa,GAAmB,EAAE,CAAC;IACzC,IAAI,KAA6B,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;YAClB,IAAI,EAAE,KAAK,CAAC,CAAC,CAA6B;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,CAAC;IAC/C,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,OAAO,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAa,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3F,OAAO;QACL,EAAE,EAAE,IAAI,EAAE,KAAK;QACf,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
package/dist/reindex.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export declare function
|
|
2
|
-
export declare function reindex(dirs: string[], dbPath: string): Promise<void>;
|
|
1
|
+
export declare function reindex(dirs: string[], dbPath: string, generate?: boolean): Promise<void>;
|
|
3
2
|
export declare function resolveDirs(): {
|
|
4
3
|
dirs: string[];
|
|
5
4
|
dbPath: string;
|
|
5
|
+
generate: boolean;
|
|
6
6
|
};
|
package/dist/reindex.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFileSync
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
2
|
import { join, relative, resolve, basename } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { KnowledgeDB } from "./db.js";
|
|
@@ -6,23 +6,9 @@ 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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
export async function reindex(dirs, dbPath) {
|
|
9
|
+
import { findMarkdownFiles } from "./file-scanner.js";
|
|
10
|
+
import { generateIndexes } from "./generate-indexes.js";
|
|
11
|
+
export async function reindex(dirs, dbPath, generate = false) {
|
|
26
12
|
console.log(`Indexing ${dirs.join(", ")} -> ${dbPath}`);
|
|
27
13
|
const db = new KnowledgeDB(dbPath);
|
|
28
14
|
const fts = new FtsSearch(db);
|
|
@@ -38,6 +24,7 @@ export async function reindex(dirs, dbPath) {
|
|
|
38
24
|
files.push(...found);
|
|
39
25
|
}
|
|
40
26
|
console.log(`Found ${files.length} total markdown files`);
|
|
27
|
+
const parsedDocs = [];
|
|
41
28
|
let indexed = 0;
|
|
42
29
|
for (const filePath of files) {
|
|
43
30
|
const raw = readFileSync(filePath, "utf-8");
|
|
@@ -48,6 +35,17 @@ export async function reindex(dirs, dbPath) {
|
|
|
48
35
|
: filePath;
|
|
49
36
|
const id = basename(filePath, ".md");
|
|
50
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
|
+
}
|
|
51
49
|
db.upsertDocument({
|
|
52
50
|
id: parsed.id,
|
|
53
51
|
path: parsed.path,
|
|
@@ -78,29 +76,41 @@ export async function reindex(dirs, dbPath) {
|
|
|
78
76
|
}
|
|
79
77
|
}
|
|
80
78
|
fts.rebuildIndex();
|
|
81
|
-
|
|
82
|
-
|
|
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
|
+
}
|
|
83
90
|
}
|
|
84
91
|
const DEFAULT_DB_PATH = join(homedir(), ".ralph-hero", "knowledge.db");
|
|
85
92
|
export function resolveDirs() {
|
|
86
93
|
const cliArgs = process.argv.slice(2);
|
|
87
|
-
const
|
|
88
|
-
const
|
|
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"));
|
|
89
98
|
if (cliDirs.length > 0) {
|
|
90
|
-
return { dirs: cliDirs, dbPath: cliDb ?? DEFAULT_DB_PATH };
|
|
99
|
+
return { dirs: cliDirs, dbPath: cliDb ?? DEFAULT_DB_PATH, generate: !noGenerate };
|
|
91
100
|
}
|
|
92
101
|
const envDirs = process.env.RALPH_KNOWLEDGE_DIRS;
|
|
93
102
|
if (envDirs) {
|
|
94
103
|
return {
|
|
95
104
|
dirs: envDirs.split(",").map(d => d.trim()).filter(Boolean),
|
|
96
105
|
dbPath: cliDb ?? process.env.RALPH_KNOWLEDGE_DB ?? DEFAULT_DB_PATH,
|
|
106
|
+
generate: !noGenerate,
|
|
97
107
|
};
|
|
98
108
|
}
|
|
99
|
-
return { dirs: ["../../thoughts"], dbPath: cliDb ?? DEFAULT_DB_PATH };
|
|
109
|
+
return { dirs: ["../../thoughts"], dbPath: cliDb ?? DEFAULT_DB_PATH, generate: !noGenerate };
|
|
100
110
|
}
|
|
101
111
|
const isMain = process.argv[1]?.endsWith("reindex.js");
|
|
102
112
|
if (isMain) {
|
|
103
|
-
const { dirs, dbPath } = resolveDirs();
|
|
104
|
-
reindex(dirs, dbPath).catch(console.error);
|
|
113
|
+
const { dirs, dbPath, generate } = resolveDirs();
|
|
114
|
+
reindex(dirs, dbPath, generate).catch(console.error);
|
|
105
115
|
}
|
|
106
116
|
//# sourceMappingURL=reindex.js.map
|
package/dist/reindex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../src/reindex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../src/reindex.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/setup/SKILL.md
CHANGED
|
@@ -132,3 +132,15 @@ Tools available:
|
|
|
132
132
|
To reindex after adding new documents:
|
|
133
133
|
/ralph-knowledge:setup
|
|
134
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.
|
|
146
|
+
```
|