ultraclaude-agent 0.0.3
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__/config-windows.test.ts +93 -0
- package/__tests__/daemon.test.ts +166 -0
- package/__tests__/service-windows.test.ts +123 -0
- package/__tests__/sync-bugs.test.ts +246 -0
- package/__tests__/sync.test.ts +169 -0
- package/__tests__/usage-sync.test.ts +291 -0
- package/__tests__/version-check.test.ts +128 -0
- package/dist/auth.d.ts +10 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +105 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +196 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +181 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +27 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +214 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +37 -0
- package/dist/logger.js.map +1 -0
- package/dist/service.d.ts +4 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +223 -0
- package/dist/service.js.map +1 -0
- package/dist/sync.d.ts +25 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +344 -0
- package/dist/sync.js.map +1 -0
- package/dist/usage-sync.d.ts +7 -0
- package/dist/usage-sync.d.ts.map +1 -0
- package/dist/usage-sync.js +208 -0
- package/dist/usage-sync.js.map +1 -0
- package/dist/watcher.d.ts +16 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +90 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +31 -0
- package/run.sh +28 -0
- package/src/auth.ts +127 -0
- package/src/cli.ts +235 -0
- package/src/config.ts +207 -0
- package/src/daemon.ts +264 -0
- package/src/index.ts +7 -0
- package/src/logger.ts +42 -0
- package/src/service.ts +237 -0
- package/src/sync.ts +473 -0
- package/src/usage-sync.ts +275 -0
- package/src/watcher.ts +106 -0
- package/tsconfig.build.json +6 -0
- package/tsconfig.json +8 -0
- package/tsconfig.tsbuildinfo +1 -0
package/dist/auth.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Login flow: opens browser → Clerk auth → receives API key via localhost callback
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { URL } from 'node:url';
|
|
4
|
+
import { saveCredentials, getServerUrl } from './config.js';
|
|
5
|
+
import { logger } from './logger.js';
|
|
6
|
+
const CALLBACK_TIMEOUT_MS = 120_000; // 2 minutes
|
|
7
|
+
/**
|
|
8
|
+
* Run the browser-based login flow.
|
|
9
|
+
* 1. Start a localhost HTTP server on a random port
|
|
10
|
+
* 2. Open browser to the server's daemon-login page with callback URL
|
|
11
|
+
* 3. Wait for the server to redirect back with the API key
|
|
12
|
+
* 4. Save credentials and close the server
|
|
13
|
+
*/
|
|
14
|
+
export async function login(serverUrl) {
|
|
15
|
+
const baseUrl = serverUrl ?? getServerUrl();
|
|
16
|
+
const log = logger.child({ op: 'login' });
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
let resolved = false;
|
|
19
|
+
let server = null;
|
|
20
|
+
const timeout = setTimeout(() => {
|
|
21
|
+
if (!resolved) {
|
|
22
|
+
resolved = true;
|
|
23
|
+
server?.close();
|
|
24
|
+
reject(new Error('Login timed out — no response within 2 minutes'));
|
|
25
|
+
}
|
|
26
|
+
}, CALLBACK_TIMEOUT_MS);
|
|
27
|
+
server = createServer((req, res) => {
|
|
28
|
+
if (!req.url) {
|
|
29
|
+
res.writeHead(400);
|
|
30
|
+
res.end('Bad request');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const url = new URL(req.url, `http://localhost`);
|
|
34
|
+
if (url.pathname === '/callback') {
|
|
35
|
+
const apiKey = url.searchParams.get('key');
|
|
36
|
+
const userId = url.searchParams.get('userId');
|
|
37
|
+
const error = url.searchParams.get('error');
|
|
38
|
+
if (error) {
|
|
39
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
40
|
+
res.end('<html><body><h2>Login failed</h2><p>You can close this window.</p></body></html>');
|
|
41
|
+
if (!resolved) {
|
|
42
|
+
resolved = true;
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
server?.close();
|
|
45
|
+
reject(new Error(`Login failed: ${error}`));
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!apiKey || !userId) {
|
|
50
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
51
|
+
res.end('<html><body><h2>Invalid callback</h2><p>Missing key or userId.</p></body></html>');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
55
|
+
res.end('<html><body><h2>Login successful!</h2><p>You can close this window.</p></body></html>');
|
|
56
|
+
if (!resolved) {
|
|
57
|
+
resolved = true;
|
|
58
|
+
clearTimeout(timeout);
|
|
59
|
+
server?.close();
|
|
60
|
+
const creds = { apiKey, userId, serverUrl: baseUrl };
|
|
61
|
+
saveCredentials(creds)
|
|
62
|
+
.then(() => {
|
|
63
|
+
log.info('Credentials saved');
|
|
64
|
+
resolve(creds);
|
|
65
|
+
})
|
|
66
|
+
.catch(reject);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
res.writeHead(404);
|
|
71
|
+
res.end('Not found');
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
server.listen(0, '127.0.0.1', async () => {
|
|
75
|
+
const address = server.address();
|
|
76
|
+
if (!address || typeof address === 'string') {
|
|
77
|
+
resolved = true;
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
reject(new Error('Failed to bind to a port'));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const callbackUrl = `http://127.0.0.1:${address.port}/callback`;
|
|
83
|
+
const loginUrl = `${baseUrl}/api/auth/daemon-login?callback=${encodeURIComponent(callbackUrl)}`;
|
|
84
|
+
log.info({ loginUrl }, 'Opening browser for login');
|
|
85
|
+
console.log(`\nOpening browser for login...\n ${loginUrl}\n`);
|
|
86
|
+
console.log('If the browser does not open, visit the URL above manually.\n');
|
|
87
|
+
try {
|
|
88
|
+
const open = (await import('open')).default;
|
|
89
|
+
await open(loginUrl);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// open() can fail in headless environments — user can visit URL manually
|
|
93
|
+
log.warn('Could not open browser automatically');
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
server.on('error', (err) => {
|
|
97
|
+
if (!resolved) {
|
|
98
|
+
resolved = true;
|
|
99
|
+
clearTimeout(timeout);
|
|
100
|
+
reject(err);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// CLI entry point for ultraclaude-dashboard-agent
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { loadCredentials, readPid, isDaemonRunning, loadRegistry, getProjectId, } from './config.js';
|
|
6
|
+
import { login } from './auth.js';
|
|
7
|
+
import { startDaemon } from './daemon.js';
|
|
8
|
+
import { installService, isServiceInstalled } from './service.js';
|
|
9
|
+
import { initialSync, createSnapshot as createSnapshotOnServer } from './sync.js';
|
|
10
|
+
import { logger } from './logger.js';
|
|
11
|
+
// writeFile removed — no longer writing registry file
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const { version } = require('../package.json');
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name('ultraclaude-dashboard-agent')
|
|
17
|
+
.description('Ultra Claude Dashboard sync agent — watches projects and syncs documentation')
|
|
18
|
+
.version(version);
|
|
19
|
+
// --- login ---
|
|
20
|
+
program
|
|
21
|
+
.command('login')
|
|
22
|
+
.description('One-time Clerk browser auth + install auto-start service')
|
|
23
|
+
.option('--server <url>', 'Dashboard server URL')
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
try {
|
|
26
|
+
console.log('Starting login flow...');
|
|
27
|
+
const creds = await login(options.server);
|
|
28
|
+
console.log(`Logged in as user ${creds.userId}`);
|
|
29
|
+
// Install auto-start service
|
|
30
|
+
const installed = await isServiceInstalled();
|
|
31
|
+
if (!installed) {
|
|
32
|
+
console.log('Installing auto-start service...');
|
|
33
|
+
await installService();
|
|
34
|
+
console.log('Auto-start service installed — daemon will start on login');
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log('Auto-start service already installed');
|
|
38
|
+
}
|
|
39
|
+
// Start daemon immediately
|
|
40
|
+
console.log('Starting daemon...');
|
|
41
|
+
const result = await startDaemon();
|
|
42
|
+
if (result.success) {
|
|
43
|
+
console.log('Daemon started — watching all registered projects');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log(`Could not start daemon: ${result.message}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
logger.error({ err }, 'Login failed');
|
|
51
|
+
console.error(`Login failed: ${err instanceof Error ? err.message : err}`);
|
|
52
|
+
process.exitCode = 1;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// --- start ---
|
|
56
|
+
program
|
|
57
|
+
.command('start')
|
|
58
|
+
.description('Start global daemon (watches all projects in registry)')
|
|
59
|
+
.option('--foreground', 'Run in foreground (for systemd/launchd)')
|
|
60
|
+
.action(async () => {
|
|
61
|
+
// Check if already running
|
|
62
|
+
const pid = await readPid();
|
|
63
|
+
if (pid && isDaemonRunning(pid) && pid !== process.pid) {
|
|
64
|
+
console.log(`Daemon already running (PID ${pid})`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const result = await startDaemon();
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
logger.error({ error: result.error }, result.message);
|
|
70
|
+
console.error(`Failed to start: ${result.message}`);
|
|
71
|
+
process.exitCode = 1;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
console.log('Daemon started — watching all registered projects');
|
|
75
|
+
// Keep process alive (watchers are persistent)
|
|
76
|
+
});
|
|
77
|
+
// --- stop ---
|
|
78
|
+
program
|
|
79
|
+
.command('stop')
|
|
80
|
+
.description('Stop global daemon')
|
|
81
|
+
.action(async () => {
|
|
82
|
+
const pid = await readPid();
|
|
83
|
+
if (!pid || !isDaemonRunning(pid)) {
|
|
84
|
+
console.log('Daemon is not running');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
process.kill(pid, 'SIGTERM');
|
|
89
|
+
console.log(`Sent SIGTERM to daemon (PID ${pid})`);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
logger.error({ err }, 'Failed to stop daemon');
|
|
93
|
+
console.error(`Failed to stop: ${err instanceof Error ? err.message : err}`);
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// --- status ---
|
|
98
|
+
program
|
|
99
|
+
.command('status')
|
|
100
|
+
.description('Show all projects, sync state, last push time')
|
|
101
|
+
.action(async () => {
|
|
102
|
+
const creds = await loadCredentials();
|
|
103
|
+
if (!creds) {
|
|
104
|
+
console.log('Not logged in. Run `ultraclaude-dashboard-agent login` first.');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.log(`Server: ${creds.serverUrl}`);
|
|
108
|
+
console.log(`User: ${creds.userId}`);
|
|
109
|
+
const pid = await readPid();
|
|
110
|
+
const running = pid !== null && isDaemonRunning(pid);
|
|
111
|
+
console.log(`Daemon: ${running ? `running (PID ${pid})` : 'stopped'}`);
|
|
112
|
+
const serviceInstalled = await isServiceInstalled();
|
|
113
|
+
console.log(`Auto-start: ${serviceInstalled ? 'installed' : 'not installed'}`);
|
|
114
|
+
const registry = await loadRegistry();
|
|
115
|
+
console.log(`\nRegistered projects: ${registry.projects.length}`);
|
|
116
|
+
for (const project of registry.projects) {
|
|
117
|
+
const projectId = await getProjectId(project.path);
|
|
118
|
+
const idStatus = projectId ? `id: ${projectId.slice(0, 8)}...` : 'not synced';
|
|
119
|
+
console.log(` ${project.name} — ${project.path} (${idStatus})`);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// --- push ---
|
|
123
|
+
program
|
|
124
|
+
.command('push')
|
|
125
|
+
.description('One-shot push (all projects or specific project)')
|
|
126
|
+
.option('--project <name>', 'Specific project to push')
|
|
127
|
+
.action(async (options) => {
|
|
128
|
+
const creds = await loadCredentials();
|
|
129
|
+
if (!creds) {
|
|
130
|
+
console.error('Not logged in. Run `ultraclaude-dashboard-agent login` first.');
|
|
131
|
+
process.exitCode = 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const registry = await loadRegistry();
|
|
135
|
+
let projects = registry.projects;
|
|
136
|
+
if (options.project) {
|
|
137
|
+
projects = projects.filter((p) => p.name === options.project || p.path.endsWith(options.project));
|
|
138
|
+
if (projects.length === 0) {
|
|
139
|
+
console.error(`Project "${options.project}" not found in registry`);
|
|
140
|
+
process.exitCode = 1;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const project of projects) {
|
|
145
|
+
const projectId = await getProjectId(project.path);
|
|
146
|
+
if (!projectId) {
|
|
147
|
+
console.log(`Skipping ${project.name} — no project ID (run login or start first)`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
console.log(`Pushing ${project.name}...`);
|
|
151
|
+
await initialSync(projectId, project.path);
|
|
152
|
+
console.log(`Done: ${project.name}`);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// --- snapshot ---
|
|
156
|
+
program
|
|
157
|
+
.command('snapshot')
|
|
158
|
+
.description('Create named snapshot')
|
|
159
|
+
.argument('[label]', 'Snapshot label', 'manual snapshot')
|
|
160
|
+
.option('--project <name>', 'Specific project')
|
|
161
|
+
.action(async (label, options) => {
|
|
162
|
+
const creds = await loadCredentials();
|
|
163
|
+
if (!creds) {
|
|
164
|
+
console.error('Not logged in. Run `ultraclaude-dashboard-agent login` first.');
|
|
165
|
+
process.exitCode = 1;
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const registry = await loadRegistry();
|
|
169
|
+
let projects = registry.projects;
|
|
170
|
+
if (options.project) {
|
|
171
|
+
projects = projects.filter((p) => p.name === options.project || p.path.endsWith(options.project));
|
|
172
|
+
if (projects.length === 0) {
|
|
173
|
+
console.error(`Project "${options.project}" not found in registry`);
|
|
174
|
+
process.exitCode = 1;
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
for (const project of projects) {
|
|
179
|
+
const projectId = await getProjectId(project.path);
|
|
180
|
+
if (!projectId) {
|
|
181
|
+
console.log(`Skipping ${project.name} — no project ID`);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const success = await createSnapshotOnServer(projectId, label);
|
|
185
|
+
if (success) {
|
|
186
|
+
console.log(`Snapshot "${label}" created for ${project.name}`);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
console.error(`Failed to create snapshot for ${project.name}`);
|
|
190
|
+
process.exitCode = 1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
// unlink removed — projects are auto-discovered from ~/.claude/projects/
|
|
195
|
+
await program.parseAsync(process.argv);
|
|
196
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentCredentials, ProjectRegistry } from '@ultra-claude/shared';
|
|
2
|
+
export declare const paths: {
|
|
3
|
+
readonly configDir: string;
|
|
4
|
+
readonly credentials: string;
|
|
5
|
+
readonly pid: string;
|
|
6
|
+
readonly logDir: string;
|
|
7
|
+
readonly claudeProjects: string;
|
|
8
|
+
readonly projectIdFile: ".claude/ultra/project-id";
|
|
9
|
+
};
|
|
10
|
+
export declare function getServerUrl(credentials?: AgentCredentials | null): string;
|
|
11
|
+
export declare function loadCredentials(): Promise<AgentCredentials | null>;
|
|
12
|
+
export declare function saveCredentials(creds: AgentCredentials): Promise<void>;
|
|
13
|
+
export declare function writePid(): Promise<void>;
|
|
14
|
+
export declare function readPid(): Promise<number | null>;
|
|
15
|
+
export declare function removePid(): Promise<void>;
|
|
16
|
+
export declare function isDaemonRunning(pid: number): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Auto-discover Ultra Claude projects by scanning ~/.claude/projects/.
|
|
19
|
+
* A project is an Ultra Claude project if it has .claude/ultra/version.json.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadRegistry(): Promise<ProjectRegistry>;
|
|
22
|
+
export declare function getProjectId(projectPath: string): Promise<string | null>;
|
|
23
|
+
export declare function writeProjectId(projectPath: string, id: string): Promise<void>;
|
|
24
|
+
export declare function ensureLogDir(): Promise<void>;
|
|
25
|
+
export declare function fileExists(path: string): Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAoB9E,eAAO,MAAM,KAAK;;;;;;;CAOR,CAAC;AAIX,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,CAM1E;AAID,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOxE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAID,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAG9C;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOtD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOpD;AAgDD;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CA8B7D;AAID,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAM9E;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInF;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;AAID,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// Configuration, paths, and credential management for the sync agent daemon
|
|
2
|
+
import { homedir, platform } from 'node:os';
|
|
3
|
+
import { join, basename } from 'node:path';
|
|
4
|
+
import { readFile, writeFile, mkdir, unlink, access, readdir } from 'node:fs/promises';
|
|
5
|
+
// --- Paths ---
|
|
6
|
+
function resolveConfigDir() {
|
|
7
|
+
if (platform() === 'win32') {
|
|
8
|
+
// Windows: use %APPDATA%\ultraclaude-agent\
|
|
9
|
+
const appData = process.env.APPDATA ?? join(homedir(), 'AppData', 'Roaming');
|
|
10
|
+
return join(appData, 'ultraclaude-agent');
|
|
11
|
+
}
|
|
12
|
+
return join(homedir(), '.claude', 'ultra', 'dashboard');
|
|
13
|
+
}
|
|
14
|
+
const CONFIG_DIR = resolveConfigDir();
|
|
15
|
+
const CREDENTIALS_FILE = join(CONFIG_DIR, 'credentials.json');
|
|
16
|
+
const PID_FILE = join(CONFIG_DIR, 'daemon.pid');
|
|
17
|
+
const LOG_DIR = join(CONFIG_DIR, 'logs');
|
|
18
|
+
// Registry is auto-discovered from ~/.claude/projects/ — no file needed
|
|
19
|
+
const PROJECT_ID_FILE = '.claude/ultra/project-id';
|
|
20
|
+
export const paths = {
|
|
21
|
+
configDir: CONFIG_DIR,
|
|
22
|
+
credentials: CREDENTIALS_FILE,
|
|
23
|
+
pid: PID_FILE,
|
|
24
|
+
logDir: LOG_DIR,
|
|
25
|
+
claudeProjects: join(homedir(), '.claude', 'projects'),
|
|
26
|
+
projectIdFile: PROJECT_ID_FILE,
|
|
27
|
+
};
|
|
28
|
+
// --- Server URL ---
|
|
29
|
+
export function getServerUrl(credentials) {
|
|
30
|
+
return (process.env.ULTRACLAUDE_DASHBOARD_URL ??
|
|
31
|
+
credentials?.serverUrl ??
|
|
32
|
+
'https://dashboard.ultra-claude.dev');
|
|
33
|
+
}
|
|
34
|
+
// --- Credentials ---
|
|
35
|
+
export async function loadCredentials() {
|
|
36
|
+
try {
|
|
37
|
+
const data = await readFile(CREDENTIALS_FILE, 'utf8');
|
|
38
|
+
return JSON.parse(data);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function saveCredentials(creds) {
|
|
45
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
46
|
+
await writeFile(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });
|
|
47
|
+
}
|
|
48
|
+
// --- PID file ---
|
|
49
|
+
export async function writePid() {
|
|
50
|
+
await mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
51
|
+
await writeFile(PID_FILE, String(process.pid));
|
|
52
|
+
}
|
|
53
|
+
export async function readPid() {
|
|
54
|
+
try {
|
|
55
|
+
const pid = parseInt(await readFile(PID_FILE, 'utf8'), 10);
|
|
56
|
+
return Number.isNaN(pid) ? null : pid;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function removePid() {
|
|
63
|
+
try {
|
|
64
|
+
await unlink(PID_FILE);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Ignore if already gone
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function isDaemonRunning(pid) {
|
|
71
|
+
try {
|
|
72
|
+
process.kill(pid, 0);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// --- Registry (auto-discovery) ---
|
|
80
|
+
/**
|
|
81
|
+
* Decode a Claude Code project directory name back to a real filesystem path.
|
|
82
|
+
* Claude encodes paths by replacing / with - (e.g., /home/user/my-project -> -home-user-my-project).
|
|
83
|
+
* Since hyphens also appear in real directory names, we try all possible splits
|
|
84
|
+
* and return the first path that actually exists on disk.
|
|
85
|
+
*/
|
|
86
|
+
async function decodeProjectPath(encoded) {
|
|
87
|
+
// Strip leading dash: "-home-user-project" -> "home-user-project"
|
|
88
|
+
const segments = encoded.slice(1).split('-');
|
|
89
|
+
// Recursively try combining segments with / or - at each position
|
|
90
|
+
async function tryResolve(idx, current) {
|
|
91
|
+
if (idx === segments.length) {
|
|
92
|
+
// Check if this path has a .claude/ultra/version.json
|
|
93
|
+
try {
|
|
94
|
+
await access(join('/', current, '.claude', 'ultra', 'version.json'));
|
|
95
|
+
return '/' + current;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const seg = segments[idx];
|
|
102
|
+
// Try as new path segment (/)
|
|
103
|
+
const withSlash = current ? `${current}/${seg}` : seg;
|
|
104
|
+
const slashResult = await tryResolve(idx + 1, withSlash);
|
|
105
|
+
if (slashResult)
|
|
106
|
+
return slashResult;
|
|
107
|
+
// Try as continuation of current segment (-)
|
|
108
|
+
if (current) {
|
|
109
|
+
const lastSlash = current.lastIndexOf('/');
|
|
110
|
+
const prefix = lastSlash >= 0 ? current.slice(0, lastSlash + 1) : '';
|
|
111
|
+
const lastSeg = lastSlash >= 0 ? current.slice(lastSlash + 1) : current;
|
|
112
|
+
const withDash = `${prefix}${lastSeg}-${seg}`;
|
|
113
|
+
return tryResolve(idx + 1, withDash);
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
return tryResolve(0, '');
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Auto-discover Ultra Claude projects by scanning ~/.claude/projects/.
|
|
121
|
+
* A project is an Ultra Claude project if it has .claude/ultra/version.json.
|
|
122
|
+
*/
|
|
123
|
+
export async function loadRegistry() {
|
|
124
|
+
const claudeProjectsDir = join(homedir(), '.claude', 'projects');
|
|
125
|
+
const projects = [];
|
|
126
|
+
try {
|
|
127
|
+
const entries = await readdir(claudeProjectsDir, { withFileTypes: true });
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
if (!entry.isDirectory())
|
|
130
|
+
continue;
|
|
131
|
+
const realPath = await decodeProjectPath(entry.name);
|
|
132
|
+
if (realPath) {
|
|
133
|
+
// Read project name from app-context.md or fall back to directory name
|
|
134
|
+
let name = basename(realPath);
|
|
135
|
+
try {
|
|
136
|
+
const ctx = await readFile(join(realPath, '.claude', 'ultra', 'app-context.md'), 'utf8');
|
|
137
|
+
const nameMatch = ctx.match(/\*\*Name:\*\*\s*(.+)/);
|
|
138
|
+
if (nameMatch)
|
|
139
|
+
name = nameMatch[1].trim();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Use directory name
|
|
143
|
+
}
|
|
144
|
+
projects.push({ path: realPath, name });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// ~/.claude/projects/ doesn't exist
|
|
150
|
+
}
|
|
151
|
+
return { projects };
|
|
152
|
+
}
|
|
153
|
+
// --- Project ID ---
|
|
154
|
+
export async function getProjectId(projectPath) {
|
|
155
|
+
try {
|
|
156
|
+
return (await readFile(join(projectPath, PROJECT_ID_FILE), 'utf8')).trim();
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function writeProjectId(projectPath, id) {
|
|
163
|
+
const dir = join(projectPath, '.claude', 'ultra');
|
|
164
|
+
await mkdir(dir, { recursive: true });
|
|
165
|
+
await writeFile(join(projectPath, PROJECT_ID_FILE), id, 'utf8');
|
|
166
|
+
}
|
|
167
|
+
// --- Log dir ---
|
|
168
|
+
export async function ensureLogDir() {
|
|
169
|
+
await mkdir(LOG_DIR, { recursive: true });
|
|
170
|
+
}
|
|
171
|
+
// --- File existence check ---
|
|
172
|
+
export async function fileExists(path) {
|
|
173
|
+
try {
|
|
174
|
+
await access(path);
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Result } from '@ultra-claude/shared';
|
|
2
|
+
/**
|
|
3
|
+
* Check npm registry for a newer version. Non-blocking — network errors are silently ignored.
|
|
4
|
+
*/
|
|
5
|
+
export declare function checkForUpdate(): Promise<void>;
|
|
6
|
+
type StartDaemonError = 'NOT_LOGGED_IN' | 'ALREADY_RUNNING';
|
|
7
|
+
/**
|
|
8
|
+
* Start the global daemon. Watches the project registry and manages per-project watchers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function startDaemon(): Promise<Result<void, StartDaemonError>>;
|
|
11
|
+
/**
|
|
12
|
+
* Stop the daemon and clean up all watchers.
|
|
13
|
+
*/
|
|
14
|
+
export declare function stopDaemon(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Get status of all active project watchers.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getDaemonStatus(): {
|
|
19
|
+
running: boolean;
|
|
20
|
+
usageWatcher: boolean;
|
|
21
|
+
projects: {
|
|
22
|
+
path: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
}[];
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAkB5D;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BpD;AAOD,KAAK,gBAAgB,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAE5D;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAsE3E;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBhD;AAqED;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAS9H"}
|