wikimem 0.3.0 → 0.8.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 (143) hide show
  1. package/CHANGELOG.md +138 -29
  2. package/README.md +171 -309
  3. package/dist/cli/commands/ask.d.ts +3 -0
  4. package/dist/cli/commands/ask.d.ts.map +1 -0
  5. package/dist/cli/commands/ask.js +63 -0
  6. package/dist/cli/commands/ask.js.map +1 -0
  7. package/dist/cli/commands/export.d.ts +3 -0
  8. package/dist/cli/commands/export.d.ts.map +1 -0
  9. package/dist/cli/commands/export.js +108 -0
  10. package/dist/cli/commands/export.js.map +1 -0
  11. package/dist/cli/commands/history.d.ts +3 -0
  12. package/dist/cli/commands/history.d.ts.map +1 -0
  13. package/dist/cli/commands/history.js +61 -0
  14. package/dist/cli/commands/history.js.map +1 -0
  15. package/dist/cli/commands/improve.d.ts.map +1 -1
  16. package/dist/cli/commands/improve.js +4 -3
  17. package/dist/cli/commands/improve.js.map +1 -1
  18. package/dist/cli/commands/ingest.d.ts.map +1 -1
  19. package/dist/cli/commands/ingest.js +5 -4
  20. package/dist/cli/commands/ingest.js.map +1 -1
  21. package/dist/cli/commands/init.d.ts.map +1 -1
  22. package/dist/cli/commands/init.js +246 -79
  23. package/dist/cli/commands/init.js.map +1 -1
  24. package/dist/cli/commands/lint.d.ts.map +1 -1
  25. package/dist/cli/commands/lint.js +4 -3
  26. package/dist/cli/commands/lint.js.map +1 -1
  27. package/dist/cli/commands/mcp.d.ts +3 -0
  28. package/dist/cli/commands/mcp.d.ts.map +1 -0
  29. package/dist/cli/commands/mcp.js +11 -0
  30. package/dist/cli/commands/mcp.js.map +1 -0
  31. package/dist/cli/commands/open.d.ts +3 -0
  32. package/dist/cli/commands/open.d.ts.map +1 -0
  33. package/dist/cli/commands/open.js +36 -0
  34. package/dist/cli/commands/open.js.map +1 -0
  35. package/dist/cli/commands/query.d.ts.map +1 -1
  36. package/dist/cli/commands/query.js +5 -4
  37. package/dist/cli/commands/query.js.map +1 -1
  38. package/dist/cli/commands/search.d.ts +3 -0
  39. package/dist/cli/commands/search.d.ts.map +1 -0
  40. package/dist/cli/commands/search.js +61 -0
  41. package/dist/cli/commands/search.js.map +1 -0
  42. package/dist/cli/commands/serve.d.ts.map +1 -1
  43. package/dist/cli/commands/serve.js +41 -2
  44. package/dist/cli/commands/serve.js.map +1 -1
  45. package/dist/cli/commands/watch.d.ts.map +1 -1
  46. package/dist/cli/commands/watch.js +4 -3
  47. package/dist/cli/commands/watch.js.map +1 -1
  48. package/dist/cli/index.d.ts.map +1 -1
  49. package/dist/cli/index.js +27 -1
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/core/audit-trail.d.ts +15 -0
  52. package/dist/core/audit-trail.d.ts.map +1 -0
  53. package/dist/core/audit-trail.js +43 -0
  54. package/dist/core/audit-trail.js.map +1 -0
  55. package/dist/core/claude-code.d.ts +10 -0
  56. package/dist/core/claude-code.d.ts.map +1 -0
  57. package/dist/core/claude-code.js +81 -0
  58. package/dist/core/claude-code.js.map +1 -0
  59. package/dist/core/config.d.ts +23 -0
  60. package/dist/core/config.d.ts.map +1 -1
  61. package/dist/core/config.js.map +1 -1
  62. package/dist/core/connectors.d.ts +58 -0
  63. package/dist/core/connectors.d.ts.map +1 -0
  64. package/dist/core/connectors.js +189 -0
  65. package/dist/core/connectors.js.map +1 -0
  66. package/dist/core/folder-scanner.d.ts +10 -0
  67. package/dist/core/folder-scanner.d.ts.map +1 -0
  68. package/dist/core/folder-scanner.js +84 -0
  69. package/dist/core/folder-scanner.js.map +1 -0
  70. package/dist/core/git.d.ts +137 -0
  71. package/dist/core/git.d.ts.map +1 -0
  72. package/dist/core/git.js +520 -0
  73. package/dist/core/git.js.map +1 -0
  74. package/dist/core/history.d.ts +21 -0
  75. package/dist/core/history.d.ts.map +1 -0
  76. package/dist/core/history.js +107 -0
  77. package/dist/core/history.js.map +1 -0
  78. package/dist/core/improve.d.ts.map +1 -1
  79. package/dist/core/improve.js +9 -0
  80. package/dist/core/improve.js.map +1 -1
  81. package/dist/core/ingest.d.ts +1 -0
  82. package/dist/core/ingest.d.ts.map +1 -1
  83. package/dist/core/ingest.js +78 -5
  84. package/dist/core/ingest.js.map +1 -1
  85. package/dist/core/observer.d.ts +71 -0
  86. package/dist/core/observer.d.ts.map +1 -0
  87. package/dist/core/observer.js +350 -0
  88. package/dist/core/observer.js.map +1 -0
  89. package/dist/core/pipeline-events.d.ts +63 -0
  90. package/dist/core/pipeline-events.d.ts.map +1 -0
  91. package/dist/core/pipeline-events.js +109 -0
  92. package/dist/core/pipeline-events.js.map +1 -0
  93. package/dist/core/query.d.ts.map +1 -1
  94. package/dist/core/query.js +16 -8
  95. package/dist/core/query.js.map +1 -1
  96. package/dist/core/scraper.d.ts +41 -0
  97. package/dist/core/scraper.d.ts.map +1 -0
  98. package/dist/core/scraper.js +277 -0
  99. package/dist/core/scraper.js.map +1 -0
  100. package/dist/index.js +3 -2
  101. package/dist/index.js.map +1 -1
  102. package/dist/mcp-entry.d.ts +10 -0
  103. package/dist/mcp-entry.d.ts.map +1 -0
  104. package/dist/mcp-entry.js +21 -0
  105. package/dist/mcp-entry.js.map +1 -0
  106. package/dist/mcp-server.d.ts +15 -0
  107. package/dist/mcp-server.d.ts.map +1 -0
  108. package/dist/mcp-server.js +390 -0
  109. package/dist/mcp-server.js.map +1 -0
  110. package/dist/processors/audio.d.ts.map +1 -1
  111. package/dist/processors/audio.js +42 -4
  112. package/dist/processors/audio.js.map +1 -1
  113. package/dist/processors/pdf.d.ts.map +1 -1
  114. package/dist/processors/pdf.js +2 -3
  115. package/dist/processors/pdf.js.map +1 -1
  116. package/dist/processors/url.js +4 -1
  117. package/dist/processors/url.js.map +1 -1
  118. package/dist/providers/claude.d.ts +1 -0
  119. package/dist/providers/claude.d.ts.map +1 -1
  120. package/dist/providers/claude.js +5 -3
  121. package/dist/providers/claude.js.map +1 -1
  122. package/dist/providers/index.d.ts +17 -1
  123. package/dist/providers/index.d.ts.map +1 -1
  124. package/dist/providers/index.js +144 -0
  125. package/dist/providers/index.js.map +1 -1
  126. package/dist/providers/openai.d.ts +1 -0
  127. package/dist/providers/openai.d.ts.map +1 -1
  128. package/dist/providers/openai.js +5 -3
  129. package/dist/providers/openai.js.map +1 -1
  130. package/dist/providers/types.d.ts +18 -0
  131. package/dist/providers/types.d.ts.map +1 -1
  132. package/dist/templates/config-yaml.d.ts.map +1 -1
  133. package/dist/templates/config-yaml.js +12 -1
  134. package/dist/templates/config-yaml.js.map +1 -1
  135. package/dist/web/public/index.html +8157 -745
  136. package/dist/web/server.d.ts.map +1 -1
  137. package/dist/web/server.js +2101 -29
  138. package/dist/web/server.js.map +1 -1
  139. package/package.json +7 -4
  140. package/scripts/install.sh +54 -0
  141. package/src/web/public/index.html +8157 -745
  142. package/templates/mcp-config.json +9 -0
  143. package/dist/web/public/public/index.html +0 -946
@@ -0,0 +1,520 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { simpleGit } from 'simple-git';
4
+ export const WIKI_COMMIT_PREFIX = 'wiki:';
5
+ function getGit(vaultRoot) {
6
+ return simpleGit(vaultRoot);
7
+ }
8
+ export function isWikiCommit(message) {
9
+ return message.startsWith(WIKI_COMMIT_PREFIX);
10
+ }
11
+ export async function isGitRepo(vaultRoot) {
12
+ try {
13
+ const git = getGit(vaultRoot);
14
+ await git.status();
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ export async function initGitRepo(config) {
22
+ const git = getGit(config.root);
23
+ if (await isGitRepo(config.root)) {
24
+ return { initialized: false, message: 'Already a git repository' };
25
+ }
26
+ await git.init();
27
+ const gitignorePath = join(config.root, '.gitignore');
28
+ if (!existsSync(gitignorePath)) {
29
+ const { writeFileSync } = await import('node:fs');
30
+ writeFileSync(gitignorePath, [
31
+ 'node_modules/',
32
+ '.env',
33
+ '.wikimem/history/snapshots/',
34
+ '.DS_Store',
35
+ '*.log',
36
+ ].join('\n') + '\n', 'utf-8');
37
+ }
38
+ await git.add('.');
39
+ await git.commit('wiki: feat: initialize wikimem vault');
40
+ return { initialized: true, message: 'Initialized git repository with initial commit' };
41
+ }
42
+ export async function autoCommit(vaultRoot, automation, summary, details) {
43
+ if (!(await isGitRepo(vaultRoot)))
44
+ return null;
45
+ const git = getGit(vaultRoot);
46
+ const status = await git.status();
47
+ if (status.files.length === 0)
48
+ return null;
49
+ await git.add('.');
50
+ const prefix = automation === 'manual' ? 'feat(manual)' :
51
+ automation === 'restore' ? 'revert(restore)' :
52
+ automation === 'improve' ? 'refactor(improve)' :
53
+ `feat(${automation})`;
54
+ const message = `wiki: ${prefix}: ${summary}`;
55
+ const body = details ? `\n\n${details}` : '';
56
+ const fullMessage = message + body;
57
+ const result = await git.commit(fullMessage);
58
+ const branch = (await git.branch()).current;
59
+ return {
60
+ hash: result.commit || 'unknown',
61
+ branch,
62
+ message,
63
+ filesChanged: status.files.length,
64
+ };
65
+ }
66
+ export async function getGitLog(vaultRoot, limit = 50, options) {
67
+ if (!(await isGitRepo(vaultRoot)))
68
+ return [];
69
+ const git = getGit(vaultRoot);
70
+ const fetchLimit = options?.wikiOnly ? limit * 3 : limit;
71
+ const logOpts = { maxCount: fetchLimit, '--stat': null };
72
+ if (options?.search) {
73
+ logOpts['--grep'] = options.search;
74
+ }
75
+ const log = await git.log(logOpts);
76
+ let entries = log.all.map((entry) => ({
77
+ hash: entry.hash,
78
+ hashShort: entry.hash.substring(0, 7),
79
+ author: entry.author_name,
80
+ date: entry.date,
81
+ message: entry.message,
82
+ filesChanged: entry.diff?.files?.map(f => f.file) ?? [],
83
+ isWiki: isWikiCommit(entry.message),
84
+ }));
85
+ if (options?.wikiOnly) {
86
+ entries = entries.filter((e) => e.isWiki);
87
+ }
88
+ return entries.slice(0, limit);
89
+ }
90
+ export async function getGitDiff(vaultRoot, commitHash) {
91
+ if (!(await isGitRepo(vaultRoot)))
92
+ return { diff: '', stats: [] };
93
+ const git = getGit(vaultRoot);
94
+ const diff = await git.diff([`${commitHash}~1`, commitHash]);
95
+ const diffStat = await git.diffSummary([`${commitHash}~1`, commitHash]);
96
+ return {
97
+ diff,
98
+ stats: diffStat.files.map((f) => ({
99
+ file: f.file,
100
+ insertions: 'insertions' in f ? f.insertions : 0,
101
+ deletions: 'deletions' in f ? f.deletions : 0,
102
+ binary: f.binary,
103
+ })),
104
+ };
105
+ }
106
+ export async function getBranches(vaultRoot) {
107
+ if (!(await isGitRepo(vaultRoot))) {
108
+ return { current: 'main', all: [], isDetached: false };
109
+ }
110
+ const git = getGit(vaultRoot);
111
+ const branches = await git.branch();
112
+ return {
113
+ current: branches.current,
114
+ all: branches.all,
115
+ isDetached: branches.detached,
116
+ };
117
+ }
118
+ export async function createBranch(vaultRoot, branchName, fromHash) {
119
+ if (!(await isGitRepo(vaultRoot))) {
120
+ return { created: false, message: 'Not a git repository' };
121
+ }
122
+ const git = getGit(vaultRoot);
123
+ try {
124
+ if (fromHash) {
125
+ await git.raw(['branch', branchName, fromHash]);
126
+ return { created: true, message: `Created branch ${branchName} from ${fromHash.substring(0, 7)}` };
127
+ }
128
+ await git.checkoutLocalBranch(branchName);
129
+ return { created: true, message: `Created and switched to branch: ${branchName}` };
130
+ }
131
+ catch (err) {
132
+ const msg = err instanceof Error ? err.message : String(err);
133
+ return { created: false, message: `Failed to create branch: ${msg}` };
134
+ }
135
+ }
136
+ export async function switchBranch(vaultRoot, branchName) {
137
+ if (!(await isGitRepo(vaultRoot))) {
138
+ return { switched: false, message: 'Not a git repository' };
139
+ }
140
+ const git = getGit(vaultRoot);
141
+ try {
142
+ await git.checkout(branchName);
143
+ return { switched: true, message: `Switched to branch: ${branchName}` };
144
+ }
145
+ catch (err) {
146
+ const msg = err instanceof Error ? err.message : String(err);
147
+ return { switched: false, message: `Failed to switch branch: ${msg}` };
148
+ }
149
+ }
150
+ export async function getGitStatus(vaultRoot) {
151
+ if (!(await isGitRepo(vaultRoot)))
152
+ return null;
153
+ const git = getGit(vaultRoot);
154
+ return git.status();
155
+ }
156
+ export async function createTag(vaultRoot, tagName, message, wikiNamespace = true) {
157
+ if (!(await isGitRepo(vaultRoot))) {
158
+ return { created: false, message: 'Not a git repository', tag: '' };
159
+ }
160
+ const git = getGit(vaultRoot);
161
+ const prefixed = wikiNamespace && !tagName.startsWith('wiki/') ? `wiki/${tagName}` : tagName;
162
+ try {
163
+ if (message) {
164
+ await git.tag(['-a', prefixed, '-m', message]);
165
+ }
166
+ else {
167
+ await git.tag([prefixed]);
168
+ }
169
+ return { created: true, message: `Created tag: ${prefixed}`, tag: prefixed };
170
+ }
171
+ catch (err) {
172
+ const msg = err instanceof Error ? err.message : String(err);
173
+ return { created: false, message: `Failed to create tag: ${msg}`, tag: '' };
174
+ }
175
+ }
176
+ export async function restoreToCommit(vaultRoot, commitHash) {
177
+ if (!(await isGitRepo(vaultRoot))) {
178
+ return { restored: false, branch: '', message: 'Not a git repository' };
179
+ }
180
+ const git = getGit(vaultRoot);
181
+ const branchName = `wiki/restore-${commitHash.substring(0, 7)}`;
182
+ try {
183
+ await git.checkout(['-b', branchName, commitHash]);
184
+ return {
185
+ restored: true,
186
+ branch: branchName,
187
+ message: `Restored to commit ${commitHash.substring(0, 7)} on new branch: ${branchName}`,
188
+ };
189
+ }
190
+ catch (err) {
191
+ const msg = err instanceof Error ? err.message : String(err);
192
+ return { restored: false, branch: '', message: `Failed to restore: ${msg}` };
193
+ }
194
+ }
195
+ export async function getFileAtCommit(vaultRoot, commitHash, filePath) {
196
+ if (!(await isGitRepo(vaultRoot)))
197
+ return null;
198
+ const git = getGit(vaultRoot);
199
+ try {
200
+ return await git.show([`${commitHash}:${filePath}`]);
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ }
206
+ export async function getTreeAtCommit(vaultRoot, commitHash, path = '') {
207
+ if (!(await isGitRepo(vaultRoot)))
208
+ return [];
209
+ const git = getGit(vaultRoot);
210
+ try {
211
+ // Resolve relative path from git root to vault
212
+ const gitRootRaw = await git.raw(['rev-parse', '--show-toplevel']);
213
+ const gitRoot = gitRootRaw.trim();
214
+ const { resolve, relative } = await import('node:path');
215
+ const relPath = relative(resolve(gitRoot), resolve(vaultRoot));
216
+ const filterPath = path ? (relPath ? `${relPath}/${path}` : path) : (relPath || '.');
217
+ const result = await git.raw(['ls-tree', '-r', '--name-only', commitHash, '--', filterPath]);
218
+ // Strip the vault prefix from returned paths so they're relative to vault
219
+ return result.split('\n').filter(Boolean).map(f => relPath && f.startsWith(relPath + '/') ? f.slice(relPath.length + 1) : f);
220
+ }
221
+ catch {
222
+ return [];
223
+ }
224
+ }
225
+ export function parseDiffOutput(rawDiff) {
226
+ const files = [];
227
+ const fileSections = rawDiff.split(/^diff --git /m).filter(Boolean);
228
+ for (const section of fileSections) {
229
+ const headerMatch = section.match(/^a\/(.+?) b\/(.+)/);
230
+ if (!headerMatch)
231
+ continue;
232
+ const aPath = headerMatch[1];
233
+ const bPath = headerMatch[2];
234
+ let status = 'modified';
235
+ if (section.includes('new file mode'))
236
+ status = 'added';
237
+ else if (section.includes('deleted file mode'))
238
+ status = 'deleted';
239
+ else if (section.includes('rename from'))
240
+ status = 'renamed';
241
+ const hunks = [];
242
+ const hunkRegex = /^@@\s+[^@]+@@.*$/gm;
243
+ let match;
244
+ const hunkHeaders = [];
245
+ while ((match = hunkRegex.exec(section)) !== null) {
246
+ hunkHeaders.push({ header: match[0], index: match.index + match[0].length });
247
+ }
248
+ let insertions = 0;
249
+ let deletions = 0;
250
+ for (let i = 0; i < hunkHeaders.length; i++) {
251
+ const start = hunkHeaders[i].index;
252
+ const end = i + 1 < hunkHeaders.length ? section.lastIndexOf('\n@@', hunkHeaders[i + 1].index) : section.length;
253
+ const body = section.substring(start, end);
254
+ const lines = [];
255
+ for (const line of body.split('\n')) {
256
+ if (line.startsWith('+')) {
257
+ lines.push({ type: 'add', content: line.substring(1) });
258
+ insertions++;
259
+ }
260
+ else if (line.startsWith('-')) {
261
+ lines.push({ type: 'del', content: line.substring(1) });
262
+ deletions++;
263
+ }
264
+ else if (line.startsWith(' ') || line === '') {
265
+ lines.push({ type: 'ctx', content: line.substring(1) || '' });
266
+ }
267
+ }
268
+ hunks.push({ header: hunkHeaders[i].header, lines });
269
+ }
270
+ files.push({ path: status === 'deleted' ? aPath : bPath, status, insertions, deletions, hunks });
271
+ }
272
+ return files;
273
+ }
274
+ export async function getParsedDiff(vaultRoot, commitHash) {
275
+ if (!(await isGitRepo(vaultRoot))) {
276
+ return { files: [], stats: { additions: 0, deletions: 0, filesChanged: 0 } };
277
+ }
278
+ const git = getGit(vaultRoot);
279
+ const raw = await git.diff([`${commitHash}~1`, commitHash]);
280
+ const files = parseDiffOutput(raw);
281
+ return {
282
+ files,
283
+ stats: {
284
+ additions: files.reduce((s, f) => s + f.insertions, 0),
285
+ deletions: files.reduce((s, f) => s + f.deletions, 0),
286
+ filesChanged: files.length,
287
+ },
288
+ };
289
+ }
290
+ export async function pushBranch(vaultRoot, remote = 'origin') {
291
+ if (!(await isGitRepo(vaultRoot))) {
292
+ return { pushed: false, remote: '', branch: '', message: 'Not a git repository' };
293
+ }
294
+ const git = getGit(vaultRoot);
295
+ const branches = await git.branch();
296
+ const branch = branches.current;
297
+ try {
298
+ const remotes = await git.getRemotes(true);
299
+ const hasRemote = remotes.some(r => r.name === remote);
300
+ if (!hasRemote) {
301
+ return { pushed: false, remote, branch, message: `Remote "${remote}" not configured. Add a remote first.` };
302
+ }
303
+ await git.push(remote, branch, ['--set-upstream']);
304
+ return { pushed: true, remote, branch, message: `Pushed ${branch} to ${remote}` };
305
+ }
306
+ catch (err) {
307
+ const msg = err instanceof Error ? err.message : String(err);
308
+ return { pushed: false, remote, branch, message: `Push failed: ${msg}` };
309
+ }
310
+ }
311
+ export async function getDiffSummary(vaultRoot, baseBranch) {
312
+ if (!(await isGitRepo(vaultRoot))) {
313
+ return { filesAdded: [], filesModified: [], filesDeleted: [], totalAdditions: 0, totalDeletions: 0 };
314
+ }
315
+ const git = getGit(vaultRoot);
316
+ const branches = await git.branch();
317
+ const current = branches.current;
318
+ const base = baseBranch || branches.all.find(b => b === 'main' || b === 'master') || 'main';
319
+ if (current === base) {
320
+ const status = await git.status();
321
+ return {
322
+ filesAdded: status.created,
323
+ filesModified: status.modified,
324
+ filesDeleted: status.deleted,
325
+ totalAdditions: 0,
326
+ totalDeletions: 0,
327
+ };
328
+ }
329
+ try {
330
+ const diff = await git.diffSummary([`${base}...${current}`]);
331
+ const filesAdded = [];
332
+ const filesModified = [];
333
+ const filesDeleted = [];
334
+ let totalAdditions = 0;
335
+ let totalDeletions = 0;
336
+ for (const f of diff.files) {
337
+ totalAdditions += 'insertions' in f ? f.insertions : 0;
338
+ totalDeletions += 'deletions' in f ? f.deletions : 0;
339
+ if (f.file.includes('=>')) {
340
+ filesModified.push(f.file);
341
+ }
342
+ else if ('insertions' in f && f.insertions > 0 && ('deletions' in f ? f.deletions : 0) === 0) {
343
+ filesAdded.push(f.file);
344
+ }
345
+ else if ('deletions' in f && f.deletions > 0 && ('insertions' in f ? f.insertions : 0) === 0) {
346
+ filesDeleted.push(f.file);
347
+ }
348
+ else {
349
+ filesModified.push(f.file);
350
+ }
351
+ }
352
+ return { filesAdded, filesModified, filesDeleted, totalAdditions, totalDeletions };
353
+ }
354
+ catch {
355
+ return { filesAdded: [], filesModified: [], filesDeleted: [], totalAdditions: 0, totalDeletions: 0 };
356
+ }
357
+ }
358
+ export async function submitForReview(vaultRoot, description) {
359
+ if (!(await isGitRepo(vaultRoot))) {
360
+ throw new Error('Not a git repository');
361
+ }
362
+ const git = getGit(vaultRoot);
363
+ const branches = await git.branch();
364
+ let currentBranch = branches.current;
365
+ const baseBranch = branches.all.find(b => b === 'main' || b === 'master') || 'main';
366
+ if (currentBranch === baseBranch) {
367
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);
368
+ const sessionBranch = `wiki/session-${ts}`;
369
+ await git.checkoutLocalBranch(sessionBranch);
370
+ currentBranch = sessionBranch;
371
+ }
372
+ if (description) {
373
+ const status = await git.status();
374
+ if (status.files.length > 0) {
375
+ await git.add('.');
376
+ await git.commit(`wiki: feat(submit): ${description}`);
377
+ }
378
+ }
379
+ const diff = await getDiffSummary(vaultRoot, baseBranch);
380
+ let pushed = false;
381
+ let pushMessage = 'No remote configured';
382
+ try {
383
+ const remotes = await git.getRemotes(true);
384
+ if (remotes.length > 0) {
385
+ const remote = remotes[0].name;
386
+ await git.push(remote, currentBranch, ['--set-upstream']);
387
+ pushed = true;
388
+ pushMessage = `Pushed to ${remote}/${currentBranch}`;
389
+ }
390
+ }
391
+ catch (err) {
392
+ pushMessage = `Push failed: ${err instanceof Error ? err.message : String(err)}`;
393
+ }
394
+ return { branch: currentBranch, baseBranch, pushed, pushMessage, diff };
395
+ }
396
+ export async function migrateHistoryToGit(config) {
397
+ const historyLogPath = join(config.root, '.wikimem', 'history', 'log.json');
398
+ if (!existsSync(historyLogPath)) {
399
+ return { migrated: 0, skipped: 0, message: 'No history log found' };
400
+ }
401
+ const git = getGit(config.root);
402
+ if (!(await isGitRepo(config.root))) {
403
+ return { migrated: 0, skipped: 0, message: 'Not a git repository' };
404
+ }
405
+ const logData = JSON.parse(readFileSync(historyLogPath, 'utf-8'));
406
+ const entries = logData.entries ?? [];
407
+ if (entries.length === 0) {
408
+ return { migrated: 0, skipped: 0, message: 'No history entries to migrate' };
409
+ }
410
+ const snapshotsDir = join(config.root, '.wikimem', 'history', 'snapshots');
411
+ let migrated = 0;
412
+ let skipped = 0;
413
+ const sorted = [...entries].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
414
+ for (const entry of sorted) {
415
+ const snapDir = join(snapshotsDir, entry.id);
416
+ if (!existsSync(snapDir)) {
417
+ skipped++;
418
+ continue;
419
+ }
420
+ const wikiSnapDir = join(snapDir, 'wiki');
421
+ if (!existsSync(wikiSnapDir)) {
422
+ skipped++;
423
+ continue;
424
+ }
425
+ const { cpSync, rmSync } = await import('node:fs');
426
+ const wikiDir = config.wikiDir;
427
+ const wikiFiles = readdirSync(wikiDir).filter(f => f.endsWith('.md'));
428
+ for (const f of wikiFiles) {
429
+ rmSync(join(wikiDir, f), { force: true });
430
+ }
431
+ const snapFiles = readdirSync(wikiSnapDir).filter(f => f.endsWith('.md'));
432
+ for (const f of snapFiles) {
433
+ cpSync(join(wikiSnapDir, f), join(wikiDir, f));
434
+ }
435
+ await git.add('.');
436
+ const commitDate = new Date(entry.timestamp).toISOString();
437
+ const message = `wiki: ${entry.automation}: ${entry.summary}`;
438
+ await git.raw([
439
+ 'commit', '--allow-empty',
440
+ '-m', message,
441
+ '--date', commitDate,
442
+ ]);
443
+ migrated++;
444
+ }
445
+ return {
446
+ migrated,
447
+ skipped,
448
+ message: `Migrated ${migrated} snapshots as git commits (${skipped} skipped)`,
449
+ };
450
+ }
451
+ export async function getGraphAtCommit(vaultRoot, commitHash) {
452
+ if (!(await isGitRepo(vaultRoot)))
453
+ return { nodes: [], links: [] };
454
+ const git = getGit(vaultRoot);
455
+ try {
456
+ // Resolve relative path from git root to vault (in case vault is a subdirectory)
457
+ const gitRootRaw = await git.raw(['rev-parse', '--show-toplevel']);
458
+ const gitRoot = gitRootRaw.trim();
459
+ const { resolve, relative } = await import('node:path');
460
+ const relPath = relative(resolve(gitRoot), resolve(vaultRoot));
461
+ const wikiPath = relPath ? `${relPath}/wiki` : 'wiki';
462
+ const tree = await git.raw(['ls-tree', '-r', '--name-only', commitHash, '--', wikiPath]);
463
+ const wikiFiles = tree.split('\n').filter(f => f.endsWith('.md'));
464
+ const nodes = [];
465
+ const links = [];
466
+ const titleToId = new Map();
467
+ const pageData = [];
468
+ for (const filePath of wikiFiles) {
469
+ try {
470
+ const content = await git.show([`${commitHash}:${filePath}`]);
471
+ const parts = filePath.split('/');
472
+ const filename = parts[parts.length - 1] ?? '';
473
+ const id = filename.replace('.md', '');
474
+ // Find category: the directory after "wiki/" in the path
475
+ const wikiIdx = parts.indexOf('wiki');
476
+ const category = wikiIdx >= 0 && parts.length > wikiIdx + 2
477
+ ? (parts[wikiIdx + 1] ?? 'page')
478
+ : 'page';
479
+ let title = id;
480
+ const titleMatch = content.match(/^title:\s*["']?(.+?)["']?\s*$/m);
481
+ if (titleMatch?.[1])
482
+ title = titleMatch[1];
483
+ const wikilinks = [];
484
+ const linkRegex = /\[\[([^\]|]+)(?:\|[^\]]+)?\]\]/g;
485
+ let match;
486
+ while ((match = linkRegex.exec(content)) !== null) {
487
+ if (match[1])
488
+ wikilinks.push(match[1]);
489
+ }
490
+ pageData.push({ id, title, category, wikilinks });
491
+ titleToId.set(title, id);
492
+ titleToId.set(title.toLowerCase(), id);
493
+ titleToId.set(id, id);
494
+ }
495
+ catch {
496
+ // file may not exist at this commit
497
+ }
498
+ }
499
+ const inDegree = new Map();
500
+ for (const page of pageData) {
501
+ nodes.push({ id: page.id, title: page.title, category: page.category, linksIn: 0 });
502
+ for (const link of page.wikilinks) {
503
+ const targetId = titleToId.get(link) ?? titleToId.get(link.toLowerCase())
504
+ ?? titleToId.get(link.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''));
505
+ if (targetId && targetId !== page.id) {
506
+ links.push({ source: page.id, target: targetId });
507
+ inDegree.set(targetId, (inDegree.get(targetId) ?? 0) + 1);
508
+ }
509
+ }
510
+ }
511
+ for (const node of nodes) {
512
+ node.linksIn = inDegree.get(node.id) ?? 0;
513
+ }
514
+ return { nodes, links };
515
+ }
516
+ catch {
517
+ return { nodes: [], links: [] };
518
+ }
519
+ }
520
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/core/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { VaultConfig } from './vault.js';
2
+ export interface HistoryEntry {
3
+ id: string;
4
+ timestamp: string;
5
+ automation: 'ingest' | 'scrape' | 'improve' | 'manual' | 'restore';
6
+ summary: string;
7
+ filesChanged: string[];
8
+ details?: string;
9
+ }
10
+ export interface HistoryLog {
11
+ entries: HistoryEntry[];
12
+ }
13
+ export declare function ensureHistory(config: VaultConfig): void;
14
+ export declare function readHistoryLog(config: VaultConfig): HistoryLog;
15
+ export declare function recordSnapshot(config: VaultConfig, automation: HistoryEntry['automation'], summary: string, details?: string): HistoryEntry;
16
+ export declare function restoreSnapshot(config: VaultConfig, snapshotId: string): {
17
+ restored: boolean;
18
+ message: string;
19
+ };
20
+ export declare function listSnapshots(config: VaultConfig): HistoryEntry[];
21
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAcD,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAMvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CAO9D;AAQD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,EACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CAgDd;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA4B/G;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,CAGjE"}