@clossys/launcher 0.3.1 → 0.5.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 +1373 -60
- package/contracts/conversation-contract.md +2 -2
- package/contracts/product-ci-workflow.yml +74 -0
- package/contracts/repository-inventory.json +53 -0
- package/dist/admission-fixture.d.ts +168 -0
- package/dist/admission-fixture.d.ts.map +1 -0
- package/dist/admission-fixture.js +467 -0
- package/dist/admission-fixture.js.map +1 -0
- package/dist/admission.d.ts +124 -0
- package/dist/admission.d.ts.map +1 -0
- package/dist/admission.js +804 -0
- package/dist/admission.js.map +1 -0
- package/dist/agents-guide.d.ts +9 -0
- package/dist/agents-guide.d.ts.map +1 -0
- package/dist/agents-guide.js +26 -0
- package/dist/agents-guide.js.map +1 -0
- package/dist/apply-command-options.check.d.ts +12 -0
- package/dist/apply-command-options.check.d.ts.map +1 -0
- package/dist/apply-command-options.check.js +20 -0
- package/dist/apply-command-options.check.js.map +1 -0
- package/dist/apply-plan-cli.d.ts +39 -1
- package/dist/apply-plan-cli.d.ts.map +1 -1
- package/dist/apply-plan-cli.js +432 -15
- package/dist/apply-plan-cli.js.map +1 -1
- package/dist/apply-plan.d.ts +46 -59
- package/dist/apply-plan.d.ts.map +1 -1
- package/dist/apply-plan.js +112 -97
- package/dist/apply-plan.js.map +1 -1
- package/dist/apply-step-fixture.d.ts +87 -0
- package/dist/apply-step-fixture.d.ts.map +1 -0
- package/dist/apply-step-fixture.js +199 -0
- package/dist/apply-step-fixture.js.map +1 -0
- package/dist/apply-store.d.ts +93 -0
- package/dist/apply-store.d.ts.map +1 -0
- package/dist/apply-store.js +625 -0
- package/dist/apply-store.js.map +1 -0
- package/dist/approval-sheet.d.ts +21 -0
- package/dist/approval-sheet.d.ts.map +1 -0
- package/dist/approval-sheet.js +163 -0
- package/dist/approval-sheet.js.map +1 -0
- package/dist/body-command.d.ts +42 -0
- package/dist/body-command.d.ts.map +1 -0
- package/dist/body-command.js +143 -0
- package/dist/body-command.js.map +1 -0
- package/dist/change-set-contract.d.ts +403 -0
- package/dist/change-set-contract.d.ts.map +1 -0
- package/dist/change-set-contract.js +781 -0
- package/dist/change-set-contract.js.map +1 -0
- package/dist/change-set-digest.d.ts +28 -0
- package/dist/change-set-digest.d.ts.map +1 -0
- package/dist/change-set-digest.js +65 -0
- package/dist/change-set-digest.js.map +1 -0
- package/dist/check-cli.d.ts.map +1 -1
- package/dist/check-cli.js +14 -3
- package/dist/check-cli.js.map +1 -1
- package/dist/cli.d.ts +17 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +84 -23
- package/dist/cli.js.map +1 -1
- package/dist/core.d.ts +79 -22
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +843 -268
- package/dist/core.js.map +1 -1
- package/dist/dry-materialize.d.ts +63 -0
- package/dist/dry-materialize.d.ts.map +1 -0
- package/dist/dry-materialize.js +330 -0
- package/dist/dry-materialize.js.map +1 -0
- package/dist/existing-declaration-adoption.check.d.ts +2 -0
- package/dist/existing-declaration-adoption.check.d.ts.map +1 -0
- package/dist/existing-declaration-adoption.check.js +10 -0
- package/dist/existing-declaration-adoption.check.js.map +1 -0
- package/dist/generated/contract-schema.generated.d.ts +97 -0
- package/dist/generated/contract-schema.generated.d.ts.map +1 -0
- package/dist/generated/contract-schema.generated.js +496 -0
- package/dist/generated/contract-schema.generated.js.map +1 -0
- package/dist/generated/package-scope.generated.d.ts +6 -0
- package/dist/generated/package-scope.generated.d.ts.map +1 -0
- package/dist/generated/package-scope.generated.js +10 -0
- package/dist/generated/package-scope.generated.js.map +1 -0
- package/dist/generated/plan-contracts.generated.d.ts +3 -0
- package/dist/generated/plan-contracts.generated.d.ts.map +1 -0
- package/dist/generated/plan-contracts.generated.js +3101 -0
- package/dist/generated/plan-contracts.generated.js.map +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +11 -0
- package/dist/host.js.map +1 -1
- package/dist/identity.d.ts +15 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +48 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +35 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/inventory-adoption.d.ts +24 -5
- package/dist/inventory-adoption.d.ts.map +1 -1
- package/dist/inventory-adoption.js +70 -25
- package/dist/inventory-adoption.js.map +1 -1
- package/dist/inventory-choice.d.ts +40 -0
- package/dist/inventory-choice.d.ts.map +1 -0
- package/dist/inventory-choice.js +156 -0
- package/dist/inventory-choice.js.map +1 -0
- package/dist/inventory-contract.d.ts +89 -0
- package/dist/inventory-contract.d.ts.map +1 -0
- package/dist/inventory-contract.js +121 -0
- package/dist/inventory-contract.js.map +1 -0
- package/dist/key-editor.d.ts +30 -0
- package/dist/key-editor.d.ts.map +1 -0
- package/dist/key-editor.js +445 -0
- package/dist/key-editor.js.map +1 -0
- package/dist/ledger-contract.d.ts +190 -0
- package/dist/ledger-contract.d.ts.map +1 -0
- package/dist/ledger-contract.js +555 -0
- package/dist/ledger-contract.js.map +1 -0
- package/dist/ledger-trust.d.ts +90 -0
- package/dist/ledger-trust.d.ts.map +1 -0
- package/dist/ledger-trust.js +203 -0
- package/dist/ledger-trust.js.map +1 -0
- package/dist/lockfile-invariants.d.ts +48 -0
- package/dist/lockfile-invariants.d.ts.map +1 -0
- package/dist/lockfile-invariants.js +375 -0
- package/dist/lockfile-invariants.js.map +1 -0
- package/dist/lockfile-readers.d.ts +72 -0
- package/dist/lockfile-readers.d.ts.map +1 -0
- package/dist/lockfile-readers.js +713 -0
- package/dist/lockfile-readers.js.map +1 -0
- package/dist/lockfile-regen.d.ts +106 -0
- package/dist/lockfile-regen.d.ts.map +1 -0
- package/dist/lockfile-regen.js +760 -0
- package/dist/lockfile-regen.js.map +1 -0
- package/dist/lockfile-tool-env.d.ts +29 -0
- package/dist/lockfile-tool-env.d.ts.map +1 -0
- package/dist/lockfile-tool-env.js +111 -0
- package/dist/lockfile-tool-env.js.map +1 -0
- package/dist/materialize.d.ts +113 -0
- package/dist/materialize.d.ts.map +1 -0
- package/dist/materialize.js +881 -0
- package/dist/materialize.js.map +1 -0
- package/dist/observe-repository.d.ts +90 -0
- package/dist/observe-repository.d.ts.map +1 -0
- package/dist/observe-repository.js +1367 -0
- package/dist/observe-repository.js.map +1 -0
- package/dist/plan-bundle-setup-fixture.d.ts +68 -0
- package/dist/plan-bundle-setup-fixture.d.ts.map +1 -0
- package/dist/plan-bundle-setup-fixture.js +167 -0
- package/dist/plan-bundle-setup-fixture.js.map +1 -0
- package/dist/plan-bundle.d.ts +256 -0
- package/dist/plan-bundle.d.ts.map +1 -0
- package/dist/plan-bundle.js +882 -0
- package/dist/plan-bundle.js.map +1 -0
- package/dist/plan-command.d.ts +29 -0
- package/dist/plan-command.d.ts.map +1 -0
- package/dist/plan-command.js +523 -0
- package/dist/plan-command.js.map +1 -0
- package/dist/plan-contract.d.ts +153 -0
- package/dist/plan-contract.d.ts.map +1 -0
- package/dist/plan-contract.js +61 -0
- package/dist/plan-contract.js.map +1 -0
- package/dist/plan-digest.d.ts +25 -0
- package/dist/plan-digest.d.ts.map +1 -0
- package/dist/plan-digest.js +106 -0
- package/dist/plan-digest.js.map +1 -0
- package/dist/plan-rules.d.ts +23 -0
- package/dist/plan-rules.d.ts.map +1 -0
- package/dist/plan-rules.js +177 -0
- package/dist/plan-rules.js.map +1 -0
- package/dist/planned-bundle.d.ts +20 -0
- package/dist/planned-bundle.d.ts.map +1 -0
- package/dist/planned-bundle.js +191 -0
- package/dist/planned-bundle.js.map +1 -0
- package/dist/product-repository.d.ts +4 -0
- package/dist/product-repository.d.ts.map +1 -1
- package/dist/product-repository.js +9 -1
- package/dist/product-repository.js.map +1 -1
- package/dist/provenance-gate.d.ts +48 -0
- package/dist/provenance-gate.d.ts.map +1 -0
- package/dist/provenance-gate.js +324 -0
- package/dist/provenance-gate.js.map +1 -0
- package/dist/pull-request-body.d.ts +45 -0
- package/dist/pull-request-body.d.ts.map +1 -0
- package/dist/pull-request-body.js +232 -0
- package/dist/pull-request-body.js.map +1 -0
- package/dist/registry-snapshot.d.ts +141 -0
- package/dist/registry-snapshot.d.ts.map +1 -0
- package/dist/registry-snapshot.js +483 -0
- package/dist/registry-snapshot.js.map +1 -0
- package/dist/release-age-edit.d.ts +52 -0
- package/dist/release-age-edit.d.ts.map +1 -0
- package/dist/release-age-edit.js +413 -0
- package/dist/release-age-edit.js.map +1 -0
- package/dist/root-entries.d.ts +36 -0
- package/dist/root-entries.d.ts.map +1 -0
- package/dist/root-entries.js +80 -0
- package/dist/root-entries.js.map +1 -0
- package/dist/setup-template-scripts.d.ts +36 -0
- package/dist/setup-template-scripts.d.ts.map +1 -0
- package/dist/setup-template-scripts.js +568 -0
- package/dist/setup-template-scripts.js.map +1 -0
- package/dist/setup-templates.d.ts +55 -0
- package/dist/setup-templates.d.ts.map +1 -0
- package/dist/setup-templates.js +438 -0
- package/dist/setup-templates.js.map +1 -0
- package/dist/skills.d.ts +34 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +129 -17
- package/dist/skills.js.map +1 -1
- package/dist/status.d.ts +63 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +539 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +151 -13
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/skeleton/README.md +14 -9
- package/skeleton/package.json +2 -1
- package/skill/SKILL.md +23 -7
- package/skill-catalogue/advisor/SKILL.md +59 -6
- package/skill-catalogue/architect/SKILL.md +2 -2
- package/skill-catalogue/bouncer/SKILL.md +2 -2
- package/skill-catalogue/builder/SKILL.md +2 -2
- package/skill-catalogue/butler/SKILL.md +2 -2
- package/skill-catalogue/controller/SKILL.md +2 -2
- package/skill-catalogue/customer/SKILL.md +2 -2
- package/skill-catalogue/designer/SKILL.md +4 -2
- package/skill-catalogue/giver/SKILL.md +2 -2
- package/skill-catalogue/influencer/SKILL.md +2 -2
- package/skill-catalogue/inspector/SKILL.md +2 -2
- package/skill-catalogue/integrator/SKILL.md +2 -2
- package/skill-catalogue/keeper/SKILL.md +2 -2
- package/skill-catalogue/launcher/SKILL.md +23 -7
- package/skill-catalogue/locksmith/SKILL.md +2 -2
- package/skill-catalogue/messenger/SKILL.md +2 -2
- package/skill-catalogue/observer/SKILL.md +2 -2
- package/skill-catalogue/publisher/SKILL.md +2 -2
- package/skill-catalogue/starter/SKILL.md +3 -2
- package/skill-catalogue/strategist/SKILL.md +12 -4
- package/skill-catalogue/writer/SKILL.md +2 -2
- package/src/admission-fixture.ts +585 -0
- package/src/admission.ts +819 -0
- package/src/agents-guide.ts +29 -0
- package/src/apply-command-options.check.ts +27 -0
- package/src/apply-plan-cli.ts +454 -14
- package/src/apply-plan.ts +112 -124
- package/src/apply-step-fixture.ts +236 -0
- package/src/apply-store.ts +584 -0
- package/src/approval-sheet.ts +170 -0
- package/src/body-command.ts +162 -0
- package/src/change-set-contract.ts +987 -0
- package/src/change-set-digest.ts +70 -0
- package/src/check-cli.ts +14 -3
- package/src/cli.ts +90 -22
- package/src/core.ts +973 -275
- package/src/dry-materialize.ts +353 -0
- package/src/existing-declaration-adoption.check.ts +12 -0
- package/src/generated/contract-schema.generated.ts +520 -0
- package/src/generated/package-scope.generated.ts +10 -0
- package/src/generated/plan-contracts.generated.ts +3101 -0
- package/src/host.ts +10 -0
- package/src/identity.ts +51 -0
- package/src/index.ts +74 -3
- package/src/inventory-adoption.ts +107 -29
- package/src/inventory-choice.ts +172 -0
- package/src/inventory-contract.ts +166 -0
- package/src/key-editor.ts +446 -0
- package/src/ledger-contract.ts +660 -0
- package/src/ledger-trust.ts +272 -0
- package/src/lockfile-invariants.ts +421 -0
- package/src/lockfile-readers.ts +749 -0
- package/src/lockfile-regen.ts +851 -0
- package/src/lockfile-tool-env.ts +131 -0
- package/src/materialize.ts +915 -0
- package/src/observe-repository.ts +1365 -0
- package/src/plan-bundle-setup-fixture.ts +200 -0
- package/src/plan-bundle.ts +1014 -0
- package/src/plan-command.ts +532 -0
- package/src/plan-contract.ts +179 -0
- package/src/plan-digest.ts +102 -0
- package/src/plan-rules.ts +188 -0
- package/src/planned-bundle.ts +211 -0
- package/src/product-repository.ts +10 -1
- package/src/provenance-gate.ts +352 -0
- package/src/pull-request-body.ts +261 -0
- package/src/registry-snapshot.ts +534 -0
- package/src/release-age-edit.ts +430 -0
- package/src/root-entries.ts +81 -0
- package/src/setup-template-scripts.ts +580 -0
- package/src/setup-templates.ts +479 -0
- package/src/skills.ts +161 -18
- package/src/status.ts +557 -0
- package/src/types.ts +148 -13
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
// A JSON-pointer edit that keeps the file's indent, key order, and final
|
|
2
|
+
// newline (RFC apply-approved-plan, the keyed writes in section 4.3 and the
|
|
3
|
+
// declare-root-entry edit in D27). package.json keys and a Controller
|
|
4
|
+
// profile's rootEntries go through this one editor. After the edit, the
|
|
5
|
+
// text is parsed and rendered again; the two renders are compared byte for
|
|
6
|
+
// byte, and a difference is refused rather than written.
|
|
7
|
+
//
|
|
8
|
+
// This module is pure: it reads no file, clock, network, or process.
|
|
9
|
+
/** Thrown when an edit would rewrite bytes outside the edited tokens. */
|
|
10
|
+
export class JsonEditUnstableError extends TypeError {
|
|
11
|
+
constructor() {
|
|
12
|
+
super("a json pointer edit did not preserve unchanged bytes");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function decodeToken(token) {
|
|
16
|
+
return token.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
17
|
+
}
|
|
18
|
+
function tokensOf(pointer) {
|
|
19
|
+
if (pointer === "")
|
|
20
|
+
return [];
|
|
21
|
+
if (!pointer.startsWith("/"))
|
|
22
|
+
throw new TypeError("a json pointer does not start with /");
|
|
23
|
+
return pointer.split("/").slice(1).map(decodeToken);
|
|
24
|
+
}
|
|
25
|
+
function encodeToken(token) {
|
|
26
|
+
return token.replace(/~/g, "~0").replace(/\//g, "~1");
|
|
27
|
+
}
|
|
28
|
+
function pointerFromTokens(tokens) {
|
|
29
|
+
if (tokens.length === 0)
|
|
30
|
+
return "";
|
|
31
|
+
return `/${tokens.map(encodeToken).join("/")}`;
|
|
32
|
+
}
|
|
33
|
+
function skipWs(text, index) {
|
|
34
|
+
while (index < text.length && /\s/u.test(text[index]))
|
|
35
|
+
index += 1;
|
|
36
|
+
return index;
|
|
37
|
+
}
|
|
38
|
+
function parseString(text, index) {
|
|
39
|
+
if (text[index] !== '"')
|
|
40
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
41
|
+
index += 1;
|
|
42
|
+
let value = "";
|
|
43
|
+
while (index < text.length) {
|
|
44
|
+
const ch = text[index];
|
|
45
|
+
if (ch === '"')
|
|
46
|
+
return { end: index + 1, value };
|
|
47
|
+
if (ch === "\\") {
|
|
48
|
+
index += 1;
|
|
49
|
+
if (index >= text.length)
|
|
50
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
51
|
+
value += text[index];
|
|
52
|
+
index += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
value += ch;
|
|
56
|
+
index += 1;
|
|
57
|
+
}
|
|
58
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
59
|
+
}
|
|
60
|
+
function parseLiteral(text, index) {
|
|
61
|
+
const start = index;
|
|
62
|
+
if (text.startsWith("true", index))
|
|
63
|
+
return { end: index + 4, value: true };
|
|
64
|
+
if (text.startsWith("false", index))
|
|
65
|
+
return { end: index + 5, value: false };
|
|
66
|
+
if (text.startsWith("null", index))
|
|
67
|
+
return { end: index + 4, value: null };
|
|
68
|
+
if (text[index] === "-")
|
|
69
|
+
index += 1;
|
|
70
|
+
while (index < text.length && /[0-9.eE+-]/u.test(text[index]))
|
|
71
|
+
index += 1;
|
|
72
|
+
if (index === start || (text[start] === "-" && index === start + 1)) {
|
|
73
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
74
|
+
}
|
|
75
|
+
const slice = text.slice(start, index);
|
|
76
|
+
const value = JSON.parse(slice);
|
|
77
|
+
return { end: index, value };
|
|
78
|
+
}
|
|
79
|
+
function assertStableObjectKey(keyRaw, key) {
|
|
80
|
+
if (keyRaw !== JSON.stringify(key))
|
|
81
|
+
throw new JsonEditUnstableError();
|
|
82
|
+
}
|
|
83
|
+
function indexJsonSpans(text) {
|
|
84
|
+
const spans = new Map();
|
|
85
|
+
const objectEntries = new Map();
|
|
86
|
+
function parseValue(index, pointer) {
|
|
87
|
+
index = skipWs(text, index);
|
|
88
|
+
const start = index;
|
|
89
|
+
const ch = text[index];
|
|
90
|
+
if (ch === '"') {
|
|
91
|
+
const parsed = parseString(text, index);
|
|
92
|
+
spans.set(pointer, { start, end: parsed.end });
|
|
93
|
+
return { end: parsed.end, value: parsed.value };
|
|
94
|
+
}
|
|
95
|
+
if (ch === "{") {
|
|
96
|
+
index += 1;
|
|
97
|
+
const record = {};
|
|
98
|
+
index = skipWs(text, index);
|
|
99
|
+
if (text[index] === "}") {
|
|
100
|
+
spans.set(pointer, { start, end: index + 1 });
|
|
101
|
+
objectEntries.set(pointer, []);
|
|
102
|
+
return { end: index + 1, value: record };
|
|
103
|
+
}
|
|
104
|
+
const entries = [];
|
|
105
|
+
while (index < text.length) {
|
|
106
|
+
index = skipWs(text, index);
|
|
107
|
+
const keyStart = index;
|
|
108
|
+
const keyParsed = parseString(text, index);
|
|
109
|
+
assertStableObjectKey(text.slice(keyStart, keyParsed.end), keyParsed.value);
|
|
110
|
+
if (Object.hasOwn(record, keyParsed.value))
|
|
111
|
+
throw new JsonEditUnstableError();
|
|
112
|
+
index = keyParsed.end;
|
|
113
|
+
index = skipWs(text, index);
|
|
114
|
+
if (text[index] !== ":")
|
|
115
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
116
|
+
index += 1;
|
|
117
|
+
const valuePointer = pointerFromTokens([...tokensOf(pointer), keyParsed.value]);
|
|
118
|
+
const child = parseValue(index, valuePointer);
|
|
119
|
+
index = child.end;
|
|
120
|
+
entries.push({ key: keyParsed.value, keyRaw: text.slice(keyStart, keyParsed.end), valuePointer });
|
|
121
|
+
record[keyParsed.value] = child.value;
|
|
122
|
+
index = skipWs(text, index);
|
|
123
|
+
if (text[index] === ",") {
|
|
124
|
+
index += 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (text[index] === "}") {
|
|
128
|
+
spans.set(pointer, { start, end: index + 1 });
|
|
129
|
+
objectEntries.set(pointer, entries);
|
|
130
|
+
return { end: index + 1, value: record };
|
|
131
|
+
}
|
|
132
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
133
|
+
}
|
|
134
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
135
|
+
}
|
|
136
|
+
if (ch === "[") {
|
|
137
|
+
index += 1;
|
|
138
|
+
const array = [];
|
|
139
|
+
index = skipWs(text, index);
|
|
140
|
+
if (text[index] === "]") {
|
|
141
|
+
spans.set(pointer, { start, end: index + 1 });
|
|
142
|
+
return { end: index + 1, value: array };
|
|
143
|
+
}
|
|
144
|
+
let position = 0;
|
|
145
|
+
while (index < text.length) {
|
|
146
|
+
const child = parseValue(index, pointerFromTokens([...tokensOf(pointer), String(position)]));
|
|
147
|
+
index = child.end;
|
|
148
|
+
array.push(child.value);
|
|
149
|
+
position += 1;
|
|
150
|
+
index = skipWs(text, index);
|
|
151
|
+
if (text[index] === ",") {
|
|
152
|
+
index += 1;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (text[index] === "]") {
|
|
156
|
+
spans.set(pointer, { start, end: index + 1 });
|
|
157
|
+
return { end: index + 1, value: array };
|
|
158
|
+
}
|
|
159
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
160
|
+
}
|
|
161
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
162
|
+
}
|
|
163
|
+
const literal = parseLiteral(text, index);
|
|
164
|
+
spans.set(pointer, { start, end: literal.end });
|
|
165
|
+
return { end: literal.end, value: literal.value };
|
|
166
|
+
}
|
|
167
|
+
const parsed = parseValue(0, "");
|
|
168
|
+
if (skipWs(text, parsed.end) !== text.length)
|
|
169
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
170
|
+
return { value: parsed.value, spans, objectEntries };
|
|
171
|
+
}
|
|
172
|
+
function editTargets(edits) {
|
|
173
|
+
const targets = new Set();
|
|
174
|
+
for (const edit of edits) {
|
|
175
|
+
const tokens = tokensOf(edit.pointer);
|
|
176
|
+
if (tokens.length === 0) {
|
|
177
|
+
targets.add("");
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const last = tokens[tokens.length - 1];
|
|
181
|
+
if (last === "-")
|
|
182
|
+
targets.add(pointerFromTokens(tokens.slice(0, -1)));
|
|
183
|
+
else
|
|
184
|
+
targets.add(edit.pointer);
|
|
185
|
+
}
|
|
186
|
+
return targets;
|
|
187
|
+
}
|
|
188
|
+
function subtreeModified(pointer, modified) {
|
|
189
|
+
if (modified.has(pointer))
|
|
190
|
+
return true;
|
|
191
|
+
const prefix = pointer === "" ? "/" : `${pointer}/`;
|
|
192
|
+
for (const target of modified) {
|
|
193
|
+
if (target.startsWith(prefix))
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
function renderPreserving(text, value, pointer, style, depth, spans, modified, objectEntries) {
|
|
199
|
+
if (!subtreeModified(pointer, modified)) {
|
|
200
|
+
const span = spans.get(pointer);
|
|
201
|
+
if (span !== undefined)
|
|
202
|
+
return text.slice(span.start, span.end);
|
|
203
|
+
}
|
|
204
|
+
if (value === null)
|
|
205
|
+
return "null";
|
|
206
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
207
|
+
return JSON.stringify(value);
|
|
208
|
+
if (Array.isArray(value)) {
|
|
209
|
+
if (value.length === 0)
|
|
210
|
+
return "[]";
|
|
211
|
+
const rendered = value.map((entry, index) => renderPreserving(text, entry, pointerFromTokens([...tokensOf(pointer), String(index)]), style, depth + 1, spans, modified, objectEntries));
|
|
212
|
+
if (style.indent === "")
|
|
213
|
+
return `[${rendered.join(",")}]`;
|
|
214
|
+
const pad = style.indent.repeat(depth + 1);
|
|
215
|
+
const inner = rendered.map((entry) => `${pad}${entry}`).join(`,${style.newline}`);
|
|
216
|
+
return `[${style.newline}${inner}${style.newline}${style.indent.repeat(depth)}]`;
|
|
217
|
+
}
|
|
218
|
+
if (typeof value === "object") {
|
|
219
|
+
const record = value;
|
|
220
|
+
const keys = Object.keys(record);
|
|
221
|
+
if (keys.length === 0)
|
|
222
|
+
return "{}";
|
|
223
|
+
const sourceEntries = objectEntries.get(pointer);
|
|
224
|
+
const rendered = sourceEntries === undefined
|
|
225
|
+
? keys.map((key) => {
|
|
226
|
+
const childPointer = pointerFromTokens([...tokensOf(pointer), key]);
|
|
227
|
+
return `${JSON.stringify(key)}:${style.colon}${renderPreserving(text, record[key], childPointer, style, depth + 1, spans, modified, objectEntries)}`;
|
|
228
|
+
})
|
|
229
|
+
: (() => {
|
|
230
|
+
const written = new Set();
|
|
231
|
+
const parts = [];
|
|
232
|
+
for (const entry of sourceEntries) {
|
|
233
|
+
if (!Object.hasOwn(record, entry.key))
|
|
234
|
+
continue;
|
|
235
|
+
written.add(entry.key);
|
|
236
|
+
parts.push(`${entry.keyRaw}:${style.colon}${renderPreserving(text, record[entry.key], entry.valuePointer, style, depth + 1, spans, modified, objectEntries)}`);
|
|
237
|
+
}
|
|
238
|
+
for (const key of keys) {
|
|
239
|
+
if (written.has(key))
|
|
240
|
+
continue;
|
|
241
|
+
const childPointer = pointerFromTokens([...tokensOf(pointer), key]);
|
|
242
|
+
parts.push(`${JSON.stringify(key)}:${style.colon}${renderPreserving(text, record[key], childPointer, style, depth + 1, spans, modified, objectEntries)}`);
|
|
243
|
+
}
|
|
244
|
+
return parts;
|
|
245
|
+
})();
|
|
246
|
+
if (style.indent === "")
|
|
247
|
+
return `{${rendered.join(",")}}`;
|
|
248
|
+
const pad = style.indent.repeat(depth + 1);
|
|
249
|
+
const inner = rendered.map((entry) => `${pad}${entry}`).join(`,${style.newline}`);
|
|
250
|
+
return `{${style.newline}${inner}${style.newline}${style.indent.repeat(depth)}}`;
|
|
251
|
+
}
|
|
252
|
+
throw new TypeError("a json pointer edit was given a value JSON cannot render");
|
|
253
|
+
}
|
|
254
|
+
function unchangedBytesPreserved(original, edited, spans, modified) {
|
|
255
|
+
for (const [pointer, span] of spans) {
|
|
256
|
+
if (subtreeModified(pointer, modified))
|
|
257
|
+
continue;
|
|
258
|
+
const slice = original.slice(span.start, span.end);
|
|
259
|
+
if (!edited.includes(slice))
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
function detectStyle(text) {
|
|
265
|
+
const newline = text.includes("\r\n") ? "\r\n" : "\n";
|
|
266
|
+
const escaped = newline === "\r\n" ? "\\r\\n" : "\\n";
|
|
267
|
+
const indent = new RegExp(`${escaped}([ \\t]+)\\S`, "u").exec(text)?.[1] ?? "";
|
|
268
|
+
return { indent, newline, finalNewline: text.endsWith("\n"), colon: /:[ \t]/u.test(text) ? " " : "" };
|
|
269
|
+
}
|
|
270
|
+
function renderValue(value, style, depth) {
|
|
271
|
+
if (value === null)
|
|
272
|
+
return "null";
|
|
273
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
274
|
+
return JSON.stringify(value);
|
|
275
|
+
if (Array.isArray(value)) {
|
|
276
|
+
if (value.length === 0)
|
|
277
|
+
return "[]";
|
|
278
|
+
const rendered = value.map((entry) => renderValue(entry, style, depth + 1));
|
|
279
|
+
if (style.indent === "")
|
|
280
|
+
return `[${rendered.join(",")}]`;
|
|
281
|
+
const pad = style.indent.repeat(depth + 1);
|
|
282
|
+
const inner = rendered.map((entry) => `${pad}${entry}`).join(`,${style.newline}`);
|
|
283
|
+
return `[${style.newline}${inner}${style.newline}${style.indent.repeat(depth)}]`;
|
|
284
|
+
}
|
|
285
|
+
if (typeof value === "object") {
|
|
286
|
+
const record = value;
|
|
287
|
+
const keys = Object.keys(record);
|
|
288
|
+
if (keys.length === 0)
|
|
289
|
+
return "{}";
|
|
290
|
+
const rendered = keys.map((key) => `${JSON.stringify(key)}:${style.colon}${renderValue(record[key], style, depth + 1)}`);
|
|
291
|
+
if (style.indent === "")
|
|
292
|
+
return `{${rendered.join(",")}}`;
|
|
293
|
+
const pad = style.indent.repeat(depth + 1);
|
|
294
|
+
const inner = rendered.map((entry) => `${pad}${entry}`).join(`,${style.newline}`);
|
|
295
|
+
return `{${style.newline}${inner}${style.newline}${style.indent.repeat(depth)}}`;
|
|
296
|
+
}
|
|
297
|
+
throw new TypeError("a json pointer edit was given a value JSON cannot render");
|
|
298
|
+
}
|
|
299
|
+
function finish(body, style) {
|
|
300
|
+
if (style.finalNewline)
|
|
301
|
+
return body.endsWith("\n") ? body : `${body}${style.newline}`;
|
|
302
|
+
return body.replace(/\r?\n$/u, "");
|
|
303
|
+
}
|
|
304
|
+
function isIndex(token) {
|
|
305
|
+
return /^(?:0|[1-9]\d*)$/u.test(token);
|
|
306
|
+
}
|
|
307
|
+
function containerFor(next) {
|
|
308
|
+
return next === "-" || isIndex(next) ? [] : {};
|
|
309
|
+
}
|
|
310
|
+
function childOf(parent, token, next) {
|
|
311
|
+
if (Array.isArray(parent)) {
|
|
312
|
+
if (!isIndex(token))
|
|
313
|
+
throw new TypeError("a json pointer does not address an array index");
|
|
314
|
+
const index = Number(token);
|
|
315
|
+
const current = parent[index];
|
|
316
|
+
if (current === undefined) {
|
|
317
|
+
const created = containerFor(next);
|
|
318
|
+
parent[index] = created;
|
|
319
|
+
return created;
|
|
320
|
+
}
|
|
321
|
+
return current;
|
|
322
|
+
}
|
|
323
|
+
if (parent === null || typeof parent !== "object")
|
|
324
|
+
throw new TypeError("a json pointer does not address an object");
|
|
325
|
+
const record = parent;
|
|
326
|
+
if (!Object.hasOwn(record, token) || record[token] === undefined) {
|
|
327
|
+
const created = containerFor(next);
|
|
328
|
+
record[token] = created;
|
|
329
|
+
return created;
|
|
330
|
+
}
|
|
331
|
+
return record[token];
|
|
332
|
+
}
|
|
333
|
+
function assign(parent, token, edit) {
|
|
334
|
+
if (Array.isArray(parent)) {
|
|
335
|
+
if (token === "-") {
|
|
336
|
+
if (edit.remove === true)
|
|
337
|
+
throw new TypeError("a json pointer cannot remove an append");
|
|
338
|
+
parent.push(edit.value);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (!isIndex(token))
|
|
342
|
+
throw new TypeError("a json pointer does not address an array index");
|
|
343
|
+
const index = Number(token);
|
|
344
|
+
if (!Object.hasOwn(parent, index))
|
|
345
|
+
throw new TypeError("a json pointer does not address an array index");
|
|
346
|
+
if (edit.remove === true)
|
|
347
|
+
parent.splice(index, 1);
|
|
348
|
+
else
|
|
349
|
+
parent[index] = edit.value;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (parent === null || typeof parent !== "object")
|
|
353
|
+
throw new TypeError("a json pointer does not address an object");
|
|
354
|
+
const record = parent;
|
|
355
|
+
if (edit.remove === true)
|
|
356
|
+
delete record[token];
|
|
357
|
+
else
|
|
358
|
+
record[token] = edit.value;
|
|
359
|
+
}
|
|
360
|
+
function applyOne(root, edit) {
|
|
361
|
+
const tokens = tokensOf(edit.pointer);
|
|
362
|
+
if (tokens.length === 0) {
|
|
363
|
+
if (edit.remove === true)
|
|
364
|
+
throw new TypeError("a json pointer edit cannot remove the whole document");
|
|
365
|
+
return edit.value;
|
|
366
|
+
}
|
|
367
|
+
if (root === null || typeof root !== "object")
|
|
368
|
+
throw new TypeError("a json pointer does not address an object");
|
|
369
|
+
let parent = root;
|
|
370
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
371
|
+
parent = childOf(parent, tokens[index], tokens[index + 1] ?? "");
|
|
372
|
+
}
|
|
373
|
+
assign(parent, tokens[tokens.length - 1], edit);
|
|
374
|
+
return root;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* The value a JSON pointer addresses in `text`, or `{ found: false }` when
|
|
378
|
+
* a token along the pointer is absent. The text must be JSON; a parse
|
|
379
|
+
* failure throws a TypeError that does not quote the text.
|
|
380
|
+
*/
|
|
381
|
+
export function valueAtJsonPointer(text, pointer) {
|
|
382
|
+
let root;
|
|
383
|
+
try {
|
|
384
|
+
root = JSON.parse(text);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
throw new TypeError("a json pointer was given text that is not JSON");
|
|
388
|
+
}
|
|
389
|
+
const tokens = tokensOf(pointer);
|
|
390
|
+
let current = root;
|
|
391
|
+
for (const token of tokens) {
|
|
392
|
+
if (Array.isArray(current)) {
|
|
393
|
+
if (!isIndex(token) || !Object.hasOwn(current, Number(token)))
|
|
394
|
+
return { found: false, value: undefined };
|
|
395
|
+
current = current[Number(token)];
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
if (current === null || typeof current !== "object" || !Object.hasOwn(current, token))
|
|
399
|
+
return { found: false, value: undefined };
|
|
400
|
+
current = current[token];
|
|
401
|
+
}
|
|
402
|
+
return { found: true, value: current };
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Applies `edits` to `text` and returns the edited document. An empty edit
|
|
406
|
+
* list returns `text` unchanged. Indent, the order of existing keys, and
|
|
407
|
+
* whether the text ended in a newline are taken from `text` and used for
|
|
408
|
+
* the render. The render is parsed and rendered a second time, and the two
|
|
409
|
+
* results must be the same bytes.
|
|
410
|
+
*/
|
|
411
|
+
export function editJsonPointer(text, edits) {
|
|
412
|
+
if (edits.length === 0)
|
|
413
|
+
return text;
|
|
414
|
+
let indexed;
|
|
415
|
+
try {
|
|
416
|
+
indexed = indexJsonSpans(text);
|
|
417
|
+
}
|
|
418
|
+
catch (cause) {
|
|
419
|
+
if (cause instanceof JsonEditUnstableError)
|
|
420
|
+
throw cause;
|
|
421
|
+
throw new TypeError("a json pointer edit was given text that is not JSON");
|
|
422
|
+
}
|
|
423
|
+
let root = indexed.value;
|
|
424
|
+
for (const edit of edits)
|
|
425
|
+
root = applyOne(root, edit);
|
|
426
|
+
const modified = editTargets(edits);
|
|
427
|
+
const style = detectStyle(text);
|
|
428
|
+
const rendered = finish(renderPreserving(text, root, "", style, 0, indexed.spans, modified, indexed.objectEntries), style);
|
|
429
|
+
if (!unchangedBytesPreserved(text, rendered, indexed.spans, modified))
|
|
430
|
+
throw new JsonEditUnstableError();
|
|
431
|
+
let again;
|
|
432
|
+
try {
|
|
433
|
+
const reread = indexJsonSpans(rendered);
|
|
434
|
+
again = finish(renderPreserving(rendered, reread.value, "", style, 0, reread.spans, new Set(), reread.objectEntries), style);
|
|
435
|
+
}
|
|
436
|
+
catch (cause) {
|
|
437
|
+
if (cause instanceof JsonEditUnstableError)
|
|
438
|
+
throw cause;
|
|
439
|
+
throw new JsonEditUnstableError();
|
|
440
|
+
}
|
|
441
|
+
if (rendered !== again)
|
|
442
|
+
throw new JsonEditUnstableError();
|
|
443
|
+
return rendered;
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=key-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-editor.js","sourceRoot":"","sources":["../src/key-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import type { ApprovalBinding, ExistingDeclarationAdoption, ChangeSetPhase, DependencyPlacement, RepositoryChangeSet } from "./change-set-contract.js";
|
|
2
|
+
import type { ValidationResult } from "./plan-contract.js";
|
|
3
|
+
/** One generation: the change set that wrote it, and on what authority. */
|
|
4
|
+
export interface LedgerHistoryEntry {
|
|
5
|
+
readonly generation: number;
|
|
6
|
+
readonly changeSet: string;
|
|
7
|
+
readonly phase: ChangeSetPhase;
|
|
8
|
+
readonly planDigest: string;
|
|
9
|
+
readonly bundle: string;
|
|
10
|
+
readonly baseCommit: string;
|
|
11
|
+
readonly binding: ApprovalBinding;
|
|
12
|
+
}
|
|
13
|
+
/** A whole file the flow wrote and still owns. */
|
|
14
|
+
export interface LedgerFileRow {
|
|
15
|
+
readonly path: string;
|
|
16
|
+
readonly mode: "100644" | "120000";
|
|
17
|
+
readonly after: string;
|
|
18
|
+
readonly changeSet: string;
|
|
19
|
+
}
|
|
20
|
+
/** A package.json key the flow wrote. */
|
|
21
|
+
export interface LedgerKeyRow {
|
|
22
|
+
readonly file: "package.json";
|
|
23
|
+
readonly pointer: string;
|
|
24
|
+
readonly value: string;
|
|
25
|
+
readonly changeSet: string;
|
|
26
|
+
}
|
|
27
|
+
/** An entry the flow added to a release-age exemption list, or to a Controller profile's root vocabulary. */
|
|
28
|
+
export type LedgerEntryRow = {
|
|
29
|
+
readonly file: "pnpm-workspace.yaml";
|
|
30
|
+
readonly key: "minimumReleaseAgeExclude";
|
|
31
|
+
readonly value: string;
|
|
32
|
+
readonly changeSet: string;
|
|
33
|
+
} | {
|
|
34
|
+
readonly file: ".yarnrc.yml";
|
|
35
|
+
readonly key: "npmPreapprovedPackages";
|
|
36
|
+
readonly value: string;
|
|
37
|
+
readonly changeSet: string;
|
|
38
|
+
} | {
|
|
39
|
+
readonly file: string;
|
|
40
|
+
readonly key: "rootEntries";
|
|
41
|
+
readonly value: string;
|
|
42
|
+
readonly changeSet: string;
|
|
43
|
+
};
|
|
44
|
+
/** One exact package identity, as a package act names it. */
|
|
45
|
+
export interface LedgerPackageIdentity {
|
|
46
|
+
readonly planItem: string;
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly version: string;
|
|
49
|
+
readonly integrity: string;
|
|
50
|
+
readonly placement: DependencyPlacement;
|
|
51
|
+
}
|
|
52
|
+
/** A package act in effect. */
|
|
53
|
+
export interface LedgerPackageRow extends LedgerPackageIdentity {
|
|
54
|
+
readonly act: "install" | "pin-starter";
|
|
55
|
+
readonly changeSet: string;
|
|
56
|
+
}
|
|
57
|
+
/** An install the latest setup set deferred, with the plan's identity for it. */
|
|
58
|
+
export interface LedgerDeferredRow extends LedgerPackageIdentity {
|
|
59
|
+
readonly act: "install";
|
|
60
|
+
readonly reason: "after-setup";
|
|
61
|
+
readonly changeSet: string;
|
|
62
|
+
}
|
|
63
|
+
/** clossys/.state/installed.json (installed-ledger.json, in the public repository, not shipped in this package). */
|
|
64
|
+
export interface InstalledLedger {
|
|
65
|
+
readonly existingDeclarationAdoptions?: readonly (ExistingDeclarationAdoption & {
|
|
66
|
+
readonly changeSet: string;
|
|
67
|
+
})[];
|
|
68
|
+
readonly schemaVersion: 1;
|
|
69
|
+
readonly kind: "clossys.installed-ledger";
|
|
70
|
+
readonly repository: {
|
|
71
|
+
readonly id: string;
|
|
72
|
+
readonly nodeId: string;
|
|
73
|
+
};
|
|
74
|
+
readonly generation: number;
|
|
75
|
+
readonly history: readonly LedgerHistoryEntry[];
|
|
76
|
+
readonly files: readonly LedgerFileRow[];
|
|
77
|
+
readonly keys: readonly LedgerKeyRow[];
|
|
78
|
+
readonly entries: readonly LedgerEntryRow[];
|
|
79
|
+
readonly packages: readonly LedgerPackageRow[];
|
|
80
|
+
readonly deferred: readonly LedgerDeferredRow[];
|
|
81
|
+
}
|
|
82
|
+
export type LedgerRuleId = "L1" | "L2" | "L3" | "L4" | "L5" | "L6" | "L7" | "L8" | "L9" | "L10";
|
|
83
|
+
export type LedgerSuccessionRuleId = "S2" | "S3";
|
|
84
|
+
/** One reason a ledger, or a pair of ledgers, is refused: `rule` is "schema" for the contract's keywords, "bytes" for text that is not a ledger's exact bytes, else the rule's id. */
|
|
85
|
+
export interface LedgerViolation {
|
|
86
|
+
readonly rule: "schema" | "bytes" | LedgerRuleId | LedgerSuccessionRuleId;
|
|
87
|
+
/** In a succession, which ledger breaks a contract rule; absent for S2 and S3, which relate the two. */
|
|
88
|
+
readonly side?: "base" | "head";
|
|
89
|
+
readonly path: string;
|
|
90
|
+
readonly message: string;
|
|
91
|
+
}
|
|
92
|
+
interface RuleViolation {
|
|
93
|
+
readonly rule: LedgerRuleId | LedgerSuccessionRuleId;
|
|
94
|
+
readonly path: string;
|
|
95
|
+
readonly message: string;
|
|
96
|
+
}
|
|
97
|
+
/** Code rules L1-L10 of installed-ledger.json, over a ledger whose schema already passes. Messages name positions, never values. */
|
|
98
|
+
export declare function ledgerRuleViolations(ledger: InstalledLedger): RuleViolation[];
|
|
99
|
+
/** Every reason a ledger is refused: the ledger contract's schema, then, once that passes, its code rules L1-L10. */
|
|
100
|
+
export declare function installedLedgerViolations(value: unknown): LedgerViolation[];
|
|
101
|
+
/** Validates a ledger against installed-ledger.json and its code rules L1-L10. A valid ledger is well formed, not trusted. No reason echoes a value. */
|
|
102
|
+
export declare function validateInstalledLedger(value: unknown): ValidationResult;
|
|
103
|
+
/**
|
|
104
|
+
* What a pull request's head ledger does to its base's. `change` is none only
|
|
105
|
+
* when both are valid, exactly canonical, and byte for byte the same.
|
|
106
|
+
* `admission` says what was proved about a next generation that breaks no
|
|
107
|
+
* rule: admitted when it is admitted and S3 held; approval-claimed when it is
|
|
108
|
+
* bound approved, which a reader without the hub cannot authenticate, so it
|
|
109
|
+
* is a claim, never an admission or a pass; null for no change, or when any
|
|
110
|
+
* rule refuses the pair.
|
|
111
|
+
*/
|
|
112
|
+
export interface LedgerSuccession {
|
|
113
|
+
readonly change: "none" | "next-generation";
|
|
114
|
+
readonly admission: "admitted" | "approval-claimed" | null;
|
|
115
|
+
readonly violations: readonly LedgerViolation[];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Reads a ledger from the exact bytes of clossys/.state/installed.json: the
|
|
119
|
+
* ledger when the bytes are valid under the contract and exactly the bytes
|
|
120
|
+
* RENDER gives it, else null. A repeated key, a byte order mark, invalid
|
|
121
|
+
* UTF-8, other spacing or member order, or any schema or code-rule refusal
|
|
122
|
+
* gives null, never a partial ledger; a non-`Uint8Array` argument also gives
|
|
123
|
+
* null. Well formed is not trusted: see TRUST in the contract.
|
|
124
|
+
*/
|
|
125
|
+
export declare function readInstalledLedger(bytes: Uint8Array): InstalledLedger | null;
|
|
126
|
+
/**
|
|
127
|
+
* Compares a pull request's head ledger with its base's, each given as the
|
|
128
|
+
* exact bytes of clossys/.state/installed.json (base null when the base has
|
|
129
|
+
* none), under the ledger contract's SUCCESSION rules. Each side must be a
|
|
130
|
+
* `Uint8Array`, valid and exactly canonical, or only those reasons are
|
|
131
|
+
* returned: a repeated key, a byte order mark, invalid UTF-8 or a second
|
|
132
|
+
* spelling is never read as an unchanged ledger, and two sides that decode to
|
|
133
|
+
* the same replacement text but differ in their actual bytes are never
|
|
134
|
+
* folded together, because each side is read from its own bytes independently.
|
|
135
|
+
* Then the head is either byte-identical to the base, or one next generation
|
|
136
|
+
* that keeps the base's history; and when that generation is admitted, it
|
|
137
|
+
* installs exactly what the base's setup deferred and changes no other row.
|
|
138
|
+
* An approved next generation is reported as approval-claimed: an
|
|
139
|
+
* unauthenticated claim, never an admission. It checks what the ledgers
|
|
140
|
+
* claim, not the files: whether the tree matches the head ledger is a
|
|
141
|
+
* separate check.
|
|
142
|
+
*/
|
|
143
|
+
export declare function ledgerSuccession(baseBytes: Uint8Array | null, headBytes: Uint8Array): LedgerSuccession;
|
|
144
|
+
/** Every object's members, in the order installed-ledger.json declares them (RENDER). */
|
|
145
|
+
export declare const LEDGER_MEMBER_ORDER: {
|
|
146
|
+
readonly ledger: readonly ["schemaVersion", "kind", "repository", "generation", "history", "files", "keys", "entries", "packages", "deferred", "existingDeclarationAdoptions"];
|
|
147
|
+
readonly repository: readonly ["id", "nodeId"];
|
|
148
|
+
readonly history: readonly ["generation", "changeSet", "phase", "planDigest", "bundle", "baseCommit", "binding"];
|
|
149
|
+
readonly approvedBinding: readonly ["kind", "subjectDigest"];
|
|
150
|
+
readonly admittedBinding: readonly ["kind", "subjectDigest", "setupChangeSet"];
|
|
151
|
+
readonly file: readonly ["path", "mode", "after", "changeSet"];
|
|
152
|
+
readonly key: readonly ["file", "pointer", "value", "changeSet"];
|
|
153
|
+
readonly entry: readonly ["file", "key", "value", "changeSet"];
|
|
154
|
+
readonly package: readonly ["planItem", "act", "name", "version", "integrity", "placement", "changeSet"];
|
|
155
|
+
readonly deferred: readonly ["planItem", "act", "name", "version", "integrity", "placement", "reason", "changeSet"];
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* The exact bytes of a ledger, as the contract's RENDER section defines
|
|
159
|
+
* them: every object's members in the contract's declared order, two-space
|
|
160
|
+
* JSON and one line feed. Throws, naming positions only, when the ledger is
|
|
161
|
+
* refused, so no refused ledger ever gets bytes.
|
|
162
|
+
*/
|
|
163
|
+
export declare function serializeInstalledLedger(ledger: InstalledLedger): string;
|
|
164
|
+
/**
|
|
165
|
+
* The installed-state ledger a change set with digest `set.changeSetDigest`
|
|
166
|
+
* and binding `binding` writes over `previous` (null at generation 0):
|
|
167
|
+
* installed-ledger.json's RENDER section. Returns
|
|
168
|
+
* serializeInstalledLedger(ledger)'s bytes, so a result that fails the
|
|
169
|
+
* contract or its code rules throws before it is returned rather than being
|
|
170
|
+
* handed back malformed. `planPackages` gives the plan's identity for each
|
|
171
|
+
* planItem, which a deferred row needs since a change set's own deferral
|
|
172
|
+
* carries none. Throws a TypeError, naming only positions, never values,
|
|
173
|
+
* when: `set.changeSetDigest` is not this change set's own digest;
|
|
174
|
+
* `set.ledger.generation` is not previous's generation (0 with no
|
|
175
|
+
* previous); previous's repository differs from the set's; a deferred
|
|
176
|
+
* row's planItem names no plan package; an apply set keeps a whole file
|
|
177
|
+
* (before equal to after) at a path previous holds no row for, which would
|
|
178
|
+
* be an adoption row and only a setup set may adopt one; or an apply set
|
|
179
|
+
* writes a whole file whose before does not match previous's after at that
|
|
180
|
+
* path, or at a path previous holds no row for. The one apply-phase add is
|
|
181
|
+
* the Launcher guide (AGENTS_GUIDE_PATH, mode 100644, before null, after the
|
|
182
|
+
* digest of AGENTS_GUIDE_TEXT) over a previous ledger that holds no row for
|
|
183
|
+
* the path in any letter case: the row is written like any other. An add at
|
|
184
|
+
* any other path, or of other bytes, still throws.
|
|
185
|
+
*/
|
|
186
|
+
export declare function renderInstalledLedger(previous: InstalledLedger | null, set: RepositoryChangeSet, binding: ApprovalBinding, planPackages: readonly (LedgerPackageIdentity & {
|
|
187
|
+
readonly act: "install" | "pin-starter";
|
|
188
|
+
})[]): string;
|
|
189
|
+
export {};
|
|
190
|
+
//# sourceMappingURL=ledger-contract.d.ts.map
|