@devclocked/cli 1.0.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.
Files changed (46) hide show
  1. package/README.md +78 -0
  2. package/dist/branding/banner.d.ts +16 -0
  3. package/dist/branding/banner.d.ts.map +1 -0
  4. package/dist/branding/banner.js +109 -0
  5. package/dist/branding/banner.js.map +1 -0
  6. package/dist/commands/flush.d.ts +6 -0
  7. package/dist/commands/flush.d.ts.map +1 -0
  8. package/dist/commands/flush.js +54 -0
  9. package/dist/commands/flush.js.map +1 -0
  10. package/dist/commands/login.d.ts +6 -0
  11. package/dist/commands/login.d.ts.map +1 -0
  12. package/dist/commands/login.js +106 -0
  13. package/dist/commands/login.js.map +1 -0
  14. package/dist/commands/logout.d.ts +6 -0
  15. package/dist/commands/logout.d.ts.map +1 -0
  16. package/dist/commands/logout.js +38 -0
  17. package/dist/commands/logout.js.map +1 -0
  18. package/dist/commands/session.d.ts +6 -0
  19. package/dist/commands/session.d.ts.map +1 -0
  20. package/dist/commands/session.js +90 -0
  21. package/dist/commands/session.js.map +1 -0
  22. package/dist/commands/status.d.ts +6 -0
  23. package/dist/commands/status.d.ts.map +1 -0
  24. package/dist/commands/status.js +78 -0
  25. package/dist/commands/status.js.map +1 -0
  26. package/dist/config.d.ts +13 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +22 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/index.d.ts +13 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +31 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/storage/FileStorageAdapter.d.ts +19 -0
  35. package/dist/storage/FileStorageAdapter.d.ts.map +1 -0
  36. package/dist/storage/FileStorageAdapter.js +80 -0
  37. package/dist/storage/FileStorageAdapter.js.map +1 -0
  38. package/dist/terminal/WrappedShell.d.ts +24 -0
  39. package/dist/terminal/WrappedShell.d.ts.map +1 -0
  40. package/dist/terminal/WrappedShell.js +121 -0
  41. package/dist/terminal/WrappedShell.js.map +1 -0
  42. package/dist/terminal/activityDetector.d.ts +33 -0
  43. package/dist/terminal/activityDetector.d.ts.map +1 -0
  44. package/dist/terminal/activityDetector.js +158 -0
  45. package/dist/terminal/activityDetector.js.map +1 -0
  46. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # DevClocked CLI
2
+
3
+ Terminal time tracking for developers. Track your terminal activity without logging commands.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @devclocked/cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Login
14
+
15
+ Authenticate with your DevClocked API key:
16
+
17
+ ```bash
18
+ devclocked login
19
+ ```
20
+
21
+ Get your API key from: https://app.devclocked.com/settings
22
+
23
+ ### Start Tracking
24
+
25
+ Start a tracked terminal session:
26
+
27
+ ```bash
28
+ devclocked session
29
+ ```
30
+
31
+ This spawns a wrapped shell that tracks activity timing. Type `exit` to end the session.
32
+
33
+ ### Check Status
34
+
35
+ View your current tracking status:
36
+
37
+ ```bash
38
+ devclocked status
39
+ ```
40
+
41
+ ### Flush Queue
42
+
43
+ Force-send any pending ticks:
44
+
45
+ ```bash
46
+ devclocked flush
47
+ ```
48
+
49
+ ### Logout
50
+
51
+ Clear your credentials:
52
+
53
+ ```bash
54
+ devclocked logout
55
+ ```
56
+
57
+ ## Privacy Guarantees
58
+
59
+ - Commands are NOT logged
60
+ - Arguments are NOT logged
61
+ - Output is NOT stored
62
+ - Environment variables are NOT captured
63
+ - Only tracked: timestamps, working directory, git repo context
64
+
65
+ ## Development
66
+
67
+ ```bash
68
+ # From monorepo root
69
+ npm run cli:build
70
+
71
+ # Link for local testing
72
+ cd packages/cli
73
+ npm link
74
+
75
+ # Now you can use `devclocked` command
76
+ devclocked --help
77
+ ```
78
+
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Branding and visual output for DevClocked CLI
3
+ */
4
+ export declare function printBanner(): void;
5
+ export declare function printCompactBanner(): void;
6
+ export declare function printSessionStart(): void;
7
+ export declare function printSessionEnd(): void;
8
+ export declare function printSuccess(message: string): void;
9
+ export declare function printError(message: string): void;
10
+ export declare function printWarning(message: string): void;
11
+ export declare function printInfo(message: string): void;
12
+ export declare function printStatus(label: string, value: string, success?: boolean): void;
13
+ export declare function printHeader(title: string): void;
14
+ export declare function formatDuration(seconds: number): string;
15
+ export declare function formatTimeAgo(timestamp: string | number): string;
16
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/branding/banner.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2BH,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI,CAG9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAUhE"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Branding and visual output for DevClocked CLI
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.printBanner = printBanner;
10
+ exports.printCompactBanner = printCompactBanner;
11
+ exports.printSessionStart = printSessionStart;
12
+ exports.printSessionEnd = printSessionEnd;
13
+ exports.printSuccess = printSuccess;
14
+ exports.printError = printError;
15
+ exports.printWarning = printWarning;
16
+ exports.printInfo = printInfo;
17
+ exports.printStatus = printStatus;
18
+ exports.printHeader = printHeader;
19
+ exports.formatDuration = formatDuration;
20
+ exports.formatTimeAgo = formatTimeAgo;
21
+ const chalk_1 = __importDefault(require("chalk"));
22
+ const config_1 = require("../config");
23
+ const YELLOW = chalk_1.default.hex('#F8D74A');
24
+ const GRAY = chalk_1.default.gray;
25
+ const WHITE = chalk_1.default.white;
26
+ const GREEN = chalk_1.default.green;
27
+ const RED = chalk_1.default.red;
28
+ const CYAN = chalk_1.default.cyan;
29
+ const LOGO = `
30
+ ██████╗ ███████╗██╗ ██╗ ██████╗██╗ ██████╗ ██████╗██╗ ██╗███████╗██████╗
31
+ ██╔══██╗██╔════╝██║ ██║██╔════╝██║ ██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗
32
+ ██║ ██║█████╗ ██║ ██║██║ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║ ██║
33
+ ██║ ██║██╔══╝ ╚██╗ ██╔╝██║ ██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║ ██║
34
+ ██████╔╝███████╗ ╚████╔╝ ╚██████╗███████╗╚██████╔╝╚██████╗██║ ██╗███████╗██████╔╝
35
+ ╚═════╝ ╚══════╝ ╚═══╝ ╚═════╝╚══════╝ ╚═════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═════╝
36
+ `.trim();
37
+ const LOGO_COMPACT = `
38
+ ╔══════════════════════════════════╗
39
+ ║ ${YELLOW('DevClocked')} ${GRAY('Terminal')} ║
40
+ ╚══════════════════════════════════╝
41
+ `.trim();
42
+ function printBanner() {
43
+ console.log(YELLOW(LOGO));
44
+ console.log();
45
+ console.log(WHITE('DevClocked Terminal Session'));
46
+ console.log(GRAY(`Tracking active development · Privacy-first · v${config_1.CLI_VERSION}`));
47
+ }
48
+ function printCompactBanner() {
49
+ console.log(LOGO_COMPACT);
50
+ }
51
+ function printSessionStart() {
52
+ console.log();
53
+ console.log(YELLOW('━'.repeat(50)));
54
+ console.log(YELLOW(' DevClocked Terminal Session'));
55
+ console.log(GRAY(' Tracking active development · Privacy-first'));
56
+ console.log(YELLOW('━'.repeat(50)));
57
+ console.log();
58
+ }
59
+ function printSessionEnd() {
60
+ console.log();
61
+ console.log(YELLOW('━'.repeat(50)));
62
+ console.log(GRAY(' DevClocked session ended'));
63
+ console.log(YELLOW('━'.repeat(50)));
64
+ console.log();
65
+ }
66
+ function printSuccess(message) {
67
+ console.log(GREEN('✓') + ' ' + WHITE(message));
68
+ }
69
+ function printError(message) {
70
+ console.log(RED('✗') + ' ' + WHITE(message));
71
+ }
72
+ function printWarning(message) {
73
+ console.log(YELLOW('⚠') + ' ' + WHITE(message));
74
+ }
75
+ function printInfo(message) {
76
+ console.log(GRAY('•') + ' ' + WHITE(message));
77
+ }
78
+ function printStatus(label, value, success = true) {
79
+ const icon = success ? GREEN('✓') : GRAY('○');
80
+ console.log(`${icon} ${WHITE(label)}: ${CYAN(value)}`);
81
+ }
82
+ function printHeader(title) {
83
+ console.log();
84
+ console.log(YELLOW(`DevClocked CLI — ${title}`));
85
+ console.log();
86
+ }
87
+ function formatDuration(seconds) {
88
+ if (seconds < 60)
89
+ return `${seconds}s`;
90
+ if (seconds < 3600)
91
+ return `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
92
+ const hours = Math.floor(seconds / 3600);
93
+ const mins = Math.floor((seconds % 3600) / 60);
94
+ return `${hours}h ${mins}m`;
95
+ }
96
+ function formatTimeAgo(timestamp) {
97
+ const now = Date.now();
98
+ const then = typeof timestamp === 'string' ? new Date(timestamp).getTime() : timestamp;
99
+ const diffMs = now - then;
100
+ const diffS = Math.floor(diffMs / 1000);
101
+ if (diffS < 60)
102
+ return `${diffS}s ago`;
103
+ if (diffS < 3600)
104
+ return `${Math.floor(diffS / 60)}m ago`;
105
+ if (diffS < 86400)
106
+ return `${Math.floor(diffS / 3600)}h ago`;
107
+ return `${Math.floor(diffS / 86400)}d ago`;
108
+ }
109
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/branding/banner.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AA2BH,kCAKC;AAED,gDAEC;AAED,8CAOC;AAED,0CAMC;AAED,oCAEC;AAED,gCAEC;AAED,oCAEC;AAED,8BAEC;AAED,kCAGC;AAED,kCAIC;AAED,wCAMC;AAED,sCAUC;AAlGD,kDAA0B;AAC1B,sCAAwC;AAExC,MAAM,MAAM,GAAG,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACpC,MAAM,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC;AACxB,MAAM,KAAK,GAAG,eAAK,CAAC,KAAK,CAAC;AAC1B,MAAM,KAAK,GAAG,eAAK,CAAC,KAAK,CAAC;AAC1B,MAAM,GAAG,GAAG,eAAK,CAAC,GAAG,CAAC;AACtB,MAAM,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC;AAExB,MAAM,IAAI,GAAG;;;;;;;CAOZ,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,YAAY,GAAG;;QAEb,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC;;CAE/C,CAAC,IAAI,EAAE,CAAC;AAET,SAAgB,WAAW;IACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,oBAAW,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,OAAO,GAAG,IAAI;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC;AAC9B,CAAC;AAED,SAAgB,aAAa,CAAC,SAA0B;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAExC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC;IAC1D,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;AAC7C,CAAC"}
@@ -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;AAyGpC,eAAO,MAAM,YAAY,SAET,CAAC"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * Login command - Manual API key entry
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.loginCommand = void 0;
10
+ const commander_1 = require("commander");
11
+ const readline_1 = require("readline");
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const tracker_core_1 = require("@devclocked/tracker-core");
14
+ const FileStorageAdapter_1 = require("../storage/FileStorageAdapter");
15
+ const config_1 = require("../config");
16
+ const banner_1 = require("../branding/banner");
17
+ async function promptApiKey() {
18
+ return new Promise((resolve) => {
19
+ const rl = (0, readline_1.createInterface)({
20
+ input: process.stdin,
21
+ output: process.stdout,
22
+ });
23
+ // Hide input for security
24
+ process.stdout.write(chalk_1.default.yellow('Enter your DevClocked API key: '));
25
+ let key = '';
26
+ const stdin = process.stdin;
27
+ const originalRawMode = stdin.isRaw;
28
+ if (stdin.isTTY) {
29
+ stdin.setRawMode(true);
30
+ stdin.resume();
31
+ stdin.setEncoding('utf8');
32
+ const onData = (char) => {
33
+ if (char === '\n' || char === '\r') {
34
+ stdin.setRawMode(originalRawMode ?? false);
35
+ stdin.removeListener('data', onData);
36
+ process.stdout.write('\n');
37
+ rl.close();
38
+ resolve(key);
39
+ }
40
+ else if (char === '\u0003') {
41
+ // Ctrl+C
42
+ process.exit(0);
43
+ }
44
+ else if (char === '\u007F' || char === '\b') {
45
+ // Backspace
46
+ if (key.length > 0) {
47
+ key = key.slice(0, -1);
48
+ process.stdout.write('\b \b');
49
+ }
50
+ }
51
+ else {
52
+ key += char;
53
+ process.stdout.write('*');
54
+ }
55
+ };
56
+ stdin.on('data', onData);
57
+ }
58
+ else {
59
+ rl.question('', (answer) => {
60
+ rl.close();
61
+ resolve(answer);
62
+ });
63
+ }
64
+ });
65
+ }
66
+ async function login() {
67
+ (0, banner_1.printBanner)();
68
+ console.log();
69
+ (0, banner_1.printInfo)('Authenticate with your DevClocked API key.');
70
+ (0, banner_1.printInfo)('Get your API key from: https://app.devclocked.com/settings');
71
+ console.log();
72
+ const apiKey = await promptApiKey();
73
+ if (!apiKey || !apiKey.startsWith('dck_')) {
74
+ (0, banner_1.printError)('Invalid API key format. Keys should start with "dck_"');
75
+ process.exit(1);
76
+ }
77
+ console.log();
78
+ (0, banner_1.printInfo)('Validating API key...');
79
+ const storage = new FileStorageAdapter_1.FileStorageAdapter();
80
+ const client = new tracker_core_1.TrackerClient({
81
+ supabaseUrl: config_1.SUPABASE_URL,
82
+ supabaseAnonKey: config_1.SUPABASE_ANON_KEY,
83
+ source: 'cli',
84
+ clientId: `cli-${Date.now()}`,
85
+ debug: false,
86
+ }, storage);
87
+ client.stopAutoProcessing();
88
+ try {
89
+ await client.authenticate(apiKey);
90
+ const authState = await client.getAuthState();
91
+ console.log();
92
+ (0, banner_1.printSuccess)(`Authenticated as ${chalk_1.default.cyan(authState?.email || 'unknown')}`);
93
+ (0, banner_1.printSuccess)('You can now start tracking with: devclocked session');
94
+ client.destroy();
95
+ process.exit(0);
96
+ }
97
+ catch (error) {
98
+ (0, banner_1.printError)(`Authentication failed: ${error.message}`);
99
+ client.destroy();
100
+ process.exit(1);
101
+ }
102
+ }
103
+ exports.loginCommand = new commander_1.Command('login')
104
+ .description('Authenticate with your DevClocked API key')
105
+ .action(login);
106
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Logout command - Clear credentials
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const logoutCommand: Command;
6
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqCpC,eAAO,MAAM,aAAa,SAET,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Logout command - Clear credentials
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logoutCommand = 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 logout() {
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.printInfo)('You are not currently logged in.');
25
+ client.destroy();
26
+ process.exit(0);
27
+ }
28
+ await client.logout();
29
+ await storage.clear();
30
+ (0, banner_1.printSuccess)('Logged out successfully.');
31
+ (0, banner_1.printInfo)('Your local credentials have been cleared.');
32
+ client.destroy();
33
+ process.exit(0);
34
+ }
35
+ exports.logoutCommand = new commander_1.Command('logout')
36
+ .description('Clear your DevClocked credentials')
37
+ .action(logout);
38
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAoC;AAEpC,2DAAyD;AACzD,sEAAmE;AACnE,sCAA4D;AAC5D,+CAA6D;AAE7D,KAAK,UAAU,MAAM;IACnB,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;IAE9C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,kBAAS,EAAC,kCAAkC,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEtB,IAAA,qBAAY,EAAC,0BAA0B,CAAC,CAAC;IACzC,IAAA,kBAAS,EAAC,2CAA2C,CAAC,CAAC;IAEvD,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAEY,QAAA,aAAa,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Session command - Start a wrapped shell session with tracking
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const sessionCommand: Command;
6
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsGpC,eAAO,MAAM,cAAc,SAEJ,CAAC"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ /**
3
+ * Session command - Start a wrapped shell session with tracking
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.sessionCommand = void 0;
10
+ const commander_1 = require("commander");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const tracker_core_1 = require("@devclocked/tracker-core");
13
+ const FileStorageAdapter_1 = require("../storage/FileStorageAdapter");
14
+ const WrappedShell_1 = require("../terminal/WrappedShell");
15
+ const activityDetector_1 = require("../terminal/activityDetector");
16
+ const config_1 = require("../config");
17
+ const banner_1 = require("../branding/banner");
18
+ async function startSession() {
19
+ const storage = new FileStorageAdapter_1.FileStorageAdapter();
20
+ const client = new tracker_core_1.TrackerClient({
21
+ supabaseUrl: config_1.SUPABASE_URL,
22
+ supabaseAnonKey: config_1.SUPABASE_ANON_KEY,
23
+ source: 'cli',
24
+ clientId: `cli-${Date.now()}`,
25
+ debug: false,
26
+ }, storage);
27
+ // Check authentication
28
+ const isAuth = await client.isAuthenticated();
29
+ if (!isAuth) {
30
+ (0, banner_1.printError)('Not authenticated. Run: devclocked login');
31
+ client.destroy();
32
+ process.exit(1);
33
+ }
34
+ const authState = await client.getAuthState();
35
+ const cwd = process.cwd();
36
+ (0, banner_1.printSessionStart)();
37
+ (0, banner_1.printSuccess)(`Authenticated as ${chalk_1.default.cyan(authState?.email || 'unknown')}`);
38
+ (0, banner_1.printInfo)(`Working directory: ${chalk_1.default.gray(cwd)}`);
39
+ (0, banner_1.printInfo)('Type "exit" to end the session');
40
+ console.log();
41
+ let shell = null;
42
+ let detector = null;
43
+ let isEnding = false;
44
+ const cleanup = async (exitCode = 0) => {
45
+ if (isEnding)
46
+ return;
47
+ isEnding = true;
48
+ if (detector) {
49
+ detector.destroy();
50
+ detector = null;
51
+ }
52
+ if (shell) {
53
+ shell.destroy();
54
+ shell = null;
55
+ }
56
+ // Flush any pending ticks
57
+ try {
58
+ await client.flushQueue();
59
+ }
60
+ catch {
61
+ // Ignore flush errors on exit
62
+ }
63
+ client.destroy();
64
+ (0, banner_1.printSessionEnd)();
65
+ process.exit(exitCode);
66
+ };
67
+ // Handle process signals
68
+ process.on('SIGINT', () => cleanup(0));
69
+ process.on('SIGTERM', () => cleanup(0));
70
+ // Create activity detector with idle callback
71
+ const onIdle = () => {
72
+ (0, banner_1.printInfo)('Session idle - activity tracking paused');
73
+ };
74
+ shell = new WrappedShell_1.WrappedShell(cwd, (activityCwd) => {
75
+ if (detector) {
76
+ detector.onActivity(activityCwd);
77
+ }
78
+ }, (exitCode) => {
79
+ cleanup(exitCode);
80
+ });
81
+ detector = new activityDetector_1.ActivityDetector(client, shell.getShell(), onIdle);
82
+ // Initial tick to start session
83
+ detector.onActivity(cwd);
84
+ // Start the wrapped shell
85
+ shell.spawn();
86
+ }
87
+ exports.sessionCommand = new commander_1.Command('session')
88
+ .description('Start a tracked terminal session')
89
+ .action(startSession);
90
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Status command - Show current tracking state
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const statusCommand: Command;
6
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0EpC,eAAO,MAAM,aAAa,SAEL,CAAC"}