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.
- package/dist/auth.d.ts +16 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +68 -0
- package/dist/auth.js.map +1 -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/branding/dashboard.d.ts +28 -0
- package/dist/branding/dashboard.d.ts.map +1 -0
- package/dist/branding/dashboard.js +508 -0
- package/dist/branding/dashboard.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 +108 -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/mcp-health.d.ts +8 -0
- package/dist/commands/mcp-health.d.ts.map +1 -0
- package/dist/commands/mcp-health.js +75 -0
- package/dist/commands/mcp-health.js.map +1 -0
- package/dist/commands/mcp-server.d.ts +65 -0
- package/dist/commands/mcp-server.d.ts.map +1 -0
- package/dist/commands/mcp-server.js +280 -0
- package/dist/commands/mcp-server.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/setup.d.ts +8 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +164 -0
- package/dist/commands/setup.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/commands/summary.d.ts +6 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +45 -0
- package/dist/commands/summary.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 +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-utils.d.ts +15 -0
- package/dist/mcp-utils.d.ts.map +1 -0
- package/dist/mcp-utils.js +60 -0
- package/dist/mcp-utils.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 +41 -7
- package/index.js +0 -2
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
// Persist API key for MCP server and other CLI tools
|
|
92
|
+
storage.set('api_key', apiKey);
|
|
93
|
+
console.log();
|
|
94
|
+
(0, banner_1.printSuccess)(`Authenticated as ${chalk_1.default.cyan(authState?.email || 'unknown')}`);
|
|
95
|
+
(0, banner_1.printSuccess)('You can now start tracking with: devclocked session');
|
|
96
|
+
client.destroy();
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
(0, banner_1.printError)(`Authentication failed: ${error.message}`);
|
|
101
|
+
client.destroy();
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.loginCommand = new commander_1.Command('login')
|
|
106
|
+
.description('Authenticate with your DevClocked API key')
|
|
107
|
+
.action(login);
|
|
108
|
+
//# 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":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Health Check — validates auth, Supabase connectivity, and tool formatting.
|
|
4
|
+
*
|
|
5
|
+
* Usage: devclocked mcp-health
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.mcpHealthCommand = void 0;
|
|
9
|
+
const commander_1 = require("commander");
|
|
10
|
+
const mcp_utils_1 = require("../mcp-utils");
|
|
11
|
+
const dashboard_1 = require("../branding/dashboard");
|
|
12
|
+
const mcp_server_1 = require("./mcp-server");
|
|
13
|
+
exports.mcpHealthCommand = new commander_1.Command('mcp-health')
|
|
14
|
+
.description('Run health checks for MCP server connectivity and tools')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
let failures = 0;
|
|
17
|
+
// 1. Validate auth
|
|
18
|
+
let auth;
|
|
19
|
+
try {
|
|
20
|
+
auth = (0, mcp_utils_1.getAuth)();
|
|
21
|
+
console.log(`✓ Auth OK (${auth.email})`);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
25
|
+
console.log(`✗ Auth FAILED: ${msg}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// 2. Ping Supabase
|
|
29
|
+
let todayData;
|
|
30
|
+
try {
|
|
31
|
+
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
32
|
+
todayData = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-today-activity', {
|
|
33
|
+
method: 'GET',
|
|
34
|
+
queryParams: { tz },
|
|
35
|
+
});
|
|
36
|
+
console.log('✓ Supabase reachable');
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
40
|
+
console.log(`✗ Supabase FAILED: ${msg}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
// 3. Test get_summary formatting
|
|
44
|
+
try {
|
|
45
|
+
const summary = (0, dashboard_1.buildPlainVisualSummary)(todayData);
|
|
46
|
+
if (typeof summary !== 'string' || summary.length === 0) {
|
|
47
|
+
throw new Error('Empty summary output');
|
|
48
|
+
}
|
|
49
|
+
console.log('✓ get_summary OK');
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
53
|
+
console.log(`✗ get_summary FAILED: ${msg}`);
|
|
54
|
+
failures++;
|
|
55
|
+
}
|
|
56
|
+
// 4. Test get_weekly_summary formatting
|
|
57
|
+
try {
|
|
58
|
+
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
59
|
+
const days = await (0, mcp_server_1.fetchWeeklyData)(auth, tz);
|
|
60
|
+
const weekly = (0, dashboard_1.buildPlainWeeklySummary)(days);
|
|
61
|
+
if (typeof weekly !== 'string' || weekly.length === 0) {
|
|
62
|
+
throw new Error('Empty weekly summary output');
|
|
63
|
+
}
|
|
64
|
+
console.log('✓ get_weekly_summary OK');
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
68
|
+
console.log(`✗ get_weekly_summary FAILED: ${msg}`);
|
|
69
|
+
failures++;
|
|
70
|
+
}
|
|
71
|
+
if (failures > 0) {
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=mcp-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-health.js","sourceRoot":"","sources":["../../src/commands/mcp-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server subcommand — exposes DevClocked data to AI tools
|
|
3
|
+
* via Model Context Protocol (stdin/stdout).
|
|
4
|
+
*
|
|
5
|
+
* Usage in Claude Code settings:
|
|
6
|
+
* { "command": "devclocked", "args": ["mcp-server"] }
|
|
7
|
+
* Or via npx:
|
|
8
|
+
* { "command": "npx", "args": ["-y", "@devclocked/cli", "mcp-server"] }
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { WeeklyDayEntry } from '../branding/dashboard';
|
|
12
|
+
import { McpAuth } from '../mcp-utils';
|
|
13
|
+
export declare function fetchWeeklyData(auth: McpAuth, timezone: string): Promise<WeeklyDayEntry[]>;
|
|
14
|
+
export declare const TOOL_DEFINITIONS: ({
|
|
15
|
+
name: string;
|
|
16
|
+
category: string;
|
|
17
|
+
returns: string;
|
|
18
|
+
stability: string;
|
|
19
|
+
description: string;
|
|
20
|
+
inputSchema: {
|
|
21
|
+
type: "object";
|
|
22
|
+
properties: {
|
|
23
|
+
date: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
tz: {
|
|
28
|
+
type: string;
|
|
29
|
+
description: string;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
} | {
|
|
34
|
+
name: string;
|
|
35
|
+
category: string;
|
|
36
|
+
returns: string;
|
|
37
|
+
stability: string;
|
|
38
|
+
description: string;
|
|
39
|
+
inputSchema: {
|
|
40
|
+
type: "object";
|
|
41
|
+
properties: {
|
|
42
|
+
date?: undefined;
|
|
43
|
+
tz?: undefined;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
} | {
|
|
47
|
+
name: string;
|
|
48
|
+
category: string;
|
|
49
|
+
returns: string;
|
|
50
|
+
stability: string;
|
|
51
|
+
description: string;
|
|
52
|
+
inputSchema: {
|
|
53
|
+
type: "object";
|
|
54
|
+
properties: {
|
|
55
|
+
tz: {
|
|
56
|
+
type: string;
|
|
57
|
+
description: string;
|
|
58
|
+
};
|
|
59
|
+
date?: undefined;
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
})[];
|
|
63
|
+
export declare const mcpServerCommand: Command;
|
|
64
|
+
export declare const mcpListToolsCommand: Command;
|
|
65
|
+
//# sourceMappingURL=mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/commands/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAoD,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACzG,OAAO,EAA6B,OAAO,EAAE,MAAM,cAAc,CAAC;AAIlE,wBAAsB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAoBhG;AAqHD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmF5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAOzB,CAAC;AAEL,eAAO,MAAM,mBAAmB,SA0B5B,CAAC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server subcommand — exposes DevClocked data to AI tools
|
|
4
|
+
* via Model Context Protocol (stdin/stdout).
|
|
5
|
+
*
|
|
6
|
+
* Usage in Claude Code settings:
|
|
7
|
+
* { "command": "devclocked", "args": ["mcp-server"] }
|
|
8
|
+
* Or via npx:
|
|
9
|
+
* { "command": "npx", "args": ["-y", "@devclocked/cli", "mcp-server"] }
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.mcpListToolsCommand = exports.mcpServerCommand = exports.TOOL_DEFINITIONS = void 0;
|
|
46
|
+
exports.fetchWeeklyData = fetchWeeklyData;
|
|
47
|
+
const commander_1 = require("commander");
|
|
48
|
+
const dashboard_1 = require("../branding/dashboard");
|
|
49
|
+
const mcp_utils_1 = require("../mcp-utils");
|
|
50
|
+
// Helper to fetch 7 days of activity data
|
|
51
|
+
async function fetchWeeklyData(auth, timezone) {
|
|
52
|
+
const days = [];
|
|
53
|
+
for (let i = 0; i < 7; i++) {
|
|
54
|
+
const d = new Date();
|
|
55
|
+
d.setDate(d.getDate() - i);
|
|
56
|
+
const dateStr = d.toISOString().slice(0, 10);
|
|
57
|
+
try {
|
|
58
|
+
const data = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-today-activity', {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
queryParams: { date: dateStr, tz: timezone },
|
|
61
|
+
});
|
|
62
|
+
days.push({ date: dateStr, data });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
days.push({ date: dateStr, data: { tracked_minutes_today: 0, sessions: [], generated_at: new Date().toISOString() } });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return days;
|
|
69
|
+
}
|
|
70
|
+
// MCP Server
|
|
71
|
+
async function startMcpServer() {
|
|
72
|
+
// Validate auth before starting
|
|
73
|
+
let auth;
|
|
74
|
+
try {
|
|
75
|
+
auth = (0, mcp_utils_1.getAuth)();
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
79
|
+
process.stderr.write(`DevClocked MCP: ${msg}\n`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
return; // unreachable but satisfies TS
|
|
82
|
+
}
|
|
83
|
+
// Dynamic import to avoid loading MCP SDK for other CLI commands
|
|
84
|
+
const { Server } = await Promise.resolve().then(() => __importStar(require('@modelcontextprotocol/sdk/server/index.js')));
|
|
85
|
+
const { StdioServerTransport } = await Promise.resolve().then(() => __importStar(require('@modelcontextprotocol/sdk/server/stdio.js')));
|
|
86
|
+
const { CallToolRequestSchema, ListToolsRequestSchema } = await Promise.resolve().then(() => __importStar(require('@modelcontextprotocol/sdk/types.js')));
|
|
87
|
+
const server = new Server({ name: 'devclocked', version: '1.0.0' }, { capabilities: { tools: {} } });
|
|
88
|
+
// List tools — only pass MCP-compatible fields
|
|
89
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
90
|
+
tools: exports.TOOL_DEFINITIONS.map(({ name, description, inputSchema }) => ({
|
|
91
|
+
name, description, inputSchema,
|
|
92
|
+
})),
|
|
93
|
+
}));
|
|
94
|
+
// Handle tool calls
|
|
95
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
96
|
+
const { name, arguments: args } = request.params;
|
|
97
|
+
try {
|
|
98
|
+
switch (name) {
|
|
99
|
+
case 'get_summary': {
|
|
100
|
+
const queryParams = {};
|
|
101
|
+
if (args?.date)
|
|
102
|
+
queryParams['date'] = String(args.date);
|
|
103
|
+
queryParams['tz'] =
|
|
104
|
+
args?.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
105
|
+
const data = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-today-activity', {
|
|
106
|
+
method: 'GET',
|
|
107
|
+
queryParams,
|
|
108
|
+
});
|
|
109
|
+
const summary = (0, dashboard_1.buildPlainVisualSummary)(data);
|
|
110
|
+
return { content: [{ type: 'text', text: summary }] };
|
|
111
|
+
}
|
|
112
|
+
case 'get_today_activity': {
|
|
113
|
+
const queryParams = {};
|
|
114
|
+
if (args?.date)
|
|
115
|
+
queryParams['date'] = String(args.date);
|
|
116
|
+
queryParams['tz'] =
|
|
117
|
+
args?.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
118
|
+
const data = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-today-activity', {
|
|
119
|
+
method: 'GET',
|
|
120
|
+
queryParams,
|
|
121
|
+
});
|
|
122
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
123
|
+
}
|
|
124
|
+
case 'get_active_session': {
|
|
125
|
+
const data = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-active-session', {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
body: {},
|
|
128
|
+
});
|
|
129
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
130
|
+
}
|
|
131
|
+
case 'get_weekly_summary': {
|
|
132
|
+
const timezone = args?.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
133
|
+
const days = await fetchWeeklyData(auth, timezone);
|
|
134
|
+
const summary = (0, dashboard_1.buildPlainWeeklySummary)(days);
|
|
135
|
+
return { content: [{ type: 'text', text: summary }] };
|
|
136
|
+
}
|
|
137
|
+
case 'get_weekly_summary_raw': {
|
|
138
|
+
const timezone = args?.tz || Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
139
|
+
const days = await fetchWeeklyData(auth, timezone);
|
|
140
|
+
return { content: [{ type: 'text', text: JSON.stringify({ days }, null, 2) }] };
|
|
141
|
+
}
|
|
142
|
+
case 'get_projects': {
|
|
143
|
+
const data = await (0, mcp_utils_1.callEdgeFunction)(auth, 'get-user-projects', {
|
|
144
|
+
method: 'POST',
|
|
145
|
+
body: { include_stats: true },
|
|
146
|
+
});
|
|
147
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
148
|
+
}
|
|
149
|
+
default:
|
|
150
|
+
return {
|
|
151
|
+
content: [{ type: 'text', text: `Unknown tool: ${name}` }],
|
|
152
|
+
isError: true,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
158
|
+
return {
|
|
159
|
+
content: [{ type: 'text', text: `DevClocked error: ${msg}` }],
|
|
160
|
+
isError: true,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
const transport = new StdioServerTransport();
|
|
165
|
+
await server.connect(transport);
|
|
166
|
+
}
|
|
167
|
+
// Tool definitions (shared between server and list-tools command)
|
|
168
|
+
exports.TOOL_DEFINITIONS = [
|
|
169
|
+
{
|
|
170
|
+
name: 'get_summary',
|
|
171
|
+
category: 'activity',
|
|
172
|
+
returns: 'text',
|
|
173
|
+
stability: 'stable',
|
|
174
|
+
description: "Get a formatted summary of today's coding activity. Use this when the user asks how long they've been coding, what they've worked on today, or for a status update. Returns a concise human-readable summary.",
|
|
175
|
+
inputSchema: {
|
|
176
|
+
type: 'object',
|
|
177
|
+
properties: {
|
|
178
|
+
date: { type: 'string', description: 'Date in YYYY-MM-DD format (default: today)' },
|
|
179
|
+
tz: { type: 'string', description: 'IANA timezone (default: auto-detected)' },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: 'get_today_activity',
|
|
185
|
+
category: 'activity',
|
|
186
|
+
returns: 'json',
|
|
187
|
+
stability: 'stable',
|
|
188
|
+
description: "Get raw JSON data for today's coding activity: sessions, work blocks, repos, lines changed, tokens used. Use get_summary instead for human-readable output.",
|
|
189
|
+
inputSchema: {
|
|
190
|
+
type: 'object',
|
|
191
|
+
properties: {
|
|
192
|
+
date: { type: 'string', description: 'Date in YYYY-MM-DD format (default: today)' },
|
|
193
|
+
tz: { type: 'string', description: 'IANA timezone (default: auto-detected)' },
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'get_active_session',
|
|
199
|
+
category: 'activity',
|
|
200
|
+
returns: 'json',
|
|
201
|
+
stability: 'stable',
|
|
202
|
+
description: 'Get the currently active tracking session, if any. Shows session duration, source, tick count.',
|
|
203
|
+
inputSchema: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
properties: {},
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: 'get_weekly_summary',
|
|
210
|
+
category: 'activity',
|
|
211
|
+
returns: 'text',
|
|
212
|
+
stability: 'stable',
|
|
213
|
+
description: 'Get a summary of coding activity for the past 7 days. Returns daily breakdown with minutes, ticks, repos, and lines changed.',
|
|
214
|
+
inputSchema: {
|
|
215
|
+
type: 'object',
|
|
216
|
+
properties: {
|
|
217
|
+
tz: { type: 'string', description: 'IANA timezone (default: auto-detected)' },
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'get_weekly_summary_raw',
|
|
223
|
+
category: 'activity',
|
|
224
|
+
returns: 'json',
|
|
225
|
+
stability: 'beta',
|
|
226
|
+
description: 'Get raw JSON data for the past 7 days of coding activity. Warning: response can be very large. Prefer get_weekly_summary for a concise text overview.',
|
|
227
|
+
inputSchema: {
|
|
228
|
+
type: 'object',
|
|
229
|
+
properties: {
|
|
230
|
+
tz: { type: 'string', description: 'IANA timezone (default: auto-detected)' },
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
name: 'get_projects',
|
|
236
|
+
category: 'projects',
|
|
237
|
+
returns: 'json',
|
|
238
|
+
stability: 'stable',
|
|
239
|
+
description: "List the user's projects with stats (total hours, sessions, commits, active days).",
|
|
240
|
+
inputSchema: {
|
|
241
|
+
type: 'object',
|
|
242
|
+
properties: {},
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
];
|
|
246
|
+
exports.mcpServerCommand = new commander_1.Command('mcp-server')
|
|
247
|
+
.description('Start MCP server for AI tools (Claude Code, Cursor)')
|
|
248
|
+
.action(() => {
|
|
249
|
+
startMcpServer().catch((err) => {
|
|
250
|
+
process.stderr.write(`DevClocked MCP fatal: ${err}\n`);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
exports.mcpListToolsCommand = new commander_1.Command('mcp-list-tools')
|
|
255
|
+
.description('List available MCP tools and their descriptions')
|
|
256
|
+
.option('--json', 'Output as JSON')
|
|
257
|
+
.action((opts) => {
|
|
258
|
+
if (opts.json) {
|
|
259
|
+
console.log(JSON.stringify(exports.TOOL_DEFINITIONS, null, 2));
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
console.log('DevClocked MCP Tools\n');
|
|
263
|
+
for (const tool of exports.TOOL_DEFINITIONS) {
|
|
264
|
+
const meta = [tool.category, tool.returns, tool.stability].filter(Boolean).join(', ');
|
|
265
|
+
console.log(` ${tool.name}${meta ? ` [${meta}]` : ''}`);
|
|
266
|
+
console.log(` ${tool.description}`);
|
|
267
|
+
const params = Object.keys(tool.inputSchema.properties);
|
|
268
|
+
if (params.length > 0) {
|
|
269
|
+
const paramStr = params
|
|
270
|
+
.map((p) => {
|
|
271
|
+
const prop = tool.inputSchema.properties[p];
|
|
272
|
+
return `${p} — ${prop?.description || ''}`;
|
|
273
|
+
})
|
|
274
|
+
.join('; ');
|
|
275
|
+
console.log(` Params: ${paramStr}`);
|
|
276
|
+
}
|
|
277
|
+
console.log();
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/commands/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|