@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
@@ -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;AAGrD,4GAA4G;AAC5G,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAqB;IACrD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,OAAO,CAAC,wBAAwB,KAAK,CAAC,MAAM,QAAQ,EAAE,yDAAyD,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5J,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"}
@@ -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 <fleetUrl> <shipId> <secret>`: registers the
5
- * trierarch's own ship (commissioned with fleet:crew) with its secret and
6
- * keeps the crew token, readable by its user only. Writes a configuration with
7
- * no repository, folder or flag when there is none yet, with its JSON Schema
8
- * beside it. The secret is never written.
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
- crew: {
13
- fleetUrl: string;
14
- shipId: string;
15
- secret: string;
16
- };
38
+ flags: InitFlags;
39
+ prompter: Prompter;
17
40
  fleetAt: (fleetUrl: string) => Pick<RestFleet, 'registerSelf'>;
18
- }): Promise<string[]>;
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 { idSchema } from '@aeolus-fleet/common';
3
- import { configurationJsonSchema, initialConfiguration, writeCrewFile } from '../adapters/files.js';
4
- /**
5
- * `aeolus-trierarch init <fleetUrl> <shipId> <secret>`: registers the
6
- * trierarch's own ship (commissioned with fleet:crew) with its secret and
7
- * keeps the crew token, readable by its user only. Writes a configuration with
8
- * no repository, folder or flag when there is none yet, with its JSON Schema
9
- * beside it. The secret is never written.
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, crew, fleetAt } = input;
13
- const shipId = idSchema('ship').parse(crew.shipId);
14
- const { crewToken } = await fleetAt(crew.fleetUrl).registerSelf({ shipId, secret: crew.secret });
15
- await writeCrewFile(paths.crewToken, { fleetUrl: crew.fleetUrl.replace(/\/$/, ''), crewToken });
16
- const said = [`Crew token kept in ${paths.crewToken}.`];
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
- if ((await stat(paths.config).catch(() => undefined)) === undefined) {
20
- await writeFile(paths.config, `${JSON.stringify(initialConfiguration(), null, 2)}\n`);
21
- said.push(`Configuration written to ${paths.config}: add the repositories and folders it may crew ships in, then run aeolus-trierarch config check.`);
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
- said.push(`Configuration kept as it is at ${paths.config}.`);
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 said;
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
@@ -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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"}
@@ -0,0 +1,16 @@
1
+ import type { ShipId, TrierarchEntryState } from '@aeolus-fleet/common';
2
+ import type { StatePort } from '../core/ports.js';
3
+ /** `aeolus-trierarch list`: the wanted entries, from the saved state. */
4
+ export interface ListedEntry {
5
+ readonly shipId: ShipId;
6
+ readonly state: TrierarchEntryState;
7
+ readonly harness: string;
8
+ readonly workspace: string;
9
+ readonly folder?: string;
10
+ /** When the entry took its state, ISO 8601. */
11
+ readonly since: string;
12
+ /** How often its session exited within the restart window. */
13
+ readonly restarts: number;
14
+ }
15
+ export declare function inspectList(state: StatePort): Promise<ListedEntry[]>;
16
+ export declare function describeList(entries: readonly ListedEntry[]): string;
@@ -0,0 +1,32 @@
1
+ function describeWorkspace(workspace) {
2
+ switch (workspace.kind) {
3
+ case 'worktree':
4
+ return `worktree ${workspace.repository}${workspace.ref === undefined ? '' : ` at ${workspace.ref}`}`;
5
+ case 'folder':
6
+ return `folder ${workspace.name}`;
7
+ }
8
+ }
9
+ export async function inspectList(state) {
10
+ return Object.values((await state.load()).entries).map((entry) => ({
11
+ shipId: entry.shipId,
12
+ state: entry.state,
13
+ harness: entry.harness,
14
+ workspace: describeWorkspace(entry.workspace),
15
+ ...(entry.folder !== undefined && { folder: entry.folder }),
16
+ since: entry.since,
17
+ restarts: entry.exits.length,
18
+ }));
19
+ }
20
+ const COLUMN_GAP = ' ';
21
+ export function describeList(entries) {
22
+ if (entries.length === 0) {
23
+ return 'No ship is on the list.';
24
+ }
25
+ const rows = [
26
+ ['SHIP', 'STATE', 'HARNESS', 'WORKSPACE', 'SINCE', 'RESTARTS'],
27
+ ...entries.map((entry) => [entry.shipId, entry.state, entry.harness, entry.workspace, entry.since, String(entry.restarts)]),
28
+ ];
29
+ const widths = rows[0]?.map((_, column) => Math.max(...rows.map((row) => row[column]?.length ?? 0))) ?? [];
30
+ return rows.map((row) => row.map((cell, column) => (column === row.length - 1 ? cell : cell.padEnd(widths[column] ?? 0))).join(COLUMN_GAP)).join('\n');
31
+ }
32
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAkBA,SAAS,iBAAiB,CAAC,SAA6B;IACtD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,YAAY,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;QACxG,KAAK,QAAQ;YACX,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,OAA+B;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,GAAG;QACX,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC;QAC9D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC5H,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3G,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `aeolus-trierarch logs`: the last lines of the trierarch's log, and with
3
+ * `--follow` each line written after, until it is stopped. The log is the file
4
+ * the service writes, `~/.aeolus/trierarch/logs/trierarch.log`.
5
+ */
6
+ export declare function tailLog(at: {
7
+ file: string;
8
+ lines: number;
9
+ }): Promise<string[]>;
10
+ /** Writes each whole line added to the log after it starts, checking every `intervalMs`, until `signal` aborts. */
11
+ export declare function followLog(at: {
12
+ file: string;
13
+ signal: AbortSignal;
14
+ intervalMs: number;
15
+ write: (line: string) => void;
16
+ }): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import { open, readFile, stat } from 'node:fs/promises';
2
+ /**
3
+ * `aeolus-trierarch logs`: the last lines of the trierarch's log, and with
4
+ * `--follow` each line written after, until it is stopped. The log is the file
5
+ * the service writes, `~/.aeolus/trierarch/logs/trierarch.log`.
6
+ */
7
+ export async function tailLog(at) {
8
+ const text = await readFile(at.file, 'utf8').catch(() => '');
9
+ const lines = text.split('\n');
10
+ if (lines.at(-1) === '') {
11
+ lines.pop();
12
+ }
13
+ return lines.slice(-at.lines);
14
+ }
15
+ /** Writes each whole line added to the log after it starts, checking every `intervalMs`, until `signal` aborts. */
16
+ export async function followLog(at) {
17
+ const { file, signal, intervalMs, write } = at;
18
+ let offset = (await stat(file).catch(() => undefined))?.size ?? 0;
19
+ let partial = '';
20
+ // Asked afresh each time: a write may stop it.
21
+ const isStopped = () => signal.aborted;
22
+ while (!isStopped()) {
23
+ const size = (await stat(file).catch(() => undefined))?.size ?? 0;
24
+ // A log written anew from the start: follow it from there.
25
+ if (size < offset) {
26
+ offset = 0;
27
+ partial = '';
28
+ }
29
+ if (size > offset) {
30
+ const handle = await open(file, 'r');
31
+ try {
32
+ const buffer = Buffer.alloc(size - offset);
33
+ await handle.read(buffer, 0, buffer.length, offset);
34
+ offset = size;
35
+ const lines = (partial + buffer.toString('utf8')).split('\n');
36
+ partial = lines.pop() ?? '';
37
+ for (const line of lines) {
38
+ if (isStopped()) {
39
+ return;
40
+ }
41
+ write(line);
42
+ }
43
+ }
44
+ finally {
45
+ await handle.close();
46
+ }
47
+ }
48
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
49
+ }
50
+ }
51
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;GAIG;AAEH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAmC;IAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,mHAAmH;AACnH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAA4F;IAC1H,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC/C,IAAI,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,+CAA+C;IAC/C,MAAM,SAAS,GAAG,GAAY,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAClE,2DAA2D;QAC3D,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,CAAC;YACX,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;gBAC3C,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;wBAChB,OAAO;oBACT,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}