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/bin/coderadar.js +2 -0
- package/dist/collector.d.ts +12 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +253 -0
- package/dist/collector.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +64 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/generate.d.ts +8 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +44 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +57 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +90 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +67 -0
- package/dist/index.js.map +1 -0
- package/dist/output/html-generator.d.ts +11 -0
- package/dist/output/html-generator.d.ts.map +1 -0
- package/dist/output/html-generator.js +106 -0
- package/dist/output/html-generator.js.map +1 -0
- package/package.json +61 -0
- package/templates/app.js +1294 -0
- package/templates/styles.css +489 -0
- package/templates/template.html +325 -0
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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;GAGG;AACH,SAAS,eAAe;IACtB,yDAAyD;IACzD,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2CAA2C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB,EAAE,QAAgB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,oBAAoB;IACpB,IAAI,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEnD,iEAAiE;IACjE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW;QACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAY,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,EAAE;YACrF,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS;YAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;YAC7B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YAC3B,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW;SACnC,CAAC;QACJ,CAAC,CAAC,MAAM,CAAC;IAEX,mCAAmC;IACnC,MAAM,YAAY,GAA2B;QAC3C,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzC,kBAAkB,EAAE,eAAe;QACnC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1D,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7C,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QACpD,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7C,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;QACxD,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACjE,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5D,yBAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5D,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;QACtD,eAAe,EAAE,IAAI,CAAC,SAAS;QAC/B,YAAY,EAAE,IAAI,CAAC,MAAM;QACzB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QACvC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACpC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC5C,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QACzC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC1C,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3C,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;QACtD,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;QACrD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QAChD,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,gBAAgB,EAAE,IAAI,CAAC,SAAS;QAChC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;QACpD,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;QACtD,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC;KAC9D,CAAC;IAEF,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}
|
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
|
+
}
|