@aeolus-fleet/trierarch 0.17.0 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +33 -15
  2. package/dist/adapters/claude-code-setup.d.ts +18 -0
  3. package/dist/adapters/claude-code-setup.js +51 -0
  4. package/dist/adapters/claude-code-setup.js.map +1 -0
  5. package/dist/adapters/files.d.ts +6 -3
  6. package/dist/adapters/files.js +4 -3
  7. package/dist/adapters/files.js.map +1 -1
  8. package/dist/adapters/rest-fleet.d.ts +5 -0
  9. package/dist/adapters/rest-fleet.js +10 -2
  10. package/dist/adapters/rest-fleet.js.map +1 -1
  11. package/dist/adapters/service.d.ts +51 -0
  12. package/dist/adapters/service.js +213 -0
  13. package/dist/adapters/service.js.map +1 -0
  14. package/dist/bin/aeolus-trierarch.js +3 -1
  15. package/dist/bin/aeolus-trierarch.js.map +1 -1
  16. package/dist/cli/config-check.d.ts +11 -2
  17. package/dist/cli/config-check.js +10 -3
  18. package/dist/cli/config-check.js.map +1 -1
  19. package/dist/cli/init.d.ts +36 -11
  20. package/dist/cli/init.js +213 -19
  21. package/dist/cli/init.js.map +1 -1
  22. package/dist/cli/list.d.ts +16 -0
  23. package/dist/cli/list.js +32 -0
  24. package/dist/cli/list.js.map +1 -0
  25. package/dist/cli/logs.d.ts +16 -0
  26. package/dist/cli/logs.js +51 -0
  27. package/dist/cli/logs.js.map +1 -0
  28. package/dist/cli/main.js +199 -52
  29. package/dist/cli/main.js.map +1 -1
  30. package/dist/cli/prompter.d.ts +25 -0
  31. package/dist/cli/prompter.js +95 -0
  32. package/dist/cli/prompter.js.map +1 -0
  33. package/dist/cli/status.d.ts +44 -0
  34. package/dist/cli/status.js +65 -0
  35. package/dist/cli/status.js.map +1 -0
  36. package/dist/cli/uninstall.d.ts +19 -0
  37. package/dist/cli/uninstall.js +16 -0
  38. package/dist/cli/uninstall.js.map +1 -0
  39. package/package.json +3 -3
  40. package/dist/cli/install.d.ts +0 -34
  41. package/dist/cli/install.js +0 -109
  42. package/dist/cli/install.js.map +0 -1
package/README.md CHANGED
@@ -10,28 +10,43 @@ On the machine that will run the sessions (macOS or Linux), with Node 26, `git`,
10
10
  npm install --global @aeolus-fleet/trierarch
11
11
  ```
12
12
 
13
- 1. In the console, commission the trierarch's own ship: type `trierarch`, with **Crew ships** (`fleet:crew`). Copy its ship id and secret from the starting prompt.
14
- 2. Register it and write a configuration:
13
+ That gives the command `aeolus-trierarch`.
14
+
15
+ 1. In the console, commission the trierarch's own ship: type `trierarch`, with **Crew ships** (`fleet:crew`). Keep its starting prompt open: it shows the ship id and the secret.
16
+ 2. Set up the machine:
15
17
 
16
18
  ```sh
17
- aeolus-trierarch init https://fleet.example.com shp_... aeolus_sk_v1_...
19
+ aeolus-trierarch init
18
20
  ```
19
21
 
20
- This keeps the trierarch's own crew token in `~/.aeolus/trierarch/crew-token`, readable by you only, and never writes the secret. It writes `~/.aeolus/trierarch/config.json` when there is none yet, with `config.schema.json` beside it so an editor checks it.
21
- 3. Edit the configuration (below), then check it:
22
+ It asks for what it needs, in a short flow:
23
+ - the fleet URL, the ship id and the secret. The secret is not shown as you type it, so it stays out of your shell history and any transcript. It registers the ship, keeps its crew token in `~/.aeolus/trierarch/crew-token` (readable by you only) and writes the secret nowhere;
24
+ - whether Claude Code launches with `--dangerously-skip-permissions` and with `--remote-control` (both no unless you say yes);
25
+ - the repositories it may make worktrees of, by name and path;
26
+ - the caps: how many ships on its list, how many sessions at once.
22
27
 
23
- ```sh
24
- aeolus-trierarch config check
25
- ```
28
+ It writes `~/.aeolus/trierarch/config.json`, with `config.schema.json` beside it so an editor checks it. It answers Claude Code's one-time questions ahead, so a session nobody watches never waits on one: it trusts the worktree root in `~/.claude.json`, which covers every worktree under it, and each configured folder (on every run, so a folder added since is trusted too), and, when the sessions skip permissions, offers to accept bypass permissions mode in `~/.claude/settings.json`. Then it offers to install and start the service: a launchd agent on macOS (`~/Library/LaunchAgents/dev.aeolus-fleet.trierarch.plist`), a systemd user unit on Linux (`aeolus-trierarch.service`), started at login and again whenever it stops.
26
29
 
27
- It prints the flags each harness launches with, and each option value's flags.
28
- 4. Keep it running:
30
+ Without a terminal, pass everything as flags and take every default with `--yes`: `aeolus-trierarch init --fleet-url https://fleet.example.com --ship-id shp_... --secret aeolus_sk_v1_... --yes`. Prefer the prompt: a secret in a flag lands in your shell history.
29
31
 
30
- ```sh
31
- aeolus-trierarch install
32
- ```
32
+ Run `aeolus-trierarch init` again on a machine set up already to change the configuration. It says so and never registers again; to register another ship, remove `~/.aeolus/trierarch/crew-token` first.
33
33
 
34
- On macOS this loads a launchd agent (`~/Library/LaunchAgents/dev.aeolus-fleet.trierarch.plist`) that starts the trierarch at login and again whenever it stops. On Linux it enables a systemd user unit (`aeolus-trierarch.service`). With `--no-load` it only writes the file. Logs go to `~/.aeolus/trierarch/logs/`. To run it in the foreground instead: `aeolus-trierarch run`.
34
+ ## Use
35
+
36
+ | Command | What it does |
37
+ | --- | --- |
38
+ | `aeolus-trierarch status` | The service (running, pid, since), the fleet and the trierarch's own lease, the caps in use, the entries by state, kept worktrees and orphans |
39
+ | `aeolus-trierarch list` | The wanted entries: ship, state, harness, workspace, since, restarts |
40
+ | `aeolus-trierarch logs [--lines <n>] [--follow]` | The last lines of `~/.aeolus/trierarch/logs/trierarch.log`, and with `--follow` each new one |
41
+ | `aeolus-trierarch config check` | Checks the configuration and gives the flags each harness launches with, and each option value's flags |
42
+ | `aeolus-trierarch start`, `stop`, `restart` | The service. A stopped one starts again at the next login; restart it after you change the configuration |
43
+ | `aeolus-trierarch install [--no-load]` | Installs the service; with `--no-load` it only writes its file |
44
+ | `aeolus-trierarch uninstall` | Removes the service and stops every session. It deletes nothing else: it lists the worktrees it leaves, and keeps its own files under `~/.aeolus/trierarch/` |
45
+ | `aeolus-trierarch run` | What the service runs: keeps the wanted ships crewed until stopped |
46
+
47
+ Every command takes `--json`, so a ship can read what it says, and `--config <path>`. `status`, `list` and `logs` read what is on the machine and send no message; `status` asks the fleet `whoami` once, for the lease.
48
+
49
+ To stop the trierarch: `aeolus-trierarch stop`, or `aeolus-trierarch uninstall` to keep it from starting at login. Each session runs in tmux on the trierarch's own server: attach to one with `tmux -L aeolus-trierarch attach -t trierarch-<ship id>`.
35
50
 
36
51
  ## Configure
37
52
 
@@ -59,6 +74,8 @@ npm install --global @aeolus-fleet/trierarch
59
74
  - **folders**: by name, used as they are, one ship per folder, never removed.
60
75
  - **harnesses**: the flags every launch gets, and named options. A want picks option values by name; it never adds a flag, and messages never carry paths or flags. There is no policy on which flags: put `--dangerously-skip-permissions` in `flags` if you want it. The trierarch never adds a flag by itself.
61
76
 
77
+ `aeolus-trierarch init` writes caps, repositories and Claude Code's flags; edit the file for folders, options and `worktreeRoot`, then `aeolus-trierarch config check` and `aeolus-trierarch restart`.
78
+
62
79
  The trierarch finds the aeolus plugin in Claude Code's plugin cache (the newest version). Set `AEOLUS_PLUGIN_ROOT` and `AEOLUS_PLUGIN_DATA` to point it elsewhere. `aeolus-trierarch install` carries these, `AEOLUS_TRIERARCH_CONFIG` and `PATH` into the service as they are set where it runs.
63
80
 
64
81
  ## What is here
@@ -74,4 +91,5 @@ The trierarch finds the aeolus plugin in Claude Code's plugin cache (the newest
74
91
  - git worktrees and folders;
75
92
  - Claude Code, through the aeolus plugin's `aeolus-identity.sh`;
76
93
  - the JSON state store.
77
- - **The command** (`src/cli`): `init`, `config check`, `run`, `install`.
94
+ - **The command** (`src/cli`): `init`, `status`, `list`, `logs`, `config check`, `start`, `stop`, `restart`, `install`, `uninstall`, `run`.
95
+ - **Adapters for the setup**: the service (launchd or systemd), and Claude Code's own files for its one-time questions.
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Claude Code's one-time questions, answered ahead so a session nobody
3
+ * watches never waits on one. Claude Code asks whether to trust a folder on
4
+ * its first start there, even with `--dangerously-skip-permissions`; trusting
5
+ * a folder covers every folder under it, so trusting the worktree root covers
6
+ * every worktree. It asks once per user whether to accept bypass permissions
7
+ * mode. Both answers live in Claude Code's own files, which this changes key
8
+ * by key, keeping everything else and the file's mode.
9
+ */
10
+ export interface ClaudeCodeSetup {
11
+ trust(folder: string): Promise<void>;
12
+ isTrusted(folder: string): Promise<boolean>;
13
+ acceptSkipPermissions(): Promise<void>;
14
+ isSkipPermissionsAccepted(): Promise<boolean>;
15
+ }
16
+ export declare function createClaudeCodeSetup(at: {
17
+ homeDirectory: string;
18
+ }): ClaudeCodeSetup;
@@ -0,0 +1,51 @@
1
+ import { mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { TrierarchFileError } from './files.js';
5
+ const jsonObjectSchema = z.record(z.string(), z.unknown());
6
+ /** A file only its user reads, as Claude Code keeps ~/.claude.json. */
7
+ const PRIVATE_MODE = 0o600;
8
+ async function readJsonObject(path) {
9
+ let text;
10
+ try {
11
+ text = await readFile(path, 'utf8');
12
+ }
13
+ catch {
14
+ return {};
15
+ }
16
+ try {
17
+ return jsonObjectSchema.parse(JSON.parse(text));
18
+ }
19
+ catch {
20
+ throw new TrierarchFileError(`${path} is no JSON object: fix it by hand, then run this again`);
21
+ }
22
+ }
23
+ async function writeJsonObject(path, value) {
24
+ const mode = (await stat(path).catch(() => undefined))?.mode ?? PRIVATE_MODE;
25
+ await mkdir(dirname(path), { recursive: true });
26
+ const temporary = `${path}.aeolus-trierarch.tmp`;
27
+ await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { mode: mode & 0o777 });
28
+ await rename(temporary, path);
29
+ }
30
+ export function createClaudeCodeSetup(at) {
31
+ const state = join(at.homeDirectory, '.claude.json');
32
+ const settings = join(at.homeDirectory, '.claude', 'settings.json');
33
+ const projectsOf = (claude) => jsonObjectSchema.safeParse(claude.projects).data ?? {};
34
+ return {
35
+ trust: async (folder) => {
36
+ const claude = await readJsonObject(state);
37
+ const projects = projectsOf(claude);
38
+ const project = jsonObjectSchema.safeParse(projects[folder]).data ?? {};
39
+ await writeJsonObject(state, { ...claude, projects: { ...projects, [folder]: { ...project, hasTrustDialogAccepted: true } } });
40
+ },
41
+ isTrusted: async (folder) => {
42
+ const project = jsonObjectSchema.safeParse(projectsOf(await readJsonObject(state))[folder]).data;
43
+ return project?.hasTrustDialogAccepted === true;
44
+ },
45
+ acceptSkipPermissions: async () => {
46
+ await writeJsonObject(settings, { ...(await readJsonObject(settings)), skipDangerousModePermissionPrompt: true });
47
+ },
48
+ isSkipPermissionsAccepted: async () => (await readJsonObject(settings)).skipDangerousModePermissionPrompt === true,
49
+ };
50
+ }
51
+ //# sourceMappingURL=claude-code-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-setup.js","sourceRoot":"","sources":["../../src/adapters/claude-code-setup.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type TrierarchConfiguration } from '@aeolus-fleet/common';
1
+ import { type ShipId, type TrierarchConfiguration } from '@aeolus-fleet/common';
2
2
  /**
3
3
  * The trierarch's own files: its configuration, written by the operator, and
4
4
  * its crew file, written by `init`: the fleet's URL and the trierarch's own
@@ -14,10 +14,13 @@ export declare function initialConfiguration(): TrierarchConfiguration & {
14
14
  /** The configuration's JSON Schema, written beside it so an editor checks it. */
15
15
  export declare function configurationJsonSchema(): Record<string, unknown>;
16
16
  export declare function loadConfiguration(path: string): Promise<TrierarchConfiguration>;
17
- /** The fleet and the trierarch's own crew token. */
17
+ /** The fleet, the trierarch's own ship and its crew token. A crew file written before the ship id was kept lacks it. */
18
18
  export interface CrewFile {
19
19
  readonly fleetUrl: string;
20
+ readonly shipId?: ShipId;
20
21
  readonly crewToken: string;
21
22
  }
22
- export declare function writeCrewFile(path: string, crew: CrewFile): Promise<void>;
23
+ export declare function writeCrewFile(path: string, crew: CrewFile & {
24
+ shipId: ShipId;
25
+ }): Promise<void>;
23
26
  export declare function readCrewFile(path: string): Promise<CrewFile>;
@@ -1,6 +1,6 @@
1
1
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
2
2
  import { dirname } from 'node:path';
3
- import { trierarchConfigurationSchema } from '@aeolus-fleet/common';
3
+ import { idSchema, trierarchConfigurationSchema } from '@aeolus-fleet/common';
4
4
  import { z } from 'zod';
5
5
  /**
6
6
  * The trierarch's own files: its configuration, written by the operator, and
@@ -47,7 +47,7 @@ export async function loadConfiguration(path) {
47
47
  }
48
48
  export async function writeCrewFile(path, crew) {
49
49
  await mkdir(dirname(path), { recursive: true, mode: 0o700 });
50
- await writeFile(path, `fleetUrl=${crew.fleetUrl}\ncrewToken=${crew.crewToken}\n`, { mode: 0o600 });
50
+ await writeFile(path, `fleetUrl=${crew.fleetUrl}\nshipId=${crew.shipId}\ncrewToken=${crew.crewToken}\n`, { mode: 0o600 });
51
51
  await chmod(path, 0o600);
52
52
  }
53
53
  export async function readCrewFile(path) {
@@ -64,6 +64,7 @@ export async function readCrewFile(path) {
64
64
  if (fleetUrl === undefined || crewToken === undefined) {
65
65
  throw new TrierarchFileError(`The crew file at ${path} lacks its fleetUrl or crewToken line: run aeolus-trierarch init again`);
66
66
  }
67
- return { fleetUrl, crewToken };
67
+ const shipId = idSchema('ship').safeParse(field('shipId'));
68
+ return { fleetUrl, ...(shipId.success && { shipId: shipId.data }), crewToken };
68
69
  }
69
70
  //# sourceMappingURL=files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,11 @@ export interface RestFleet extends FleetPort {
27
27
  }): Promise<{
28
28
  crewToken: string;
29
29
  }>;
30
+ /** The trierarch's own ship, as its crew token says: it answers while the lease holds. */
31
+ whoami(): Promise<{
32
+ shipId: ShipId;
33
+ name: string;
34
+ }>;
30
35
  }
31
36
  export declare function createRestFleet(options: {
32
37
  fleetUrl: string;
@@ -26,12 +26,19 @@ export class FleetRefusal extends Error {
26
26
  export function createRestFleet(options) {
27
27
  const fleetUrl = options.fleetUrl.replace(/\/$/, '');
28
28
  async function call(request) {
29
- const headers = { 'content-type': 'application/json' };
29
+ const headers = {};
30
30
  const crewToken = request.crewToken ?? options.crewToken;
31
31
  if (crewToken !== '') {
32
32
  headers.authorization = `Bearer ${crewToken}`;
33
33
  }
34
- const response = await fetch(`${fleetUrl}/api/v1${request.path}`, { method: 'POST', headers, body: JSON.stringify(request.body) });
34
+ // A call with no body is a GET, as whoami is.
35
+ let response;
36
+ try {
37
+ response = await fetch(`${fleetUrl}/api/v1${request.path}`, request.body === undefined ? { method: 'GET', headers } : { method: 'POST', headers: { ...headers, 'content-type': 'application/json' }, body: JSON.stringify(request.body) });
38
+ }
39
+ catch (error) {
40
+ throw new Error(`The fleet at ${fleetUrl} cannot be reached: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
41
+ }
35
42
  const body = await response.json();
36
43
  if (!response.ok) {
37
44
  const refusal = refusalSchema.safeParse(body);
@@ -64,6 +71,7 @@ export function createRestFleet(options) {
64
71
  getStartingPrompt: async (shipId) => call({ path: '/fleet/getStartingPrompt', body: { shipId }, answers: z.object({ secret: z.string() }) }),
65
72
  register: async (crew) => register(crew, SESSION_HARNESS),
66
73
  registerSelf: async (crew) => register(crew, TRIERARCH_SELF.harness),
74
+ whoami: async () => call({ path: '/ship/whoami', answers: z.object({ shipId: idSchema('ship'), name: z.string() }) }),
67
75
  release: async (shipId) => {
68
76
  await call({ path: '/fleet/release', body: { shipId }, answers: z.unknown() });
69
77
  },
@@ -1 +1 @@
1
- {"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { TrierarchPaths } from './paths.js';
2
+ import type { CommandResult } from './run-command.js';
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 declare const LAUNCHD_LABEL = "dev.aeolus-fleet.trierarch";
11
+ export declare const SYSTEMD_UNIT = "aeolus-trierarch.service";
12
+ /** What runs the trierarch: this Node and this command's own file. */
13
+ export interface RunCommand {
14
+ readonly node: string;
15
+ readonly script: string;
16
+ }
17
+ /** How the service stands: its file, whether it is installed and running, and the running process. */
18
+ export interface ServiceStatus {
19
+ readonly file: string;
20
+ readonly isInstalled: boolean;
21
+ readonly isRunning: boolean;
22
+ readonly pid?: number;
23
+ /** When the running process started, ISO 8601. */
24
+ readonly since?: string;
25
+ }
26
+ export interface Service {
27
+ /** Writes the service's file without loading it. */
28
+ write(): Promise<void>;
29
+ /** Writes the service's file, then loads and starts it. */
30
+ install(): Promise<void>;
31
+ /** Stops the service and removes its file. */
32
+ uninstall(): Promise<void>;
33
+ start(): Promise<void>;
34
+ stop(): Promise<void>;
35
+ restart(): Promise<void>;
36
+ status(): Promise<ServiceStatus>;
37
+ }
38
+ /** Runs a program and answers how it ended. */
39
+ export type Exec = (command: string, args: readonly string[]) => Promise<CommandResult>;
40
+ /** The service's environment: PATH, so it finds tmux, git and claude, and the trierarch's own variables. */
41
+ export declare function serviceEnvironment(env: Readonly<Record<string, string | undefined>>): Record<string, string>;
42
+ export declare function createService(options: {
43
+ platform: string;
44
+ homeDirectory: string;
45
+ paths: TrierarchPaths;
46
+ run: RunCommand;
47
+ environment: Readonly<Record<string, string>>;
48
+ uid: number;
49
+ exec: Exec;
50
+ now: () => Date;
51
+ }): Service;
@@ -0,0 +1,213 @@
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('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
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
+ const NOT_INSTALLED = 'The service is not installed: run aeolus-trierarch install';
94
+ export function createService(options) {
95
+ const { platform, homeDirectory, paths, run, environment, uid, exec, now } = options;
96
+ const must = async (command, args) => {
97
+ const result = await exec(command, args);
98
+ if (result.status !== 0) {
99
+ throw new Error(`${command} ${args[0] === '--user' ? `--user ${args[1] ?? ''}` : (args[0] ?? '')} failed: ${result.stderr.trim()}`);
100
+ }
101
+ return result.stdout;
102
+ };
103
+ const since = async (pid) => {
104
+ const elapsed = elapsedSeconds((await exec('ps', ['-o', 'etime=', '-p', String(pid)])).stdout);
105
+ return elapsed === undefined ? undefined : new Date(now().getTime() - elapsed * MS_PER_SECOND).toISOString();
106
+ };
107
+ const running = async (file, pid) => {
108
+ if (pid === undefined) {
109
+ return { file, isInstalled: true, isRunning: false };
110
+ }
111
+ const started = await since(pid);
112
+ return { file, isInstalled: true, isRunning: true, pid, ...(started !== undefined && { since: started }) };
113
+ };
114
+ if (platform === 'darwin') {
115
+ const folder = join(homeDirectory, 'Library', 'LaunchAgents');
116
+ const file = join(folder, `${LAUNCHD_LABEL}.plist`);
117
+ const domain = `gui/${String(uid)}`;
118
+ const target = `${domain}/${LAUNCHD_LABEL}`;
119
+ const write = async () => {
120
+ await mkdir(paths.logs, { recursive: true });
121
+ await mkdir(folder, { recursive: true });
122
+ await writeFile(file, launchdPlist({ run, paths, environment }));
123
+ };
124
+ const isLoaded = async () => (await exec('launchctl', ['print', target])).status === 0;
125
+ const mustBeInstalled = async () => {
126
+ if (!(await exists(file))) {
127
+ throw new Error(NOT_INSTALLED);
128
+ }
129
+ };
130
+ const bootstrap = async () => {
131
+ await must('launchctl', ['bootstrap', domain, file]);
132
+ };
133
+ return {
134
+ write,
135
+ install: async () => {
136
+ await write();
137
+ // Unload an earlier copy first: bootstrap refuses a loaded agent.
138
+ await exec('launchctl', ['bootout', target]);
139
+ await bootstrap();
140
+ },
141
+ uninstall: async () => {
142
+ await exec('launchctl', ['bootout', target]);
143
+ await rm(file, { force: true });
144
+ },
145
+ start: async () => {
146
+ await mustBeInstalled();
147
+ await ((await isLoaded()) ? must('launchctl', ['kickstart', target]) : bootstrap());
148
+ },
149
+ // Unloading, not killing: KeepAlive would start a killed one again. It loads again at the next login.
150
+ stop: async () => {
151
+ await exec('launchctl', ['bootout', target]);
152
+ },
153
+ restart: async () => {
154
+ await mustBeInstalled();
155
+ await ((await isLoaded()) ? must('launchctl', ['kickstart', '-k', target]) : bootstrap());
156
+ },
157
+ status: async () => {
158
+ if (!(await exists(file))) {
159
+ return { file, isInstalled: false, isRunning: false };
160
+ }
161
+ const printed = await exec('launchctl', ['print', target]);
162
+ const pid = printed.status === 0 ? /^\s*pid = (\d+)$/m.exec(printed.stdout)?.[1] : undefined;
163
+ return running(file, pid === undefined ? undefined : Number(pid));
164
+ },
165
+ };
166
+ }
167
+ if (platform === 'linux') {
168
+ const folder = join(homeDirectory, '.config', 'systemd', 'user');
169
+ const file = join(folder, SYSTEMD_UNIT);
170
+ const systemctl = async (...args) => {
171
+ await must('systemctl', ['--user', ...args]);
172
+ };
173
+ const write = async () => {
174
+ await mkdir(paths.logs, { recursive: true });
175
+ await mkdir(folder, { recursive: true });
176
+ await writeFile(file, systemdUnit({ run, environment }));
177
+ };
178
+ return {
179
+ write,
180
+ install: async () => {
181
+ await write();
182
+ await systemctl('daemon-reload');
183
+ await systemctl('enable', '--now', SYSTEMD_UNIT);
184
+ },
185
+ uninstall: async () => {
186
+ await exec('systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT]);
187
+ await rm(file, { force: true });
188
+ await exec('systemctl', ['--user', 'daemon-reload']);
189
+ },
190
+ start: async () => {
191
+ await systemctl('start', SYSTEMD_UNIT);
192
+ },
193
+ stop: async () => {
194
+ await systemctl('stop', SYSTEMD_UNIT);
195
+ },
196
+ restart: async () => {
197
+ await systemctl('restart', SYSTEMD_UNIT);
198
+ },
199
+ status: async () => {
200
+ if (!(await exists(file))) {
201
+ return { file, isInstalled: false, isRunning: false };
202
+ }
203
+ const shown = (await exec('systemctl', ['--user', 'show', SYSTEMD_UNIT, '-p', 'ActiveState', '-p', 'MainPID'])).stdout;
204
+ const isActive = /^ActiveState=active$/m.test(shown);
205
+ const pid = Number(/^MainPID=(\d+)$/m.exec(shown)?.[1] ?? '0');
206
+ return running(file, isActive && pid > 0 ? pid : undefined);
207
+ },
208
+ };
209
+ }
210
+ const elsewhere = () => Promise.reject(new Error(`aeolus-trierarch knows launchd (macOS) and systemd (Linux), not ${platform}: run aeolus-trierarch run under your own supervisor`));
211
+ return { write: elsewhere, install: elsewhere, uninstall: elsewhere, start: elsewhere, stop: elsewhere, restart: elsewhere, status: elsewhere };
212
+ }
213
+ //# 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
- process.stdout.write(`${outcome.output}\n`);
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;AAC5C,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,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 prints the effective flags per harness. */
3
- export declare function configCheck(paths: TrierarchPaths): Promise<string>;
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>;
@@ -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
- return [`The configuration at ${paths.config} fits.`, 'Flags per harness (a want picks option values by name):', describeFlags(configuration)].join('\n');
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