devclocked 2.1.1 → 2.1.2

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 (74) hide show
  1. package/dist/auth.d.ts +16 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +68 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/branding/banner.d.ts +16 -0
  6. package/dist/branding/banner.d.ts.map +1 -0
  7. package/dist/branding/banner.js +109 -0
  8. package/dist/branding/banner.js.map +1 -0
  9. package/dist/branding/dashboard.d.ts +28 -0
  10. package/dist/branding/dashboard.d.ts.map +1 -0
  11. package/dist/branding/dashboard.js +508 -0
  12. package/dist/branding/dashboard.js.map +1 -0
  13. package/dist/commands/flush.d.ts +6 -0
  14. package/dist/commands/flush.d.ts.map +1 -0
  15. package/dist/commands/flush.js +54 -0
  16. package/dist/commands/flush.js.map +1 -0
  17. package/dist/commands/login.d.ts +6 -0
  18. package/dist/commands/login.d.ts.map +1 -0
  19. package/dist/commands/login.js +108 -0
  20. package/dist/commands/login.js.map +1 -0
  21. package/dist/commands/logout.d.ts +6 -0
  22. package/dist/commands/logout.d.ts.map +1 -0
  23. package/dist/commands/logout.js +38 -0
  24. package/dist/commands/logout.js.map +1 -0
  25. package/dist/commands/mcp-health.d.ts +8 -0
  26. package/dist/commands/mcp-health.d.ts.map +1 -0
  27. package/dist/commands/mcp-health.js +75 -0
  28. package/dist/commands/mcp-health.js.map +1 -0
  29. package/dist/commands/mcp-server.d.ts +65 -0
  30. package/dist/commands/mcp-server.d.ts.map +1 -0
  31. package/dist/commands/mcp-server.js +280 -0
  32. package/dist/commands/mcp-server.js.map +1 -0
  33. package/dist/commands/session.d.ts +6 -0
  34. package/dist/commands/session.d.ts.map +1 -0
  35. package/dist/commands/session.js +90 -0
  36. package/dist/commands/session.js.map +1 -0
  37. package/dist/commands/setup.d.ts +8 -0
  38. package/dist/commands/setup.d.ts.map +1 -0
  39. package/dist/commands/setup.js +164 -0
  40. package/dist/commands/setup.js.map +1 -0
  41. package/dist/commands/status.d.ts +6 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +78 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/commands/summary.d.ts +6 -0
  46. package/dist/commands/summary.d.ts.map +1 -0
  47. package/dist/commands/summary.js +45 -0
  48. package/dist/commands/summary.js.map +1 -0
  49. package/dist/config.d.ts +13 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +22 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/index.d.ts +13 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +40 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp-utils.d.ts +15 -0
  58. package/dist/mcp-utils.d.ts.map +1 -0
  59. package/dist/mcp-utils.js +60 -0
  60. package/dist/mcp-utils.js.map +1 -0
  61. package/dist/storage/FileStorageAdapter.d.ts +19 -0
  62. package/dist/storage/FileStorageAdapter.d.ts.map +1 -0
  63. package/dist/storage/FileStorageAdapter.js +80 -0
  64. package/dist/storage/FileStorageAdapter.js.map +1 -0
  65. package/dist/terminal/WrappedShell.d.ts +24 -0
  66. package/dist/terminal/WrappedShell.d.ts.map +1 -0
  67. package/dist/terminal/WrappedShell.js +121 -0
  68. package/dist/terminal/WrappedShell.js.map +1 -0
  69. package/dist/terminal/activityDetector.d.ts +33 -0
  70. package/dist/terminal/activityDetector.d.ts.map +1 -0
  71. package/dist/terminal/activityDetector.js +158 -0
  72. package/dist/terminal/activityDetector.js.map +1 -0
  73. package/package.json +41 -7
  74. package/index.js +0 -2
@@ -0,0 +1,508 @@
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
+ exports.buildPlainVisualFull = buildPlainVisualFull;
19
+ const chalk_1 = __importDefault(require("chalk"));
20
+ const GOLD = chalk_1.default.hex('#F8D74A');
21
+ const DIM = chalk_1.default.dim;
22
+ const WHITE = chalk_1.default.white;
23
+ const CYAN = chalk_1.default.cyan;
24
+ const GREEN = chalk_1.default.green;
25
+ const GRAY = chalk_1.default.gray;
26
+ // Box-drawing characters (full dashboard only)
27
+ const TOP_LEFT = '╭';
28
+ const TOP_RIGHT = '╮';
29
+ const BOT_LEFT = '╰';
30
+ const BOT_RIGHT = '╯';
31
+ const HORIZ = '─';
32
+ const VERT = '│';
33
+ const TEE_LEFT = '├';
34
+ const TEE_RIGHT = '┤';
35
+ const INNER_WIDTH = 68;
36
+ function hLine(left, right) {
37
+ return left + HORIZ.repeat(INNER_WIDTH) + right;
38
+ }
39
+ function padLine(content, rawLen) {
40
+ const padding = Math.max(0, INNER_WIDTH - 2 - rawLen);
41
+ return GRAY(VERT) + ' ' + content + ' '.repeat(padding) + ' ' + GRAY(VERT);
42
+ }
43
+ function emptyLine() {
44
+ return padLine('', 0);
45
+ }
46
+ function renderProgressBar(filled, total, barWidth) {
47
+ if (total === 0)
48
+ return DIM('░'.repeat(barWidth));
49
+ const filledCount = Math.min(barWidth, Math.round((filled / total) * barWidth));
50
+ const emptyCount = barWidth - filledCount;
51
+ return GOLD('█'.repeat(filledCount)) + DIM('░'.repeat(emptyCount));
52
+ }
53
+ function aggregateByRepo(data) {
54
+ const map = new Map();
55
+ for (const session of data.sessions) {
56
+ for (const wb of session.work_blocks) {
57
+ const name = wb.canonical_repo_name || 'unknown';
58
+ const existing = map.get(name);
59
+ if (existing) {
60
+ existing.minutes += wb.auto_minutes;
61
+ existing.linesAdded += wb.lines_added;
62
+ existing.linesDeleted += wb.lines_deleted;
63
+ existing.ticks += wb.tick_count;
64
+ existing.tokensTotal += wb.tokens_input + wb.tokens_output;
65
+ }
66
+ else {
67
+ map.set(name, {
68
+ name,
69
+ minutes: wb.auto_minutes,
70
+ linesAdded: wb.lines_added,
71
+ linesDeleted: wb.lines_deleted,
72
+ ticks: wb.tick_count,
73
+ tokensTotal: wb.tokens_input + wb.tokens_output,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ return [...map.values()].sort((a, b) => b.minutes - a.minutes);
79
+ }
80
+ function formatMinutes(mins) {
81
+ if (mins < 1)
82
+ return '<1m';
83
+ if (mins < 60)
84
+ return `${Math.round(mins)}m`;
85
+ const h = Math.floor(mins / 60);
86
+ const m = Math.round(mins % 60);
87
+ return m > 0 ? `${h}h ${m}m` : `${h}h`;
88
+ }
89
+ function formatTokens(count) {
90
+ if (count < 1000)
91
+ return String(count);
92
+ if (count < 1000000)
93
+ return `${(count / 1000).toFixed(1)}k`;
94
+ return `${(count / 1000000).toFixed(1)}M`;
95
+ }
96
+ function truncate(str, maxLen) {
97
+ return str.length > maxLen ? str.slice(0, maxLen - 1) + '…' : str;
98
+ }
99
+ /** Get the short repo name (last segment of owner/repo) */
100
+ function shortRepoName(canonical) {
101
+ if (!canonical)
102
+ return 'unknown';
103
+ const parts = canonical.split('/');
104
+ return parts[parts.length - 1] || canonical;
105
+ }
106
+ /**
107
+ * Find the most relevant current work block:
108
+ * - Prefer active blocks (session is_active + block has no ended_at equivalent)
109
+ * - Fall back to the most recent block by effective_ended_at
110
+ */
111
+ function findCurrentBlock(data) {
112
+ let best = null;
113
+ let bestTime = '';
114
+ for (const session of data.sessions) {
115
+ for (const wb of session.work_blocks) {
116
+ // Prefer blocks in active sessions, with most recent activity
117
+ if (session.is_active && (!best || wb.effective_ended_at > bestTime)) {
118
+ best = wb;
119
+ bestTime = wb.effective_ended_at;
120
+ }
121
+ }
122
+ }
123
+ // Fallback: most recent block across all sessions
124
+ if (!best) {
125
+ for (const session of data.sessions) {
126
+ for (const wb of session.work_blocks) {
127
+ if (!best || wb.effective_ended_at > bestTime) {
128
+ best = wb;
129
+ bestTime = wb.effective_ended_at;
130
+ }
131
+ }
132
+ }
133
+ }
134
+ return best;
135
+ }
136
+ function aggregateTotals(data) {
137
+ let totalLinesAdded = 0;
138
+ let totalLinesDeleted = 0;
139
+ let totalTokens = 0;
140
+ let totalTicks = 0;
141
+ let codingMinutes = 0;
142
+ for (const session of data.sessions) {
143
+ totalTicks += session.tick_count;
144
+ for (const wb of session.work_blocks) {
145
+ totalLinesAdded += wb.lines_added;
146
+ totalLinesDeleted += wb.lines_deleted;
147
+ totalTokens += wb.tokens_input + wb.tokens_output;
148
+ if (wb.work_signature && wb.work_signature.write_count > 0) {
149
+ codingMinutes += wb.auto_minutes;
150
+ }
151
+ }
152
+ }
153
+ return { totalLinesAdded, totalLinesDeleted, totalTokens, totalTicks, codingMinutes };
154
+ }
155
+ // ─── Compact Summary (default) ───────────────────────────────────
156
+ function buildCompactSummary(data) {
157
+ const totalMinutes = data.tracked_minutes_today;
158
+ const isActive = data.sessions.some(s => s.is_active);
159
+ const repos = aggregateByRepo(data);
160
+ const repoCount = repos.length;
161
+ const sessionCount = data.sessions.length;
162
+ const totals = aggregateTotals(data);
163
+ const block = findCurrentBlock(data);
164
+ // Use a fixed box width that fits most terminals
165
+ const boxWidth = 68;
166
+ const innerWidth = boxWidth - 2; // minus left/right borders
167
+ if (!block && totalMinutes === 0) {
168
+ const lines = [
169
+ GRAY(TOP_LEFT + HORIZ.repeat(innerWidth) + TOP_RIGHT),
170
+ GRAY(VERT) + ' ' + GOLD('◉') + GRAY(' No activity recorded today') + ' '.repeat(innerWidth - 28) + GRAY(VERT),
171
+ GRAY(BOT_LEFT + HORIZ.repeat(innerWidth) + BOT_RIGHT),
172
+ ];
173
+ return lines.join('\n');
174
+ }
175
+ // Build the content for line 1: repo + bar + time + status
176
+ const repoName = shortRepoName(block?.canonical_repo_name ?? null);
177
+ const blockMins = block?.auto_minutes ?? 0;
178
+ const timeStr = formatMinutes(blockMins);
179
+ const statusText = isActive ? 'Tracking' : 'Idle';
180
+ const statusDot = isActive ? GREEN('●') : GRAY('○');
181
+ const nameDisplay = truncate(repoName, 20);
182
+ // Calculate bar width to fill remaining space
183
+ // Layout: " ◉ name bar time ● Status "
184
+ const fixedChars = 1 + 2 + nameDisplay.length + 2 + 2 + timeStr.length + 2 + 2 + statusText.length + 1;
185
+ const barWidth = Math.max(6, innerWidth - fixedChars);
186
+ const bar = renderProgressBar(blockMins, totalMinutes, barWidth);
187
+ // Build line 2 parts (plain text, measured accurately)
188
+ const linesStr = (totals.totalLinesAdded || totals.totalLinesDeleted)
189
+ ? `+${formatTokens(totals.totalLinesAdded)}/-${formatTokens(totals.totalLinesDeleted)}`
190
+ : '';
191
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
192
+ const totalParts = [
193
+ formatMinutes(totalMinutes),
194
+ `${repoCount} repo${repoCount !== 1 ? 's' : ''}`,
195
+ `${workBlockCount} block${workBlockCount !== 1 ? 's' : ''}`,
196
+ ];
197
+ if (linesStr)
198
+ totalParts.push(linesStr);
199
+ totalParts.push(`${formatTokens(totals.totalTokens)} tok`);
200
+ const totalsPlain = 'Today: ' + totalParts.join(' \u00b7 ');
201
+ const expandHint = '\u25BC \u2325O';
202
+ // Truncate totals if it would overflow the box (leave room for expand hint)
203
+ const hintLen = expandHint.length + 2; // 2 gap before hint
204
+ const maxTotalsLen = innerWidth - 4 - hintLen; // 2 left pad + 2 right pad + hint
205
+ const truncatedTotals = totalsPlain.length > maxTotalsLen
206
+ ? totalsPlain.slice(0, maxTotalsLen - 1) + '\u2026'
207
+ : totalsPlain;
208
+ // Measure display widths and build padded lines
209
+ // innerWidth = characters between the two │ borders
210
+ // Each line needs 1 char left pad + content + right pad to fill innerWidth
211
+ // Line 1 plain: " ◉ name ████░░░ time ● Status"
212
+ const line1Plain = ` \u25C9 ${nameDisplay} ${'X'.repeat(barWidth)} ${timeStr} \u25CF ${statusText}`;
213
+ const line1Cols = line1Plain.length;
214
+ const line1Pad = Math.max(1, innerWidth - line1Cols);
215
+ // Line 2 plain: " Today: 1h 3m · 2 repos · ... ▼ ⌥O"
216
+ const line2LeftPlain = ` ${truncatedTotals}`;
217
+ const line2Plain = line2LeftPlain + expandHint;
218
+ const line2Pad = 1; // right border pad
219
+ const line2Gap = Math.max(2, innerWidth - line2LeftPlain.length - expandHint.length - line2Pad);
220
+ // Render box
221
+ const lines = [
222
+ GRAY(TOP_LEFT + HORIZ.repeat(innerWidth) + TOP_RIGHT),
223
+ GRAY(VERT) +
224
+ ' ' + GOLD('\u25C9') + ' ' + WHITE(nameDisplay) + ' ' + bar + ' ' + CYAN(timeStr) + ' ' + statusDot + ' ' + (isActive ? GREEN(statusText) : GRAY(statusText)) +
225
+ ' '.repeat(line1Pad) + GRAY(VERT),
226
+ GRAY(VERT) +
227
+ ' ' + GRAY(truncatedTotals) +
228
+ ' '.repeat(line2Gap) + DIM(expandHint) +
229
+ ' '.repeat(line2Pad) + GRAY(VERT),
230
+ ];
231
+ return lines.join('\n');
232
+ }
233
+ function renderCompactSummary(data) {
234
+ console.log(buildCompactSummary(data));
235
+ }
236
+ // ─── Full Dashboard (--full flag) ────────────────────────────────
237
+ function buildFullDashboard(data) {
238
+ const repos = aggregateByRepo(data);
239
+ const totalMinutes = data.tracked_minutes_today;
240
+ const sessionCount = data.sessions.length;
241
+ const isActive = data.sessions.some(s => s.is_active);
242
+ const totals = aggregateTotals(data);
243
+ const lines = [];
244
+ // Top border
245
+ lines.push(GRAY(hLine(TOP_LEFT, TOP_RIGHT)));
246
+ // Header
247
+ const statusDot = isActive ? GREEN('●') + ' Tracking' : GRAY('○') + ' Idle';
248
+ const headerLeft = GOLD('◉') + ' ' + GOLD('DevClocked');
249
+ const headerLeftRaw = 12;
250
+ const statusRaw = isActive ? 10 : 6;
251
+ const gap = INNER_WIDTH - 2 - headerLeftRaw - statusRaw;
252
+ lines.push(GRAY(VERT) + ' ' + headerLeft + ' '.repeat(Math.max(1, gap)) + statusDot + ' ' + GRAY(VERT));
253
+ // Divider
254
+ lines.push(GRAY(hLine(TEE_LEFT, TEE_RIGHT)));
255
+ lines.push(emptyLine());
256
+ // Summary line
257
+ const sessionTime = formatMinutes(totalMinutes);
258
+ const codingTime = formatMinutes(totals.codingMinutes);
259
+ const linesChanged = totals.totalLinesAdded || totals.totalLinesDeleted
260
+ ? `${GREEN('+' + totals.totalLinesAdded)} / ${chalk_1.default.red('-' + totals.totalLinesDeleted)}`
261
+ : GRAY('no changes');
262
+ const summaryText = `⏱ ${WHITE(sessionTime)} session ${WHITE(codingTime)} coding ${linesChanged}`;
263
+ const summaryRaw = `⏱ ${sessionTime} session ${codingTime} coding +${totals.totalLinesAdded} / -${totals.totalLinesDeleted}`.length;
264
+ lines.push(padLine(summaryText, summaryRaw));
265
+ lines.push(emptyLine());
266
+ // Repo breakdown
267
+ if (repos.length > 0) {
268
+ const maxMinutes = repos[0].minutes;
269
+ const BAR_WIDTH = 28;
270
+ const NAME_WIDTH = 26;
271
+ for (const repo of repos.slice(0, 6)) {
272
+ const name = truncate(repo.name, NAME_WIDTH);
273
+ const bar = renderProgressBar(repo.minutes, maxMinutes, BAR_WIDTH);
274
+ const time = formatMinutes(repo.minutes);
275
+ const namePadded = name + ' '.repeat(Math.max(0, NAME_WIDTH - name.length));
276
+ const timeStr = time.padStart(6);
277
+ const lineText = `${WHITE(namePadded)} ${bar} ${CYAN(timeStr)}`;
278
+ const rawLen = NAME_WIDTH + 1 + BAR_WIDTH + 1 + 6;
279
+ lines.push(padLine(lineText, rawLen));
280
+ }
281
+ }
282
+ else {
283
+ lines.push(padLine(GRAY('No activity recorded'), 20));
284
+ }
285
+ lines.push(emptyLine());
286
+ // Footer
287
+ const ticksStr = `Ticks ${WHITE(String(totals.totalTicks))}`;
288
+ const tokensStr = `Tokens ${WHITE(formatTokens(totals.totalTokens))}`;
289
+ const sessionsStr = `Sessions ${WHITE(String(sessionCount))}`;
290
+ const footerText = `${GRAY(ticksStr)} ${GRAY(tokensStr)} ${GRAY(sessionsStr)}`;
291
+ const footerRaw = `Ticks ${totals.totalTicks} Tokens ${formatTokens(totals.totalTokens)} Sessions ${sessionCount}`.length;
292
+ lines.push(padLine(footerText, footerRaw));
293
+ lines.push(GRAY(hLine(BOT_LEFT, BOT_RIGHT)));
294
+ return '\n' + lines.map(l => ' ' + l).join('\n') + '\n';
295
+ }
296
+ function renderFullDashboard(data) {
297
+ console.log(buildFullDashboard(data));
298
+ }
299
+ function buildPlainWeeklySummary(days) {
300
+ const lines = ['Weekly Summary (7 days)', ''];
301
+ let totalMinutes = 0;
302
+ let totalSessions = 0;
303
+ let totalLinesAdded = 0;
304
+ let totalLinesDeleted = 0;
305
+ for (const { date, data } of days) {
306
+ const d = new Date(date + 'T12:00:00'); // noon to avoid TZ issues
307
+ const dayLabel = d.toLocaleDateString('en-US', { weekday: 'short', month: 'numeric', day: 'numeric' });
308
+ const mins = data.tracked_minutes_today ?? 0;
309
+ const sessions = data.sessions?.length ?? 0;
310
+ let linesAdded = 0;
311
+ let linesDeleted = 0;
312
+ if (data.sessions) {
313
+ for (const s of data.sessions) {
314
+ for (const wb of s.work_blocks) {
315
+ linesAdded += wb.lines_added;
316
+ linesDeleted += wb.lines_deleted;
317
+ }
318
+ }
319
+ }
320
+ totalMinutes += mins;
321
+ totalSessions += sessions;
322
+ totalLinesAdded += linesAdded;
323
+ totalLinesDeleted += linesDeleted;
324
+ if (mins === 0 && sessions === 0) {
325
+ lines.push(`${dayLabel}: —`);
326
+ continue;
327
+ }
328
+ const parts = [formatMinutes(mins), `${sessions} session${sessions !== 1 ? 's' : ''}`];
329
+ if (linesAdded > 0 || linesDeleted > 0) {
330
+ parts.push(`+${linesAdded.toLocaleString()}/-${linesDeleted.toLocaleString()} lines`);
331
+ }
332
+ lines.push(`${dayLabel}: ${parts.join(' | ')}`);
333
+ }
334
+ lines.push('');
335
+ const totalParts = [formatMinutes(totalMinutes), `${totalSessions} sessions`];
336
+ if (totalLinesAdded > 0 || totalLinesDeleted > 0) {
337
+ totalParts.push(`+${totalLinesAdded.toLocaleString()}/-${totalLinesDeleted.toLocaleString()} lines`);
338
+ }
339
+ lines.push(`Total: ${totalParts.join(' | ')}`);
340
+ return lines.join('\n');
341
+ }
342
+ // ─── Plain-text Summary (for MCP / AI tools) ────────────────────
343
+ function buildPlainSummary(data) {
344
+ const totalMinutes = data.tracked_minutes_today;
345
+ const isActive = data.sessions.some(s => s.is_active);
346
+ const repos = aggregateByRepo(data);
347
+ const totals = aggregateTotals(data);
348
+ const block = findCurrentBlock(data);
349
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
350
+ if (!block && totalMinutes === 0) {
351
+ return 'No coding activity recorded today.';
352
+ }
353
+ const lines = [];
354
+ // Status line
355
+ const status = isActive ? 'Tracking' : 'Idle';
356
+ lines.push(`Status: ${status} | Today: ${formatMinutes(totalMinutes)}`);
357
+ // Current block
358
+ if (block) {
359
+ const name = block.canonical_repo_name || 'unknown';
360
+ lines.push(`Current: ${name} (${formatMinutes(block.auto_minutes)})`);
361
+ }
362
+ // Stats
363
+ const stats = [
364
+ `${repos.length} repo${repos.length !== 1 ? 's' : ''}`,
365
+ `${workBlockCount} work block${workBlockCount !== 1 ? 's' : ''}`,
366
+ `${data.sessions.length} session${data.sessions.length !== 1 ? 's' : ''}`,
367
+ ];
368
+ if (totals.totalLinesAdded || totals.totalLinesDeleted) {
369
+ stats.push(`+${totals.totalLinesAdded}/-${totals.totalLinesDeleted} lines`);
370
+ }
371
+ if (totals.totalTokens > 0) {
372
+ stats.push(`${formatTokens(totals.totalTokens)} tokens`);
373
+ }
374
+ lines.push(stats.join(' · '));
375
+ // Per-repo breakdown
376
+ if (repos.length > 1) {
377
+ lines.push('');
378
+ lines.push('Repos:');
379
+ for (const repo of repos.slice(0, 6)) {
380
+ lines.push(` ${repo.name}: ${formatMinutes(repo.minutes)}`);
381
+ }
382
+ }
383
+ return lines.join('\n');
384
+ }
385
+ // ─── Plain Visual Summary (for Claude Code / non-TTY with bars) ──
386
+ function plainProgressBar(filled, total, barWidth) {
387
+ if (total === 0)
388
+ return '░'.repeat(barWidth);
389
+ const filledCount = Math.min(barWidth, Math.round((filled / total) * barWidth));
390
+ const emptyCount = barWidth - filledCount;
391
+ return '█'.repeat(filledCount) + '░'.repeat(emptyCount);
392
+ }
393
+ function buildPlainVisualSummary(data) {
394
+ const totalMinutes = data.tracked_minutes_today;
395
+ const isActive = data.sessions.some(s => s.is_active);
396
+ const repos = aggregateByRepo(data);
397
+ const totals = aggregateTotals(data);
398
+ const block = findCurrentBlock(data);
399
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
400
+ const H = '─';
401
+ const V = '│';
402
+ // Helper to build a padded row that always aligns the right border
403
+ function row(content, width) {
404
+ const trimmed = content.length > width ? content.slice(0, width - 1) + '…' : content;
405
+ return `${V}${trimmed}${' '.repeat(Math.max(0, width - trimmed.length))}${V}`;
406
+ }
407
+ // Determine box width from content
408
+ const repoName = shortRepoName(block?.canonical_repo_name ?? null);
409
+ const blockMins = block?.auto_minutes ?? 0;
410
+ const timeStr = formatMinutes(blockMins);
411
+ const statusText = isActive ? '● Tracking' : '○ Idle';
412
+ const nameDisplay = truncate(repoName, 18);
413
+ // Calculate inner width to fit line 1 nicely (min 56)
414
+ const barWidth = 20;
415
+ const line1Len = 3 + nameDisplay.length + 2 + barWidth + 2 + timeStr.length + 2 + statusText.length + 2;
416
+ const innerWidth = Math.max(56, line1Len);
417
+ if (!block && totalMinutes === 0) {
418
+ return [
419
+ `╭${H.repeat(innerWidth)}╮`,
420
+ row(' ◉ No activity recorded today', innerWidth),
421
+ `╰${H.repeat(innerWidth)}╯`,
422
+ ].join('\n');
423
+ }
424
+ const bar = plainProgressBar(blockMins, totalMinutes, barWidth);
425
+ const line1 = ` ◉ ${nameDisplay} ${bar} ${timeStr} ${statusText}`;
426
+ // Line 2: Today stats
427
+ const linesStr = (totals.totalLinesAdded || totals.totalLinesDeleted)
428
+ ? `+${formatTokens(totals.totalLinesAdded)}/-${formatTokens(totals.totalLinesDeleted)}`
429
+ : '';
430
+ const parts = [
431
+ formatMinutes(totalMinutes),
432
+ `${repos.length} repo${repos.length !== 1 ? 's' : ''}`,
433
+ `${workBlockCount} block${workBlockCount !== 1 ? 's' : ''}`,
434
+ ];
435
+ if (linesStr)
436
+ parts.push(linesStr);
437
+ parts.push(`${formatTokens(totals.totalTokens)} tok`);
438
+ const line2 = ` Today: ${parts.join(' · ')}`;
439
+ const lines = [
440
+ `╭${H.repeat(innerWidth)}╮`,
441
+ row(line1, innerWidth),
442
+ row(line2, innerWidth),
443
+ ];
444
+ // Per-repo bars if multiple repos
445
+ if (repos.length > 1) {
446
+ lines.push(`├${H.repeat(innerWidth)}┤`);
447
+ const maxMins = repos[0].minutes;
448
+ const nameColWidth = 22;
449
+ const repoBarWidth = 20;
450
+ for (const repo of repos.slice(0, 5)) {
451
+ const name = truncate(repo.name, nameColWidth);
452
+ const padded = name + ' '.repeat(Math.max(0, nameColWidth - name.length));
453
+ const rBar = plainProgressBar(repo.minutes, maxMins, repoBarWidth);
454
+ const rTime = formatMinutes(repo.minutes).padStart(6);
455
+ const rowContent = ` ${padded} ${rBar} ${rTime}`;
456
+ lines.push(row(rowContent, innerWidth));
457
+ }
458
+ }
459
+ lines.push(`╰${H.repeat(innerWidth)}╯`);
460
+ return lines.join('\n');
461
+ }
462
+ function buildPlainVisualFull(data) {
463
+ const totalMinutes = data.tracked_minutes_today;
464
+ const isActive = data.sessions.some(s => s.is_active);
465
+ const repos = aggregateByRepo(data);
466
+ const totals = aggregateTotals(data);
467
+ const sessionCount = data.sessions.length;
468
+ const workBlockCount = data.sessions.reduce((sum, s) => sum + s.work_blocks.length, 0);
469
+ const H = '─';
470
+ const V = '│';
471
+ const innerWidth = 60;
472
+ function row(content) {
473
+ const trimmed = content.length > innerWidth ? content.slice(0, innerWidth - 1) + '…' : content;
474
+ return `${V}${trimmed}${' '.repeat(Math.max(0, innerWidth - trimmed.length))}${V}`;
475
+ }
476
+ if (totalMinutes === 0 && repos.length === 0) {
477
+ return [
478
+ `╭${H.repeat(innerWidth)}╮`,
479
+ row(' ◉ No activity recorded today'),
480
+ `╰${H.repeat(innerWidth)}╯`,
481
+ ].join('\n');
482
+ }
483
+ const statusText = isActive ? '● Tracking' : '○ Idle';
484
+ const linesChanged = (totals.totalLinesAdded || totals.totalLinesDeleted)
485
+ ? `+${totals.totalLinesAdded.toLocaleString()}/-${totals.totalLinesDeleted.toLocaleString()}`
486
+ : 'no changes';
487
+ const lines = [
488
+ `╭${H.repeat(innerWidth)}╮`,
489
+ row(` ◉ DevClocked · ${formatMinutes(totalMinutes)} tracked · ${statusText}`),
490
+ row(` ${linesChanged} · ${formatTokens(totals.totalTokens)} tokens · ${sessionCount} session${sessionCount !== 1 ? 's' : ''} · ${totals.totalTicks} ticks`),
491
+ ];
492
+ if (repos.length > 0) {
493
+ lines.push(`├${H.repeat(innerWidth)}┤`);
494
+ const maxMins = repos[0].minutes;
495
+ const nameColWidth = 24;
496
+ const repoBarWidth = 20;
497
+ for (const repo of repos.slice(0, 8)) {
498
+ const name = truncate(repo.name, nameColWidth);
499
+ const padded = name + ' '.repeat(Math.max(0, nameColWidth - name.length));
500
+ const rBar = plainProgressBar(repo.minutes, maxMins, repoBarWidth);
501
+ const rTime = formatMinutes(repo.minutes).padStart(6);
502
+ lines.push(row(` ${padded} ${rBar} ${rTime}`));
503
+ }
504
+ }
505
+ lines.push(`╰${H.repeat(innerWidth)}╯`);
506
+ return lines.join('\n');
507
+ }
508
+ //# 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,6 @@
1
+ /**
2
+ * Flush command - Force queue flush
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const flushCommand: Command;
6
+ //# sourceMappingURL=flush.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush.d.ts","sourceRoot":"","sources":["../../src/commands/flush.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0DpC,eAAO,MAAM,YAAY,SAEJ,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * Flush command - Force queue flush
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.flushCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const tracker_core_1 = require("@devclocked/tracker-core");
9
+ const FileStorageAdapter_1 = require("../storage/FileStorageAdapter");
10
+ const config_1 = require("../config");
11
+ const banner_1 = require("../branding/banner");
12
+ async function flushQueue() {
13
+ const storage = new FileStorageAdapter_1.FileStorageAdapter();
14
+ const client = new tracker_core_1.TrackerClient({
15
+ supabaseUrl: config_1.SUPABASE_URL,
16
+ supabaseAnonKey: config_1.SUPABASE_ANON_KEY,
17
+ source: 'cli',
18
+ clientId: `cli-${Date.now()}`,
19
+ debug: false,
20
+ }, storage);
21
+ client.stopAutoProcessing();
22
+ const isAuth = await client.isAuthenticated();
23
+ if (!isAuth) {
24
+ (0, banner_1.printError)('Not authenticated. Run: devclocked login');
25
+ client.destroy();
26
+ process.exit(1);
27
+ }
28
+ try {
29
+ const statsBefore = await client.getQueueStats();
30
+ (0, banner_1.printInfo)(`Queue has ${statsBefore.totalItems} pending items`);
31
+ if (statsBefore.totalItems === 0) {
32
+ (0, banner_1.printInfo)('Nothing to flush');
33
+ client.destroy();
34
+ process.exit(0);
35
+ }
36
+ (0, banner_1.printInfo)('Flushing queue...');
37
+ await client.flushQueue();
38
+ const statsAfter = await client.getQueueStats();
39
+ const processed = statsBefore.totalItems - statsAfter.totalItems;
40
+ (0, banner_1.printSuccess)(`Processed ${processed} items`);
41
+ if (statsAfter.totalItems > 0) {
42
+ (0, banner_1.printInfo)(`${statsAfter.totalItems} items still pending (will retry)`);
43
+ }
44
+ }
45
+ catch (error) {
46
+ (0, banner_1.printError)(`Flush failed: ${error.message}`);
47
+ }
48
+ client.destroy();
49
+ process.exit(0);
50
+ }
51
+ exports.flushCommand = new commander_1.Command('flush')
52
+ .description('Force flush the tick queue')
53
+ .action(flushQueue);
54
+ //# sourceMappingURL=flush.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush.js","sourceRoot":"","sources":["../../src/commands/flush.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAoC;AACpC,2DAAyD;AACzD,sEAAmE;AACnE,sCAA4D;AAC5D,+CAI4B;AAE5B,KAAK,UAAU,UAAU;IACvB,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,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,mBAAU,EAAC,0CAA0C,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QACjD,IAAA,kBAAS,EAAC,aAAa,WAAW,CAAC,UAAU,gBAAgB,CAAC,CAAC;QAE/D,IAAI,WAAW,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACjC,IAAA,kBAAS,EAAC,kBAAkB,CAAC,CAAC;YAC9B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAA,kBAAS,EAAC,mBAAmB,CAAC,CAAC;QAC/B,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;QAEjE,IAAA,qBAAY,EAAC,aAAa,SAAS,QAAQ,CAAC,CAAC;QAE7C,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAA,kBAAS,EAAC,GAAG,UAAU,CAAC,UAAU,mCAAmC,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAA,mBAAU,EAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAEY,QAAA,YAAY,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Login command - Manual API key entry
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const loginCommand: Command;
6
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4GpC,eAAO,MAAM,YAAY,SAET,CAAC"}