coderadar 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.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import '../dist/index.js';
@@ -0,0 +1,12 @@
1
+ import { type UserConfig, type DashboardData } from '@coderadar/core';
2
+ export interface CollectorOptions {
3
+ noCache?: boolean;
4
+ cacheFile?: string;
5
+ noCosts?: boolean;
6
+ }
7
+ /**
8
+ * Collect all dashboard data using @coderadar/core modules.
9
+ * This orchestrates the full data pipeline: scan -> parse -> analyze -> output.
10
+ */
11
+ export declare function collectDashboardData(config: UserConfig, options?: CollectorOptions): DashboardData;
12
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,aAAa,EAmBnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,gBAAqB,GAC7B,aAAa,CAkRf"}
@@ -0,0 +1,253 @@
1
+ import os from 'node:os';
2
+ import { scanProjects, scanClaudeSessions, filterNonTechnical, getRecentHubSessions, buildSearchIndex, parseGitInfo, detectStack, detectDocumentation, buildTimeline, parseCosts, calculateHealthScore, calculateAverageHealth, filterStaleProjects, sortProjects, analyzeInsights, } from '@coderadar/core';
3
+ /**
4
+ * Collect all dashboard data using @coderadar/core modules.
5
+ * This orchestrates the full data pipeline: scan -> parse -> analyze -> output.
6
+ */
7
+ export function collectDashboardData(config, options = {}) {
8
+ // 1. Scan projects
9
+ const scanResult = scanProjects(config, {
10
+ noCache: options.noCache,
11
+ cacheFile: options.cacheFile,
12
+ });
13
+ // 2. Scan Claude sessions
14
+ const sessionScan = scanClaudeSessions(config.claudeDir);
15
+ // 3. Build project list with git info, docs, stack, health
16
+ const weekAgo = new Date();
17
+ weekAgo.setDate(weekAgo.getDate() - 7);
18
+ let totalCommitsWeek = 0;
19
+ let projects = Array.from(scanResult.projects.entries()).map(([projectPath, name]) => {
20
+ const pathId = projectPath.replace(/[^a-zA-Z0-9]/g, '_');
21
+ const gitInfo = parseGitInfo(projectPath);
22
+ const stack = detectStack(projectPath);
23
+ const docs = detectDocumentation(projectPath);
24
+ const health = calculateHealthScore({
25
+ hasClaudeMd: docs.hasClaudeMd,
26
+ hasProgressMd: docs.hasProgressMd,
27
+ status: gitInfo.status,
28
+ uncommitted: gitInfo.uncommitted,
29
+ githubUrl: gitInfo.githubUrl,
30
+ });
31
+ totalCommitsWeek += gitInfo.commitsWeek;
32
+ // Claude session info
33
+ let claudeLastSession = '';
34
+ let claudeSessionDays = 9999;
35
+ const sessionDate = scanResult.claudeActiveProjects.get(projectPath);
36
+ if (sessionDate) {
37
+ claudeLastSession = sessionDate;
38
+ try {
39
+ claudeSessionDays = Math.floor((Date.now() - new Date(sessionDate).getTime()) / (1000 * 60 * 60 * 24));
40
+ }
41
+ catch {
42
+ // ignore
43
+ }
44
+ }
45
+ // Associate sessions with project
46
+ const projSessions = filterNonTechnical(sessionScan.allSessions.filter((s) => s.projectPath === projectPath)).sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime());
47
+ const latest = projSessions[0];
48
+ let lastSessionAge = '';
49
+ if (latest?.date) {
50
+ try {
51
+ const sd = new Date(latest.date);
52
+ const ageDays = (Date.now() - sd.getTime()) / (1000 * 60 * 60 * 24);
53
+ if (ageDays < 1)
54
+ lastSessionAge = 'today';
55
+ else if (ageDays < 2)
56
+ lastSessionAge = 'yesterday';
57
+ else if (ageDays < 7)
58
+ lastSessionAge = `${Math.floor(ageDays)}d`;
59
+ else
60
+ lastSessionAge = `${Math.floor(ageDays / 7)}w`;
61
+ }
62
+ catch {
63
+ // ignore
64
+ }
65
+ }
66
+ const launchCmd = `cd "${projectPath}" && claude --dangerously-skip-permissions`;
67
+ return {
68
+ name,
69
+ path: projectPath,
70
+ pathId,
71
+ stack,
72
+ branch: gitInfo.branch,
73
+ lastCommit: gitInfo.lastCommit,
74
+ lastCommitDate: gitInfo.lastCommitDate,
75
+ lastCommitAge: gitInfo.lastCommitAge,
76
+ uncommitted: gitInfo.uncommitted,
77
+ hasClaudeMd: docs.hasClaudeMd,
78
+ hasProgressMd: docs.hasProgressMd,
79
+ claudeMdLines: docs.claudeMdLines,
80
+ nextTask: docs.nextTask,
81
+ status: gitInfo.status,
82
+ githubUrl: gitInfo.githubUrl,
83
+ launchCmd,
84
+ prCount: gitInfo.prCount,
85
+ issueCount: 0,
86
+ commitsWeek: gitInfo.commitsWeek,
87
+ healthScore: health.total,
88
+ category: 'Freelance',
89
+ claudeLastSession,
90
+ claudeSessionDays,
91
+ lastSessionId: latest?.sessionId || '',
92
+ lastSessionDate: latest?.date || '',
93
+ lastSessionAge,
94
+ sessionHistory: projSessions.slice(0, 5).map((s) => ({
95
+ id: s.sessionId,
96
+ title: s.title,
97
+ date: s.date,
98
+ hasSummary: s.hasSummary,
99
+ status: s.status,
100
+ })),
101
+ };
102
+ });
103
+ // 4. Filter stale projects, sort
104
+ projects = sortProjects(filterStaleProjects(projects));
105
+ // 5. Global last session
106
+ const projectPaths = new Set(projects.map((p) => p.path));
107
+ const projectSessions = filterNonTechnical(sessionScan.allSessions.filter((s) => projectPaths.has(s.projectPath)));
108
+ const globalLast = projectSessions.sort((a, b) => new Date(b.modified).getTime() - new Date(a.modified).getTime())[0];
109
+ let lastSession = null;
110
+ if (globalLast) {
111
+ const proj = projects.find((p) => p.path === globalLast.projectPath);
112
+ if (proj) {
113
+ lastSession = {
114
+ projectPath: proj.path,
115
+ sessionId: globalLast.sessionId,
116
+ title: globalLast.title,
117
+ date: globalLast.date,
118
+ modified: globalLast.modified,
119
+ hasSummary: globalLast.hasSummary,
120
+ status: globalLast.status,
121
+ };
122
+ }
123
+ }
124
+ // 6. Recent hub sessions (System32 on Windows, or root on Unix)
125
+ const hubDirName = os.platform() === 'win32' ? 'C--Windows-System32' : '';
126
+ const recentSessions = hubDirName
127
+ ? getRecentHubSessions(config.claudeDir, hubDirName)
128
+ : [];
129
+ // 7. Search index
130
+ const searchIndex = buildSearchIndex(config.claudeDir, sessionScan);
131
+ // 8. Timeline
132
+ const timelineResult = buildTimeline(config.claudeDir, 60);
133
+ // 9. Chart data
134
+ const chartProjects = [...timelineResult.sessionsByProject.entries()]
135
+ .sort((a, b) => b[1] - a[1])
136
+ .slice(0, 5)
137
+ .map(([name, count]) => ({
138
+ name,
139
+ count,
140
+ color: timelineResult.projectColors.get(name) || '#8b5cf6',
141
+ }));
142
+ const chartProjectsTime = [...timelineResult.timeByProject.entries()]
143
+ .sort((a, b) => b[1].minutes - a[1].minutes)
144
+ .slice(0, 5)
145
+ .map(([name, data]) => ({
146
+ name,
147
+ hours: Math.round((data.minutes / 60) * 10) / 10,
148
+ minutes: Math.round(data.minutes),
149
+ sessions: data.count,
150
+ color: data.color,
151
+ }));
152
+ // Weekly activity (last 4 weeks)
153
+ const weeklyLabels = [];
154
+ const weeklyValues = [];
155
+ const weeklyHours = [];
156
+ const weeklyData = new Map();
157
+ for (let i = 0; i < 4; i++) {
158
+ const weekStart = new Date();
159
+ weekStart.setDate(weekStart.getDate() - 7 * (i + 1) + 1);
160
+ const label = `${String(weekStart.getDate()).padStart(2, '0')}/${String(weekStart.getMonth() + 1).padStart(2, '0')}`;
161
+ weeklyData.set(label, { count: 0, minutes: 0 });
162
+ }
163
+ for (const t of timelineResult.timeline) {
164
+ try {
165
+ const d = new Date(t.date);
166
+ const daysAgo = Math.floor((Date.now() - d.getTime()) / (1000 * 60 * 60 * 24));
167
+ const weekIdx = Math.floor(daysAgo / 7);
168
+ if (weekIdx >= 0 && weekIdx < 4) {
169
+ const weekStart = new Date();
170
+ weekStart.setDate(weekStart.getDate() - 7 * (weekIdx + 1) + 1);
171
+ const label = `${String(weekStart.getDate()).padStart(2, '0')}/${String(weekStart.getMonth() + 1).padStart(2, '0')}`;
172
+ const existing = weeklyData.get(label);
173
+ if (existing) {
174
+ existing.count++;
175
+ existing.minutes += t.stats.duration;
176
+ }
177
+ }
178
+ }
179
+ catch {
180
+ // skip
181
+ }
182
+ }
183
+ // Sort labels chronologically
184
+ const sortedLabels = [...weeklyData.keys()].sort((a, b) => {
185
+ const [da, ma] = a.split('/').map(Number);
186
+ const [db, mb] = b.split('/').map(Number);
187
+ if (ma !== mb)
188
+ return ma - mb;
189
+ return da - db;
190
+ });
191
+ for (const label of sortedLabels) {
192
+ weeklyLabels.push(label);
193
+ const data = weeklyData.get(label);
194
+ weeklyValues.push(data.count);
195
+ weeklyHours.push(Math.round((data.minutes / 60) * 10) / 10);
196
+ }
197
+ // 10. Insights
198
+ const insights = analyzeInsights(config.claudeDir);
199
+ const tagDistribution = insights.topTags.slice(0, 6);
200
+ // 11. Stats
201
+ const avgHealth = calculateAverageHealth(projects);
202
+ const stackGroups = new Map();
203
+ for (const p of projects) {
204
+ if (p.stack) {
205
+ stackGroups.set(p.stack, (stackGroups.get(p.stack) || 0) + 1);
206
+ }
207
+ }
208
+ const stacks = [...stackGroups.entries()]
209
+ .sort((a, b) => b[1] - a[1])
210
+ .slice(0, 5)
211
+ .map(([name, count]) => ({ name, count }));
212
+ // 12. Costs (optional, can be slow)
213
+ const costData = options.noCosts ? { daily: [], totals: { totalCost: 0, inputTokens: 0, outputTokens: 0, cacheCreationTokens: 0, cacheReadTokens: 0, totalTokens: 0, days: 0 }, models: {} } : parseCosts();
214
+ // 13. Timestamp
215
+ const now = new Date();
216
+ const timestamp = `${String(now.getDate()).padStart(2, '0')}/${String(now.getMonth() + 1).padStart(2, '0')}/${now.getFullYear()} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`;
217
+ return {
218
+ projects,
219
+ lastSession,
220
+ recentSessions,
221
+ insights,
222
+ searchIndex,
223
+ timeline: timelineResult.timeline,
224
+ chartProjects,
225
+ chartProjectsTime,
226
+ weeklyLabels,
227
+ weeklyValues,
228
+ weeklyHours,
229
+ tagDistribution,
230
+ timestamp,
231
+ pcName: os.hostname(),
232
+ totalProjects: projects.length,
233
+ activeCount: projects.filter((p) => p.status === 'active').length,
234
+ undocCount: projects.filter((p) => !p.hasClaudeMd).length,
235
+ dirtyCount: projects.filter((p) => p.uncommitted > 0).length,
236
+ totalCommitsWeek,
237
+ avgHealth,
238
+ stacks,
239
+ unsyncedCount: 0,
240
+ plugins: [],
241
+ pluginCounts: { total: 0, active: 0, mcp: 0, workflow: 0, skill: 0, command: 0, agent: 0 },
242
+ marketplaces: {},
243
+ costDaily: costData.daily,
244
+ costTotals: costData.totals,
245
+ costModels: costData.models,
246
+ costHourly: [],
247
+ lastModel: '',
248
+ diskSummary: { driveTotal: 0, driveFree: 0, driveUsed: 0, claudeTotal: 0, claudeDirs: [], projectsTotal: 0 },
249
+ diskProjects: [],
250
+ diskDevProjects: [],
251
+ };
252
+ }
253
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function configGetCommand(key?: string): void;
2
+ export declare function configSetCommand(key: string, value: string): void;
3
+ export declare function configPathCommand(): void;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAsBnD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAwCjE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,64 @@
1
+ import { loadConfig, saveConfig, getConfigDir } from '@coderadar/core';
2
+ export function configGetCommand(key) {
3
+ const config = loadConfig();
4
+ if (!key) {
5
+ // Print all config
6
+ console.log(JSON.stringify(config, null, 2));
7
+ return;
8
+ }
9
+ if (!(key in config)) {
10
+ console.error(`Unknown config key: ${key}`);
11
+ console.error(`Valid keys: ${Object.keys(config).join(', ')}`);
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ const value = config[key];
16
+ if (typeof value === 'object') {
17
+ console.log(JSON.stringify(value, null, 2));
18
+ }
19
+ else {
20
+ console.log(String(value));
21
+ }
22
+ }
23
+ export function configSetCommand(key, value) {
24
+ const config = loadConfig();
25
+ if (!(key in config)) {
26
+ console.error(`Unknown config key: ${key}`);
27
+ console.error(`Valid keys: ${Object.keys(config).join(', ')}`);
28
+ process.exitCode = 1;
29
+ return;
30
+ }
31
+ // Type-aware parsing
32
+ switch (key) {
33
+ case 'locale':
34
+ if (value !== 'en' && value !== 'fr') {
35
+ console.error('Locale must be "en" or "fr"');
36
+ process.exitCode = 1;
37
+ return;
38
+ }
39
+ config.locale = value;
40
+ break;
41
+ case 'cacheTTLHours':
42
+ case 'monthlyPlan':
43
+ case 'version':
44
+ config[key] = parseInt(value) || 0;
45
+ break;
46
+ case 'currency':
47
+ config.currency = value.toUpperCase();
48
+ break;
49
+ case 'claudeDir':
50
+ config.claudeDir = value;
51
+ break;
52
+ default:
53
+ console.error(`Cannot set "${key}" via CLI. Edit config.json directly.`);
54
+ console.error(`Config file: ${getConfigDir()}/config.json`);
55
+ process.exitCode = 1;
56
+ return;
57
+ }
58
+ saveConfig(config);
59
+ console.log(`${key} = ${JSON.stringify(config[key])}`);
60
+ }
61
+ export function configPathCommand() {
62
+ console.log(`${getConfigDir()}/config.json`);
63
+ }
64
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface GenerateOptions {
2
+ output?: string;
3
+ noOpen?: boolean;
4
+ noCache?: boolean;
5
+ noCosts?: boolean;
6
+ }
7
+ export declare function generateCommand(options: GenerateOptions): Promise<void>;
8
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C7E"}
@@ -0,0 +1,44 @@
1
+ import path from 'node:path';
2
+ import { loadConfig } from '@coderadar/core';
3
+ import { collectDashboardData } from '../collector.js';
4
+ import { generateDashboard } from '../output/html-generator.js';
5
+ export async function generateCommand(options) {
6
+ const ora = (await import('ora')).default;
7
+ const spinner = ora('Loading configuration...').start();
8
+ try {
9
+ const config = loadConfig();
10
+ // Determine output path
11
+ const outputPath = options.output
12
+ ? path.resolve(options.output)
13
+ : path.resolve('index.html');
14
+ // Cache file path (same directory as output)
15
+ const cacheFile = path.join(path.dirname(outputPath), 'cache.json');
16
+ // Collect data
17
+ spinner.text = 'Scanning projects...';
18
+ const data = collectDashboardData(config, {
19
+ noCache: options.noCache,
20
+ cacheFile,
21
+ noCosts: options.noCosts,
22
+ });
23
+ spinner.text = `Generating dashboard (${data.totalProjects} projects)...`;
24
+ generateDashboard(data, outputPath);
25
+ spinner.succeed(`Dashboard generated: ${outputPath}\n` +
26
+ ` ${data.totalProjects} projects, ${data.activeCount} active, ` +
27
+ `health ${data.avgHealth}%, ${data.totalCommitsWeek} commits/7d`);
28
+ // Open in browser unless --no-open
29
+ if (!options.noOpen) {
30
+ try {
31
+ const open = (await import('open')).default;
32
+ await open(outputPath);
33
+ }
34
+ catch {
35
+ // non-critical
36
+ }
37
+ }
38
+ }
39
+ catch (error) {
40
+ spinner.fail(`Generation failed: ${error instanceof Error ? error.message : error}`);
41
+ process.exitCode = 1;
42
+ }
43
+ }
44
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAShE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAE5B,wBAAwB;QACxB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM;YAC/B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAE/B,6CAA6C;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;QAEpE,eAAe;QACf,OAAO,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACtC,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,GAAG,yBAAyB,IAAI,CAAC,aAAa,eAAe,CAAC;QAC1E,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEpC,OAAO,CAAC,OAAO,CACb,wBAAwB,UAAU,IAAI;YACtC,KAAK,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,WAAW,WAAW;YAChE,UAAU,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,gBAAgB,aAAa,CACjE,CAAC;QAEF,mCAAmC;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAkBA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDjD"}
@@ -0,0 +1,57 @@
1
+ import fs from 'node:fs';
2
+ import readline from 'node:readline';
3
+ import { saveConfig, getDefaultConfig, getConfigDir, getClaudeDir, } from '@coderadar/core';
4
+ function ask(rl, question, defaultVal) {
5
+ return new Promise((resolve) => {
6
+ rl.question(`${question} [${defaultVal}]: `, (answer) => {
7
+ resolve(answer.trim() || defaultVal);
8
+ });
9
+ });
10
+ }
11
+ export async function initCommand() {
12
+ const configDir = getConfigDir();
13
+ const configPath = `${configDir}/config.json`;
14
+ console.log('CodeRadar - Configuration Setup\n');
15
+ if (fs.existsSync(configPath)) {
16
+ console.log(`Config already exists: ${configPath}`);
17
+ console.log('Use "coderadar config" to modify settings.\n');
18
+ }
19
+ const rl = readline.createInterface({
20
+ input: process.stdin,
21
+ output: process.stdout,
22
+ });
23
+ try {
24
+ const config = getDefaultConfig();
25
+ // Language
26
+ const locale = await ask(rl, 'Language (en/fr)', config.locale);
27
+ if (locale === 'fr' || locale === 'en') {
28
+ config.locale = locale;
29
+ }
30
+ // Scan directories
31
+ console.log(`\nDefault scan directories:`);
32
+ config.scanDirs.forEach((d, i) => console.log(` ${i + 1}. ${d.path}`));
33
+ const addDir = await ask(rl, '\nAdd a scan directory? (path or empty to skip)', '');
34
+ if (addDir && fs.existsSync(addDir)) {
35
+ const label = addDir.split(/[/\\]/).pop() || addDir;
36
+ config.scanDirs.push({ path: addDir, label });
37
+ console.log(` Added: ${addDir}`);
38
+ }
39
+ // Claude directory
40
+ const claudeDir = await ask(rl, 'Claude config directory', getClaudeDir());
41
+ config.claudeDir = claudeDir;
42
+ // Currency
43
+ const currency = await ask(rl, 'Default currency', config.currency);
44
+ config.currency = currency.toUpperCase();
45
+ // Monthly plan
46
+ const plan = await ask(rl, 'Monthly plan cost (USD)', String(config.monthlyPlan));
47
+ config.monthlyPlan = parseInt(plan) || 200;
48
+ // Save
49
+ saveConfig(config);
50
+ console.log(`\nConfiguration saved to ${configPath}`);
51
+ console.log('Run "coderadar generate" to create your dashboard.');
52
+ }
53
+ finally {
54
+ rl.close();
55
+ }
56
+ }
57
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface SyncOptions {
2
+ url?: string;
3
+ token?: string;
4
+ noCosts?: boolean;
5
+ }
6
+ export declare function syncCommand(options: SyncOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBAmGrD"}
@@ -0,0 +1,90 @@
1
+ import { loadConfig } from '@coderadar/core';
2
+ import { collectDashboardData } from '../collector.js';
3
+ import ora from 'ora';
4
+ export async function syncCommand(options) {
5
+ const config = loadConfig();
6
+ const cloudUrl = options.url || config.cloudUrl || 'https://coderadar.dev';
7
+ const token = options.token || config.cloudToken || process.env.CODERADAR_TOKEN;
8
+ if (!token) {
9
+ console.error('No auth token found. Set one with:\n' +
10
+ ' coderadar config set cloudToken <your-token>\n' +
11
+ ' or pass --token <token>\n' +
12
+ ' or set CODERADAR_TOKEN environment variable\n\n' +
13
+ 'Get your token from: ' + cloudUrl + '/dashboard/settings');
14
+ process.exit(1);
15
+ }
16
+ const spinner = ora('Collecting local data...').start();
17
+ try {
18
+ const data = collectDashboardData(config, { noCosts: options.noCosts });
19
+ // Transform projects for API
20
+ const projects = data.projects.map((p) => ({
21
+ name: p.name,
22
+ path: p.path,
23
+ stack: p.stack || null,
24
+ branch: p.branch || null,
25
+ status: p.status || 'unknown',
26
+ health_score: p.healthScore || 0,
27
+ total_commits: p.commitsWeek || 0,
28
+ uncommitted_changes: p.uncommitted || 0,
29
+ has_claude_md: p.hasClaudeMd || false,
30
+ has_progress_md: p.hasProgressMd || false,
31
+ github_url: p.githubUrl || null,
32
+ last_commit_date: p.lastCommitDate || null,
33
+ last_commit_message: p.lastCommit || null,
34
+ updated_at: new Date().toISOString(),
35
+ }));
36
+ // Transform sessions from timeline
37
+ const sessions = data.timeline.map((t) => ({
38
+ session_id: t.sessionId,
39
+ project_path: null,
40
+ title: t.summary || t.project || null,
41
+ model: null,
42
+ started_at: t.date,
43
+ duration_minutes: t.stats?.duration || null,
44
+ input_tokens: 0,
45
+ output_tokens: 0,
46
+ cost_usd: null,
47
+ }));
48
+ // Transform costs
49
+ const daily_costs = data.costDaily.map((c) => ({
50
+ date: c.date,
51
+ total_cost_usd: c.totalCost || 0,
52
+ total_input_tokens: c.inputTokens || 0,
53
+ total_output_tokens: c.outputTokens || 0,
54
+ model: c.modelBreakdowns?.[0]?.modelName || null,
55
+ session_count: 0,
56
+ }));
57
+ spinner.text = `Syncing ${projects.length} projects, ${sessions.length} sessions, ${daily_costs.length} cost records...`;
58
+ const response = await fetch(`${cloudUrl}/api/sync`, {
59
+ method: 'POST',
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ 'Authorization': `Bearer ${token}`,
63
+ },
64
+ body: JSON.stringify({ projects, sessions, daily_costs }),
65
+ });
66
+ if (!response.ok) {
67
+ const error = await response.text();
68
+ throw new Error(`Sync failed (${response.status}): ${error}`);
69
+ }
70
+ const result = await response.json();
71
+ spinner.succeed('Sync complete!');
72
+ console.log('');
73
+ if (result.results?.projects) {
74
+ console.log(` Projects: ${result.results.projects.upserted} synced`);
75
+ }
76
+ if (result.results?.sessions) {
77
+ console.log(` Sessions: ${result.results.sessions.upserted} synced`);
78
+ }
79
+ if (result.results?.daily_costs) {
80
+ console.log(` Costs: ${result.results.daily_costs.upserted} days synced`);
81
+ }
82
+ console.log(`\nDashboard: ${cloudUrl}/dashboard`);
83
+ }
84
+ catch (error) {
85
+ spinner.fail('Sync failed');
86
+ console.error(error.message);
87
+ process.exit(1);
88
+ }
89
+ }
90
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}