repomemory 1.0.4 → 1.1.1

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 (56) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/README.md +93 -34
  3. package/dist/commands/analyze.d.ts.map +1 -1
  4. package/dist/commands/analyze.js +20 -0
  5. package/dist/commands/analyze.js.map +1 -1
  6. package/dist/commands/dashboard.d.ts.map +1 -1
  7. package/dist/commands/dashboard.js +305 -44
  8. package/dist/commands/dashboard.js.map +1 -1
  9. package/dist/commands/go.d.ts +6 -0
  10. package/dist/commands/go.d.ts.map +1 -0
  11. package/dist/commands/go.js +132 -0
  12. package/dist/commands/go.js.map +1 -0
  13. package/dist/commands/hook.d.ts.map +1 -1
  14. package/dist/commands/hook.js +19 -4
  15. package/dist/commands/hook.js.map +1 -1
  16. package/dist/commands/init.d.ts +3 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +51 -38
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/serve.d.ts.map +1 -1
  21. package/dist/commands/serve.js +5 -2
  22. package/dist/commands/serve.js.map +1 -1
  23. package/dist/commands/setup.js +7 -1
  24. package/dist/commands/setup.js.map +1 -1
  25. package/dist/commands/status.d.ts.map +1 -1
  26. package/dist/commands/status.js +3 -0
  27. package/dist/commands/status.js.map +1 -1
  28. package/dist/commands/wizard.d.ts.map +1 -1
  29. package/dist/commands/wizard.js +11 -3
  30. package/dist/commands/wizard.js.map +1 -1
  31. package/dist/index.js +8 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/lib/config.d.ts +9 -0
  34. package/dist/lib/config.d.ts.map +1 -1
  35. package/dist/lib/config.js +8 -1
  36. package/dist/lib/config.js.map +1 -1
  37. package/dist/lib/context-store.d.ts.map +1 -1
  38. package/dist/lib/context-store.js +18 -3
  39. package/dist/lib/context-store.js.map +1 -1
  40. package/dist/lib/embeddings.d.ts +27 -0
  41. package/dist/lib/embeddings.d.ts.map +1 -0
  42. package/dist/lib/embeddings.js +121 -0
  43. package/dist/lib/embeddings.js.map +1 -0
  44. package/dist/lib/search.d.ts +9 -2
  45. package/dist/lib/search.d.ts.map +1 -1
  46. package/dist/lib/search.js +259 -21
  47. package/dist/lib/search.js.map +1 -1
  48. package/dist/mcp/server.d.ts +26 -0
  49. package/dist/mcp/server.d.ts.map +1 -1
  50. package/dist/mcp/server.js +333 -43
  51. package/dist/mcp/server.js.map +1 -1
  52. package/package.json +1 -1
  53. package/server.json +12 -8
  54. package/skills/repomemory/SKILL.md +7 -4
  55. package/skills/session-end/SKILL.md +19 -0
  56. package/skills/session-start/SKILL.md +14 -0
@@ -1,8 +1,9 @@
1
1
  import chalk from "chalk";
2
2
  import { createServer } from "http";
3
- import { exec } from "child_process";
3
+ import { execFile } from "child_process";
4
4
  import { loadConfig } from "../lib/config.js";
5
5
  import { ContextStore } from "../lib/context-store.js";
6
+ import { SearchIndex } from "../lib/search.js";
6
7
  export async function dashboardCommand(options) {
7
8
  const repoRoot = options.dir || process.cwd();
8
9
  const port = parseInt(options.port || "3333");
@@ -12,13 +13,75 @@ export async function dashboardCommand(options) {
12
13
  console.log(chalk.red("\u2717 No .context/ directory found. Run `repomemory init` first."));
13
14
  process.exit(1);
14
15
  }
16
+ // Initialize search index for server-side search
17
+ let searchIndex = null;
18
+ try {
19
+ searchIndex = new SearchIndex(store.path, store);
20
+ await searchIndex.rebuild();
21
+ }
22
+ catch {
23
+ // Search will fall back to client-side filtering
24
+ }
15
25
  const server = createServer((req, res) => {
16
26
  const url = new URL(req.url || "/", `http://localhost:${port}`);
27
+ const allowedOrigin = `http://localhost:${port}`;
28
+ // CORS preflight — restrict to same origin
29
+ if (req.method === "OPTIONS") {
30
+ res.writeHead(204, {
31
+ "Access-Control-Allow-Origin": allowedOrigin,
32
+ "Access-Control-Allow-Methods": "GET, PUT, OPTIONS",
33
+ "Access-Control-Allow-Headers": "Content-Type",
34
+ });
35
+ res.end();
36
+ return;
37
+ }
17
38
  // API: return JSON data
18
39
  if (url.pathname === "/api/entries") {
40
+ if (req.method === "PUT") {
41
+ // Edit an entry
42
+ const MAX_BODY_SIZE = 5 * 1024 * 1024; // 5MB
43
+ let body = "";
44
+ let bodyTooLarge = false;
45
+ req.on("data", (chunk) => {
46
+ body += chunk;
47
+ if (body.length > MAX_BODY_SIZE) {
48
+ bodyTooLarge = true;
49
+ res.writeHead(413, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
50
+ res.end(JSON.stringify({ error: "Request body too large (max 5MB)" }));
51
+ req.destroy();
52
+ }
53
+ });
54
+ req.on("end", async () => {
55
+ if (bodyTooLarge)
56
+ return;
57
+ try {
58
+ const { category, filename, content } = JSON.parse(body);
59
+ if (!category || !filename || content === undefined || content === null) {
60
+ res.writeHead(400, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
61
+ res.end(JSON.stringify({ error: "Missing required fields: category, filename, and content" }));
62
+ return;
63
+ }
64
+ const writtenPath = store.writeEntry(category, filename, content);
65
+ // Update search index — match by relativePath since filename gets sanitized
66
+ if (searchIndex) {
67
+ const entries = store.listEntries(category);
68
+ const entry = entries.find((e) => e.relativePath === writtenPath);
69
+ if (entry)
70
+ await searchIndex.indexEntry(entry);
71
+ }
72
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
73
+ res.end(JSON.stringify({ success: true }));
74
+ }
75
+ catch (e) {
76
+ res.writeHead(400, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
77
+ res.end(JSON.stringify({ error: e.message }));
78
+ }
79
+ });
80
+ return;
81
+ }
19
82
  const category = url.searchParams.get("category") || undefined;
20
83
  const entries = store.listEntries(category);
21
- res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
84
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
22
85
  res.end(JSON.stringify(entries.map((e) => ({
23
86
  category: e.category,
24
87
  filename: e.filename,
@@ -30,15 +93,40 @@ export async function dashboardCommand(options) {
30
93
  }))));
31
94
  return;
32
95
  }
96
+ if (url.pathname === "/api/search") {
97
+ const query = url.searchParams.get("q") || "";
98
+ const category = url.searchParams.get("category") || undefined;
99
+ if (!query || query.length < 2) {
100
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
101
+ res.end(JSON.stringify([]));
102
+ return;
103
+ }
104
+ (async () => {
105
+ try {
106
+ if (!searchIndex) {
107
+ searchIndex = new SearchIndex(store.path, store);
108
+ await searchIndex.rebuild();
109
+ }
110
+ const results = await searchIndex.search(query, category, 20);
111
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
112
+ res.end(JSON.stringify(results));
113
+ }
114
+ catch {
115
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
116
+ res.end(JSON.stringify([]));
117
+ }
118
+ })();
119
+ return;
120
+ }
33
121
  if (url.pathname === "/api/stats") {
34
122
  const stats = store.getStats();
35
- res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
123
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
36
124
  res.end(JSON.stringify(stats));
37
125
  return;
38
126
  }
39
127
  if (url.pathname === "/api/index") {
40
128
  const content = store.readIndex();
41
- res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
129
+ res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": allowedOrigin });
42
130
  res.end(JSON.stringify({ content }));
43
131
  return;
44
132
  }
@@ -46,15 +134,20 @@ export async function dashboardCommand(options) {
46
134
  res.writeHead(200, { "Content-Type": "text/html" });
47
135
  res.end(buildDashboardHTML(config.provider, config.model));
48
136
  });
49
- server.listen(port, () => {
137
+ server.listen(port, "127.0.0.1", () => {
50
138
  const url = `http://localhost:${port}`;
51
139
  console.log(chalk.bold(`\n\ud83c\udf10 repomemory dashboard\n`));
52
140
  console.log(` ${chalk.cyan("URL:")} ${chalk.underline(url)}`);
53
141
  console.log(` ${chalk.cyan("Root:")} ${repoRoot}`);
54
142
  console.log(chalk.dim(`\n Press Ctrl+C to stop.\n`));
55
- // Try to open browser
56
- const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
57
- exec(`${cmd} ${url}`, () => { }); // Silently fail if can't open
143
+ // Try to open browser (use execFile to avoid shell injection)
144
+ if (process.platform === "win32") {
145
+ execFile("cmd", ["/c", "start", url], () => { });
146
+ }
147
+ else {
148
+ const cmd = process.platform === "darwin" ? "open" : "xdg-open";
149
+ execFile(cmd, [url], () => { });
150
+ }
58
151
  });
59
152
  // Graceful shutdown
60
153
  process.on("SIGTERM", () => { server.close(); process.exit(0); });
@@ -67,6 +160,7 @@ function buildDashboardHTML(provider, model) {
67
160
  <meta charset="UTF-8">
68
161
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
69
162
  <title>repomemory dashboard</title>
163
+ <script src="https://cdn.jsdelivr.net/npm/marked@15/marked.min.js"></script>
70
164
  <style>
71
165
  :root {
72
166
  --bg: #0a0a0f;
@@ -80,6 +174,7 @@ function buildDashboardHTML(provider, model) {
80
174
  --warn: #f0b040;
81
175
  --danger: #f85149;
82
176
  --purple: #bc8cff;
177
+ --pink: #e88fcf;
83
178
  --radius: 12px;
84
179
  }
85
180
 
@@ -122,8 +217,24 @@ function buildDashboardHTML(provider, model) {
122
217
  .header .meta {
123
218
  color: var(--text-dim);
124
219
  font-size: 13px;
220
+ display: flex;
221
+ gap: 12px;
222
+ align-items: center;
223
+ }
224
+
225
+ .header .export-btn {
226
+ background: var(--surface2);
227
+ border: 1px solid var(--border);
228
+ color: var(--text-dim);
229
+ padding: 6px 14px;
230
+ border-radius: 8px;
231
+ font-size: 12px;
232
+ cursor: pointer;
233
+ transition: all 0.15s;
125
234
  }
126
235
 
236
+ .header .export-btn:hover { border-color: var(--accent); color: var(--text); }
237
+
127
238
  .search-bar {
128
239
  margin: 24px 32px;
129
240
  position: relative;
@@ -141,9 +252,7 @@ function buildDashboardHTML(provider, model) {
141
252
  transition: border-color 0.2s;
142
253
  }
143
254
 
144
- .search-bar input:focus {
145
- border-color: var(--accent);
146
- }
255
+ .search-bar input:focus { border-color: var(--accent); }
147
256
 
148
257
  .search-bar .icon {
149
258
  position: absolute;
@@ -208,10 +317,7 @@ function buildDashboardHTML(provider, model) {
208
317
  border-left: 3px solid transparent;
209
318
  }
210
319
 
211
- .sidebar .cat-btn:hover {
212
- background: var(--surface);
213
- color: var(--text);
214
- }
320
+ .sidebar .cat-btn:hover { background: var(--surface); color: var(--text); }
215
321
 
216
322
  .sidebar .cat-btn.active {
217
323
  background: var(--surface);
@@ -229,14 +335,9 @@ function buildDashboardHTML(provider, model) {
229
335
  border-radius: 99px;
230
336
  }
231
337
 
232
- .content {
233
- padding: 20px 32px;
234
- }
338
+ .content { padding: 20px 32px; }
235
339
 
236
- .entry-grid {
237
- display: grid;
238
- gap: 12px;
239
- }
340
+ .entry-grid { display: grid; gap: 12px; }
240
341
 
241
342
  .entry-card {
242
343
  background: var(--surface);
@@ -247,10 +348,7 @@ function buildDashboardHTML(provider, model) {
247
348
  transition: all 0.15s;
248
349
  }
249
350
 
250
- .entry-card:hover {
251
- border-color: var(--accent);
252
- transform: translateY(-1px);
253
- }
351
+ .entry-card:hover { border-color: var(--accent); transform: translateY(-1px); }
254
352
 
255
353
  .entry-card .card-header {
256
354
  display: flex;
@@ -259,10 +357,7 @@ function buildDashboardHTML(provider, model) {
259
357
  margin-bottom: 8px;
260
358
  }
261
359
 
262
- .entry-card .card-title {
263
- font-weight: 600;
264
- font-size: 15px;
265
- }
360
+ .entry-card .card-title { font-weight: 600; font-size: 15px; }
266
361
 
267
362
  .entry-card .card-meta {
268
363
  color: var(--text-dim);
@@ -285,6 +380,7 @@ function buildDashboardHTML(provider, model) {
285
380
  .cat-regressions { background: rgba(248, 81, 73, 0.15); color: var(--danger); }
286
381
  .cat-sessions { background: rgba(57, 211, 83, 0.15); color: var(--accent2); }
287
382
  .cat-changelog { background: rgba(240, 176, 64, 0.15); color: var(--warn); }
383
+ .cat-preferences { background: rgba(232, 143, 207, 0.15); color: var(--pink); }
288
384
 
289
385
  .entry-card .preview {
290
386
  color: var(--text-dim);
@@ -318,8 +414,26 @@ function buildDashboardHTML(provider, model) {
318
414
  padding: 32px;
319
415
  }
320
416
 
321
- .detail-panel .close-btn {
417
+ .detail-panel .detail-actions {
322
418
  float: right;
419
+ display: flex;
420
+ gap: 8px;
421
+ }
422
+
423
+ .detail-panel .action-btn {
424
+ background: var(--surface2);
425
+ border: 1px solid var(--border);
426
+ color: var(--text-dim);
427
+ padding: 6px 14px;
428
+ border-radius: 8px;
429
+ font-size: 12px;
430
+ cursor: pointer;
431
+ transition: all 0.15s;
432
+ }
433
+
434
+ .detail-panel .action-btn:hover { border-color: var(--accent); color: var(--text); }
435
+
436
+ .detail-panel .close-btn {
323
437
  background: none;
324
438
  border: none;
325
439
  color: var(--text-dim);
@@ -361,6 +475,25 @@ function buildDashboardHTML(provider, model) {
361
475
  }
362
476
  .detail-panel .md-content hr { border: none; border-top: 1px solid var(--border); margin: 16px 0; }
363
477
 
478
+ .edit-area {
479
+ display: none;
480
+ width: 100%;
481
+ min-height: 400px;
482
+ background: var(--bg);
483
+ border: 1px solid var(--border);
484
+ border-radius: 8px;
485
+ padding: 16px;
486
+ color: var(--text);
487
+ font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
488
+ font-size: 13px;
489
+ line-height: 1.5;
490
+ resize: vertical;
491
+ outline: none;
492
+ margin-top: 12px;
493
+ }
494
+
495
+ .edit-area:focus { border-color: var(--accent); }
496
+
364
497
  .empty {
365
498
  text-align: center;
366
499
  color: var(--text-dim);
@@ -381,7 +514,10 @@ function buildDashboardHTML(provider, model) {
381
514
 
382
515
  <div class="header">
383
516
  <h1><span class="logo">\u25c9 repomemory</span> <span style="color:var(--text-dim);font-weight:400;font-size:14px">dashboard</span></h1>
384
- <div class="meta">${provider} \u00b7 ${model}</div>
517
+ <div class="meta">
518
+ <span>${provider} \u00b7 ${model}</span>
519
+ <button class="export-btn" onclick="exportAll()">\u2913 Export</button>
520
+ </div>
385
521
  </div>
386
522
 
387
523
  <div class="search-bar">
@@ -398,16 +534,23 @@ function buildDashboardHTML(provider, model) {
398
534
 
399
535
  <div class="detail-overlay" id="detailOverlay">
400
536
  <div class="detail-panel" id="detailPanel">
401
- <button class="close-btn" onclick="closeDetail()">\u00d7</button>
537
+ <div class="detail-actions">
538
+ <button class="action-btn" id="editBtn" onclick="toggleEdit()">\u270e Edit</button>
539
+ <button class="action-btn" id="saveBtn" style="display:none;color:var(--accent2)" onclick="saveEdit()">\u2713 Save</button>
540
+ <button class="close-btn" onclick="closeDetail()">\u00d7</button>
541
+ </div>
402
542
  <h2 id="detailTitle"></h2>
403
543
  <div class="card-meta" id="detailMeta" style="margin-bottom:16px"></div>
404
544
  <div class="md-content" id="detailContent"></div>
545
+ <textarea class="edit-area" id="editArea"></textarea>
405
546
  </div>
406
547
  </div>
407
548
 
408
549
  <script>
409
550
  let allEntries = [];
410
551
  let currentCategory = null;
552
+ let editingEntry = null;
553
+ let searchDebounce = null;
411
554
 
412
555
  async function init() {
413
556
  const [entries, stats] = await Promise.all([
@@ -481,14 +624,69 @@ function showDetail(index) {
481
624
  const e = filtered[index];
482
625
  if (!e) return;
483
626
 
627
+ editingEntry = e;
484
628
  document.getElementById('detailTitle').textContent = e.category + '/' + e.filename;
485
629
  document.getElementById('detailMeta').innerHTML = \`<span>\${e.title}</span> &middot; <span>\${(e.sizeBytes/1024).toFixed(1)}KB</span> &middot; <span>\${timeAgo(Date.now() - new Date(e.lastModified).getTime())}</span>\`;
486
630
  document.getElementById('detailContent').innerHTML = renderMarkdown(e.content);
487
631
  document.getElementById('detailOverlay').classList.add('visible');
632
+
633
+ // Reset edit state
634
+ document.getElementById('editArea').style.display = 'none';
635
+ document.getElementById('detailContent').style.display = 'block';
636
+ document.getElementById('saveBtn').style.display = 'none';
637
+ document.getElementById('editBtn').textContent = '\u270e Edit';
488
638
  }
489
639
 
490
640
  function closeDetail() {
491
641
  document.getElementById('detailOverlay').classList.remove('visible');
642
+ editingEntry = null;
643
+ }
644
+
645
+ function toggleEdit() {
646
+ const editArea = document.getElementById('editArea');
647
+ const content = document.getElementById('detailContent');
648
+ const saveBtn = document.getElementById('saveBtn');
649
+ const editBtn = document.getElementById('editBtn');
650
+
651
+ if (editArea.style.display === 'none') {
652
+ editArea.value = editingEntry.content;
653
+ editArea.style.display = 'block';
654
+ content.style.display = 'none';
655
+ saveBtn.style.display = 'inline-block';
656
+ editBtn.textContent = '\u2715 Cancel';
657
+ editArea.focus();
658
+ } else {
659
+ editArea.style.display = 'none';
660
+ content.style.display = 'block';
661
+ saveBtn.style.display = 'none';
662
+ editBtn.textContent = '\u270e Edit';
663
+ }
664
+ }
665
+
666
+ async function saveEdit() {
667
+ const content = document.getElementById('editArea').value;
668
+ const fname = editingEntry.filename.replace(/\\.md$/, '');
669
+
670
+ try {
671
+ const resp = await fetch('/api/entries', {
672
+ method: 'PUT',
673
+ headers: { 'Content-Type': 'application/json' },
674
+ body: JSON.stringify({
675
+ category: editingEntry.category,
676
+ filename: fname,
677
+ content,
678
+ }),
679
+ });
680
+
681
+ if (!resp.ok) throw new Error('Save failed');
682
+
683
+ editingEntry.content = content;
684
+ document.getElementById('detailContent').innerHTML = renderMarkdown(content);
685
+ toggleEdit();
686
+ init(); // Refresh all entries
687
+ } catch (e) {
688
+ alert('Failed to save: ' + e.message);
689
+ }
492
690
  }
493
691
 
494
692
  function getFilteredEntries() {
@@ -500,8 +698,32 @@ function getFilteredEntries() {
500
698
  });
501
699
  }
502
700
 
701
+ // Server-side search with debounce
503
702
  document.getElementById('searchInput').addEventListener('input', () => {
504
- filterCategory(currentCategory, document.querySelector('.cat-btn.active'));
703
+ clearTimeout(searchDebounce);
704
+ const q = document.getElementById('searchInput').value;
705
+
706
+ searchDebounce = setTimeout(async () => {
707
+ if (q.length >= 2) {
708
+ try {
709
+ const results = await fetch('/api/search?q=' + encodeURIComponent(q) + (currentCategory ? '&category=' + currentCategory : '')).then(r => r.json());
710
+ if (results.length > 0) {
711
+ const matchedKeys = new Set(results.map(r => r.category + '/' + r.filename));
712
+ const filtered = allEntries.filter(e =>
713
+ matchedKeys.has(e.category + '/' + e.filename) &&
714
+ (!currentCategory || e.category === currentCategory)
715
+ );
716
+ renderEntries(filtered.length > 0 ? filtered : getFilteredEntries());
717
+ } else {
718
+ renderEntries(getFilteredEntries());
719
+ }
720
+ } catch {
721
+ filterCategory(currentCategory, document.querySelector('.cat-btn.active'));
722
+ }
723
+ } else {
724
+ filterCategory(currentCategory, document.querySelector('.cat-btn.active'));
725
+ }
726
+ }, 300);
505
727
  });
506
728
 
507
729
  document.getElementById('detailOverlay').addEventListener('click', (e) => {
@@ -516,7 +738,24 @@ function escapeHtml(s) {
516
738
  return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
517
739
  }
518
740
 
741
+ function sanitizeHtml(html) {
742
+ // Strip script tags and event handlers to prevent XSS
743
+ html = html.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '');
744
+ html = html.replace(/\\s+on\\w+\\s*=\\s*["'][^"']*["']/gi, '');
745
+ html = html.replace(/\\s+on\\w+\\s*=\\s*[^\\s>]+/gi, '');
746
+ html = html.replace(/href\\s*=\\s*["']javascript:[^"']*["']/gi, 'href="#"');
747
+ return html;
748
+ }
749
+
519
750
  function renderMarkdown(md) {
751
+ // Use marked.js if available (loaded from CDN), else fallback to regex
752
+ if (typeof marked !== 'undefined') {
753
+ try { return sanitizeHtml(marked.parse(md)); } catch {}
754
+ }
755
+ return regexRenderMarkdown(md);
756
+ }
757
+
758
+ function regexRenderMarkdown(md) {
520
759
  var html = escapeHtml(md);
521
760
  var BT = String.fromCharCode(96);
522
761
  var codeBlockRe = new RegExp(BT+BT+BT+'(\\\\w*)?\\\\n([\\\\s\\\\S]*?)'+BT+BT+BT, 'g');
@@ -524,22 +763,31 @@ function renderMarkdown(md) {
524
763
  return '<pre><code>' + code.trim() + '</code></pre>';
525
764
  });
526
765
  var inlineCodeRe = new RegExp(BT+'([^'+BT+']+)'+BT, 'g');
527
- html = html.replace(inlineCodeRe, '<code>\$1</code>');
528
- html = html.replace(/^### (.+)\$/gm, '<h3>\$1</h3>');
529
- html = html.replace(/^## (.+)\$/gm, '<h2>\$1</h2>');
530
- html = html.replace(/^# (.+)\$/gm, '<h1>\$1</h1>');
531
- html = html.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>\$1</strong>');
532
- html = html.replace(/\\*([^*]+)\\*/g, '<em>\$1</em>');
533
- html = html.replace(/^&gt; (.+)\$/gm, '<blockquote>\$1</blockquote>');
534
- html = html.replace(/^---\$/gm, '<hr>');
535
- html = html.replace(/^- (.+)\$/gm, '<li>\$1</li>');
766
+ html = html.replace(inlineCodeRe, '<code>$1</code>');
767
+ html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');
768
+ html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');
769
+ html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');
770
+ html = html.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');
771
+ html = html.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');
772
+ html = html.replace(/^&gt; (.+)$/gm, '<blockquote>$1</blockquote>');
773
+ html = html.replace(/^---$/gm, '<hr>');
774
+ html = html.replace(/^- (.+)$/gm, '<li>$1</li>');
536
775
  html = html.replace(/((<li>.*<\\/li>)\\n?)+/g, function(m) { return '<ul>' + m + '</ul>'; });
537
- html = html.replace(/^\\d+\\. (.+)\$/gm, '<li>\$1</li>');
776
+ html = html.replace(/^\\d+\\. (.+)$/gm, '<li>$1</li>');
538
777
  html = html.replace(/\\n\\n(?!<)/g, '</p><p>');
539
778
  html = html.replace(/\\n(?!<)/g, '<br>');
540
779
  return '<p>' + html + '</p>';
541
780
  }
542
781
 
782
+ function exportAll() {
783
+ const blob = new Blob([JSON.stringify(allEntries, null, 2)], { type: 'application/json' });
784
+ const a = document.createElement('a');
785
+ a.href = URL.createObjectURL(blob);
786
+ a.download = 'repomemory-export.json';
787
+ a.click();
788
+ URL.revokeObjectURL(a.href);
789
+ }
790
+
543
791
  function timeAgo(ms) {
544
792
  const s = Math.floor(ms / 1000);
545
793
  if (s < 60) return 'just now';
@@ -551,6 +799,19 @@ function timeAgo(ms) {
551
799
  return Math.floor(d/365) + 'y ago';
552
800
  }
553
801
 
802
+ // Real-time polling for changes
803
+ setInterval(async () => {
804
+ try {
805
+ const entries = await fetch('/api/entries').then(r => r.json());
806
+ if (JSON.stringify(entries.map(e => e.lastModified)) !== JSON.stringify(allEntries.map(e => e.lastModified))) {
807
+ allEntries = entries;
808
+ const stats = await fetch('/api/stats').then(r => r.json());
809
+ renderSidebar(stats.categories);
810
+ filterCategory(currentCategory, document.querySelector('.cat-btn.active'));
811
+ }
812
+ } catch {}
813
+ }, 5000);
814
+
554
815
  init();
555
816
  </script>
556
817
  </body>
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function goCommand(options: {
2
+ dir?: string;
3
+ provider?: string;
4
+ skipAnalyze?: boolean;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/commands/go.ts"],"names":[],"mappings":"AAWA,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,iBA4HA"}