@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/dist/cli/main.js CHANGED
@@ -1,75 +1,222 @@
1
1
  import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
2
3
  import { fileURLToPath } from 'node:url';
3
- import { TrierarchFileError } from '../adapters/files.js';
4
+ import { createClaudeCodeSetup } from '../adapters/claude-code-setup.js';
5
+ import { loadConfiguration, readCrewFile, TrierarchFileError } from '../adapters/files.js';
6
+ import { createJsonState } from '../adapters/json-state.js';
4
7
  import { trierarchPaths } from '../adapters/paths.js';
5
8
  import { createRestFleet } from '../adapters/rest-fleet.js';
9
+ import { runCommand } from '../adapters/run-command.js';
10
+ import { createService, serviceEnvironment } from '../adapters/service.js';
11
+ import { createTmux } from '../adapters/tmux.js';
12
+ import { createUninstall } from '../core/uninstall.js';
6
13
  import { configCheck } from './config-check.js';
7
14
  import { initTrierarch } from './init.js';
8
- import { install, serviceEnvironment } from './install.js';
15
+ import { describeList, inspectList } from './list.js';
16
+ import { followLog, tailLog } from './logs.js';
17
+ import { createTerminalPrompter } from './prompter.js';
9
18
  import { runTrierarch } from './run.js';
19
+ import { describeStatus, inspectStatus, leaseFrom } from './status.js';
20
+ import { uninstallTrierarch } from './uninstall.js';
10
21
  export const USAGE = [
11
- 'Usage: aeolus-trierarch <command> [--config <path>]',
12
- ' init <fleetUrl> <shipId> <secret> register the trierarch\'s own ship (commissioned with fleet:crew) and write a configuration',
13
- ' config check check the configuration and print the effective flags per harness',
14
- ' run keep the wanted ships crewed until stopped',
15
- ' install [--no-load] run it under launchd (macOS) or systemd (Linux)',
22
+ 'Usage: aeolus-trierarch <command> [--config <path>] [--json]',
23
+ '',
24
+ 'Set up:',
25
+ " init [--fleet-url <url>] [--ship-id <shp_...>] [--secret <secret>] [--yes] the whole setup: registers the trierarch's own ship, writes the configuration, answers Claude Code's one-time questions and offers to install the service. Asks for what is missing; prefer typing the secret when asked, so it stays out of your shell history",
26
+ ' config check check the configuration and give the effective flags per harness',
27
+ '',
28
+ 'Look:',
29
+ ' status the service, the fleet and its own lease, caps in use, entries by state, kept worktrees and orphans',
30
+ ' list the wanted entries: ship, state, harness, workspace, since, restarts',
31
+ ' logs [--lines <n>] [--follow] the last lines of the log, and with --follow each new one',
32
+ '',
33
+ 'Run:',
34
+ ' start start the service',
35
+ ' stop stop the service (it starts again at the next login)',
36
+ ' restart restart the service, so it reads a changed configuration',
37
+ ' install [--no-load] install the service: launchd on macOS, systemd on Linux',
38
+ ' uninstall remove the service and stop every session; deletes no worktree and none of its files',
39
+ ' run keep the wanted ships crewed until stopped (what the service runs)',
40
+ '',
41
+ '--json answers JSON, for a ship to read.',
16
42
  ].join('\n');
43
+ const VALUE_FLAGS = new Set(['--config', '--fleet-url', '--ship-id', '--secret', '--lines']);
44
+ const SWITCHES = new Set(['--json', '--yes', '--follow', '--no-load']);
45
+ const DEFAULT_LINES = 50;
46
+ const FOLLOW_INTERVAL_MS = 500;
47
+ /** The command words, flag values and switches of a command line; undefined for a flag it does not know. */
48
+ function parse(argv) {
49
+ const words = [];
50
+ const values = new Map();
51
+ const switches = new Set();
52
+ for (let index = 0; index < argv.length; index += 1) {
53
+ const arg = argv[index] ?? '';
54
+ if (!arg.startsWith('--')) {
55
+ words.push(arg);
56
+ continue;
57
+ }
58
+ const [name = '', inline] = arg.split(/=(.*)/s);
59
+ if (SWITCHES.has(name) && inline === undefined) {
60
+ switches.add(name);
61
+ }
62
+ else if (VALUE_FLAGS.has(name)) {
63
+ const value = inline ?? argv[(index += 1)];
64
+ if (value === undefined) {
65
+ return undefined;
66
+ }
67
+ values.set(name, value);
68
+ }
69
+ else {
70
+ return undefined;
71
+ }
72
+ }
73
+ return { words, values, switches };
74
+ }
75
+ function describeService(verb, status) {
76
+ return status.isRunning ? `The trierarch ${verb}: it runs${status.pid === undefined ? '' : ` as pid ${String(status.pid)}`}.` : `The trierarch ${verb}: it does not run.`;
77
+ }
17
78
  /** Runs one command line of `aeolus-trierarch`. */
18
79
  export async function main(argv, env = process.env) {
19
- const args = [...argv];
20
- const configAt = args.indexOf('--config');
21
- const config = configAt === -1 ? env.AEOLUS_TRIERARCH_CONFIG : args.splice(configAt, 2)[1];
80
+ const parsed = parse(argv);
81
+ if (parsed === undefined) {
82
+ return { output: USAGE, code: 2 };
83
+ }
84
+ const { words, values, switches } = parsed;
85
+ const isJson = switches.has('--json');
86
+ const config = values.get('--config') ?? env.AEOLUS_TRIERARCH_CONFIG;
22
87
  const homeDirectory = env.HOME ?? homedir();
23
88
  const paths = trierarchPaths({ homeDirectory, ...(config !== undefined && { config }) });
24
- const [command = '', ...rest] = args;
25
- try {
26
- switch (command) {
27
- case 'init': {
28
- const [fleetUrl, shipId, secret] = rest;
29
- if (fleetUrl === undefined || shipId === undefined || secret === undefined) {
30
- return { output: USAGE, code: 2 };
31
- }
32
- const said = await initTrierarch({ paths, crew: { fleetUrl, shipId, secret }, fleetAt: (url) => createRestFleet({ fleetUrl: url, crewToken: '' }) });
33
- return { output: said.join('\n'), code: 0 };
34
- }
35
- case 'config':
36
- return rest[0] === 'check' ? { output: await configCheck(paths), code: 0 } : { output: USAGE, code: 2 };
37
- case 'install': {
38
- const said = await install({
39
- platform: process.platform,
89
+ const serviceAt = () => createService({
90
+ platform: process.platform,
91
+ homeDirectory,
92
+ paths,
93
+ run: { node: process.execPath, script: fileURLToPath(new URL('../bin/aeolus-trierarch.js', import.meta.url)) },
94
+ environment: serviceEnvironment(env),
95
+ uid: process.getuid?.() ?? 0,
96
+ exec: (program, args) => runCommand(program, { args }),
97
+ now: () => new Date(),
98
+ });
99
+ const untilStopped = () => {
100
+ const stopping = new AbortController();
101
+ process.once('SIGINT', () => {
102
+ stopping.abort();
103
+ });
104
+ process.once('SIGTERM', () => {
105
+ stopping.abort();
106
+ });
107
+ return stopping.signal;
108
+ };
109
+ const commands = {
110
+ init: async () => {
111
+ // Questions go to stderr under --json, so stdout holds the JSON alone.
112
+ const prompter = createTerminalPrompter({ input: process.stdin, output: isJson ? process.stderr : process.stdout });
113
+ try {
114
+ const fleetUrl = values.get('--fleet-url');
115
+ const shipId = values.get('--ship-id');
116
+ const secret = values.get('--secret');
117
+ const report = await initTrierarch({
40
118
  homeDirectory,
41
119
  paths,
42
- run: { node: process.execPath, script: fileURLToPath(new URL('../bin/aeolus-trierarch.js', import.meta.url)) },
43
- environment: serviceEnvironment(env),
44
- isLoading: !rest.includes('--no-load'),
45
- uid: process.getuid?.() ?? 0,
120
+ flags: { ...(fleetUrl !== undefined && { fleetUrl }), ...(shipId !== undefined && { shipId }), ...(secret !== undefined && { secret }), isYes: switches.has('--yes') },
121
+ prompter,
122
+ fleetAt: (url) => createRestFleet({ fleetUrl: url, crewToken: '' }),
123
+ claudeCode: createClaudeCodeSetup({ homeDirectory }),
124
+ service: serviceAt(),
46
125
  });
47
- return { output: said.join('\n'), code: 0 };
126
+ return { data: report, text: report.said.join('\n') };
48
127
  }
49
- case 'run': {
50
- const stopping = new AbortController();
51
- process.once('SIGINT', () => {
52
- stopping.abort();
53
- });
54
- process.once('SIGTERM', () => {
55
- stopping.abort();
56
- });
57
- const logger = {
58
- info: (message) => process.stdout.write(`${new Date().toISOString()} ${message}\n`),
59
- warn: (message) => process.stderr.write(`${new Date().toISOString()} ${message}\n`),
60
- };
61
- await runTrierarch({ paths, homeDirectory, env, signal: stopping.signal, logger });
62
- return { output: 'aeolus-trierarch stopped.', code: 0 };
128
+ finally {
129
+ prompter.close();
63
130
  }
64
- default:
65
- return { output: USAGE, code: 2 };
66
- }
131
+ },
132
+ 'config check': async () => {
133
+ const { text, ...data } = await configCheck(paths);
134
+ return { data, text };
135
+ },
136
+ status: async () => {
137
+ const crew = await readCrewFile(paths.crewToken);
138
+ const configuration = await loadConfiguration(paths.config);
139
+ const fleet = createRestFleet(crew);
140
+ const report = await inspectStatus({
141
+ configuration,
142
+ crew,
143
+ service: serviceAt(),
144
+ lease: leaseFrom(() => fleet.whoami()),
145
+ processes: createTmux(),
146
+ state: createJsonState(paths.state),
147
+ });
148
+ return { data: report, text: describeStatus(report) };
149
+ },
150
+ list: async () => {
151
+ const entries = await inspectList(createJsonState(paths.state));
152
+ return { data: entries, text: describeList(entries) };
153
+ },
154
+ logs: async () => {
155
+ const file = join(paths.logs, 'trierarch.log');
156
+ const lines = Number(values.get('--lines') ?? DEFAULT_LINES);
157
+ if (!Number.isInteger(lines) || lines < 0) {
158
+ throw new TrierarchFileError('--lines takes a whole number');
159
+ }
160
+ const tail = await tailLog({ file, lines });
161
+ if (!switches.has('--follow')) {
162
+ return { data: { file, lines: tail }, text: tail.length === 0 ? `No log lines yet in ${file}.` : tail.join('\n') };
163
+ }
164
+ const write = (line) => {
165
+ process.stdout.write(`${isJson ? JSON.stringify({ line }) : line}\n`);
166
+ };
167
+ tail.forEach(write);
168
+ await followLog({ file, signal: untilStopped(), intervalMs: FOLLOW_INTERVAL_MS, write });
169
+ return { data: undefined, text: '' };
170
+ },
171
+ start: async () => {
172
+ const service = serviceAt();
173
+ await service.start();
174
+ const status = await service.status();
175
+ return { data: status, text: describeService('started', status) };
176
+ },
177
+ stop: async () => {
178
+ const service = serviceAt();
179
+ await service.stop();
180
+ const status = await service.status();
181
+ return { data: status, text: `${describeService('stopped', status)} It starts again at the next login, or with aeolus-trierarch start.` };
182
+ },
183
+ restart: async () => {
184
+ const service = serviceAt();
185
+ await service.restart();
186
+ const status = await service.status();
187
+ return { data: status, text: describeService('restarted', status) };
188
+ },
189
+ install: async () => {
190
+ const service = serviceAt();
191
+ await (switches.has('--no-load') ? service.write() : service.install());
192
+ const status = await service.status();
193
+ return { data: status, text: `Installed ${status.file}. Logs: ${paths.logs}` };
194
+ },
195
+ uninstall: async () => {
196
+ const report = await uninstallTrierarch({ service: serviceAt(), uninstall: createUninstall({ processes: createTmux(), state: createJsonState(paths.state) }), home: paths.home });
197
+ return { data: report, text: report.said.join('\n') };
198
+ },
199
+ run: async () => {
200
+ const logger = {
201
+ info: (message) => process.stdout.write(`${new Date().toISOString()} ${message}\n`),
202
+ warn: (message) => process.stderr.write(`${new Date().toISOString()} ${message}\n`),
203
+ };
204
+ await runTrierarch({ paths, homeDirectory, env, signal: untilStopped(), logger });
205
+ return { data: { stopped: true }, text: 'aeolus-trierarch stopped.' };
206
+ },
207
+ };
208
+ const command = commands[words.join(' ')];
209
+ if (command === undefined) {
210
+ return { output: USAGE, code: 2 };
211
+ }
212
+ try {
213
+ const { data, text } = await command();
214
+ return { output: isJson && data !== undefined ? JSON.stringify(data, null, 2) : text, code: 0 };
67
215
  }
68
216
  catch (error) {
69
- if (error instanceof TrierarchFileError) {
70
- return { output: error.message, code: 1 };
71
- }
72
- throw error;
217
+ // A refusal, a file it cannot use, or a program that failed (launchctl, systemctl): said, not thrown at the operator.
218
+ const message = error instanceof Error ? error.message : String(error);
219
+ return { output: isJson ? JSON.stringify({ error: message }) : message, code: 1 };
73
220
  }
74
221
  }
75
222
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qDAAqD;IACrD,mIAAmI;IACnI,wGAAwG;IACxG,iFAAiF;IACjF,sFAAsF;CACvF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAQb,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAuB,EAAE,MAAoD,OAAO,CAAC,GAAG;IACjH,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;gBACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC3E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpC,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrJ,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9C,CAAC;YACD,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1G,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;oBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,aAAa;oBACb,KAAK;oBACL,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC9G,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC;oBACpC,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACtC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;iBAC7B,CAAC,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9C,CAAC;YACD,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;oBAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;oBAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG;oBACb,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,OAAO,IAAI,CAAC;oBAC3F,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,OAAO,IAAI,CAAC;iBAC5F,CAAC;gBACF,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACnF,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1D,CAAC;YACD;gBACE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * How init asks the operator: a line of text, a secret never shown as it is
3
+ * typed, yes or no. Node's readline, no prompt library: the questions are
4
+ * few and plain.
5
+ */
6
+ export interface Prompter {
7
+ text(question: string, options?: {
8
+ default?: string;
9
+ }): Promise<string>;
10
+ /** Asks without showing what is typed, so a secret stays out of the screen, the scrollback and any transcript. */
11
+ secret(question: string): Promise<string>;
12
+ confirm(question: string, options: {
13
+ isDefault: boolean;
14
+ }): Promise<boolean>;
15
+ say(message: string): void;
16
+ }
17
+ export interface TerminalPrompter extends Prompter {
18
+ close(): void;
19
+ }
20
+ export declare function createTerminalPrompter(at: {
21
+ input: NodeJS.ReadableStream;
22
+ output: NodeJS.WritableStream & {
23
+ isTTY?: boolean;
24
+ };
25
+ }): TerminalPrompter;
@@ -0,0 +1,95 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { Writable } from 'node:stream';
3
+ const YES = new Set(['y', 'yes']);
4
+ const NO = new Set(['n', 'no']);
5
+ export function createTerminalPrompter(at) {
6
+ const { input, output } = at;
7
+ // What readline echoes goes through here, so a secret's keys can be kept off the screen.
8
+ let isMuted = false;
9
+ const echo = new Writable({
10
+ writev(chunks, done) {
11
+ if (!isMuted) {
12
+ for (const { chunk } of chunks) {
13
+ if (typeof chunk === 'string' || chunk instanceof Uint8Array) {
14
+ output.write(chunk);
15
+ }
16
+ }
17
+ }
18
+ done();
19
+ },
20
+ });
21
+ const lines = createInterface({ input, output: echo, terminal: output.isTTY === true });
22
+ const waiting = [];
23
+ const readers = [];
24
+ let hasEnded = false;
25
+ lines.on('line', (line) => {
26
+ const reader = readers.shift();
27
+ if (reader === undefined) {
28
+ waiting.push(line);
29
+ }
30
+ else {
31
+ reader.resolve(line);
32
+ }
33
+ });
34
+ lines.on('close', () => {
35
+ hasEnded = true;
36
+ for (const reader of readers.splice(0)) {
37
+ reader.reject(new Error('The input ended'));
38
+ }
39
+ });
40
+ const ask = async (question) => {
41
+ output.write(question);
42
+ const line = waiting.shift();
43
+ if (line !== undefined) {
44
+ return line;
45
+ }
46
+ try {
47
+ if (hasEnded) {
48
+ throw new Error('The input ended');
49
+ }
50
+ return await new Promise((resolve, reject) => {
51
+ readers.push({ resolve, reject });
52
+ });
53
+ }
54
+ catch {
55
+ throw new Error(`The input ended before an answer to: ${question.trim()}`);
56
+ }
57
+ };
58
+ const prompter = {
59
+ text: async (question, options = {}) => {
60
+ const answer = (await ask(`${question} ${options.default === undefined ? '' : `(${options.default}) `}`)).trim();
61
+ return answer === '' ? (options.default ?? '') : answer;
62
+ },
63
+ secret: async (question) => {
64
+ output.write(`${question} `);
65
+ isMuted = true;
66
+ try {
67
+ return (await ask('')).trim();
68
+ }
69
+ finally {
70
+ isMuted = false;
71
+ output.write('\n');
72
+ }
73
+ },
74
+ confirm: async (question, { isDefault }) => {
75
+ for (;;) {
76
+ const answer = (await ask(`${question} ${isDefault ? '[Y/n]' : '[y/N]'} `)).trim().toLowerCase();
77
+ if (answer === '') {
78
+ return isDefault;
79
+ }
80
+ if (YES.has(answer) || NO.has(answer)) {
81
+ return YES.has(answer);
82
+ }
83
+ prompter.say('Answer y or n.');
84
+ }
85
+ },
86
+ say: (message) => {
87
+ output.write(`${message}\n`);
88
+ },
89
+ close: () => {
90
+ lines.close();
91
+ },
92
+ };
93
+ return prompter;
94
+ }
95
+ //# sourceMappingURL=prompter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.js","sourceRoot":"","sources":["../../src/cli/prompter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { TrierarchConfiguration, TrierarchEntryState } from '@aeolus-fleet/common';
2
+ import type { CrewFile } from '../adapters/files.js';
3
+ import type { Service, ServiceStatus } from '../adapters/service.js';
4
+ import type { KeptWorktree } from '../core/entry.js';
5
+ import type { ProcessPort, StatePort } from '../core/ports.js';
6
+ /**
7
+ * `aeolus-trierarch status`: how the trierarch stands on this machine, from
8
+ * what is on it. The service and its process, the fleet and the trierarch's
9
+ * own lease (one whoami, no message), the caps in use, the entries by state,
10
+ * and the worktrees kept or orphaned.
11
+ */
12
+ /** The trierarch's own lease: whoami answers while it holds, the fleet refuses the crew token once it ended. */
13
+ export type Lease = 'valid' | 'ended' | 'unreachable';
14
+ export interface StatusReport {
15
+ readonly service: ServiceStatus;
16
+ readonly fleet: {
17
+ readonly url: string;
18
+ readonly shipId?: string;
19
+ readonly lease: Lease;
20
+ };
21
+ readonly caps: {
22
+ readonly ships: {
23
+ readonly used: number;
24
+ readonly cap: number;
25
+ };
26
+ readonly running: {
27
+ readonly used: number;
28
+ readonly cap: number;
29
+ };
30
+ };
31
+ readonly entries: Readonly<Record<TrierarchEntryState, number>>;
32
+ readonly kept: readonly KeptWorktree[];
33
+ readonly orphans: readonly string[];
34
+ }
35
+ export declare function leaseFrom(whoami: () => Promise<unknown>): () => Promise<Lease>;
36
+ export declare function inspectStatus(at: {
37
+ configuration: TrierarchConfiguration;
38
+ crew: CrewFile;
39
+ service: Pick<Service, 'status'>;
40
+ lease: () => Promise<Lease>;
41
+ processes: ProcessPort;
42
+ state: StatePort;
43
+ }): Promise<StatusReport>;
44
+ export declare function describeStatus(report: StatusReport): string;
@@ -0,0 +1,65 @@
1
+ import { FleetRefusal } from '../adapters/rest-fleet.js';
2
+ export function leaseFrom(whoami) {
3
+ return async () => {
4
+ try {
5
+ await whoami();
6
+ return 'valid';
7
+ }
8
+ catch (error) {
9
+ if (error instanceof FleetRefusal && (error.code === 'LEASE_ENDED' || error.code === 'UNAUTHORIZED')) {
10
+ return 'ended';
11
+ }
12
+ return 'unreachable';
13
+ }
14
+ };
15
+ }
16
+ export async function inspectStatus(at) {
17
+ const [service, lease, sessions, state] = await Promise.all([at.service.status(), at.lease(), at.processes.list(), at.state.load()]);
18
+ const entries = { wanted: 0, crewing: 0, running: 0, restarting: 0, crashed: 0, releasing: 0 };
19
+ for (const entry of Object.values(state.entries)) {
20
+ entries[entry.state] += 1;
21
+ }
22
+ return {
23
+ service,
24
+ fleet: { url: at.crew.fleetUrl, ...(at.crew.shipId !== undefined && { shipId: at.crew.shipId }), lease },
25
+ caps: {
26
+ ships: { used: Object.keys(state.entries).length, cap: at.configuration.caps.ships },
27
+ running: { used: sessions.filter((session) => session.status === 'running').length, cap: at.configuration.caps.running },
28
+ },
29
+ entries,
30
+ kept: state.kept,
31
+ orphans: state.orphans,
32
+ };
33
+ }
34
+ function describeService(service) {
35
+ if (!service.isInstalled) {
36
+ return 'not installed (aeolus-trierarch install)';
37
+ }
38
+ if (!service.isRunning) {
39
+ return 'installed, not running (aeolus-trierarch start)';
40
+ }
41
+ return ['running', ...(service.pid === undefined ? [] : [`pid ${String(service.pid)}`]), ...(service.since === undefined ? [] : [`since ${service.since}`])].join(', ');
42
+ }
43
+ function describeFleet(fleet) {
44
+ const ship = fleet.shipId ?? 'its ship';
45
+ switch (fleet.lease) {
46
+ case 'valid':
47
+ return `${fleet.url}, the lease of ${ship} is valid`;
48
+ case 'ended':
49
+ return `${fleet.url}, the lease of ${ship} ended: its ship was released or retired, so it crews nothing`;
50
+ case 'unreachable':
51
+ return `${fleet.url} cannot be reached`;
52
+ }
53
+ }
54
+ export function describeStatus(report) {
55
+ const counted = Object.entries(report.entries).filter(([, count]) => count > 0);
56
+ return [
57
+ `Service: ${describeService(report.service)}`,
58
+ `Fleet: ${describeFleet(report.fleet)}`,
59
+ `Caps: ${String(report.caps.ships.used)} of ${String(report.caps.ships.cap)} ships on the list, ${String(report.caps.running.used)} of ${String(report.caps.running.cap)} sessions running`,
60
+ `Entries: ${counted.length === 0 ? 'none' : counted.map(([state, count]) => `${state} ${String(count)}`).join(', ')}`,
61
+ `Kept worktrees: ${report.kept.length === 0 ? 'none' : report.kept.map((kept) => `${kept.path} (${kept.shipId})`).join(', ')}`,
62
+ `Orphans: ${report.orphans.length === 0 ? 'none' : report.orphans.join(', ')}`,
63
+ ].join('\n');
64
+ }
65
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Service } from '../adapters/service.js';
2
+ import type { Uninstall } from '../core/uninstall.js';
3
+ /**
4
+ * `aeolus-trierarch uninstall` (docs/trierarch.md, lifecycle row 10): removes
5
+ * the service first, so nothing starts a session again, then stops every
6
+ * session and lists the worktrees it leaves. It deletes nothing: not a
7
+ * worktree, and not its own files.
8
+ */
9
+ export interface UninstallReport {
10
+ /** The service's file, removed. */
11
+ readonly service: string;
12
+ readonly worktrees: readonly string[];
13
+ readonly said: readonly string[];
14
+ }
15
+ export declare function uninstallTrierarch(at: {
16
+ service: Pick<Service, 'uninstall' | 'status'>;
17
+ uninstall: Uninstall;
18
+ home: string;
19
+ }): Promise<UninstallReport>;
@@ -0,0 +1,16 @@
1
+ export async function uninstallTrierarch(at) {
2
+ const { file } = await at.service.status();
3
+ await at.service.uninstall();
4
+ const { worktrees } = await at.uninstall();
5
+ return {
6
+ service: file,
7
+ worktrees,
8
+ said: [
9
+ `Removed the service (${file}): the trierarch no longer runs, and stopped every session it ran.`,
10
+ worktrees.length === 0 ? 'It leaves no worktree.' : `It deleted no worktree. Remove these by hand once you no longer need them:\n${worktrees.map((path) => ` ${path}`).join('\n')}`,
11
+ `Its configuration, crew token, state and logs stay in ${at.home}. Its ship, and the ships it crewed, stay crewed in the fleet: release them in the console.`,
12
+ 'aeolus-trierarch itself stays installed: npm uninstall --global @aeolus-fleet/trierarch removes it.',
13
+ ],
14
+ };
15
+ }
16
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAA0F;IACjI,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC3C,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,SAAS,EAAE,CAAC;IAC3C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS;QACT,IAAI,EAAE;YACJ,wBAAwB,IAAI,oEAAoE;YAChG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,+EAA+E,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACpL,yDAAyD,EAAE,CAAC,IAAI,6FAA6F;YAC7J,qGAAqG;SACtG;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aeolus-fleet/trierarch",
3
- "version": "0.17.0",
3
+ "version": "0.17.1",
4
4
  "description": "Aeolus trierarch: keeps the ships on its wanted list crewed on its machine, as a ship of the fleet with fleet:crew.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -30,10 +30,10 @@
30
30
  "typecheck": "tsc --project tsconfig.json"
31
31
  },
32
32
  "dependencies": {
33
- "@aeolus-fleet/common": "0.17.0",
33
+ "@aeolus-fleet/common": "0.17.1",
34
34
  "zod": "^4.6.5"
35
35
  },
36
36
  "devDependencies": {
37
- "@aeolus-fleet/server": "0.17.0"
37
+ "@aeolus-fleet/server": "0.17.1"
38
38
  }
39
39
  }