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.
- package/.claude-plugin/plugin.json +2 -2
- package/README.md +93 -34
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +20 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +305 -44
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/go.d.ts +6 -0
- package/dist/commands/go.d.ts.map +1 -0
- package/dist/commands/go.js +132 -0
- package/dist/commands/go.js.map +1 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +19 -4
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +51 -38
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +5 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/setup.js +7 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/wizard.d.ts.map +1 -1
- package/dist/commands/wizard.js +11 -3
- package/dist/commands/wizard.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +8 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/context-store.d.ts.map +1 -1
- package/dist/lib/context-store.js +18 -3
- package/dist/lib/context-store.js.map +1 -1
- package/dist/lib/embeddings.d.ts +27 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +121 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/search.d.ts +9 -2
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +259 -21
- package/dist/lib/search.js.map +1 -1
- package/dist/mcp/server.d.ts +26 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +333 -43
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
- package/server.json +12 -8
- package/skills/repomemory/SKILL.md +7 -4
- package/skills/session-end/SKILL.md +19 -0
- 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 {
|
|
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
|
-
|
|
57
|
-
|
|
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 .
|
|
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"
|
|
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
|
-
<
|
|
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> · <span>\${(e.sizeBytes/1024).toFixed(1)}KB</span> · <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
|
-
|
|
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,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
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
|
|
528
|
-
html = html.replace(/^### (.+)
|
|
529
|
-
html = html.replace(/^## (.+)
|
|
530
|
-
html = html.replace(/^# (.+)
|
|
531
|
-
html = html.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong
|
|
532
|
-
html = html.replace(/\\*([^*]+)\\*/g, '<em
|
|
533
|
-
html = html.replace(/^> (.+)
|
|
534
|
-
html = html.replace(
|
|
535
|
-
html = html.replace(/^- (.+)
|
|
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(/^> (.+)$/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+\\. (.+)
|
|
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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|