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.
package/dist/index.js ADDED
@@ -0,0 +1,67 @@
1
+ import { Command } from 'commander';
2
+ import { generateCommand } from './commands/generate.js';
3
+ import { initCommand } from './commands/init.js';
4
+ import { configGetCommand, configSetCommand, configPathCommand } from './commands/config.js';
5
+ import { syncCommand } from './commands/sync.js';
6
+ const program = new Command();
7
+ program
8
+ .name('coderadar')
9
+ .description('Intelligent dashboard for Claude Code project supervision')
10
+ .version('0.1.0');
11
+ program
12
+ .command('generate')
13
+ .description('Generate the dashboard HTML file')
14
+ .option('-o, --output <path>', 'Output file path', 'index.html')
15
+ .option('--no-open', 'Do not open in browser after generation')
16
+ .option('--no-cache', 'Skip cache, force full scan')
17
+ .option('--no-costs', 'Skip cost data collection (faster)')
18
+ .action(async (options) => {
19
+ await generateCommand({
20
+ output: options.output,
21
+ noOpen: !options.open,
22
+ noCache: !options.cache,
23
+ noCosts: !options.costs,
24
+ });
25
+ });
26
+ program
27
+ .command('sync')
28
+ .description('Sync local data to the cloud dashboard')
29
+ .option('-u, --url <url>', 'Cloud dashboard URL')
30
+ .option('-t, --token <token>', 'Auth token')
31
+ .option('--no-costs', 'Skip cost data collection')
32
+ .action(async (options) => {
33
+ await syncCommand({
34
+ url: options.url,
35
+ token: options.token,
36
+ noCosts: !options.costs,
37
+ });
38
+ });
39
+ program
40
+ .command('init')
41
+ .description('Interactive setup for CodeRadar configuration')
42
+ .action(async () => {
43
+ await initCommand();
44
+ });
45
+ const configCmd = program
46
+ .command('config')
47
+ .description('Manage configuration');
48
+ configCmd
49
+ .command('get [key]')
50
+ .description('Get config value (all if no key)')
51
+ .action((key) => {
52
+ configGetCommand(key);
53
+ });
54
+ configCmd
55
+ .command('set <key> <value>')
56
+ .description('Set config value')
57
+ .action((key, value) => {
58
+ configSetCommand(key, value);
59
+ });
60
+ configCmd
61
+ .command('path')
62
+ .description('Show config file path')
63
+ .action(() => {
64
+ configPathCommand();
65
+ });
66
+ program.parse();
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,YAAY,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,YAAY,EAAE,6BAA6B,CAAC;KACnD,MAAM,CAAC,YAAY,EAAE,oCAAoC,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,eAAe,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI;QACrB,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK;QACvB,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK;KACxB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,YAAY,CAAC;KAC3C,MAAM,CAAC,YAAY,EAAE,2BAA2B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,WAAW,CAAC;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK;KACxB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAEvC,SAAS;KACN,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,CAAC,GAAY,EAAE,EAAE;IACvB,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;IACrC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,GAAG,EAAE;IACX,iBAAiB,EAAE,CAAC;AACtB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type DashboardData } from '@coderadar/core';
2
+ /**
3
+ * Generate a complete single-file HTML dashboard from collected data.
4
+ * Mirrors the logic of generate.ps1: reads templates, injects CSS/JS, replaces placeholders.
5
+ */
6
+ export declare function generateHtml(data: DashboardData): string;
7
+ /**
8
+ * Generate and write the dashboard HTML file.
9
+ */
10
+ export declare function generateDashboard(data: DashboardData, outputPath: string): void;
11
+ //# sourceMappingURL=html-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-generator.d.ts","sourceRoot":"","sources":["../../src/output/html-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAoCrD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAiExD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,MAAM,GACjB,IAAI,CASN"}
@@ -0,0 +1,106 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ /**
7
+ * Resolve templates directory.
8
+ * Works both in dev (dist/output/) and when installed via npm.
9
+ */
10
+ function getTemplatesDir() {
11
+ // From dist/output/html-generator.js -> ../../templates/
12
+ const candidates = [
13
+ path.resolve(__dirname, '..', '..', 'templates'),
14
+ path.resolve(__dirname, '..', 'templates'),
15
+ path.resolve(__dirname, 'templates'),
16
+ ];
17
+ for (const dir of candidates) {
18
+ if (fs.existsSync(dir) && fs.existsSync(path.join(dir, 'template.html'))) {
19
+ return dir;
20
+ }
21
+ }
22
+ throw new Error(`Templates directory not found. Checked: ${candidates.join(', ')}`);
23
+ }
24
+ function readTemplate(templatesDir, filename) {
25
+ const filePath = path.join(templatesDir, filename);
26
+ if (!fs.existsSync(filePath)) {
27
+ throw new Error(`Template file not found: ${filePath}`);
28
+ }
29
+ return fs.readFileSync(filePath, 'utf-8');
30
+ }
31
+ /**
32
+ * Generate a complete single-file HTML dashboard from collected data.
33
+ * Mirrors the logic of generate.ps1: reads templates, injects CSS/JS, replaces placeholders.
34
+ */
35
+ export function generateHtml(data) {
36
+ const templatesDir = getTemplatesDir();
37
+ // Read source files
38
+ let html = readTemplate(templatesDir, 'template.html');
39
+ const styles = readTemplate(templatesDir, 'styles.css');
40
+ const appJs = readTemplate(templatesDir, 'app.js');
41
+ // 1. Inject CSS and JS first (they contain %%PLACEHOLDERS%% too)
42
+ html = html.replace('%%STYLES%%', styles);
43
+ html = html.replace('%%SCRIPT%%', appJs);
44
+ // 2. Build last session JSON
45
+ const lastSessionJson = data.lastSession
46
+ ? JSON.stringify({
47
+ name: data.projects.find((p) => p.path === data.lastSession.projectPath)?.name || '',
48
+ id: data.lastSession.sessionId,
49
+ title: data.lastSession.title,
50
+ date: data.lastSession.date,
51
+ path: data.lastSession.projectPath,
52
+ })
53
+ : 'null';
54
+ // 3. Replace all data placeholders
55
+ const replacements = {
56
+ '%%DATA%%': JSON.stringify(data.projects),
57
+ '%%LAST_SESSION%%': lastSessionJson,
58
+ '%%RECENT_SESSIONS%%': JSON.stringify(data.recentSessions),
59
+ '%%INSIGHTS%%': JSON.stringify(data.insights),
60
+ '%%SEARCH_INDEX%%': JSON.stringify(data.searchIndex),
61
+ '%%TIMELINE%%': JSON.stringify(data.timeline),
62
+ '%%CHART_PROJECTS%%': JSON.stringify(data.chartProjects),
63
+ '%%CHART_PROJECTS_TIME%%': JSON.stringify(data.chartProjectsTime),
64
+ '%%CHART_WEEKLY_LABELS%%': JSON.stringify(data.weeklyLabels),
65
+ '%%CHART_WEEKLY_VALUES%%': JSON.stringify(data.weeklyValues),
66
+ '%%CHART_WEEKLY_HOURS%%': JSON.stringify(data.weeklyHours),
67
+ '%%CHART_TAGS%%': JSON.stringify(data.tagDistribution),
68
+ '%%TIMESTAMP%%': data.timestamp,
69
+ '%%PCNAME%%': data.pcName,
70
+ '%%TOTAL%%': String(data.totalProjects),
71
+ '%%ACTIVE%%': String(data.activeCount),
72
+ '%%UNDOC%%': String(data.undocCount),
73
+ '%%DIRTY%%': String(data.dirtyCount),
74
+ '%%COMMITS%%': String(data.totalCommitsWeek),
75
+ '%%HEALTH%%': String(data.avgHealth),
76
+ '%%STACKS%%': JSON.stringify(data.stacks),
77
+ '%%UNSYNCED%%': String(data.unsyncedCount),
78
+ '%%PLUGINS%%': JSON.stringify(data.plugins),
79
+ '%%PLUGIN_COUNTS%%': JSON.stringify(data.pluginCounts),
80
+ '%%MARKETPLACES%%': JSON.stringify(data.marketplaces),
81
+ '%%COST_DAILY%%': JSON.stringify(data.costDaily),
82
+ '%%COST_TOTALS%%': JSON.stringify(data.costTotals),
83
+ '%%COST_MODELS%%': JSON.stringify(data.costModels),
84
+ '%%COST_HOURLY%%': JSON.stringify(data.costHourly),
85
+ '%%LAST_MODEL%%': data.lastModel,
86
+ '%%DISK_SUMMARY%%': JSON.stringify(data.diskSummary),
87
+ '%%DISK_PROJECTS%%': JSON.stringify(data.diskProjects),
88
+ '%%DISK_DEV_PROJECTS%%': JSON.stringify(data.diskDevProjects),
89
+ };
90
+ for (const [placeholder, value] of Object.entries(replacements)) {
91
+ html = html.split(placeholder).join(value);
92
+ }
93
+ return html;
94
+ }
95
+ /**
96
+ * Generate and write the dashboard HTML file.
97
+ */
98
+ export function generateDashboard(data, outputPath) {
99
+ const html = generateHtml(data);
100
+ const dir = path.dirname(outputPath);
101
+ if (!fs.existsSync(dir)) {
102
+ fs.mkdirSync(dir, { recursive: true });
103
+ }
104
+ fs.writeFileSync(outputPath, html, 'utf-8');
105
+ }
106
+ //# sourceMappingURL=html-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-generator.js","sourceRoot":"","sources":["../../src/output/html-generator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "coderadar",
3
+ "version": "0.1.0",
4
+ "description": "Intelligent dashboard for Claude Code project supervision - scan projects, track sessions, monitor costs",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "coderadar": "bin/coderadar.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin",
13
+ "templates"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "lint": "eslint src/",
19
+ "clean": "rimraf dist",
20
+ "start": "node bin/coderadar.js",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "engines": {
24
+ "node": ">=18.0.0"
25
+ },
26
+ "dependencies": {
27
+ "@coderadar/core": "^0.1.0",
28
+ "commander": "^13.0.0",
29
+ "ora": "^8.1.0",
30
+ "open": "^10.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "typescript": "^5.7.0",
34
+ "rimraf": "^6.0.0",
35
+ "@types/node": "^22.0.0"
36
+ },
37
+ "keywords": [
38
+ "coderadar",
39
+ "claude-code",
40
+ "dashboard",
41
+ "developer-tools",
42
+ "project-management",
43
+ "ai",
44
+ "dev-tools",
45
+ "monitoring",
46
+ "sessions",
47
+ "costs",
48
+ "git-stats"
49
+ ],
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/GuillaumeBeylouneh/coderadar.git",
54
+ "directory": "packages/cli"
55
+ },
56
+ "homepage": "https://github.com/GuillaumeBeylouneh/coderadar#readme",
57
+ "bugs": {
58
+ "url": "https://github.com/GuillaumeBeylouneh/coderadar/issues"
59
+ },
60
+ "author": "Guillaume Beylouneh"
61
+ }