@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.
Files changed (151) hide show
  1. package/README.md +473 -0
  2. package/SPECS.md +303 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +172 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/defaults.d.ts +17 -0
  8. package/dist/config/defaults.d.ts.map +1 -0
  9. package/dist/config/defaults.js +17 -0
  10. package/dist/config/defaults.js.map +1 -0
  11. package/dist/config/find-config.d.ts +9 -0
  12. package/dist/config/find-config.d.ts.map +1 -0
  13. package/dist/config/find-config.js +25 -0
  14. package/dist/config/find-config.js.map +1 -0
  15. package/dist/config/home.d.ts +17 -0
  16. package/dist/config/home.d.ts.map +1 -0
  17. package/dist/config/home.js +23 -0
  18. package/dist/config/home.js.map +1 -0
  19. package/dist/config/load-config.d.ts +13 -0
  20. package/dist/config/load-config.d.ts.map +1 -0
  21. package/dist/config/load-config.js +537 -0
  22. package/dist/config/load-config.js.map +1 -0
  23. package/dist/config/parse-args.d.ts +25 -0
  24. package/dist/config/parse-args.d.ts.map +1 -0
  25. package/dist/config/parse-args.js +478 -0
  26. package/dist/config/parse-args.js.map +1 -0
  27. package/dist/config/types.d.ts +144 -0
  28. package/dist/config/types.d.ts.map +1 -0
  29. package/dist/config/types.js +2 -0
  30. package/dist/config/types.js.map +1 -0
  31. package/dist/index.d.ts +30 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +16 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/loop/authority.d.ts +51 -0
  36. package/dist/loop/authority.d.ts.map +1 -0
  37. package/dist/loop/authority.js +166 -0
  38. package/dist/loop/authority.js.map +1 -0
  39. package/dist/loop/context.d.ts +44 -0
  40. package/dist/loop/context.d.ts.map +1 -0
  41. package/dist/loop/context.js +2 -0
  42. package/dist/loop/context.js.map +1 -0
  43. package/dist/loop/cursor.d.ts +4 -0
  44. package/dist/loop/cursor.d.ts.map +1 -0
  45. package/dist/loop/cursor.js +20 -0
  46. package/dist/loop/cursor.js.map +1 -0
  47. package/dist/loop/deliveries.d.ts +22 -0
  48. package/dist/loop/deliveries.d.ts.map +1 -0
  49. package/dist/loop/deliveries.js +240 -0
  50. package/dist/loop/deliveries.js.map +1 -0
  51. package/dist/loop/describe.d.ts +40 -0
  52. package/dist/loop/describe.d.ts.map +1 -0
  53. package/dist/loop/describe.js +48 -0
  54. package/dist/loop/describe.js.map +1 -0
  55. package/dist/loop/drive.d.ts +15 -0
  56. package/dist/loop/drive.d.ts.map +1 -0
  57. package/dist/loop/drive.js +42 -0
  58. package/dist/loop/drive.js.map +1 -0
  59. package/dist/loop/journal.d.ts +22 -0
  60. package/dist/loop/journal.d.ts.map +1 -0
  61. package/dist/loop/journal.js +49 -0
  62. package/dist/loop/journal.js.map +1 -0
  63. package/dist/loop/lock.d.ts +11 -0
  64. package/dist/loop/lock.d.ts.map +1 -0
  65. package/dist/loop/lock.js +60 -0
  66. package/dist/loop/lock.js.map +1 -0
  67. package/dist/loop/message.d.ts +34 -0
  68. package/dist/loop/message.d.ts.map +1 -0
  69. package/dist/loop/message.js +48 -0
  70. package/dist/loop/message.js.map +1 -0
  71. package/dist/loop/open-host.d.ts +13 -0
  72. package/dist/loop/open-host.d.ts.map +1 -0
  73. package/dist/loop/open-host.js +180 -0
  74. package/dist/loop/open-host.js.map +1 -0
  75. package/dist/loop/probe.d.ts +9 -0
  76. package/dist/loop/probe.d.ts.map +1 -0
  77. package/dist/loop/probe.js +57 -0
  78. package/dist/loop/probe.js.map +1 -0
  79. package/dist/loop/report.d.ts +26 -0
  80. package/dist/loop/report.d.ts.map +1 -0
  81. package/dist/loop/report.js +328 -0
  82. package/dist/loop/report.js.map +1 -0
  83. package/dist/loop/tick.d.ts +24 -0
  84. package/dist/loop/tick.d.ts.map +1 -0
  85. package/dist/loop/tick.js +169 -0
  86. package/dist/loop/tick.js.map +1 -0
  87. package/dist/loop/trace.d.ts +16 -0
  88. package/dist/loop/trace.d.ts.map +1 -0
  89. package/dist/loop/trace.js +49 -0
  90. package/dist/loop/trace.js.map +1 -0
  91. package/dist/loop/transformers.d.ts +27 -0
  92. package/dist/loop/transformers.d.ts.map +1 -0
  93. package/dist/loop/transformers.js +229 -0
  94. package/dist/loop/transformers.js.map +1 -0
  95. package/dist/loop/work-line.d.ts +73 -0
  96. package/dist/loop/work-line.d.ts.map +1 -0
  97. package/dist/loop/work-line.js +109 -0
  98. package/dist/loop/work-line.js.map +1 -0
  99. package/dist/operator/board.d.ts +31 -0
  100. package/dist/operator/board.d.ts.map +1 -0
  101. package/dist/operator/board.js +67 -0
  102. package/dist/operator/board.js.map +1 -0
  103. package/dist/operator/cancel.d.ts +19 -0
  104. package/dist/operator/cancel.d.ts.map +1 -0
  105. package/dist/operator/cancel.js +70 -0
  106. package/dist/operator/cancel.js.map +1 -0
  107. package/dist/operator/doctor.d.ts +15 -0
  108. package/dist/operator/doctor.d.ts.map +1 -0
  109. package/dist/operator/doctor.js +416 -0
  110. package/dist/operator/doctor.js.map +1 -0
  111. package/dist/operator/git-remote.d.ts +39 -0
  112. package/dist/operator/git-remote.d.ts.map +1 -0
  113. package/dist/operator/git-remote.js +78 -0
  114. package/dist/operator/git-remote.js.map +1 -0
  115. package/dist/operator/init.d.ts +28 -0
  116. package/dist/operator/init.d.ts.map +1 -0
  117. package/dist/operator/init.js +522 -0
  118. package/dist/operator/init.js.map +1 -0
  119. package/dist/operator/live.d.ts +19 -0
  120. package/dist/operator/live.d.ts.map +1 -0
  121. package/dist/operator/live.js +149 -0
  122. package/dist/operator/live.js.map +1 -0
  123. package/dist/operator/prompt.d.ts +35 -0
  124. package/dist/operator/prompt.d.ts.map +1 -0
  125. package/dist/operator/prompt.js +125 -0
  126. package/dist/operator/prompt.js.map +1 -0
  127. package/dist/operator/setup.d.ts +18 -0
  128. package/dist/operator/setup.d.ts.map +1 -0
  129. package/dist/operator/setup.js +62 -0
  130. package/dist/operator/setup.js.map +1 -0
  131. package/dist/plugins/discover.d.ts +13 -0
  132. package/dist/plugins/discover.d.ts.map +1 -0
  133. package/dist/plugins/discover.js +81 -0
  134. package/dist/plugins/discover.js.map +1 -0
  135. package/dist/plugins/isolation.d.ts +78 -0
  136. package/dist/plugins/isolation.d.ts.map +1 -0
  137. package/dist/plugins/isolation.js +64 -0
  138. package/dist/plugins/isolation.js.map +1 -0
  139. package/dist/plugins/load.d.ts +35 -0
  140. package/dist/plugins/load.d.ts.map +1 -0
  141. package/dist/plugins/load.js +109 -0
  142. package/dist/plugins/load.js.map +1 -0
  143. package/dist/plugins/manager.d.ts +43 -0
  144. package/dist/plugins/manager.d.ts.map +1 -0
  145. package/dist/plugins/manager.js +47 -0
  146. package/dist/plugins/manager.js.map +1 -0
  147. package/dist/plugins/persist.d.ts +33 -0
  148. package/dist/plugins/persist.d.ts.map +1 -0
  149. package/dist/plugins/persist.js +26 -0
  150. package/dist/plugins/persist.js.map +1 -0
  151. package/package.json +66 -0
@@ -0,0 +1,109 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { ISOLATION_GIT } from "../config/defaults.js";
5
+ import { inHome } from "../config/home.js";
6
+ /** What is at that path today. Integrator folds by merge only on a git tree. */
7
+ export function inspectWorkLine(path) {
8
+ if (!existsSync(path)) {
9
+ return { kind: "missing" };
10
+ }
11
+ if (!statSync(path).isDirectory()) {
12
+ return { kind: "not-a-directory" };
13
+ }
14
+ if (!existsSync(join(path, ".git"))) {
15
+ return { kind: "plain" };
16
+ }
17
+ return { kind: "git", branch: branchOf(path) };
18
+ }
19
+ /**
20
+ * `symbolic-ref` first: it answers on a repository with no commit yet, where
21
+ * `rev-parse HEAD` has nothing to resolve. `rev-parse` is the fallback for a
22
+ * detached HEAD.
23
+ */
24
+ function branchOf(path) {
25
+ const symbolic = git(["symbolic-ref", "--short", "HEAD"], path);
26
+ if (symbolic.ok && symbolic.stdout.trim().length > 0) {
27
+ return symbolic.stdout.trim();
28
+ }
29
+ const revision = git(["rev-parse", "--short", "HEAD"], path);
30
+ return revision.ok ? `detached at ${revision.stdout.trim()}` : "unknown";
31
+ }
32
+ /** Offline. Everything here reads; `materializeWorkLine` is the one write. */
33
+ export function resolveWorkLine(input) {
34
+ // A reference is where an Authority keeps the work line. With none, the
35
+ // fold lands here and is final, so the directory is the operator's — even
36
+ // when the manager could name one.
37
+ if (input.reference === undefined || !input.wantsAuthority) {
38
+ if (input.stable === undefined) {
39
+ const why = input.wantsAuthority
40
+ ? `${input.manager} names no reference work line to copy from`
41
+ : "without an Authority the fold lands here and is final";
42
+ return {
43
+ kind: "invalid",
44
+ reason: `"workLine.stable" is not set, and ${why}. Set it to the directory the work is folded into.`,
45
+ };
46
+ }
47
+ return { kind: "operators", stable: input.stable };
48
+ }
49
+ const backend = input.strategy.reference;
50
+ if (backend === undefined) {
51
+ const reason = `${input.manager} names a reference work line, but ${input.strategyName} cannot keep a copy of one.`;
52
+ if (input.stable === undefined) {
53
+ return {
54
+ kind: "invalid",
55
+ reason: `${reason} Set "workLine.stable" to a copy you maintain, or use a strategy that can (e.g. "${ISOLATION_GIT}").`,
56
+ };
57
+ }
58
+ return { kind: "unchecked", stable: input.stable, reason };
59
+ }
60
+ const parsed = backend.parse(input.reference);
61
+ if (!parsed.ok) {
62
+ return {
63
+ kind: "invalid",
64
+ reason: `${input.strategyName} cannot read the reference work line ${input.manager} names: ${parsed.reason}.`,
65
+ };
66
+ }
67
+ if (input.branch !== undefined && input.branch !== parsed.target) {
68
+ return {
69
+ kind: "invalid",
70
+ reason: `"workLine.branch" is "${input.branch}", but ${input.manager} names "${parsed.target}" as the reference. Drop the key, or make them agree.`,
71
+ };
72
+ }
73
+ const stable = input.stable ?? inHome(input.home, "workLine");
74
+ return {
75
+ kind: "copy",
76
+ stable,
77
+ target: parsed.target,
78
+ reference: parsed,
79
+ state: parsed.inspect(stable),
80
+ };
81
+ }
82
+ /**
83
+ * Bring a `copy` resolution to a directory a run can use: fetch a missing one,
84
+ * refuse a directory that is not a copy of the reference. Network.
85
+ */
86
+ export async function materializeWorkLine(resolution) {
87
+ if (resolution.state.kind === "matches") {
88
+ return { ok: true, fetched: false };
89
+ }
90
+ if (resolution.state.kind === "mismatch") {
91
+ return {
92
+ ok: false,
93
+ reason: `${resolution.stable} is not a copy of ${resolution.reference.summary}: ${resolution.state.reason}. Move it, or point "workLine.stable" elsewhere.`,
94
+ };
95
+ }
96
+ const made = await resolution.reference.materialize(resolution.stable);
97
+ if (!made.ok) {
98
+ return {
99
+ ok: false,
100
+ reason: `Cannot copy ${resolution.reference.summary} to ${resolution.stable}: ${made.reason}`,
101
+ };
102
+ }
103
+ return { ok: true, fetched: true };
104
+ }
105
+ function git(argv, cwd) {
106
+ const result = spawnSync("git", argv, { encoding: "utf8", cwd });
107
+ return { ok: result.status === 0, stdout: result.stdout ?? "" };
108
+ }
109
+ //# sourceMappingURL=work-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-line.js","sourceRoot":"","sources":["../../src/loop/work-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WorkLedger } from "@bluewombat/work-ledger";
2
+ export type BoardFeature = {
3
+ key: string;
4
+ project: string;
5
+ state: string;
6
+ priority: number;
7
+ received_at: number;
8
+ bail_expires_at?: number;
9
+ attempts_used?: number;
10
+ subtasks?: {
11
+ id: string;
12
+ state: string;
13
+ }[];
14
+ escalation?: {
15
+ kind: string;
16
+ subtask_id?: string;
17
+ };
18
+ invalid?: {
19
+ code: string;
20
+ reason: string;
21
+ };
22
+ submission?: {
23
+ reference: string;
24
+ refusals: number;
25
+ last_report?: string;
26
+ };
27
+ line: string;
28
+ };
29
+ export declare function boardOf(ledger: WorkLedger): Promise<BoardFeature[]>;
30
+ export declare function jsonOf(rows: BoardFeature[]): unknown;
31
+ //# sourceMappingURL=board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../src/operator/board.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoC,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAG5F,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,UAAU,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAsB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAQzE;AAyDD,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,67 @@
1
+ import { describeFeature } from "../loop/trace.js";
2
+ export async function boardOf(ledger) {
3
+ const summaries = await ledger.list();
4
+ const rows = [];
5
+ for (const summary of summaries) {
6
+ const got = await ledger.get(summary.key);
7
+ rows.push(got.ok ? rowOf(got.aggregate) : rowFromSummary(summary));
8
+ }
9
+ return rows;
10
+ }
11
+ function rowFromSummary(summary) {
12
+ const row = {
13
+ key: summary.key,
14
+ project: summary.project,
15
+ state: summary.state,
16
+ priority: summary.priority,
17
+ received_at: summary.received_at,
18
+ line: `${summary.key} ${summary.state}`,
19
+ };
20
+ if (summary.bail_expires_at !== undefined) {
21
+ row.bail_expires_at = summary.bail_expires_at;
22
+ }
23
+ return row;
24
+ }
25
+ function rowOf(aggregate) {
26
+ const row = {
27
+ key: aggregate.intention.key,
28
+ project: aggregate.intention.project,
29
+ state: aggregate.state,
30
+ priority: aggregate.intention.priority,
31
+ received_at: aggregate.received_at,
32
+ attempts_used: aggregate.attempts_used,
33
+ line: describeFeature(aggregate),
34
+ };
35
+ if (aggregate.bail !== undefined) {
36
+ row.bail_expires_at = aggregate.bail.expires_at;
37
+ }
38
+ if (aggregate.plan !== undefined) {
39
+ row.subtasks = aggregate.plan.subtasks.map((subtask) => ({
40
+ id: subtask.id,
41
+ state: subtask.state,
42
+ }));
43
+ }
44
+ if (aggregate.escalation !== undefined) {
45
+ row.escalation = { kind: aggregate.escalation.kind };
46
+ if (aggregate.escalation.subtask_id !== undefined) {
47
+ row.escalation.subtask_id = aggregate.escalation.subtask_id;
48
+ }
49
+ }
50
+ if (aggregate.invalid !== undefined) {
51
+ row.invalid = { code: aggregate.invalid.code, reason: aggregate.invalid.reason };
52
+ }
53
+ if (aggregate.submission !== undefined) {
54
+ row.submission = {
55
+ reference: aggregate.submission.reference,
56
+ refusals: aggregate.submission.refusals,
57
+ };
58
+ if (aggregate.submission.last_report !== undefined) {
59
+ row.submission.last_report = aggregate.submission.last_report;
60
+ }
61
+ }
62
+ return row;
63
+ }
64
+ export function jsonOf(rows) {
65
+ return rows.map(({ line, ...rest }) => rest);
66
+ }
67
+ //# sourceMappingURL=board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../src/operator/board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type CancelInput = {
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
+ * Abandon one Feature by key.
12
+ *
13
+ * The team still abandons in the FeatureManager. This is the hatch when the
14
+ * tracker cannot say the intention is gone — a manager with no `probe`, or
15
+ * an operator who already knows — and the ledger would otherwise freeze the
16
+ * Project. It takes the ledger lock: stop `run` first if it holds it.
17
+ */
18
+ export declare function runCancel(input: CancelInput): Promise<number>;
19
+ //# sourceMappingURL=cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/operator/cancel.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDnE"}
@@ -0,0 +1,70 @@
1
+ import { PRODUCT } from "@bluewombat/manager-kit";
2
+ import { parseArgs } from "../config/parse-args.js";
3
+ import { openHost } from "../loop/open-host.js";
4
+ /**
5
+ * Abandon one Feature by key.
6
+ *
7
+ * The team still abandons in the FeatureManager. This is the hatch when the
8
+ * tracker cannot say the intention is gone — a manager with no `probe`, or
9
+ * an operator who already knows — and the ledger would otherwise freeze the
10
+ * Project. It takes the ledger lock: stop `run` first if it holds it.
11
+ */
12
+ export async function runCancel(input) {
13
+ const peeled = peelKey(input.argv);
14
+ if (peeled.key === undefined) {
15
+ input.write(`Usage: ${PRODUCT} cancel <key>\n`);
16
+ return 2;
17
+ }
18
+ const { key } = peeled;
19
+ const parsed = parseArgs(peeled.rest, { cwd: input.cwd });
20
+ if (!parsed.ok) {
21
+ input.write(`${parsed.reason}\n`);
22
+ return 2;
23
+ }
24
+ const interruptFlag = input.interruptFlag ?? { interrupted: false };
25
+ const options = {
26
+ ...parsed.invocation,
27
+ interruptFlag,
28
+ ...(input.env === undefined ? {} : { env: input.env }),
29
+ };
30
+ let host;
31
+ try {
32
+ host = await openHost(options);
33
+ const result = await host.cancel(key);
34
+ if (result.ok) {
35
+ input.write(`Cancelled ${key}.\n`);
36
+ return 0;
37
+ }
38
+ switch (result.code) {
39
+ case "already-cancelled":
40
+ input.write(`Already cancelled.\n`);
41
+ return 0;
42
+ case "not-found":
43
+ input.write(`No Feature named "${key}" in the ledger.\n`);
44
+ return 2;
45
+ case "done":
46
+ input.write("Too late: that Feature is already done.\n");
47
+ return 1;
48
+ case "point-of-no-return":
49
+ input.write("Too late: abandon is refused after merging.\n");
50
+ return 1;
51
+ }
52
+ return 2;
53
+ }
54
+ catch (error) {
55
+ input.write(`${error instanceof Error ? error.message : String(error)}\n`);
56
+ return 2;
57
+ }
58
+ finally {
59
+ await host?.close();
60
+ }
61
+ }
62
+ /** The key is the first positional: `cancel <key> [flags]`. */
63
+ function peelKey(argv) {
64
+ const first = argv[0];
65
+ if (first === undefined || first.startsWith("-")) {
66
+ return { key: undefined, rest: argv };
67
+ }
68
+ return { key: first, rest: argv.slice(1) };
69
+ }
70
+ //# sourceMappingURL=cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../src/operator/cancel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAUhD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAkB;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,CAAC,KAAK,CAAC,UAAU,OAAO,iBAAiB,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IAEvB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACpE,MAAM,OAAO,GAAgB;QAC3B,GAAG,MAAM,CAAC,UAAU;QACpB,aAAa;QACb,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;KACvD,CAAC;IACF,IAAI,IAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,CAAC;YACnC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,mBAAmB;gBACtB,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACpC,OAAO,CAAC,CAAC;YACX,KAAK,WAAW;gBACd,KAAK,CAAC,KAAK,CAAC,qBAAqB,GAAG,oBAAoB,CAAC,CAAC;gBAC1D,OAAO,CAAC,CAAC;YACX,KAAK,MAAM;gBACT,KAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBACzD,OAAO,CAAC,CAAC;YACX,KAAK,oBAAoB;gBACvB,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAC7D,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type DoctorInput = {
2
+ cwd: string;
3
+ argv: string[];
4
+ env: Record<string, string | undefined>;
5
+ write: (line: string) => void;
6
+ /** Defaults to the running one. Named so the check itself stays testable. */
7
+ nodeVersion?: string;
8
+ };
9
+ /**
10
+ * Say what is missing before a run says it. Nothing here uses the network:
11
+ * the answer must be the same offline, and a manager's own check is held to
12
+ * the same rule.
13
+ */
14
+ export declare function runDoctor(input: DoctorInput): Promise<number>;
15
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/operator/doctor.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,WAAW,GAAG;IACxB,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,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAIF;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA0EnE"}