ultraclaude-agent 0.0.18 → 0.0.19

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 (49) hide show
  1. package/__tests__/pid-detection.test.ts +68 -0
  2. package/__tests__/usage-sync.test.ts +8 -0
  3. package/__tests__/version-watcher.test.ts +286 -0
  4. package/dist/cli.js +141 -14
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +21 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +65 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/daemon.d.ts +4 -1
  11. package/dist/daemon.d.ts.map +1 -1
  12. package/dist/daemon.js +95 -5
  13. package/dist/daemon.js.map +1 -1
  14. package/dist/logger.d.ts +7 -0
  15. package/dist/logger.d.ts.map +1 -1
  16. package/dist/logger.js +35 -0
  17. package/dist/logger.js.map +1 -1
  18. package/dist/repl.d.ts.map +1 -1
  19. package/dist/repl.js +15 -9
  20. package/dist/repl.js.map +1 -1
  21. package/dist/scripts/postinstall.d.ts +2 -0
  22. package/dist/scripts/postinstall.d.ts.map +1 -0
  23. package/dist/scripts/postinstall.js +174 -0
  24. package/dist/scripts/postinstall.js.map +1 -0
  25. package/dist/service.d.ts +14 -0
  26. package/dist/service.d.ts.map +1 -1
  27. package/dist/service.js +54 -1
  28. package/dist/service.js.map +1 -1
  29. package/dist/setup.d.ts.map +1 -1
  30. package/dist/setup.js +11 -2
  31. package/dist/setup.js.map +1 -1
  32. package/dist/status.d.ts +1 -0
  33. package/dist/status.d.ts.map +1 -1
  34. package/dist/status.js.map +1 -1
  35. package/dist/watcher.d.ts +2 -0
  36. package/dist/watcher.d.ts.map +1 -1
  37. package/dist/watcher.js +5 -1
  38. package/dist/watcher.js.map +1 -1
  39. package/package.json +2 -1
  40. package/src/cli.ts +147 -13
  41. package/src/config.ts +64 -1
  42. package/src/daemon.ts +108 -4
  43. package/src/logger.ts +39 -0
  44. package/src/repl.ts +15 -8
  45. package/src/scripts/postinstall.ts +179 -0
  46. package/src/service.ts +49 -1
  47. package/src/setup.ts +12 -2
  48. package/src/status.ts +1 -0
  49. package/src/watcher.ts +7 -1
@@ -0,0 +1,68 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { spawn } from 'node:child_process';
3
+ import { isDaemonRunning, isPidAlive, verifyProcessIdentity, cleanStalePidFile } from '../src/config.js';
4
+
5
+ // Mock removePid (called internally by cleanStalePidFile)
6
+ vi.mock('node:fs/promises', async () => {
7
+ const actual = await vi.importActual<typeof import('node:fs/promises')>('node:fs/promises');
8
+ return {
9
+ ...actual,
10
+ unlink: vi.fn().mockResolvedValue(undefined),
11
+ };
12
+ });
13
+
14
+ describe('Process identity verification', () => {
15
+ beforeEach(() => {
16
+ vi.clearAllMocks();
17
+ });
18
+
19
+ it('isDaemonRunning returns false for a dead PID', () => {
20
+ // Use a PID that's almost certainly not running (very high number)
21
+ const result = isDaemonRunning(99999999);
22
+ expect(result).toBe(false);
23
+ });
24
+
25
+ it('isPidAlive returns true for the current process', () => {
26
+ const result = isPidAlive(process.pid);
27
+ expect(result).toBe(true);
28
+ });
29
+
30
+ it('isDaemonRunning returns false for a live non-agent process', async () => {
31
+ // Spawn a simple sleep process — definitely not ultraclaude-agent
32
+ const child = spawn('sleep', ['30'], { stdio: 'ignore' });
33
+
34
+ try {
35
+ expect(child.pid).toBeDefined();
36
+ const pid = child.pid!;
37
+
38
+ // PID should be alive
39
+ expect(isPidAlive(pid)).toBe(true);
40
+
41
+ // But isDaemonRunning should return false (not our daemon)
42
+ expect(isDaemonRunning(pid)).toBe(false);
43
+
44
+ // verifyProcessIdentity should also return false
45
+ expect(verifyProcessIdentity(pid)).toBe(false);
46
+ } finally {
47
+ child.kill('SIGTERM');
48
+ }
49
+ });
50
+
51
+ it('verifyProcessIdentity returns false for a dead PID', () => {
52
+ expect(verifyProcessIdentity(99999999)).toBe(false);
53
+ });
54
+
55
+ describe('cleanStalePidFile', () => {
56
+ it('logs a warning about stale PID', async () => {
57
+ const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
58
+
59
+ await cleanStalePidFile('https://test.example.com', 12345);
60
+
61
+ expect(warnSpy).toHaveBeenCalledWith(
62
+ expect.stringContaining('PID 12345 is alive but is not ultraclaude-agent'),
63
+ );
64
+
65
+ warnSpy.mockRestore();
66
+ });
67
+ });
68
+ });
@@ -14,6 +14,14 @@ vi.mock('../src/config.js', () => ({
14
14
  userId: 'test-user',
15
15
  serverUrl: 'http://localhost:3000',
16
16
  }),
17
+ loadAllCredentials: vi.fn().mockResolvedValue(new Map([
18
+ ['test-user', {
19
+ apiKey: 'test-api-key',
20
+ userId: 'test-user',
21
+ email: 'test@example.com',
22
+ serverUrl: 'http://localhost:3000',
23
+ }],
24
+ ])),
17
25
  getServerUrl: vi.fn().mockReturnValue('http://localhost:3000'),
18
26
  paths: {
19
27
  claudeProjects: '/tmp/test-projects',
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Tests for daemon version watcher (startVersionWatcher).
3
+ * Plan 030 Task 1 regression: "Mock version mismatch → verify daemon initiates restart sequence"
4
+ *
5
+ * The version watcher runs every 60s inside the daemon. On mismatch between
6
+ * LOADED_VERSION (set at module load) and the on-disk package.json version:
7
+ * - With service manager (systemd/launchd): call stopDaemon() then process.exit(0)
8
+ * - Without service manager: call stopDaemon(), fork new daemon, then process.exit(0)
9
+ */
10
+
11
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
12
+
13
+ // Mock node:child_process spawn — prevents forkDaemon from spawning real processes
14
+ const mockSpawn = vi.fn();
15
+ vi.mock('node:child_process', async (importOriginal) => {
16
+ const actual = await importOriginal<typeof import('node:child_process')>();
17
+ return { ...actual, spawn: (...args: unknown[]) => mockSpawn(...args) };
18
+ });
19
+
20
+ // Mock node:fs/promises — controls what version startVersionWatcher reads from disk
21
+ const mockReadFile = vi.fn();
22
+ vi.mock('node:fs/promises', async (importOriginal) => {
23
+ const actual = await importOriginal<typeof import('node:fs/promises')>();
24
+ return { ...actual, readFile: (...args: unknown[]) => mockReadFile(...args) };
25
+ });
26
+
27
+ // Mock chokidar
28
+ const mockWatcher = {
29
+ on: vi.fn().mockReturnThis(),
30
+ close: vi.fn().mockResolvedValue(undefined),
31
+ };
32
+ vi.mock('chokidar', () => ({
33
+ default: { watch: vi.fn().mockReturnValue(mockWatcher) },
34
+ }));
35
+
36
+ // Mock config
37
+ const mockLoadCredentials = vi.fn();
38
+ const mockLoadAllCredentials = vi.fn();
39
+ const mockLoadRegistry = vi.fn();
40
+ const mockWritePid = vi.fn().mockResolvedValue(undefined);
41
+ const mockRemovePid = vi.fn().mockResolvedValue(undefined);
42
+ const mockMigrateOldConfigDir = vi.fn().mockResolvedValue(false);
43
+ const mockGetProjectAccount = vi.fn().mockResolvedValue(null);
44
+ const mockGetDefaultAccount = vi.fn().mockResolvedValue('user-1');
45
+ const mockLoadServerConfig = vi.fn().mockResolvedValue({ defaultAccount: '', autoAssignNewProjects: true, projectAccounts: {} });
46
+ const mockResolveServerPaths = vi.fn().mockReturnValue({
47
+ accountsDir: '/tmp/accounts',
48
+ configFile: '/tmp/config.json',
49
+ statusFile: '/tmp/status.json',
50
+ logDir: '/tmp/logs',
51
+ });
52
+
53
+ vi.mock('../src/config.js', () => ({
54
+ loadCredentials: (...args: unknown[]) => mockLoadCredentials(...args),
55
+ loadAllCredentials: (...args: unknown[]) => mockLoadAllCredentials(...args),
56
+ loadServerConfig: (...args: unknown[]) => mockLoadServerConfig(...args),
57
+ getServerUrl: (creds: { serverUrl: string } | null) => creds?.serverUrl ?? 'http://localhost:3000',
58
+ loadRegistry: (...args: unknown[]) => mockLoadRegistry(...args),
59
+ getProjectId: vi.fn().mockResolvedValue('proj-1'),
60
+ writeProjectId: vi.fn().mockResolvedValue(undefined),
61
+ writePid: (...args: unknown[]) => mockWritePid(...args),
62
+ removePid: (...args: unknown[]) => mockRemovePid(...args),
63
+ migrateOldConfigDir: (...args: unknown[]) => mockMigrateOldConfigDir(...args),
64
+ getProjectAccount: (...args: unknown[]) => mockGetProjectAccount(...args),
65
+ setProjectAccount: vi.fn().mockResolvedValue(undefined),
66
+ getDefaultAccount: (...args: unknown[]) => mockGetDefaultAccount(...args),
67
+ resolveServerPaths: (...args: unknown[]) => mockResolveServerPaths(...args),
68
+ isDaemonRunning: vi.fn().mockReturnValue(false),
69
+ paths: {
70
+ claudeProjects: '/tmp/test-claude-projects',
71
+ projectIdFile: '.claude/ultra/project-id',
72
+ oldConfigDir: '/tmp/test-old-config',
73
+ },
74
+ }));
75
+
76
+ // Mock sync, watcher, usage-sync, socket-client, status
77
+ vi.mock('../src/sync.js', () => ({
78
+ createProjectOnServer: vi.fn().mockResolvedValue({ success: true, data: 'proj-1' }),
79
+ initialSync: vi.fn().mockResolvedValue(undefined),
80
+ fetchManifest: vi.fn().mockResolvedValue({ success: true, data: [] }),
81
+ stopSync: vi.fn(),
82
+ pushVersionMetadata: vi.fn().mockResolvedValue(undefined),
83
+ }));
84
+ vi.mock('../src/watcher.js', () => ({
85
+ startProjectWatcher: vi.fn().mockReturnValue({
86
+ projectId: 'proj-1',
87
+ projectPath: '/test/project',
88
+ credentials: { userId: 'user-1' },
89
+ close: vi.fn().mockResolvedValue(undefined),
90
+ }),
91
+ }));
92
+ vi.mock('../src/usage-sync.js', () => ({
93
+ startUsageWatcher: vi.fn().mockReturnValue({ close: vi.fn().mockResolvedValue(undefined) }),
94
+ }));
95
+ vi.mock('../src/socket-client.js', () => ({
96
+ init: vi.fn(),
97
+ addAccount: vi.fn(),
98
+ removeAccount: vi.fn(),
99
+ disconnectAll: vi.fn(),
100
+ getConnectedUserIds: vi.fn().mockReturnValue([]),
101
+ }));
102
+ vi.mock('../src/status.js', () => ({
103
+ startStatusLoop: vi.fn().mockReturnValue({ stop: vi.fn() }),
104
+ readStatusFile: vi.fn().mockResolvedValue(null),
105
+ removeStatusFile: vi.fn().mockResolvedValue(undefined),
106
+ }));
107
+ vi.mock('../src/logger.js', () => ({
108
+ logger: {
109
+ child: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }),
110
+ info: vi.fn(),
111
+ warn: vi.fn(),
112
+ error: vi.fn(),
113
+ debug: vi.fn(),
114
+ fatal: vi.fn(),
115
+ },
116
+ }));
117
+
118
+ // Mock service.js — controls whether a service manager is active
119
+ const mockIsServiceActive = vi.fn();
120
+ vi.mock('../src/service.js', () => ({
121
+ isServiceActive: (...args: unknown[]) => mockIsServiceActive(...args),
122
+ isServiceInstalled: vi.fn().mockResolvedValue(false),
123
+ installService: vi.fn().mockResolvedValue(undefined),
124
+ uninstallService: vi.fn().mockResolvedValue(undefined),
125
+ SERVICE_NAME: 'ultraclaude-dashboard-agent',
126
+ LAUNCHD_LABEL: 'com.ultraclaude.dashboard-agent',
127
+ }));
128
+
129
+ const testCreds = {
130
+ apiKey: 'test-key',
131
+ userId: 'user-1',
132
+ serverUrl: 'http://localhost:3000',
133
+ email: 'alice@example.com',
134
+ };
135
+
136
+ function setupStandardMocks() {
137
+ mockLoadCredentials.mockResolvedValue(testCreds);
138
+ mockLoadAllCredentials.mockResolvedValue(new Map([['user-1', testCreds]]));
139
+ mockLoadRegistry.mockResolvedValue({ projects: [] });
140
+ // Default readFile: same version as loaded (no mismatch)
141
+ mockReadFile.mockResolvedValue(JSON.stringify({ version: '0.0.19' }));
142
+ // Spawn returns a fake child process for forkDaemon
143
+ mockSpawn.mockReturnValue({ pid: 99999, unref: vi.fn() });
144
+ }
145
+
146
+ describe('version watcher — daemon self-restart on version mismatch', () => {
147
+ beforeEach(() => {
148
+ vi.clearAllMocks();
149
+ setupStandardMocks();
150
+ });
151
+
152
+ it('exits when version mismatch detected with no service manager (fork mode)', async () => {
153
+ // Make readFile return a NEWER version (simulates npm update installing 999.0.0)
154
+ mockReadFile.mockImplementation(async (path: string) => {
155
+ if (typeof path === 'string' && path.includes('package.json')) {
156
+ return JSON.stringify({ version: '999.0.0' });
157
+ }
158
+ throw new Error(`Unexpected readFile: ${path}`);
159
+ });
160
+ // No service manager — daemon will fork a new process and exit
161
+ mockIsServiceActive.mockResolvedValue(null);
162
+
163
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
164
+ throw new Error('process.exit(0)');
165
+ });
166
+
167
+ vi.useFakeTimers();
168
+ try {
169
+ vi.resetModules();
170
+ const { startDaemon } = await import('../src/daemon.js');
171
+ const result = await startDaemon();
172
+ expect(result.success).toBe(true);
173
+
174
+ // Advance fake timers by 60s to trigger the version watcher interval
175
+ await vi.advanceTimersByTimeAsync(60_000);
176
+
177
+ // process.exit should have been called with 0
178
+ expect(exitSpy).toHaveBeenCalledWith(0);
179
+ } catch (e) {
180
+ // Allow the "process.exit(0)" throw from our mock
181
+ if (!(e instanceof Error && e.message === 'process.exit(0)')) {
182
+ throw e;
183
+ }
184
+ // process.exit mock threw — that means exit WAS called, which is what we want
185
+ expect(exitSpy).toHaveBeenCalledWith(0);
186
+ } finally {
187
+ exitSpy.mockRestore();
188
+ vi.useRealTimers();
189
+ }
190
+ });
191
+
192
+ it('exits via service manager when systemd is active on version mismatch', async () => {
193
+ // Make readFile return a NEWER version
194
+ mockReadFile.mockImplementation(async (path: string) => {
195
+ if (typeof path === 'string' && path.includes('package.json')) {
196
+ return JSON.stringify({ version: '999.0.0' });
197
+ }
198
+ throw new Error(`Unexpected readFile: ${path}`);
199
+ });
200
+ // systemd is managing the daemon — exit(0) lets systemd restart with new binary
201
+ mockIsServiceActive.mockResolvedValue('systemd');
202
+
203
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
204
+ throw new Error('process.exit(0)');
205
+ });
206
+
207
+ vi.useFakeTimers();
208
+ try {
209
+ vi.resetModules();
210
+ const { startDaemon } = await import('../src/daemon.js');
211
+ const result = await startDaemon();
212
+ expect(result.success).toBe(true);
213
+
214
+ await vi.advanceTimersByTimeAsync(60_000);
215
+
216
+ expect(exitSpy).toHaveBeenCalledWith(0);
217
+ } catch (e) {
218
+ if (!(e instanceof Error && e.message === 'process.exit(0)')) throw e;
219
+ expect(exitSpy).toHaveBeenCalledWith(0);
220
+ } finally {
221
+ exitSpy.mockRestore();
222
+ vi.useRealTimers();
223
+ }
224
+ });
225
+
226
+ it('does NOT exit when versions match (no mismatch)', async () => {
227
+ // readFile returns the same version as what would be loaded — no mismatch
228
+ mockReadFile.mockResolvedValue(JSON.stringify({ version: '0.0.19' }));
229
+ mockIsServiceActive.mockResolvedValue(null);
230
+
231
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
232
+ throw new Error('process.exit(0)');
233
+ });
234
+
235
+ vi.useFakeTimers();
236
+ try {
237
+ vi.resetModules();
238
+ const { startDaemon, stopDaemon } = await import('../src/daemon.js');
239
+ const result = await startDaemon();
240
+ expect(result.success).toBe(true);
241
+
242
+ await vi.advanceTimersByTimeAsync(60_000);
243
+
244
+ // No exit should have been triggered (versions match)
245
+ expect(exitSpy).not.toHaveBeenCalled();
246
+
247
+ await stopDaemon();
248
+ } finally {
249
+ exitSpy.mockRestore();
250
+ vi.useRealTimers();
251
+ }
252
+ });
253
+
254
+ it('does NOT exit before 60 seconds have elapsed', async () => {
255
+ // Version mismatch present
256
+ mockReadFile.mockImplementation(async (path: string) => {
257
+ if (typeof path === 'string' && path.includes('package.json')) {
258
+ return JSON.stringify({ version: '999.0.0' });
259
+ }
260
+ throw new Error(`Unexpected readFile: ${path}`);
261
+ });
262
+ mockIsServiceActive.mockResolvedValue(null);
263
+
264
+ const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
265
+ throw new Error('process.exit(0)');
266
+ });
267
+
268
+ vi.useFakeTimers();
269
+ try {
270
+ vi.resetModules();
271
+ const { startDaemon, stopDaemon } = await import('../src/daemon.js');
272
+ const result = await startDaemon();
273
+ expect(result.success).toBe(true);
274
+
275
+ // Only advance 30 seconds — NOT enough to trigger the 60s interval
276
+ await vi.advanceTimersByTimeAsync(30_000);
277
+
278
+ expect(exitSpy).not.toHaveBeenCalled();
279
+
280
+ await stopDaemon();
281
+ } finally {
282
+ exitSpy.mockRestore();
283
+ vi.useRealTimers();
284
+ }
285
+ });
286
+ });
package/dist/cli.js CHANGED
@@ -2,13 +2,14 @@
2
2
  // CLI entry point for ultraclaude-dashboard-agent
3
3
  import { Command } from 'commander';
4
4
  import { createRequire } from 'node:module';
5
- import { loadCredentials, loadAllCredentials, getServerUrl, readPid, isDaemonRunning, loadRegistry, getProjectId, getProjectAccount, resolveServerPaths, } from './config.js';
5
+ import { join } from 'node:path';
6
+ import { loadCredentials, loadAllCredentials, getServerUrl, readPid, isDaemonRunning, isPidAlive, cleanStalePidFile, loadRegistry, getProjectId, getProjectAccount, resolveServerPaths, } from './config.js';
6
7
  import { login } from './auth.js';
7
8
  import { startDaemon, forkDaemon, getDaemonStatus } from './daemon.js';
8
- import { installService, isServiceInstalled } from './service.js';
9
+ import { installService, isServiceInstalled, getServiceType } from './service.js';
9
10
  import { initialSync, createSnapshot as createSnapshotOnServer } from './sync.js';
10
11
  import { startRepl } from './repl.js';
11
- import { logger } from './logger.js';
12
+ import { logger, initMultistreamLogger } from './logger.js';
12
13
  const require = createRequire(import.meta.url);
13
14
  const { version } = require('../package.json');
14
15
  /**
@@ -124,11 +125,19 @@ program
124
125
  const serverUrl = getServerUrl(creds);
125
126
  // Check if already running
126
127
  const pid = await readPid(serverUrl);
127
- if (pid && isDaemonRunning(pid) && pid !== process.pid) {
128
- console.log(`Daemon already running (PID ${pid})`);
129
- return;
128
+ if (pid && pid !== process.pid) {
129
+ if (isDaemonRunning(pid)) {
130
+ console.log(`Daemon already running (PID ${pid})`);
131
+ return;
132
+ }
133
+ // PID alive but not our daemon — clean up stale PID file
134
+ if (isPidAlive(pid)) {
135
+ await cleanStalePidFile(serverUrl, pid);
136
+ }
130
137
  }
131
138
  if (options.foreground) {
139
+ // Foreground mode: log to both daemon.log and stdout
140
+ initMultistreamLogger(serverUrl);
132
141
  // Foreground mode: run in-process (for systemd/launchd/Docker/localrun.sh)
133
142
  const result = await startDaemon();
134
143
  if (!result.success) {
@@ -173,10 +182,20 @@ program
173
182
  }
174
183
  const serverUrl = getServerUrl(creds);
175
184
  const pid = await readPid(serverUrl);
176
- if (!pid || !isDaemonRunning(pid)) {
185
+ if (!pid) {
177
186
  console.log('Daemon is not running');
178
187
  return;
179
188
  }
189
+ if (!isPidAlive(pid)) {
190
+ console.log('Daemon is not running (stale PID file)');
191
+ await cleanStalePidFile(serverUrl, pid);
192
+ return;
193
+ }
194
+ if (!isDaemonRunning(pid)) {
195
+ // PID alive but not our daemon — refuse to kill
196
+ await cleanStalePidFile(serverUrl, pid);
197
+ return;
198
+ }
180
199
  try {
181
200
  process.kill(pid, 'SIGTERM');
182
201
  console.log(`Sent SIGTERM to daemon (PID ${pid})`);
@@ -188,9 +207,49 @@ program
188
207
  }
189
208
  });
190
209
  // --- status ---
210
+ /**
211
+ * Format a duration in milliseconds as a human-readable string.
212
+ * Shows the two most significant units: "30s", "5m 12s", "1h 23m", "2d 5h"
213
+ */
214
+ function formatDuration(ms) {
215
+ const totalSeconds = Math.floor(ms / 1000);
216
+ const days = Math.floor(totalSeconds / 86400);
217
+ const hours = Math.floor((totalSeconds % 86400) / 3600);
218
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
219
+ const seconds = totalSeconds % 60;
220
+ if (days > 0)
221
+ return `${days}d ${hours}h`;
222
+ if (hours > 0)
223
+ return `${hours}h ${minutes}m`;
224
+ if (minutes > 0)
225
+ return `${minutes}m ${seconds}s`;
226
+ return `${seconds}s`;
227
+ }
228
+ /**
229
+ * Format an ISO timestamp as a relative time string.
230
+ * Examples: "just now", "30s ago", "5m ago", "2h ago", "3d ago"
231
+ */
232
+ function formatRelativeTime(isoString) {
233
+ const diffMs = Date.now() - new Date(isoString).getTime();
234
+ if (diffMs < 0)
235
+ return 'just now';
236
+ const diffSeconds = Math.floor(diffMs / 1000);
237
+ if (diffSeconds < 5)
238
+ return 'just now';
239
+ if (diffSeconds < 60)
240
+ return `${diffSeconds}s ago`;
241
+ const diffMinutes = Math.floor(diffSeconds / 60);
242
+ if (diffMinutes < 60)
243
+ return `${diffMinutes}m ago`;
244
+ const diffHours = Math.floor(diffMinutes / 60);
245
+ if (diffHours < 24)
246
+ return `${diffHours}h ago`;
247
+ const diffDays = Math.floor(diffHours / 24);
248
+ return `${diffDays}d ago`;
249
+ }
191
250
  program
192
251
  .command('status')
193
- .description('Show all projects, sync state, last push time')
252
+ .description('Show daemon health, version, uptime, service type, and project sync state')
194
253
  .option('--account <email>', 'Target account (email prefix or full email)')
195
254
  .action(async (options) => {
196
255
  const creds = await resolveCredentials(options.account);
@@ -204,14 +263,32 @@ program
204
263
  // Get daemon status (reads status.json for external daemon)
205
264
  const status = await getDaemonStatus(serverUrl);
206
265
  if (status.running) {
207
- const uptime = status.startedAt ? `since ${status.startedAt}` : '';
208
- console.log(`Daemon: running (PID ${status.pid}) ${uptime}`);
266
+ console.log(`Daemon: running (PID ${status.pid})`);
267
+ // Version + staleness warning
268
+ if (status.version) {
269
+ if (status.version !== version) {
270
+ console.log(`Version: ${status.version} (installed: ${version} — restart to update)`);
271
+ }
272
+ else {
273
+ console.log(`Version: ${status.version}`);
274
+ }
275
+ }
276
+ else {
277
+ console.log(`Version: ${version}`);
278
+ }
279
+ // Uptime as human-readable duration
280
+ if (status.startedAt) {
281
+ const uptimeMs = Date.now() - new Date(status.startedAt).getTime();
282
+ console.log(`Uptime: ${formatDuration(uptimeMs)}`);
283
+ }
209
284
  }
210
285
  else {
211
286
  console.log('Daemon: stopped');
287
+ console.log(`Version: ${version}`);
212
288
  }
213
- const serviceInstalled = await isServiceInstalled();
214
- console.log(`Auto-start: ${serviceInstalled ? 'installed' : 'not installed'}`);
289
+ // Service management type
290
+ const serviceType = await getServiceType();
291
+ console.log(`Service: ${serviceType}`);
215
292
  console.log(`Logs: ${resolveServerPaths(serverUrl).logDir}`);
216
293
  // Load all accounts for display
217
294
  const accounts = await loadAllCredentials(serverUrl);
@@ -227,10 +304,10 @@ program
227
304
  const accountId = await getProjectAccount(serverUrl, project.path);
228
305
  const acctCreds = accountId ? accounts.get(accountId) : null;
229
306
  const accountLabel = acctCreds ? `account: ${acctCreds.email ?? accountId}` : accountId ? `account: ${accountId} (removed)` : 'no account';
230
- // Show per-project sync state from daemon status if available
307
+ // Show per-project sync state from daemon status with relative timestamps
231
308
  const daemonProject = status.projects.find((p) => p.path === project.path);
232
309
  const syncInfo = daemonProject?.lastSyncAt
233
- ? `last sync: ${daemonProject.lastSyncAt}`
310
+ ? `last sync: ${formatRelativeTime(daemonProject.lastSyncAt)}`
234
311
  : daemonProject
235
312
  ? 'not yet synced'
236
313
  : '';
@@ -314,6 +391,56 @@ program
314
391
  }
315
392
  }
316
393
  });
394
+ // --- logs ---
395
+ program
396
+ .command('logs')
397
+ .description('Tail daemon.log with pretty formatting')
398
+ .option('--json', 'Output raw JSON instead of pretty-printed')
399
+ .option('-n, --lines <count>', 'Number of lines to show', '50')
400
+ .option('--no-follow', 'Print last N lines and exit (no tailing)')
401
+ .option('--account <email>', 'Target account (email prefix or full email)')
402
+ .action(async (options) => {
403
+ const creds = await resolveCredentials(options.account);
404
+ if (!creds) {
405
+ console.error('Not logged in. Run `ultraclaude-dashboard-agent login` first.');
406
+ process.exitCode = 1;
407
+ return;
408
+ }
409
+ const serverUrl = getServerUrl(creds);
410
+ const { logDir } = resolveServerPaths(serverUrl);
411
+ const logFile = join(logDir, 'daemon.log');
412
+ const { existsSync } = await import('node:fs');
413
+ if (!existsSync(logFile)) {
414
+ console.error(`No log file found at ${logFile}`);
415
+ console.error('Is the daemon running? Start it with: ultraclaude-agent start');
416
+ process.exitCode = 1;
417
+ return;
418
+ }
419
+ const { spawn: spawnChild } = await import('node:child_process');
420
+ if (options.json) {
421
+ // Raw JSON output — just tail the file
422
+ const tailArgs = options.follow
423
+ ? ['-f', '-n', options.lines, logFile]
424
+ : ['-n', options.lines, logFile];
425
+ const tail = spawnChild('tail', tailArgs, { stdio: 'inherit' });
426
+ tail.on('exit', (code) => { process.exitCode = code ?? 0; });
427
+ }
428
+ else {
429
+ // Pretty-printed output — pipe tail through pino-pretty
430
+ const tailArgs = options.follow
431
+ ? ['-f', '-n', options.lines, logFile]
432
+ : ['-n', options.lines, logFile];
433
+ const tail = spawnChild('tail', tailArgs, { stdio: ['ignore', 'pipe', 'inherit'] });
434
+ const pinoPretty = (await import('pino-pretty')).default;
435
+ const pretty = pinoPretty({ colorize: true, sync: true });
436
+ tail.stdout.pipe(pretty).pipe(process.stdout);
437
+ tail.on('exit', (code) => {
438
+ if (!options.follow)
439
+ process.exitCode = code ?? 0;
440
+ });
441
+ pretty.on('error', () => { }); // ignore broken pipe on Ctrl+C
442
+ }
443
+ });
317
444
  // unlink removed — projects are auto-discovered from ~/.claude/projects/
318
445
  await program.parseAsync(process.argv);
319
446
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,kDAAkD;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE;;;GAGG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAgB;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,eAAe,EAAE,CAAC;IAEvC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,KAAK;YAAE,SAAS;QACvB,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QACpD,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,6BAA6B,CAAC;KACnC,WAAW,CAAC,8EAA8E,CAAC;KAC3F,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,0CAA0C;IAC1C,MAAM,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEL,kBAAkB;AAElB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAEhB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAEhB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,0DAA0D,CAAC;KACvE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,OAA8C,EAAE,EAAE;IAC/D,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAEtC,6BAA6B;QAC7B,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QAED,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,GAAG,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,gBAAgB;AAEhB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,cAAc,EAAE,gDAAgD,CAAC;KACxE,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,OAAmD,EAAE,EAAE;IACpE,gEAAgE;IAChE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAEtC,2BAA2B;IAC3B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,GAAG,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,2EAA2E;QAC3E,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,+CAA+C;QAC/C,OAAO;IACT,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEjD,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,GAAG,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,aAAa,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,wBAAwB,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe;AAEf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;IAC9C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,iBAAiB;AAEjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;IAC9C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAErC,4DAA4D;IAC5D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,EAAE,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,eAAe,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,SAAS,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7D,gCAAgC;IAChC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;QAC9E,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,SAAS,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QAE3I,8DAA8D;QAC9D,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,aAAa,EAAE,UAAU;YACxC,CAAC,CAAC,cAAc,aAAa,CAAC,UAAU,EAAE;YAC1C,CAAC,CAAC,aAAa;gBACb,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,SAAS,GAAG,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,KAAK,YAAY,MAAM,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpI,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,eAAe;AAEf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;KACtD,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,OAA+C,EAAE,EAAE;IAChE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAEjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAQ,CAAC,CACvE,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,OAAO,yBAAyB,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,6CAA6C,CAAC,CAAC;YACnF,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1C,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,mBAAmB;AAEnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,CAAC;KACxD,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;KAC9C,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA+C,EAAE,EAAE;IAC/E,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAEjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAQ,CAAC,CACvE,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,OAAO,yBAAyB,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5F,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,iBAAiB,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,yEAAyE;AAEzE,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}