@aeolus-fleet/trierarch 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -17
- package/dist/adapters/claude-code-setup.d.ts +18 -0
- package/dist/adapters/claude-code-setup.js +51 -0
- package/dist/adapters/claude-code-setup.js.map +1 -0
- package/dist/adapters/claude-code.js +18 -2
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/files.d.ts +6 -3
- package/dist/adapters/files.js +4 -3
- package/dist/adapters/files.js.map +1 -1
- package/dist/adapters/git-workspace.d.ts +0 -6
- package/dist/adapters/git-workspace.js +12 -2
- package/dist/adapters/git-workspace.js.map +1 -1
- package/dist/adapters/json-state.js +1 -0
- package/dist/adapters/json-state.js.map +1 -1
- package/dist/adapters/rest-fleet.d.ts +7 -2
- package/dist/adapters/rest-fleet.js +17 -4
- package/dist/adapters/rest-fleet.js.map +1 -1
- package/dist/adapters/service.d.ts +53 -0
- package/dist/adapters/service.js +224 -0
- package/dist/adapters/service.js.map +1 -0
- package/dist/bin/aeolus-trierarch.js +3 -1
- package/dist/bin/aeolus-trierarch.js.map +1 -1
- package/dist/cli/config-check.d.ts +11 -2
- package/dist/cli/config-check.js +10 -3
- package/dist/cli/config-check.js.map +1 -1
- package/dist/cli/init.d.ts +36 -11
- package/dist/cli/init.js +213 -19
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/list.d.ts +16 -0
- package/dist/cli/list.js +32 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/logs.d.ts +16 -0
- package/dist/cli/logs.js +51 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/main.js +221 -52
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/prompter.d.ts +25 -0
- package/dist/cli/prompter.js +95 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/run.d.ts +15 -1
- package/dist/cli/run.js +22 -6
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/status.d.ts +44 -0
- package/dist/cli/status.js +65 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/uninstall.d.ts +19 -0
- package/dist/cli/uninstall.js +16 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/cli/upgrade.d.ts +31 -0
- package/dist/cli/upgrade.js +39 -0
- package/dist/cli/upgrade.js.map +1 -0
- package/dist/core/entry.d.ts +2 -0
- package/dist/core/entry.js.map +1 -1
- package/dist/core/ports.d.ts +3 -0
- package/dist/core/run-pass.js +13 -2
- package/dist/core/run-pass.js.map +1 -1
- package/package.json +3 -3
- package/dist/cli/install.d.ts +0 -34
- package/dist/cli/install.js +0 -109
- package/dist/cli/install.js.map +0 -1
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { mkdir, rm, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* The trierarch as a service of the operating system: `aeolus-trierarch run`
|
|
5
|
+
* kept alive, started at login and again whenever it stops. A launchd agent
|
|
6
|
+
* on macOS, a systemd user unit on Linux. Installing, starting, stopping and
|
|
7
|
+
* asking how it runs go through `launchctl` or `systemctl --user`, and `ps`
|
|
8
|
+
* for since when.
|
|
9
|
+
*/
|
|
10
|
+
export const LAUNCHD_LABEL = 'dev.aeolus-fleet.trierarch';
|
|
11
|
+
export const SYSTEMD_UNIT = 'aeolus-trierarch.service';
|
|
12
|
+
/** The variables the trierarch itself reads, carried into the service when set where install ran. */
|
|
13
|
+
const TRIERARCH_VARIABLES = ['AEOLUS_PLUGIN_ROOT', 'AEOLUS_PLUGIN_DATA', 'AEOLUS_TRIERARCH_CONFIG'];
|
|
14
|
+
const DEFAULT_PATH = '/usr/bin:/bin';
|
|
15
|
+
/** The service's environment: PATH, so it finds tmux, git and claude, and the trierarch's own variables. */
|
|
16
|
+
export function serviceEnvironment(env) {
|
|
17
|
+
const environment = { PATH: env.PATH ?? DEFAULT_PATH };
|
|
18
|
+
for (const name of TRIERARCH_VARIABLES) {
|
|
19
|
+
const value = env[name];
|
|
20
|
+
if (value !== undefined) {
|
|
21
|
+
environment[name] = value;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return environment;
|
|
25
|
+
}
|
|
26
|
+
function escapeXml(text) {
|
|
27
|
+
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>');
|
|
28
|
+
}
|
|
29
|
+
function launchdPlist(at) {
|
|
30
|
+
const strings = (values) => values.map((value) => ` <string>${escapeXml(value)}</string>`).join('\n');
|
|
31
|
+
const variables = Object.entries(at.environment)
|
|
32
|
+
.map(([name, value]) => ` <key>${escapeXml(name)}</key>\n <string>${escapeXml(value)}</string>`)
|
|
33
|
+
.join('\n');
|
|
34
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
35
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
36
|
+
<plist version="1.0">
|
|
37
|
+
<dict>
|
|
38
|
+
<key>Label</key>
|
|
39
|
+
<string>${LAUNCHD_LABEL}</string>
|
|
40
|
+
<key>ProgramArguments</key>
|
|
41
|
+
<array>
|
|
42
|
+
${strings([at.run.node, at.run.script, 'run'])}
|
|
43
|
+
</array>
|
|
44
|
+
<key>EnvironmentVariables</key>
|
|
45
|
+
<dict>
|
|
46
|
+
${variables}
|
|
47
|
+
</dict>
|
|
48
|
+
<key>RunAtLoad</key>
|
|
49
|
+
<true/>
|
|
50
|
+
<key>KeepAlive</key>
|
|
51
|
+
<true/>
|
|
52
|
+
<key>StandardOutPath</key>
|
|
53
|
+
<string>${escapeXml(join(at.paths.logs, 'trierarch.log'))}</string>
|
|
54
|
+
<key>StandardErrorPath</key>
|
|
55
|
+
<string>${escapeXml(join(at.paths.logs, 'trierarch.log'))}</string>
|
|
56
|
+
</dict>
|
|
57
|
+
</plist>
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
function systemdUnit(at) {
|
|
61
|
+
const variables = Object.entries(at.environment)
|
|
62
|
+
.map(([name, value]) => `Environment="${name}=${value}"`)
|
|
63
|
+
.join('\n');
|
|
64
|
+
return `[Unit]
|
|
65
|
+
Description=Aeolus trierarch: keeps the ships on its wanted list crewed on this machine
|
|
66
|
+
|
|
67
|
+
[Service]
|
|
68
|
+
ExecStart="${at.run.node}" "${at.run.script}" run
|
|
69
|
+
${variables}
|
|
70
|
+
Restart=always
|
|
71
|
+
RestartSec=5
|
|
72
|
+
|
|
73
|
+
[Install]
|
|
74
|
+
WantedBy=default.target
|
|
75
|
+
`;
|
|
76
|
+
}
|
|
77
|
+
const SECONDS_PER_MINUTE = 60;
|
|
78
|
+
const SECONDS_PER_HOUR = 3600;
|
|
79
|
+
const SECONDS_PER_DAY = 86_400;
|
|
80
|
+
const MS_PER_SECOND = 1000;
|
|
81
|
+
/** Seconds from `ps -o etime`: `[[dd-]hh:]mm:ss`. */
|
|
82
|
+
function elapsedSeconds(etime) {
|
|
83
|
+
const match = /^(?:(?:(\d+)-)?(\d+):)?(\d+):(\d+)$/.exec(etime.trim());
|
|
84
|
+
if (match === null) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
const [, days = '0', hours = '0', minutes = '0', seconds = '0'] = match;
|
|
88
|
+
return Number(days) * SECONDS_PER_DAY + Number(hours) * SECONDS_PER_HOUR + Number(minutes) * SECONDS_PER_MINUTE + Number(seconds);
|
|
89
|
+
}
|
|
90
|
+
async function exists(path) {
|
|
91
|
+
return (await stat(path).catch(() => undefined)) !== undefined;
|
|
92
|
+
}
|
|
93
|
+
/** How long stop waits for the service to be gone: checks, a second apart. */
|
|
94
|
+
const STOP_CHECKS = 30;
|
|
95
|
+
const STOP_CHECK_MS = 1000;
|
|
96
|
+
const NOT_INSTALLED = 'The service is not installed: run aeolus-trierarch install';
|
|
97
|
+
export function createService(options) {
|
|
98
|
+
const { platform, homeDirectory, paths, run, environment, uid, exec, now } = options;
|
|
99
|
+
const sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
100
|
+
const must = async (command, args) => {
|
|
101
|
+
const result = await exec(command, args);
|
|
102
|
+
if (result.status !== 0) {
|
|
103
|
+
throw new Error(`${command} ${args[0] === '--user' ? `--user ${args[1] ?? ''}` : (args[0] ?? '')} failed: ${result.stderr.trim()}`);
|
|
104
|
+
}
|
|
105
|
+
return result.stdout;
|
|
106
|
+
};
|
|
107
|
+
const since = async (pid) => {
|
|
108
|
+
const elapsed = elapsedSeconds((await exec('ps', ['-o', 'etime=', '-p', String(pid)])).stdout);
|
|
109
|
+
return elapsed === undefined ? undefined : new Date(now().getTime() - elapsed * MS_PER_SECOND).toISOString();
|
|
110
|
+
};
|
|
111
|
+
const running = async (file, pid) => {
|
|
112
|
+
if (pid === undefined) {
|
|
113
|
+
return { file, isInstalled: true, isRunning: false };
|
|
114
|
+
}
|
|
115
|
+
const started = await since(pid);
|
|
116
|
+
return { file, isInstalled: true, isRunning: true, pid, ...(started !== undefined && { since: started }) };
|
|
117
|
+
};
|
|
118
|
+
if (platform === 'darwin') {
|
|
119
|
+
const folder = join(homeDirectory, 'Library', 'LaunchAgents');
|
|
120
|
+
const file = join(folder, `${LAUNCHD_LABEL}.plist`);
|
|
121
|
+
const domain = `gui/${String(uid)}`;
|
|
122
|
+
const target = `${domain}/${LAUNCHD_LABEL}`;
|
|
123
|
+
const write = async () => {
|
|
124
|
+
await mkdir(paths.logs, { recursive: true });
|
|
125
|
+
await mkdir(folder, { recursive: true });
|
|
126
|
+
await writeFile(file, launchdPlist({ run, paths, environment }));
|
|
127
|
+
};
|
|
128
|
+
const isLoaded = async () => (await exec('launchctl', ['print', target])).status === 0;
|
|
129
|
+
const mustBeInstalled = async () => {
|
|
130
|
+
if (!(await exists(file))) {
|
|
131
|
+
throw new Error(NOT_INSTALLED);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const bootstrap = async () => {
|
|
135
|
+
await must('launchctl', ['bootstrap', domain, file]);
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
write,
|
|
139
|
+
install: async () => {
|
|
140
|
+
await write();
|
|
141
|
+
// Unload an earlier copy first: bootstrap refuses a loaded agent.
|
|
142
|
+
await exec('launchctl', ['bootout', target]);
|
|
143
|
+
await bootstrap();
|
|
144
|
+
},
|
|
145
|
+
uninstall: async () => {
|
|
146
|
+
await exec('launchctl', ['bootout', target]);
|
|
147
|
+
await rm(file, { force: true });
|
|
148
|
+
},
|
|
149
|
+
start: async () => {
|
|
150
|
+
await mustBeInstalled();
|
|
151
|
+
await ((await isLoaded()) ? must('launchctl', ['kickstart', target]) : bootstrap());
|
|
152
|
+
},
|
|
153
|
+
// Unloading, not killing: KeepAlive would start a killed one again. It loads again at the next login.
|
|
154
|
+
// bootout returns before the process has exited: stopped means launchd has the agent gone.
|
|
155
|
+
stop: async () => {
|
|
156
|
+
await exec('launchctl', ['bootout', target]);
|
|
157
|
+
for (let check = 0; await isLoaded(); check += 1) {
|
|
158
|
+
if (check >= STOP_CHECKS) {
|
|
159
|
+
throw new Error(`The trierarch still runs ${String((STOP_CHECKS * STOP_CHECK_MS) / MS_PER_SECOND)} s after it was stopped: see aeolus-trierarch status`);
|
|
160
|
+
}
|
|
161
|
+
await sleep(STOP_CHECK_MS);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
restart: async () => {
|
|
165
|
+
await mustBeInstalled();
|
|
166
|
+
await ((await isLoaded()) ? must('launchctl', ['kickstart', '-k', target]) : bootstrap());
|
|
167
|
+
},
|
|
168
|
+
status: async () => {
|
|
169
|
+
if (!(await exists(file))) {
|
|
170
|
+
return { file, isInstalled: false, isRunning: false };
|
|
171
|
+
}
|
|
172
|
+
const printed = await exec('launchctl', ['print', target]);
|
|
173
|
+
const pid = printed.status === 0 ? /^\s*pid = (\d+)$/m.exec(printed.stdout)?.[1] : undefined;
|
|
174
|
+
return running(file, pid === undefined ? undefined : Number(pid));
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
if (platform === 'linux') {
|
|
179
|
+
const folder = join(homeDirectory, '.config', 'systemd', 'user');
|
|
180
|
+
const file = join(folder, SYSTEMD_UNIT);
|
|
181
|
+
const systemctl = async (...args) => {
|
|
182
|
+
await must('systemctl', ['--user', ...args]);
|
|
183
|
+
};
|
|
184
|
+
const write = async () => {
|
|
185
|
+
await mkdir(paths.logs, { recursive: true });
|
|
186
|
+
await mkdir(folder, { recursive: true });
|
|
187
|
+
await writeFile(file, systemdUnit({ run, environment }));
|
|
188
|
+
};
|
|
189
|
+
return {
|
|
190
|
+
write,
|
|
191
|
+
install: async () => {
|
|
192
|
+
await write();
|
|
193
|
+
await systemctl('daemon-reload');
|
|
194
|
+
await systemctl('enable', '--now', SYSTEMD_UNIT);
|
|
195
|
+
},
|
|
196
|
+
uninstall: async () => {
|
|
197
|
+
await exec('systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT]);
|
|
198
|
+
await rm(file, { force: true });
|
|
199
|
+
await exec('systemctl', ['--user', 'daemon-reload']);
|
|
200
|
+
},
|
|
201
|
+
start: async () => {
|
|
202
|
+
await systemctl('start', SYSTEMD_UNIT);
|
|
203
|
+
},
|
|
204
|
+
stop: async () => {
|
|
205
|
+
await systemctl('stop', SYSTEMD_UNIT);
|
|
206
|
+
},
|
|
207
|
+
restart: async () => {
|
|
208
|
+
await systemctl('restart', SYSTEMD_UNIT);
|
|
209
|
+
},
|
|
210
|
+
status: async () => {
|
|
211
|
+
if (!(await exists(file))) {
|
|
212
|
+
return { file, isInstalled: false, isRunning: false };
|
|
213
|
+
}
|
|
214
|
+
const shown = (await exec('systemctl', ['--user', 'show', SYSTEMD_UNIT, '-p', 'ActiveState', '-p', 'MainPID'])).stdout;
|
|
215
|
+
const isActive = /^ActiveState=active$/m.test(shown);
|
|
216
|
+
const pid = Number(/^MainPID=(\d+)$/m.exec(shown)?.[1] ?? '0');
|
|
217
|
+
return running(file, isActive && pid > 0 ? pid : undefined);
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const elsewhere = () => Promise.reject(new Error(`aeolus-trierarch knows launchd (macOS) and systemd (Linux), not ${platform}: run aeolus-trierarch run under your own supervisor`));
|
|
222
|
+
return { write: elsewhere, install: elsewhere, uninstall: elsewhere, start: elsewhere, stop: elsewhere, restart: elsewhere, status: elsewhere };
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/adapters/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { main } from '../cli/main.js';
|
|
7
7
|
const outcome = await main(process.argv.slice(2));
|
|
8
|
-
|
|
8
|
+
if (outcome.output !== '') {
|
|
9
|
+
process.stdout.write(`${outcome.output}\n`);
|
|
10
|
+
}
|
|
9
11
|
process.exitCode = outcome.code;
|
|
10
12
|
//# sourceMappingURL=aeolus-trierarch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aeolus-trierarch.js","sourceRoot":"","sources":["../../src/bin/aeolus-trierarch.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"aeolus-trierarch.js","sourceRoot":"","sources":["../../src/bin/aeolus-trierarch.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;AAC9C,CAAC;AACD,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import type { TrierarchPaths } from '../adapters/paths.js';
|
|
2
|
-
/** `aeolus-trierarch config check`: checks the configuration and
|
|
3
|
-
export
|
|
2
|
+
/** `aeolus-trierarch config check`: checks the configuration and gives the effective flags per harness. */
|
|
3
|
+
export interface ConfigCheckReport {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
/** Per harness, the flags a want with no options launches with, and each option value's flags. */
|
|
6
|
+
readonly harnesses: Readonly<Record<string, {
|
|
7
|
+
flags: readonly string[];
|
|
8
|
+
options: Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>;
|
|
9
|
+
}>>;
|
|
10
|
+
readonly text: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function configCheck(paths: TrierarchPaths): Promise<ConfigCheckReport>;
|
package/dist/cli/config-check.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { loadConfiguration } from '../adapters/files.js';
|
|
2
|
-
import { describeFlags } from '../adapters/flags.js';
|
|
3
|
-
/** `aeolus-trierarch config check`: checks the configuration and prints the effective flags per harness. */
|
|
2
|
+
import { describeFlags, effectiveFlags } from '../adapters/flags.js';
|
|
4
3
|
export async function configCheck(paths) {
|
|
5
4
|
const configuration = await loadConfiguration(paths.config);
|
|
6
|
-
|
|
5
|
+
const harnesses = Object.fromEntries(Object.entries(configuration.harnesses).map(([name, harness]) => [
|
|
6
|
+
name,
|
|
7
|
+
{ flags: effectiveFlags(harness, {}), options: Object.fromEntries(Object.entries(harness.options).map(([option, settings]) => [option, settings.values])) },
|
|
8
|
+
]));
|
|
9
|
+
return {
|
|
10
|
+
path: paths.config,
|
|
11
|
+
harnesses,
|
|
12
|
+
text: [`The configuration at ${paths.config} fits.`, 'Flags per harness (a want picks option values by name):', describeFlags(configuration)].join('\n'),
|
|
13
|
+
};
|
|
7
14
|
}
|
|
8
15
|
//# sourceMappingURL=config-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-check.js","sourceRoot":"","sources":["../../src/cli/config-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"config-check.js","sourceRoot":"","sources":["../../src/cli/config-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAWrE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAqB;IACrD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QAC/D,IAAI;QACJ,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;KAC5J,CAAC,CACH,CAAC;IACF,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,MAAM;QAClB,SAAS;QACT,IAAI,EAAE,CAAC,wBAAwB,KAAK,CAAC,MAAM,QAAQ,EAAE,yDAAyD,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KACzJ,CAAC;AACJ,CAAC"}
|
package/dist/cli/init.d.ts
CHANGED
|
@@ -1,18 +1,43 @@
|
|
|
1
|
+
import { type ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ClaudeCodeSetup } from '../adapters/claude-code-setup.js';
|
|
1
3
|
import type { TrierarchPaths } from '../adapters/paths.js';
|
|
2
4
|
import type { RestFleet } from '../adapters/rest-fleet.js';
|
|
5
|
+
import type { Service } from '../adapters/service.js';
|
|
6
|
+
import type { Prompter } from './prompter.js';
|
|
3
7
|
/**
|
|
4
|
-
* `aeolus-trierarch init
|
|
5
|
-
* trierarch's own ship (commissioned with
|
|
6
|
-
* keeps
|
|
7
|
-
*
|
|
8
|
-
*
|
|
8
|
+
* `aeolus-trierarch init`: the whole setup of a machine, asking for what is
|
|
9
|
+
* missing. It registers the trierarch's own ship (commissioned with
|
|
10
|
+
* fleet:crew) and keeps its crew token, never the secret; writes the
|
|
11
|
+
* configuration from the operator's answers; answers Claude Code's one-time
|
|
12
|
+
* questions ahead, so a session nobody watches never waits on one; and offers
|
|
13
|
+
* to install and start the service. On a machine set up already it says so,
|
|
14
|
+
* never registers again, and offers to change the configuration.
|
|
9
15
|
*/
|
|
16
|
+
export interface InitFlags {
|
|
17
|
+
readonly fleetUrl?: string;
|
|
18
|
+
readonly shipId?: string;
|
|
19
|
+
readonly secret?: string;
|
|
20
|
+
/** Asks nothing: every default is taken, and the fleet URL, ship id and secret must be flags. */
|
|
21
|
+
readonly isYes: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** What init did, for the operator and for `--json`. */
|
|
24
|
+
export interface InitReport {
|
|
25
|
+
readonly isSetUpAlready: boolean;
|
|
26
|
+
readonly fleetUrl: string;
|
|
27
|
+
readonly shipId?: ShipId;
|
|
28
|
+
readonly configuration: 'written' | 'changed' | 'kept';
|
|
29
|
+
/** The folders Claude Code now trusts: the worktree root, then each configured folder. */
|
|
30
|
+
readonly trusted: readonly string[];
|
|
31
|
+
readonly isSkipPermissionsAccepted: boolean;
|
|
32
|
+
readonly service: 'installed' | 'restarted' | 'unchanged' | 'notInstalled';
|
|
33
|
+
readonly said: readonly string[];
|
|
34
|
+
}
|
|
10
35
|
export declare function initTrierarch(input: {
|
|
36
|
+
homeDirectory: string;
|
|
11
37
|
paths: TrierarchPaths;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
shipId: string;
|
|
15
|
-
secret: string;
|
|
16
|
-
};
|
|
38
|
+
flags: InitFlags;
|
|
39
|
+
prompter: Prompter;
|
|
17
40
|
fleetAt: (fleetUrl: string) => Pick<RestFleet, 'registerSelf'>;
|
|
18
|
-
|
|
41
|
+
claudeCode: ClaudeCodeSetup;
|
|
42
|
+
service: Pick<Service, 'install' | 'restart' | 'status'>;
|
|
43
|
+
}): Promise<InitReport>;
|
package/dist/cli/init.js
CHANGED
|
@@ -1,28 +1,222 @@
|
|
|
1
1
|
import { mkdir, stat, writeFile } from 'node:fs/promises';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { idSchema, trierarchNameSchema } from '@aeolus-fleet/common';
|
|
4
|
+
import { configurationJsonSchema, initialConfiguration, loadConfiguration, readCrewFile, TrierarchFileError, writeCrewFile } from '../adapters/files.js';
|
|
5
|
+
const CLAUDE_CODE = 'claude-code';
|
|
6
|
+
const SKIP_PERMISSIONS = '--dangerously-skip-permissions';
|
|
7
|
+
const REMOTE_CONTROL = '--remote-control';
|
|
8
|
+
/** Takes every default, and refuses a question that has none: what `--yes` asks. */
|
|
9
|
+
function defaultsOnly(prompter) {
|
|
10
|
+
const refuse = (question) => Promise.reject(new TrierarchFileError(`init --yes has no answer to: ${question}`));
|
|
11
|
+
return {
|
|
12
|
+
text: (question, options = {}) => (options.default === undefined ? refuse(question) : Promise.resolve(options.default)),
|
|
13
|
+
secret: refuse,
|
|
14
|
+
confirm: (_question, { isDefault }) => Promise.resolve(isDefault),
|
|
15
|
+
say: (message) => {
|
|
16
|
+
prompter.say(message);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Asks until the answer is one `accept` takes, saying why each other one is not. */
|
|
21
|
+
async function askUntil(at) {
|
|
22
|
+
for (;;) {
|
|
23
|
+
const accepted = await at.accept((await at.ask()).trim());
|
|
24
|
+
if ('value' in accepted) {
|
|
25
|
+
return accepted.value;
|
|
26
|
+
}
|
|
27
|
+
at.prompter.say(accepted.why);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function asShipId(answer) {
|
|
31
|
+
const parsed = idSchema('ship').safeParse(answer);
|
|
32
|
+
return parsed.success ? { value: parsed.data } : { why: `${answer} is no ship id: it starts with shp_.` };
|
|
33
|
+
}
|
|
34
|
+
function asFleetUrl(answer) {
|
|
35
|
+
const url = URL.parse(answer);
|
|
36
|
+
return url !== null && (url.protocol === 'https:' || url.protocol === 'http:') ? { value: answer.replace(/\/$/, '') } : { why: `${answer} is no http or https URL.` };
|
|
37
|
+
}
|
|
38
|
+
function asCap(answer) {
|
|
39
|
+
return /^[1-9]\d*$/.test(answer) ? { value: Number(answer) } : { why: 'A cap is a whole number of 1 or more.' };
|
|
40
|
+
}
|
|
41
|
+
async function exists(path) {
|
|
42
|
+
return (await stat(path).catch(() => undefined)) !== undefined;
|
|
43
|
+
}
|
|
44
|
+
/** The fleet URL, ship id and secret, from the flags or asked; with --yes all three must be flags. */
|
|
45
|
+
async function askCrew(flags, prompter) {
|
|
46
|
+
if (flags.isYes) {
|
|
47
|
+
const missing = [
|
|
48
|
+
...(flags.fleetUrl === undefined ? ['--fleet-url'] : []),
|
|
49
|
+
...(flags.shipId === undefined ? ['--ship-id'] : []),
|
|
50
|
+
...(flags.secret === undefined ? ['--secret'] : []),
|
|
51
|
+
];
|
|
52
|
+
if (missing.length > 0) {
|
|
53
|
+
const named = missing.length === 1 ? `${missing.join('')} is` : `${missing.slice(0, -1).join(', ')} and ${missing.at(-1) ?? ''} are`;
|
|
54
|
+
throw new TrierarchFileError(`init --yes needs --fleet-url, --ship-id and --secret: ${named} missing`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const fromFlag = (value, accept) => {
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const accepted = accept(value.trim());
|
|
62
|
+
if ('why' in accepted) {
|
|
63
|
+
throw new TrierarchFileError(accepted.why);
|
|
64
|
+
}
|
|
65
|
+
return accepted.value;
|
|
66
|
+
};
|
|
67
|
+
const fleetUrl = fromFlag(flags.fleetUrl, asFleetUrl) ?? (await askUntil({ prompter, ask: () => prompter.text('Fleet URL (https://...)?'), accept: asFleetUrl }));
|
|
68
|
+
const shipId = fromFlag(flags.shipId, asShipId) ??
|
|
69
|
+
(await askUntil({ prompter, ask: () => prompter.text("The trierarch's ship id (shp_..., from its starting prompt in the console)?"), accept: asShipId }));
|
|
70
|
+
const secret = flags.secret ?? (await prompter.secret('Its secret (aeolus_sk_v1_..., not shown as you type)?'));
|
|
71
|
+
return { fleetUrl, shipId, secret };
|
|
72
|
+
}
|
|
73
|
+
/** The repositories: each one held kept or dropped as answered, then new ones until the operator is done. */
|
|
74
|
+
async function askRepositories(at) {
|
|
75
|
+
const { base, prompter, homeDirectory } = at;
|
|
76
|
+
const repositories = {};
|
|
77
|
+
for (const [name, place] of Object.entries(base.repositories)) {
|
|
78
|
+
if (await prompter.confirm(`Keep the repository ${name} (${place.path})?`, { isDefault: true })) {
|
|
79
|
+
repositories[name] = place;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (;;) {
|
|
83
|
+
const name = await askUntil({
|
|
84
|
+
prompter,
|
|
85
|
+
ask: () => prompter.text('Add a repository it may make worktrees of: its name, or nothing when done?', { default: '' }),
|
|
86
|
+
accept: (answer) => (answer === '' || trierarchNameSchema.safeParse(answer).success ? { value: answer } : { why: `${answer} is no name: lowercase letters, digits and hyphens.` }),
|
|
87
|
+
});
|
|
88
|
+
if (name === '') {
|
|
89
|
+
return repositories;
|
|
90
|
+
}
|
|
91
|
+
const path = await askUntil({
|
|
92
|
+
prompter,
|
|
93
|
+
ask: () => prompter.text(`Where is ${name} checked out?`),
|
|
94
|
+
accept: async (answer) => {
|
|
95
|
+
const expanded = answer.replace(/^~(?=$|\/)/, homeDirectory);
|
|
96
|
+
const absolute = isAbsolute(expanded) ? expanded : resolve(expanded);
|
|
97
|
+
return (await exists(join(absolute, '.git'))) ? { value: absolute } : { why: `${absolute} is no git checkout.` };
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
repositories[name] = { path };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** The configuration from the operator's answers, starting from what it holds: Claude Code's flags, the repositories and the caps. Everything else is kept. */
|
|
104
|
+
async function askConfiguration(at) {
|
|
105
|
+
const { base, prompter } = at;
|
|
106
|
+
const harness = base.harnesses[CLAUDE_CODE] ?? { flags: [], options: {} };
|
|
107
|
+
const isSkipping = await prompter.confirm(`Launch Claude Code with ${SKIP_PERMISSIONS}? Its sessions then run every tool without asking.`, {
|
|
108
|
+
isDefault: harness.flags.includes(SKIP_PERMISSIONS),
|
|
109
|
+
});
|
|
110
|
+
const isRemote = await prompter.confirm(`Launch Claude Code with ${REMOTE_CONTROL}, so you can follow each session from claude.ai?`, {
|
|
111
|
+
isDefault: harness.flags.includes(REMOTE_CONTROL),
|
|
112
|
+
});
|
|
113
|
+
const flags = [
|
|
114
|
+
...harness.flags.filter((flag) => flag !== SKIP_PERMISSIONS && flag !== REMOTE_CONTROL),
|
|
115
|
+
...(isSkipping ? [SKIP_PERMISSIONS] : []),
|
|
116
|
+
...(isRemote ? [REMOTE_CONTROL] : []),
|
|
117
|
+
];
|
|
118
|
+
const repositories = await askRepositories(at);
|
|
119
|
+
const ships = await askUntil({ prompter, ask: () => prompter.text('How many ships may it keep on its list?', { default: String(base.caps.ships) }), accept: asCap });
|
|
120
|
+
const running = await askUntil({ prompter, ask: () => prompter.text('How many sessions may run at once?', { default: String(base.caps.running) }), accept: asCap });
|
|
121
|
+
return { ...base, caps: { ships, running }, repositories, harnesses: { ...base.harnesses, [CLAUDE_CODE]: { ...harness, flags } } };
|
|
122
|
+
}
|
|
11
123
|
export async function initTrierarch(input) {
|
|
12
|
-
const { paths,
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const
|
|
124
|
+
const { homeDirectory, paths, flags, claudeCode, service } = input;
|
|
125
|
+
const prompter = flags.isYes ? defaultsOnly(input.prompter) : input.prompter;
|
|
126
|
+
const said = [];
|
|
127
|
+
// The ship: registered once per machine, never again.
|
|
128
|
+
const crew = await readCrewFile(paths.crewToken).catch(() => undefined);
|
|
129
|
+
let fleetUrl;
|
|
130
|
+
let shipId;
|
|
131
|
+
if (crew === undefined) {
|
|
132
|
+
const asked = await askCrew(flags, prompter);
|
|
133
|
+
const { crewToken } = await input.fleetAt(asked.fleetUrl).registerSelf({ shipId: asked.shipId, secret: asked.secret });
|
|
134
|
+
await writeCrewFile(paths.crewToken, { fleetUrl: asked.fleetUrl, shipId: asked.shipId, crewToken });
|
|
135
|
+
({ fleetUrl, shipId } = asked);
|
|
136
|
+
said.push(`Registered ${shipId} at ${fleetUrl}: its crew token is kept in ${paths.crewToken}, readable by you only. The secret is written nowhere.`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
({ fleetUrl, shipId } = crew);
|
|
140
|
+
const ship = `the trierarch crews ${shipId ?? 'its ship'} at ${fleetUrl}`;
|
|
141
|
+
if (flags.shipId !== undefined || flags.secret !== undefined) {
|
|
142
|
+
throw new TrierarchFileError(`This machine is set up already: ${ship}. init never registers again: to register another ship, remove ${paths.crewToken} first`);
|
|
143
|
+
}
|
|
144
|
+
said.push(`This machine is set up already: ${ship}.`);
|
|
145
|
+
}
|
|
17
146
|
await mkdir(paths.home, { recursive: true, mode: 0o700 });
|
|
18
147
|
await writeFile(paths.configSchema, `${JSON.stringify(configurationJsonSchema(), null, 2)}\n`);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
148
|
+
// The configuration: written from the answers, or changed only when the operator says so.
|
|
149
|
+
let configuration;
|
|
150
|
+
let configured = 'kept';
|
|
151
|
+
if (!(await exists(paths.config))) {
|
|
152
|
+
configuration = { $schema: './config.schema.json', ...(await askConfiguration({ base: initialConfiguration(), prompter, homeDirectory })) };
|
|
153
|
+
configured = 'written';
|
|
22
154
|
}
|
|
23
155
|
else {
|
|
24
|
-
|
|
156
|
+
configuration = await loadConfiguration(paths.config);
|
|
157
|
+
if (await prompter.confirm('Change the configuration?', { isDefault: false })) {
|
|
158
|
+
configuration = await askConfiguration({ base: configuration, prompter, homeDirectory });
|
|
159
|
+
configured = 'changed';
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (configured !== 'kept') {
|
|
163
|
+
await writeFile(paths.config, `${JSON.stringify(configuration, null, 2)}\n`);
|
|
164
|
+
said.push(`Configuration ${configured} at ${paths.config}.`);
|
|
165
|
+
}
|
|
166
|
+
if (Object.keys(configuration.repositories).length === 0 && Object.keys(configuration.folders).length === 0) {
|
|
167
|
+
said.push('It has no repository or folder yet, so it refuses every want: run aeolus-trierarch init again to add one.');
|
|
168
|
+
}
|
|
169
|
+
// Claude Code's one-time questions, answered ahead.
|
|
170
|
+
const root = configuration.worktreeRoot ?? paths.worktrees;
|
|
171
|
+
await mkdir(root, { recursive: true });
|
|
172
|
+
const folders = Object.values(configuration.folders).map((folder) => folder.path);
|
|
173
|
+
// Every run, so a folder added to the configuration since is trusted too.
|
|
174
|
+
for (const folder of [root, ...folders]) {
|
|
175
|
+
await claudeCode.trust(folder);
|
|
176
|
+
}
|
|
177
|
+
said.push(`Claude Code trusts ${root}, so a session in any worktree starts with no trust question.`);
|
|
178
|
+
if (folders.length > 0) {
|
|
179
|
+
said.push(`Claude Code trusts each configured folder too: ${folders.join(', ')}.`);
|
|
180
|
+
}
|
|
181
|
+
let isSkipPermissionsAccepted = await claudeCode.isSkipPermissionsAccepted();
|
|
182
|
+
if (configuration.harnesses[CLAUDE_CODE]?.flags.includes(SKIP_PERMISSIONS) === true && !isSkipPermissionsAccepted) {
|
|
183
|
+
if (await prompter.confirm('Claude Code asks once per user to accept bypass permissions mode. Accept it now (skipDangerousModePermissionPrompt in ~/.claude/settings.json)?', { isDefault: true })) {
|
|
184
|
+
await claudeCode.acceptSkipPermissions();
|
|
185
|
+
isSkipPermissionsAccepted = true;
|
|
186
|
+
said.push('Claude Code accepts bypass permissions mode for you.');
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
said.push(`Claude Code still asks to accept bypass permissions mode, and a session started with ${SKIP_PERMISSIONS} waits on that question until you answer it.`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// The service: offered when it is not installed, restarted when it should read a new configuration.
|
|
193
|
+
let serviced = 'unchanged';
|
|
194
|
+
const status = await service.status();
|
|
195
|
+
if (!status.isInstalled) {
|
|
196
|
+
if (await prompter.confirm('Install the service and start the trierarch now? It then starts again at every login.', { isDefault: true })) {
|
|
197
|
+
await service.install();
|
|
198
|
+
serviced = 'installed';
|
|
199
|
+
said.push(`The trierarch runs, and starts again at every login (${status.file}). See it with aeolus-trierarch status.`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
serviced = 'notInstalled';
|
|
203
|
+
said.push('Install and start it later with aeolus-trierarch install.');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (configured !== 'kept' && (await prompter.confirm('Restart the trierarch so it reads the new configuration?', { isDefault: true }))) {
|
|
207
|
+
await service.restart();
|
|
208
|
+
serviced = 'restarted';
|
|
209
|
+
said.push('The trierarch restarted with the new configuration.');
|
|
25
210
|
}
|
|
26
|
-
return
|
|
211
|
+
return {
|
|
212
|
+
isSetUpAlready: crew !== undefined,
|
|
213
|
+
fleetUrl,
|
|
214
|
+
...(shipId !== undefined && { shipId }),
|
|
215
|
+
configuration: configured,
|
|
216
|
+
trusted: [root, ...folders],
|
|
217
|
+
isSkipPermissionsAccepted,
|
|
218
|
+
service: serviced,
|
|
219
|
+
said,
|
|
220
|
+
};
|
|
27
221
|
}
|
|
28
222
|
//# sourceMappingURL=init.js.map
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAIpG;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAInC;IACC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,MAAM,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,CAAC,sBAAsB,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/F,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI,CAAC,4BAA4B,KAAK,CAAC,MAAM,kGAAkG,CAAC,CAAC;IACxJ,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,IAAI,CAAC,kCAAkC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|