repomemory 0.1.0 → 0.2.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 +8 -0
- package/.mcp.json +8 -0
- package/README.md +151 -104
- package/dist/commands/analyze.d.ts +2 -0
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +162 -188
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/dashboard.d.ts +5 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +520 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +33 -34
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +2 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +151 -35
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +87 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +57 -27
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/wizard.d.ts +4 -0
- package/dist/commands/wizard.d.ts.map +1 -0
- package/dist/commands/wizard.js +184 -0
- package/dist/commands/wizard.js.map +1 -0
- package/dist/index.js +37 -42
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-provider.d.ts +11 -0
- package/dist/lib/ai-provider.d.ts.map +1 -1
- package/dist/lib/ai-provider.js +139 -69
- package/dist/lib/ai-provider.js.map +1 -1
- package/dist/lib/config.d.ts +11 -15
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +34 -22
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/context-store.d.ts +11 -0
- package/dist/lib/context-store.d.ts.map +1 -1
- package/dist/lib/context-store.js +51 -18
- package/dist/lib/context-store.js.map +1 -1
- package/dist/lib/git.d.ts +1 -0
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +34 -20
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/json-repair.d.ts +24 -0
- package/dist/lib/json-repair.d.ts.map +1 -0
- package/dist/lib/json-repair.js +140 -0
- package/dist/lib/json-repair.js.map +1 -0
- package/dist/lib/repo-scanner.d.ts.map +1 -1
- package/dist/lib/repo-scanner.js +103 -26
- package/dist/lib/repo-scanner.js.map +1 -1
- package/dist/lib/search.d.ts +10 -4
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +136 -51
- package/dist/lib/search.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +163 -54
- package/dist/mcp/server.js.map +1 -1
- package/package.json +25 -9
- package/server.json +46 -0
- package/skills/repomemory/SKILL.md +29 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createServer } from "http";
|
|
3
|
+
import { loadConfig } from "../lib/config.js";
|
|
4
|
+
import { ContextStore } from "../lib/context-store.js";
|
|
5
|
+
export async function dashboardCommand(options) {
|
|
6
|
+
const repoRoot = options.dir || process.cwd();
|
|
7
|
+
const port = parseInt(options.port || "3333");
|
|
8
|
+
const config = loadConfig(repoRoot);
|
|
9
|
+
const store = new ContextStore(repoRoot, config);
|
|
10
|
+
if (!store.exists()) {
|
|
11
|
+
console.log(chalk.red("\u2717 No .context/ directory found. Run `repomemory init` first."));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const server = createServer((req, res) => {
|
|
15
|
+
const url = new URL(req.url || "/", `http://localhost:${port}`);
|
|
16
|
+
// API: return JSON data
|
|
17
|
+
if (url.pathname === "/api/entries") {
|
|
18
|
+
const category = url.searchParams.get("category") || undefined;
|
|
19
|
+
const entries = store.listEntries(category);
|
|
20
|
+
res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
|
|
21
|
+
res.end(JSON.stringify(entries.map((e) => ({
|
|
22
|
+
category: e.category,
|
|
23
|
+
filename: e.filename,
|
|
24
|
+
title: e.title,
|
|
25
|
+
content: e.content,
|
|
26
|
+
relativePath: e.relativePath,
|
|
27
|
+
lastModified: e.lastModified.toISOString(),
|
|
28
|
+
sizeBytes: e.sizeBytes,
|
|
29
|
+
}))));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (url.pathname === "/api/stats") {
|
|
33
|
+
const stats = store.getStats();
|
|
34
|
+
res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
|
|
35
|
+
res.end(JSON.stringify(stats));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (url.pathname === "/api/index") {
|
|
39
|
+
const content = store.readIndex();
|
|
40
|
+
res.writeHead(200, { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
|
|
41
|
+
res.end(JSON.stringify({ content }));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Serve the SPA
|
|
45
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
46
|
+
res.end(buildDashboardHTML(config.provider, config.model));
|
|
47
|
+
});
|
|
48
|
+
server.listen(port, () => {
|
|
49
|
+
const url = `http://localhost:${port}`;
|
|
50
|
+
console.log(chalk.bold(`\n\ud83c\udf10 repomemory dashboard\n`));
|
|
51
|
+
console.log(` ${chalk.cyan("URL:")} ${chalk.underline(url)}`);
|
|
52
|
+
console.log(` ${chalk.cyan("Root:")} ${repoRoot}`);
|
|
53
|
+
console.log(chalk.dim(`\n Press Ctrl+C to stop.\n`));
|
|
54
|
+
// Try to open browser
|
|
55
|
+
const { exec } = require("child_process");
|
|
56
|
+
const cmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
57
|
+
exec(`${cmd} ${url}`, () => { }); // Silently fail if can't open
|
|
58
|
+
});
|
|
59
|
+
// Graceful shutdown
|
|
60
|
+
process.on("SIGTERM", () => { server.close(); process.exit(0); });
|
|
61
|
+
process.on("SIGINT", () => { server.close(); process.exit(0); });
|
|
62
|
+
}
|
|
63
|
+
function buildDashboardHTML(provider, model) {
|
|
64
|
+
return `<!DOCTYPE html>
|
|
65
|
+
<html lang="en">
|
|
66
|
+
<head>
|
|
67
|
+
<meta charset="UTF-8">
|
|
68
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
69
|
+
<title>repomemory dashboard</title>
|
|
70
|
+
<style>
|
|
71
|
+
:root {
|
|
72
|
+
--bg: #0a0a0f;
|
|
73
|
+
--surface: #12121a;
|
|
74
|
+
--surface2: #1a1a26;
|
|
75
|
+
--border: #2a2a3a;
|
|
76
|
+
--text: #e4e4ef;
|
|
77
|
+
--text-dim: #7a7a8f;
|
|
78
|
+
--accent: #58a6ff;
|
|
79
|
+
--accent2: #39d353;
|
|
80
|
+
--warn: #f0b040;
|
|
81
|
+
--danger: #f85149;
|
|
82
|
+
--purple: #bc8cff;
|
|
83
|
+
--radius: 12px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
87
|
+
|
|
88
|
+
body {
|
|
89
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
|
|
90
|
+
background: var(--bg);
|
|
91
|
+
color: var(--text);
|
|
92
|
+
min-height: 100vh;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.header {
|
|
96
|
+
border-bottom: 1px solid var(--border);
|
|
97
|
+
padding: 20px 32px;
|
|
98
|
+
display: flex;
|
|
99
|
+
justify-content: space-between;
|
|
100
|
+
align-items: center;
|
|
101
|
+
backdrop-filter: blur(12px);
|
|
102
|
+
background: rgba(10, 10, 15, 0.8);
|
|
103
|
+
position: sticky;
|
|
104
|
+
top: 0;
|
|
105
|
+
z-index: 10;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.header h1 {
|
|
109
|
+
font-size: 20px;
|
|
110
|
+
font-weight: 600;
|
|
111
|
+
display: flex;
|
|
112
|
+
align-items: center;
|
|
113
|
+
gap: 10px;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.header h1 .logo {
|
|
117
|
+
background: linear-gradient(135deg, var(--accent), var(--purple));
|
|
118
|
+
-webkit-background-clip: text;
|
|
119
|
+
-webkit-text-fill-color: transparent;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.header .meta {
|
|
123
|
+
color: var(--text-dim);
|
|
124
|
+
font-size: 13px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.search-bar {
|
|
128
|
+
margin: 24px 32px;
|
|
129
|
+
position: relative;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.search-bar input {
|
|
133
|
+
width: 100%;
|
|
134
|
+
padding: 14px 20px 14px 44px;
|
|
135
|
+
background: var(--surface);
|
|
136
|
+
border: 1px solid var(--border);
|
|
137
|
+
border-radius: var(--radius);
|
|
138
|
+
color: var(--text);
|
|
139
|
+
font-size: 15px;
|
|
140
|
+
outline: none;
|
|
141
|
+
transition: border-color 0.2s;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.search-bar input:focus {
|
|
145
|
+
border-color: var(--accent);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.search-bar .icon {
|
|
149
|
+
position: absolute;
|
|
150
|
+
left: 16px;
|
|
151
|
+
top: 50%;
|
|
152
|
+
transform: translateY(-50%);
|
|
153
|
+
color: var(--text-dim);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.stats-row {
|
|
157
|
+
display: grid;
|
|
158
|
+
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
|
159
|
+
gap: 16px;
|
|
160
|
+
padding: 0 32px 24px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.stat-card {
|
|
164
|
+
background: var(--surface);
|
|
165
|
+
border: 1px solid var(--border);
|
|
166
|
+
border-radius: var(--radius);
|
|
167
|
+
padding: 20px;
|
|
168
|
+
text-align: center;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.stat-card .value {
|
|
172
|
+
font-size: 28px;
|
|
173
|
+
font-weight: 700;
|
|
174
|
+
color: var(--accent);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.stat-card .label {
|
|
178
|
+
font-size: 12px;
|
|
179
|
+
color: var(--text-dim);
|
|
180
|
+
text-transform: uppercase;
|
|
181
|
+
letter-spacing: 0.5px;
|
|
182
|
+
margin-top: 4px;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.main {
|
|
186
|
+
display: grid;
|
|
187
|
+
grid-template-columns: 240px 1fr;
|
|
188
|
+
gap: 0;
|
|
189
|
+
min-height: calc(100vh - 200px);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.sidebar {
|
|
193
|
+
border-right: 1px solid var(--border);
|
|
194
|
+
padding: 20px 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.sidebar .cat-btn {
|
|
198
|
+
display: block;
|
|
199
|
+
width: 100%;
|
|
200
|
+
padding: 10px 24px;
|
|
201
|
+
background: none;
|
|
202
|
+
border: none;
|
|
203
|
+
color: var(--text-dim);
|
|
204
|
+
font-size: 14px;
|
|
205
|
+
text-align: left;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
transition: all 0.15s;
|
|
208
|
+
border-left: 3px solid transparent;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.sidebar .cat-btn:hover {
|
|
212
|
+
background: var(--surface);
|
|
213
|
+
color: var(--text);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
.sidebar .cat-btn.active {
|
|
217
|
+
background: var(--surface);
|
|
218
|
+
color: var(--accent);
|
|
219
|
+
border-left-color: var(--accent);
|
|
220
|
+
font-weight: 600;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.sidebar .cat-btn .count {
|
|
224
|
+
float: right;
|
|
225
|
+
background: var(--surface2);
|
|
226
|
+
color: var(--text-dim);
|
|
227
|
+
font-size: 11px;
|
|
228
|
+
padding: 2px 8px;
|
|
229
|
+
border-radius: 99px;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.content {
|
|
233
|
+
padding: 20px 32px;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.entry-grid {
|
|
237
|
+
display: grid;
|
|
238
|
+
gap: 12px;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.entry-card {
|
|
242
|
+
background: var(--surface);
|
|
243
|
+
border: 1px solid var(--border);
|
|
244
|
+
border-radius: var(--radius);
|
|
245
|
+
padding: 20px;
|
|
246
|
+
cursor: pointer;
|
|
247
|
+
transition: all 0.15s;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.entry-card:hover {
|
|
251
|
+
border-color: var(--accent);
|
|
252
|
+
transform: translateY(-1px);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
.entry-card .card-header {
|
|
256
|
+
display: flex;
|
|
257
|
+
justify-content: space-between;
|
|
258
|
+
align-items: flex-start;
|
|
259
|
+
margin-bottom: 8px;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.entry-card .card-title {
|
|
263
|
+
font-weight: 600;
|
|
264
|
+
font-size: 15px;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
.entry-card .card-meta {
|
|
268
|
+
color: var(--text-dim);
|
|
269
|
+
font-size: 12px;
|
|
270
|
+
display: flex;
|
|
271
|
+
gap: 12px;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
.entry-card .card-category {
|
|
275
|
+
display: inline-block;
|
|
276
|
+
padding: 2px 10px;
|
|
277
|
+
border-radius: 99px;
|
|
278
|
+
font-size: 11px;
|
|
279
|
+
font-weight: 600;
|
|
280
|
+
text-transform: uppercase;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
.cat-facts { background: rgba(88, 166, 255, 0.15); color: var(--accent); }
|
|
284
|
+
.cat-decisions { background: rgba(188, 140, 255, 0.15); color: var(--purple); }
|
|
285
|
+
.cat-regressions { background: rgba(248, 81, 73, 0.15); color: var(--danger); }
|
|
286
|
+
.cat-sessions { background: rgba(57, 211, 83, 0.15); color: var(--accent2); }
|
|
287
|
+
.cat-changelog { background: rgba(240, 176, 64, 0.15); color: var(--warn); }
|
|
288
|
+
|
|
289
|
+
.entry-card .preview {
|
|
290
|
+
color: var(--text-dim);
|
|
291
|
+
font-size: 13px;
|
|
292
|
+
line-height: 1.5;
|
|
293
|
+
max-height: 3em;
|
|
294
|
+
overflow: hidden;
|
|
295
|
+
margin-top: 8px;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* Detail view (modal-style) */
|
|
299
|
+
.detail-overlay {
|
|
300
|
+
display: none;
|
|
301
|
+
position: fixed;
|
|
302
|
+
inset: 0;
|
|
303
|
+
background: rgba(0,0,0,0.7);
|
|
304
|
+
z-index: 100;
|
|
305
|
+
backdrop-filter: blur(4px);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.detail-overlay.visible { display: flex; justify-content: center; align-items: flex-start; padding: 60px 40px; }
|
|
309
|
+
|
|
310
|
+
.detail-panel {
|
|
311
|
+
background: var(--surface);
|
|
312
|
+
border: 1px solid var(--border);
|
|
313
|
+
border-radius: var(--radius);
|
|
314
|
+
max-width: 800px;
|
|
315
|
+
width: 100%;
|
|
316
|
+
max-height: 80vh;
|
|
317
|
+
overflow-y: auto;
|
|
318
|
+
padding: 32px;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.detail-panel .close-btn {
|
|
322
|
+
float: right;
|
|
323
|
+
background: none;
|
|
324
|
+
border: none;
|
|
325
|
+
color: var(--text-dim);
|
|
326
|
+
font-size: 24px;
|
|
327
|
+
cursor: pointer;
|
|
328
|
+
padding: 0 8px;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.detail-panel .close-btn:hover { color: var(--text); }
|
|
332
|
+
|
|
333
|
+
.detail-panel h2 { font-size: 20px; margin-bottom: 8px; }
|
|
334
|
+
|
|
335
|
+
.detail-panel .md-content {
|
|
336
|
+
font-size: 14px;
|
|
337
|
+
line-height: 1.7;
|
|
338
|
+
color: var(--text);
|
|
339
|
+
white-space: pre-wrap;
|
|
340
|
+
word-wrap: break-word;
|
|
341
|
+
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.detail-panel .md-content h1, .detail-panel .md-content h2, .detail-panel .md-content h3 {
|
|
345
|
+
color: var(--accent);
|
|
346
|
+
margin: 16px 0 8px;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.empty {
|
|
350
|
+
text-align: center;
|
|
351
|
+
color: var(--text-dim);
|
|
352
|
+
padding: 60px;
|
|
353
|
+
font-size: 15px;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
@media (max-width: 768px) {
|
|
357
|
+
.main { grid-template-columns: 1fr; }
|
|
358
|
+
.sidebar { display: flex; overflow-x: auto; border-right: none; border-bottom: 1px solid var(--border); padding: 0; }
|
|
359
|
+
.sidebar .cat-btn { border-left: none; border-bottom: 3px solid transparent; white-space: nowrap; }
|
|
360
|
+
.sidebar .cat-btn.active { border-left: none; border-bottom-color: var(--accent); }
|
|
361
|
+
.content { padding: 16px; }
|
|
362
|
+
}
|
|
363
|
+
</style>
|
|
364
|
+
</head>
|
|
365
|
+
<body>
|
|
366
|
+
|
|
367
|
+
<div class="header">
|
|
368
|
+
<h1><span class="logo">\u25c9 repomemory</span> <span style="color:var(--text-dim);font-weight:400;font-size:14px">dashboard</span></h1>
|
|
369
|
+
<div class="meta">${provider} \u00b7 ${model}</div>
|
|
370
|
+
</div>
|
|
371
|
+
|
|
372
|
+
<div class="search-bar">
|
|
373
|
+
<span class="icon">\ud83d\udd0d</span>
|
|
374
|
+
<input type="text" placeholder="Search context files..." id="searchInput" />
|
|
375
|
+
</div>
|
|
376
|
+
|
|
377
|
+
<div class="stats-row" id="statsRow"></div>
|
|
378
|
+
|
|
379
|
+
<div class="main">
|
|
380
|
+
<div class="sidebar" id="sidebar"></div>
|
|
381
|
+
<div class="content" id="content"></div>
|
|
382
|
+
</div>
|
|
383
|
+
|
|
384
|
+
<div class="detail-overlay" id="detailOverlay">
|
|
385
|
+
<div class="detail-panel" id="detailPanel">
|
|
386
|
+
<button class="close-btn" onclick="closeDetail()">\u00d7</button>
|
|
387
|
+
<h2 id="detailTitle"></h2>
|
|
388
|
+
<div class="card-meta" id="detailMeta" style="margin-bottom:16px"></div>
|
|
389
|
+
<div class="md-content" id="detailContent"></div>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
|
|
393
|
+
<script>
|
|
394
|
+
let allEntries = [];
|
|
395
|
+
let currentCategory = null;
|
|
396
|
+
|
|
397
|
+
async function init() {
|
|
398
|
+
const [entries, stats] = await Promise.all([
|
|
399
|
+
fetch('/api/entries').then(r => r.json()),
|
|
400
|
+
fetch('/api/stats').then(r => r.json()),
|
|
401
|
+
]);
|
|
402
|
+
allEntries = entries;
|
|
403
|
+
|
|
404
|
+
// Stats
|
|
405
|
+
const row = document.getElementById('statsRow');
|
|
406
|
+
row.innerHTML = \`
|
|
407
|
+
<div class="stat-card"><div class="value">\${stats.totalFiles}</div><div class="label">Files</div></div>
|
|
408
|
+
<div class="stat-card"><div class="value">\${(stats.totalSize / 1024).toFixed(1)}KB</div><div class="label">Total Size</div></div>
|
|
409
|
+
<div class="stat-card"><div class="value">\${Object.keys(stats.categories).length}</div><div class="label">Categories</div></div>
|
|
410
|
+
<div class="stat-card"><div class="value">\${stats.stalestFile ? timeAgo(stats.stalestFile.age) : '-'}</div><div class="label">Stalest Entry</div></div>
|
|
411
|
+
\`;
|
|
412
|
+
|
|
413
|
+
// Sidebar
|
|
414
|
+
renderSidebar(stats.categories);
|
|
415
|
+
renderEntries(allEntries);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function renderSidebar(categories) {
|
|
419
|
+
const sb = document.getElementById('sidebar');
|
|
420
|
+
let html = '<button class="cat-btn active" onclick="filterCategory(null, this)">All <span class="count">' + allEntries.length + '</span></button>';
|
|
421
|
+
for (const [cat, count] of Object.entries(categories)) {
|
|
422
|
+
html += \`<button class="cat-btn" onclick="filterCategory('\${cat}', this)">\${cat}/ <span class="count">\${count}</span></button>\`;
|
|
423
|
+
}
|
|
424
|
+
sb.innerHTML = html;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function filterCategory(cat, btn) {
|
|
428
|
+
currentCategory = cat;
|
|
429
|
+
document.querySelectorAll('.cat-btn').forEach(b => b.classList.remove('active'));
|
|
430
|
+
if (btn) btn.classList.add('active');
|
|
431
|
+
|
|
432
|
+
const q = document.getElementById('searchInput').value.toLowerCase();
|
|
433
|
+
const filtered = allEntries.filter(e => {
|
|
434
|
+
if (cat && e.category !== cat) return false;
|
|
435
|
+
if (q && !e.title.toLowerCase().includes(q) && !e.content.toLowerCase().includes(q) && !e.filename.toLowerCase().includes(q)) return false;
|
|
436
|
+
return true;
|
|
437
|
+
});
|
|
438
|
+
renderEntries(filtered);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function renderEntries(entries) {
|
|
442
|
+
const content = document.getElementById('content');
|
|
443
|
+
if (!entries.length) {
|
|
444
|
+
content.innerHTML = '<div class="empty">No entries found. Run <code>repomemory analyze</code> to generate context.</div>';
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
content.innerHTML = '<div class="entry-grid">' + entries.map((e, i) => \`
|
|
449
|
+
<div class="entry-card" onclick="showDetail(\${i})">
|
|
450
|
+
<div class="card-header">
|
|
451
|
+
<div class="card-title">\${escapeHtml(e.title)}</div>
|
|
452
|
+
<span class="card-category cat-\${e.category}">\${e.category}</span>
|
|
453
|
+
</div>
|
|
454
|
+
<div class="card-meta">
|
|
455
|
+
<span>\${e.filename}</span>
|
|
456
|
+
<span>\${(e.sizeBytes / 1024).toFixed(1)}KB</span>
|
|
457
|
+
<span>\${timeAgo(Date.now() - new Date(e.lastModified).getTime())}</span>
|
|
458
|
+
</div>
|
|
459
|
+
<div class="preview">\${escapeHtml(e.content.slice(0, 200))}</div>
|
|
460
|
+
</div>
|
|
461
|
+
\`).join('') + '</div>';
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function showDetail(index) {
|
|
465
|
+
const filtered = getFilteredEntries();
|
|
466
|
+
const e = filtered[index];
|
|
467
|
+
if (!e) return;
|
|
468
|
+
|
|
469
|
+
document.getElementById('detailTitle').textContent = e.category + '/' + e.filename;
|
|
470
|
+
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>\`;
|
|
471
|
+
document.getElementById('detailContent').textContent = e.content;
|
|
472
|
+
document.getElementById('detailOverlay').classList.add('visible');
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function closeDetail() {
|
|
476
|
+
document.getElementById('detailOverlay').classList.remove('visible');
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
function getFilteredEntries() {
|
|
480
|
+
const q = document.getElementById('searchInput').value.toLowerCase();
|
|
481
|
+
return allEntries.filter(e => {
|
|
482
|
+
if (currentCategory && e.category !== currentCategory) return false;
|
|
483
|
+
if (q && !e.title.toLowerCase().includes(q) && !e.content.toLowerCase().includes(q) && !e.filename.toLowerCase().includes(q)) return false;
|
|
484
|
+
return true;
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
document.getElementById('searchInput').addEventListener('input', () => {
|
|
489
|
+
filterCategory(currentCategory, document.querySelector('.cat-btn.active'));
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
document.getElementById('detailOverlay').addEventListener('click', (e) => {
|
|
493
|
+
if (e.target === e.currentTarget) closeDetail();
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
document.addEventListener('keydown', (e) => {
|
|
497
|
+
if (e.key === 'Escape') closeDetail();
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
function escapeHtml(s) {
|
|
501
|
+
return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function timeAgo(ms) {
|
|
505
|
+
const s = Math.floor(ms / 1000);
|
|
506
|
+
if (s < 60) return 'just now';
|
|
507
|
+
if (s < 3600) return Math.floor(s/60) + 'm ago';
|
|
508
|
+
if (s < 86400) return Math.floor(s/3600) + 'h ago';
|
|
509
|
+
const d = Math.floor(s / 86400);
|
|
510
|
+
if (d < 30) return d + 'd ago';
|
|
511
|
+
if (d < 365) return Math.floor(d/30) + 'mo ago';
|
|
512
|
+
return Math.floor(d/365) + 'y ago';
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
init();
|
|
516
|
+
</script>
|
|
517
|
+
</body>
|
|
518
|
+
</html>`;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,wBAAsB,WAAW,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,iBAqF7E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
import { existsSync, writeFileSync } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import { loadConfig } from "../lib/config.js";
|
|
4
|
+
import { loadConfig, DEFAULT_CONFIG } from "../lib/config.js";
|
|
5
5
|
import { ContextStore } from "../lib/context-store.js";
|
|
6
|
-
const DEFAULT_REPO_CONTEXT_CONFIG = {
|
|
7
|
-
provider: "anthropic",
|
|
8
|
-
model: "claude-sonnet-4-5-20250929",
|
|
9
|
-
ignorePatterns: [],
|
|
10
|
-
keyFilePatterns: [],
|
|
11
|
-
maxFilesForAnalysis: 80,
|
|
12
|
-
maxGitCommits: 100,
|
|
13
|
-
autoIndex: true,
|
|
14
|
-
contextDir: ".context",
|
|
15
|
-
};
|
|
16
6
|
export async function initCommand(options) {
|
|
17
7
|
const repoRoot = options.dir || process.cwd();
|
|
18
8
|
const config = loadConfig(repoRoot);
|
|
@@ -21,7 +11,7 @@ export async function initCommand(options) {
|
|
|
21
11
|
}
|
|
22
12
|
const store = new ContextStore(repoRoot, config);
|
|
23
13
|
if (store.exists()) {
|
|
24
|
-
console.log(chalk.yellow("
|
|
14
|
+
console.log(chalk.yellow("\u26a0 .context/ directory already exists."));
|
|
25
15
|
console.log(chalk.dim(" Run `repomemory analyze` to regenerate content."));
|
|
26
16
|
return;
|
|
27
17
|
}
|
|
@@ -30,41 +20,47 @@ export async function initCommand(options) {
|
|
|
30
20
|
// Write starter index
|
|
31
21
|
store.writeIndex(`# Project Context
|
|
32
22
|
|
|
33
|
-
> Auto-generated by [repomemory](https://github.com/
|
|
23
|
+
> Auto-generated by [repomemory](https://github.com/DanielGuru/repomemory). Run \`repomemory analyze\` to populate.
|
|
34
24
|
|
|
35
25
|
## Quick Orient
|
|
36
26
|
*Run \`repomemory analyze\` to generate project-specific orientation.*
|
|
37
27
|
|
|
38
28
|
## Context Files
|
|
39
|
-
- \`facts/\`
|
|
40
|
-
- \`decisions/\`
|
|
41
|
-
- \`regressions/\`
|
|
42
|
-
- \`sessions/\`
|
|
43
|
-
- \`changelog/\`
|
|
29
|
+
- \`facts/\` \u2014 Architecture, patterns, integrations
|
|
30
|
+
- \`decisions/\` \u2014 Why things are this way (prevents re-debating)
|
|
31
|
+
- \`regressions/\` \u2014 Known gotchas, things that broke before
|
|
32
|
+
- \`sessions/\` \u2014 Compressed session summaries
|
|
33
|
+
- \`changelog/\` \u2014 Recent changes by month
|
|
44
34
|
|
|
45
35
|
## For AI Agents
|
|
46
36
|
Search this directory for task-relevant context before starting work.
|
|
47
37
|
Write new learnings using the \`context_write\` MCP tool during your session.
|
|
48
38
|
`);
|
|
49
|
-
// Write config file
|
|
39
|
+
// Write config file from shared defaults (not a duplicate)
|
|
50
40
|
const configPath = join(repoRoot, ".repomemory.json");
|
|
51
41
|
if (!existsSync(configPath)) {
|
|
52
|
-
const configToWrite = {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
42
|
+
const configToWrite = {
|
|
43
|
+
provider: config.provider,
|
|
44
|
+
model: config.model,
|
|
45
|
+
contextDir: DEFAULT_CONFIG.contextDir,
|
|
46
|
+
maxFilesForAnalysis: DEFAULT_CONFIG.maxFilesForAnalysis,
|
|
47
|
+
maxGitCommits: DEFAULT_CONFIG.maxGitCommits,
|
|
48
|
+
autoIndex: DEFAULT_CONFIG.autoIndex,
|
|
49
|
+
ignorePatterns: [],
|
|
50
|
+
keyFilePatterns: [],
|
|
51
|
+
};
|
|
56
52
|
writeFileSync(configPath, JSON.stringify(configToWrite, null, 2) + "\n");
|
|
57
53
|
}
|
|
58
|
-
console.log(chalk.green("
|
|
54
|
+
console.log(chalk.green("\u2713 Initialized .context/ directory"));
|
|
59
55
|
console.log();
|
|
60
56
|
console.log(chalk.bold("Created:"));
|
|
61
|
-
console.log(` ${chalk.cyan(".context/index.md")}
|
|
62
|
-
console.log(` ${chalk.cyan(".context/facts/")}
|
|
63
|
-
console.log(` ${chalk.cyan(".context/decisions/")}
|
|
64
|
-
console.log(` ${chalk.cyan(".context/regressions/")}
|
|
65
|
-
console.log(` ${chalk.cyan(".context/sessions/")}
|
|
66
|
-
console.log(` ${chalk.cyan(".context/changelog/")}
|
|
67
|
-
console.log(` ${chalk.cyan(".repomemory.json")}
|
|
57
|
+
console.log(` ${chalk.cyan(".context/index.md")} \u2014 Quick orientation`);
|
|
58
|
+
console.log(` ${chalk.cyan(".context/facts/")} \u2014 Architecture & patterns`);
|
|
59
|
+
console.log(` ${chalk.cyan(".context/decisions/")} \u2014 Why things are this way`);
|
|
60
|
+
console.log(` ${chalk.cyan(".context/regressions/")} \u2014 Known gotchas`);
|
|
61
|
+
console.log(` ${chalk.cyan(".context/sessions/")} \u2014 Session summaries`);
|
|
62
|
+
console.log(` ${chalk.cyan(".context/changelog/")} \u2014 Monthly changelogs`);
|
|
63
|
+
console.log(` ${chalk.cyan(".repomemory.json")} \u2014 Configuration`);
|
|
68
64
|
console.log();
|
|
69
65
|
console.log(chalk.bold("Next steps:"));
|
|
70
66
|
console.log();
|
|
@@ -78,9 +74,12 @@ Write new learnings using the \`context_write\` MCP tool during your session.
|
|
|
78
74
|
console.log(chalk.dim(` repomemory analyze`));
|
|
79
75
|
console.log();
|
|
80
76
|
console.log(` 3. Add the MCP server to your AI tool:`);
|
|
81
|
-
console.log(chalk.dim(` repomemory setup claude
|
|
82
|
-
console.log(chalk.dim(` repomemory setup cursor
|
|
77
|
+
console.log(chalk.dim(` repomemory setup claude # Claude Code`));
|
|
78
|
+
console.log(chalk.dim(` repomemory setup cursor # Cursor`));
|
|
79
|
+
console.log(chalk.dim(` repomemory setup copilot # GitHub Copilot`));
|
|
80
|
+
console.log(chalk.dim(` repomemory setup windsurf # Windsurf`));
|
|
81
|
+
console.log(chalk.dim(` repomemory setup cline # Cline`));
|
|
83
82
|
console.log();
|
|
84
|
-
console.log(` 4. Commit .context/ to git
|
|
83
|
+
console.log(` 4. Commit .context/ to git \u2014 your team shares the knowledge.`);
|
|
85
84
|
}
|
|
86
85
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAW3D"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -5,9 +5,10 @@ export async function serveCommand(options) {
|
|
|
5
5
|
const repoRoot = options.dir || process.cwd();
|
|
6
6
|
const config = loadConfig(repoRoot);
|
|
7
7
|
// Only log to stderr so stdout is clean for MCP protocol
|
|
8
|
-
console.error(chalk.dim(`repomemory MCP server
|
|
8
|
+
console.error(chalk.dim(`repomemory MCP server v0.2.0`));
|
|
9
9
|
console.error(chalk.dim(` Root: ${repoRoot}`));
|
|
10
10
|
console.error(chalk.dim(` Context: ${config.contextDir}/`));
|
|
11
|
+
console.error(chalk.dim(` Tools: context_search, context_write, context_delete, context_list, context_read`));
|
|
11
12
|
await startMcpServer(repoRoot, config);
|
|
12
13
|
}
|
|
13
14
|
//# sourceMappingURL=serve.js.map
|