@claudecam/cli 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/cam-hook.d.ts +8 -0
  2. package/dist/cam-hook.d.ts.map +1 -0
  3. package/dist/cam-hook.js +8 -0
  4. package/dist/cam-hook.js.map +1 -0
  5. package/dist/commands/doctor.d.ts +3 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +218 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/hooks.d.ts +3 -0
  10. package/dist/commands/hooks.d.ts.map +1 -0
  11. package/dist/commands/hooks.js +106 -0
  12. package/dist/commands/hooks.js.map +1 -0
  13. package/dist/commands/init.d.ts +3 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +576 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/progress.d.ts +3 -0
  18. package/dist/commands/progress.d.ts.map +1 -0
  19. package/dist/commands/progress.js +157 -0
  20. package/dist/commands/progress.js.map +1 -0
  21. package/dist/commands/project.d.ts +3 -0
  22. package/dist/commands/project.d.ts.map +1 -0
  23. package/dist/commands/project.js +203 -0
  24. package/dist/commands/project.js.map +1 -0
  25. package/dist/commands/sessions.d.ts +3 -0
  26. package/dist/commands/sessions.d.ts.map +1 -0
  27. package/dist/commands/sessions.js +105 -0
  28. package/dist/commands/sessions.js.map +1 -0
  29. package/dist/commands/sprint.d.ts +3 -0
  30. package/dist/commands/sprint.d.ts.map +1 -0
  31. package/dist/commands/sprint.js +552 -0
  32. package/dist/commands/sprint.js.map +1 -0
  33. package/dist/commands/start.d.ts +3 -0
  34. package/dist/commands/start.d.ts.map +1 -0
  35. package/dist/commands/start.js +216 -0
  36. package/dist/commands/start.js.map +1 -0
  37. package/dist/commands/status.d.ts +3 -0
  38. package/dist/commands/status.d.ts.map +1 -0
  39. package/dist/commands/status.js +178 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/commands/tasks.d.ts +3 -0
  42. package/dist/commands/tasks.d.ts.map +1 -0
  43. package/dist/commands/tasks.js +176 -0
  44. package/dist/commands/tasks.js.map +1 -0
  45. package/dist/commands/theme.d.ts +3 -0
  46. package/dist/commands/theme.d.ts.map +1 -0
  47. package/dist/commands/theme.js +63 -0
  48. package/dist/commands/theme.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +31 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/utils/config.d.ts +18 -0
  54. package/dist/utils/config.d.ts.map +1 -0
  55. package/dist/utils/config.js +74 -0
  56. package/dist/utils/config.js.map +1 -0
  57. package/dist/utils/hooks-config.d.ts +28 -0
  58. package/dist/utils/hooks-config.d.ts.map +1 -0
  59. package/dist/utils/hooks-config.js +120 -0
  60. package/dist/utils/hooks-config.js.map +1 -0
  61. package/dist/utils/logger.d.ts +16 -0
  62. package/dist/utils/logger.d.ts.map +1 -0
  63. package/dist/utils/logger.js +39 -0
  64. package/dist/utils/logger.js.map +1 -0
  65. package/dist/utils/sprint-parser.d.ts +32 -0
  66. package/dist/utils/sprint-parser.d.ts.map +1 -0
  67. package/dist/utils/sprint-parser.js +115 -0
  68. package/dist/utils/sprint-parser.js.map +1 -0
  69. package/package.json +48 -20
  70. package/index.js +0 -6
@@ -0,0 +1,157 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { DEFAULT_SERVER_PORT } from '@claudecam/shared';
4
+ import { logger } from '../utils/logger.js';
5
+ import { readConfig } from '../utils/config.js';
6
+ function getApiBase() {
7
+ const config = readConfig();
8
+ const port = config.serverPort || DEFAULT_SERVER_PORT;
9
+ return `http://localhost:${port}`;
10
+ }
11
+ function requireActiveProject() {
12
+ const config = readConfig();
13
+ if (!config.activeProjectId) {
14
+ logger.error('No active project.');
15
+ logger.info(`Run: ${chalk.cyan('cam project show <id>')} to set the active project.`);
16
+ logger.blank();
17
+ process.exit(1);
18
+ }
19
+ return config.activeProjectId;
20
+ }
21
+ function renderProgressBar(percent, width = 20) {
22
+ const filled = Math.round((percent / 100) * width);
23
+ const empty = width - filled;
24
+ return chalk.green('\u2588'.repeat(filled)) + chalk.gray('\u2591'.repeat(empty));
25
+ }
26
+ export const progressCommand = new Command('progress')
27
+ .description('Show project progress overview')
28
+ .option('--full', 'Show detailed progress report')
29
+ .action(async (options) => {
30
+ const projectId = requireActiveProject();
31
+ logger.blank();
32
+ try {
33
+ // Get project details
34
+ const projectResponse = await fetch(`${getApiBase()}/api/projects/${projectId}`);
35
+ if (!projectResponse.ok) {
36
+ if (projectResponse.status === 404) {
37
+ logger.error('Active project not found on server.');
38
+ }
39
+ else {
40
+ logger.error(`Server responded with status ${projectResponse.status}`);
41
+ }
42
+ logger.blank();
43
+ process.exit(1);
44
+ }
45
+ const projectData = (await projectResponse.json());
46
+ const project = projectData.project;
47
+ // Header
48
+ logger.section(`Project: ${project.name}`);
49
+ if (project.currentSprint) {
50
+ logger.keyValue('Sprint', `${project.currentSprint.name} (${chalk.green('active')})`);
51
+ }
52
+ logger.blank();
53
+ // Main progress bar
54
+ logger.keyValue(' ', `[${renderProgressBar(project.completionPercent)}] ${project.completionPercent}% complete`);
55
+ logger.blank();
56
+ // Quick summary
57
+ const tasksResponse = await fetch(`${getApiBase()}/api/projects/${projectId}/tasks`);
58
+ let summary = {
59
+ total: 0,
60
+ backlog: 0,
61
+ planned: 0,
62
+ pending: 0,
63
+ in_progress: 0,
64
+ in_review: 0,
65
+ completed: 0,
66
+ blocked: 0,
67
+ deferred: 0,
68
+ };
69
+ let tasks = [];
70
+ if (tasksResponse.ok) {
71
+ const tasksData = (await tasksResponse.json());
72
+ summary = tasksData.summary;
73
+ tasks = tasksData.tasks;
74
+ }
75
+ const quickParts = [];
76
+ quickParts.push(chalk.green(`${summary.completed} done`));
77
+ if (summary.in_progress > 0)
78
+ quickParts.push(chalk.yellow(`${summary.in_progress} in progress`));
79
+ if (summary.blocked > 0)
80
+ quickParts.push(chalk.red(`${summary.blocked} blocked`));
81
+ const remaining = summary.total - summary.completed;
82
+ if (remaining > 0)
83
+ quickParts.push(chalk.gray(`${remaining} remaining`));
84
+ logger.keyValue('Tasks', `${project.completedTasks}/${project.totalTasks} | ${quickParts.join(' | ')}`);
85
+ logger.blank();
86
+ // Full report
87
+ if (options.full) {
88
+ // Status breakdown
89
+ logger.section('Task Breakdown');
90
+ const statuses = [
91
+ { label: 'Completed', value: summary.completed, color: chalk.green },
92
+ { label: 'In Progress', value: summary.in_progress, color: chalk.yellow },
93
+ { label: 'In Review', value: summary.in_review, color: chalk.cyan },
94
+ { label: 'Pending', value: summary.pending, color: chalk.gray },
95
+ { label: 'Planned', value: summary.planned, color: chalk.blue },
96
+ { label: 'Blocked', value: summary.blocked, color: chalk.red },
97
+ { label: 'Backlog', value: summary.backlog, color: chalk.gray },
98
+ { label: 'Deferred', value: summary.deferred, color: chalk.gray },
99
+ ];
100
+ for (const status of statuses) {
101
+ if (status.value > 0) {
102
+ const bar = status.color('\u2588'.repeat(Math.min(status.value, 30)));
103
+ logger.keyValue(` ${status.label}`, `${bar} ${status.value}`);
104
+ }
105
+ }
106
+ logger.blank();
107
+ // In-progress tasks with agents
108
+ const inProgressTasks = tasks.filter((t) => t.status === 'in_progress');
109
+ if (inProgressTasks.length > 0) {
110
+ logger.section('In Progress');
111
+ for (const task of inProgressTasks) {
112
+ const agent = task.assignedAgent
113
+ ? chalk.cyan(` (${task.assignedAgent})`)
114
+ : '';
115
+ logger.item(`${chalk.yellow(task.title)}${agent}`);
116
+ }
117
+ logger.blank();
118
+ }
119
+ // Blocked tasks
120
+ const blockedTasks = tasks.filter((t) => t.status === 'blocked');
121
+ if (blockedTasks.length > 0) {
122
+ logger.section('Blocked');
123
+ for (const task of blockedTasks) {
124
+ logger.item(chalk.red(task.title));
125
+ }
126
+ logger.blank();
127
+ }
128
+ // Sprint-by-sprint breakdown
129
+ const sprintsResponse = await fetch(`${getApiBase()}/api/projects/${projectId}/sprints`);
130
+ if (sprintsResponse.ok) {
131
+ const sprintsData = (await sprintsResponse.json());
132
+ if (sprintsData.sprints.length > 0) {
133
+ logger.section('Sprint Breakdown');
134
+ logger.blank();
135
+ for (const sprint of sprintsData.sprints) {
136
+ const sprintPercent = sprint.totalTasks > 0
137
+ ? Math.round((sprint.completedTasks / sprint.totalTasks) * 100)
138
+ : 0;
139
+ const statusColor = sprint.status === 'active'
140
+ ? chalk.green
141
+ : sprint.status === 'completed'
142
+ ? chalk.cyan
143
+ : chalk.gray;
144
+ logger.keyValue(` ${sprint.name}`, `${statusColor(sprint.status)} [${renderProgressBar(sprintPercent, 12)}] ${sprintPercent}% (${sprint.completedTasks}/${sprint.totalTasks})`);
145
+ }
146
+ logger.blank();
147
+ }
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ logger.error('Server is not running.');
153
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
154
+ }
155
+ logger.blank();
156
+ });
157
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/commands/progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const projectCommand: Command;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkSpC,eAAO,MAAM,cAAc,SACU,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { DEFAULT_SERVER_PORT } from '@claudecam/shared';
4
+ import { logger } from '../utils/logger.js';
5
+ import { readConfig, writeConfig } from '../utils/config.js';
6
+ function getApiBase() {
7
+ const config = readConfig();
8
+ const port = config.serverPort || DEFAULT_SERVER_PORT;
9
+ return `http://localhost:${port}`;
10
+ }
11
+ function resolveProjectId(idArg) {
12
+ if (idArg)
13
+ return idArg;
14
+ const config = readConfig();
15
+ return config.activeProjectId;
16
+ }
17
+ const listCommand = new Command('list')
18
+ .description('List all projects')
19
+ .action(async () => {
20
+ logger.blank();
21
+ logger.section('Projects');
22
+ logger.blank();
23
+ try {
24
+ const response = await fetch(`${getApiBase()}/api/projects`);
25
+ if (!response.ok) {
26
+ logger.error(`Server responded with status ${response.status}`);
27
+ process.exit(1);
28
+ }
29
+ const data = (await response.json());
30
+ if (data.projects.length === 0) {
31
+ logger.info('No projects found.');
32
+ logger.info(`Create one with: ${chalk.cyan('cam init')}`);
33
+ logger.blank();
34
+ return;
35
+ }
36
+ const config = readConfig();
37
+ for (const project of data.projects) {
38
+ const statusColor = project.status === 'active'
39
+ ? chalk.green
40
+ : project.status === 'completed'
41
+ ? chalk.cyan
42
+ : chalk.gray;
43
+ const percent = project.totalTasks > 0
44
+ ? Math.round((project.completedTasks / project.totalTasks) * 100)
45
+ : 0;
46
+ const isActive = project.id === config.activeProjectId;
47
+ const marker = isActive ? chalk.green(' (active)') : '';
48
+ logger.keyValue(' ID', chalk.cyan(project.id.slice(0, 8)) + marker);
49
+ logger.keyValue(' Name', chalk.white(project.name));
50
+ logger.keyValue(' Status', statusColor(project.status));
51
+ logger.keyValue(' Progress', `${project.completedTasks}/${project.totalTasks} tasks (${percent}%)`);
52
+ logger.blank();
53
+ }
54
+ logger.info(chalk.gray(`${data.projects.length} project(s) found. Use ${chalk.cyan('cam project show <id>')} to see details.`));
55
+ }
56
+ catch {
57
+ logger.error('Server is not running.');
58
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
59
+ }
60
+ logger.blank();
61
+ });
62
+ const showCommand = new Command('show')
63
+ .description('Show project details')
64
+ .argument('[id]', 'Project ID (uses active project if not specified)')
65
+ .action(async (idArg) => {
66
+ logger.blank();
67
+ let projectId = resolveProjectId(idArg);
68
+ try {
69
+ // If no project ID, try to auto-select if there's only one project
70
+ if (!projectId) {
71
+ const listResponse = await fetch(`${getApiBase()}/api/projects`);
72
+ if (!listResponse.ok) {
73
+ logger.error(`Server responded with status ${listResponse.status}`);
74
+ process.exit(1);
75
+ }
76
+ const listData = (await listResponse.json());
77
+ if (listData.projects.length === 0) {
78
+ logger.error('No projects found.');
79
+ logger.info(`Create one with: ${chalk.cyan('cam init')}`);
80
+ logger.blank();
81
+ return;
82
+ }
83
+ if (listData.projects.length === 1) {
84
+ projectId = listData.projects[0].id;
85
+ logger.info(chalk.gray(`Auto-selected project: ${listData.projects[0].name}`));
86
+ logger.blank();
87
+ }
88
+ else {
89
+ logger.error('No active project set and multiple projects exist.');
90
+ logger.info(`Run: ${chalk.cyan('cam project show <id>')} to set the active project.`);
91
+ logger.info(`Run: ${chalk.cyan('cam project list')} to see all projects.`);
92
+ logger.blank();
93
+ return;
94
+ }
95
+ }
96
+ const response = await fetch(`${getApiBase()}/api/projects/${projectId}`);
97
+ if (!response.ok) {
98
+ if (response.status === 404) {
99
+ logger.error(`Project not found: ${projectId}`);
100
+ }
101
+ else {
102
+ logger.error(`Server responded with status ${response.status}`);
103
+ }
104
+ logger.blank();
105
+ process.exit(1);
106
+ }
107
+ const data = (await response.json());
108
+ const project = data.project;
109
+ // Save as active project
110
+ writeConfig({ activeProjectId: project.id });
111
+ logger.section(`Project: ${project.name}`);
112
+ logger.blank();
113
+ logger.keyValue('ID', chalk.cyan(project.id));
114
+ logger.keyValue('Status', project.status === 'active'
115
+ ? chalk.green(project.status)
116
+ : project.status === 'completed'
117
+ ? chalk.cyan(project.status)
118
+ : chalk.gray(project.status));
119
+ if (project.description) {
120
+ logger.keyValue('Description', project.description);
121
+ }
122
+ logger.blank();
123
+ // Progress
124
+ logger.section('Progress');
125
+ logger.keyValue('Tasks', `${project.completedTasks}/${project.totalTasks} completed (${project.completionPercent}%)`);
126
+ const barWidth = 20;
127
+ const filled = Math.round((project.completionPercent / 100) * barWidth);
128
+ const empty = barWidth - filled;
129
+ const bar = chalk.green('\u2588'.repeat(filled)) + chalk.gray('\u2591'.repeat(empty));
130
+ logger.keyValue('Progress', `[${bar}] ${project.completionPercent}%`);
131
+ logger.blank();
132
+ // Current sprint
133
+ if (project.currentSprint) {
134
+ const sprint = project.currentSprint;
135
+ logger.section('Current Sprint');
136
+ logger.keyValue('Name', chalk.yellow(sprint.name));
137
+ logger.keyValue('Tasks', `${sprint.completedTasks}/${sprint.totalTasks} completed (${sprint.completionPercent}%)`);
138
+ logger.blank();
139
+ }
140
+ // Sprints summary
141
+ const sprintsResponse = await fetch(`${getApiBase()}/api/projects/${project.id}/sprints`);
142
+ if (sprintsResponse.ok) {
143
+ const sprintsData = (await sprintsResponse.json());
144
+ if (sprintsData.sprints.length > 0) {
145
+ logger.section(`Sprints (${sprintsData.sprints.length})`);
146
+ for (const sprint of sprintsData.sprints) {
147
+ const sprintStatusColor = sprint.status === 'active'
148
+ ? chalk.green
149
+ : sprint.status === 'completed'
150
+ ? chalk.cyan
151
+ : chalk.gray;
152
+ logger.item(`${chalk.white(sprint.name)} ${sprintStatusColor(sprint.status)} - ${sprint.completedTasks}/${sprint.totalTasks} tasks`);
153
+ }
154
+ logger.blank();
155
+ }
156
+ }
157
+ logger.info(chalk.gray(`Set as active project. Use ${chalk.cyan('cam sprint list')} or ${chalk.cyan('cam tasks')} for details.`));
158
+ }
159
+ catch {
160
+ logger.error('Server is not running.');
161
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
162
+ }
163
+ logger.blank();
164
+ });
165
+ const deleteCommand = new Command('delete')
166
+ .description('Delete a project')
167
+ .argument('<id>', 'Project ID to delete')
168
+ .action(async (id) => {
169
+ logger.blank();
170
+ try {
171
+ const response = await fetch(`${getApiBase()}/api/projects/${id}`, {
172
+ method: 'DELETE',
173
+ });
174
+ if (!response.ok) {
175
+ if (response.status === 404) {
176
+ logger.error(`Project not found: ${id}`);
177
+ }
178
+ else {
179
+ logger.error(`Server responded with status ${response.status}`);
180
+ }
181
+ logger.blank();
182
+ process.exit(1);
183
+ }
184
+ logger.success(`Project deleted: ${chalk.cyan(id.slice(0, 8))}`);
185
+ // Clear active project if it was the deleted one
186
+ const config = readConfig();
187
+ if (config.activeProjectId === id) {
188
+ writeConfig({ activeProjectId: undefined });
189
+ logger.info('Active project cleared.');
190
+ }
191
+ }
192
+ catch {
193
+ logger.error('Server is not running.');
194
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
195
+ }
196
+ logger.blank();
197
+ });
198
+ export const projectCommand = new Command('project')
199
+ .description('Manage CAM projects');
200
+ projectCommand.addCommand(listCommand);
201
+ projectCommand.addCommand(showCommand);
202
+ projectCommand.addCommand(deleteCommand);
203
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const sessionsCommand: Command;
3
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBpC,eAAO,MAAM,eAAe,SA6GxB,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { DEFAULT_SERVER_PORT } from '@claudecam/shared';
5
+ import { logger } from '../utils/logger.js';
6
+ import { readConfig } from '../utils/config.js';
7
+ export const sessionsCommand = new Command('sessions')
8
+ .description('List previous monitoring sessions')
9
+ .option('--clear', 'Clear all session history')
10
+ .option('-l, --limit <count>', 'Number of sessions to show', '10')
11
+ .action(async (options) => {
12
+ const config = readConfig();
13
+ const port = config.serverPort || DEFAULT_SERVER_PORT;
14
+ logger.blank();
15
+ if (options.clear) {
16
+ const spinner = ora('Clearing session history...').start();
17
+ try {
18
+ const listResponse = await fetch(`http://localhost:${port}/api/sessions`);
19
+ if (!listResponse.ok) {
20
+ spinner.fail('Failed to fetch sessions');
21
+ process.exit(1);
22
+ }
23
+ const data = (await listResponse.json());
24
+ let cleared = 0;
25
+ for (const session of data.sessions) {
26
+ try {
27
+ await fetch(`http://localhost:${port}/api/sessions/${session.id}`, {
28
+ method: 'DELETE',
29
+ });
30
+ cleared++;
31
+ }
32
+ catch {
33
+ // Skip failed deletions
34
+ }
35
+ }
36
+ spinner.succeed(`Cleared ${cleared} session(s)`);
37
+ }
38
+ catch {
39
+ spinner.fail('Server not running. Cannot clear sessions.');
40
+ }
41
+ logger.blank();
42
+ return;
43
+ }
44
+ logger.section('Claude Agent Monitor - Sessions');
45
+ logger.blank();
46
+ try {
47
+ const limit = parseInt(options.limit, 10) || 10;
48
+ const response = await fetch(`http://localhost:${port}/api/sessions?limit=${limit}`);
49
+ if (!response.ok) {
50
+ logger.error(`Server responded with status ${response.status}`);
51
+ process.exit(1);
52
+ }
53
+ const data = (await response.json());
54
+ if (data.sessions.length === 0) {
55
+ logger.info('No sessions found.');
56
+ logger.blank();
57
+ return;
58
+ }
59
+ for (const session of data.sessions) {
60
+ const statusColor = session.status === 'active'
61
+ ? chalk.green
62
+ : session.status === 'error'
63
+ ? chalk.red
64
+ : chalk.gray;
65
+ const startDate = new Date(session.startedAt);
66
+ const dateStr = startDate.toLocaleDateString();
67
+ const timeStr = startDate.toLocaleTimeString();
68
+ let duration = '';
69
+ if (session.endedAt) {
70
+ const endDate = new Date(session.endedAt);
71
+ const diffMs = endDate.getTime() - startDate.getTime();
72
+ duration = formatDuration(diffMs);
73
+ }
74
+ else if (session.status === 'active') {
75
+ duration = chalk.green('running');
76
+ }
77
+ logger.keyValue(' Session', chalk.cyan(session.id.slice(0, 8)));
78
+ logger.keyValue(' Status', statusColor(session.status));
79
+ logger.keyValue(' Date', `${dateStr} ${timeStr}`);
80
+ if (duration) {
81
+ logger.keyValue(' Duration', duration);
82
+ }
83
+ logger.keyValue(' Agents', String(session.agentCount));
84
+ logger.keyValue(' Events', String(session.eventCount));
85
+ logger.blank();
86
+ }
87
+ logger.info(chalk.gray(`Showing ${data.sessions.length} session(s). Use --limit to see more.`));
88
+ }
89
+ catch {
90
+ logger.error('Server is not running.');
91
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
92
+ }
93
+ logger.blank();
94
+ });
95
+ function formatDuration(ms) {
96
+ const seconds = Math.floor(ms / 1000);
97
+ if (seconds < 60)
98
+ return `${seconds}s`;
99
+ const minutes = Math.floor(seconds / 60);
100
+ if (minutes < 60)
101
+ return `${minutes}m ${seconds % 60}s`;
102
+ const hours = Math.floor(minutes / 60);
103
+ return `${hours}h ${minutes % 60}m`;
104
+ }
105
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const sprintCommand: Command;
3
+ //# sourceMappingURL=sprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint.d.ts","sourceRoot":"","sources":["../../src/commands/sprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAysBpC,eAAO,MAAM,aAAa,SACc,CAAC"}