herdctl 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/bin/herdctl.js +9 -0
  2. package/dist/commands/__tests__/config.test.d.ts +2 -0
  3. package/dist/commands/__tests__/config.test.d.ts.map +1 -0
  4. package/dist/commands/__tests__/config.test.js +299 -0
  5. package/dist/commands/__tests__/config.test.js.map +1 -0
  6. package/dist/commands/__tests__/init.test.d.ts +2 -0
  7. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  8. package/dist/commands/__tests__/init.test.js +247 -0
  9. package/dist/commands/__tests__/init.test.js.map +1 -0
  10. package/dist/commands/__tests__/start.test.d.ts +2 -0
  11. package/dist/commands/__tests__/start.test.d.ts.map +1 -0
  12. package/dist/commands/__tests__/start.test.js +185 -0
  13. package/dist/commands/__tests__/start.test.js.map +1 -0
  14. package/dist/commands/__tests__/status.test.d.ts +2 -0
  15. package/dist/commands/__tests__/status.test.d.ts.map +1 -0
  16. package/dist/commands/__tests__/status.test.js +342 -0
  17. package/dist/commands/__tests__/status.test.js.map +1 -0
  18. package/dist/commands/__tests__/stop.test.d.ts +2 -0
  19. package/dist/commands/__tests__/stop.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/stop.test.js +229 -0
  21. package/dist/commands/__tests__/stop.test.js.map +1 -0
  22. package/dist/commands/__tests__/trigger.test.d.ts +2 -0
  23. package/dist/commands/__tests__/trigger.test.d.ts.map +1 -0
  24. package/dist/commands/__tests__/trigger.test.js +321 -0
  25. package/dist/commands/__tests__/trigger.test.js.map +1 -0
  26. package/dist/commands/cancel.d.ts +20 -0
  27. package/dist/commands/cancel.d.ts.map +1 -0
  28. package/dist/commands/cancel.js +263 -0
  29. package/dist/commands/cancel.js.map +1 -0
  30. package/dist/commands/config.d.ts +26 -0
  31. package/dist/commands/config.d.ts.map +1 -0
  32. package/dist/commands/config.js +287 -0
  33. package/dist/commands/config.js.map +1 -0
  34. package/dist/commands/init.d.ts +16 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +305 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/job.d.ts +19 -0
  39. package/dist/commands/job.d.ts.map +1 -0
  40. package/dist/commands/job.js +460 -0
  41. package/dist/commands/job.js.map +1 -0
  42. package/dist/commands/jobs.d.ts +23 -0
  43. package/dist/commands/jobs.d.ts.map +1 -0
  44. package/dist/commands/jobs.js +328 -0
  45. package/dist/commands/jobs.js.map +1 -0
  46. package/dist/commands/logs.d.ts +25 -0
  47. package/dist/commands/logs.d.ts.map +1 -0
  48. package/dist/commands/logs.js +360 -0
  49. package/dist/commands/logs.js.map +1 -0
  50. package/dist/commands/start.d.ts +17 -0
  51. package/dist/commands/start.d.ts.map +1 -0
  52. package/dist/commands/start.js +166 -0
  53. package/dist/commands/start.js.map +1 -0
  54. package/dist/commands/status.d.ts +18 -0
  55. package/dist/commands/status.d.ts.map +1 -0
  56. package/dist/commands/status.js +373 -0
  57. package/dist/commands/status.js.map +1 -0
  58. package/dist/commands/stop.d.ts +18 -0
  59. package/dist/commands/stop.d.ts.map +1 -0
  60. package/dist/commands/stop.js +161 -0
  61. package/dist/commands/stop.js.map +1 -0
  62. package/dist/commands/trigger.d.ts +23 -0
  63. package/dist/commands/trigger.d.ts.map +1 -0
  64. package/dist/commands/trigger.js +332 -0
  65. package/dist/commands/trigger.js.map +1 -0
  66. package/dist/index.d.ts +23 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +283 -0
  69. package/dist/index.js.map +1 -0
  70. package/package.json +46 -7
@@ -0,0 +1,185 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { startCommand } from "../start.js";
6
+ // Store mock FleetManager for access in tests
7
+ let mockFleetManagerInstance;
8
+ // Mock the FleetManager from @herdctl/core
9
+ vi.mock("@herdctl/core", async () => {
10
+ const actual = await vi.importActual("@herdctl/core");
11
+ // Create a mock class that vitest can use as a constructor
12
+ class MockFleetManager {
13
+ initialize;
14
+ start;
15
+ stop;
16
+ getFleetStatus;
17
+ streamLogs;
18
+ constructor() {
19
+ this.initialize = vi.fn().mockResolvedValue(undefined);
20
+ this.start = vi.fn().mockResolvedValue(undefined);
21
+ this.stop = vi.fn().mockResolvedValue(undefined);
22
+ this.getFleetStatus = vi.fn().mockResolvedValue({
23
+ state: "running",
24
+ uptimeSeconds: 0,
25
+ initializedAt: new Date().toISOString(),
26
+ startedAt: new Date().toISOString(),
27
+ stoppedAt: null,
28
+ counts: {
29
+ totalAgents: 2,
30
+ idleAgents: 2,
31
+ runningAgents: 0,
32
+ errorAgents: 0,
33
+ totalSchedules: 3,
34
+ runningSchedules: 0,
35
+ runningJobs: 0,
36
+ },
37
+ scheduler: {
38
+ status: "running",
39
+ checkCount: 0,
40
+ triggerCount: 0,
41
+ lastCheckAt: null,
42
+ checkIntervalMs: 1000,
43
+ },
44
+ lastError: null,
45
+ });
46
+ this.streamLogs = vi.fn().mockImplementation(async function* () {
47
+ // Immediately return to complete the generator
48
+ });
49
+ // Store reference for test access
50
+ mockFleetManagerInstance = this;
51
+ }
52
+ }
53
+ return {
54
+ ...actual,
55
+ FleetManager: MockFleetManager,
56
+ };
57
+ });
58
+ // Helper to create a temp directory
59
+ function createTempDir() {
60
+ const baseDir = path.join(tmpdir(), `herdctl-cli-start-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
61
+ fs.mkdirSync(baseDir, { recursive: true });
62
+ return fs.realpathSync(baseDir);
63
+ }
64
+ // Helper to clean up temp directory
65
+ function cleanupTempDir(dir) {
66
+ fs.rmSync(dir, { recursive: true, force: true });
67
+ }
68
+ describe("startCommand", () => {
69
+ let tempDir;
70
+ let originalCwd;
71
+ let consoleLogs;
72
+ let consoleErrors;
73
+ let originalConsoleLog;
74
+ let originalConsoleError;
75
+ let originalProcessExit;
76
+ let exitCode;
77
+ // Store original signal handlers
78
+ const originalSignalHandlers = new Map();
79
+ beforeEach(() => {
80
+ tempDir = createTempDir();
81
+ originalCwd = process.cwd();
82
+ process.chdir(tempDir);
83
+ // Capture console output
84
+ consoleLogs = [];
85
+ consoleErrors = [];
86
+ originalConsoleLog = console.log;
87
+ originalConsoleError = console.error;
88
+ console.log = (...args) => consoleLogs.push(args.join(" "));
89
+ console.error = (...args) => consoleErrors.push(args.join(" "));
90
+ // Mock process.exit
91
+ exitCode = undefined;
92
+ originalProcessExit = process.exit;
93
+ process.exit = ((code) => {
94
+ exitCode = code ?? 0;
95
+ throw new Error(`process.exit(${code})`);
96
+ });
97
+ // Store and clear signal handlers
98
+ for (const signal of ["SIGINT", "SIGTERM"]) {
99
+ originalSignalHandlers.set(signal, process.listeners(signal));
100
+ process.removeAllListeners(signal);
101
+ }
102
+ });
103
+ afterEach(() => {
104
+ process.chdir(originalCwd);
105
+ cleanupTempDir(tempDir);
106
+ console.log = originalConsoleLog;
107
+ console.error = originalConsoleError;
108
+ process.exit = originalProcessExit;
109
+ // Restore original signal handlers
110
+ for (const signal of ["SIGINT", "SIGTERM"]) {
111
+ process.removeAllListeners(signal);
112
+ const handlers = originalSignalHandlers.get(signal) ?? [];
113
+ for (const handler of handlers) {
114
+ process.on(signal, handler);
115
+ }
116
+ }
117
+ originalSignalHandlers.clear();
118
+ });
119
+ describe("initialization", () => {
120
+ it("creates FleetManager with correct options", async () => {
121
+ await startCommand({});
122
+ // FleetManager is instantiated
123
+ expect(mockFleetManagerInstance).toBeDefined();
124
+ expect(mockFleetManagerInstance.initialize).toHaveBeenCalled();
125
+ expect(mockFleetManagerInstance.start).toHaveBeenCalled();
126
+ });
127
+ });
128
+ describe("PID file", () => {
129
+ it("writes PID file to state directory", async () => {
130
+ await startCommand({});
131
+ const pidFile = path.join(tempDir, ".herdctl", "herdctl.pid");
132
+ expect(fs.existsSync(pidFile)).toBe(true);
133
+ const pidContent = fs.readFileSync(pidFile, "utf-8");
134
+ expect(pidContent).toBe(process.pid.toString());
135
+ });
136
+ it("writes PID file to custom state directory", async () => {
137
+ const customState = path.join(tempDir, "custom-state");
138
+ await startCommand({ state: customState });
139
+ const pidFile = path.join(customState, "herdctl.pid");
140
+ expect(fs.existsSync(pidFile)).toBe(true);
141
+ });
142
+ it("outputs PID file location", async () => {
143
+ await startCommand({});
144
+ expect(consoleLogs.some((log) => log.includes("PID file written"))).toBe(true);
145
+ });
146
+ });
147
+ describe("startup output", () => {
148
+ it("displays starting message", async () => {
149
+ await startCommand({});
150
+ expect(consoleLogs.some((log) => log.includes("Starting fleet"))).toBe(true);
151
+ });
152
+ it("displays fleet status after start", async () => {
153
+ await startCommand({});
154
+ expect(consoleLogs.some((log) => log.includes("Fleet Status"))).toBe(true);
155
+ expect(consoleLogs.some((log) => log.includes("Agents: 2"))).toBe(true);
156
+ expect(consoleLogs.some((log) => log.includes("Schedules: 3"))).toBe(true);
157
+ });
158
+ it("displays Ctrl+C message", async () => {
159
+ await startCommand({});
160
+ expect(consoleLogs.some((log) => log.includes("Ctrl+C"))).toBe(true);
161
+ });
162
+ });
163
+ describe("log streaming", () => {
164
+ it("calls streamLogs with correct options", async () => {
165
+ await startCommand({});
166
+ expect(mockFleetManagerInstance.streamLogs).toHaveBeenCalledWith({
167
+ level: "info",
168
+ includeHistory: false,
169
+ });
170
+ });
171
+ });
172
+ describe("signal handlers", () => {
173
+ it("registers SIGINT handler", async () => {
174
+ await startCommand({});
175
+ const listeners = process.listeners("SIGINT");
176
+ expect(listeners.length).toBeGreaterThan(0);
177
+ });
178
+ it("registers SIGTERM handler", async () => {
179
+ await startCommand({});
180
+ const listeners = process.listeners("SIGTERM");
181
+ expect(listeners.length).toBeGreaterThan(0);
182
+ });
183
+ });
184
+ });
185
+ //# sourceMappingURL=start.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/start.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,342 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { statusCommand } from "../status.js";
6
+ // Store mock FleetManager for access in tests
7
+ let mockFleetManagerInstance;
8
+ // Mock FleetStatus data
9
+ const mockFleetStatus = {
10
+ state: "running",
11
+ uptimeSeconds: 3661, // 1h 1m 1s
12
+ initializedAt: new Date().toISOString(),
13
+ startedAt: new Date().toISOString(),
14
+ stoppedAt: null,
15
+ counts: {
16
+ totalAgents: 2,
17
+ idleAgents: 1,
18
+ runningAgents: 1,
19
+ errorAgents: 0,
20
+ totalSchedules: 3,
21
+ runningSchedules: 1,
22
+ runningJobs: 1,
23
+ },
24
+ scheduler: {
25
+ status: "running",
26
+ checkCount: 100,
27
+ triggerCount: 5,
28
+ lastCheckAt: new Date().toISOString(),
29
+ checkIntervalMs: 1000,
30
+ },
31
+ lastError: null,
32
+ };
33
+ // Mock AgentInfo data
34
+ const mockAgentInfo = [
35
+ {
36
+ name: "code-reviewer",
37
+ description: "Reviews pull requests",
38
+ status: "running",
39
+ currentJobId: "job-2024-01-15-abc123",
40
+ lastJobId: "job-2024-01-14-xyz789",
41
+ maxConcurrent: 1,
42
+ runningCount: 1,
43
+ errorMessage: null,
44
+ scheduleCount: 2,
45
+ schedules: [
46
+ {
47
+ name: "hourly",
48
+ agentName: "code-reviewer",
49
+ type: "interval",
50
+ interval: "1h",
51
+ status: "running",
52
+ lastRunAt: new Date(Date.now() - 30 * 60 * 1000).toISOString(), // 30m ago
53
+ nextRunAt: new Date(Date.now() + 30 * 60 * 1000).toISOString(), // in 30m
54
+ lastError: null,
55
+ },
56
+ {
57
+ name: "daily",
58
+ agentName: "code-reviewer",
59
+ type: "cron",
60
+ expression: "0 9 * * *",
61
+ status: "idle",
62
+ lastRunAt: new Date(Date.now() - 12 * 60 * 60 * 1000).toISOString(), // 12h ago
63
+ nextRunAt: new Date(Date.now() + 12 * 60 * 60 * 1000).toISOString(), // in 12h
64
+ lastError: null,
65
+ },
66
+ ],
67
+ model: "claude-sonnet-4-20250514",
68
+ workspace: "/projects/my-app",
69
+ },
70
+ {
71
+ name: "issue-triage",
72
+ description: "Triages GitHub issues",
73
+ status: "idle",
74
+ currentJobId: null,
75
+ lastJobId: "job-2024-01-13-def456",
76
+ maxConcurrent: 2,
77
+ runningCount: 0,
78
+ errorMessage: null,
79
+ scheduleCount: 1,
80
+ schedules: [
81
+ {
82
+ name: "every-15m",
83
+ agentName: "issue-triage",
84
+ type: "interval",
85
+ interval: "15m",
86
+ status: "idle",
87
+ lastRunAt: new Date(Date.now() - 10 * 60 * 1000).toISOString(), // 10m ago
88
+ nextRunAt: new Date(Date.now() + 5 * 60 * 1000).toISOString(), // in 5m
89
+ lastError: null,
90
+ },
91
+ ],
92
+ model: undefined,
93
+ workspace: undefined,
94
+ },
95
+ ];
96
+ // Mock the FleetManager from @herdctl/core
97
+ vi.mock("@herdctl/core", async () => {
98
+ const actual = await vi.importActual("@herdctl/core");
99
+ // Create a mock class that vitest can use as a constructor
100
+ class MockFleetManager {
101
+ initialize;
102
+ getFleetStatus;
103
+ getAgentInfo;
104
+ getAgentInfoByName;
105
+ constructor() {
106
+ this.initialize = vi.fn().mockResolvedValue(undefined);
107
+ this.getFleetStatus = vi.fn().mockResolvedValue(mockFleetStatus);
108
+ this.getAgentInfo = vi.fn().mockResolvedValue(mockAgentInfo);
109
+ this.getAgentInfoByName = vi.fn().mockImplementation((name) => {
110
+ const agent = mockAgentInfo.find((a) => a.name === name);
111
+ if (!agent) {
112
+ const error = new actual.AgentNotFoundError(`Agent '${name}' not found`);
113
+ return Promise.reject(error);
114
+ }
115
+ return Promise.resolve(agent);
116
+ });
117
+ // Store reference for test access
118
+ mockFleetManagerInstance = this;
119
+ }
120
+ }
121
+ return {
122
+ ...actual,
123
+ FleetManager: MockFleetManager,
124
+ };
125
+ });
126
+ // Helper to create a temp directory
127
+ function createTempDir() {
128
+ const baseDir = path.join(tmpdir(), `herdctl-cli-status-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
129
+ fs.mkdirSync(baseDir, { recursive: true });
130
+ return fs.realpathSync(baseDir);
131
+ }
132
+ // Helper to clean up temp directory
133
+ function cleanupTempDir(dir) {
134
+ fs.rmSync(dir, { recursive: true, force: true });
135
+ }
136
+ describe("statusCommand", () => {
137
+ let tempDir;
138
+ let originalCwd;
139
+ let consoleLogs;
140
+ let consoleErrors;
141
+ let originalConsoleLog;
142
+ let originalConsoleError;
143
+ let originalProcessExit;
144
+ let exitCode;
145
+ beforeEach(() => {
146
+ tempDir = createTempDir();
147
+ originalCwd = process.cwd();
148
+ process.chdir(tempDir);
149
+ // Capture console output
150
+ consoleLogs = [];
151
+ consoleErrors = [];
152
+ originalConsoleLog = console.log;
153
+ originalConsoleError = console.error;
154
+ console.log = (...args) => consoleLogs.push(args.join(" "));
155
+ console.error = (...args) => consoleErrors.push(args.join(" "));
156
+ // Mock process.exit
157
+ exitCode = undefined;
158
+ originalProcessExit = process.exit;
159
+ process.exit = ((code) => {
160
+ exitCode = code ?? 0;
161
+ throw new Error(`process.exit(${code})`);
162
+ });
163
+ });
164
+ afterEach(() => {
165
+ process.chdir(originalCwd);
166
+ cleanupTempDir(tempDir);
167
+ console.log = originalConsoleLog;
168
+ console.error = originalConsoleError;
169
+ process.exit = originalProcessExit;
170
+ vi.clearAllMocks();
171
+ });
172
+ describe("fleet overview (herdctl status)", () => {
173
+ it("calls FleetManager methods correctly", async () => {
174
+ await statusCommand(undefined, {});
175
+ expect(mockFleetManagerInstance.initialize).toHaveBeenCalled();
176
+ expect(mockFleetManagerInstance.getFleetStatus).toHaveBeenCalled();
177
+ expect(mockFleetManagerInstance.getAgentInfo).toHaveBeenCalled();
178
+ });
179
+ it("displays fleet status header", async () => {
180
+ await statusCommand(undefined, {});
181
+ expect(consoleLogs.some((log) => log.includes("Fleet Status"))).toBe(true);
182
+ });
183
+ it("displays fleet state", async () => {
184
+ await statusCommand(undefined, {});
185
+ expect(consoleLogs.some((log) => log.includes("State:"))).toBe(true);
186
+ expect(consoleLogs.some((log) => log.includes("running"))).toBe(true);
187
+ });
188
+ it("displays uptime", async () => {
189
+ await statusCommand(undefined, {});
190
+ expect(consoleLogs.some((log) => log.includes("Uptime:"))).toBe(true);
191
+ expect(consoleLogs.some((log) => log.includes("1h 1m 1s"))).toBe(true);
192
+ });
193
+ it("displays agent counts", async () => {
194
+ await statusCommand(undefined, {});
195
+ expect(consoleLogs.some((log) => log.includes("Agents:"))).toBe(true);
196
+ expect(consoleLogs.some((log) => log.includes("2 total"))).toBe(true);
197
+ });
198
+ it("displays scheduler info", async () => {
199
+ await statusCommand(undefined, {});
200
+ expect(consoleLogs.some((log) => log.includes("Scheduler"))).toBe(true);
201
+ expect(consoleLogs.some((log) => log.includes("Checks:"))).toBe(true);
202
+ expect(consoleLogs.some((log) => log.includes("100"))).toBe(true);
203
+ });
204
+ it("displays agents table", async () => {
205
+ await statusCommand(undefined, {});
206
+ expect(consoleLogs.some((log) => log.includes("Agents"))).toBe(true);
207
+ expect(consoleLogs.some((log) => log.includes("NAME"))).toBe(true);
208
+ expect(consoleLogs.some((log) => log.includes("code-reviewer"))).toBe(true);
209
+ expect(consoleLogs.some((log) => log.includes("issue-triage"))).toBe(true);
210
+ });
211
+ });
212
+ describe("agent detail view (herdctl status <agent>)", () => {
213
+ it("calls getAgentInfoByName with agent name", async () => {
214
+ await statusCommand("code-reviewer", {});
215
+ expect(mockFleetManagerInstance.getAgentInfoByName).toHaveBeenCalledWith("code-reviewer");
216
+ });
217
+ it("displays agent name in header", async () => {
218
+ await statusCommand("code-reviewer", {});
219
+ expect(consoleLogs.some((log) => log.includes("Agent: code-reviewer"))).toBe(true);
220
+ });
221
+ it("displays agent description", async () => {
222
+ await statusCommand("code-reviewer", {});
223
+ expect(consoleLogs.some((log) => log.includes("Description:"))).toBe(true);
224
+ expect(consoleLogs.some((log) => log.includes("Reviews pull requests"))).toBe(true);
225
+ });
226
+ it("displays agent status", async () => {
227
+ await statusCommand("code-reviewer", {});
228
+ expect(consoleLogs.some((log) => log.includes("Status:"))).toBe(true);
229
+ });
230
+ it("displays configuration section", async () => {
231
+ await statusCommand("code-reviewer", {});
232
+ expect(consoleLogs.some((log) => log.includes("Configuration"))).toBe(true);
233
+ expect(consoleLogs.some((log) => log.includes("Model:"))).toBe(true);
234
+ expect(consoleLogs.some((log) => log.includes("Workspace:"))).toBe(true);
235
+ expect(consoleLogs.some((log) => log.includes("Concurrency:"))).toBe(true);
236
+ });
237
+ it("displays jobs section", async () => {
238
+ await statusCommand("code-reviewer", {});
239
+ expect(consoleLogs.some((log) => log.includes("Jobs"))).toBe(true);
240
+ expect(consoleLogs.some((log) => log.includes("Running:"))).toBe(true);
241
+ expect(consoleLogs.some((log) => log.includes("Current:"))).toBe(true);
242
+ expect(consoleLogs.some((log) => log.includes("Last:"))).toBe(true);
243
+ });
244
+ it("displays schedules section", async () => {
245
+ await statusCommand("code-reviewer", {});
246
+ expect(consoleLogs.some((log) => log.includes("Schedules"))).toBe(true);
247
+ expect(consoleLogs.some((log) => log.includes("hourly"))).toBe(true);
248
+ expect(consoleLogs.some((log) => log.includes("daily"))).toBe(true);
249
+ expect(consoleLogs.some((log) => log.includes("Interval:"))).toBe(true);
250
+ expect(consoleLogs.some((log) => log.includes("Cron:"))).toBe(true);
251
+ });
252
+ it("handles agent not found", async () => {
253
+ try {
254
+ await statusCommand("nonexistent-agent", {});
255
+ }
256
+ catch {
257
+ // Expected to throw due to process.exit mock
258
+ }
259
+ expect(exitCode).toBe(1);
260
+ expect(consoleErrors.some((err) => err.includes("Agent 'nonexistent-agent' not found"))).toBe(true);
261
+ });
262
+ });
263
+ describe("JSON output (--json)", () => {
264
+ it("outputs valid JSON for fleet status", async () => {
265
+ await statusCommand(undefined, { json: true });
266
+ expect(consoleLogs.length).toBe(1);
267
+ const output = JSON.parse(consoleLogs[0]);
268
+ expect(output).toHaveProperty("fleet");
269
+ expect(output).toHaveProperty("agents");
270
+ expect(output.fleet.state).toBe("running");
271
+ expect(output.agents).toHaveLength(2);
272
+ });
273
+ it("outputs valid JSON for agent status", async () => {
274
+ await statusCommand("code-reviewer", { json: true });
275
+ expect(consoleLogs.length).toBe(1);
276
+ const output = JSON.parse(consoleLogs[0]);
277
+ expect(output).toHaveProperty("agent");
278
+ expect(output.agent.name).toBe("code-reviewer");
279
+ });
280
+ it("outputs JSON error for agent not found", async () => {
281
+ try {
282
+ await statusCommand("nonexistent-agent", { json: true });
283
+ }
284
+ catch {
285
+ // Expected to throw due to process.exit mock
286
+ }
287
+ expect(exitCode).toBe(1);
288
+ expect(consoleLogs.length).toBe(1);
289
+ const output = JSON.parse(consoleLogs[0]);
290
+ expect(output).toHaveProperty("error");
291
+ expect(output.error.code).toBe("AGENT_NOT_FOUND");
292
+ });
293
+ });
294
+ describe("relative time formatting", () => {
295
+ it("formats future times correctly", async () => {
296
+ await statusCommand(undefined, {});
297
+ // Check that relative time is displayed
298
+ expect(consoleLogs.some((log) => log.includes("in "))).toBe(true);
299
+ });
300
+ it("formats past times correctly", async () => {
301
+ await statusCommand("code-reviewer", {});
302
+ // Check that relative time is displayed
303
+ expect(consoleLogs.some((log) => log.includes("ago"))).toBe(true);
304
+ });
305
+ });
306
+ describe("NO_COLOR support", () => {
307
+ let originalNoColor;
308
+ beforeEach(() => {
309
+ originalNoColor = process.env.NO_COLOR;
310
+ });
311
+ afterEach(() => {
312
+ if (originalNoColor === undefined) {
313
+ delete process.env.NO_COLOR;
314
+ }
315
+ else {
316
+ process.env.NO_COLOR = originalNoColor;
317
+ }
318
+ });
319
+ it("does not include ANSI codes when NO_COLOR is set", async () => {
320
+ process.env.NO_COLOR = "1";
321
+ await statusCommand(undefined, {});
322
+ // Check that no ANSI escape codes are present
323
+ const hasAnsiCodes = consoleLogs.some((log) => log.includes("\x1b["));
324
+ expect(hasAnsiCodes).toBe(false);
325
+ });
326
+ });
327
+ describe("custom paths", () => {
328
+ it("respects custom state directory", async () => {
329
+ const customState = path.join(tempDir, "custom-state");
330
+ await statusCommand(undefined, { state: customState });
331
+ // FleetManager should be called - we're just verifying it doesn't crash
332
+ expect(mockFleetManagerInstance.initialize).toHaveBeenCalled();
333
+ });
334
+ it("respects custom config path", async () => {
335
+ const customConfig = path.join(tempDir, "custom-config.yaml");
336
+ await statusCommand(undefined, { config: customConfig });
337
+ // FleetManager should be called - we're just verifying it doesn't crash
338
+ expect(mockFleetManagerInstance.initialize).toHaveBeenCalled();
339
+ });
340
+ });
341
+ });
342
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stop.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/stop.test.ts"],"names":[],"mappings":""}