@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,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thin wrapper that delegates to @claudecam/hook's entry point.
4
+ * This ensures cam-hook is available in PATH when claudecam is installed globally.
5
+ * The @claudecam/hook index.ts reads process.argv and stdin at module level.
6
+ */
7
+ import "@claudecam/hook";
8
+ //# sourceMappingURL=cam-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cam-hook.d.ts","sourceRoot":"","sources":["../src/cam-hook.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Thin wrapper that delegates to @claudecam/hook's entry point.
4
+ * This ensures cam-hook is available in PATH when claudecam is installed globally.
5
+ * The @claudecam/hook index.ts reads process.argv and stdin at module level.
6
+ */
7
+ import "@claudecam/hook";
8
+ //# sourceMappingURL=cam-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cam-hook.js","sourceRoot":"","sources":["../src/cam-hook.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AACH,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const doctorCommand: Command;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,eAAO,MAAM,aAAa,SAuNtB,CAAC"}
@@ -0,0 +1,218 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { existsSync } from "node:fs";
4
+ import { execSync } from "node:child_process";
5
+ import { DEFAULT_SERVER_PORT } from "@claudecam/shared";
6
+ import { logger } from "../utils/logger.js";
7
+ import { readConfig, claudeSettingsExist, readClaudeSettings, } from "../utils/config.js";
8
+ import { listConfiguredCamHooks, HOOK_TYPE_DESCRIPTIONS, } from "../utils/hooks-config.js";
9
+ export const doctorCommand = new Command("doctor")
10
+ .description("Run diagnostics to verify CAM setup is working correctly")
11
+ .action(async () => {
12
+ const config = readConfig();
13
+ const port = config.serverPort || DEFAULT_SERVER_PORT;
14
+ logger.blank();
15
+ logger.section("Claude Agent Monitor - Doctor");
16
+ logger.blank();
17
+ const results = [];
18
+ // 1. Check cam-hook binary
19
+ const camHookOk = checkBinaryAvailable("cam-hook");
20
+ results.push({
21
+ label: "cam-hook binary in PATH",
22
+ ok: camHookOk,
23
+ detail: camHookOk ? "Found in PATH" : "Not found",
24
+ fix: "npm install -g claudecam",
25
+ });
26
+ // 2. Check .claude/settings.json exists
27
+ const settingsExist = claudeSettingsExist();
28
+ results.push({
29
+ label: ".claude/settings.json exists",
30
+ ok: settingsExist,
31
+ detail: settingsExist ? "Found" : "Not found in current directory",
32
+ fix: "cam init",
33
+ });
34
+ // 3. Check hooks are configured
35
+ let hooksConfigured = 0;
36
+ const expectedHookCount = Object.keys(HOOK_TYPE_DESCRIPTIONS).length;
37
+ if (settingsExist) {
38
+ const settings = readClaudeSettings();
39
+ const camHooks = listConfiguredCamHooks(settings);
40
+ hooksConfigured = camHooks.length;
41
+ }
42
+ results.push({
43
+ label: "CAM hooks configured",
44
+ ok: hooksConfigured >= expectedHookCount,
45
+ detail: `${hooksConfigured}/${expectedHookCount} hooks`,
46
+ fix: hooksConfigured === 0 ? "cam init" : "cam init --force",
47
+ });
48
+ // 4. Check server is running
49
+ let serverOnline = false;
50
+ try {
51
+ const response = await fetch(`http://localhost:${port}/api/health`);
52
+ serverOnline = response.ok;
53
+ }
54
+ catch {
55
+ // Server not running
56
+ }
57
+ results.push({
58
+ label: `Server running on port ${port}`,
59
+ ok: serverOnline,
60
+ detail: serverOnline ? "Responding to health check" : "Not responding",
61
+ fix: "cam start",
62
+ });
63
+ // 5. Test POST to server (send a test event)
64
+ let postOk = false;
65
+ if (serverOnline) {
66
+ try {
67
+ const testEvent = {
68
+ hook: "SessionStart",
69
+ timestamp: new Date().toISOString(),
70
+ session_id: "cam-doctor-test",
71
+ agent_id: "system",
72
+ data: {
73
+ working_directory: process.cwd(),
74
+ hooks_configured: hooksConfigured,
75
+ source: "cam-doctor",
76
+ },
77
+ };
78
+ const response = await fetch(`http://localhost:${port}/api/events`, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify(testEvent),
82
+ });
83
+ postOk = response.ok;
84
+ }
85
+ catch {
86
+ // POST failed
87
+ }
88
+ }
89
+ results.push({
90
+ label: "POST /api/events works",
91
+ ok: postOk,
92
+ detail: postOk
93
+ ? "Test event sent successfully"
94
+ : serverOnline
95
+ ? "POST failed"
96
+ : "Server not running (skipped)",
97
+ fix: serverOnline ? undefined : "cam start",
98
+ });
99
+ // 6. Check Node.js version
100
+ let nodeOk = false;
101
+ let nodeVersion = "unknown";
102
+ try {
103
+ nodeVersion = process.version;
104
+ const major = parseInt(nodeVersion.slice(1).split(".")[0], 10);
105
+ nodeOk = major >= 18;
106
+ }
107
+ catch {
108
+ // Can't determine version
109
+ }
110
+ results.push({
111
+ label: "Node.js >= 18",
112
+ ok: nodeOk,
113
+ detail: nodeVersion,
114
+ fix: "Install Node.js 18+ from https://nodejs.org",
115
+ });
116
+ // 7. Check project is registered
117
+ let registeredOk = false;
118
+ if (serverOnline) {
119
+ try {
120
+ const cwd = process.cwd();
121
+ const response = await fetch(`http://localhost:${port}/api/registry/lookup?dir=${encodeURIComponent(cwd)}`);
122
+ registeredOk = response.ok;
123
+ }
124
+ catch {
125
+ // Not registered
126
+ }
127
+ }
128
+ results.push({
129
+ label: "Project registered in CAM",
130
+ ok: registeredOk,
131
+ detail: registeredOk
132
+ ? "Current directory is registered"
133
+ : serverOnline
134
+ ? "Not registered"
135
+ : "Server not running (skipped)",
136
+ fix: "cam init",
137
+ });
138
+ // 8. Check PRD.md exists
139
+ const hasPrd = ["PRD.md", "prd.md", "PRD.MD"].some((f) => existsSync(f));
140
+ results.push({
141
+ label: "PRD.md found in project",
142
+ ok: hasPrd,
143
+ detail: hasPrd ? "Found" : "Not found (optional - CAM works without it)",
144
+ fix: hasPrd ? undefined : "Optional: create a PRD.md or run 'cam init --prd <path>'",
145
+ warning: true,
146
+ });
147
+ // 9. Check tmux availability (warning only, not a failure)
148
+ const tmuxAvailable = checkBinaryAvailable("tmux");
149
+ results.push({
150
+ label: "tmux available for multi-agent tracking",
151
+ ok: tmuxAvailable,
152
+ detail: tmuxAvailable
153
+ ? "Found in PATH"
154
+ : "Not found (recommended for full E2E tracking)",
155
+ fix: tmuxAvailable
156
+ ? undefined
157
+ : process.platform === "win32"
158
+ ? "Install WSL + tmux for complete per-agent tracking"
159
+ : "Install tmux for complete per-agent tracking",
160
+ warning: true,
161
+ });
162
+ // Display results
163
+ let passCount = 0;
164
+ let failCount = 0;
165
+ let warnCount = 0;
166
+ for (const result of results) {
167
+ if (result.ok) {
168
+ const icon = chalk.green("\u2713");
169
+ const detail = result.detail ? chalk.gray(` (${result.detail})`) : "";
170
+ console.log(` ${icon} ${result.label}${detail}`);
171
+ passCount++;
172
+ }
173
+ else if (result.warning) {
174
+ const icon = chalk.yellow("\u26A0");
175
+ const detail = result.detail ? chalk.gray(` (${result.detail})`) : "";
176
+ console.log(` ${icon} ${result.label}${detail}`);
177
+ warnCount++;
178
+ }
179
+ else {
180
+ const icon = chalk.red("\u2717");
181
+ const detail = result.detail ? chalk.gray(` (${result.detail})`) : "";
182
+ console.log(` ${icon} ${result.label}${detail}`);
183
+ failCount++;
184
+ }
185
+ }
186
+ // Show fixes for failures and warnings
187
+ const fixableResults = results.filter((r) => !r.ok && r.fix);
188
+ if (fixableResults.length > 0) {
189
+ logger.blank();
190
+ logger.section("Fixes");
191
+ for (const result of fixableResults) {
192
+ const color = result.warning ? chalk.gray : chalk.yellow;
193
+ logger.item(`${color(result.label)}: ${chalk.cyan(result.fix)}`);
194
+ }
195
+ }
196
+ // Summary
197
+ logger.blank();
198
+ const warnText = warnCount > 0 ? `, ${warnCount} warning${warnCount > 1 ? "s" : ""}` : "";
199
+ if (failCount === 0) {
200
+ logger.success(`All ${passCount} checks passed${warnText}! CAM is ready to use.`);
201
+ }
202
+ else {
203
+ logger.warning(`${passCount} passed, ${failCount} failed${warnText}. Fix the issues above.`);
204
+ }
205
+ logger.blank();
206
+ process.exit(failCount > 0 ? 1 : 0);
207
+ });
208
+ function checkBinaryAvailable(name) {
209
+ try {
210
+ const cmd = process.platform === "win32" ? `where ${name}` : `which ${name}`;
211
+ execSync(cmd, { stdio: "ignore" });
212
+ return true;
213
+ }
214
+ catch {
215
+ return false;
216
+ }
217
+ }
218
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const hooksCommand: Command;
3
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,YAAY,SA0BrB,CAAC"}
@@ -0,0 +1,106 @@
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 { claudeSettingsExist, readClaudeSettings, writeClaudeSettings, } from '../utils/config.js';
6
+ import { listConfiguredCamHooks, removeCamHooks, HOOK_TYPE_DESCRIPTIONS, } from '../utils/hooks-config.js';
7
+ export const hooksCommand = new Command('hooks')
8
+ .description('Manage Claude Agent Monitor hooks')
9
+ .option('--list', 'List configured CAM hooks')
10
+ .option('--remove', 'Remove CAM hooks (preserves other hooks)')
11
+ .option('--test', 'Send a test event to the server')
12
+ .action(async (options) => {
13
+ // Default to --list if no option specified
14
+ if (!options.list && !options.remove && !options.test) {
15
+ options.list = true;
16
+ }
17
+ logger.blank();
18
+ if (options.list) {
19
+ await listHooks();
20
+ }
21
+ if (options.remove) {
22
+ await removeHooks();
23
+ }
24
+ if (options.test) {
25
+ await testHook();
26
+ }
27
+ logger.blank();
28
+ });
29
+ async function listHooks() {
30
+ logger.section('Claude Agent Monitor - Hooks');
31
+ logger.blank();
32
+ if (!claudeSettingsExist()) {
33
+ logger.warning('No .claude/settings.json found.');
34
+ logger.info(`Run ${chalk.cyan('cam init')} to configure hooks.`);
35
+ return;
36
+ }
37
+ const settings = readClaudeSettings();
38
+ const camHooks = listConfiguredCamHooks(settings);
39
+ if (camHooks.length === 0) {
40
+ logger.info('No CAM hooks configured.');
41
+ logger.info(`Run ${chalk.cyan('cam init')} to configure hooks.`);
42
+ return;
43
+ }
44
+ logger.info(`Found ${chalk.cyan(String(camHooks.length))} CAM hook(s):`);
45
+ logger.blank();
46
+ for (const hook of camHooks) {
47
+ const description = HOOK_TYPE_DESCRIPTIONS[hook.hookType] ?? '';
48
+ logger.item(`${chalk.white(hook.hookType)} ${chalk.gray(`- ${description}`)}`);
49
+ logger.info(` Command: ${chalk.gray(hook.command)}`);
50
+ }
51
+ }
52
+ async function removeHooks() {
53
+ logger.section('Removing CAM hooks...');
54
+ logger.blank();
55
+ if (!claudeSettingsExist()) {
56
+ logger.info('No .claude/settings.json found. Nothing to remove.');
57
+ return;
58
+ }
59
+ const settings = readClaudeSettings();
60
+ const camHooks = listConfiguredCamHooks(settings);
61
+ if (camHooks.length === 0) {
62
+ logger.info('No CAM hooks found. Nothing to remove.');
63
+ return;
64
+ }
65
+ const cleaned = removeCamHooks(settings);
66
+ writeClaudeSettings(cleaned);
67
+ logger.success(`Removed ${chalk.cyan(String(camHooks.length))} CAM hook(s)`);
68
+ logger.info('Other hooks have been preserved.');
69
+ }
70
+ async function testHook() {
71
+ logger.section('Sending test event...');
72
+ logger.blank();
73
+ const port = DEFAULT_SERVER_PORT;
74
+ try {
75
+ const testEvent = {
76
+ hook: 'Notification',
77
+ timestamp: new Date().toISOString(),
78
+ session_id: 'test-session',
79
+ agent_id: 'test-agent',
80
+ data: {
81
+ message: 'Test event from CAM CLI',
82
+ level: 'info',
83
+ },
84
+ };
85
+ const response = await fetch(`http://localhost:${port}/api/events`, {
86
+ method: 'POST',
87
+ headers: { 'Content-Type': 'application/json' },
88
+ body: JSON.stringify(testEvent),
89
+ });
90
+ if (response.ok) {
91
+ const data = (await response.json());
92
+ logger.success(`Test event sent successfully`);
93
+ if (data.event_id) {
94
+ logger.info(`Event ID: ${chalk.cyan(data.event_id)}`);
95
+ }
96
+ }
97
+ else {
98
+ logger.error(`Server responded with status ${response.status}`);
99
+ }
100
+ }
101
+ catch {
102
+ logger.error('Server is not running.');
103
+ logger.info(`Start with: ${chalk.cyan('cam start')}`);
104
+ }
105
+ }
106
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,WAAW,SA6NrB,CAAC"}