repomap-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/analyzer/imports-analyzer.d.ts +27 -0
  2. package/dist/analyzer/imports-analyzer.d.ts.map +1 -0
  3. package/dist/analyzer/imports-analyzer.js +74 -0
  4. package/dist/analyzer/imports-analyzer.js.map +1 -0
  5. package/dist/analyzer/tree-sitter-analyzer.d.ts +37 -0
  6. package/dist/analyzer/tree-sitter-analyzer.d.ts.map +1 -0
  7. package/dist/analyzer/tree-sitter-analyzer.js +531 -0
  8. package/dist/analyzer/tree-sitter-analyzer.js.map +1 -0
  9. package/dist/commands/init.d.ts +6 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +202 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/login.d.ts +9 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +106 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/mcp.d.ts +4 -0
  18. package/dist/commands/mcp.d.ts.map +1 -0
  19. package/dist/commands/mcp.js +511 -0
  20. package/dist/commands/mcp.js.map +1 -0
  21. package/dist/commands/snapshot.d.ts +8 -0
  22. package/dist/commands/snapshot.d.ts.map +1 -0
  23. package/dist/commands/snapshot.js +314 -0
  24. package/dist/commands/snapshot.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +108 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/watch.d.ts +5 -0
  30. package/dist/commands/watch.d.ts.map +1 -0
  31. package/dist/commands/watch.js +367 -0
  32. package/dist/commands/watch.js.map +1 -0
  33. package/dist/generator/claude-md.d.ts +19 -0
  34. package/dist/generator/claude-md.d.ts.map +1 -0
  35. package/dist/generator/claude-md.js +656 -0
  36. package/dist/generator/claude-md.js.map +1 -0
  37. package/dist/generator/map-json.d.ts +35 -0
  38. package/dist/generator/map-json.d.ts.map +1 -0
  39. package/dist/generator/map-json.js +130 -0
  40. package/dist/generator/map-json.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +91 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/scanner/file-scanner.d.ts +9 -0
  46. package/dist/scanner/file-scanner.d.ts.map +1 -0
  47. package/dist/scanner/file-scanner.js +76 -0
  48. package/dist/scanner/file-scanner.js.map +1 -0
  49. package/dist/scanner/stack-detector.d.ts +10 -0
  50. package/dist/scanner/stack-detector.d.ts.map +1 -0
  51. package/dist/scanner/stack-detector.js +153 -0
  52. package/dist/scanner/stack-detector.js.map +1 -0
  53. package/dist/utils/credentials.d.ts +11 -0
  54. package/dist/utils/credentials.d.ts.map +1 -0
  55. package/dist/utils/credentials.js +34 -0
  56. package/dist/utils/credentials.js.map +1 -0
  57. package/dist/utils/health-score.d.ts +10 -0
  58. package/dist/utils/health-score.d.ts.map +1 -0
  59. package/dist/utils/health-score.js +44 -0
  60. package/dist/utils/health-score.js.map +1 -0
  61. package/dist/utils/ui.d.ts +14 -0
  62. package/dist/utils/ui.d.ts.map +1 -0
  63. package/dist/utils/ui.js +45 -0
  64. package/dist/utils/ui.js.map +1 -0
  65. package/package.json +54 -0
@@ -0,0 +1,367 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { loadCredentials } from '../utils/credentials.js';
4
+ import { c } from '../utils/ui.js';
5
+ import { scanFiles } from '../scanner/file-scanner.js';
6
+ import { detectStack } from '../scanner/stack-detector.js';
7
+ import { initAnalyzer, analyzeFiles } from '../analyzer/imports-analyzer.js';
8
+ import { generateMapJson, writeMapJson, detectModules } from '../generator/map-json.js';
9
+ import { generateClaudeMd, writeClaudeMd } from '../generator/claude-md.js';
10
+ import { calculateHealthScore } from '../utils/health-score.js';
11
+ const API_BASE = 'https://repomap.app/api/v1';
12
+ // Heat decay factor: every hour, heat is multiplied by this value
13
+ const HEAT_DECAY_FACTOR = 0.95;
14
+ const HEAT_DECAY_INTERVAL_MS = 60 * 60 * 1000; // 1 hour
15
+ // ─── Terminal output helpers ──────────────────────────────────────────────────
16
+ function logChange(type, filePath, extra) {
17
+ const ts = new Date().toLocaleTimeString('en-US', { hour12: false });
18
+ const iconMap = {
19
+ add: c.emerald('+'),
20
+ change: c.cyan('~'),
21
+ unlink: c.red('-'),
22
+ info: c.dim('i'),
23
+ warn: c.amber('!'),
24
+ regen: c.emerald('*'),
25
+ };
26
+ const icon = iconMap[type] ?? c.dim('?');
27
+ const label = extra ? ' ' + c.dim(extra) : '';
28
+ const fileStr = type === 'warn' ? c.amber(filePath) : type === 'unlink' ? c.dim(filePath) : filePath;
29
+ console.log(` ${c.dim('[' + ts + ']')} ${icon} ${fileStr}${label}`);
30
+ }
31
+ async function checkProPlan(accessToken) {
32
+ try {
33
+ const res = await fetch(`${API_BASE}/user/plan`, {
34
+ headers: {
35
+ Authorization: `Bearer ${accessToken}`,
36
+ 'Content-Type': 'application/json',
37
+ },
38
+ signal: AbortSignal.timeout(8000),
39
+ });
40
+ if (!res.ok)
41
+ return false;
42
+ const data = (await res.json());
43
+ return data.plan === 'pro' || data.plan === 'team';
44
+ }
45
+ catch {
46
+ // If the API is unreachable, allow the command to proceed (offline mode).
47
+ return true;
48
+ }
49
+ }
50
+ // ─── Task 2: Heat tracking & decay ───────────────────────────────────────────
51
+ function loadMapJson(rootDir) {
52
+ const mapPath = path.join(rootDir, '.repomap', 'map.json');
53
+ try {
54
+ const raw = fs.readFileSync(mapPath, 'utf-8');
55
+ return JSON.parse(raw);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ /**
62
+ * Increment heat for a file in map.json (capped at 100).
63
+ * Also stores a `heat_updated_at` ISO timestamp per file.
64
+ */
65
+ function incrementHeat(map, filePath, rootDir) {
66
+ const rel = path.relative(rootDir, filePath).replace(/\\/g, '/');
67
+ const entry = map.files.find((f) => f.path === rel);
68
+ if (entry) {
69
+ entry.heat = Math.min(100, (entry.heat ?? 0) + 5);
70
+ entry.heat_updated_at = new Date().toISOString();
71
+ }
72
+ }
73
+ /**
74
+ * Apply time-based decay to all file heat values.
75
+ * Files that haven't been touched recently lose heat gradually.
76
+ */
77
+ function applyHeatDecay(map) {
78
+ const now = Date.now();
79
+ for (const entry of map.files) {
80
+ const meta = entry;
81
+ if (!meta.heat_updated_at)
82
+ continue;
83
+ const lastUpdate = new Date(meta.heat_updated_at).getTime();
84
+ const hoursPassed = (now - lastUpdate) / HEAT_DECAY_INTERVAL_MS;
85
+ if (hoursPassed >= 1) {
86
+ entry.heat = Math.max(0, Math.round(entry.heat * Math.pow(HEAT_DECAY_FACTOR, hoursPassed)));
87
+ meta.heat_updated_at = new Date().toISOString();
88
+ }
89
+ }
90
+ }
91
+ function readClaudeMdTrackedFiles(rootDir) {
92
+ const claudeMdPath = path.join(rootDir, 'CLAUDE.md');
93
+ try {
94
+ const content = fs.readFileSync(claudeMdPath, 'utf-8');
95
+ const tracked = new Set();
96
+ // Extract backtick-quoted paths that look like file paths
97
+ const matches = content.match(/`([^`]+\.[a-zA-Z0-9]+)`/g) ?? [];
98
+ for (const m of matches) {
99
+ tracked.add(m.replace(/`/g, ''));
100
+ }
101
+ return tracked;
102
+ }
103
+ catch {
104
+ return new Set();
105
+ }
106
+ }
107
+ function hashPackageJson(rootDir) {
108
+ const pkgPath = path.join(rootDir, 'package.json');
109
+ try {
110
+ const raw = fs.readFileSync(pkgPath, 'utf-8');
111
+ // Simple hash: stringify of dependencies keys sorted
112
+ const pkg = JSON.parse(raw);
113
+ const deps = Object.keys({ ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) }).sort().join(',');
114
+ return deps;
115
+ }
116
+ catch {
117
+ return null;
118
+ }
119
+ }
120
+ async function regenerateClaudeMdAndMap(rootDir) {
121
+ const scannedFiles = scanFiles(rootDir, false);
122
+ const analyzedFiles = analyzeFiles(scannedFiles);
123
+ const stack = detectStack(rootDir, scannedFiles);
124
+ const modules = detectModules(analyzedFiles, stack);
125
+ const healthScore = calculateHealthScore(analyzedFiles, scannedFiles.length, modules);
126
+ const projectName = stack.projectName ?? path.basename(rootDir);
127
+ const claudeMdContent = generateClaudeMd({ rootDir, projectName, stack, files: analyzedFiles, healthScore });
128
+ writeClaudeMd(rootDir, claudeMdContent);
129
+ const repoMap = generateMapJson(analyzedFiles, stack, healthScore);
130
+ writeMapJson(rootDir, repoMap);
131
+ return healthScore;
132
+ }
133
+ function shouldRegenerateClaudeMd(session, event, filePath, rootDir) {
134
+ const rel = path.relative(rootDir, filePath).replace(/\\/g, '/');
135
+ // 1. Too many new files
136
+ if (session.newFilesCount >= 10) {
137
+ return { should: true, reason: `${session.newFilesCount} new files added` };
138
+ }
139
+ // 2. Deleted a file tracked in CLAUDE.md
140
+ if (event === 'unlink' && session.claudeMdTrackedFiles.has(rel)) {
141
+ return { should: true, reason: `tracked file deleted: ${rel}` };
142
+ }
143
+ // 3. package.json changed → possible new framework
144
+ if (event === 'change' && (rel === 'package.json' || rel.endsWith('/package.json'))) {
145
+ const newHash = hashPackageJson(rootDir);
146
+ if (newHash !== session.initialPackageJsonHash) {
147
+ return { should: true, reason: 'new dependency detected in package.json' };
148
+ }
149
+ }
150
+ return { should: false, reason: '' };
151
+ }
152
+ // ─── Task 4: Dashboard sync & usage events ───────────────────────────────────
153
+ async function syncWithDashboard(accessToken, map, rootDir) {
154
+ try {
155
+ await fetch(`${API_BASE}/repos/sync`, {
156
+ method: 'POST',
157
+ headers: {
158
+ Authorization: `Bearer ${accessToken}`,
159
+ 'Content-Type': 'application/json',
160
+ },
161
+ body: JSON.stringify({ root_dir: path.basename(rootDir), map }),
162
+ signal: AbortSignal.timeout(10000),
163
+ });
164
+ }
165
+ catch {
166
+ // Silently ignore sync errors — offline is fine
167
+ }
168
+ }
169
+ async function logUsageEvent(accessToken, eventType, rootDir, meta) {
170
+ try {
171
+ await fetch(`${API_BASE}/usage-events`, {
172
+ method: 'POST',
173
+ headers: {
174
+ Authorization: `Bearer ${accessToken}`,
175
+ 'Content-Type': 'application/json',
176
+ },
177
+ body: JSON.stringify({ event_type: eventType, project: path.basename(rootDir), ...meta }),
178
+ signal: AbortSignal.timeout(8000),
179
+ });
180
+ }
181
+ catch {
182
+ // Silently ignore
183
+ }
184
+ }
185
+ // ─── Main watch command ───────────────────────────────────────────────────────
186
+ export async function runWatch(options) {
187
+ const rootDir = path.resolve(options.path);
188
+ // Load credentials
189
+ const creds = loadCredentials();
190
+ // If not authenticated, show login message and exit
191
+ if (!creds) {
192
+ console.error('\n ' + c.red('✗') + ' repomap watch requiere el plan Pro.');
193
+ console.error(' ' + c.dim(' Inicia sesión primero: ') + c.cyan('repomap login'));
194
+ console.error(' ' + c.dim(' Activa Pro en https://repomap.app/pricing → desde $19/mes.\n'));
195
+ process.exit(1);
196
+ }
197
+ // Verify Pro plan
198
+ console.log('\n ' + c.dim('Verificando plan...'));
199
+ const accessToken = creds.access_token;
200
+ const isPro = await checkProPlan(accessToken);
201
+ if (!isPro) {
202
+ console.error('\n ' + c.red('✗') + ' repomap watch requiere el plan Pro.');
203
+ console.error(' ' + c.dim(' Activa Pro en https://repomap.app/pricing → desde $19/mes.\n'));
204
+ process.exit(1);
205
+ }
206
+ // Ensure .repomap/map.json exists (generate if missing)
207
+ let map = loadMapJson(rootDir);
208
+ if (!map) {
209
+ console.log(' ' + c.dim('Generando mapa inicial...'));
210
+ await initAnalyzer();
211
+ const healthScore = await regenerateClaudeMdAndMap(rootDir);
212
+ map = loadMapJson(rootDir);
213
+ logChange('regen', 'CLAUDE.md', `(health: ${healthScore}/100)`);
214
+ }
215
+ // Session state
216
+ const session = {
217
+ newFilesCount: 0,
218
+ claudeMdTrackedFiles: readClaudeMdTrackedFiles(rootDir),
219
+ initialHealthScore: map.health_score,
220
+ initialPackageJsonHash: hashPackageJson(rootDir),
221
+ };
222
+ // Task 9: Log usage_event watch_session_start
223
+ void logUsageEvent(accessToken, 'watch_session_start', rootDir, {
224
+ health_score: map.health_score,
225
+ file_count: map.files.length,
226
+ });
227
+ console.log('\n ' + c.emerald('●') + ' ' + c.white('Watching') + ' ' + c.dim(rootDir));
228
+ console.log(' ' + c.dim('Press Ctrl+C to stop.\n'));
229
+ // Debounce map writes to avoid hammering disk
230
+ let writeTimer = null;
231
+ let pendingSync = false;
232
+ function scheduleMapWrite() {
233
+ if (writeTimer)
234
+ clearTimeout(writeTimer);
235
+ writeTimer = setTimeout(() => {
236
+ if (!map)
237
+ return;
238
+ applyHeatDecay(map);
239
+ map.analyzed_at = new Date().toISOString();
240
+ writeMapJson(rootDir, map);
241
+ pendingSync = true;
242
+ }, 500);
243
+ }
244
+ // Debounced dashboard sync (every 30s max)
245
+ let lastSync = 0;
246
+ function maybeSyncDashboard() {
247
+ if (!pendingSync)
248
+ return;
249
+ const now = Date.now();
250
+ if (now - lastSync < 30000)
251
+ return;
252
+ lastSync = now;
253
+ pendingSync = false;
254
+ if (!map)
255
+ return;
256
+ void syncWithDashboard(accessToken, map, rootDir);
257
+ }
258
+ const syncInterval = setInterval(maybeSyncDashboard, 30000);
259
+ // Heat decay interval (every hour)
260
+ const decayInterval = setInterval(() => {
261
+ if (!map)
262
+ return;
263
+ applyHeatDecay(map);
264
+ scheduleMapWrite();
265
+ }, HEAT_DECAY_INTERVAL_MS);
266
+ // ── File watcher (Node.js built-in, recursive) ──
267
+ const watcher = fs.watch(rootDir, { recursive: true }, (eventType, filename) => {
268
+ if (!filename)
269
+ return;
270
+ // Ignore .repomap/ internals, node_modules, .git
271
+ if (filename.startsWith('.repomap') ||
272
+ filename.startsWith('node_modules') ||
273
+ filename.startsWith('.git')) {
274
+ return;
275
+ }
276
+ const absPath = path.join(rootDir, filename);
277
+ const rel = filename.replace(/\\/g, '/');
278
+ let changeType;
279
+ if (eventType === 'rename') {
280
+ changeType = fs.existsSync(absPath) ? 'add' : 'unlink';
281
+ }
282
+ else {
283
+ changeType = 'change';
284
+ }
285
+ // Task 7: Terminal log
286
+ logChange(changeType, rel);
287
+ // Update map in memory
288
+ if (!map)
289
+ return;
290
+ if (changeType === 'add') {
291
+ session.newFilesCount++;
292
+ // Add file to map if not present with heat=1
293
+ const existingEntry = map.files.find((f) => f.path === rel);
294
+ if (!existingEntry) {
295
+ const ext = path.extname(filename).slice(1) || 'unknown';
296
+ map.files.push({
297
+ path: rel,
298
+ type: ext,
299
+ language: 'unknown',
300
+ imports: [],
301
+ exports: [],
302
+ complexity: 1,
303
+ lines: 0,
304
+ heat: 1,
305
+ ...({ heat_updated_at: new Date().toISOString() }),
306
+ });
307
+ }
308
+ }
309
+ else if (changeType === 'change') {
310
+ // Task 2: Increment heat
311
+ incrementHeat(map, absPath, rootDir);
312
+ }
313
+ else if (changeType === 'unlink') {
314
+ map.files = map.files.filter((f) => f.path !== rel);
315
+ }
316
+ scheduleMapWrite();
317
+ // Task 3: Check if structural regeneration is needed
318
+ const { should, reason } = shouldRegenerateClaudeMd(session, changeType, absPath, rootDir);
319
+ if (should) {
320
+ logChange('regen', 'CLAUDE.md', `(reason: ${reason})`);
321
+ initAnalyzer()
322
+ .then(() => regenerateClaudeMdAndMap(rootDir))
323
+ .then((newHealthScore) => {
324
+ if (!map)
325
+ return;
326
+ const drop = session.initialHealthScore - newHealthScore;
327
+ if (drop > 20) {
328
+ logChange('warn', `Health score dropped ${drop} pts → ${newHealthScore}/100`);
329
+ }
330
+ // Refresh map after regen
331
+ map = loadMapJson(rootDir) ?? map;
332
+ session.newFilesCount = 0;
333
+ session.claudeMdTrackedFiles = readClaudeMdTrackedFiles(rootDir);
334
+ session.initialHealthScore = newHealthScore;
335
+ })
336
+ .catch(() => {
337
+ // Ignore regen errors silently
338
+ });
339
+ }
340
+ });
341
+ // ── Graceful shutdown ──
342
+ const shutdown = () => {
343
+ console.log('\n\n ' + c.dim('Stopping watcher...'));
344
+ watcher.close();
345
+ clearInterval(syncInterval);
346
+ clearInterval(decayInterval);
347
+ if (writeTimer)
348
+ clearTimeout(writeTimer);
349
+ // Final map write
350
+ if (map) {
351
+ applyHeatDecay(map);
352
+ map.analyzed_at = new Date().toISOString();
353
+ writeMapJson(rootDir, map);
354
+ void syncWithDashboard(accessToken, map, rootDir);
355
+ }
356
+ // Task 9: Log usage_event watch_session_end
357
+ void logUsageEvent(accessToken, 'watch_session_end', rootDir, {
358
+ health_score: map?.health_score ?? 0,
359
+ files_changed: session.newFilesCount,
360
+ });
361
+ console.log(' ' + c.emerald('✓') + ' Done.\n');
362
+ process.exit(0);
363
+ };
364
+ process.on('SIGINT', shutdown);
365
+ process.on('SIGTERM', shutdown);
366
+ }
367
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { StackInfo } from '../scanner/stack-detector.js';
2
+ import type { FileAnalysis } from '../analyzer/imports-analyzer.js';
3
+ interface ClaudeMdOptions {
4
+ rootDir: string;
5
+ projectName: string;
6
+ stack: StackInfo;
7
+ files: FileAnalysis[];
8
+ healthScore: number;
9
+ }
10
+ export declare function generateClaudeMd(opts: ClaudeMdOptions): {
11
+ main: string;
12
+ overflow: Record<string, string>;
13
+ };
14
+ export declare function writeClaudeMd(rootDir: string, content: {
15
+ main: string;
16
+ overflow: Record<string, string>;
17
+ }): void;
18
+ export {};
19
+ //# sourceMappingURL=claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/generator/claude-md.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AA6bD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CA4OA;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC1D,IAAI,CAUN"}