@intentius/chant 0.124.48 → 0.124.49
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/dist/cli/handlers/approve.d.ts.map +1 -1
- package/dist/cli/handlers/approve.js +20 -12
- package/dist/cli/handlers/graph-reader.d.ts +26 -0
- package/dist/cli/handlers/graph-reader.d.ts.map +1 -0
- package/dist/cli/handlers/graph-reader.js +41 -0
- package/dist/cli/handlers/graph.d.ts.map +1 -1
- package/dist/cli/handlers/graph.js +14 -0
- package/dist/cli/handlers/pr.d.ts.map +1 -1
- package/dist/cli/handlers/pr.js +40 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +22 -0
- package/dist/cli/parse-args.d.ts.map +1 -1
- package/dist/cli/parse-args.js +11 -0
- package/dist/cli/registry.d.ts +8 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/components/pr-run.d.ts +3 -0
- package/dist/components/pr-run.d.ts.map +1 -1
- package/dist/components/pr-run.js +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/gate-decision.d.ts +9 -0
- package/dist/gate-decision.d.ts.map +1 -1
- package/dist/gate-decision.js +22 -7
- package/dist/lexicon.d.ts +23 -0
- package/dist/lexicon.d.ts.map +1 -1
- package/dist/op/activities/activity-contracts.d.ts +4 -4
- package/dist/op/gate-approval-base.d.ts +25 -0
- package/dist/op/gate-approval-base.d.ts.map +1 -0
- package/dist/op/gate-approval-base.js +71 -0
- package/dist/op/gate-approval.d.ts +7 -4
- package/dist/op/gate-approval.d.ts.map +1 -1
- package/dist/op/gate-approval.js +2 -25
- package/dist/op/gate-name.d.ts +13 -0
- package/dist/op/gate-name.d.ts.map +1 -1
- package/dist/op/gate-name.js +14 -1
- package/dist/op/gate.d.ts +4 -3
- package/dist/op/gate.d.ts.map +1 -1
- package/dist/op/local-executor.d.ts +9 -2
- package/dist/op/local-executor.d.ts.map +1 -1
- package/dist/op/local-executor.js +24 -5
- package/dist/pr-loop.d.ts +10 -0
- package/dist/pr-loop.d.ts.map +1 -1
- package/dist/pr-loop.js +4 -0
- package/dist/pr-migrations.d.ts +62 -0
- package/dist/pr-migrations.d.ts.map +1 -0
- package/dist/pr-migrations.js +50 -0
- package/dist/pr-post.js +1 -1
- package/dist/wave-runtime.mjs +219 -218
- package/dist/workspace/check.schema.json +4 -2
- package/dist/workspace/checks/gate-approval.d.ts +58 -0
- package/dist/workspace/checks/gate-approval.d.ts.map +1 -0
- package/dist/workspace/checks/gate-approval.js +103 -0
- package/dist/workspace/checks.d.ts +1 -0
- package/dist/workspace/checks.d.ts.map +1 -1
- package/dist/workspace/checks.js +4 -0
- package/dist/workspace/declaration.d.ts +7 -0
- package/dist/workspace/declaration.d.ts.map +1 -1
- package/dist/workspace/declaration.js +13 -1
- package/dist/workspace/declaration.schema.json +33 -0
- package/dist/workspace/exit-cli.d.ts +44 -0
- package/dist/workspace/exit-cli.d.ts.map +1 -0
- package/dist/workspace/exit-cli.js +198 -0
- package/dist/workspace/exit.d.ts +159 -0
- package/dist/workspace/exit.d.ts.map +1 -0
- package/dist/workspace/exit.js +480 -0
- package/dist/workspace/exit.schema.json +257 -0
- package/dist/workspace/graph-cache.d.ts +3 -1
- package/dist/workspace/graph-cache.d.ts.map +1 -1
- package/dist/workspace/graph-cache.js +12 -1
- package/dist/workspace/import-fetch.d.ts +38 -0
- package/dist/workspace/import-fetch.d.ts.map +1 -0
- package/dist/workspace/import-fetch.js +99 -0
- package/dist/workspace/import-init.d.ts +26 -0
- package/dist/workspace/import-init.d.ts.map +1 -0
- package/dist/workspace/import-init.js +130 -0
- package/dist/workspace/import-source.d.ts +147 -0
- package/dist/workspace/import-source.d.ts.map +1 -0
- package/dist/workspace/import-source.js +370 -0
- package/dist/workspace/init.d.ts +4 -0
- package/dist/workspace/init.d.ts.map +1 -1
- package/dist/workspace/init.js +70 -3
- package/dist/workspace/kind-readers.d.ts +6 -0
- package/dist/workspace/kind-readers.d.ts.map +1 -1
- package/dist/workspace/kind-readers.js +18 -0
- package/dist/workspace/kinds.d.ts +24 -1
- package/dist/workspace/kinds.d.ts.map +1 -1
- package/dist/workspace/kinds.js +64 -4
- package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
- package/dist/workspace/lineage-upgrade.js +13 -4
- package/dist/workspace/new-migrations.d.ts +47 -0
- package/dist/workspace/new-migrations.d.ts.map +1 -0
- package/dist/workspace/new-migrations.js +91 -0
- package/dist/workspace/pr-report.schema.json +46 -0
- package/dist/workspace/promote.d.ts +96 -0
- package/dist/workspace/promote.d.ts.map +1 -0
- package/dist/workspace/promote.js +263 -0
- package/dist/workspace/reason-codes.d.ts +13 -0
- package/dist/workspace/reason-codes.d.ts.map +1 -1
- package/dist/workspace/reason-codes.js +14 -0
- package/dist/workspace/search-contract.d.ts +1 -1
- package/dist/workspace/search-contract.d.ts.map +1 -1
- package/dist/workspace/workspace-kinds.schema.json +50 -7
- package/package.json +1 -1
- package/src/cli/handlers/approve.ts +10 -2
- package/src/cli/handlers/graph-reader.test.ts +31 -0
- package/src/cli/handlers/graph-reader.ts +51 -0
- package/src/cli/handlers/graph.ts +14 -0
- package/src/cli/handlers/pr.ts +38 -1
- package/src/cli/main.test.ts +2 -0
- package/src/cli/main.ts +22 -0
- package/src/cli/parse-args.ts +8 -0
- package/src/cli/registry.ts +8 -0
- package/src/components/pr-env-run-bundle.test.ts +1 -0
- package/src/components/pr-run.ts +4 -0
- package/src/config.ts +16 -0
- package/src/gate-decision-bundle.test.ts +4 -2
- package/src/gate-decision-identity.test.ts +11 -0
- package/src/gate-decision.ts +26 -6
- package/src/lexicon.ts +24 -0
- package/src/op/gate-approval-at-base.test.ts +97 -0
- package/src/op/gate-approval-base.ts +72 -0
- package/src/op/gate-approval.ts +10 -21
- package/src/op/gate-name.ts +16 -1
- package/src/op/gate.ts +4 -3
- package/src/op/local-executor.ts +25 -5
- package/src/pr-loop-bundle.test.ts +3 -2
- package/src/pr-loop.test.ts +52 -0
- package/src/pr-loop.ts +12 -0
- package/src/pr-migrations.ts +97 -0
- package/src/pr-post.ts +1 -1
- package/src/workspace/__fixtures__/import/spacelift.json +9 -0
- package/src/workspace/__fixtures__/import/tfc.json +13 -0
- package/src/workspace/behold-kinds.test.ts +1 -0
- package/src/workspace/check-contract.test.ts +3 -2
- package/src/workspace/check.schema.json +4 -2
- package/src/workspace/checks/gate-approval.test.ts +77 -0
- package/src/workspace/checks/gate-approval.ts +121 -0
- package/src/workspace/checks.ts +4 -0
- package/src/workspace/declaration.schema.json +33 -0
- package/src/workspace/declaration.ts +19 -2
- package/src/workspace/exit-cli.ts +219 -0
- package/src/workspace/exit.schema.json +257 -0
- package/src/workspace/exit.test.ts +185 -0
- package/src/workspace/exit.ts +560 -0
- package/src/workspace/graph-cache.ts +12 -2
- package/src/workspace/identity.test.ts +18 -3
- package/src/workspace/import-fetch.ts +151 -0
- package/src/workspace/import-init.ts +147 -0
- package/src/workspace/import-source.test.ts +183 -0
- package/src/workspace/import-source.ts +462 -0
- package/src/workspace/init.test.ts +55 -1
- package/src/workspace/init.ts +66 -4
- package/src/workspace/kind-readers.test.ts +36 -0
- package/src/workspace/kind-readers.ts +18 -1
- package/src/workspace/kinds.test.ts +23 -0
- package/src/workspace/kinds.ts +81 -5
- package/src/workspace/lineage-upgrade.test.ts +20 -0
- package/src/workspace/lineage-upgrade.ts +16 -7
- package/src/workspace/new-migrations.test.ts +98 -0
- package/src/workspace/new-migrations.ts +109 -0
- package/src/workspace/pr-report.schema.json +46 -0
- package/src/workspace/promote.test.ts +114 -0
- package/src/workspace/promote.ts +302 -0
- package/src/workspace/reason-codes.test.ts +4 -0
- package/src/workspace/reason-codes.ts +14 -0
- package/src/workspace/workspace-kinds.schema.json +50 -7
|
@@ -20,6 +20,12 @@
|
|
|
20
20
|
* package, found from the workspace root as the kind's pin was. The lexicon
|
|
21
21
|
* chant loads is then the one the declaration pins.
|
|
22
22
|
*
|
|
23
|
+
* A kind whose `graph` names a `reader` module instead (#4413) gets a
|
|
24
|
+
* project with `lexicons: []` and `graph.reader` set to the module, which the
|
|
25
|
+
* supplying package ships, so any package can supply one. The member's own
|
|
26
|
+
* `chant graph` loads it there, under the member's toolchain, and prints the
|
|
27
|
+
* IR it returns. There is no lexicon to link.
|
|
28
|
+
*
|
|
23
29
|
* Nothing is written under the workspace, and the projects are removed when
|
|
24
30
|
* the read ends. A lexicon that can't be found where its pin says fails the
|
|
25
31
|
* member with `command-failed` and says what to install; the other members
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kind-readers.d.ts","sourceRoot":"","sources":["../../src/workspace/kind-readers.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"kind-readers.d.ts","sourceRoot":"","sources":["../../src/workspace/kind-readers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAW,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,WAAW,eAAe;IAC9B,4FAA4F;IAC5F,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,gEAAgE;IAChE,OAAO,IAAI,IAAI,CAAC;CACjB;AAoCD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CA8ClF"}
|
|
@@ -20,6 +20,12 @@
|
|
|
20
20
|
* package, found from the workspace root as the kind's pin was. The lexicon
|
|
21
21
|
* chant loads is then the one the declaration pins.
|
|
22
22
|
*
|
|
23
|
+
* A kind whose `graph` names a `reader` module instead (#4413) gets a
|
|
24
|
+
* project with `lexicons: []` and `graph.reader` set to the module, which the
|
|
25
|
+
* supplying package ships, so any package can supply one. The member's own
|
|
26
|
+
* `chant graph` loads it there, under the member's toolchain, and prints the
|
|
27
|
+
* IR it returns. There is no lexicon to link.
|
|
28
|
+
*
|
|
23
29
|
* Nothing is written under the workspace, and the projects are removed when
|
|
24
30
|
* the read ends. A lexicon that can't be found where its pin says fails the
|
|
25
31
|
* member with `command-failed` and says what to install; the other members
|
|
@@ -47,6 +53,8 @@ function real(path) {
|
|
|
47
53
|
/** Why a unit's lexicon can't be loaded from `root`, or the `node_modules` to link. */
|
|
48
54
|
function lexiconModules(unit, root) {
|
|
49
55
|
const reader = unit.reader;
|
|
56
|
+
if (!reader.lexicon)
|
|
57
|
+
return { message: `kind ${unit.kind} names no lexicon` };
|
|
50
58
|
const name = lexiconPackageName(reader.lexicon);
|
|
51
59
|
const installed = findInstalledPackage(name, root);
|
|
52
60
|
if (!installed) {
|
|
@@ -80,6 +88,16 @@ export function prepareKindReaders(plan, root) {
|
|
|
80
88
|
group.units = group.units.filter((unit) => {
|
|
81
89
|
if (!unit.reader)
|
|
82
90
|
return true;
|
|
91
|
+
if (unit.reader.readerFile) {
|
|
92
|
+
// A graph reader module (#4413): no lexicon and no node_modules link. The module sits in the pinned package and resolves its own imports from there.
|
|
93
|
+
scratch ?? (scratch = mkdtempSync(join(tmpdir(), "chant-ws-reader-")));
|
|
94
|
+
const project = join(scratch, unit.id);
|
|
95
|
+
mkdirSync(project, { recursive: true });
|
|
96
|
+
const config = substituteGraphConfig(unit.reader.config, { member: unit.member, dir: unit.abs, workspace: root });
|
|
97
|
+
writeFileSync(join(project, "chant.config.json"), `${JSON.stringify({ lexicons: [], graph: { lint: "report", reader: { module: unit.reader.readerFile, config } } }, null, 2)}\n`);
|
|
98
|
+
unit.abs = project;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
83
101
|
const found = lexiconModules(unit, root);
|
|
84
102
|
if ("message" in found) {
|
|
85
103
|
failed.push({ name: unit.member, dir: unit.dir, kind: unit.kind, reason: { code: "command-failed", message: found.message } });
|
|
@@ -61,6 +61,21 @@ export interface FileProbe {
|
|
|
61
61
|
in: string[];
|
|
62
62
|
starts: string[];
|
|
63
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* A file directly in the directory whose name matches one of `in` parses
|
|
66
|
+
* as YAML or JSON (every document of a multi-document file is read), and
|
|
67
|
+
* one document satisfies one of the `match` entries. An entry maps JSON
|
|
68
|
+
* Pointers to the values allowed there, and a document satisfies it when
|
|
69
|
+
* every pointer holds a value that matches one of its patterns. A `*` in
|
|
70
|
+
* a pattern matches any run of characters, so `["*"]` means "has a
|
|
71
|
+
* value". This is how an Argo Application, a Flux Kustomization and a
|
|
72
|
+
* CloudFormation template are found by what they say, not by their file
|
|
73
|
+
* names (#3179). A file that doesn't parse is no evidence either way.
|
|
74
|
+
*/
|
|
75
|
+
anyDocument?: {
|
|
76
|
+
in: string[];
|
|
77
|
+
match: Record<string, string[]>[];
|
|
78
|
+
};
|
|
64
79
|
}
|
|
65
80
|
/** A string, integer or boolean field a kind declares for its members (#3151). */
|
|
66
81
|
export interface ScalarKindField {
|
|
@@ -118,7 +133,15 @@ export type KindOutputs =
|
|
|
118
133
|
* chant writes itself. See {@link substituteGraphConfig} for the placeholders.
|
|
119
134
|
*/
|
|
120
135
|
export interface KindGraph {
|
|
121
|
-
lexicon
|
|
136
|
+
/** The lexicon that reads the member; unset when `reader` is. */
|
|
137
|
+
lexicon?: string;
|
|
138
|
+
/**
|
|
139
|
+
* A graph reader module (#4413), as the kinds file names it: a path inside
|
|
140
|
+
* the supplying package, which may be any package. Unset when `lexicon` is.
|
|
141
|
+
*/
|
|
142
|
+
reader?: string;
|
|
143
|
+
/** The reader module, absolute; set once the package directory is known. */
|
|
144
|
+
readerFile?: string;
|
|
122
145
|
config: Record<string, unknown>;
|
|
123
146
|
}
|
|
124
147
|
export interface MemberKind {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../../src/workspace/kinds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG5C,OAAO,EAAoB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAItE,eAAO,MAAM,eAAe,QAAa,CAAC;AAE1C,oDAAoD;AACpD,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C;;;;;OAKG;IACH,UAAU,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClD;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../../src/workspace/kinds.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace/kinds.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* kinds claim one directory, the highest precedence decides, and a tie
|
|
17
17
|
* fails ({@link resolveKind}).
|
|
18
18
|
*/
|
|
19
|
-
import { readFileSync } from "node:fs";
|
|
19
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
20
20
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
21
21
|
import schema from "./workspace-kinds.schema.json" with { type: "json" };
|
|
22
22
|
import { joinPath, skippedDir } from "./tree.js";
|
|
@@ -122,7 +122,7 @@ export function probeKind(kind, tree, dir) {
|
|
|
122
122
|
return holdsChantProject(tree, dir);
|
|
123
123
|
if ("repo" in kind.probe)
|
|
124
124
|
return true;
|
|
125
|
-
const { anyFile, anyBlock, anyJsonKey, anyLine } = kind.probe;
|
|
125
|
+
const { anyFile, anyBlock, anyJsonKey, anyLine, anyDocument } = kind.probe;
|
|
126
126
|
if (anyFile && filesMatching(tree, dir, anyFile).length > 0)
|
|
127
127
|
return true;
|
|
128
128
|
if (anyJsonKey) {
|
|
@@ -149,6 +149,17 @@ export function probeKind(kind, tree, dir) {
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
|
+
if (anyDocument) {
|
|
153
|
+
for (const file of filesMatching(tree, dir, anyDocument.in)) {
|
|
154
|
+
try {
|
|
155
|
+
if (documentsOf(tree.read(file)).some((doc) => anyDocument.match.some((m) => documentMatches(doc, m))))
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// An unreadable file is no evidence either way.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
152
163
|
if (anyBlock) {
|
|
153
164
|
const opener = new RegExp(`^\\s*(?:${anyBlock.blocks.map(escapeRegExp).join("|")})\\s*\\{`, "m");
|
|
154
165
|
for (const file of filesMatching(tree, dir, anyBlock.in)) {
|
|
@@ -188,6 +199,36 @@ function filesMatching(tree, dir, names) {
|
|
|
188
199
|
}
|
|
189
200
|
return out.sort();
|
|
190
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* The documents in `text`, read as YAML (which holds JSON). A CloudFormation
|
|
204
|
+
* short-form tag such as `!Ref` or `!Sub` is not YAML js-yaml knows, so a
|
|
205
|
+
* file that fails to parse is read again with those tags dropped. Text that
|
|
206
|
+
* still doesn't parse has no documents.
|
|
207
|
+
*/
|
|
208
|
+
function documentsOf(text) {
|
|
209
|
+
try {
|
|
210
|
+
return yaml.loadAll(text);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
try {
|
|
214
|
+
return yaml.loadAll(text.replace(/(^|[\s:\-[,{])!(?:[A-Za-z][\w]*:?)+/gm, "$1"));
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return [];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Whether every pointer in `match` holds a value matching one of its patterns. */
|
|
222
|
+
function documentMatches(doc, match) {
|
|
223
|
+
const pointers = Object.entries(match);
|
|
224
|
+
return (pointers.length > 0 &&
|
|
225
|
+
pointers.every(([pointer, patterns]) => {
|
|
226
|
+
const value = atPointer(doc, pointer);
|
|
227
|
+
if (value === undefined)
|
|
228
|
+
return false;
|
|
229
|
+
return patterns.some((pattern) => new RegExp(`^${pattern.split("*").map(escapeRegExp).join(".*")}$`).test(String(value)));
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
191
232
|
/** The value at JSON Pointer `pointer` in `json`, or undefined when there is none. */
|
|
192
233
|
function atPointer(json, pointer) {
|
|
193
234
|
let at = json;
|
|
@@ -301,12 +342,15 @@ export function parseKindData(text, source) {
|
|
|
301
342
|
...(k.probe.anyBlock ? { anyBlock: { in: [...k.probe.anyBlock.in], blocks: [...k.probe.anyBlock.blocks] } } : {}),
|
|
302
343
|
...(k.probe.anyJsonKey ? { anyJsonKey: { in: [...k.probe.anyJsonKey.in], pointers: [...k.probe.anyJsonKey.pointers] } } : {}),
|
|
303
344
|
...(k.probe.anyLine ? { anyLine: { in: [...k.probe.anyLine.in], starts: [...k.probe.anyLine.starts] } } : {}),
|
|
345
|
+
...(k.probe.anyDocument ? { anyDocument: { in: [...k.probe.anyDocument.in], match: k.probe.anyDocument.match.map((m) => structuredClone(m)) } } : {}),
|
|
304
346
|
},
|
|
305
347
|
precedence: k.precedence,
|
|
306
348
|
shape: "member",
|
|
307
349
|
outputs: { from: "declared", names: [...(k.outputs ?? [])] },
|
|
308
350
|
source,
|
|
309
|
-
...(k.graph
|
|
351
|
+
...(k.graph
|
|
352
|
+
? { graph: { ...(k.graph.lexicon ? { lexicon: k.graph.lexicon } : {}), ...(k.graph.reader ? { reader: k.graph.reader } : {}), config: structuredClone(k.graph.config ?? {}) } }
|
|
353
|
+
: {}),
|
|
310
354
|
...(k.fields ? { fields: structuredClone(k.fields) } : {}),
|
|
311
355
|
...(k.reader && KIND_LINK_READERS.includes(k.reader) ? { reader: k.reader } : {}),
|
|
312
356
|
...(k.memberFile ? { memberFile: { path: k.memberFile.path, schema: k.memberFile.schema } } : {}),
|
|
@@ -365,7 +409,23 @@ export function readPackageKinds(packageDir, source) {
|
|
|
365
409
|
if (problem)
|
|
366
410
|
data.problems.push(`${name}: kind ${k.name} ${problem}; members of the kind fail WSP012 until it is fixed`);
|
|
367
411
|
}
|
|
368
|
-
if (k.graph
|
|
412
|
+
if (k.graph?.reader) {
|
|
413
|
+
// A reader module is any package's own file (#4413): it must sit inside the package and exist. Nothing is imported here.
|
|
414
|
+
const file = resolve(packageDir, ...k.graph.reader.split("/"));
|
|
415
|
+
const inside = relative(packageDir, file);
|
|
416
|
+
if (inside.startsWith("..") || isAbsolute(inside)) {
|
|
417
|
+
data.problems.push(`${name}: kind ${k.name} names graph reader ${k.graph.reader}, which is outside the package; the kind is kept, and workspace graph lists its members with kind-not-run`);
|
|
418
|
+
delete k.graph;
|
|
419
|
+
}
|
|
420
|
+
else if (!existsSync(file)) {
|
|
421
|
+
data.problems.push(`${name}: kind ${k.name} names graph reader ${k.graph.reader}, which does not exist in the package; the kind is kept, and workspace graph lists its members with kind-not-run`);
|
|
422
|
+
delete k.graph;
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
k.graph.readerFile = file;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else if (k.graph?.lexicon && packageName !== lexiconPackageName(k.graph.lexicon)) {
|
|
369
429
|
data.problems.push(`${name}: kind ${k.name} reads its members with lexicon ${k.graph.lexicon}, which is ${lexiconPackageName(k.graph.lexicon)}, ` +
|
|
370
430
|
`and this package is ${packageName ?? "unnamed"}; the kind is kept, and workspace graph lists its members with kind-not-run`);
|
|
371
431
|
delete k.graph;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lineage-upgrade.d.ts","sourceRoot":"","sources":["../../src/workspace/lineage-upgrade.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"lineage-upgrade.d.ts","sourceRoot":"","sources":["../../src/workspace/lineage-upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -401,16 +401,25 @@ export function isGovernancePath(path) {
|
|
|
401
401
|
* one. The Op files are read from the project's tree, which the upgrade
|
|
402
402
|
* requires to match HEAD for every path the patch touches.
|
|
403
403
|
*
|
|
404
|
+
* Both come from HEAD, never from the patch: the Op files are read from the
|
|
405
|
+
* clean project tree, and the declaration through `identityGatesAt(repo,
|
|
406
|
+
* head)` (`git show`). A change the upgrade itself makes to an Op or to
|
|
407
|
+
* `chant.workspace.json` cannot lower the approvals it asks for (#4404). A
|
|
408
|
+
* gate whose `identity.gates.<gate>.quorum` at HEAD sets one is asked for that
|
|
409
|
+
* quorum, as a run of the gate is (#4324), not the Op's own.
|
|
410
|
+
*
|
|
404
411
|
* Discovery runs from each changed Op file's own directory, so it finds the
|
|
405
412
|
* file under the project that owns it. Run from a workspace root, it would
|
|
406
413
|
* skip every member's Op files (#2892).
|
|
407
414
|
*/
|
|
408
|
-
async function rulesAtHead(repo, paths) {
|
|
415
|
+
async function rulesAtHead(repo, paths, head) {
|
|
409
416
|
const opFiles = new Set(paths.filter((p) => GOVERNANCE[0].test(p)));
|
|
410
417
|
let count = 1;
|
|
411
418
|
let roles;
|
|
412
419
|
if (opFiles.size > 0) {
|
|
413
420
|
const { discoverOps } = await import("../op/discover.js");
|
|
421
|
+
const { identityGatesAt } = await import("../gate-decision.js");
|
|
422
|
+
const atBase = new Map(identityGatesAt(repo, head).map((g) => [g.gate, g.quorum]));
|
|
414
423
|
const dirs = new Set([...opFiles].map((p) => dirname(join(repo, p))));
|
|
415
424
|
for (const dir of dirs) {
|
|
416
425
|
if (!existsSync(dir))
|
|
@@ -422,7 +431,7 @@ async function rulesAtHead(repo, paths) {
|
|
|
422
431
|
continue;
|
|
423
432
|
// #4290: a quorum may be a list of rules; the strictest count is asked for.
|
|
424
433
|
for (const approval of gateApprovals(config)) {
|
|
425
|
-
for (const rule of quorumRules(approval.quorum)) {
|
|
434
|
+
for (const rule of quorumRules(atBase.get(approval.gate) ?? approval.quorum)) {
|
|
426
435
|
if (rule.count > count) {
|
|
427
436
|
count = rule.count;
|
|
428
437
|
roles = rule.roles;
|
|
@@ -438,7 +447,7 @@ function gateApprovals(config) {
|
|
|
438
447
|
const out = [];
|
|
439
448
|
const visit = (step) => {
|
|
440
449
|
if (step.kind === "gate")
|
|
441
|
-
out.push(step.
|
|
450
|
+
out.push({ gate: step.gate ?? step.signalName ?? "", ...(step.approval?.quorum !== undefined ? { quorum: step.approval.quorum } : {}) });
|
|
442
451
|
if (step.kind === "effect")
|
|
443
452
|
(step.steps ?? []).forEach(visit);
|
|
444
453
|
};
|
|
@@ -693,7 +702,7 @@ export async function stageUpgrade(options) {
|
|
|
693
702
|
if (touched.length > 0) {
|
|
694
703
|
throw new UpgradeError(`the upgrade changes governance files that have uncommitted edits (${touched.map((l) => l.slice(3)).join(", ")}). Commit them first: their gates are read at HEAD.`);
|
|
695
704
|
}
|
|
696
|
-
governance = { paths: governed, approval: await rulesAtHead(repo, governed), rules: head };
|
|
705
|
+
governance = { paths: governed, approval: await rulesAtHead(repo, governed, head), rules: head };
|
|
697
706
|
}
|
|
698
707
|
// 5. Checks.
|
|
699
708
|
const checks = [];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The migration files a pull request adds to a migration-directory workspace
|
|
3
|
+
* member (#4407), for the plan note. Reads the member's migrations at the
|
|
4
|
+
* pull request's head with the kind's own reader (`./kind-link-readers.ts`),
|
|
5
|
+
* keeps the files the base commit lacks, and asks a lexicon to classify
|
|
6
|
+
* them (`LexiconPlugin.classifyMigrations`). It reads git objects and files
|
|
7
|
+
* only: nothing is applied, no server is contacted, and no tool runs.
|
|
8
|
+
*/
|
|
9
|
+
import type { LexiconPlugin } from "../lexicon.js";
|
|
10
|
+
import type { PrMigrationFile } from "../pr-migrations.js";
|
|
11
|
+
import { type KindLinkRead, type KindReadMigration } from "./kind-link-readers.js";
|
|
12
|
+
import type { WorkspaceTree } from "./tree.js";
|
|
13
|
+
/** One member's new migrations. */
|
|
14
|
+
export interface NewMigrationGroup {
|
|
15
|
+
member: string;
|
|
16
|
+
/** The member's directory, tree-relative; "" for the workspace root. */
|
|
17
|
+
dir: string;
|
|
18
|
+
reader: string;
|
|
19
|
+
dialect: string;
|
|
20
|
+
/** The new files, in the order the tool applies them. */
|
|
21
|
+
migrations: KindReadMigration[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Per member, the migrations whose file is not in `base`. An `undo` file is
|
|
25
|
+
* not an up migration and is left out. With no `base` tree (the workspace did
|
|
26
|
+
* not exist there) every migration is new. `only` limits the answer to one
|
|
27
|
+
* member, for a member's own pipeline.
|
|
28
|
+
*/
|
|
29
|
+
export declare function newMigrationGroups(members: readonly {
|
|
30
|
+
name: string;
|
|
31
|
+
dir: string;
|
|
32
|
+
}[], read: ReadonlyMap<string, KindLinkRead>, base: WorkspaceTree | undefined, only?: string): NewMigrationGroup[];
|
|
33
|
+
/**
|
|
34
|
+
* Classify the new files with the first lexicon that answers each. A file no
|
|
35
|
+
* lexicon answers for comes back with an `error` that says which dialect, so
|
|
36
|
+
* the note shows it instead of leaving it out.
|
|
37
|
+
*/
|
|
38
|
+
export declare function classifyNewMigrations(groups: readonly NewMigrationGroup[], head: WorkspaceTree, plugins: readonly Pick<LexiconPlugin, "name" | "classifyMigrations">[]): Promise<PrMigrationFile[]>;
|
|
39
|
+
/**
|
|
40
|
+
* The new migration files of the workspace holding `cwd`, between `base` and
|
|
41
|
+
* `head`. Empty outside a workspace or when the declaration cannot be read.
|
|
42
|
+
*/
|
|
43
|
+
export declare function newMigrationFilesBetween(cwd: string, base: string, head: string, options: {
|
|
44
|
+
member?: string;
|
|
45
|
+
plugins: () => Promise<readonly Pick<LexiconPlugin, "name" | "classifyMigrations">[]>;
|
|
46
|
+
}): Promise<PrMigrationFile[]>;
|
|
47
|
+
//# sourceMappingURL=new-migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new-migrations.d.ts","sourceRoot":"","sources":["../../src/workspace/new-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAA+B,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAErF,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAG5C,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EACjD,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,EACvC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,IAAI,CAAC,EAAE,MAAM,GACZ,iBAAiB,EAAE,CAWrB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,oBAAoB,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAoBzM;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAA;CAAE,GAClH,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB5B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The migration files a pull request adds to a migration-directory workspace
|
|
3
|
+
* member (#4407), for the plan note. Reads the member's migrations at the
|
|
4
|
+
* pull request's head with the kind's own reader (`./kind-link-readers.ts`),
|
|
5
|
+
* keeps the files the base commit lacks, and asks a lexicon to classify
|
|
6
|
+
* them (`LexiconPlugin.classifyMigrations`). It reads git objects and files
|
|
7
|
+
* only: nothing is applied, no server is contacted, and no tool runs.
|
|
8
|
+
*/
|
|
9
|
+
import { readDeclaration } from "./declaration.js";
|
|
10
|
+
import { readKindLinks } from "./kind-link-readers.js";
|
|
11
|
+
import { loadKindRegistry } from "./kinds.js";
|
|
12
|
+
import { locateWorkspace } from "./which-chant.js";
|
|
13
|
+
/**
|
|
14
|
+
* Per member, the migrations whose file is not in `base`. An `undo` file is
|
|
15
|
+
* not an up migration and is left out. With no `base` tree (the workspace did
|
|
16
|
+
* not exist there) every migration is new. `only` limits the answer to one
|
|
17
|
+
* member, for a member's own pipeline.
|
|
18
|
+
*/
|
|
19
|
+
export function newMigrationGroups(members, read, base, only) {
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const m of members) {
|
|
22
|
+
if (only !== undefined && m.name !== only)
|
|
23
|
+
continue;
|
|
24
|
+
const r = read.get(m.name);
|
|
25
|
+
if (!r?.migrations)
|
|
26
|
+
continue;
|
|
27
|
+
const added = r.migrations.filter((mig) => mig.type !== "undo" && base?.stat(mig.file) !== "file");
|
|
28
|
+
if (added.length === 0)
|
|
29
|
+
continue;
|
|
30
|
+
out.push({ member: m.name, dir: m.dir === "." ? "" : m.dir, reader: r.reader, dialect: added[0].dialect, migrations: added });
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Classify the new files with the first lexicon that answers each. A file no
|
|
36
|
+
* lexicon answers for comes back with an `error` that says which dialect, so
|
|
37
|
+
* the note shows it instead of leaving it out.
|
|
38
|
+
*/
|
|
39
|
+
export async function classifyNewMigrations(groups, head, plugins) {
|
|
40
|
+
const out = [];
|
|
41
|
+
for (const g of groups) {
|
|
42
|
+
const files = g.migrations.map((m) => m.file);
|
|
43
|
+
const answers = new Map();
|
|
44
|
+
for (const p of plugins) {
|
|
45
|
+
if (!p.classifyMigrations || answers.size === files.length)
|
|
46
|
+
continue;
|
|
47
|
+
const left = files.filter((f) => !answers.has(f));
|
|
48
|
+
try {
|
|
49
|
+
for (const a of await p.classifyMigrations({ reader: g.reader, dialect: g.dialect, tree: head, dir: g.dir, files: left }))
|
|
50
|
+
answers.set(a.file, a);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
for (const f of left)
|
|
54
|
+
answers.set(f, { file: f, statements: [], error: `the ${p.name} lexicon could not classify it: ${err instanceof Error ? err.message : String(err)}` });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const m of g.migrations) {
|
|
58
|
+
const a = answers.get(m.file) ?? { file: m.file, statements: [], error: `no installed lexicon classifies ${g.dialect} migrations` };
|
|
59
|
+
out.push({ member: g.member, reader: g.reader, version: m.version, name: m.name, type: m.type, dialect: m.dialect, ...a });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The new migration files of the workspace holding `cwd`, between `base` and
|
|
66
|
+
* `head`. Empty outside a workspace or when the declaration cannot be read.
|
|
67
|
+
*/
|
|
68
|
+
export async function newMigrationFilesBetween(cwd, base, head, options) {
|
|
69
|
+
let located;
|
|
70
|
+
let declaration;
|
|
71
|
+
try {
|
|
72
|
+
located = locateWorkspace(cwd, head);
|
|
73
|
+
declaration = readDeclaration(located.tree, "", { rootChant: true });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
const { registry } = loadKindRegistry(declaration.pins, located.rootOnDisk);
|
|
79
|
+
const read = readKindLinks(declaration, located.tree, registry);
|
|
80
|
+
let baseTree;
|
|
81
|
+
try {
|
|
82
|
+
baseTree = locateWorkspace(cwd, base).tree;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
baseTree = undefined;
|
|
86
|
+
}
|
|
87
|
+
const groups = newMigrationGroups(declaration.members, read, baseTree, options.member);
|
|
88
|
+
if (groups.length === 0)
|
|
89
|
+
return [];
|
|
90
|
+
return classifyNewMigrations(groups, located.tree, await options.plugins());
|
|
91
|
+
}
|
|
@@ -92,6 +92,39 @@
|
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
},
|
|
95
|
+
"migrations": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"description": "Added within contract version 1 by #4407, written by chant 0.124.49 and newer. Plan stage: the migration files the pull request adds in a migration-directory workspace member (goose, golang-migrate, clickhouse-migrations, Flyway), each statement with the class the lexicon's classifier gives it, read offline. Absent when the pull request adds none.",
|
|
98
|
+
"items": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"required": ["member", "reader", "file", "version", "name", "type", "dialect", "statements"],
|
|
101
|
+
"properties": {
|
|
102
|
+
"member": { "type": "string" },
|
|
103
|
+
"reader": { "type": "string" },
|
|
104
|
+
"file": { "type": "string", "description": "Relative to the workspace root." },
|
|
105
|
+
"version": { "type": "string" },
|
|
106
|
+
"name": { "type": "string" },
|
|
107
|
+
"type": { "enum": ["versioned", "repeatable", "baseline", "undo"] },
|
|
108
|
+
"dialect": { "type": "string" },
|
|
109
|
+
"error": { "type": "string", "description": "Why the file could not be read; its statements are then empty." },
|
|
110
|
+
"statements": {
|
|
111
|
+
"type": "array",
|
|
112
|
+
"items": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"required": ["index", "sql", "outcome", "changes"],
|
|
115
|
+
"properties": {
|
|
116
|
+
"index": { "type": "integer", "minimum": 1 },
|
|
117
|
+
"sql": { "type": "string" },
|
|
118
|
+
"outcome": { "enum": ["classified", "undecided", "unclassified", "data"] },
|
|
119
|
+
"changes": { "type": "array", "items": { "$ref": "#/$defs/migrationChange" } },
|
|
120
|
+
"candidates": { "type": "array", "items": { "$ref": "#/$defs/migrationChange" }, "description": "With undecided: the rules that could apply." },
|
|
121
|
+
"note": { "type": "string" }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
95
128
|
"plannedOutputs": {
|
|
96
129
|
"type": "object",
|
|
97
130
|
"description": "Added within contract version 1 by #3999, written by chant 0.124.32 and newer. Per dependency in the change that a member was planned against, the names of the outputs its plan knows, sorted. An output a member reads that is not listed is known only after apply, and the member lists it under unknownInputs. Absent when no member read one.",
|
|
@@ -258,6 +291,19 @@
|
|
|
258
291
|
}
|
|
259
292
|
},
|
|
260
293
|
"$defs": {
|
|
294
|
+
"migrationChange": {
|
|
295
|
+
"type": "object",
|
|
296
|
+
"required": ["rule", "class", "label", "title"],
|
|
297
|
+
"properties": {
|
|
298
|
+
"rule": { "type": "string" },
|
|
299
|
+
"class": { "type": "string" },
|
|
300
|
+
"label": { "type": "string" },
|
|
301
|
+
"title": { "type": "string" },
|
|
302
|
+
"lock": { "type": "string" },
|
|
303
|
+
"destructive": { "type": "boolean" },
|
|
304
|
+
"note": { "type": "string" }
|
|
305
|
+
}
|
|
306
|
+
},
|
|
261
307
|
"policyFinding": {
|
|
262
308
|
"type": "object",
|
|
263
309
|
"required": ["rule", "message"],
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `chant workspace promote <member>` (#3178): move one member one rung up the
|
|
3
|
+
* kind ladder, `other` or `terraform`, then `choudoufu`, then `chant`.
|
|
4
|
+
*
|
|
5
|
+
* The change is staged the way `workspace upgrade` stages one (#2550): in a
|
|
6
|
+
* git worktree at HEAD, so the tree is never touched until the gate passes.
|
|
7
|
+
* The gate is `workspace-promote/<member>` on the gate ledger and binds the
|
|
8
|
+
* digest of the patch the staging produced. The first run records a pending
|
|
9
|
+
* fact and exits 3. After `chant approve workspace-promote <member>`, the same
|
|
10
|
+
* command stages again, finds the approval for the same digest, applies the
|
|
11
|
+
* patch, and runs the rung's follow-up (for `choudoufu`, stamping the
|
|
12
|
+
* ownership markers with `live-import -approve`).
|
|
13
|
+
*
|
|
14
|
+
* Rungs:
|
|
15
|
+
*
|
|
16
|
+
* - `terraform` to `choudoufu`: `choudoufu live-check` in the member's
|
|
17
|
+
* directory must pass, then `choudoufu live-import -state=<--state>
|
|
18
|
+
* -estate=<member>` prints its ratification report (read-only: it stamps
|
|
19
|
+
* nothing without `-approve`). The patch changes the member's kind.
|
|
20
|
+
* - `choudoufu` or `other` to `chant`: `chant import` writes TypeScript into
|
|
21
|
+
* the member's directory. The patch holds those files and the kind change.
|
|
22
|
+
*
|
|
23
|
+
* Commands run through an injectable runner, so a test never starts a binary.
|
|
24
|
+
*/
|
|
25
|
+
import type { CommandContext } from "../cli/registry.js";
|
|
26
|
+
import { type GateLedgerPort } from "../op/gate.js";
|
|
27
|
+
export declare const PROMOTE_PLAN_KIND = "workspace-promote";
|
|
28
|
+
export declare const PROMOTE_GATED_EXIT = 3;
|
|
29
|
+
export declare class PromoteError extends Error {
|
|
30
|
+
}
|
|
31
|
+
/** The ladder, lowest rung first. `other` and `terraform` share the bottom rung. */
|
|
32
|
+
export declare const LADDER: readonly ["terraform", "choudoufu", "chant"];
|
|
33
|
+
export interface Rung {
|
|
34
|
+
from: string;
|
|
35
|
+
to: "choudoufu" | "chant";
|
|
36
|
+
}
|
|
37
|
+
/** The next rung for a member of `kind`, or undefined at the top or off the ladder. */
|
|
38
|
+
export declare function nextRung(kind: string): Rung | undefined;
|
|
39
|
+
export interface CommandRun {
|
|
40
|
+
label: string;
|
|
41
|
+
argv: string[];
|
|
42
|
+
/** Directory relative to the project root. */
|
|
43
|
+
cwd: string;
|
|
44
|
+
}
|
|
45
|
+
export type PromoteRunner = (argv: string[], cwd: string) => Promise<{
|
|
46
|
+
exitCode: number;
|
|
47
|
+
output: string;
|
|
48
|
+
}>;
|
|
49
|
+
export declare const spawnRunner: PromoteRunner;
|
|
50
|
+
/** The commands the rung runs in the staging worktree. */
|
|
51
|
+
export declare function stagingRuns(rung: Rung, member: {
|
|
52
|
+
name: string;
|
|
53
|
+
dir: string;
|
|
54
|
+
}, opts: {
|
|
55
|
+
state?: string;
|
|
56
|
+
lexicon?: string;
|
|
57
|
+
}): CommandRun[];
|
|
58
|
+
/** After the approved patch is applied: stamping ownership markers on the live resources. */
|
|
59
|
+
export declare function followUpRuns(rung: Rung, member: {
|
|
60
|
+
name: string;
|
|
61
|
+
dir: string;
|
|
62
|
+
}, opts: {
|
|
63
|
+
state?: string;
|
|
64
|
+
}): CommandRun[];
|
|
65
|
+
export interface PromoteOptions {
|
|
66
|
+
root: string;
|
|
67
|
+
member: string;
|
|
68
|
+
state?: string;
|
|
69
|
+
lexicon?: string;
|
|
70
|
+
dryRun?: boolean;
|
|
71
|
+
output?: string;
|
|
72
|
+
json?: boolean;
|
|
73
|
+
/** For tests. */
|
|
74
|
+
runner?: PromoteRunner;
|
|
75
|
+
ledger?: GateLedgerPort;
|
|
76
|
+
now?: string;
|
|
77
|
+
}
|
|
78
|
+
export type PromoteOutcome = "top-of-ladder" | "checks-failed" | "dry-run" | "gated" | "applied";
|
|
79
|
+
export interface PromoteResult {
|
|
80
|
+
outcome: PromoteOutcome;
|
|
81
|
+
exitCode: number;
|
|
82
|
+
member: string;
|
|
83
|
+
from?: string;
|
|
84
|
+
to?: string;
|
|
85
|
+
digest?: string;
|
|
86
|
+
patch?: string;
|
|
87
|
+
ran?: {
|
|
88
|
+
label: string;
|
|
89
|
+
exitCode: number;
|
|
90
|
+
}[];
|
|
91
|
+
}
|
|
92
|
+
/** Rewrite the member's `kind` in the declaration text. */
|
|
93
|
+
export declare function setMemberKind(text: string, file: string, member: string, kind: string): string;
|
|
94
|
+
export declare function promoteCommand(opts: PromoteOptions): Promise<PromoteResult>;
|
|
95
|
+
export declare function runWorkspacePromote(ctx: CommandContext): Promise<number>;
|
|
96
|
+
//# sourceMappingURL=promote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/workspace/promote.ts"],"names":[],"mappings":"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"}
|