@novis10813/secondbrain-cli 0.1.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 (67) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +133 -0
  3. package/dist/commands/backlinks.d.ts +3 -0
  4. package/dist/commands/backlinks.d.ts.map +1 -0
  5. package/dist/commands/backlinks.js +65 -0
  6. package/dist/commands/backlinks.js.map +1 -0
  7. package/dist/commands/capture.d.ts +3 -0
  8. package/dist/commands/capture.d.ts.map +1 -0
  9. package/dist/commands/capture.js +90 -0
  10. package/dist/commands/capture.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +84 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/get.d.ts +3 -0
  16. package/dist/commands/get.d.ts.map +1 -0
  17. package/dist/commands/get.js +44 -0
  18. package/dist/commands/get.js.map +1 -0
  19. package/dist/commands/init.d.ts +3 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +35 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/orphans.d.ts +3 -0
  24. package/dist/commands/orphans.d.ts.map +1 -0
  25. package/dist/commands/orphans.js +57 -0
  26. package/dist/commands/orphans.js.map +1 -0
  27. package/dist/commands/search.d.ts +3 -0
  28. package/dist/commands/search.d.ts.map +1 -0
  29. package/dist/commands/search.js +64 -0
  30. package/dist/commands/search.js.map +1 -0
  31. package/dist/commands/stats.d.ts +3 -0
  32. package/dist/commands/stats.d.ts.map +1 -0
  33. package/dist/commands/stats.js +44 -0
  34. package/dist/commands/stats.js.map +1 -0
  35. package/dist/commands/sync.d.ts +3 -0
  36. package/dist/commands/sync.d.ts.map +1 -0
  37. package/dist/commands/sync.js +41 -0
  38. package/dist/commands/sync.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +35 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +69 -0
  44. package/dist/types/index.d.ts.map +1 -0
  45. package/dist/types/index.js +3 -0
  46. package/dist/types/index.js.map +1 -0
  47. package/dist/utils/config.d.ts +15 -0
  48. package/dist/utils/config.d.ts.map +1 -0
  49. package/dist/utils/config.js +77 -0
  50. package/dist/utils/config.js.map +1 -0
  51. package/dist/utils/database.d.ts +28 -0
  52. package/dist/utils/database.d.ts.map +1 -0
  53. package/dist/utils/database.js +261 -0
  54. package/dist/utils/database.js.map +1 -0
  55. package/dist/utils/parser.d.ts +19 -0
  56. package/dist/utils/parser.d.ts.map +1 -0
  57. package/dist/utils/parser.js +159 -0
  58. package/dist/utils/parser.js.map +1 -0
  59. package/dist/utils/template.d.ts +17 -0
  60. package/dist/utils/template.d.ts.map +1 -0
  61. package/dist/utils/template.js +100 -0
  62. package/dist/utils/template.js.map +1 -0
  63. package/dist/utils/vault.d.ts +32 -0
  64. package/dist/utils/vault.d.ts.map +1 -0
  65. package/dist/utils/vault.js +194 -0
  66. package/dist/utils/vault.js.map +1 -0
  67. package/package.json +53 -0
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseManager = void 0;
4
+ const bun_sqlite_1 = require("bun:sqlite");
5
+ class DatabaseManager {
6
+ db;
7
+ config;
8
+ constructor(config) {
9
+ this.config = config;
10
+ this.db = new bun_sqlite_1.Database(config.dbPath);
11
+ this.initTables();
12
+ }
13
+ initTables() {
14
+ // Notes table
15
+ this.db.exec(`
16
+ CREATE TABLE IF NOT EXISTS notes (
17
+ id TEXT PRIMARY KEY,
18
+ path TEXT UNIQUE NOT NULL,
19
+ title TEXT NOT NULL,
20
+ content TEXT NOT NULL,
21
+ frontmatter TEXT NOT NULL,
22
+ tags TEXT NOT NULL,
23
+ hash TEXT NOT NULL,
24
+ created_at TEXT NOT NULL,
25
+ modified_at TEXT NOT NULL
26
+ )
27
+ `);
28
+ // Links table (many-to-many)
29
+ this.db.exec(`
30
+ CREATE TABLE IF NOT EXISTS links (
31
+ source_id TEXT NOT NULL,
32
+ target_id TEXT NOT NULL,
33
+ PRIMARY KEY (source_id, target_id),
34
+ FOREIGN KEY (source_id) REFERENCES notes(id) ON DELETE CASCADE,
35
+ FOREIGN KEY (target_id) REFERENCES notes(id) ON DELETE CASCADE
36
+ )
37
+ `);
38
+ // Create indexes for performance
39
+ this.db.exec(`
40
+ CREATE INDEX IF NOT EXISTS idx_notes_path ON notes(path);
41
+ CREATE INDEX IF NOT EXISTS idx_notes_hash ON notes(hash);
42
+ CREATE INDEX IF NOT EXISTS idx_links_source ON links(source_id);
43
+ CREATE INDEX IF NOT EXISTS idx_links_target ON links(target_id);
44
+ `);
45
+ }
46
+ close() {
47
+ this.db.close();
48
+ }
49
+ // Note operations
50
+ upsertNote(note) {
51
+ const stmt = this.db.prepare(`
52
+ INSERT INTO notes (id, path, title, content, frontmatter, tags, hash, created_at, modified_at)
53
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
54
+ ON CONFLICT(path) DO UPDATE SET
55
+ id = excluded.id,
56
+ title = excluded.title,
57
+ content = excluded.content,
58
+ frontmatter = excluded.frontmatter,
59
+ tags = excluded.tags,
60
+ hash = excluded.hash,
61
+ modified_at = excluded.modified_at
62
+ `);
63
+ stmt.run(note.id, note.path, note.title, note.content, JSON.stringify(note.frontmatter), JSON.stringify(note.tags), note.hash, note.createdAt, note.modifiedAt);
64
+ // Update links
65
+ this.updateLinks(note.id, note.links);
66
+ }
67
+ updateLinks(noteId, targetIds) {
68
+ // Get existing links
69
+ const existingLinks = this.db.prepare('SELECT target_id FROM links WHERE source_id = ?')
70
+ .all(noteId)
71
+ .map((row) => row.target_id);
72
+ // Calculate diff
73
+ const existingSet = new Set(existingLinks);
74
+ const newSet = new Set(targetIds);
75
+ // Links to add (in newSet but not in existingSet)
76
+ const toAdd = targetIds.filter(id => !existingSet.has(id));
77
+ // Links to remove (in existingSet but not in newSet)
78
+ const toRemove = existingLinks.filter(id => !newSet.has(id));
79
+ // Skip if no changes
80
+ if (toAdd.length === 0 && toRemove.length === 0) {
81
+ return;
82
+ }
83
+ // Remove links that no longer exist
84
+ if (toRemove.length > 0) {
85
+ const placeholders = toRemove.map(() => '?').join(',');
86
+ this.db.prepare(`DELETE FROM links WHERE source_id = ? AND target_id IN (${placeholders})`)
87
+ .run(noteId, ...toRemove);
88
+ }
89
+ // Add new links (only if target exists)
90
+ if (toAdd.length > 0) {
91
+ const insertStmt = this.db.prepare('INSERT OR IGNORE INTO links (source_id, target_id) VALUES (?, ?)');
92
+ const targetExistsStmt = this.db.prepare('SELECT 1 FROM notes WHERE id = ?');
93
+ for (const targetId of toAdd) {
94
+ // Only insert if target exists
95
+ const targetExists = targetExistsStmt.get(targetId);
96
+ if (targetExists) {
97
+ insertStmt.run(noteId, targetId);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ getNoteById(id) {
103
+ const row = this.db.prepare('SELECT * FROM notes WHERE id = ?').get(id);
104
+ if (!row)
105
+ return null;
106
+ return this.rowToNote(row);
107
+ }
108
+ getNoteByPath(path) {
109
+ const row = this.db.prepare('SELECT * FROM notes WHERE path = ?').get(path);
110
+ if (!row)
111
+ return null;
112
+ return this.rowToNote(row);
113
+ }
114
+ getNoteByTitle(title) {
115
+ const row = this.db.prepare('SELECT * FROM notes WHERE title = ? COLLATE NOCASE').get(title);
116
+ if (!row)
117
+ return null;
118
+ return this.rowToNote(row);
119
+ }
120
+ searchNotes(query, tags, limit = 20) {
121
+ let sql = 'SELECT * FROM notes WHERE (title LIKE ? OR content LIKE ?)';
122
+ const params = [`%${query}%`, `%${query}%`];
123
+ if (tags && tags.length > 0) {
124
+ sql += ' AND (' + tags.map(() => 'tags LIKE ?').join(' OR ') + ')';
125
+ params.push(...tags.map(tag => `%"${tag}"%`));
126
+ }
127
+ sql += ' ORDER BY modified_at DESC LIMIT ?';
128
+ params.push(limit);
129
+ const rows = this.db.prepare(sql).all(...params);
130
+ return this.rowsToNotes(rows);
131
+ }
132
+ getBacklinks(noteId) {
133
+ const sql = `
134
+ SELECT n.* FROM notes n
135
+ JOIN links l ON n.id = l.source_id
136
+ WHERE l.target_id = ?
137
+ `;
138
+ const rows = this.db.prepare(sql).all(noteId);
139
+ return this.rowsToNotes(rows);
140
+ }
141
+ getOrphans() {
142
+ const sql = `
143
+ SELECT n.* FROM notes n
144
+ LEFT JOIN links l1 ON n.id = l1.source_id
145
+ LEFT JOIN links l2 ON n.id = l2.target_id
146
+ WHERE l1.source_id IS NULL AND l2.target_id IS NULL
147
+ `;
148
+ const rows = this.db.prepare(sql).all();
149
+ return this.rowsToNotes(rows);
150
+ }
151
+ getAllNotes() {
152
+ const rows = this.db.prepare('SELECT * FROM notes').all();
153
+ return this.rowsToNotes(rows);
154
+ }
155
+ deleteNoteByPath(path) {
156
+ this.db.prepare('DELETE FROM notes WHERE path = ?').run(path);
157
+ }
158
+ getStats() {
159
+ const totalNotes = this.db.prepare('SELECT COUNT(*) as count FROM notes').get().count;
160
+ const totalLinks = this.db.prepare('SELECT COUNT(*) as count FROM links').get().count;
161
+ const orphans = this.db.prepare('SELECT COUNT(*) as count FROM notes n LEFT JOIN links l1 ON n.id = l1.source_id LEFT JOIN links l2 ON n.id = l2.target_id WHERE l1.source_id IS NULL AND l2.target_id IS NULL').get().count;
162
+ return { totalNotes, totalLinks, orphans };
163
+ }
164
+ getGraphData() {
165
+ const nodes = this.db.prepare('SELECT id, title, path, tags FROM notes').all();
166
+ const edges = this.db.prepare('SELECT source_id, target_id FROM links').all();
167
+ return {
168
+ nodes: nodes.map((n) => ({
169
+ id: n.id,
170
+ title: n.title,
171
+ path: n.path,
172
+ tags: JSON.parse(n.tags)
173
+ })),
174
+ edges: edges.map((e) => ({
175
+ source: e.source_id,
176
+ target: e.target_id
177
+ }))
178
+ };
179
+ }
180
+ rowToNote(row) {
181
+ const links = this.db.prepare('SELECT target_id FROM links WHERE source_id = ?').all(row.id);
182
+ const backlinks = this.db.prepare('SELECT source_id FROM links WHERE target_id = ?').all(row.id);
183
+ return {
184
+ id: row.id,
185
+ path: row.path,
186
+ title: row.title,
187
+ content: row.content,
188
+ frontmatter: JSON.parse(row.frontmatter),
189
+ tags: JSON.parse(row.tags),
190
+ links: links.map((l) => l.target_id),
191
+ backlinks: backlinks.map((l) => l.source_id),
192
+ hash: row.hash,
193
+ createdAt: row.created_at,
194
+ modifiedAt: row.modified_at
195
+ };
196
+ }
197
+ getNotesWithLinksBatch(noteIds) {
198
+ if (noteIds.length === 0)
199
+ return new Map();
200
+ const placeholders = noteIds.map(() => '?').join(',');
201
+ // Single query to get all links for all notes
202
+ const linksSql = `
203
+ SELECT source_id, json_group_array(target_id) as targets
204
+ FROM links
205
+ WHERE source_id IN (${placeholders})
206
+ GROUP BY source_id
207
+ `;
208
+ const backlinksSql = `
209
+ SELECT target_id, json_group_array(source_id) as sources
210
+ FROM links
211
+ WHERE target_id IN (${placeholders})
212
+ GROUP BY target_id
213
+ `;
214
+ const result = new Map();
215
+ // Initialize with empty arrays
216
+ for (const id of noteIds) {
217
+ result.set(id, { links: [], backlinks: [] });
218
+ }
219
+ // Populate links
220
+ const linksRows = this.db.prepare(linksSql).all(...noteIds);
221
+ for (const row of linksRows) {
222
+ const targets = JSON.parse(row.targets);
223
+ result.get(row.source_id).links = targets;
224
+ }
225
+ // Populate backlinks
226
+ const backlinksRows = this.db.prepare(backlinksSql).all(...noteIds);
227
+ for (const row of backlinksRows) {
228
+ const sources = JSON.parse(row.sources);
229
+ result.get(row.target_id).backlinks = sources;
230
+ }
231
+ return result;
232
+ }
233
+ rowsToNotes(rows) {
234
+ if (rows.length === 0)
235
+ return [];
236
+ // Extract all note IDs
237
+ const noteIds = rows.map(row => row.id);
238
+ // Batch load all links and backlinks in 2 queries
239
+ const linkData = this.getNotesWithLinksBatch(noteIds);
240
+ // Map rows to notes using batched link data
241
+ return rows.map(row => {
242
+ const links = linkData.get(row.id)?.links || [];
243
+ const backlinks = linkData.get(row.id)?.backlinks || [];
244
+ return {
245
+ id: row.id,
246
+ path: row.path,
247
+ title: row.title,
248
+ content: row.content,
249
+ frontmatter: JSON.parse(row.frontmatter),
250
+ tags: JSON.parse(row.tags),
251
+ links,
252
+ backlinks,
253
+ hash: row.hash,
254
+ createdAt: row.created_at,
255
+ modifiedAt: row.modified_at,
256
+ };
257
+ });
258
+ }
259
+ }
260
+ exports.DatabaseManager = DatabaseManager;
261
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface ParsedNote {
2
+ title: string;
3
+ content: string;
4
+ frontmatter: Record<string, unknown>;
5
+ tags: string[];
6
+ links: string[];
7
+ }
8
+ export declare class NoteParser {
9
+ static parse(content: string): ParsedNote;
10
+ static computeHash(content: string): string;
11
+ private static extractFrontmatter;
12
+ private static extractTitle;
13
+ private static extractTags;
14
+ private static extractLinks;
15
+ private static extractLinksFromObject;
16
+ static generateNoteContent(title: string, content: string, frontmatter?: Record<string, unknown>): string;
17
+ static generateDailyNoteContent(date: Date, content: string): string;
18
+ }
19
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAezC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiBjC,OAAO,CAAC,MAAM,CAAC,YAAY;IAgB3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAiC1B,OAAO,CAAC,MAAM,CAAC,YAAY;IAgB3B,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAcrC,MAAM,CAAC,mBAAmB,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACxC,MAAM;IAKT,MAAM,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;CAYrE"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NoteParser = void 0;
37
+ const crypto_1 = require("crypto");
38
+ const yaml = __importStar(require("yaml"));
39
+ class NoteParser {
40
+ static parse(content) {
41
+ const { frontmatter, body } = this.extractFrontmatter(content);
42
+ const title = this.extractTitle(body);
43
+ const tags = this.extractTags(frontmatter, body);
44
+ const links = this.extractLinks(frontmatter, body);
45
+ return {
46
+ title,
47
+ content: body,
48
+ frontmatter,
49
+ tags,
50
+ links
51
+ };
52
+ }
53
+ static computeHash(content) {
54
+ return (0, crypto_1.createHash)('sha256').update(content).digest('hex');
55
+ }
56
+ static extractFrontmatter(content) {
57
+ const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n?/;
58
+ const match = content.match(frontmatterRegex);
59
+ if (match) {
60
+ try {
61
+ const frontmatter = yaml.parse(match[1]) || {};
62
+ const body = content.slice(match[0].length);
63
+ return { frontmatter, body };
64
+ }
65
+ catch {
66
+ // Invalid YAML, treat as no frontmatter
67
+ }
68
+ }
69
+ return { frontmatter: {}, body: content };
70
+ }
71
+ static extractTitle(content) {
72
+ // Look for first H1 heading
73
+ const h1Match = content.match(/^# (.+)$/m);
74
+ if (h1Match) {
75
+ return h1Match[1].trim();
76
+ }
77
+ // Look for first line that's not empty
78
+ const firstLine = content.split('\n').find(line => line.trim());
79
+ if (firstLine) {
80
+ return firstLine.trim().slice(0, 100);
81
+ }
82
+ return 'Untitled';
83
+ }
84
+ static extractTags(frontmatter, content) {
85
+ const tags = new Set();
86
+ // From frontmatter
87
+ if (frontmatter.tags) {
88
+ if (Array.isArray(frontmatter.tags)) {
89
+ frontmatter.tags.forEach(tag => tags.add(String(tag)));
90
+ }
91
+ else if (typeof frontmatter.tags === 'string') {
92
+ frontmatter.tags.split(/[,\s]+/).forEach(tag => {
93
+ if (tag)
94
+ tags.add(tag.replace(/^#/, ''));
95
+ });
96
+ }
97
+ }
98
+ // From content body (Obsidian-style #tags)
99
+ // Strip code blocks to avoid extracting tags from code
100
+ const contentWithoutCode = content
101
+ .replace(/```[\s\S]*?```/g, '') // Remove fenced code blocks
102
+ .replace(/`[^`]*`/g, ''); // Remove inline code
103
+ const tagRegex = /#([\w/-]+)/g;
104
+ let match;
105
+ while ((match = tagRegex.exec(contentWithoutCode)) !== null) {
106
+ // Exclude headings
107
+ if (!contentWithoutCode.substring(match.index - 1, match.index).match(/\n|^/)) {
108
+ continue;
109
+ }
110
+ tags.add(match[1]);
111
+ }
112
+ return Array.from(tags);
113
+ }
114
+ static extractLinks(frontmatter, content) {
115
+ const links = new Set();
116
+ // Extract from frontmatter values
117
+ this.extractLinksFromObject(frontmatter, links);
118
+ // Extract from content body (Obsidian wikilinks)
119
+ const linkRegex = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
120
+ let match;
121
+ while ((match = linkRegex.exec(content)) !== null) {
122
+ links.add(match[1].trim());
123
+ }
124
+ return Array.from(links);
125
+ }
126
+ static extractLinksFromObject(obj, links) {
127
+ if (typeof obj === 'string') {
128
+ const linkRegex = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
129
+ let match;
130
+ while ((match = linkRegex.exec(obj)) !== null) {
131
+ links.add(match[1].trim());
132
+ }
133
+ }
134
+ else if (Array.isArray(obj)) {
135
+ obj.forEach(item => this.extractLinksFromObject(item, links));
136
+ }
137
+ else if (obj && typeof obj === 'object') {
138
+ Object.values(obj).forEach(value => this.extractLinksFromObject(value, links));
139
+ }
140
+ }
141
+ static generateNoteContent(title, content, frontmatter = {}) {
142
+ const fm = yaml.stringify(frontmatter).trim();
143
+ return `---\n${fm}\n---\n\n# ${title}\n\n${content}`;
144
+ }
145
+ static generateDailyNoteContent(date, content) {
146
+ const year = date.getFullYear();
147
+ const month = String(date.getMonth() + 1).padStart(2, '0');
148
+ const day = String(date.getDate()).padStart(2, '0');
149
+ const dateStr = `${year}-${month}-${day}`;
150
+ const frontmatter = {
151
+ date: dateStr,
152
+ tags: ['daily'],
153
+ type: 'daily-note'
154
+ };
155
+ return this.generateNoteContent(dateStr, content, frontmatter);
156
+ }
157
+ }
158
+ exports.NoteParser = NoteParser;
159
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../types/index.js';
2
+ export declare class TemplateManager {
3
+ private config;
4
+ constructor(config: Config);
5
+ private getTemplatePath;
6
+ private ensureTemplatesDir;
7
+ createTemplate(name: string, content: string): void;
8
+ getTemplate(name: string): string | null;
9
+ listTemplates(): string[];
10
+ deleteTemplate(name: string): void;
11
+ renderTemplate(name: string, variables: Record<string, string>): string;
12
+ validateTemplate(name: string): string[];
13
+ insertTemplate(name: string, targetPath: string, variables: Record<string, string>): void;
14
+ getRequiredFields(name: string): string[];
15
+ validateRequiredFields(name: string, provided: Record<string, string>): string[];
16
+ }
17
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;IAO1B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQxC,aAAa,IAAI,MAAM,EAAE;IAYzB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAgBvE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBxC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAazF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAIzC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;CAYjF"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TemplateManager = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ class TemplateManager {
7
+ config;
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ getTemplatePath(name) {
12
+ return (0, path_1.join)(this.config.vaultPath, this.config.templatesFolder, `${name}.md`);
13
+ }
14
+ ensureTemplatesDir() {
15
+ const templatesDir = (0, path_1.join)(this.config.vaultPath, this.config.templatesFolder);
16
+ if (!(0, fs_1.existsSync)(templatesDir)) {
17
+ (0, fs_1.mkdirSync)(templatesDir, { recursive: true });
18
+ }
19
+ }
20
+ createTemplate(name, content) {
21
+ this.ensureTemplatesDir();
22
+ const templatePath = this.getTemplatePath(name);
23
+ (0, fs_1.writeFileSync)(templatePath, content, 'utf-8');
24
+ }
25
+ getTemplate(name) {
26
+ const templatePath = this.getTemplatePath(name);
27
+ if (!(0, fs_1.existsSync)(templatePath)) {
28
+ return null;
29
+ }
30
+ return (0, fs_1.readFileSync)(templatePath, 'utf-8');
31
+ }
32
+ listTemplates() {
33
+ const templatesDir = (0, path_1.join)(this.config.vaultPath, this.config.templatesFolder);
34
+ if (!(0, fs_1.existsSync)(templatesDir)) {
35
+ return [];
36
+ }
37
+ const entries = (0, fs_1.readdirSync)(templatesDir, { withFileTypes: true });
38
+ return entries
39
+ .filter(entry => entry.isFile() && entry.name.endsWith('.md'))
40
+ .map(entry => entry.name.replace('.md', ''));
41
+ }
42
+ deleteTemplate(name) {
43
+ const templatePath = this.getTemplatePath(name);
44
+ if (!(0, fs_1.existsSync)(templatePath)) {
45
+ throw new Error(`Template '${name}' not found`);
46
+ }
47
+ (0, fs_1.unlinkSync)(templatePath);
48
+ }
49
+ renderTemplate(name, variables) {
50
+ const template = this.getTemplate(name);
51
+ if (!template) {
52
+ throw new Error(`Template '${name}' not found`);
53
+ }
54
+ // Replace all {{variable}} with values
55
+ let result = template;
56
+ for (const [key, value] of Object.entries(variables)) {
57
+ const regex = new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g');
58
+ result = result.replace(regex, value);
59
+ }
60
+ return result;
61
+ }
62
+ validateTemplate(name) {
63
+ const template = this.getTemplate(name);
64
+ if (!template) {
65
+ throw new Error(`Template '${name}' not found`);
66
+ }
67
+ const variables = new Set();
68
+ const regex = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
69
+ let match;
70
+ while ((match = regex.exec(template)) !== null) {
71
+ variables.add(match[1]);
72
+ }
73
+ return Array.from(variables);
74
+ }
75
+ insertTemplate(name, targetPath, variables) {
76
+ const rendered = this.renderTemplate(name, variables);
77
+ const fullPath = (0, path_1.join)(this.config.vaultPath, targetPath);
78
+ // Ensure parent directory exists
79
+ const dir = (0, path_1.dirname)(fullPath);
80
+ if (!(0, fs_1.existsSync)(dir)) {
81
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
82
+ }
83
+ (0, fs_1.writeFileSync)(fullPath, rendered, 'utf-8');
84
+ }
85
+ getRequiredFields(name) {
86
+ return this.validateTemplate(name);
87
+ }
88
+ validateRequiredFields(name, provided) {
89
+ const required = this.getRequiredFields(name);
90
+ const missing = [];
91
+ for (const field of required) {
92
+ if (!(field in provided) || provided[field] === undefined || provided[field] === '') {
93
+ missing.push(field);
94
+ }
95
+ }
96
+ return missing;
97
+ }
98
+ }
99
+ exports.TemplateManager = TemplateManager;
100
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Note, Config } from '../types/index.js';
2
+ export declare class VaultManager {
3
+ private config;
4
+ private db;
5
+ constructor(config: Config);
6
+ close(): void;
7
+ sync(): Promise<{
8
+ added: number;
9
+ updated: number;
10
+ removed: number;
11
+ }>;
12
+ private findMarkdownFiles;
13
+ createNoteFromFile(path: string, content: string, hash: string, links?: string[]): Promise<Note>;
14
+ private findNoteByTitleOrPath;
15
+ writeNote(path: string, content: string): void;
16
+ readNote(path: string): string | null;
17
+ getDailyNotePath(date?: Date): string;
18
+ getTemplatePath(templateName: string): string;
19
+ getNoteById(id: string): Note | null;
20
+ getNoteByPath(path: string): Note | null;
21
+ searchNotes(query: string, tags?: string[], limit?: number): Note[];
22
+ getBacklinks(noteId: string): Note[];
23
+ getOrphans(): Note[];
24
+ getStats(): {
25
+ totalNotes: number;
26
+ totalLinks: number;
27
+ orphans: number;
28
+ };
29
+ getGraphData(): import("../types/index.js").GraphData;
30
+ upsertNote(note: Note): void;
31
+ }
32
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/utils/vault.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAItD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAkB;gBAEhB,MAAM,EAAE,MAAM;IAK1B,KAAK,IAAI,IAAI;IAKP,IAAI,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoE1E,OAAO,CAAC,iBAAiB;IAsBnB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1G,OAAO,CAAC,qBAAqB;IA0B7B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY9C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASrC,gBAAgB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM;IASjD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAK7C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAW,GAAG,IAAI,EAAE;IAIvE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE;IAIpC,UAAU,IAAI,IAAI,EAAE;IAIpB,QAAQ;;;;;IAIR,YAAY;IAKZ,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CAG7B"}