@clux-cli/cli 0.2.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.
@@ -0,0 +1,19 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ /**
4
+ * Shortens an absolute path for use as a tmux session name.
5
+ * Keeps the last two path segments intact, shortens all earlier segments
6
+ * to their first letter, and joins with dashes.
7
+ *
8
+ * Examples:
9
+ * /home/user → "home-user"
10
+ * /home/user/projects/clux → "h-u-projects-clux"
11
+ * /home/user/projects/clux/foo/bar → "h-u-p-c-foo-bar"
12
+ */
13
+ export declare function shortenPath(absolutePath: string): string;
14
+ /**
15
+ * Generates a session name for a Claude session based on the working directory.
16
+ * Format: claude_<shortened-path>
17
+ */
18
+ export declare function buildSessionName(name: string | undefined, cwd: string): string;
19
+ export declare function registerClaudeCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.shortenPath = shortenPath;
7
+ exports.buildSessionName = buildSessionName;
8
+ exports.registerClaudeCommand = registerClaudeCommand;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const ora_1 = __importDefault(require("ora"));
11
+ const child_process_1 = require("child_process");
12
+ const format_1 = require("../format");
13
+ /**
14
+ * Shortens an absolute path for use as a tmux session name.
15
+ * Keeps the last two path segments intact, shortens all earlier segments
16
+ * to their first letter, and joins with dashes.
17
+ *
18
+ * Examples:
19
+ * /home/user → "home-user"
20
+ * /home/user/projects/clux → "h-u-projects-clux"
21
+ * /home/user/projects/clux/foo/bar → "h-u-p-c-foo-bar"
22
+ */
23
+ function shortenPath(absolutePath) {
24
+ const parts = absolutePath.split('/').filter(Boolean);
25
+ if (parts.length <= 2) {
26
+ return parts.join('-');
27
+ }
28
+ return [...parts.slice(0, -2).map((p) => p[0]), ...parts.slice(-2)].join('-');
29
+ }
30
+ /**
31
+ * Generates a session name for a Claude session based on the working directory.
32
+ * Format: claude_<shortened-path>
33
+ */
34
+ function buildSessionName(name, cwd) {
35
+ return name || `claude_${shortenPath(cwd)}`;
36
+ }
37
+ /**
38
+ * Switches to a tmux session. Uses switch-client when already inside tmux,
39
+ * falls back to attach-session otherwise.
40
+ */
41
+ function switchToSession(sessionName) {
42
+ if (process.env.TMUX) {
43
+ (0, child_process_1.spawnSync)('tmux', ['switch-client', '-t', sessionName], { stdio: 'inherit' });
44
+ }
45
+ else {
46
+ const proc = (0, child_process_1.spawn)('tmux', ['attach-session', '-t', sessionName], { stdio: 'inherit' });
47
+ proc.on('exit', (code) => process.exit(code || 0));
48
+ }
49
+ }
50
+ function registerClaudeCommand(program, manager) {
51
+ program
52
+ .command('claude [name]')
53
+ .description('Create a tmux session running Claude Code')
54
+ .option('-p, --path <path>', 'Project working directory', process.cwd())
55
+ .option('-d, --detach', 'Do not attach to the session after creation')
56
+ .option('--danger', 'Run Claude with --dangerously-skip-permissions')
57
+ .action(async (name, opts) => {
58
+ const cwd = opts.path || process.cwd();
59
+ const sessionName = buildSessionName(name, cwd);
60
+ const exists = await manager.sessionExists(sessionName);
61
+ if (exists) {
62
+ console.log(chalk_1.default.yellow(`Session "${sessionName}" already exists, switching...`));
63
+ if (!opts.detach) {
64
+ switchToSession(sessionName);
65
+ }
66
+ return;
67
+ }
68
+ const spinner = (0, ora_1.default)(`Creating Claude session "${sessionName}"...`).start();
69
+ try {
70
+ const session = await manager.createSession({
71
+ projectName: sessionName,
72
+ projectPath: cwd,
73
+ command: opts.danger ? 'claude --dangerously-skip-permissions' : 'claude',
74
+ layout: 'tiled',
75
+ });
76
+ manager.store.updateDescription(session.name, 'Claude Code session');
77
+ manager.store.updateTags(session.name, ['claude', 'ai']);
78
+ spinner.succeed(chalk_1.default.green(`Claude session "${session.name}" created`));
79
+ (0, format_1.printSessionDetails)(session);
80
+ if (!opts.detach) {
81
+ switchToSession(session.name);
82
+ }
83
+ else {
84
+ console.log(chalk_1.default.dim(`\n Attach with: clux attach ${session.name}`));
85
+ }
86
+ }
87
+ catch (err) {
88
+ spinner.fail(chalk_1.default.red(err.message));
89
+ process.exit(1);
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/commands/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const claude_1 = require("./claude");
5
+ (0, vitest_1.describe)('shortenPath', () => {
6
+ (0, vitest_1.it)('keeps paths with 1 segment as-is', () => {
7
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home')).toBe('home');
8
+ });
9
+ (0, vitest_1.it)('keeps paths with 2 segments joined by dash', () => {
10
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home/user')).toBe('home-user');
11
+ });
12
+ (0, vitest_1.it)('shortens earlier segments to first letter, keeps last two', () => {
13
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home/user/projects/clux')).toBe('h-u-projects-clux');
14
+ });
15
+ (0, vitest_1.it)('handles deeply nested paths', () => {
16
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home/user/projects/clux/foo/bar')).toBe('h-u-p-c-foo-bar');
17
+ });
18
+ (0, vitest_1.it)('handles 3 segments', () => {
19
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home/user/projects')).toBe('h-user-projects');
20
+ });
21
+ (0, vitest_1.it)('handles trailing slashes', () => {
22
+ (0, vitest_1.expect)((0, claude_1.shortenPath)('/home/user/projects/clux/')).toBe('h-u-projects-clux');
23
+ });
24
+ });
25
+ (0, vitest_1.describe)('buildSessionName', () => {
26
+ (0, vitest_1.it)('uses provided name when given', () => {
27
+ (0, vitest_1.expect)((0, claude_1.buildSessionName)('my-session', '/home/user/projects')).toBe('my-session');
28
+ });
29
+ (0, vitest_1.it)('generates name from path when no name provided', () => {
30
+ (0, vitest_1.expect)((0, claude_1.buildSessionName)(undefined, '/home/user/projects/clux')).toBe('claude_h-u-projects-clux');
31
+ });
32
+ (0, vitest_1.it)('generates name for short paths', () => {
33
+ (0, vitest_1.expect)((0, claude_1.buildSessionName)(undefined, '/home/user')).toBe('claude_home-user');
34
+ });
35
+ (0, vitest_1.it)('generates name for deeply nested paths', () => {
36
+ (0, vitest_1.expect)((0, claude_1.buildSessionName)(undefined, '/home/tmolenda/projects/bundesdruckerei/certs')).toBe('claude_h-t-p-bundesdruckerei-certs');
37
+ });
38
+ });
39
+ //# sourceMappingURL=claude.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.test.js","sourceRoot":"","sources":["../../src/commands/claude.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,qCAAyD;AAEzD,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAA,WAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,IAAA,eAAM,EAAC,IAAA,oBAAW,EAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAClE,0BAA0B,CAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAA,eAAM,EAAC,IAAA,yBAAgB,EAAC,SAAS,EAAE,+CAA+C,CAAC,CAAC,CAAC,IAAI,CACvF,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerCreateCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerCreateCommand = registerCreateCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const format_1 = require("../format");
10
+ function registerCreateCommand(program, manager) {
11
+ program
12
+ .command('create <name>')
13
+ .description('Create a new tmux session')
14
+ .option('-p, --path <path>', 'Project working directory', process.cwd())
15
+ .option('-c, --command <cmd>', 'Command to run in main pane (e.g. "claude")')
16
+ .option('-l, --layout <layout>', 'Pane layout', 'tiled')
17
+ .option('-d, --description <text>', 'Session description')
18
+ .option('-t, --tags <tags>', 'Comma-separated tags')
19
+ .action(async (name, opts) => {
20
+ const spinner = (0, ora_1.default)(`Creating session "${name}"...`).start();
21
+ try {
22
+ const session = await manager.createSession({
23
+ projectName: name,
24
+ projectPath: opts.path,
25
+ command: opts.command,
26
+ layout: opts.layout,
27
+ });
28
+ if (opts.description) {
29
+ manager.store.updateDescription(session.name, opts.description);
30
+ }
31
+ if (opts.tags) {
32
+ manager.store.updateTags(session.name, opts.tags.split(',').map((t) => t.trim()));
33
+ }
34
+ spinner.succeed(chalk_1.default.green(`Session "${session.name}" created`));
35
+ (0, format_1.printSessionDetails)(session);
36
+ console.log(chalk_1.default.dim(`\n Attach with: clux attach ${session.name}`));
37
+ }
38
+ catch (err) {
39
+ spinner.fail(chalk_1.default.red(err.message));
40
+ process.exit(1);
41
+ }
42
+ });
43
+ }
44
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":";;;;;AAMA,sDAqCC;AAzCD,kDAA0B;AAC1B,8CAAsB;AACtB,sCAAgD;AAEhD,SAAgB,qBAAqB,CAAC,OAAgB,EAAE,OAA2B;IACjF,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SACvE,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;SAC5E,MAAM,CAAC,uBAAuB,EAAE,aAAa,EAAE,OAAO,CAAC;SACvD,MAAM,CAAC,0BAA0B,EAAE,qBAAqB,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,qBAAqB,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC;gBAC1C,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,UAAU,CACtB,OAAO,CAAC,IAAI,EACZ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAClD,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC;YAClE,IAAA,4BAAmB,EAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gCAAgC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerInfoCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerInfoCommand = registerInfoCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const format_1 = require("../format");
9
+ function registerInfoCommand(program, manager) {
10
+ program
11
+ .command('info <name>')
12
+ .description('Show detailed info about a session')
13
+ .action(async (name) => {
14
+ try {
15
+ const session = await manager.getSession(name);
16
+ const record = manager.store.get(name);
17
+ (0, format_1.printSessionDetails)(session);
18
+ if (record) {
19
+ console.log('');
20
+ if (record.description)
21
+ console.log(` ${chalk_1.default.cyan('Description:')} ${record.description}`);
22
+ if (record.projectPath)
23
+ console.log(` ${chalk_1.default.cyan('Project:')} ${record.projectPath}`);
24
+ if (record.command)
25
+ console.log(` ${chalk_1.default.cyan('Command:')} ${record.command}`);
26
+ if (record.tags.length)
27
+ console.log(` ${chalk_1.default.cyan('Tags:')} ${record.tags.join(', ')}`);
28
+ console.log(` ${chalk_1.default.cyan('Commands:')} ${record.commandsSent} sent`);
29
+ console.log(` ${chalk_1.default.cyan('Last active:')} ${new Date(record.lastActivity).toLocaleString()}`);
30
+ }
31
+ }
32
+ catch (err) {
33
+ console.error(chalk_1.default.red(err.message));
34
+ process.exit(1);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":";;;;;AAKA,kDA8BC;AAjCD,kDAA0B;AAC1B,sCAAgD;AAEhD,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,OAA2B;IAC/E,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAA,4BAAmB,EAAC,OAAO,CAAC,CAAC;YAE7B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,IAAI,MAAM,CAAC,WAAW;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvE,IAAI,MAAM,CAAC,WAAW;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvE,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,MAAM,CAAC,YAAY,OAAO,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CACT,KAAK,eAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,EAAE,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerListCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerListCommand = registerListCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const cli_table3_1 = __importDefault(require("cli-table3"));
9
+ const format_1 = require("../format");
10
+ function registerListCommand(program, manager) {
11
+ program
12
+ .command('list')
13
+ .alias('ls')
14
+ .description('List all tmux sessions')
15
+ .option('-t, --tag <tag>', 'Filter by tag')
16
+ .option('-s, --search <query>', 'Search sessions')
17
+ .action(async (opts) => {
18
+ let sessions = await manager.listSessions();
19
+ if (opts.tag) {
20
+ const matching = manager.store.findByTag(opts.tag);
21
+ const names = new Set(matching.map((r) => r.name));
22
+ sessions = sessions.filter((s) => names.has(s.name));
23
+ }
24
+ if (opts.search) {
25
+ const matching = manager.store.search(opts.search);
26
+ const names = new Set(matching.map((r) => r.name));
27
+ sessions = sessions.filter((s) => names.has(s.name));
28
+ }
29
+ if (sessions.length === 0) {
30
+ console.log(chalk_1.default.yellow('No active tmux sessions.'));
31
+ return;
32
+ }
33
+ const table = new cli_table3_1.default({
34
+ head: [
35
+ chalk_1.default.cyan('Name'),
36
+ chalk_1.default.cyan('Status'),
37
+ chalk_1.default.cyan('Win'),
38
+ chalk_1.default.cyan('Panes'),
39
+ chalk_1.default.cyan('Cmds'),
40
+ chalk_1.default.cyan('Tags'),
41
+ chalk_1.default.cyan('Created'),
42
+ ],
43
+ style: { head: [], border: ['dim'] },
44
+ });
45
+ for (const s of sessions) {
46
+ const totalPanes = s.windows.reduce((sum, w) => sum + w.panes.length, 0);
47
+ const tags = s.metadata?.tags?.join(', ') || '';
48
+ const cmds = s.metadata?.commandsSent ?? '';
49
+ table.push([
50
+ chalk_1.default.bold(s.name),
51
+ s.isAttached ? chalk_1.default.green('attached') : chalk_1.default.yellow('detached'),
52
+ String(s.windows.length),
53
+ String(totalPanes),
54
+ String(cmds),
55
+ chalk_1.default.dim(tags),
56
+ (0, format_1.formatRelativeTime)(s.createdAt),
57
+ ]);
58
+ }
59
+ console.log(table.toString());
60
+ });
61
+ }
62
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerRelayCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerRelayCommand = registerRelayCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ function registerRelayCommand(program, manager) {
9
+ program
10
+ .command('relay <session>')
11
+ .description('Relay a message between panes (inter-agent communication)')
12
+ .requiredOption('--from <paneId>', 'Source pane ID (e.g. 0.0)')
13
+ .requiredOption('--to <paneId>', 'Target pane ID (e.g. 0.1)')
14
+ .option('-m, --message <text>', 'Message to relay')
15
+ .option('-c, --capture [lines]', 'Capture output from source pane and relay it')
16
+ .action(async (session, opts) => {
17
+ try {
18
+ if (opts.capture) {
19
+ const lines = typeof opts.capture === 'string' ? parseInt(opts.capture) : 50;
20
+ await manager.relayCapturedOutput(session, opts.from, opts.to, lines);
21
+ console.log(chalk_1.default.green(`Relayed ${lines} lines of output from ${opts.from} → ${opts.to}`));
22
+ }
23
+ else if (opts.message) {
24
+ await manager.relayMessage(session, opts.from, opts.to, opts.message);
25
+ console.log(chalk_1.default.green(`Relayed message from ${opts.from} → ${opts.to}`));
26
+ }
27
+ else {
28
+ console.error(chalk_1.default.red('Provide either --message or --capture'));
29
+ process.exit(1);
30
+ }
31
+ }
32
+ catch (err) {
33
+ console.error(chalk_1.default.red(err.message));
34
+ process.exit(1);
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/commands/relay.ts"],"names":[],"mappings":";;;;;AAIA,oDA4BC;AA9BD,kDAA0B;AAE1B,SAAgB,oBAAoB,CAAC,OAAgB,EAAE,OAA2B;IAChF,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,2DAA2D,CAAC;SACxE,cAAc,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;SAC9D,cAAc,CAAC,eAAe,EAAE,2BAA2B,CAAC;SAC5D,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,uBAAuB,EAAE,8CAA8C,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,MAAM,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,WAAW,KAAK,yBAAyB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,CAC/E,CAAC;YACJ,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerTagCommand(program: Command, manager: TmuxSessionManager): void;
4
+ export declare function registerDescribeCommand(program: Command, manager: TmuxSessionManager): void;
5
+ export declare function registerAttachCommand(program: Command, manager: TmuxSessionManager): void;
6
+ export declare function registerKillCommand(program: Command, manager: TmuxSessionManager): void;
7
+ export declare function registerSendCommand(program: Command, manager: TmuxSessionManager): void;
8
+ export declare function registerCaptureCommand(program: Command, manager: TmuxSessionManager): void;
9
+ export declare function registerExportCommand(program: Command, manager: TmuxSessionManager): void;
10
+ export declare function registerMonitorCommand(program: Command, manager: TmuxSessionManager): void;
11
+ export declare function registerWindowCommands(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerTagCommand = registerTagCommand;
7
+ exports.registerDescribeCommand = registerDescribeCommand;
8
+ exports.registerAttachCommand = registerAttachCommand;
9
+ exports.registerKillCommand = registerKillCommand;
10
+ exports.registerSendCommand = registerSendCommand;
11
+ exports.registerCaptureCommand = registerCaptureCommand;
12
+ exports.registerExportCommand = registerExportCommand;
13
+ exports.registerMonitorCommand = registerMonitorCommand;
14
+ exports.registerWindowCommands = registerWindowCommands;
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ const format_1 = require("../format");
17
+ function registerTagCommand(program, manager) {
18
+ program
19
+ .command('tag <session> <tags...>')
20
+ .description('Add tags to a session')
21
+ .option('-r, --remove', 'Remove tags instead of adding')
22
+ .action(async (session, tags, opts) => {
23
+ for (const tag of tags) {
24
+ if (opts.remove) {
25
+ manager.store.removeTag(session, tag);
26
+ }
27
+ else {
28
+ manager.store.addTag(session, tag);
29
+ }
30
+ }
31
+ const record = manager.store.get(session);
32
+ console.log(chalk_1.default.green(`Tags for "${session}": ${record?.tags.join(', ') || '(none)'}`));
33
+ });
34
+ }
35
+ function registerDescribeCommand(program, manager) {
36
+ program
37
+ .command('describe <session> <description>')
38
+ .description('Set session description')
39
+ .action(async (session, description) => {
40
+ manager.store.updateDescription(session, description);
41
+ console.log(chalk_1.default.green(`Description set for "${session}"`));
42
+ });
43
+ }
44
+ function registerAttachCommand(program, manager) {
45
+ program
46
+ .command('attach <session>')
47
+ .description('Attach to a tmux session (takes over terminal)')
48
+ .action(async (session) => {
49
+ try {
50
+ if (!(await manager.sessionExists(session))) {
51
+ console.error(chalk_1.default.red(`Session "${session}" not found`));
52
+ process.exit(1);
53
+ }
54
+ console.log(chalk_1.default.dim(`Attaching to "${session}"... (use Ctrl+B D to detach)`));
55
+ const { spawn } = require('child_process');
56
+ const proc = spawn('tmux', ['attach-session', '-t', session], { stdio: 'inherit' });
57
+ proc.on('exit', (code) => process.exit(code || 0));
58
+ }
59
+ catch (err) {
60
+ console.error(chalk_1.default.red(err.message));
61
+ process.exit(1);
62
+ }
63
+ });
64
+ }
65
+ function registerKillCommand(program, manager) {
66
+ program
67
+ .command('kill <session>')
68
+ .description('Kill a tmux session')
69
+ .action(async (session) => {
70
+ try {
71
+ await manager.killSession(session);
72
+ console.log(chalk_1.default.green(`Session "${session}" killed`));
73
+ }
74
+ catch (err) {
75
+ console.error(chalk_1.default.red(err.message));
76
+ process.exit(1);
77
+ }
78
+ });
79
+ }
80
+ function registerSendCommand(program, manager) {
81
+ program
82
+ .command('send <session> <message>')
83
+ .description('Send text/command to a session pane')
84
+ .option('--pane <id>', 'Target pane (e.g. 0.1)', '0.0')
85
+ .option('--no-enter', 'Do not send Enter after text')
86
+ .action(async (session, message, opts) => {
87
+ try {
88
+ await manager.sendKeys(session, opts.pane, message, { noEnter: !opts.enter });
89
+ console.log(chalk_1.default.green(`Sent to ${session}:${opts.pane}`));
90
+ }
91
+ catch (err) {
92
+ console.error(chalk_1.default.red(err.message));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ function registerCaptureCommand(program, manager) {
98
+ program
99
+ .command('capture <session>')
100
+ .description('Capture pane output')
101
+ .option('--pane <id>', 'Pane to capture', '0.0')
102
+ .option('-n, --lines <n>', 'Number of lines', '50')
103
+ .option('-a, --all', 'Capture full scrollback history')
104
+ .option('-o, --output <file>', 'Write to file instead of stdout')
105
+ .action(async (session, opts) => {
106
+ try {
107
+ const output = opts.all
108
+ ? await manager.capturePaneAll(session, opts.pane)
109
+ : await manager.capturePane(session, opts.pane, parseInt(opts.lines));
110
+ if (opts.output) {
111
+ const fs = require('fs');
112
+ fs.writeFileSync(opts.output, output.content);
113
+ console.log(chalk_1.default.green(`Saved to ${opts.output} (${output.lines} lines)`));
114
+ }
115
+ else {
116
+ console.log(output.content);
117
+ }
118
+ }
119
+ catch (err) {
120
+ console.error(chalk_1.default.red(err.message));
121
+ process.exit(1);
122
+ }
123
+ });
124
+ }
125
+ function registerExportCommand(program, manager) {
126
+ program
127
+ .command('export <session>')
128
+ .description('Export session to Markdown')
129
+ .option('-o, --output <file>', 'Output file (default: <session>.md)')
130
+ .action(async (session, opts) => {
131
+ const spinner = require('ora')(`Exporting "${session}"...`).start();
132
+ try {
133
+ const md = await manager.exportSessionMarkdown(session);
134
+ const file = opts.output || `${session}.md`;
135
+ const fs = require('fs');
136
+ fs.writeFileSync(file, md);
137
+ spinner.succeed(chalk_1.default.green(`Exported to ${file}`));
138
+ }
139
+ catch (err) {
140
+ spinner.fail(chalk_1.default.red(err.message));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ }
145
+ function registerMonitorCommand(program, manager) {
146
+ program
147
+ .command('monitor <session>')
148
+ .description('Monitor a session pane in real-time (Ctrl+C to stop)')
149
+ .option('--pane <id>', 'Pane to monitor', '0.0')
150
+ .option('-i, --interval <ms>', 'Polling interval in ms', '1000')
151
+ .action(async (session, opts) => {
152
+ console.log(chalk_1.default.cyan(`Monitoring ${session}:${opts.pane} (Ctrl+C to stop)\n`));
153
+ let lastContent = '';
154
+ manager.on('output-changed', (event) => {
155
+ if (event.paneId === opts.pane) {
156
+ const content = event.data.content;
157
+ if (content !== lastContent) {
158
+ process.stdout.write('\x1B[2J\x1B[H');
159
+ console.log(chalk_1.default.dim(`--- ${session}:${opts.pane} @ ${event.timestamp.toLocaleTimeString()} ---\n`));
160
+ console.log(content);
161
+ lastContent = content;
162
+ }
163
+ }
164
+ });
165
+ manager.startMonitoringPane(session, opts.pane, parseInt(opts.interval));
166
+ process.on('SIGINT', () => {
167
+ manager.stopMonitoring();
168
+ console.log(chalk_1.default.yellow('\nMonitoring stopped.'));
169
+ process.exit(0);
170
+ });
171
+ await new Promise(() => { });
172
+ });
173
+ }
174
+ function registerWindowCommands(program, manager) {
175
+ program
176
+ .command('add-window <session> <name>')
177
+ .description('Add a new window to a session')
178
+ .option('-c, --command <cmd>', 'Command to run in the new window')
179
+ .action(async (session, name, opts) => {
180
+ try {
181
+ await manager.addWindow(session, name, opts.command);
182
+ console.log(chalk_1.default.green(`Window "${name}" added to "${session}"`));
183
+ const s = await manager.getSession(session);
184
+ (0, format_1.printSessionDetails)(s);
185
+ }
186
+ catch (err) {
187
+ console.error(chalk_1.default.red(err.message));
188
+ process.exit(1);
189
+ }
190
+ });
191
+ program
192
+ .command('rename-window <session> <windowIndex> <newName>')
193
+ .description('Rename a window')
194
+ .action(async (session, windowIndex, newName) => {
195
+ try {
196
+ await manager.renameWindow(session, parseInt(windowIndex), newName);
197
+ console.log(chalk_1.default.green(`Window ${windowIndex} renamed to "${newName}"`));
198
+ }
199
+ catch (err) {
200
+ console.error(chalk_1.default.red(err.message));
201
+ process.exit(1);
202
+ }
203
+ });
204
+ }
205
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":";;;;;AAKA,gDAgBC;AAED,0DAQC;AAED,sDAmBC;AAED,kDAaC;AAED,kDAeC;AAED,wDA0BC;AAED,sDAkBC;AAED,wDAqCC;AAED,wDA6BC;AAxMD,kDAA0B;AAC1B,sCAAgD;AAEhD,SAAgB,kBAAkB,CAAC,OAAgB,EAAE,OAA2B;IAC9E,OAAO;SACJ,OAAO,CAAC,yBAAyB,CAAC;SAClC,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAc,EAAE,IAAI,EAAE,EAAE;QACtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,aAAa,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAAgB,EAAE,OAA2B;IACnF,OAAO;SACJ,OAAO,CAAC,kCAAkC,CAAC;SAC3C,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,WAAmB,EAAE,EAAE;QACrD,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,OAAO,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB,EAAE,OAA2B;IACjF,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,YAAY,OAAO,aAAa,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,iBAAiB,OAAO,+BAA+B,CAAC,CAAC,CAAC;YAChF,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,OAA2B;IAC/E,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,OAAO,UAAU,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB,EAAE,OAA2B;IAC/E,OAAO;SACJ,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,aAAa,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,OAA2B;IAClF,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;SAClD,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;SACtD,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG;gBACrB,CAAC,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;gBAClD,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAExE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB,EAAE,OAA2B;IACjF,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,cAAc,OAAO,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;YAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3B,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,OAA2B;IAClF,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,KAAK,CAAC;SAC/C,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,OAAO,IAAI,IAAI,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC;QAEjF,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAY,KAAK,CAAC,IAAY,CAAC,OAAO,CAAC;gBACpD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBACtC,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,QAAQ,CAC9E,CACF,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACrB,WAAW,GAAG,OAAO,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,OAA2B;IAClF,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,qBAAqB,EAAE,kCAAkC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;QACpD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,WAAW,IAAI,eAAe,OAAO,GAAG,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAA,4BAAmB,EAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,iDAAiD,CAAC;SAC1D,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,WAAmB,EAAE,OAAe,EAAE,EAAE;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,WAAW,gBAAgB,OAAO,GAAG,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import { TmuxSessionManager } from '@clux-cli/core';
3
+ export declare function registerStatsCommand(program: Command, manager: TmuxSessionManager): void;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerStatsCommand = registerStatsCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const cli_table3_1 = __importDefault(require("cli-table3"));
9
+ const format_1 = require("../format");
10
+ function registerStatsCommand(program, manager) {
11
+ program
12
+ .command('stats [session]')
13
+ .description('Show session statistics')
14
+ .action(async (session) => {
15
+ const stats = manager.store.getStats(session);
16
+ if (stats.totalSessions === 0) {
17
+ console.log(chalk_1.default.yellow(session ? `No data for "${session}".` : 'No session data yet.'));
18
+ return;
19
+ }
20
+ if (!session) {
21
+ console.log(chalk_1.default.bold(`\n Overall Statistics`));
22
+ console.log(` Total sessions: ${chalk_1.default.cyan(String(stats.totalSessions))}`);
23
+ console.log(` Total commands: ${chalk_1.default.cyan(String(stats.totalCommands))}`);
24
+ console.log('');
25
+ }
26
+ const table = new cli_table3_1.default({
27
+ head: [
28
+ chalk_1.default.cyan('Session'),
29
+ chalk_1.default.cyan('Commands'),
30
+ chalk_1.default.cyan('Duration'),
31
+ chalk_1.default.cyan('Last Active'),
32
+ chalk_1.default.cyan('Template'),
33
+ chalk_1.default.cyan('Project'),
34
+ ],
35
+ style: { head: [], border: ['dim'] },
36
+ });
37
+ for (const s of stats.sessions) {
38
+ table.push([
39
+ chalk_1.default.bold(s.name),
40
+ String(s.commandsSent),
41
+ s.durationHuman,
42
+ (0, format_1.formatRelativeTime)(new Date(s.lastActivity)),
43
+ s.template || chalk_1.default.dim('-'),
44
+ chalk_1.default.dim(s.projectPath || '-'),
45
+ ]);
46
+ }
47
+ console.log(table.toString());
48
+ });
49
+ }
50
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":";;;;;AAMA,oDA4CC;AAhDD,kDAA0B;AAC1B,4DAA+B;AAC/B,sCAA+C;AAE/C,SAAgB,oBAAoB,CAAC,OAAgB,EAAE,OAA2B;IAChF,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC1F,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,qBAAqB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,sBAAsB,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;YACtB,IAAI,EAAE;gBACJ,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBACrB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtB,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC;gBACzB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBACtB,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC;aACtB;YACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE;SACrC,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClB,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;gBACtB,CAAC,CAAC,aAAa;gBACf,IAAA,2BAAkB,EAAC,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC5C,CAAC,CAAC,QAAQ,IAAI,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC5B,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TmuxSession } from '@clux-cli/core';
2
+ export declare function printSessionDetails(session: TmuxSession): void;
3
+ export declare function formatRelativeTime(date: Date): string;
package/dist/format.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.printSessionDetails = printSessionDetails;
7
+ exports.formatRelativeTime = formatRelativeTime;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ function printSessionDetails(session) {
10
+ console.log(`\n ${chalk_1.default.bold(session.name)}`);
11
+ console.log(` Status: ${session.isAttached ? chalk_1.default.green('attached') : chalk_1.default.yellow('detached')}`);
12
+ console.log(` Created: ${session.createdAt.toLocaleString()}`);
13
+ for (const win of session.windows) {
14
+ console.log(`\n ${chalk_1.default.cyan(`Window ${win.index}: ${win.name}`)} ${win.isActive ? chalk_1.default.green('(active)') : ''}`);
15
+ for (const pane of win.panes) {
16
+ console.log(` Pane ${pane.index}: ${pane.width}x${pane.height} pid=${pane.pid} ${chalk_1.default.dim(pane.currentPath)}`);
17
+ }
18
+ }
19
+ }
20
+ function formatRelativeTime(date) {
21
+ const diff = Date.now() - date.getTime();
22
+ const mins = Math.floor(diff / 60000);
23
+ if (mins < 1)
24
+ return 'just now';
25
+ if (mins < 60)
26
+ return `${mins}m ago`;
27
+ const hours = Math.floor(mins / 60);
28
+ if (hours < 24)
29
+ return `${hours}h ago`;
30
+ const days = Math.floor(hours / 24);
31
+ return `${days}d ago`;
32
+ }
33
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":";;;;;AAGA,kDAiBC;AAED,gDASC;AA/BD,kDAA0B;AAG1B,SAAgB,mBAAmB,CAAC,OAAoB;IACtD,OAAO,CAAC,GAAG,CAAC,OAAO,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CACT,cAAc,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CACxF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAEhE,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,OAAO,eAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CACvG,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CACT,YAAY,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,GAAG,KAAK,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAU;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtC,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAChC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const format_1 = require("./format");
5
+ (0, vitest_1.describe)('formatRelativeTime', () => {
6
+ (0, vitest_1.it)('returns "just now" for dates less than a minute ago', () => {
7
+ const now = new Date();
8
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(now)).toBe('just now');
9
+ const thirtySecondsAgo = new Date(Date.now() - 30 * 1000);
10
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(thirtySecondsAgo)).toBe('just now');
11
+ });
12
+ (0, vitest_1.it)('returns minutes ago for dates within the last hour', () => {
13
+ const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000);
14
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(fiveMinutesAgo)).toBe('5m ago');
15
+ const thirtyMinutesAgo = new Date(Date.now() - 30 * 60 * 1000);
16
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(thirtyMinutesAgo)).toBe('30m ago');
17
+ });
18
+ (0, vitest_1.it)('returns hours ago for dates within the last day', () => {
19
+ const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000);
20
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(twoHoursAgo)).toBe('2h ago');
21
+ const twentyThreeHoursAgo = new Date(Date.now() - 23 * 60 * 60 * 1000);
22
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(twentyThreeHoursAgo)).toBe('23h ago');
23
+ });
24
+ (0, vitest_1.it)('returns days ago for dates older than a day', () => {
25
+ const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
26
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(oneDayAgo)).toBe('1d ago');
27
+ const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
28
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(sevenDaysAgo)).toBe('7d ago');
29
+ });
30
+ (0, vitest_1.it)('returns exactly 1m ago at the 1 minute boundary', () => {
31
+ const oneMinuteAgo = new Date(Date.now() - 60 * 1000);
32
+ (0, vitest_1.expect)((0, format_1.formatRelativeTime)(oneMinuteAgo)).toBe('1m ago');
33
+ });
34
+ });
35
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const core_1 = require("@clux-cli/core");
6
+ const create_1 = require("./commands/create");
7
+ const list_1 = require("./commands/list");
8
+ const info_1 = require("./commands/info");
9
+ const session_1 = require("./commands/session");
10
+ const relay_1 = require("./commands/relay");
11
+ const stats_1 = require("./commands/stats");
12
+ const claude_1 = require("./commands/claude");
13
+ const manager = new core_1.TmuxSessionManager();
14
+ const program = new commander_1.Command();
15
+ program.name('clux').description('Clux — tmux session multiplexer').version('0.1.0');
16
+ (0, create_1.registerCreateCommand)(program, manager);
17
+ (0, list_1.registerListCommand)(program, manager);
18
+ (0, info_1.registerInfoCommand)(program, manager);
19
+ (0, session_1.registerTagCommand)(program, manager);
20
+ (0, session_1.registerDescribeCommand)(program, manager);
21
+ (0, relay_1.registerRelayCommand)(program, manager);
22
+ (0, stats_1.registerStatsCommand)(program, manager);
23
+ (0, session_1.registerWindowCommands)(program, manager);
24
+ (0, session_1.registerSendCommand)(program, manager);
25
+ (0, session_1.registerCaptureCommand)(program, manager);
26
+ (0, session_1.registerExportCommand)(program, manager);
27
+ (0, session_1.registerMonitorCommand)(program, manager);
28
+ (0, session_1.registerAttachCommand)(program, manager);
29
+ (0, session_1.registerKillCommand)(program, manager);
30
+ (0, claude_1.registerClaudeCommand)(program, manager);
31
+ program.parse();
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,yCAAoD;AACpD,8CAA0D;AAC1D,0CAAsD;AACtD,0CAAsD;AACtD,gDAU4B;AAC5B,4CAAwD;AACxD,4CAAwD;AACxD,8CAA0D;AAE1D,MAAM,OAAO,GAAG,IAAI,yBAAkB,EAAE,CAAC;AACzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAErF,IAAA,8BAAqB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,IAAA,0BAAmB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,IAAA,0BAAmB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,IAAA,4BAAkB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrC,IAAA,iCAAuB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,IAAA,4BAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,IAAA,4BAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACvC,IAAA,gCAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACzC,IAAA,6BAAmB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,IAAA,gCAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACzC,IAAA,+BAAqB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,IAAA,gCAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACzC,IAAA,+BAAqB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,IAAA,6BAAmB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACtC,IAAA,8BAAqB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,OAAO,CAAC,KAAK,EAAE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@clux-cli/cli",
3
+ "version": "0.2.0",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "clux": "dist/index.js"
8
+ },
9
+ "files": ["dist"],
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/michalsikora/clux.git",
13
+ "directory": "packages/cli"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "watch": "tsc --watch",
18
+ "start": "node dist/index.js"
19
+ },
20
+ "dependencies": {
21
+ "@clux-cli/core": "*",
22
+ "@clux-cli/web": "*",
23
+ "commander": "^13.0.0",
24
+ "chalk": "^4.1.2",
25
+ "cli-table3": "^0.6.5",
26
+ "ora": "^5.4.1",
27
+ "express": "^4.21.0",
28
+ "ws": "^8.18.0"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.7.0",
32
+ "@types/node": "^22.0.0"
33
+ }
34
+ }