@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.
- package/README.md +78 -0
- package/dist/branding/banner.d.ts +16 -0
- package/dist/branding/banner.d.ts.map +1 -0
- package/dist/branding/banner.js +109 -0
- package/dist/branding/banner.js.map +1 -0
- package/dist/commands/flush.d.ts +6 -0
- package/dist/commands/flush.d.ts.map +1 -0
- package/dist/commands/flush.js +54 -0
- package/dist/commands/flush.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +106 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +6 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +38 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/session.d.ts +6 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +90 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +78 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/FileStorageAdapter.d.ts +19 -0
- package/dist/storage/FileStorageAdapter.d.ts.map +1 -0
- package/dist/storage/FileStorageAdapter.js +80 -0
- package/dist/storage/FileStorageAdapter.js.map +1 -0
- package/dist/terminal/WrappedShell.d.ts +24 -0
- package/dist/terminal/WrappedShell.d.ts.map +1 -0
- package/dist/terminal/WrappedShell.js +121 -0
- package/dist/terminal/WrappedShell.js.map +1 -0
- package/dist/terminal/activityDetector.d.ts +33 -0
- package/dist/terminal/activityDetector.d.ts.map +1 -0
- package/dist/terminal/activityDetector.js +158 -0
- package/dist/terminal/activityDetector.js.map +1 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|