@devclocked/cli 1.0.0 → 2.0.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/dist/auth.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CLI auth helper — bootstraps TrackerClient with API key from config file.
3
+ *
4
+ * The tracker-core AuthManager holds the API key in-memory only (by design —
5
+ * VS Code globalState is syncable, so persisting keys there is a leak vector).
6
+ * But CLI commands are short-lived processes that need to read the key from
7
+ * disk on every invocation. This helper reads the key from cli.json and
8
+ * primes the in-memory state without a network roundtrip.
9
+ */
10
+ import { TrackerClient } from '@devclocked/tracker-core';
11
+ /**
12
+ * Create a TrackerClient that is already authenticated from the CLI config file.
13
+ * Returns null if not authenticated.
14
+ */
15
+ export declare function createAuthenticatedClient(): Promise<TrackerClient | null>;
16
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD;;;GAGG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA4B/E"}
package/dist/auth.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * CLI auth helper — bootstraps TrackerClient with API key from config file.
4
+ *
5
+ * The tracker-core AuthManager holds the API key in-memory only (by design —
6
+ * VS Code globalState is syncable, so persisting keys there is a leak vector).
7
+ * But CLI commands are short-lived processes that need to read the key from
8
+ * disk on every invocation. This helper reads the key from cli.json and
9
+ * primes the in-memory state without a network roundtrip.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createAuthenticatedClient = createAuthenticatedClient;
13
+ const tracker_core_1 = require("@devclocked/tracker-core");
14
+ const FileStorageAdapter_1 = require("./storage/FileStorageAdapter");
15
+ const config_1 = require("./config");
16
+ /**
17
+ * Create a TrackerClient that is already authenticated from the CLI config file.
18
+ * Returns null if not authenticated.
19
+ */
20
+ async function createAuthenticatedClient() {
21
+ const storage = new FileStorageAdapter_1.FileStorageAdapter();
22
+ const client = new tracker_core_1.TrackerClient({
23
+ supabaseUrl: config_1.SUPABASE_URL,
24
+ supabaseAnonKey: config_1.SUPABASE_ANON_KEY,
25
+ source: 'cli',
26
+ clientId: `cli-${Date.now()}`,
27
+ debug: false,
28
+ }, storage);
29
+ client.stopAutoProcessing();
30
+ // Try to load API key from legacy auth_state in storage
31
+ const authStateRaw = await storage.get('auth_state');
32
+ if (authStateRaw) {
33
+ try {
34
+ const parsed = JSON.parse(authStateRaw);
35
+ if (parsed.apiKey && parsed.apiKey.startsWith('dck_')) {
36
+ await bootstrapAuth(client, storage, parsed);
37
+ return client;
38
+ }
39
+ }
40
+ catch {
41
+ // Malformed auth_state
42
+ }
43
+ }
44
+ client.destroy();
45
+ return null;
46
+ }
47
+ /**
48
+ * Bootstrap auth into the TrackerClient's AuthManager without a network call.
49
+ * Sets the in-memory API key and ensures auth_metadata exists so
50
+ * getAuthState() works.
51
+ */
52
+ async function bootstrapAuth(client, storage, auth) {
53
+ // Set API key in memory (AuthManager keeps it out of storage by design)
54
+ const authManager = client.authManager;
55
+ if (authManager) {
56
+ authManager.apiKeyInMemory = auth.apiKey;
57
+ }
58
+ // Ensure auth_metadata exists so getAuthState() returns non-null
59
+ const existing = await storage.get('auth_metadata');
60
+ if (!existing) {
61
+ await storage.set('auth_metadata', JSON.stringify({
62
+ userId: auth.userId,
63
+ email: auth.email,
64
+ authenticatedAt: auth.authenticatedAt,
65
+ }));
66
+ }
67
+ }
68
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,8DA4BC;AA3CD,2DAAyD;AACzD,qEAAkE;AAClE,qCAA2D;AAS3D;;;GAGG;AACI,KAAK,UAAU,yBAAyB;IAC7C,MAAM,OAAO,GAAG,IAAI,uCAAkB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,4BAAa,CAAC;QAC/B,WAAW,EAAE,qBAAY;QACzB,eAAe,EAAE,0BAAiB;QAClC,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE;QAC7B,KAAK,EAAE,KAAK;KACb,EAAE,OAAO,CAAC,CAAC;IAEZ,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAE5B,wDAAwD;IACxD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAoB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACzD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC7C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAqB,EACrB,OAA2B,EAC3B,IAAqB;IAErB,wEAAwE;IACxE,MAAM,WAAW,GAAI,MAAc,CAAC,WAAW,CAAC;IAChD,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Terminal dashboard renderer for `devclocked summary`
3
+ */
4
+ import { TodayActivityResponse } from '@devclocked/tracker-core';
5
+ export declare function renderProgressBar(filled: number, total: number, barWidth: number): string;
6
+ interface RepoAggregate {
7
+ name: string;
8
+ minutes: number;
9
+ linesAdded: number;
10
+ linesDeleted: number;
11
+ ticks: number;
12
+ tokensTotal: number;
13
+ }
14
+ export declare function aggregateByRepo(data: TodayActivityResponse): RepoAggregate[];
15
+ export declare function buildCompactSummary(data: TodayActivityResponse): string;
16
+ export declare function renderCompactSummary(data: TodayActivityResponse): void;
17
+ export declare function buildFullDashboard(data: TodayActivityResponse): string;
18
+ export declare function renderFullDashboard(data: TodayActivityResponse): void;
19
+ export interface WeeklyDayEntry {
20
+ date: string;
21
+ data: TodayActivityResponse;
22
+ }
23
+ export declare function buildPlainWeeklySummary(days: WeeklyDayEntry[]): string;
24
+ export declare function buildPlainSummary(data: TodayActivityResponse): string;
25
+ export declare function buildPlainVisualSummary(data: TodayActivityResponse): string;
26
+ export {};
27
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/branding/dashboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAqB,MAAM,0BAA0B,CAAC;AAkCpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKzF;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,qBAAqB,GAAG,aAAa,EAAE,CA2B5E;AAqFD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAsFvE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAEtE;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAoEtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAErE;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,qBAAqB,CAAC;CAC7B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CAmDtE;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAgDrE;AAWD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CA+E3E"}
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ /**
3
+ * Terminal dashboard renderer for `devclocked summary`
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.renderProgressBar = renderProgressBar;
10
+ exports.aggregateByRepo = aggregateByRepo;
11
+ exports.buildCompactSummary = buildCompactSummary;
12
+ exports.renderCompactSummary = renderCompactSummary;
13
+ exports.buildFullDashboard = buildFullDashboard;
14
+ exports.renderFullDashboard = renderFullDashboard;
15
+ exports.buildPlainWeeklySummary = buildPlainWeeklySummary;
16
+ exports.buildPlainSummary = buildPlainSummary;
17
+ exports.buildPlainVisualSummary = buildPlainVisualSummary;
18
+ const chalk_1 = __importDefault(require("chalk"));
19
+ const GOLD = chalk_1.default.hex('#F8D74A');
20
+ const DIM = chalk_1.default.dim;
21
+ const WHITE = chalk_1.default.white;
22
+ const CYAN = chalk_1.default.cyan;
23
+ const GREEN = chalk_1.default.green;
24
+ const GRAY = chalk_1.default.gray;
25
+ // Box-drawing characters (full dashboard only)
26
+ const TOP_LEFT = '╭';
27
+ const TOP_RIGHT = '╮';
28
+ const BOT_LEFT = '╰';
29
+ const BOT_RIGHT = '╯';
30
+ const HORIZ = '─';
31
+ const VERT = '│';
32
+ const TEE_LEFT = '├';
33
+ const TEE_RIGHT = '┤';
34
+ const INNER_WIDTH = 68;
35
+ function hLine(left, right) {
36
+ return left + HORIZ.repeat(INNER_WIDTH) + right;
37
+ }
38
+ function padLine(content, rawLen) {
39
+ const padding = Math.max(0, INNER_WIDTH - 2 - rawLen);
40
+ return GRAY(VERT) + ' ' + content + ' '.repeat(padding) + ' ' + GRAY(VERT);
41
+ }
42
+ function emptyLine() {
43
+ return padLine('', 0);
44
+ }
45
+ function renderProgressBar(filled, total, barWidth) {
46
+ if (total === 0)
47
+ return DIM('░'.repeat(barWidth));
48
+ const filledCount = Math.min(barWidth, Math.round((filled / total) * barWidth));
49
+ const emptyCount = barWidth - filledCount;
50
+ return GOLD('█'.repeat(filledCount)) + DIM('░'.repeat(emptyCount));
51
+ }
52
+ function aggregateByRepo(data) {
53
+ const map = new Map();
54
+ for (const session of data.sessions) {
55
+ for (const wb of session.work_blocks) {
56
+ const name = wb.canonical_repo_name || 'unknown';
57
+ const existing = map.get(name);
58
+ if (existing) {
59
+ existing.minutes += wb.auto_minutes;
60
+ existing.linesAdded += wb.lines_added;
61
+ existing.linesDeleted += wb.lines_deleted;
62
+ existing.ticks += wb.tick_count;
63
+ existing.tokensTotal += wb.tokens_input + wb.tokens_output;
64
+ }
65
+ else {
66
+ map.set(name, {
67
+ name,
68
+ minutes: wb.auto_minutes,
69
+ linesAdded: wb.lines_added,
70
+ linesDeleted: wb.lines_deleted,
71
+ ticks: wb.tick_count,
72
+ tokensTotal: wb.tokens_input + wb.tokens_output,
73
+ });
74
+ }
75
+ }
76
+ }
77
+ return [...map.values()].sort((a, b) => b.minutes - a.minutes);
78
+ }
79
+ function formatMinutes(mins) {
80
+ if (mins < 1)
81
+ return '<1m';
82
+ if (mins < 60)
83
+ return `${Math.round(mins)}m`;
84
+ const h = Math.floor(mins / 60);
85
+ const m = Math.round(mins % 60);
86
+ return m > 0 ? `${h}h ${m}m` : `${h}h`;
87
+ }
88
+ function formatTokens(count) {
89
+ if (count < 1000)
90
+ return String(count);
91
+ if (count < 1000000)
92
+ return `${(count / 1000).toFixed(1)}k`;
93
+ return `${(count / 1000000).toFixed(1)}M`;
94
+ }
95
+ function truncate(str, maxLen) {
96
+ return str.length > maxLen ? str.slice(0, maxLen - 1) + '…' : str;
97
+ }
98
+ /** Get the short repo name (last segment of owner/repo) */
99
+ function shortRepoName(canonical) {
100
+ if (!canonical)
101
+ return 'unknown';
102
+ const parts = canonical.split('/');
103
+ return parts[parts.length - 1] || canonical;
104
+ }
105
+ /**
106
+ * Find the most relevant current work block:
107
+ * - Prefer active blocks (session is_active + block has no ended_at equivalent)
108
+ * - Fall back to the most recent block by effective_ended_at
109
+ */
110
+ function findCurrentBlock(data) {
111
+ let best = null;
112
+ let bestTime = '';
113
+ for (const session of data.sessions) {
114
+ for (const wb of session.work_blocks) {
115
+ // Prefer blocks in active sessions, with most recent activity
116
+ if (session.is_active && (!best || wb.effective_ended_at > bestTime)) {
117
+ best = wb;
118
+ bestTime = wb.effective_ended_at;
119
+ }
120
+ }
121
+ }
122
+ // Fallback: most recent block across all sessions
123
+ if (!best) {
124
+ for (const session of data.sessions) {
125
+ for (const wb of session.work_blocks) {
126
+ if (!best || wb.effective_ended_at > bestTime) {
127
+ best = wb;
128
+ bestTime = wb.effective_ended_at;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return best;
134
+ }
135
+ function aggregateTotals(data) {
136
+ let totalLinesAdded = 0;
137
+ let totalLinesDeleted = 0;
138
+ let totalTokens = 0;
139
+ let totalTicks = 0;
140
+ let codingMinutes = 0;
141
+ for (const session of data.sessions) {
142
+ totalTicks += session.tick_count;
143
+ for (const wb of session.work_blocks) {
144
+ totalLinesAdded += wb.lines_added;
145
+ totalLinesDeleted += wb.lines_deleted;
146
+ totalTokens += wb.tokens_input + wb.tokens_output;
147
+ if (wb.work_signature && wb.work_signature.write_count > 0) {
148
+ codingMinutes += wb.auto_minutes;
149
+ }
150
+ }
151
+ }
152
+ return { totalLinesAdded, totalLinesDeleted, totalTokens, totalTicks, codingMinutes };
153
+ }
154
+ // ─── Compact Summary (default) ───────────────────────────────────
155
+ function buildCompactSummary(data) {
156
+ const totalMinutes = data.tracked_minutes_today;
157
+ const isActive = data.sessions.some(s => s.is_active);
158
+ const repos = aggregateByRepo(data);
159
+ const repoCount = repos.length;
160
+ const sessionCount = data.sessions.length;
161
+ const totals = aggregateTotals(data);
162
+ const block = findCurrentBlock(data);
163
+ // Use a fixed box width that fits most terminals
164
+ const boxWidth = 68;
165
+ const innerWidth = boxWidth - 2; // minus left/right borders
166
+ if (!block && totalMinutes === 0) {
167
+ const lines = [
168
+ GRAY(TOP_LEFT + HORIZ.repeat(innerWidth) + TOP_RIGHT),
169
+ GRAY(VERT) + ' ' + GOLD('◉') + GRAY(' No activity recorded today') + ' '.repeat(innerWidth - 28) + GRAY(VERT),
170
+ GRAY(BOT_LEFT + HORIZ.repeat(innerWidth) + BOT_RIGHT),
171
+ ];
172
+ return lines.join('\n');
173
+ }
174
+ // Build the content for line 1: repo + bar + time + status
175
+ const repoName = shortRepoName(block?.canonical_repo_name ?? null);
176
+ const blockMins = block?.auto_minutes ?? 0;
177
+ const timeStr = formatMinutes(blockMins);
178
+ const statusText = isActive ? 'Tracking' : 'Idle';
179
+ const statusDot = isActive ? GREEN('●') : GRAY('○');
180
+ const nameDisplay = truncate(repoName, 20);
181
+ // Calculate bar width to fill remaining space
182
+ // Layout: " ◉ name bar time ● Status "
183
+ const fixedChars = 1 + 2 + nameDisplay.length + 2 + 2 + timeStr.length + 2 + 2 + statusText.length + 1;
184
+ const barWidth = Math.max(6, innerWidth - fixedChars);
185
+ const bar = renderProgressBar(blockMins, totalMinutes, barWidth);
186
+ // Build line 2 parts (plain text, measured accurately)
187
+ const linesStr = (totals.totalLinesAdded || totals.totalLinesDeleted)
188
+ ? `+${formatTokens(totals.totalLinesAdded)}/-${formatTokens(totals.totalLinesDeleted)}`
189
+ : '';
190
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
191
+ const totalParts = [
192
+ formatMinutes(totalMinutes),
193
+ `${repoCount} repo${repoCount !== 1 ? 's' : ''}`,
194
+ `${workBlockCount} block${workBlockCount !== 1 ? 's' : ''}`,
195
+ ];
196
+ if (linesStr)
197
+ totalParts.push(linesStr);
198
+ totalParts.push(`${formatTokens(totals.totalTokens)} tok`);
199
+ const totalsPlain = 'Today: ' + totalParts.join(' \u00b7 ');
200
+ const expandHint = '\u25BC \u2325O';
201
+ // Truncate totals if it would overflow the box (leave room for expand hint)
202
+ const hintLen = expandHint.length + 2; // 2 gap before hint
203
+ const maxTotalsLen = innerWidth - 4 - hintLen; // 2 left pad + 2 right pad + hint
204
+ const truncatedTotals = totalsPlain.length > maxTotalsLen
205
+ ? totalsPlain.slice(0, maxTotalsLen - 1) + '\u2026'
206
+ : totalsPlain;
207
+ // Measure display widths and build padded lines
208
+ // innerWidth = characters between the two │ borders
209
+ // Each line needs 1 char left pad + content + right pad to fill innerWidth
210
+ // Line 1 plain: " ◉ name ████░░░ time ● Status"
211
+ const line1Plain = ` \u25C9 ${nameDisplay} ${'X'.repeat(barWidth)} ${timeStr} \u25CF ${statusText}`;
212
+ const line1Cols = line1Plain.length;
213
+ const line1Pad = Math.max(1, innerWidth - line1Cols);
214
+ // Line 2 plain: " Today: 1h 3m · 2 repos · ... ▼ ⌥O"
215
+ const line2LeftPlain = ` ${truncatedTotals}`;
216
+ const line2Plain = line2LeftPlain + expandHint;
217
+ const line2Pad = 1; // right border pad
218
+ const line2Gap = Math.max(2, innerWidth - line2LeftPlain.length - expandHint.length - line2Pad);
219
+ // Render box
220
+ const lines = [
221
+ GRAY(TOP_LEFT + HORIZ.repeat(innerWidth) + TOP_RIGHT),
222
+ GRAY(VERT) +
223
+ ' ' + GOLD('\u25C9') + ' ' + WHITE(nameDisplay) + ' ' + bar + ' ' + CYAN(timeStr) + ' ' + statusDot + ' ' + (isActive ? GREEN(statusText) : GRAY(statusText)) +
224
+ ' '.repeat(line1Pad) + GRAY(VERT),
225
+ GRAY(VERT) +
226
+ ' ' + GRAY(truncatedTotals) +
227
+ ' '.repeat(line2Gap) + DIM(expandHint) +
228
+ ' '.repeat(line2Pad) + GRAY(VERT),
229
+ ];
230
+ return lines.join('\n');
231
+ }
232
+ function renderCompactSummary(data) {
233
+ console.log(buildCompactSummary(data));
234
+ }
235
+ // ─── Full Dashboard (--full flag) ────────────────────────────────
236
+ function buildFullDashboard(data) {
237
+ const repos = aggregateByRepo(data);
238
+ const totalMinutes = data.tracked_minutes_today;
239
+ const sessionCount = data.sessions.length;
240
+ const isActive = data.sessions.some(s => s.is_active);
241
+ const totals = aggregateTotals(data);
242
+ const lines = [];
243
+ // Top border
244
+ lines.push(GRAY(hLine(TOP_LEFT, TOP_RIGHT)));
245
+ // Header
246
+ const statusDot = isActive ? GREEN('●') + ' Tracking' : GRAY('○') + ' Idle';
247
+ const headerLeft = GOLD('◉') + ' ' + GOLD('DevClocked');
248
+ const headerLeftRaw = 12;
249
+ const statusRaw = isActive ? 10 : 6;
250
+ const gap = INNER_WIDTH - 2 - headerLeftRaw - statusRaw;
251
+ lines.push(GRAY(VERT) + ' ' + headerLeft + ' '.repeat(Math.max(1, gap)) + statusDot + ' ' + GRAY(VERT));
252
+ // Divider
253
+ lines.push(GRAY(hLine(TEE_LEFT, TEE_RIGHT)));
254
+ lines.push(emptyLine());
255
+ // Summary line
256
+ const sessionTime = formatMinutes(totalMinutes);
257
+ const codingTime = formatMinutes(totals.codingMinutes);
258
+ const linesChanged = totals.totalLinesAdded || totals.totalLinesDeleted
259
+ ? `${GREEN('+' + totals.totalLinesAdded)} / ${chalk_1.default.red('-' + totals.totalLinesDeleted)}`
260
+ : GRAY('no changes');
261
+ const summaryText = `⏱ ${WHITE(sessionTime)} session ${WHITE(codingTime)} coding ${linesChanged}`;
262
+ const summaryRaw = `⏱ ${sessionTime} session ${codingTime} coding +${totals.totalLinesAdded} / -${totals.totalLinesDeleted}`.length;
263
+ lines.push(padLine(summaryText, summaryRaw));
264
+ lines.push(emptyLine());
265
+ // Repo breakdown
266
+ if (repos.length > 0) {
267
+ const maxMinutes = repos[0].minutes;
268
+ const BAR_WIDTH = 28;
269
+ const NAME_WIDTH = 26;
270
+ for (const repo of repos.slice(0, 6)) {
271
+ const name = truncate(repo.name, NAME_WIDTH);
272
+ const bar = renderProgressBar(repo.minutes, maxMinutes, BAR_WIDTH);
273
+ const time = formatMinutes(repo.minutes);
274
+ const namePadded = name + ' '.repeat(Math.max(0, NAME_WIDTH - name.length));
275
+ const timeStr = time.padStart(6);
276
+ const lineText = `${WHITE(namePadded)} ${bar} ${CYAN(timeStr)}`;
277
+ const rawLen = NAME_WIDTH + 1 + BAR_WIDTH + 1 + 6;
278
+ lines.push(padLine(lineText, rawLen));
279
+ }
280
+ }
281
+ else {
282
+ lines.push(padLine(GRAY('No activity recorded'), 20));
283
+ }
284
+ lines.push(emptyLine());
285
+ // Footer
286
+ const ticksStr = `Ticks ${WHITE(String(totals.totalTicks))}`;
287
+ const tokensStr = `Tokens ${WHITE(formatTokens(totals.totalTokens))}`;
288
+ const sessionsStr = `Sessions ${WHITE(String(sessionCount))}`;
289
+ const footerText = `${GRAY(ticksStr)} ${GRAY(tokensStr)} ${GRAY(sessionsStr)}`;
290
+ const footerRaw = `Ticks ${totals.totalTicks} Tokens ${formatTokens(totals.totalTokens)} Sessions ${sessionCount}`.length;
291
+ lines.push(padLine(footerText, footerRaw));
292
+ lines.push(GRAY(hLine(BOT_LEFT, BOT_RIGHT)));
293
+ return '\n' + lines.map(l => ' ' + l).join('\n') + '\n';
294
+ }
295
+ function renderFullDashboard(data) {
296
+ console.log(buildFullDashboard(data));
297
+ }
298
+ function buildPlainWeeklySummary(days) {
299
+ const lines = ['Weekly Summary (7 days)', ''];
300
+ let totalMinutes = 0;
301
+ let totalSessions = 0;
302
+ let totalLinesAdded = 0;
303
+ let totalLinesDeleted = 0;
304
+ for (const { date, data } of days) {
305
+ const d = new Date(date + 'T12:00:00'); // noon to avoid TZ issues
306
+ const dayLabel = d.toLocaleDateString('en-US', { weekday: 'short', month: 'numeric', day: 'numeric' });
307
+ const mins = data.tracked_minutes_today ?? 0;
308
+ const sessions = data.sessions?.length ?? 0;
309
+ let linesAdded = 0;
310
+ let linesDeleted = 0;
311
+ if (data.sessions) {
312
+ for (const s of data.sessions) {
313
+ for (const wb of s.work_blocks) {
314
+ linesAdded += wb.lines_added;
315
+ linesDeleted += wb.lines_deleted;
316
+ }
317
+ }
318
+ }
319
+ totalMinutes += mins;
320
+ totalSessions += sessions;
321
+ totalLinesAdded += linesAdded;
322
+ totalLinesDeleted += linesDeleted;
323
+ if (mins === 0 && sessions === 0) {
324
+ lines.push(`${dayLabel}: —`);
325
+ continue;
326
+ }
327
+ const parts = [formatMinutes(mins), `${sessions} session${sessions !== 1 ? 's' : ''}`];
328
+ if (linesAdded > 0 || linesDeleted > 0) {
329
+ parts.push(`+${linesAdded.toLocaleString()}/-${linesDeleted.toLocaleString()} lines`);
330
+ }
331
+ lines.push(`${dayLabel}: ${parts.join(' | ')}`);
332
+ }
333
+ lines.push('');
334
+ const totalParts = [formatMinutes(totalMinutes), `${totalSessions} sessions`];
335
+ if (totalLinesAdded > 0 || totalLinesDeleted > 0) {
336
+ totalParts.push(`+${totalLinesAdded.toLocaleString()}/-${totalLinesDeleted.toLocaleString()} lines`);
337
+ }
338
+ lines.push(`Total: ${totalParts.join(' | ')}`);
339
+ return lines.join('\n');
340
+ }
341
+ // ─── Plain-text Summary (for MCP / AI tools) ────────────────────
342
+ function buildPlainSummary(data) {
343
+ const totalMinutes = data.tracked_minutes_today;
344
+ const isActive = data.sessions.some(s => s.is_active);
345
+ const repos = aggregateByRepo(data);
346
+ const totals = aggregateTotals(data);
347
+ const block = findCurrentBlock(data);
348
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
349
+ if (!block && totalMinutes === 0) {
350
+ return 'No coding activity recorded today.';
351
+ }
352
+ const lines = [];
353
+ // Status line
354
+ const status = isActive ? 'Tracking' : 'Idle';
355
+ lines.push(`Status: ${status} | Today: ${formatMinutes(totalMinutes)}`);
356
+ // Current block
357
+ if (block) {
358
+ const name = block.canonical_repo_name || 'unknown';
359
+ lines.push(`Current: ${name} (${formatMinutes(block.auto_minutes)})`);
360
+ }
361
+ // Stats
362
+ const stats = [
363
+ `${repos.length} repo${repos.length !== 1 ? 's' : ''}`,
364
+ `${workBlockCount} work block${workBlockCount !== 1 ? 's' : ''}`,
365
+ `${data.sessions.length} session${data.sessions.length !== 1 ? 's' : ''}`,
366
+ ];
367
+ if (totals.totalLinesAdded || totals.totalLinesDeleted) {
368
+ stats.push(`+${totals.totalLinesAdded}/-${totals.totalLinesDeleted} lines`);
369
+ }
370
+ if (totals.totalTokens > 0) {
371
+ stats.push(`${formatTokens(totals.totalTokens)} tokens`);
372
+ }
373
+ lines.push(stats.join(' · '));
374
+ // Per-repo breakdown
375
+ if (repos.length > 1) {
376
+ lines.push('');
377
+ lines.push('Repos:');
378
+ for (const repo of repos.slice(0, 6)) {
379
+ lines.push(` ${repo.name}: ${formatMinutes(repo.minutes)}`);
380
+ }
381
+ }
382
+ return lines.join('\n');
383
+ }
384
+ // ─── Plain Visual Summary (for Claude Code / non-TTY with bars) ──
385
+ function plainProgressBar(filled, total, barWidth) {
386
+ if (total === 0)
387
+ return '░'.repeat(barWidth);
388
+ const filledCount = Math.min(barWidth, Math.round((filled / total) * barWidth));
389
+ const emptyCount = barWidth - filledCount;
390
+ return '█'.repeat(filledCount) + '░'.repeat(emptyCount);
391
+ }
392
+ function buildPlainVisualSummary(data) {
393
+ const totalMinutes = data.tracked_minutes_today;
394
+ const isActive = data.sessions.some(s => s.is_active);
395
+ const repos = aggregateByRepo(data);
396
+ const totals = aggregateTotals(data);
397
+ const block = findCurrentBlock(data);
398
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
399
+ const H = '─';
400
+ const V = '│';
401
+ // Helper to build a padded row that always aligns the right border
402
+ function row(content, width) {
403
+ const trimmed = content.length > width ? content.slice(0, width - 1) + '…' : content;
404
+ return `${V}${trimmed}${' '.repeat(Math.max(0, width - trimmed.length))}${V}`;
405
+ }
406
+ // Determine box width from content
407
+ const repoName = shortRepoName(block?.canonical_repo_name ?? null);
408
+ const blockMins = block?.auto_minutes ?? 0;
409
+ const timeStr = formatMinutes(blockMins);
410
+ const statusText = isActive ? '● Tracking' : '○ Idle';
411
+ const nameDisplay = truncate(repoName, 18);
412
+ // Calculate inner width to fit line 1 nicely (min 56)
413
+ const barWidth = 20;
414
+ const line1Len = 3 + nameDisplay.length + 2 + barWidth + 2 + timeStr.length + 2 + statusText.length + 2;
415
+ const innerWidth = Math.max(56, line1Len);
416
+ if (!block && totalMinutes === 0) {
417
+ return [
418
+ `╭${H.repeat(innerWidth)}╮`,
419
+ row(' ◉ No activity recorded today', innerWidth),
420
+ `╰${H.repeat(innerWidth)}╯`,
421
+ ].join('\n');
422
+ }
423
+ const bar = plainProgressBar(blockMins, totalMinutes, barWidth);
424
+ const line1 = ` ◉ ${nameDisplay} ${bar} ${timeStr} ${statusText}`;
425
+ // Line 2: Today stats
426
+ const linesStr = (totals.totalLinesAdded || totals.totalLinesDeleted)
427
+ ? `+${formatTokens(totals.totalLinesAdded)}/-${formatTokens(totals.totalLinesDeleted)}`
428
+ : '';
429
+ const parts = [
430
+ formatMinutes(totalMinutes),
431
+ `${repos.length} repo${repos.length !== 1 ? 's' : ''}`,
432
+ `${workBlockCount} block${workBlockCount !== 1 ? 's' : ''}`,
433
+ ];
434
+ if (linesStr)
435
+ parts.push(linesStr);
436
+ parts.push(`${formatTokens(totals.totalTokens)} tok`);
437
+ const line2 = ` Today: ${parts.join(' · ')}`;
438
+ const lines = [
439
+ `╭${H.repeat(innerWidth)}╮`,
440
+ row(line1, innerWidth),
441
+ row(line2, innerWidth),
442
+ ];
443
+ // Per-repo bars if multiple repos
444
+ if (repos.length > 1) {
445
+ lines.push(`├${H.repeat(innerWidth)}┤`);
446
+ const maxMins = repos[0].minutes;
447
+ const nameColWidth = 22;
448
+ const repoBarWidth = 20;
449
+ for (const repo of repos.slice(0, 5)) {
450
+ const name = truncate(repo.name, nameColWidth);
451
+ const padded = name + ' '.repeat(Math.max(0, nameColWidth - name.length));
452
+ const rBar = plainProgressBar(repo.minutes, maxMins, repoBarWidth);
453
+ const rTime = formatMinutes(repo.minutes).padStart(6);
454
+ const rowContent = ` ${padded} ${rBar} ${rTime}`;
455
+ lines.push(row(rowContent, innerWidth));
456
+ }
457
+ }
458
+ lines.push(`╰${H.repeat(innerWidth)}╯`);
459
+ return lines.join('\n');
460
+ }
461
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/branding/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MCP Health Check — validates auth, Supabase connectivity, and tool formatting.
3
+ *
4
+ * Usage: devclocked mcp-health
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const mcpHealthCommand: Command;
8
+ //# sourceMappingURL=mcp-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-health.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-health.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,gBAAgB,SA8DzB,CAAC"}