ultraclaude-agent 0.0.18 → 0.0.20
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.
- package/__tests__/pid-detection.test.ts +68 -0
- package/__tests__/usage-sync.test.ts +8 -0
- package/__tests__/version-watcher.test.ts +286 -0
- package/dist/cli.js +141 -14
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +65 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +4 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +95 -5
- package/dist/daemon.js.map +1 -1
- package/dist/logger.d.ts +7 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +35 -0
- package/dist/logger.js.map +1 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +15 -9
- package/dist/repl.js.map +1 -1
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.d.ts.map +1 -0
- package/dist/scripts/postinstall.js +174 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/service.d.ts +14 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +54 -1
- package/dist/service.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +11 -2
- package/dist/setup.js.map +1 -1
- package/dist/status.d.ts +1 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js.map +1 -1
- package/dist/watcher.d.ts +2 -0
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +5 -1
- package/dist/watcher.js.map +1 -1
- package/package.json +2 -1
- package/src/cli.ts +147 -13
- package/src/config.ts +64 -1
- package/src/daemon.ts +108 -4
- package/src/logger.ts +39 -0
- package/src/repl.ts +15 -8
- package/src/scripts/postinstall.ts +179 -0
- package/src/service.ts +49 -1
- package/src/setup.ts +12 -2
- package/src/status.ts +1 -0
- 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 {
|
|
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 &&
|
|
128
|
-
|
|
129
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
208
|
-
|
|
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
|
-
|
|
214
|
-
|
|
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
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|