@bluewombat/runtime 0.1.0
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 +473 -0
- package/SPECS.md +303 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +172 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +17 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/find-config.d.ts +9 -0
- package/dist/config/find-config.d.ts.map +1 -0
- package/dist/config/find-config.js +25 -0
- package/dist/config/find-config.js.map +1 -0
- package/dist/config/home.d.ts +17 -0
- package/dist/config/home.d.ts.map +1 -0
- package/dist/config/home.js +23 -0
- package/dist/config/home.js.map +1 -0
- package/dist/config/load-config.d.ts +13 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +537 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/parse-args.d.ts +25 -0
- package/dist/config/parse-args.d.ts.map +1 -0
- package/dist/config/parse-args.js +478 -0
- package/dist/config/parse-args.js.map +1 -0
- package/dist/config/types.d.ts +144 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/loop/authority.d.ts +51 -0
- package/dist/loop/authority.d.ts.map +1 -0
- package/dist/loop/authority.js +166 -0
- package/dist/loop/authority.js.map +1 -0
- package/dist/loop/context.d.ts +44 -0
- package/dist/loop/context.d.ts.map +1 -0
- package/dist/loop/context.js +2 -0
- package/dist/loop/context.js.map +1 -0
- package/dist/loop/cursor.d.ts +4 -0
- package/dist/loop/cursor.d.ts.map +1 -0
- package/dist/loop/cursor.js +20 -0
- package/dist/loop/cursor.js.map +1 -0
- package/dist/loop/deliveries.d.ts +22 -0
- package/dist/loop/deliveries.d.ts.map +1 -0
- package/dist/loop/deliveries.js +240 -0
- package/dist/loop/deliveries.js.map +1 -0
- package/dist/loop/describe.d.ts +40 -0
- package/dist/loop/describe.d.ts.map +1 -0
- package/dist/loop/describe.js +48 -0
- package/dist/loop/describe.js.map +1 -0
- package/dist/loop/drive.d.ts +15 -0
- package/dist/loop/drive.d.ts.map +1 -0
- package/dist/loop/drive.js +42 -0
- package/dist/loop/drive.js.map +1 -0
- package/dist/loop/journal.d.ts +22 -0
- package/dist/loop/journal.d.ts.map +1 -0
- package/dist/loop/journal.js +49 -0
- package/dist/loop/journal.js.map +1 -0
- package/dist/loop/lock.d.ts +11 -0
- package/dist/loop/lock.d.ts.map +1 -0
- package/dist/loop/lock.js +60 -0
- package/dist/loop/lock.js.map +1 -0
- package/dist/loop/message.d.ts +34 -0
- package/dist/loop/message.d.ts.map +1 -0
- package/dist/loop/message.js +48 -0
- package/dist/loop/message.js.map +1 -0
- package/dist/loop/open-host.d.ts +13 -0
- package/dist/loop/open-host.d.ts.map +1 -0
- package/dist/loop/open-host.js +180 -0
- package/dist/loop/open-host.js.map +1 -0
- package/dist/loop/probe.d.ts +9 -0
- package/dist/loop/probe.d.ts.map +1 -0
- package/dist/loop/probe.js +57 -0
- package/dist/loop/probe.js.map +1 -0
- package/dist/loop/report.d.ts +26 -0
- package/dist/loop/report.d.ts.map +1 -0
- package/dist/loop/report.js +328 -0
- package/dist/loop/report.js.map +1 -0
- package/dist/loop/tick.d.ts +24 -0
- package/dist/loop/tick.d.ts.map +1 -0
- package/dist/loop/tick.js +169 -0
- package/dist/loop/tick.js.map +1 -0
- package/dist/loop/trace.d.ts +16 -0
- package/dist/loop/trace.d.ts.map +1 -0
- package/dist/loop/trace.js +49 -0
- package/dist/loop/trace.js.map +1 -0
- package/dist/loop/transformers.d.ts +27 -0
- package/dist/loop/transformers.d.ts.map +1 -0
- package/dist/loop/transformers.js +229 -0
- package/dist/loop/transformers.js.map +1 -0
- package/dist/loop/work-line.d.ts +73 -0
- package/dist/loop/work-line.d.ts.map +1 -0
- package/dist/loop/work-line.js +109 -0
- package/dist/loop/work-line.js.map +1 -0
- package/dist/operator/board.d.ts +31 -0
- package/dist/operator/board.d.ts.map +1 -0
- package/dist/operator/board.js +67 -0
- package/dist/operator/board.js.map +1 -0
- package/dist/operator/cancel.d.ts +19 -0
- package/dist/operator/cancel.d.ts.map +1 -0
- package/dist/operator/cancel.js +70 -0
- package/dist/operator/cancel.js.map +1 -0
- package/dist/operator/doctor.d.ts +15 -0
- package/dist/operator/doctor.d.ts.map +1 -0
- package/dist/operator/doctor.js +416 -0
- package/dist/operator/doctor.js.map +1 -0
- package/dist/operator/git-remote.d.ts +39 -0
- package/dist/operator/git-remote.d.ts.map +1 -0
- package/dist/operator/git-remote.js +78 -0
- package/dist/operator/git-remote.js.map +1 -0
- package/dist/operator/init.d.ts +28 -0
- package/dist/operator/init.d.ts.map +1 -0
- package/dist/operator/init.js +522 -0
- package/dist/operator/init.js.map +1 -0
- package/dist/operator/live.d.ts +19 -0
- package/dist/operator/live.d.ts.map +1 -0
- package/dist/operator/live.js +149 -0
- package/dist/operator/live.js.map +1 -0
- package/dist/operator/prompt.d.ts +35 -0
- package/dist/operator/prompt.d.ts.map +1 -0
- package/dist/operator/prompt.js +125 -0
- package/dist/operator/prompt.js.map +1 -0
- package/dist/operator/setup.d.ts +18 -0
- package/dist/operator/setup.d.ts.map +1 -0
- package/dist/operator/setup.js +62 -0
- package/dist/operator/setup.js.map +1 -0
- package/dist/plugins/discover.d.ts +13 -0
- package/dist/plugins/discover.d.ts.map +1 -0
- package/dist/plugins/discover.js +81 -0
- package/dist/plugins/discover.js.map +1 -0
- package/dist/plugins/isolation.d.ts +78 -0
- package/dist/plugins/isolation.d.ts.map +1 -0
- package/dist/plugins/isolation.js +64 -0
- package/dist/plugins/isolation.js.map +1 -0
- package/dist/plugins/load.d.ts +35 -0
- package/dist/plugins/load.d.ts.map +1 -0
- package/dist/plugins/load.js +109 -0
- package/dist/plugins/load.js.map +1 -0
- package/dist/plugins/manager.d.ts +43 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +47 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/persist.d.ts +33 -0
- package/dist/plugins/persist.d.ts.map +1 -0
- package/dist/plugins/persist.js +26 -0
- package/dist/plugins/persist.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { closeSync, existsSync, fstatSync, openSync, readSync } from "node:fs";
|
|
2
|
+
import { openWorkLedger } from "@bluewombat/work-ledger";
|
|
3
|
+
import { parseArgs } from "../config/parse-args.js";
|
|
4
|
+
import { journalPath, parseJournalChunk } from "../loop/journal.js";
|
|
5
|
+
import { openPersist } from "../plugins/persist.js";
|
|
6
|
+
import { boardOf, jsonOf } from "./board.js";
|
|
7
|
+
/**
|
|
8
|
+
* Snapshot the ledger, then optionally follow the journal.
|
|
9
|
+
*
|
|
10
|
+
* Does not open Host, a manager, or Conductor. The worker owns those.
|
|
11
|
+
*/
|
|
12
|
+
export async function runLive(input) {
|
|
13
|
+
const peeled = peelJson(input.argv);
|
|
14
|
+
const parsed = parseArgs(peeled.rest, { cwd: input.cwd, checkPaths: false });
|
|
15
|
+
if (!parsed.ok) {
|
|
16
|
+
input.write(`${parsed.reason}\n`);
|
|
17
|
+
return 2;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const opened = await openPersist(parsed.invocation.persist, parsed.invocation.configDir, parsed.invocation.ledgerRoot);
|
|
21
|
+
if (!opened.ok) {
|
|
22
|
+
input.write(`${opened.reason}\n`);
|
|
23
|
+
return 2;
|
|
24
|
+
}
|
|
25
|
+
const ledger = openWorkLedger({ persist: opened.persist });
|
|
26
|
+
const rows = await boardOf(ledger);
|
|
27
|
+
if (peeled.json) {
|
|
28
|
+
input.write(`${JSON.stringify(jsonOf(rows), null, 2)}\n`);
|
|
29
|
+
}
|
|
30
|
+
else if (rows.length === 0) {
|
|
31
|
+
input.write("No Features in the ledger.\n");
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
for (const row of rows) {
|
|
35
|
+
input.write(`${row.line}\n`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!input.follow) {
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
return await followJournal({
|
|
42
|
+
path: journalPath(parsed.invocation.ledgerRoot),
|
|
43
|
+
write: input.write,
|
|
44
|
+
interruptFlag: input.interruptFlag,
|
|
45
|
+
pollMs: input.pollMs ?? 250,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
input.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
50
|
+
return 2;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function peelJson(argv) {
|
|
54
|
+
return {
|
|
55
|
+
json: argv.includes("--json"),
|
|
56
|
+
rest: argv.filter((token) => token !== "--json"),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function formatFilm(line) {
|
|
60
|
+
const at = typeof line.at === "string" && line.at.length >= 19 ? line.at.slice(11, 19) : "";
|
|
61
|
+
const event = typeof line.event === "string" ? line.event : "event";
|
|
62
|
+
const key = typeof line.key === "string" ? line.key : "";
|
|
63
|
+
const extra = typeof line.label === "string"
|
|
64
|
+
? line.label
|
|
65
|
+
: typeof line.outcome === "string"
|
|
66
|
+
? String(line.outcome)
|
|
67
|
+
: typeof line.state === "string"
|
|
68
|
+
? String(line.state)
|
|
69
|
+
: typeof line.reference === "string"
|
|
70
|
+
? line.reference
|
|
71
|
+
: typeof line.behind === "string"
|
|
72
|
+
? line.behind
|
|
73
|
+
: "";
|
|
74
|
+
return [at, event, key, extra].filter((part) => part.length > 0).join(" ");
|
|
75
|
+
}
|
|
76
|
+
async function followJournal(input) {
|
|
77
|
+
let offset = 0;
|
|
78
|
+
let remainder = "";
|
|
79
|
+
let seen = existsSync(input.path);
|
|
80
|
+
if (seen) {
|
|
81
|
+
offset = sizeOf(input.path);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
input.write("Worker has not written a journal yet.\n");
|
|
85
|
+
}
|
|
86
|
+
while (!input.interruptFlag.interrupted) {
|
|
87
|
+
if (!existsSync(input.path)) {
|
|
88
|
+
await sleep(input.pollMs, input.interruptFlag);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (!seen) {
|
|
92
|
+
seen = true;
|
|
93
|
+
offset = 0;
|
|
94
|
+
remainder = "";
|
|
95
|
+
}
|
|
96
|
+
const read = readFrom(input.path, offset);
|
|
97
|
+
offset = read.offset;
|
|
98
|
+
if (read.chunk.length > 0) {
|
|
99
|
+
const parsed = parseJournalChunk(read.chunk, remainder);
|
|
100
|
+
remainder = parsed.remainder;
|
|
101
|
+
for (const line of parsed.lines) {
|
|
102
|
+
input.write(`${formatFilm(line)}\n`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
await sleep(input.pollMs, input.interruptFlag);
|
|
106
|
+
}
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
function sizeOf(path) {
|
|
110
|
+
const fd = openSync(path, "r");
|
|
111
|
+
try {
|
|
112
|
+
return fstatSync(fd).size;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
closeSync(fd);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function readFrom(path, offset) {
|
|
119
|
+
const fd = openSync(path, "r");
|
|
120
|
+
try {
|
|
121
|
+
const size = fstatSync(fd).size;
|
|
122
|
+
if (size < offset) {
|
|
123
|
+
offset = 0;
|
|
124
|
+
}
|
|
125
|
+
if (size <= offset) {
|
|
126
|
+
return { chunk: "", offset };
|
|
127
|
+
}
|
|
128
|
+
const buf = Buffer.alloc(size - offset);
|
|
129
|
+
readSync(fd, buf, 0, buf.length, offset);
|
|
130
|
+
return { chunk: buf.toString("utf8"), offset: size };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
closeSync(fd);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function sleep(ms, interruptFlag) {
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
const started = Date.now();
|
|
139
|
+
const tick = () => {
|
|
140
|
+
if (interruptFlag.interrupted || Date.now() - started >= ms) {
|
|
141
|
+
resolve();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
setTimeout(tick, Math.min(50, ms));
|
|
145
|
+
};
|
|
146
|
+
tick();
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=live.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/operator/live.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** Reads one line. Injected, so the wizard is testable without a terminal. */
|
|
2
|
+
export type Ask = (question: string) => Promise<string>;
|
|
3
|
+
/**
|
|
4
|
+
* The person stopped answering — Ctrl-C, Ctrl-D, or a pipe that ran dry.
|
|
5
|
+
* Thrown rather than returned so no caller can mistake it for an empty answer
|
|
6
|
+
* and ask the same question again.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PromptAbandoned extends Error {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
export type AskOptions = {
|
|
12
|
+
fallback?: string;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
/** Where a "that answer will not do" hint goes. */
|
|
15
|
+
write?: (line: string) => void;
|
|
16
|
+
};
|
|
17
|
+
export declare function isInteractive(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* A reader over the real terminal. Call `close` when the wizard is done.
|
|
20
|
+
*
|
|
21
|
+
* Lines are queued rather than read one `question` at a time: a pipe delivers
|
|
22
|
+
* every line at once, and anything arriving between two questions would
|
|
23
|
+
* otherwise be dropped on the floor. Once the input ends — EOF, or Ctrl-C —
|
|
24
|
+
* every read throws, so the wizard stops on the spot instead of re-asking.
|
|
25
|
+
*/
|
|
26
|
+
export declare function terminalAsk(): {
|
|
27
|
+
ask: Ask;
|
|
28
|
+
close: () => void;
|
|
29
|
+
};
|
|
30
|
+
/** `Question (fallback): `, with the fallback used for an empty answer. */
|
|
31
|
+
export declare function askText(ask: Ask, prompt: string, options?: AskOptions): Promise<string>;
|
|
32
|
+
export declare function askYesNo(ask: Ask, prompt: string, fallback: boolean, write?: (line: string) => void): Promise<boolean>;
|
|
33
|
+
/** A numbered list. Returns the chosen index. */
|
|
34
|
+
export declare function askChoice(ask: Ask, write: (line: string) => void, prompt: string, choices: readonly string[]): Promise<number>;
|
|
35
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/operator/prompt.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAExD;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;;CAKzC;AAKD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAmD7D;AAED,2EAA2E;AAC3E,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBjG;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,EACjB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC7B,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,iDAAiD;AACjD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,MAAM,CAAC,CAajB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
/**
|
|
3
|
+
* The person stopped answering — Ctrl-C, Ctrl-D, or a pipe that ran dry.
|
|
4
|
+
* Thrown rather than returned so no caller can mistake it for an empty answer
|
|
5
|
+
* and ask the same question again.
|
|
6
|
+
*/
|
|
7
|
+
export class PromptAbandoned extends Error {
|
|
8
|
+
constructor() {
|
|
9
|
+
super("Cancelled. Nothing written.");
|
|
10
|
+
this.name = "PromptAbandoned";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** How many times a question is re-asked before giving up on it. */
|
|
14
|
+
const MAX_TRIES = 3;
|
|
15
|
+
export function isInteractive() {
|
|
16
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A reader over the real terminal. Call `close` when the wizard is done.
|
|
20
|
+
*
|
|
21
|
+
* Lines are queued rather than read one `question` at a time: a pipe delivers
|
|
22
|
+
* every line at once, and anything arriving between two questions would
|
|
23
|
+
* otherwise be dropped on the floor. Once the input ends — EOF, or Ctrl-C —
|
|
24
|
+
* every read throws, so the wizard stops on the spot instead of re-asking.
|
|
25
|
+
*/
|
|
26
|
+
export function terminalAsk() {
|
|
27
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
28
|
+
const arrived = [];
|
|
29
|
+
const waiting = [];
|
|
30
|
+
let ended = false;
|
|
31
|
+
const end = () => {
|
|
32
|
+
ended = true;
|
|
33
|
+
const pending = waiting.splice(0);
|
|
34
|
+
// The cursor is sitting after a prompt that will never be answered.
|
|
35
|
+
if (pending.length > 0) {
|
|
36
|
+
process.stdout.write("\n");
|
|
37
|
+
}
|
|
38
|
+
for (const next of pending) {
|
|
39
|
+
next(null);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
rl.on("line", (line) => {
|
|
43
|
+
const next = waiting.shift();
|
|
44
|
+
if (next === undefined) {
|
|
45
|
+
arrived.push(line);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
next(line);
|
|
49
|
+
});
|
|
50
|
+
// Without this listener a Ctrl-C at a prompt is swallowed by readline.
|
|
51
|
+
rl.on("SIGINT", () => {
|
|
52
|
+
rl.close();
|
|
53
|
+
});
|
|
54
|
+
rl.on("close", end);
|
|
55
|
+
return {
|
|
56
|
+
ask: async (question) => {
|
|
57
|
+
const queued = arrived.shift();
|
|
58
|
+
if (queued !== undefined) {
|
|
59
|
+
process.stdout.write(question);
|
|
60
|
+
return queued.trim();
|
|
61
|
+
}
|
|
62
|
+
if (ended) {
|
|
63
|
+
throw new PromptAbandoned();
|
|
64
|
+
}
|
|
65
|
+
process.stdout.write(question);
|
|
66
|
+
const line = await new Promise((resolve) => waiting.push(resolve));
|
|
67
|
+
if (line === null) {
|
|
68
|
+
throw new PromptAbandoned();
|
|
69
|
+
}
|
|
70
|
+
return line.trim();
|
|
71
|
+
},
|
|
72
|
+
close: () => rl.close(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** `Question (fallback): `, with the fallback used for an empty answer. */
|
|
76
|
+
export async function askText(ask, prompt, options = {}) {
|
|
77
|
+
const suffix = options.fallback === undefined ? "" : ` (${options.fallback})`;
|
|
78
|
+
for (let tries = 0; tries < MAX_TRIES; tries += 1) {
|
|
79
|
+
const answer = await ask(`${prompt}${suffix}: `);
|
|
80
|
+
if (answer.length > 0) {
|
|
81
|
+
return answer;
|
|
82
|
+
}
|
|
83
|
+
if (options.fallback !== undefined) {
|
|
84
|
+
return options.fallback;
|
|
85
|
+
}
|
|
86
|
+
if (options.required !== true) {
|
|
87
|
+
return "";
|
|
88
|
+
}
|
|
89
|
+
options.write?.(" This one is required.\n");
|
|
90
|
+
}
|
|
91
|
+
throw new PromptAbandoned();
|
|
92
|
+
}
|
|
93
|
+
export async function askYesNo(ask, prompt, fallback, write) {
|
|
94
|
+
const suffix = fallback ? "[Y/n]" : "[y/N]";
|
|
95
|
+
for (let tries = 0; tries < MAX_TRIES; tries += 1) {
|
|
96
|
+
const answer = (await ask(`${prompt} ${suffix}: `)).toLowerCase();
|
|
97
|
+
if (answer.length === 0) {
|
|
98
|
+
return fallback;
|
|
99
|
+
}
|
|
100
|
+
if (answer === "y" || answer === "yes") {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
if (answer === "n" || answer === "no") {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
write?.(" Answer y or n.\n");
|
|
107
|
+
}
|
|
108
|
+
throw new PromptAbandoned();
|
|
109
|
+
}
|
|
110
|
+
/** A numbered list. Returns the chosen index. */
|
|
111
|
+
export async function askChoice(ask, write, prompt, choices) {
|
|
112
|
+
choices.forEach((choice, index) => {
|
|
113
|
+
write(` ${index + 1}) ${choice}\n`);
|
|
114
|
+
});
|
|
115
|
+
for (let tries = 0; tries < MAX_TRIES; tries += 1) {
|
|
116
|
+
const answer = await ask(`${prompt} (1-${choices.length}): `);
|
|
117
|
+
const picked = Number(answer);
|
|
118
|
+
if (Number.isInteger(picked) && picked >= 1 && picked <= choices.length) {
|
|
119
|
+
return picked - 1;
|
|
120
|
+
}
|
|
121
|
+
write(` Pick a number between 1 and ${choices.length}.\n`);
|
|
122
|
+
}
|
|
123
|
+
throw new PromptAbandoned();
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/operator/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type SetupInput = {
|
|
2
|
+
cwd: string;
|
|
3
|
+
argv: string[];
|
|
4
|
+
env: Record<string, string | undefined>;
|
|
5
|
+
write: (line: string) => void;
|
|
6
|
+
interruptFlag?: {
|
|
7
|
+
interrupted: boolean;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Bring the tracker to the shape a run expects.
|
|
12
|
+
*
|
|
13
|
+
* Host knows none of that shape: it resolves the manager, asks it for a plan,
|
|
14
|
+
* and prints what comes back. Without `--apply` nothing is written — creating
|
|
15
|
+
* anything on somebody's tracker is asked for, never assumed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function runSetup(input: SetupInput): Promise<number>;
|
|
18
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AASF;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDjE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { PRODUCT } from "@bluewombat/manager-kit";
|
|
2
|
+
import { parseArgs } from "../config/parse-args.js";
|
|
3
|
+
import { contextOf, loadManagerModule } from "../plugins/manager.js";
|
|
4
|
+
const MARKS = {
|
|
5
|
+
satisfied: "ok ",
|
|
6
|
+
missing: "todo",
|
|
7
|
+
applied: "done",
|
|
8
|
+
blocked: "FAIL",
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Bring the tracker to the shape a run expects.
|
|
12
|
+
*
|
|
13
|
+
* Host knows none of that shape: it resolves the manager, asks it for a plan,
|
|
14
|
+
* and prints what comes back. Without `--apply` nothing is written — creating
|
|
15
|
+
* anything on somebody's tracker is asked for, never assumed.
|
|
16
|
+
*/
|
|
17
|
+
export async function runSetup(input) {
|
|
18
|
+
const apply = input.argv.includes("--apply");
|
|
19
|
+
const argv = input.argv.filter((token) => token !== "--apply");
|
|
20
|
+
const parsed = parseArgs(argv, { cwd: input.cwd, checkPaths: false });
|
|
21
|
+
if (!parsed.ok) {
|
|
22
|
+
input.write(`${parsed.reason}\n`);
|
|
23
|
+
return 2;
|
|
24
|
+
}
|
|
25
|
+
const invocation = parsed.invocation;
|
|
26
|
+
const request = {
|
|
27
|
+
manager: invocation.manager,
|
|
28
|
+
managerOptions: invocation.managerOptions,
|
|
29
|
+
configDir: invocation.configDir,
|
|
30
|
+
durationMs: invocation.timeoutMs,
|
|
31
|
+
interruptFlag: input.interruptFlag ?? { interrupted: false },
|
|
32
|
+
env: input.env,
|
|
33
|
+
};
|
|
34
|
+
const loaded = await loadManagerModule(request);
|
|
35
|
+
if (!loaded.ok) {
|
|
36
|
+
input.write(`${loaded.reason}\n`);
|
|
37
|
+
return 2;
|
|
38
|
+
}
|
|
39
|
+
if (loaded.module.setupManager === undefined) {
|
|
40
|
+
input.write(`${invocation.manager} has nothing to set up.\n`);
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
const result = await loaded.module.setupManager(contextOf(request), { apply });
|
|
44
|
+
for (const step of result.steps) {
|
|
45
|
+
const detail = step.detail === undefined ? "" : ` — ${step.detail}`;
|
|
46
|
+
input.write(`${MARKS[step.state]} ${step.summary}${detail}\n`);
|
|
47
|
+
}
|
|
48
|
+
const blocked = result.steps.filter((step) => step.state === "blocked").length;
|
|
49
|
+
if (blocked > 0) {
|
|
50
|
+
input.write(`\n${blocked} step(s) blocked.\n`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
const missing = result.steps.filter((step) => step.state === "missing").length;
|
|
54
|
+
if (missing > 0) {
|
|
55
|
+
input.write(`\n${missing} step(s) to apply. Run: ${PRODUCT} setup --apply\n`);
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
const applied = result.steps.filter((step) => step.state === "applied").length;
|
|
59
|
+
input.write(applied > 0 ? `\n${applied} step(s) applied.\n` : "\nNothing to do.\n");
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/operator/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DiscoveredManager = {
|
|
2
|
+
name: string;
|
|
3
|
+
description?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* The manager packages installed near `fromDir`.
|
|
7
|
+
*
|
|
8
|
+
* Host has no list of trackers and must not grow one: a package is a manager
|
|
9
|
+
* because it says so in its own keywords, so a third-party one is found the
|
|
10
|
+
* same way the two shipped here are.
|
|
11
|
+
*/
|
|
12
|
+
export declare function discoverManagers(fromDir: string): DiscoveredManager[];
|
|
13
|
+
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAuBrE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { PRODUCT } from "@bluewombat/manager-kit";
|
|
4
|
+
/** What a package says about itself to be offered by `mason init`. */
|
|
5
|
+
const MANAGER_KEYWORD = `${PRODUCT}-manager`;
|
|
6
|
+
/**
|
|
7
|
+
* The manager packages installed near `fromDir`.
|
|
8
|
+
*
|
|
9
|
+
* Host has no list of trackers and must not grow one: a package is a manager
|
|
10
|
+
* because it says so in its own keywords, so a third-party one is found the
|
|
11
|
+
* same way the two shipped here are.
|
|
12
|
+
*/
|
|
13
|
+
export function discoverManagers(fromDir) {
|
|
14
|
+
const found = new Map();
|
|
15
|
+
let dir = resolve(fromDir);
|
|
16
|
+
for (;;) {
|
|
17
|
+
const modules = join(dir, "node_modules");
|
|
18
|
+
if (existsSync(modules)) {
|
|
19
|
+
for (const entry of safeList(modules)) {
|
|
20
|
+
if (entry.startsWith("@")) {
|
|
21
|
+
for (const scoped of safeList(join(modules, entry))) {
|
|
22
|
+
record(found, join(modules, entry, scoped));
|
|
23
|
+
}
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
record(found, join(modules, entry));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const parent = dirname(dir);
|
|
30
|
+
if (parent === dir) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
dir = parent;
|
|
34
|
+
}
|
|
35
|
+
return [...found.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
36
|
+
}
|
|
37
|
+
function safeList(path) {
|
|
38
|
+
try {
|
|
39
|
+
return readdirSync(path);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function record(found, packageRoot) {
|
|
46
|
+
const manifest = join(packageRoot, "package.json");
|
|
47
|
+
try {
|
|
48
|
+
if (!statSync(manifest).isFile()) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let parsed;
|
|
56
|
+
try {
|
|
57
|
+
parsed = JSON.parse(readFileSync(manifest, "utf8"));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (parsed === null || typeof parsed !== "object") {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const data = parsed;
|
|
66
|
+
if (typeof data.name !== "string" || !Array.isArray(data.keywords)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (!data.keywords.includes(MANAGER_KEYWORD)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// The nearest copy wins, the way an import would resolve it.
|
|
73
|
+
if (found.has(data.name)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
found.set(data.name, {
|
|
77
|
+
name: data.name,
|
|
78
|
+
...(typeof data.description === "string" ? { description: data.description } : {}),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/plugins/discover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { FoldBackend } from "@bluewombat/integrator";
|
|
2
|
+
import type { IsolationBackend } from "@bluewombat/isolator";
|
|
3
|
+
/** What is at a path today, held against the reference it should be a copy of. */
|
|
4
|
+
export type ReferenceCopyState = {
|
|
5
|
+
kind: "missing";
|
|
6
|
+
} | {
|
|
7
|
+
kind: "matches";
|
|
8
|
+
} | {
|
|
9
|
+
kind: "mismatch";
|
|
10
|
+
reason: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* One reference work line, read and understood by the strategy. Every method
|
|
14
|
+
* is bound to the value `parse` accepted, so nothing loosely typed travels
|
|
15
|
+
* past that call.
|
|
16
|
+
*/
|
|
17
|
+
export type ParsedReference = {
|
|
18
|
+
ok: true;
|
|
19
|
+
/** One line for `mason doctor` and the trace. */
|
|
20
|
+
summary: string;
|
|
21
|
+
/** The work line Host offers work to, and the Refresher's `--target`. */
|
|
22
|
+
target: string;
|
|
23
|
+
/** Offline. */
|
|
24
|
+
inspect(path: string): ReferenceCopyState;
|
|
25
|
+
/** Fetches a copy to `path`. Network. */
|
|
26
|
+
materialize(path: string): Promise<{
|
|
27
|
+
ok: true;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
reason: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* What every process that touches the work line must carry — the identity
|
|
34
|
+
* the system commits under, how it authenticates. Host hands it to the
|
|
35
|
+
* Publisher and the Refresher; it never puts it in its own environment, so
|
|
36
|
+
* a Builder does not inherit a credential.
|
|
37
|
+
*/
|
|
38
|
+
env?: Record<string, string> | undefined;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* How a strategy reads what a manager names as the reference work line. The
|
|
42
|
+
* words are agreed between the two packages with nothing checking them at
|
|
43
|
+
* compile time, so `parse` is strict: an unknown key, a missing one, a wrong
|
|
44
|
+
* type — each stops the run before it writes anything.
|
|
45
|
+
*/
|
|
46
|
+
export type ReferenceBackend = {
|
|
47
|
+
parse(raw: Record<string, unknown>): ParsedReference | {
|
|
48
|
+
ok: false;
|
|
49
|
+
reason: string;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export type IsolationStrategy = {
|
|
53
|
+
isolation: IsolationBackend;
|
|
54
|
+
fold: FoldBackend;
|
|
55
|
+
/** Absent: this strategy cannot keep a copy of a reference work line. */
|
|
56
|
+
reference?: ReferenceBackend;
|
|
57
|
+
/**
|
|
58
|
+
* The name this strategy gave the Child isolated under `id` — what a
|
|
59
|
+
* Publisher is handed as `--ref`. Absent: the id itself is the name.
|
|
60
|
+
*/
|
|
61
|
+
refOf?: (id: string) => string;
|
|
62
|
+
};
|
|
63
|
+
export type ResolveIsolationResult = {
|
|
64
|
+
ok: true;
|
|
65
|
+
strategy: IsolationStrategy;
|
|
66
|
+
specifier: string;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
reason: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Load the isolation strategy package named by `workLine.isolation`, shaped
|
|
73
|
+
* by `workLine.isolationOptions` when the config has any. Options handed to
|
|
74
|
+
* a package that takes none are a mistake to stop on, not to ignore: the
|
|
75
|
+
* operator meant them.
|
|
76
|
+
*/
|
|
77
|
+
export declare function resolveIsolationStrategy(name: string, fromDir: string, options?: Record<string, unknown>): Promise<ResolveIsolationResult>;
|
|
78
|
+
//# sourceMappingURL=isolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../../src/plugins/isolation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,kFAAkF;AAClF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,IAAI,CAAC;IACT,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,eAAe;IACf,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAC1C,yCAAyC;IACzC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CAC1C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACtF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,yEAAyE;IACzE,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAqDlC;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,sBAAsB,CAAC,CAiBjC"}
|