@blacksmithers/vaultforge 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +464 -0
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +705 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/tool-handlers.d.ts +79 -0
  8. package/dist/tool-handlers.d.ts.map +1 -0
  9. package/dist/tool-handlers.js +326 -0
  10. package/dist/tool-handlers.js.map +1 -0
  11. package/dist/tools/canvas/canvas-create.d.ts +4 -0
  12. package/dist/tools/canvas/canvas-create.d.ts.map +1 -0
  13. package/dist/tools/canvas/canvas-create.js +243 -0
  14. package/dist/tools/canvas/canvas-create.js.map +1 -0
  15. package/dist/tools/canvas/canvas-patch.d.ts +4 -0
  16. package/dist/tools/canvas/canvas-patch.d.ts.map +1 -0
  17. package/dist/tools/canvas/canvas-patch.js +225 -0
  18. package/dist/tools/canvas/canvas-patch.js.map +1 -0
  19. package/dist/tools/canvas/canvas-read.d.ts +4 -0
  20. package/dist/tools/canvas/canvas-read.d.ts.map +1 -0
  21. package/dist/tools/canvas/canvas-read.js +97 -0
  22. package/dist/tools/canvas/canvas-read.js.map +1 -0
  23. package/dist/tools/canvas/canvas-relayout.d.ts +4 -0
  24. package/dist/tools/canvas/canvas-relayout.d.ts.map +1 -0
  25. package/dist/tools/canvas/canvas-relayout.js +152 -0
  26. package/dist/tools/canvas/canvas-relayout.js.map +1 -0
  27. package/dist/tools/canvas/canvas-utils.d.ts +40 -0
  28. package/dist/tools/canvas/canvas-utils.d.ts.map +1 -0
  29. package/dist/tools/canvas/canvas-utils.js +141 -0
  30. package/dist/tools/canvas/canvas-utils.js.map +1 -0
  31. package/dist/tools/canvas/layout-engine.d.ts +34 -0
  32. package/dist/tools/canvas/layout-engine.d.ts.map +1 -0
  33. package/dist/tools/canvas/layout-engine.js +75 -0
  34. package/dist/tools/canvas/layout-engine.js.map +1 -0
  35. package/dist/tools/canvas/types.d.ts +71 -0
  36. package/dist/tools/canvas/types.d.ts.map +1 -0
  37. package/dist/tools/canvas/types.js +2 -0
  38. package/dist/tools/canvas/types.js.map +1 -0
  39. package/dist/tools/files/batch-rename.d.ts +4 -0
  40. package/dist/tools/files/batch-rename.d.ts.map +1 -0
  41. package/dist/tools/files/batch-rename.js +140 -0
  42. package/dist/tools/files/batch-rename.js.map +1 -0
  43. package/dist/tools/files/delete-folder.d.ts +17 -0
  44. package/dist/tools/files/delete-folder.d.ts.map +1 -0
  45. package/dist/tools/files/delete-folder.js +100 -0
  46. package/dist/tools/files/delete-folder.js.map +1 -0
  47. package/dist/tools/files/prune-empty-dirs.d.ts +17 -0
  48. package/dist/tools/files/prune-empty-dirs.d.ts.map +1 -0
  49. package/dist/tools/files/prune-empty-dirs.js +106 -0
  50. package/dist/tools/files/prune-empty-dirs.js.map +1 -0
  51. package/dist/tools/intelligence/clustering.d.ts +15 -0
  52. package/dist/tools/intelligence/clustering.d.ts.map +1 -0
  53. package/dist/tools/intelligence/clustering.js +93 -0
  54. package/dist/tools/intelligence/clustering.js.map +1 -0
  55. package/dist/tools/intelligence/tfidf.d.ts +19 -0
  56. package/dist/tools/intelligence/tfidf.d.ts.map +1 -0
  57. package/dist/tools/intelligence/tfidf.js +68 -0
  58. package/dist/tools/intelligence/tfidf.js.map +1 -0
  59. package/dist/tools/intelligence/vault-suggest.d.ts +7 -0
  60. package/dist/tools/intelligence/vault-suggest.d.ts.map +1 -0
  61. package/dist/tools/intelligence/vault-suggest.js +307 -0
  62. package/dist/tools/intelligence/vault-suggest.js.map +1 -0
  63. package/dist/tools/intelligence/vault-themes.d.ts +30 -0
  64. package/dist/tools/intelligence/vault-themes.d.ts.map +1 -0
  65. package/dist/tools/intelligence/vault-themes.js +88 -0
  66. package/dist/tools/intelligence/vault-themes.js.map +1 -0
  67. package/dist/tools/links/backlinks.d.ts +4 -0
  68. package/dist/tools/links/backlinks.d.ts.map +1 -0
  69. package/dist/tools/links/backlinks.js +50 -0
  70. package/dist/tools/links/backlinks.js.map +1 -0
  71. package/dist/tools/links/link-utils.d.ts +23 -0
  72. package/dist/tools/links/link-utils.d.ts.map +1 -0
  73. package/dist/tools/links/link-utils.js +63 -0
  74. package/dist/tools/links/link-utils.js.map +1 -0
  75. package/dist/tools/links/update-links.d.ts +16 -0
  76. package/dist/tools/links/update-links.d.ts.map +1 -0
  77. package/dist/tools/links/update-links.js +88 -0
  78. package/dist/tools/links/update-links.js.map +1 -0
  79. package/dist/tools/metadata/frontmatter.d.ts +12 -0
  80. package/dist/tools/metadata/frontmatter.d.ts.map +1 -0
  81. package/dist/tools/metadata/frontmatter.js +190 -0
  82. package/dist/tools/metadata/frontmatter.js.map +1 -0
  83. package/dist/tools/notes/edit-regex.d.ts +4 -0
  84. package/dist/tools/notes/edit-regex.d.ts.map +1 -0
  85. package/dist/tools/notes/edit-regex.js +142 -0
  86. package/dist/tools/notes/edit-regex.js.map +1 -0
  87. package/dist/tools/search/markdown-parser.d.ts +12 -0
  88. package/dist/tools/search/markdown-parser.d.ts.map +1 -0
  89. package/dist/tools/search/markdown-parser.js +64 -0
  90. package/dist/tools/search/markdown-parser.js.map +1 -0
  91. package/dist/tools/search/orama-engine.d.ts +76 -0
  92. package/dist/tools/search/orama-engine.d.ts.map +1 -0
  93. package/dist/tools/search/orama-engine.js +152 -0
  94. package/dist/tools/search/orama-engine.js.map +1 -0
  95. package/dist/tools/search/search-reindex.d.ts +7 -0
  96. package/dist/tools/search/search-reindex.d.ts.map +1 -0
  97. package/dist/tools/search/search-reindex.js +34 -0
  98. package/dist/tools/search/search-reindex.js.map +1 -0
  99. package/dist/tools/search/smart-search.d.ts +7 -0
  100. package/dist/tools/search/smart-search.d.ts.map +1 -0
  101. package/dist/tools/search/smart-search.js +102 -0
  102. package/dist/tools/search/smart-search.js.map +1 -0
  103. package/dist/vault-index.d.ts +95 -0
  104. package/dist/vault-index.d.ts.map +1 -0
  105. package/dist/vault-index.js +432 -0
  106. package/dist/vault-index.js.map +1 -0
  107. package/package.json +60 -0
@@ -0,0 +1,432 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { watch as fsWatch } from "node:fs";
3
+ import path from "node:path";
4
+ export class VaultIndex {
5
+ vaultPath;
6
+ ignoreDirs;
7
+ /** rel path → FileEntry */
8
+ files = new Map();
9
+ /** stem (lowercase) → rel paths (for fast name lookup) */
10
+ byName = new Map();
11
+ /** directory rel path → child rel paths */
12
+ byDir = new Map();
13
+ /** fs watchers */
14
+ watchers = [];
15
+ ready = false;
16
+ readyPromise;
17
+ resolveReady;
18
+ constructor(vaultPath, ignoreDirs = new Set([".obsidian", ".git", ".trash", "node_modules", ".DS_Store"])) {
19
+ this.vaultPath = vaultPath;
20
+ this.ignoreDirs = ignoreDirs;
21
+ this.readyPromise = new Promise((r) => (this.resolveReady = r));
22
+ }
23
+ // ── Lifecycle ──────────────────────────────────────────────────────
24
+ async init() {
25
+ const start = Date.now();
26
+ await this.scanDir("");
27
+ this.ready = true;
28
+ this.resolveReady();
29
+ this.startWatching();
30
+ const elapsed = Date.now() - start;
31
+ console.error(`[vault-index] Indexed ${this.files.size} files in ${elapsed}ms`);
32
+ }
33
+ async waitReady() {
34
+ return this.readyPromise;
35
+ }
36
+ destroy() {
37
+ for (const w of this.watchers)
38
+ w.close();
39
+ this.watchers = [];
40
+ }
41
+ // ── Queries ────────────────────────────────────────────────────────
42
+ get(relPath) {
43
+ return this.files.get(this.normalizePath(relPath));
44
+ }
45
+ has(relPath) {
46
+ return this.files.has(this.normalizePath(relPath));
47
+ }
48
+ /** Find files by stem (filename without ext), case-insensitive */
49
+ findByName(name) {
50
+ const key = name.toLowerCase().replace(/\.\w+$/, "");
51
+ const rels = this.byName.get(key);
52
+ if (!rels)
53
+ return [];
54
+ return [...rels].map((r) => this.files.get(r)).filter(Boolean);
55
+ }
56
+ /** List files in a directory (non-recursive) */
57
+ listDir(relDir) {
58
+ const norm = this.normalizePath(relDir) || ".";
59
+ const children = this.byDir.get(norm);
60
+ if (!children)
61
+ return [];
62
+ return [...children].map((r) => this.files.get(r)).filter(Boolean);
63
+ }
64
+ /** List subdirectories of a directory (non-recursive) */
65
+ async listDirEntries(relDir) {
66
+ const norm = this.normalizePath(relDir) || ".";
67
+ const prefix = norm === "." ? "" : norm + "/";
68
+ const resultMap = new Map();
69
+ for (const dirKey of this.byDir.keys()) {
70
+ // Direct child: starts with prefix and has no further slashes
71
+ if (prefix === "") {
72
+ if (dirKey.includes("/"))
73
+ continue; // not a direct child of root
74
+ }
75
+ else {
76
+ if (!dirKey.startsWith(prefix))
77
+ continue;
78
+ const rest = dirKey.slice(prefix.length);
79
+ if (rest.includes("/"))
80
+ continue; // not a direct child
81
+ }
82
+ if (dirKey === norm)
83
+ continue; // skip self
84
+ // Verify directory actually exists on disk (skip ghosts)
85
+ const absPath = path.join(this.vaultPath, dirKey);
86
+ const dirStat = await stat(absPath).catch(() => null);
87
+ if (!dirStat)
88
+ continue;
89
+ const fileChildren = this.byDir.get(dirKey)?.size ?? 0;
90
+ // Count sub-subdirectories
91
+ const subDirPrefix = dirKey + "/";
92
+ let subDirs = 0;
93
+ for (const k of this.byDir.keys()) {
94
+ if (k.startsWith(subDirPrefix) && !k.slice(subDirPrefix.length).includes("/")) {
95
+ subDirs++;
96
+ }
97
+ }
98
+ let ctime = 0;
99
+ let mtime = 0;
100
+ let childrenCount = fileChildren + subDirs;
101
+ // Use the earliest ctime and latest mtime from direct file children
102
+ const children = this.byDir.get(dirKey);
103
+ if (children) {
104
+ for (const childRel of children) {
105
+ const entry = this.files.get(childRel);
106
+ if (entry) {
107
+ if (ctime === 0 || entry.ctime < ctime)
108
+ ctime = entry.ctime;
109
+ if (entry.mtime > mtime)
110
+ mtime = entry.mtime;
111
+ }
112
+ }
113
+ }
114
+ // For dirs with no indexed children, fall back to filesystem data
115
+ // (handles dirs that only contain excluded content like .obsidian/)
116
+ if (childrenCount === 0) {
117
+ const diskChildren = await readdir(absPath).catch(() => []);
118
+ childrenCount = diskChildren.length;
119
+ ctime = dirStat.birthtimeMs;
120
+ mtime = dirStat.mtimeMs;
121
+ }
122
+ // Dirs whose direct children are all subdirs (no files) still have ctime/mtime 0
123
+ if (!ctime)
124
+ ctime = dirStat.birthtimeMs;
125
+ if (!mtime)
126
+ mtime = dirStat.mtimeMs;
127
+ resultMap.set(dirKey, {
128
+ rel: dirKey,
129
+ abs: absPath,
130
+ children_count: childrenCount,
131
+ ctime,
132
+ mtime,
133
+ });
134
+ }
135
+ // Supplement with filesystem scan for directories not in the index
136
+ const targetAbs = norm === "." ? this.vaultPath : path.join(this.vaultPath, norm);
137
+ const fsEntries = await readdir(targetAbs, { withFileTypes: true }).catch(() => []);
138
+ for (const entry of fsEntries) {
139
+ if (!entry.isDirectory())
140
+ continue;
141
+ if (entry.name.startsWith("."))
142
+ continue; // skip dotfiles/dotdirs
143
+ const childRel = prefix ? prefix + entry.name : entry.name;
144
+ if (resultMap.has(childRel))
145
+ continue; // already from index
146
+ // This dir exists on disk but not in index — include it
147
+ const childAbs = path.join(targetAbs, entry.name);
148
+ const st = await stat(childAbs).catch(() => null);
149
+ if (!st)
150
+ continue;
151
+ const diskChildren = await readdir(childAbs).catch(() => []);
152
+ resultMap.set(childRel, {
153
+ rel: childRel,
154
+ abs: childAbs,
155
+ children_count: diskChildren.length,
156
+ ctime: st.birthtimeMs,
157
+ mtime: st.mtimeMs,
158
+ });
159
+ }
160
+ return [...resultMap.values()];
161
+ }
162
+ /** Glob-like search: supports * and ** in patterns */
163
+ glob(pattern) {
164
+ const regex = this.globToRegex(pattern);
165
+ const results = [];
166
+ for (const [rel, entry] of this.files) {
167
+ if (regex.test(rel))
168
+ results.push(entry);
169
+ }
170
+ return results;
171
+ }
172
+ /** Full-text search in paths (fast, no content scan) */
173
+ searchPaths(query) {
174
+ const lower = query.toLowerCase();
175
+ const results = [];
176
+ for (const [rel, entry] of this.files) {
177
+ if (rel.toLowerCase().includes(lower))
178
+ results.push(entry);
179
+ }
180
+ return results;
181
+ }
182
+ /** Get all files sorted by mtime (most recent first) */
183
+ recentFiles(limit = 20) {
184
+ return [...this.files.values()]
185
+ .sort((a, b) => b.mtime - a.mtime)
186
+ .slice(0, limit);
187
+ }
188
+ /** Get all indexed file entries */
189
+ allFiles() {
190
+ return [...this.files.values()];
191
+ }
192
+ /** Check if a directory exists in the index */
193
+ hasDir(relDir) {
194
+ const norm = this.normalizePath(relDir) || ".";
195
+ return this.byDir.has(norm);
196
+ }
197
+ /** Check if a directory is empty (no files and no subdirectories) */
198
+ isDirEmpty(relDir) {
199
+ const norm = this.normalizePath(relDir) || ".";
200
+ const children = this.byDir.get(norm);
201
+ if (!children || children.size > 0)
202
+ return children ? children.size === 0 : true;
203
+ // Also check for subdirectories
204
+ const prefix = norm === "." ? "" : norm + "/";
205
+ for (const dirKey of this.byDir.keys()) {
206
+ if (dirKey === norm)
207
+ continue;
208
+ if (prefix === "" ? !dirKey.includes("/") : dirKey.startsWith(prefix)) {
209
+ return false;
210
+ }
211
+ }
212
+ return true;
213
+ }
214
+ /** Count children (files + direct subdirectories) of a directory */
215
+ countChildren(relDir) {
216
+ const norm = this.normalizePath(relDir) || ".";
217
+ const fileChildren = this.byDir.get(norm)?.size ?? 0;
218
+ const prefix = norm === "." ? "" : norm + "/";
219
+ let subDirs = 0;
220
+ for (const k of this.byDir.keys()) {
221
+ if (k === norm)
222
+ continue;
223
+ if (prefix === "") {
224
+ if (!k.includes("/"))
225
+ subDirs++;
226
+ }
227
+ else {
228
+ if (k.startsWith(prefix) && !k.slice(prefix.length).includes("/"))
229
+ subDirs++;
230
+ }
231
+ }
232
+ return fileChildren + subDirs;
233
+ }
234
+ /** Remove a directory and all its children from the index */
235
+ removeDir(relDir) {
236
+ const norm = this.normalizePath(relDir) || ".";
237
+ const prefix = norm + "/";
238
+ let filesRemoved = 0;
239
+ let dirsRemoved = 0;
240
+ // Remove all files under this directory (recursively)
241
+ for (const [rel] of [...this.files]) {
242
+ if (rel.startsWith(prefix) || this.files.get(rel)?.dir === norm) {
243
+ this.removeFile(rel);
244
+ filesRemoved++;
245
+ }
246
+ }
247
+ // Remove all subdirectories
248
+ for (const dirKey of [...this.byDir.keys()]) {
249
+ if (dirKey.startsWith(prefix)) {
250
+ this.byDir.delete(dirKey);
251
+ dirsRemoved++;
252
+ }
253
+ }
254
+ // Remove the directory itself
255
+ if (this.byDir.has(norm)) {
256
+ this.byDir.delete(norm);
257
+ dirsRemoved++;
258
+ }
259
+ return { filesRemoved, dirsRemoved };
260
+ }
261
+ /** Get vault stats */
262
+ stats() {
263
+ const extensions = {};
264
+ for (const entry of this.files.values()) {
265
+ const ext = entry.ext || "(none)";
266
+ extensions[ext] = (extensions[ext] || 0) + 1;
267
+ }
268
+ return {
269
+ totalFiles: this.files.size,
270
+ totalDirs: this.byDir.size,
271
+ extensions,
272
+ };
273
+ }
274
+ // ── Resolve path (fuzzy) ───────────────────────────────────────────
275
+ /**
276
+ * Resolve a possibly partial path to a full relative path.
277
+ * Tries: exact match → with .md extension → stem search → path search
278
+ */
279
+ resolve(input) {
280
+ const norm = this.normalizePath(input);
281
+ // Exact match
282
+ if (this.files.has(norm))
283
+ return this.files.get(norm);
284
+ // Try adding .md
285
+ const withMd = norm.endsWith(".md") ? norm : norm + ".md";
286
+ if (this.files.has(withMd))
287
+ return this.files.get(withMd);
288
+ // Stem search (return first match)
289
+ const byName = this.findByName(path.basename(norm));
290
+ if (byName.length === 1)
291
+ return byName[0];
292
+ // Path substring (return first match)
293
+ const byPath = this.searchPaths(norm);
294
+ if (byPath.length === 1)
295
+ return byPath[0];
296
+ return undefined;
297
+ }
298
+ // ── Internal: Scanning ─────────────────────────────────────────────
299
+ async scanDir(relDir) {
300
+ const absDir = path.join(this.vaultPath, relDir);
301
+ let entries;
302
+ try {
303
+ entries = await readdir(absDir, { withFileTypes: true });
304
+ }
305
+ catch {
306
+ return;
307
+ }
308
+ for (const entry of entries) {
309
+ if (this.ignoreDirs.has(entry.name))
310
+ continue;
311
+ if (entry.name.startsWith("."))
312
+ continue;
313
+ const relPath = relDir ? `${relDir}/${entry.name}` : entry.name;
314
+ if (entry.isDirectory()) {
315
+ // Register directory
316
+ if (!this.byDir.has(relPath))
317
+ this.byDir.set(relPath, new Set());
318
+ await this.scanDir(relPath);
319
+ }
320
+ else if (entry.isFile()) {
321
+ await this.addFile(relPath);
322
+ }
323
+ }
324
+ }
325
+ async addFile(relPath) {
326
+ const absPath = path.join(this.vaultPath, relPath);
327
+ let st;
328
+ try {
329
+ st = await stat(absPath);
330
+ }
331
+ catch {
332
+ return undefined;
333
+ }
334
+ const parsed = path.parse(relPath);
335
+ const dir = parsed.dir || ".";
336
+ const stem = parsed.name;
337
+ const entry = {
338
+ abs: absPath,
339
+ rel: relPath,
340
+ stem,
341
+ ext: parsed.ext,
342
+ dir,
343
+ ctime: st.birthtimeMs,
344
+ mtime: st.mtimeMs,
345
+ size: st.size,
346
+ };
347
+ this.files.set(relPath, entry);
348
+ // Index by name
349
+ const nameKey = stem.toLowerCase();
350
+ if (!this.byName.has(nameKey))
351
+ this.byName.set(nameKey, new Set());
352
+ this.byName.get(nameKey).add(relPath);
353
+ // Index by directory
354
+ if (!this.byDir.has(dir))
355
+ this.byDir.set(dir, new Set());
356
+ this.byDir.get(dir).add(relPath);
357
+ return entry;
358
+ }
359
+ removeFile(relPath) {
360
+ const entry = this.files.get(relPath);
361
+ if (!entry)
362
+ return;
363
+ this.files.delete(relPath);
364
+ // Remove from name index
365
+ const nameKey = entry.stem.toLowerCase();
366
+ this.byName.get(nameKey)?.delete(relPath);
367
+ if (this.byName.get(nameKey)?.size === 0)
368
+ this.byName.delete(nameKey);
369
+ // Remove from dir index
370
+ this.byDir.get(entry.dir)?.delete(relPath);
371
+ }
372
+ // ── Internal: Watching ─────────────────────────────────────────────
373
+ startWatching() {
374
+ try {
375
+ const watcher = fsWatch(this.vaultPath, { recursive: true, persistent: false }, (eventType, filename) => {
376
+ if (!filename)
377
+ return;
378
+ const normalized = filename.replace(/\\/g, "/");
379
+ // Skip ignored dirs
380
+ const firstSegment = normalized.split("/")[0];
381
+ if (this.ignoreDirs.has(firstSegment))
382
+ return;
383
+ if (firstSegment.startsWith("."))
384
+ return;
385
+ // Debounce via setImmediate to batch rapid changes
386
+ setImmediate(() => this.handleChange(normalized));
387
+ });
388
+ watcher.on("error", () => {
389
+ // Silently ignore — watcher errors (ENOENT on deleted dirs) are expected
390
+ });
391
+ this.watchers.push(watcher);
392
+ }
393
+ catch (err) {
394
+ console.error("[vault-index] fs.watch failed, index will be static:", err);
395
+ }
396
+ }
397
+ async handleChange(relPath) {
398
+ const absPath = path.join(this.vaultPath, relPath);
399
+ try {
400
+ const st = await stat(absPath);
401
+ if (st.isFile()) {
402
+ // Upsert
403
+ this.removeFile(relPath);
404
+ await this.addFile(relPath);
405
+ }
406
+ else if (st.isDirectory()) {
407
+ // New directory - scan it
408
+ if (!this.byDir.has(relPath)) {
409
+ this.byDir.set(relPath, new Set());
410
+ await this.scanDir(relPath);
411
+ }
412
+ }
413
+ }
414
+ catch {
415
+ // File was deleted
416
+ this.removeFile(relPath);
417
+ }
418
+ }
419
+ // ── Helpers ────────────────────────────────────────────────────────
420
+ normalizePath(p) {
421
+ return p.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\/+$/, "");
422
+ }
423
+ globToRegex(pattern) {
424
+ const escaped = pattern
425
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
426
+ .replace(/\*\*/g, "{{DOUBLESTAR}}")
427
+ .replace(/\*/g, "[^/]*")
428
+ .replace(/{{DOUBLESTAR}}/g, ".*");
429
+ return new RegExp(`^${escaped}$`, "i");
430
+ }
431
+ }
432
+ //# sourceMappingURL=vault-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-index.js","sourceRoot":"","sources":["../src/vault-index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@blacksmithers/vaultforge",
3
+ "version": "1.0.0",
4
+ "description": "Blazing-fast local MCP server for Obsidian vault operations via stdio",
5
+ "type": "module",
6
+ "bin": {
7
+ "vaultforge": "./dist/index.js"
8
+ },
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsx src/index.ts",
20
+ "start": "node dist/index.js",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "test:coverage": "vitest run --coverage"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/blacksmithers/vaultforge.git"
28
+ },
29
+ "homepage": "https://github.com/blacksmithers/vaultforge",
30
+ "keywords": [
31
+ "obsidian",
32
+ "mcp",
33
+ "model-context-protocol",
34
+ "typescript",
35
+ "bm25",
36
+ "search",
37
+ "canvas",
38
+ "vault",
39
+ "ai-agents",
40
+ "claude",
41
+ "knowledge-management",
42
+ "vaultforge"
43
+ ],
44
+ "engines": {
45
+ "node": ">=22"
46
+ },
47
+ "author": "Solutions Forge LTDA",
48
+ "license": "MIT",
49
+ "dependencies": {
50
+ "@dagrejs/dagre": "^2.0.4",
51
+ "@modelcontextprotocol/sdk": "^1.12.1",
52
+ "@orama/orama": "^3.1.18"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^22.0.0",
56
+ "tsx": "^4.19.0",
57
+ "typescript": "^5.7.0",
58
+ "vitest": "^4.1.0"
59
+ }
60
+ }