@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,216 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { spawn } from "node:child_process";
4
+ import { createRequire } from "node:module";
5
+ import { fileURLToPath } from "node:url";
6
+ import { dirname, join } from "node:path";
7
+ import { existsSync } from "node:fs";
8
+ import { DEFAULT_SERVER_PORT, DEFAULT_DASHBOARD_PORT } from "@claudecam/shared";
9
+ import { logger } from "../utils/logger.js";
10
+ import { writeConfig } from "../utils/config.js";
11
+ export const startCommand = new Command("start")
12
+ .description("Start the Claude Agent Monitor server and dashboard")
13
+ .option("-p, --port <port>", "Server port", String(DEFAULT_SERVER_PORT))
14
+ .option("-d, --dashboard-port <port>", "Dashboard port", String(DEFAULT_DASHBOARD_PORT))
15
+ .option("-t, --theme <theme>", "Dashboard theme: pixel, modern, terminal", "modern")
16
+ .option("--no-open", "Do not open browser automatically")
17
+ .action(async (options) => {
18
+ const serverPort = parseInt(options.port, 10);
19
+ const dashboardPort = parseInt(options.dashboardPort, 10);
20
+ if (isNaN(serverPort) || serverPort < 1 || serverPort > 65535) {
21
+ logger.error(`Invalid server port: ${options.port}`);
22
+ process.exit(1);
23
+ }
24
+ if (isNaN(dashboardPort) || dashboardPort < 1 || dashboardPort > 65535) {
25
+ logger.error(`Invalid dashboard port: ${options.dashboardPort}`);
26
+ process.exit(1);
27
+ }
28
+ // Save config
29
+ writeConfig({
30
+ serverPort,
31
+ dashboardPort,
32
+ theme: options.theme,
33
+ });
34
+ logger.banner();
35
+ // Check if server is already running
36
+ try {
37
+ const response = await fetch(`http://localhost:${serverPort}/api/health`);
38
+ if (response.ok) {
39
+ logger.warning(`Server is already running on port ${serverPort}`);
40
+ logger.info(`Dashboard: ${chalk.cyan(`http://localhost:${serverPort}`)}`);
41
+ logger.blank();
42
+ return;
43
+ }
44
+ }
45
+ catch {
46
+ // Server not running, proceed to start
47
+ }
48
+ // Resolve the server package entry point
49
+ let serverEntryPoint;
50
+ try {
51
+ const require = createRequire(import.meta.url);
52
+ serverEntryPoint = require.resolve("@claudecam/server");
53
+ }
54
+ catch {
55
+ // Fallback: try relative path in monorepo
56
+ const thisDir = import.meta.url;
57
+ const serverUrl = new URL("../../../server/dist/index.js", thisDir);
58
+ serverEntryPoint = fileURLToPath(serverUrl);
59
+ }
60
+ // Resolve the dashboard dist path for static file serving
61
+ const dashboardDistPath = resolveDashboardPath();
62
+ if (dashboardDistPath) {
63
+ logger.keyValue("Server", `http://localhost:${serverPort}`);
64
+ logger.keyValue("Dashboard", `http://localhost:${serverPort} ${chalk.gray("(integrated)")}`);
65
+ }
66
+ else {
67
+ logger.keyValue("Server", `http://localhost:${serverPort}`);
68
+ logger.keyValue("Dashboard", `http://localhost:${dashboardPort} ${chalk.gray("(dev mode)")}`);
69
+ }
70
+ logger.keyValue("Theme", options.theme);
71
+ logger.blank();
72
+ // Start server process
73
+ const env = {
74
+ ...process.env,
75
+ CAM_PORT: String(serverPort),
76
+ CAM_THEME: options.theme,
77
+ NODE_ENV: process.env["NODE_ENV"] ?? "production",
78
+ };
79
+ // In production, server serves dashboard static files on the same port
80
+ if (dashboardDistPath) {
81
+ env["CAM_DASHBOARD_PATH"] = dashboardDistPath;
82
+ }
83
+ const serverProcess = spawn("node", [serverEntryPoint], {
84
+ env,
85
+ stdio: ["ignore", "pipe", "pipe"],
86
+ detached: false,
87
+ });
88
+ serverProcess.stdout?.on("data", (data) => {
89
+ const lines = data.toString().trim().split("\n");
90
+ for (const line of lines) {
91
+ if (line.trim()) {
92
+ logger.info(line.trim());
93
+ }
94
+ }
95
+ });
96
+ serverProcess.stderr?.on("data", (data) => {
97
+ const lines = data.toString().trim().split("\n");
98
+ for (const line of lines) {
99
+ if (line.trim()) {
100
+ logger.error(line.trim());
101
+ }
102
+ }
103
+ });
104
+ serverProcess.on("error", (err) => {
105
+ logger.error(`Failed to start server: ${err.message}`);
106
+ logger.info("Make sure @claudecam/server is built. Run: pnpm --filter @claudecam/server build");
107
+ process.exit(1);
108
+ });
109
+ serverProcess.on("exit", (code) => {
110
+ if (code !== null && code !== 0) {
111
+ logger.error(`Server exited with code ${code}`);
112
+ process.exit(code);
113
+ }
114
+ logger.info("Server stopped.");
115
+ process.exit(0);
116
+ });
117
+ // Open browser after server is ready
118
+ if (options.open) {
119
+ const browserUrl = dashboardDistPath
120
+ ? `http://localhost:${serverPort}`
121
+ : `http://localhost:${dashboardPort}`;
122
+ waitForServer(serverPort, 10_000).then((ready) => {
123
+ if (ready) {
124
+ openBrowser(browserUrl);
125
+ }
126
+ });
127
+ }
128
+ logger.info("Waiting for Claude Code events...");
129
+ logger.info(chalk.gray("(Press Ctrl+C to stop)"));
130
+ logger.blank();
131
+ // Handle graceful shutdown
132
+ const shutdown = () => {
133
+ logger.blank();
134
+ logger.info("Shutting down...");
135
+ serverProcess.kill("SIGTERM");
136
+ // Force kill after 5 seconds
137
+ setTimeout(() => {
138
+ serverProcess.kill("SIGKILL");
139
+ process.exit(0);
140
+ }, 5000);
141
+ };
142
+ process.on("SIGINT", shutdown);
143
+ process.on("SIGTERM", shutdown);
144
+ });
145
+ function resolveDashboardPath() {
146
+ // Try to resolve @claudecam/dashboard's dist folder
147
+ try {
148
+ const require = createRequire(import.meta.url);
149
+ const dashboardPkg = require.resolve("@claudecam/dashboard/package.json");
150
+ const dashboardDir = dirname(dashboardPkg);
151
+ const distPath = join(dashboardDir, "dist");
152
+ if (existsSync(join(distPath, "index.html"))) {
153
+ return distPath;
154
+ }
155
+ }
156
+ catch {
157
+ // Not found via require.resolve
158
+ }
159
+ // Fallback: try relative path in monorepo
160
+ try {
161
+ const thisFile = fileURLToPath(import.meta.url);
162
+ const thisDir = dirname(thisFile);
163
+ const monorepoDist = join(thisDir, "..", "..", "..", "dashboard", "dist");
164
+ if (existsSync(join(monorepoDist, "index.html"))) {
165
+ return monorepoDist;
166
+ }
167
+ }
168
+ catch {
169
+ // Not in monorepo
170
+ }
171
+ return undefined;
172
+ }
173
+ async function waitForServer(port, timeoutMs) {
174
+ const start = Date.now();
175
+ const interval = 500;
176
+ while (Date.now() - start < timeoutMs) {
177
+ try {
178
+ const response = await fetch(`http://localhost:${port}/api/health`);
179
+ if (response.ok)
180
+ return true;
181
+ }
182
+ catch {
183
+ // Not ready yet
184
+ }
185
+ await new Promise((resolve) => setTimeout(resolve, interval));
186
+ }
187
+ return false;
188
+ }
189
+ function openBrowser(url) {
190
+ const platform = process.platform;
191
+ let command;
192
+ let args;
193
+ if (platform === "darwin") {
194
+ command = "open";
195
+ args = [url];
196
+ }
197
+ else if (platform === "win32") {
198
+ command = "cmd";
199
+ args = ["/c", "start", "", url];
200
+ }
201
+ else {
202
+ command = "xdg-open";
203
+ args = [url];
204
+ }
205
+ try {
206
+ const child = spawn(command, args, {
207
+ stdio: "ignore",
208
+ detached: true,
209
+ });
210
+ child.unref();
211
+ }
212
+ catch {
213
+ // Silently fail if browser can't be opened
214
+ }
215
+ }
216
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const statusCommand: Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,eAAO,MAAM,aAAa,SAqMtB,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { execSync } from "node:child_process";
4
+ import { DEFAULT_SERVER_PORT } from "@claudecam/shared";
5
+ import { logger } from "../utils/logger.js";
6
+ import { readConfig, claudeSettingsExist, readClaudeSettings, } from "../utils/config.js";
7
+ import { listConfiguredCamHooks } from "../utils/hooks-config.js";
8
+ export const statusCommand = new Command("status")
9
+ .description("Show Claude Agent Monitor server status and diagnostics")
10
+ .action(async () => {
11
+ const config = readConfig();
12
+ const port = config.serverPort || DEFAULT_SERVER_PORT;
13
+ logger.blank();
14
+ logger.section("Claude Agent Monitor - Status");
15
+ logger.blank();
16
+ // 1. Server status
17
+ let serverOnline = false;
18
+ let sseConnections = 0;
19
+ try {
20
+ const response = await fetch(`http://localhost:${port}/api/health`);
21
+ if (response.ok) {
22
+ serverOnline = true;
23
+ const health = (await response.json());
24
+ sseConnections = health.connections;
25
+ }
26
+ }
27
+ catch {
28
+ // Server not running
29
+ }
30
+ logger.keyValue("Server", serverOnline
31
+ ? chalk.green("Online") + chalk.gray(` (port ${port})`)
32
+ : chalk.red("Offline"));
33
+ if (serverOnline) {
34
+ logger.keyValue("SSE Connections", String(sseConnections));
35
+ }
36
+ // 2. Sessions info
37
+ if (serverOnline) {
38
+ try {
39
+ const response = await fetch(`http://localhost:${port}/api/sessions`);
40
+ if (response.ok) {
41
+ const data = (await response.json());
42
+ const activeSessions = data.sessions.filter((s) => s.status === "active");
43
+ const totalEvents = data.sessions.reduce((sum, s) => sum + s.eventCount, 0);
44
+ const totalAgents = data.sessions.reduce((sum, s) => sum + s.agentCount, 0);
45
+ logger.blank();
46
+ logger.section("Sessions");
47
+ logger.keyValue("Active", chalk.yellow(String(activeSessions.length)));
48
+ logger.keyValue("Total", String(data.sessions.length));
49
+ logger.keyValue("Total Events", String(totalEvents));
50
+ logger.keyValue("Total Agents", String(totalAgents));
51
+ if (activeSessions.length > 0) {
52
+ logger.blank();
53
+ logger.section("Active Sessions");
54
+ for (const session of activeSessions) {
55
+ const elapsed = getElapsed(session.startedAt);
56
+ logger.item(`${chalk.cyan(session.id.slice(0, 8))} - ` +
57
+ `${elapsed} ago, ${session.agentCount} agents, ${session.eventCount} events`);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ catch {
63
+ logger.warning("Failed to fetch session data");
64
+ }
65
+ }
66
+ // 3. Registered Projects
67
+ if (serverOnline) {
68
+ try {
69
+ const response = await fetch(`http://localhost:${port}/api/registry`);
70
+ if (response.ok) {
71
+ const data = (await response.json());
72
+ logger.blank();
73
+ logger.section("Registered Projects");
74
+ if (data.registrations.length === 0) {
75
+ logger.info("No projects registered. Run " +
76
+ chalk.cyan("'cam init'") +
77
+ " in a project directory.");
78
+ }
79
+ else {
80
+ for (const reg of data.registrations) {
81
+ const hookIcon = reg.hooks_installed
82
+ ? chalk.green("\u2713")
83
+ : chalk.yellow("\u25CB");
84
+ const statusColor = reg.project_status === "active" ? chalk.green : chalk.gray;
85
+ const dirName = reg.working_directory.split("/").pop() ||
86
+ reg.working_directory.split("\\").pop() ||
87
+ reg.working_directory;
88
+ logger.item(`${hookIcon} ${chalk.cyan(reg.project_name || dirName)} ` +
89
+ `${statusColor(`(${reg.project_status})`)} ` +
90
+ chalk.gray(`[${dirName}]`));
91
+ }
92
+ logger.keyValue("Total", String(data.registrations.length));
93
+ }
94
+ }
95
+ }
96
+ catch {
97
+ logger.warning("Failed to fetch registered projects");
98
+ }
99
+ }
100
+ // 4. Hooks configuration check
101
+ logger.blank();
102
+ logger.section("Hooks");
103
+ if (claudeSettingsExist()) {
104
+ const settings = readClaudeSettings();
105
+ const camHooks = listConfiguredCamHooks(settings);
106
+ if (camHooks.length > 0) {
107
+ logger.keyValue("Settings", chalk.green("Configured"));
108
+ logger.keyValue("CAM Hooks", chalk.green(String(camHooks.length)));
109
+ for (const hook of camHooks) {
110
+ logger.item(`${chalk.white(hook.hookType)} ${chalk.gray(hook.command)}`);
111
+ }
112
+ }
113
+ else {
114
+ logger.keyValue("Settings", chalk.yellow("Exists but no CAM hooks"));
115
+ logger.info(`Run ${chalk.cyan("'cam init'")} to configure hooks.`);
116
+ }
117
+ }
118
+ else {
119
+ logger.keyValue("Settings", chalk.red("Not configured"));
120
+ logger.info(`Run ${chalk.cyan("'cam init'")} to create .claude/settings.json`);
121
+ }
122
+ // 5. cam-hook binary check
123
+ logger.blank();
124
+ logger.section("Binary");
125
+ const camHookAvailable = checkBinaryAvailable("cam-hook");
126
+ logger.keyValue("cam-hook", camHookAvailable ? chalk.green("Available") : chalk.red("Not in PATH"));
127
+ if (!camHookAvailable) {
128
+ logger.info(`Install: ${chalk.cyan("npm install -g claudecam")}`);
129
+ }
130
+ // 6. Quick health summary
131
+ logger.blank();
132
+ logger.section("Health");
133
+ const checks = [
134
+ { label: "Server running", ok: serverOnline },
135
+ {
136
+ label: "Hooks configured",
137
+ ok: claudeSettingsExist() &&
138
+ listConfiguredCamHooks(readClaudeSettings()).length > 0,
139
+ },
140
+ { label: "cam-hook in PATH", ok: camHookAvailable },
141
+ ];
142
+ for (const check of checks) {
143
+ const icon = check.ok ? chalk.green("\u2713") : chalk.red("\u2717");
144
+ console.log(` ${icon} ${check.label}`);
145
+ }
146
+ const allOk = checks.every((c) => c.ok);
147
+ if (!allOk) {
148
+ logger.blank();
149
+ if (!serverOnline) {
150
+ logger.info(`Start server: ${chalk.cyan("cam start")}`);
151
+ }
152
+ }
153
+ logger.blank();
154
+ });
155
+ function getElapsed(isoTimestamp) {
156
+ const start = new Date(isoTimestamp).getTime();
157
+ const now = Date.now();
158
+ const diffMs = now - start;
159
+ const seconds = Math.floor(diffMs / 1000);
160
+ if (seconds < 60)
161
+ return `${seconds}s`;
162
+ const minutes = Math.floor(seconds / 60);
163
+ if (minutes < 60)
164
+ return `${minutes}m ${seconds % 60}s`;
165
+ const hours = Math.floor(minutes / 60);
166
+ return `${hours}h ${minutes % 60}m`;
167
+ }
168
+ function checkBinaryAvailable(name) {
169
+ try {
170
+ const cmd = process.platform === "win32" ? `where ${name}` : `which ${name}`;
171
+ execSync(cmd, { stdio: "ignore" });
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ }
178
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const tasksCommand: Command;
3
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoGpC,eAAO,MAAM,YAAY,SAsItB,CAAC"}
@@ -0,0 +1,176 @@
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 statusColor(status) {
22
+ switch (status) {
23
+ case 'completed':
24
+ return chalk.green(status);
25
+ case 'in_progress':
26
+ return chalk.yellow(status);
27
+ case 'in_review':
28
+ return chalk.cyan(status);
29
+ case 'blocked':
30
+ return chalk.red(status);
31
+ case 'planned':
32
+ return chalk.blue(status);
33
+ case 'pending':
34
+ case 'backlog':
35
+ case 'deferred':
36
+ default:
37
+ return chalk.gray(status);
38
+ }
39
+ }
40
+ function priorityColor(priority) {
41
+ switch (priority) {
42
+ case 'critical':
43
+ return chalk.red(priority);
44
+ case 'high':
45
+ return chalk.yellow(priority);
46
+ case 'medium':
47
+ return chalk.white(priority);
48
+ case 'low':
49
+ return chalk.gray(priority);
50
+ default:
51
+ return chalk.gray(priority);
52
+ }
53
+ }
54
+ function truncate(str, maxLen) {
55
+ if (str.length <= maxLen)
56
+ return str;
57
+ return str.slice(0, maxLen - 3) + '...';
58
+ }
59
+ export const tasksCommand = new Command('tasks')
60
+ .description('List tasks for the active project')
61
+ .option('--all', 'List all tasks (not just active sprint)')
62
+ .option('--status <status>', 'Filter by status')
63
+ .option('--agent <name>', 'Filter by assigned agent')
64
+ .option('--blocked', 'Show only blocked tasks')
65
+ .option('--priority <priority>', 'Filter by priority')
66
+ .action(async (options) => {
67
+ const projectId = requireActiveProject();
68
+ logger.blank();
69
+ try {
70
+ // Build query params
71
+ const params = new URLSearchParams();
72
+ if (options.blocked) {
73
+ params.set('status', 'blocked');
74
+ }
75
+ else if (options.status) {
76
+ params.set('status', options.status);
77
+ }
78
+ if (options.agent) {
79
+ params.set('agent', options.agent);
80
+ }
81
+ if (options.priority) {
82
+ params.set('priority', options.priority);
83
+ }
84
+ // If not --all, find active sprint and filter by it
85
+ if (!options.all && !options.status && !options.blocked) {
86
+ const sprintsResponse = await fetch(`${getApiBase()}/api/projects/${projectId}/sprints`);
87
+ if (sprintsResponse.ok) {
88
+ const sprintsData = (await sprintsResponse.json());
89
+ const activeSprint = sprintsData.sprints.find((s) => s.status === 'active');
90
+ if (activeSprint) {
91
+ params.set('sprint_id', activeSprint.id);
92
+ logger.section(`Tasks - Sprint: ${activeSprint.name}`);
93
+ }
94
+ else {
95
+ logger.section('Tasks (no active sprint, showing all)');
96
+ }
97
+ }
98
+ else {
99
+ logger.section('Tasks');
100
+ }
101
+ }
102
+ else {
103
+ const label = options.blocked
104
+ ? 'Blocked Tasks'
105
+ : options.status
106
+ ? `Tasks (status: ${options.status})`
107
+ : options.agent
108
+ ? `Tasks (agent: ${options.agent})`
109
+ : 'All Tasks';
110
+ logger.section(label);
111
+ }
112
+ logger.blank();
113
+ const queryString = params.toString();
114
+ const url = `${getApiBase()}/api/projects/${projectId}/tasks${queryString ? `?${queryString}` : ''}`;
115
+ const response = await fetch(url);
116
+ if (!response.ok) {
117
+ if (response.status === 404) {
118
+ logger.error('Active project not found on server.');
119
+ }
120
+ else {
121
+ logger.error(`Server responded with status ${response.status}`);
122
+ }
123
+ logger.blank();
124
+ process.exit(1);
125
+ }
126
+ const data = (await response.json());
127
+ if (data.tasks.length === 0) {
128
+ logger.info('No tasks found matching the filters.');
129
+ logger.blank();
130
+ return;
131
+ }
132
+ // Render table header
133
+ const titleWidth = 40;
134
+ const statusWidth = 14;
135
+ const priorityWidth = 10;
136
+ const agentWidth = 16;
137
+ const header = [
138
+ chalk.bold('Title'.padEnd(titleWidth)),
139
+ chalk.bold('Status'.padEnd(statusWidth)),
140
+ chalk.bold('Priority'.padEnd(priorityWidth)),
141
+ chalk.bold('Agent'.padEnd(agentWidth)),
142
+ ].join(' ');
143
+ logger.info(header);
144
+ logger.info(chalk.gray('-'.repeat(titleWidth + statusWidth + priorityWidth + agentWidth + 6)));
145
+ for (const task of data.tasks) {
146
+ const title = truncate(task.title, titleWidth).padEnd(titleWidth);
147
+ const status = statusColor(task.status.padEnd(statusWidth));
148
+ const priority = priorityColor(task.priority.padEnd(priorityWidth));
149
+ const agent = (task.assignedAgent ?? chalk.gray('-')).toString().padEnd(agentWidth);
150
+ logger.info(`${title} ${status} ${priority} ${agent}`);
151
+ }
152
+ logger.blank();
153
+ // Summary
154
+ const s = data.summary;
155
+ const parts = [];
156
+ if (s.completed > 0)
157
+ parts.push(chalk.green(`${s.completed} completed`));
158
+ if (s.in_progress > 0)
159
+ parts.push(chalk.yellow(`${s.in_progress} in progress`));
160
+ if (s.blocked > 0)
161
+ parts.push(chalk.red(`${s.blocked} blocked`));
162
+ if (s.pending > 0)
163
+ parts.push(chalk.gray(`${s.pending} pending`));
164
+ if (s.planned > 0)
165
+ parts.push(chalk.blue(`${s.planned} planned`));
166
+ if (s.backlog > 0)
167
+ parts.push(chalk.gray(`${s.backlog} backlog`));
168
+ logger.info(chalk.gray(`Total: ${s.total} | `) + parts.join(chalk.gray(' | ')));
169
+ }
170
+ catch {
171
+ logger.error('Server is not running.');
172
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
173
+ }
174
+ logger.blank();
175
+ });
176
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const themeCommand: Command;
3
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/commands/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,YAAY,SAiDrB,CAAC"}