@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
package/README.md
CHANGED
|
@@ -10,28 +10,44 @@ 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
|
-
|
|
14
|
-
|
|
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
|
|
19
|
+
aeolus-trierarch init
|
|
18
20
|
```
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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. `stop` returns once the trierarch has exited; a stopped one starts again at the next login. Restart it after you change the configuration |
|
|
43
|
+
| `aeolus-trierarch upgrade [version]` | Installs the given version, or the latest on npm, globally and pinned to it. Then it stops the old process and starts the new one, and shows `status`. Sessions keep running: the new process takes them over. If the install fails, the old version keeps running. It never upgrades on its own |
|
|
44
|
+
| `aeolus-trierarch install [--no-load]` | Installs the service; with `--no-load` it only writes its file |
|
|
45
|
+
| `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/` |
|
|
46
|
+
| `aeolus-trierarch run` | What the service runs: keeps the wanted ships crewed until stopped |
|
|
47
|
+
|
|
48
|
+
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.
|
|
49
|
+
|
|
50
|
+
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
51
|
|
|
36
52
|
## Configure
|
|
37
53
|
|
|
@@ -55,9 +71,11 @@ npm install --global @aeolus-fleet/trierarch
|
|
|
55
71
|
```
|
|
56
72
|
|
|
57
73
|
- **caps**: how many ships it keeps on its list, and how many sessions run at once.
|
|
58
|
-
- **repositories**: by name. A want for a worktree of one gets a git worktree under `~/.aeolus/trierarch/worktrees/<repository>/<ship>`, detached at the want's ref or the repository's HEAD. `worktreeRoot` moves that root.
|
|
74
|
+
- **repositories**: by name. A want for a worktree of one gets a git worktree under `~/.aeolus/trierarch/worktrees/<repository>/<ship>`, detached at the want's ref or the repository's HEAD. It fetches the repository first, and a ref `origin` has a branch for checks out that remote branch (`origin/<ref>`), so a ship starts from current code; when the fetch fails it uses what the repository has. `worktreeRoot` moves that root.
|
|
59
75
|
- **folders**: by name, used as they are, one ship per folder, never removed.
|
|
60
|
-
- **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.
|
|
76
|
+
- **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. With `--remote-control` and no name after it, each session is named `[<repository or folder>] <ship>`, such as `[aeolus-fleet] trial-1`, so it is easy to find among your remote-control sessions.
|
|
77
|
+
|
|
78
|
+
`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`.
|
|
61
79
|
|
|
62
80
|
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
81
|
|
|
@@ -74,4 +92,5 @@ The trierarch finds the aeolus plugin in Claude Code's plugin cache (the newest
|
|
|
74
92
|
- git worktrees and folders;
|
|
75
93
|
- Claude Code, through the aeolus plugin's `aeolus-identity.sh`;
|
|
76
94
|
- the JSON state store.
|
|
77
|
-
- **The command** (`src/cli`): `init`, `config check`, `
|
|
95
|
+
- **The command** (`src/cli`): `init`, `status`, `list`, `logs`, `config check`, `start`, `stop`, `restart`, `install`, `uninstall`, `run`.
|
|
96
|
+
- **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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"}
|
|
@@ -2,6 +2,21 @@ import { readFile } from 'node:fs/promises';
|
|
|
2
2
|
import { effectiveFlags } from './flags.js';
|
|
3
3
|
import { runCommand } from './run-command.js';
|
|
4
4
|
export const WAKE_PROMPT = '/aeolus:wake';
|
|
5
|
+
const REMOTE_CONTROL = '--remote-control';
|
|
6
|
+
/**
|
|
7
|
+
* The flags, with a name for the remote-control session where the operator
|
|
8
|
+
* gave `--remote-control` without one: `[<repository or folder>] <ship>`, so
|
|
9
|
+
* the session is easy to find among the operator's remote-control sessions.
|
|
10
|
+
* A name the operator gave is kept; without the flag nothing is added.
|
|
11
|
+
*/
|
|
12
|
+
function namedRemoteControl(flags, name) {
|
|
13
|
+
const at = flags.indexOf(REMOTE_CONTROL);
|
|
14
|
+
const next = flags[at + 1];
|
|
15
|
+
if (at === -1 || (next !== undefined && !next.startsWith('-'))) {
|
|
16
|
+
return [...flags];
|
|
17
|
+
}
|
|
18
|
+
return [...flags.slice(0, at + 1), name, ...flags.slice(at + 1)];
|
|
19
|
+
}
|
|
5
20
|
export function createClaudeCodeHarness(options) {
|
|
6
21
|
const { configuration, plugin, sessions } = options;
|
|
7
22
|
const identity = async (folder, args) => runCommand('bash', { args: [`${plugin.root}/scripts/aeolus-identity.sh`, ...args], env: { AEOLUS_FOLDER: folder, AEOLUS_DATA: plugin.data } });
|
|
@@ -29,14 +44,15 @@ export function createClaudeCodeHarness(options) {
|
|
|
29
44
|
removeIdentity: async (folder) => {
|
|
30
45
|
await identity(folder, ['delete']);
|
|
31
46
|
},
|
|
32
|
-
launch: async ({ shipId, folder, harness, options: picked, isFirstStart, firstPrompt }) => {
|
|
47
|
+
launch: async ({ shipId, shipName, folder, workspace, harness, options: picked, isFirstStart, firstPrompt }) => {
|
|
33
48
|
const settings = configuration.harnesses[harness];
|
|
34
49
|
if (settings === undefined) {
|
|
35
50
|
throw new Error(`The configuration has no harness ${harness}`);
|
|
36
51
|
}
|
|
37
52
|
const prompt = isFirstStart && firstPrompt !== undefined ? firstPrompt : WAKE_PROMPT;
|
|
53
|
+
const flags = namedRemoteControl(effectiveFlags(settings, picked), `[${workspace.kind === 'worktree' ? workspace.repository : workspace.name}] ${shipName}`);
|
|
38
54
|
// The prompt goes first: a flag with an optional value, such as `--remote-control [name]`, would take it.
|
|
39
|
-
const command = [options.command ?? 'claude', prompt, ...
|
|
55
|
+
const command = [options.command ?? 'claude', prompt, ...flags, ...(isFirstStart ? [] : ['--continue'])];
|
|
40
56
|
await sessions.start({ shipId, folder, command });
|
|
41
57
|
},
|
|
42
58
|
turnOf: async (folder) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK5C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAiB9C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,UAAU,uBAAuB,CAAC,OAMvC;IACC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,IAAuB,EAA+D,EAAE,CAC9H,UAAU,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,6BAA6B,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEjJ,OAAO;QACL,eAAe,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE;gBACrC,OAAO;gBACP,WAAW;gBACX,WAAW;gBACX,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,MAAM;gBACX,IAAI,CAAC,QAAQ;gBACb,IAAI,CAAC,SAAS;gBACd,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACxD,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/files.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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>;
|
package/dist/adapters/files.js
CHANGED
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import type { TrierarchConfiguration } from '@aeolus-fleet/common';
|
|
2
2
|
import type { WorkspacePort } from '../core/ports.js';
|
|
3
|
-
/**
|
|
4
|
-
* Workspaces (docs/architecture.md, "First adapters"): a git worktree of a
|
|
5
|
-
* configured repository under the worktree root, one folder per ship
|
|
6
|
-
* (`<root>/<repository>/<ship>`), detached at the want's ref or the
|
|
7
|
-
* repository's HEAD; or a configured folder used as it is.
|
|
8
|
-
*/
|
|
9
3
|
export declare function createGitWorkspace(options: {
|
|
10
4
|
configuration: TrierarchConfiguration;
|
|
11
5
|
root: string;
|
|
@@ -5,8 +5,12 @@ import { runCommand } from './run-command.js';
|
|
|
5
5
|
* Workspaces (docs/architecture.md, "First adapters"): a git worktree of a
|
|
6
6
|
* configured repository under the worktree root, one folder per ship
|
|
7
7
|
* (`<root>/<repository>/<ship>`), detached at the want's ref or the
|
|
8
|
-
* repository's HEAD; or a configured folder used as it is.
|
|
8
|
+
* repository's HEAD; or a configured folder used as it is. The repository is
|
|
9
|
+
* fetched first, and a ref the remote has a branch for is that remote branch,
|
|
10
|
+
* so a ship starts from current code, not from a stale local branch. A fetch
|
|
11
|
+
* that fails (offline, no remote) leaves what the repository has.
|
|
9
12
|
*/
|
|
13
|
+
const REMOTE = 'origin';
|
|
10
14
|
export function createGitWorkspace(options) {
|
|
11
15
|
const { configuration, root } = options;
|
|
12
16
|
const git = async (args) => {
|
|
@@ -16,6 +20,11 @@ export function createGitWorkspace(options) {
|
|
|
16
20
|
}
|
|
17
21
|
return result.stdout;
|
|
18
22
|
};
|
|
23
|
+
/** The remote branch for the ref when the remote has one, else the ref as it is. */
|
|
24
|
+
const resolve = async (repository, ref) => {
|
|
25
|
+
const remote = await runCommand('git', { args: ['-C', repository, 'rev-parse', '--verify', '--quiet', `refs/remotes/${REMOTE}/${ref}`] });
|
|
26
|
+
return remote.status === 0 ? `${REMOTE}/${ref}` : ref;
|
|
27
|
+
};
|
|
19
28
|
const exists = async (path) => (await stat(path).catch(() => undefined)) !== undefined;
|
|
20
29
|
const repositoryOf = (folder) => {
|
|
21
30
|
const [repository] = relative(root, folder).split(sep);
|
|
@@ -38,7 +47,8 @@ export function createGitWorkspace(options) {
|
|
|
38
47
|
// A worktree a stop mid-crew left is used as it is.
|
|
39
48
|
if (!(await exists(folder))) {
|
|
40
49
|
await mkdir(join(root, workspace.repository), { recursive: true });
|
|
41
|
-
await git
|
|
50
|
+
await runCommand('git', { args: ['-C', repository, 'fetch', '--quiet', REMOTE] });
|
|
51
|
+
await git(['-C', repository, 'worktree', 'add', '--detach', folder, ...(workspace.ref === undefined ? [] : [await resolve(repository, workspace.ref)])]);
|
|
42
52
|
}
|
|
43
53
|
return { folder };
|
|
44
54
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-workspace.js","sourceRoot":"","sources":["../../src/adapters/git-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAKhD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"git-workspace.js","sourceRoot":"","sources":["../../src/adapters/git-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ const outgoingSchema = z.object({
|
|
|
21
21
|
const stateSchema = z.object({
|
|
22
22
|
entries: z.record(z.string(), z.object({
|
|
23
23
|
shipId: idSchema('ship'),
|
|
24
|
+
shipName: z.string().optional(),
|
|
24
25
|
harness: z.string(),
|
|
25
26
|
workspace: trierarchWorkspaceSchema,
|
|
26
27
|
squadron: z.string().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-state.js","sourceRoot":"","sources":["../../src/adapters/json-state.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-state.js","sourceRoot":"","sources":["../../src/adapters/json-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,8 +18,8 @@ export declare class FleetRefusal extends Error {
|
|
|
18
18
|
constructor(code: string, message: string);
|
|
19
19
|
}
|
|
20
20
|
export interface RestFleet extends FleetPort {
|
|
21
|
-
/** The deliveries waiting for the trierarch's own ship. */
|
|
22
|
-
receive(): Promise<Delivery[]>;
|
|
21
|
+
/** The deliveries waiting for the trierarch's own ship; `signal` ends the fleet's long poll at once. */
|
|
22
|
+
receive(signal?: AbortSignal): Promise<Delivery[]>;
|
|
23
23
|
/** Registers a ship with its secret, as the trierarch itself at init: its crew token. */
|
|
24
24
|
registerSelf(crew: {
|
|
25
25
|
shipId: ShipId;
|
|
@@ -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,24 @@ 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 = {
|
|
29
|
+
const headers = {};
|
|
30
30
|
const crewToken = request.crewToken ?? options.crewToken;
|
|
31
31
|
if (crewToken !== '') {
|
|
32
32
|
headers.authorization = `Bearer ${crewToken}`;
|
|
33
33
|
}
|
|
34
|
-
|
|
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
|
|
38
|
+
? { method: 'GET', headers, signal: request.signal ?? null }
|
|
39
|
+
: { method: 'POST', headers: { ...headers, 'content-type': 'application/json' }, body: JSON.stringify(request.body), signal: request.signal ?? null });
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (request.signal?.aborted === true) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`The fleet at ${fleetUrl} cannot be reached: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
46
|
+
}
|
|
35
47
|
const body = await response.json();
|
|
36
48
|
if (!response.ok) {
|
|
37
49
|
const refusal = refusalSchema.safeParse(body);
|
|
@@ -64,11 +76,12 @@ export function createRestFleet(options) {
|
|
|
64
76
|
getStartingPrompt: async (shipId) => call({ path: '/fleet/getStartingPrompt', body: { shipId }, answers: z.object({ secret: z.string() }) }),
|
|
65
77
|
register: async (crew) => register(crew, SESSION_HARNESS),
|
|
66
78
|
registerSelf: async (crew) => register(crew, TRIERARCH_SELF.harness),
|
|
79
|
+
whoami: async () => call({ path: '/ship/whoami', answers: z.object({ shipId: idSchema('ship'), name: z.string() }) }),
|
|
67
80
|
release: async (shipId) => {
|
|
68
81
|
await call({ path: '/fleet/release', body: { shipId }, answers: z.unknown() });
|
|
69
82
|
},
|
|
70
|
-
receive: async () => {
|
|
71
|
-
const { deliveries } = await call({ path: '/ship/receive', body: { max: 10 }, answers: z.object({ deliveries: z.array(receivedDeliverySchema) }) });
|
|
83
|
+
receive: async (signal) => {
|
|
84
|
+
const { deliveries } = await call({ path: '/ship/receive', body: { max: 10 }, answers: z.object({ deliveries: z.array(receivedDeliverySchema) }), ...(signal !== undefined && { signal }) });
|
|
72
85
|
return deliveries.map(({ deliveryId, messageId, senderShipId, contentType, payload }) => ({ deliveryId, messageId, senderShipId, contentType, payload }));
|
|
73
86
|
},
|
|
74
87
|
ack: async (deliveryId) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,oBAAoB,EAAe,MAAM,sBAAsB,CAAC;AACnI,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;GAMG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,2BAA2B,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAW,CAAC;AAE7H,uFAAuF;AACvF,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC;AAE7C,wFAAwF;AACxF,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1E,sDAAsD;AACtD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B;IADX,YACW,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAHpB,SAAI,GAAJ,IAAI,CAAQ;IAIvB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
/** Waits between checks that a stopped service is gone; a test passes one that does not wait. */
|
|
52
|
+
sleep?: (ms: number) => Promise<void>;
|
|
53
|
+
}): Service;
|