@clossys/launcher 0.3.1 → 0.4.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 +1324 -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 +453 -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 +799 -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 +157 -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 +381 -0
- package/dist/change-set-contract.d.ts.map +1 -0
- package/dist/change-set-contract.js +738 -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/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 +2840 -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 +34 -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 +187 -0
- package/dist/ledger-contract.d.ts.map +1 -0
- package/dist/ledger-contract.js +532 -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 +198 -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 +840 -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 +250 -0
- package/dist/plan-bundle.d.ts.map +1 -0
- package/dist/plan-bundle.js +827 -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 +493 -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 +34 -0
- package/dist/setup-template-scripts.d.ts.map +1 -0
- package/dist/setup-template-scripts.js +557 -0
- package/dist/setup-template-scripts.js.map +1 -0
- package/dist/setup-templates.d.ts +54 -0
- package/dist/setup-templates.d.ts.map +1 -0
- package/dist/setup-templates.js +427 -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 +572 -0
- package/src/admission.ts +816 -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 +164 -0
- package/src/body-command.ts +162 -0
- package/src/change-set-contract.ts +937 -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/generated/contract-schema.generated.ts +520 -0
- package/src/generated/package-scope.generated.ts +10 -0
- package/src/generated/plan-contracts.generated.ts +2840 -0
- package/src/host.ts +10 -0
- package/src/identity.ts +51 -0
- package/src/index.ts +72 -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 +637 -0
- package/src/ledger-trust.ts +267 -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 +886 -0
- package/src/observe-repository.ts +1365 -0
- package/src/plan-bundle-setup-fixture.ts +200 -0
- package/src/plan-bundle.ts +964 -0
- package/src/plan-command.ts +509 -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 +571 -0
- package/src/setup-templates.ts +471 -0
- package/src/skills.ts +161 -18
- package/src/status.ts +557 -0
- package/src/types.ts +148 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-contract.d.ts","sourceRoot":"","sources":["../src/ledger-contract.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG1H,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK3D,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,kDAAkD;AAClD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,6GAA6G;AAC7G,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,0BAA0B,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtI;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5H;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/G,6DAA6D;AAC7D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACzC;AAED,+BAA+B;AAC/B,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,aAAa,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;IAC9D,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,oHAAoH;AACpH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAChG,MAAM,MAAM,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,sLAAsL;AACtL,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,YAAY,GAAG,sBAAsB,CAAC;IAC1E,wGAAwG;IACxG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,aAAa;IACrB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,sBAAsB,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAyCD,oIAAoI;AACpI,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,aAAa,EAAE,CAgH7E;AAaD,qHAAqH;AACrH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,EAAE,CAE3E;AAED,wJAAwJ;AACxJ,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAIxE;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;CACjD;AA2ED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAE7E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,EAAE,SAAS,EAAE,UAAU,GAAG,gBAAgB,CAatG;AAED,yFAAyF;AACzF,eAAO,MAAM,mBAAmB;;;;;;;;;;;CAWtB,CAAC;AAOX;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAkBxE;AAUD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,GAAG,EAAE,mBAAmB,EACxB,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,SAAS,CAAC,qBAAqB,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,aAAa,CAAA;CAAE,CAAC,EAAE,GAC7F,MAAM,CA8HR"}
|
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
// The installed-state ledger (issue #1178), validated against the shared
|
|
2
|
+
// contract docs/contracts/installed-ledger.json -- in the public repository,
|
|
3
|
+
// not shipped in this package. This package's build packs it into
|
|
4
|
+
// src/generated/ beside the change-set and bundle contracts, and validates
|
|
5
|
+
// it with the same generated copy of the one contract checker. Validation
|
|
6
|
+
// makes a ledger well formed, not true: trusting a row needs the hub's
|
|
7
|
+
// change sets (see TRUST in the contract), which nothing here reads. Nothing
|
|
8
|
+
// in this package writes a ledger yet. The TypeScript types below describe
|
|
9
|
+
// the contract's shapes for callers; they validate nothing.
|
|
10
|
+
import { AGENTS_GUIDE_PATH, AGENTS_GUIDE_TEXT } from "./agents-guide.js";
|
|
11
|
+
import { formatContractViolation, readContractDocument, validateAgainstContract } from "./generated/contract-schema.generated.js";
|
|
12
|
+
import { EXEMPTION_SURFACES, ID_TOKEN, INTRODUCIBLE_ROOTS, LEDGER_PATH, LOCKFILE_NAMES, canonicalOrder, compareTuples, contentDigest, derivedPlanItem, dependencyPointer, discoveryLinkRole, matchesPathPattern, } from "./change-set-contract.js";
|
|
13
|
+
import { changeSetDigest } from "./change-set-digest.js";
|
|
14
|
+
import { loadContract } from "./plan-contract.js";
|
|
15
|
+
/** The digest of the Launcher guide's bytes: the only after an apply-phase add of the guide may carry (RENDER and S3). */
|
|
16
|
+
const AGENTS_GUIDE_DIGEST = contentDigest(AGENTS_GUIDE_TEXT);
|
|
17
|
+
const CONTRACT = "installed-ledger.json";
|
|
18
|
+
/** The owned path patterns, read from the packed ledger contract. */
|
|
19
|
+
const OWNED_PATTERNS = (() => {
|
|
20
|
+
const definitions = loadContract(CONTRACT).definitions;
|
|
21
|
+
const list = definitions?.ownedPattern?.enum;
|
|
22
|
+
if (!Array.isArray(list) || !list.every((entry) => typeof entry === "string"))
|
|
23
|
+
throw new Error("the packed ledger contract has no ownedPattern list");
|
|
24
|
+
return list;
|
|
25
|
+
})();
|
|
26
|
+
function repeats(values, key) {
|
|
27
|
+
const seen = new Map();
|
|
28
|
+
const out = [];
|
|
29
|
+
values.forEach((value, index) => {
|
|
30
|
+
const k = key(value);
|
|
31
|
+
const first = seen.get(k);
|
|
32
|
+
if (first === undefined)
|
|
33
|
+
seen.set(k, index);
|
|
34
|
+
else
|
|
35
|
+
out.push({ index, first });
|
|
36
|
+
});
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
/** Whether two JSON values are equal member for member, whatever their members' order. */
|
|
40
|
+
function sameValue(left, right) {
|
|
41
|
+
if (left === right)
|
|
42
|
+
return true;
|
|
43
|
+
if (typeof left !== "object" || typeof right !== "object" || left === null || right === null)
|
|
44
|
+
return false;
|
|
45
|
+
if (Array.isArray(left) !== Array.isArray(right))
|
|
46
|
+
return false;
|
|
47
|
+
if (Array.isArray(left)) {
|
|
48
|
+
const other = right;
|
|
49
|
+
return left.length === other.length && left.every((value, index) => sameValue(value, other[index]));
|
|
50
|
+
}
|
|
51
|
+
const a = left;
|
|
52
|
+
const b = right;
|
|
53
|
+
const keys = Object.keys(a);
|
|
54
|
+
return keys.length === Object.keys(b).length && keys.every((key) => Object.hasOwn(b, key) && sameValue(a[key], b[key]));
|
|
55
|
+
}
|
|
56
|
+
const IDENTITY = ["planItem", "act", "name", "version", "integrity", "placement"];
|
|
57
|
+
/** Code rules L1-L10 of installed-ledger.json, over a ledger whose schema already passes. Messages name positions, never values. */
|
|
58
|
+
export function ledgerRuleViolations(ledger) {
|
|
59
|
+
const out = [];
|
|
60
|
+
const push = (rule, path, message) => out.push({ rule, path, message });
|
|
61
|
+
const { history } = ledger;
|
|
62
|
+
// L1
|
|
63
|
+
if (ledger.generation < 1 || ledger.generation !== history.length)
|
|
64
|
+
push("L1", "generation", "must be 1 or more and equal the number of history entries");
|
|
65
|
+
history.forEach((entry, index) => {
|
|
66
|
+
if (entry.generation !== index + 1)
|
|
67
|
+
push("L1", `history[${index}].generation`, "is not its position plus 1");
|
|
68
|
+
});
|
|
69
|
+
// L2
|
|
70
|
+
for (const { index, first } of repeats(history, (entry) => entry.changeSet))
|
|
71
|
+
push("L2", `history[${index}].changeSet`, `repeats history[${first}].changeSet`);
|
|
72
|
+
// L3
|
|
73
|
+
history.forEach((entry, index) => {
|
|
74
|
+
const at = `history[${index}].binding`;
|
|
75
|
+
const { binding } = entry;
|
|
76
|
+
if (entry.phase === "setup" && binding.kind !== "approved") {
|
|
77
|
+
push("L3", at, "is not approved, and a setup entry's binding must be");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// An approved binding's subjectDigest may differ from the entry's bundle: bundle is the run that computed the set, subjectDigest the approval.
|
|
81
|
+
if (binding.kind === "approved")
|
|
82
|
+
return;
|
|
83
|
+
const previous = index > 0 ? history[index - 1] : undefined;
|
|
84
|
+
if (previous === undefined) {
|
|
85
|
+
push("L3", at, "is admitted, but no setup entry comes before it");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (previous.changeSet !== binding.setupChangeSet)
|
|
89
|
+
push("L3", `${at}.setupChangeSet`, "is not the change set of the entry before it");
|
|
90
|
+
if (previous.phase !== "setup" || previous.binding.kind !== "approved")
|
|
91
|
+
push("L3", at, "is admitted, but the entry before it is not an approved setup entry");
|
|
92
|
+
if (previous.planDigest !== entry.planDigest)
|
|
93
|
+
push("L3", `history[${index}].planDigest`, "is not the plan digest of the setup entry it follows");
|
|
94
|
+
if (previous.binding.subjectDigest !== binding.subjectDigest)
|
|
95
|
+
push("L3", `${at}.subjectDigest`, "is not the approved subject of the setup entry it follows");
|
|
96
|
+
});
|
|
97
|
+
// L4
|
|
98
|
+
const written = new Set(history.map((entry) => entry.changeSet));
|
|
99
|
+
const rowArrays = [
|
|
100
|
+
["files", ledger.files],
|
|
101
|
+
["keys", ledger.keys],
|
|
102
|
+
["entries", ledger.entries],
|
|
103
|
+
["packages", ledger.packages],
|
|
104
|
+
["deferred", ledger.deferred],
|
|
105
|
+
];
|
|
106
|
+
for (const [name, rows] of rowArrays) {
|
|
107
|
+
rows.forEach((row, index) => {
|
|
108
|
+
if (!written.has(row.changeSet))
|
|
109
|
+
push("L4", `${name}[${index}].changeSet`, "names no history entry's change set");
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const last = history.at(-1);
|
|
113
|
+
if (last !== undefined) {
|
|
114
|
+
ledger.deferred.forEach((row, index) => {
|
|
115
|
+
if (written.has(row.changeSet) && row.changeSet !== last.changeSet)
|
|
116
|
+
push("L4", `deferred[${index}].changeSet`, "is not the latest history entry's change set");
|
|
117
|
+
});
|
|
118
|
+
if (last.phase === "apply" && ledger.deferred.length > 0)
|
|
119
|
+
push("L4", "deferred", "must be empty after an apply generation");
|
|
120
|
+
}
|
|
121
|
+
// L5
|
|
122
|
+
ledger.files.forEach((row, index) => {
|
|
123
|
+
const at = `files[${index}]`;
|
|
124
|
+
const lowered = row.path.toLowerCase();
|
|
125
|
+
if (lowered === LEDGER_PATH.toLowerCase() || lowered === "package.json" || LOCKFILE_NAMES.includes(lowered))
|
|
126
|
+
push("L5", `${at}.path`, "is the ledger, package.json or a lockfile, which no files row names");
|
|
127
|
+
else if (!OWNED_PATTERNS.some((pattern) => matchesPathPattern(row.path, pattern)))
|
|
128
|
+
push("L5", `${at}.path`, "is not matched by any owned pattern");
|
|
129
|
+
const role = discoveryLinkRole(row.path) ?? /^\.agents\/skills\/clossys-([^/]+)\//u.exec(row.path)?.[1];
|
|
130
|
+
if (role !== undefined && !ID_TOKEN.test(role))
|
|
131
|
+
push("L5", `${at}.path`, "names a role that is not a lowercase id token");
|
|
132
|
+
const link = discoveryLinkRole(row.path) !== null;
|
|
133
|
+
if ((row.mode === "120000") !== link)
|
|
134
|
+
push("L5", `${at}.mode`, link ? "is not 120000, and this path is a discovery link" : "is 120000, which only a discovery link has");
|
|
135
|
+
});
|
|
136
|
+
// L6
|
|
137
|
+
ledger.keys.forEach((row, index) => {
|
|
138
|
+
const owners = ledger.packages.filter((pkg) => dependencyPointer(pkg.placement, pkg.name) === row.pointer);
|
|
139
|
+
if (owners.length !== 1)
|
|
140
|
+
push("L6", `keys[${index}].pointer`, "does not name exactly one packages row");
|
|
141
|
+
else if (owners[0].version !== row.value)
|
|
142
|
+
push("L6", `keys[${index}].value`, "is not the version of the package it names");
|
|
143
|
+
});
|
|
144
|
+
// L7
|
|
145
|
+
const acts = [...ledger.packages.map((row, index) => ({ row, path: `packages[${index}]` })), ...ledger.deferred.map((row, index) => ({ row, path: `deferred[${index}]` }))];
|
|
146
|
+
// A repeated planItem is a repeated name: L10 derives each planItem from its name.
|
|
147
|
+
for (const { index, first } of repeats(acts, (entry) => entry.row.name))
|
|
148
|
+
push("L7", `${acts[index].path}.name`, `repeats ${acts[first].path}.name`);
|
|
149
|
+
// L8
|
|
150
|
+
const order = (name, rows, key) => {
|
|
151
|
+
for (let index = 1; index < rows.length; index += 1) {
|
|
152
|
+
if (compareTuples(key(rows[index - 1]), key(rows[index])) >= 0) {
|
|
153
|
+
push("L8", `${name}[${index}]`, "is out of canonical order, or repeats the entry before it");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
order("files", ledger.files, (row) => [row.path]);
|
|
159
|
+
for (const { index, first } of repeats(ledger.files, (row) => row.path.toLowerCase()))
|
|
160
|
+
push("L8", `files[${index}].path`, `repeats files[${first}].path, compared case-insensitively`);
|
|
161
|
+
order("keys", ledger.keys, (row) => [row.file, row.pointer]);
|
|
162
|
+
order("entries", ledger.entries, (row) => [row.file, row.key, row.value]);
|
|
163
|
+
order("packages", ledger.packages, (row) => [row.planItem]);
|
|
164
|
+
order("deferred", ledger.deferred, (row) => [row.planItem]);
|
|
165
|
+
// L9
|
|
166
|
+
const profileRows = ledger.entries.map((row, index) => ({ row, index })).filter(({ row }) => row.key === "rootEntries");
|
|
167
|
+
const profileFile = profileRows[0]?.row.file;
|
|
168
|
+
for (const { row, index } of profileRows) {
|
|
169
|
+
if (row.file !== profileFile)
|
|
170
|
+
push("L9", `entries[${index}].file`, "is a second Controller profile, and the flow edits one");
|
|
171
|
+
if (!INTRODUCIBLE_ROOTS.has(row.value))
|
|
172
|
+
push("L9", `entries[${index}].value`, "is not a root name an owned pattern can introduce");
|
|
173
|
+
}
|
|
174
|
+
// L10: a planItem is derived from this repository's id and the package, never free text.
|
|
175
|
+
for (const [name, rows] of [["packages", ledger.packages], ["deferred", ledger.deferred]]) {
|
|
176
|
+
rows.forEach((row, index) => {
|
|
177
|
+
if (row.planItem !== derivedPlanItem(ledger.repository.id, row.name))
|
|
178
|
+
push("L10", `${name}[${index}].planItem`, "is not repository.id, a colon and the row's name");
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
function contractViolations(value, label, side) {
|
|
184
|
+
const where = side === undefined ? {} : { side };
|
|
185
|
+
const schema = validateAgainstContract(loadContract(CONTRACT), value, loadContract);
|
|
186
|
+
if (schema.length > 0)
|
|
187
|
+
return schema.map((violation) => ({ rule: "schema", ...where, path: violation.path, message: formatContractViolation(label, violation) }));
|
|
188
|
+
return ledgerRuleViolations(value).map((violation) => ({
|
|
189
|
+
...violation,
|
|
190
|
+
...where,
|
|
191
|
+
message: `${label}.${violation.path} ${violation.message} (rule ${violation.rule})`,
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
/** Every reason a ledger is refused: the ledger contract's schema, then, once that passes, its code rules L1-L10. */
|
|
195
|
+
export function installedLedgerViolations(value) {
|
|
196
|
+
return contractViolations(value, "ledger");
|
|
197
|
+
}
|
|
198
|
+
/** 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. */
|
|
199
|
+
export function validateInstalledLedger(value) {
|
|
200
|
+
const violations = installedLedgerViolations(value);
|
|
201
|
+
if (violations.length === 0)
|
|
202
|
+
return { valid: true };
|
|
203
|
+
return { valid: false, reason: violations.map((violation) => violation.message).join("; ") };
|
|
204
|
+
}
|
|
205
|
+
function successionRuleViolations(base, head) {
|
|
206
|
+
const out = [];
|
|
207
|
+
const push = (rule, path, message) => out.push({ rule, path, message });
|
|
208
|
+
// S2
|
|
209
|
+
if (base !== null && !sameValue(head.repository, base.repository))
|
|
210
|
+
push("S2", "head.repository", "is not the base ledger's repository");
|
|
211
|
+
// head.generation is base.generation plus 1 exactly when this holds, because L1 ties each ledger's generation to its history's length.
|
|
212
|
+
if (!sameValue(head.history.slice(0, -1), base?.history ?? []))
|
|
213
|
+
push("S2", "head.history", "does not keep the base ledger's history unchanged before its last entry, or is not one generation past it");
|
|
214
|
+
// S3
|
|
215
|
+
const last = head.history.at(-1);
|
|
216
|
+
if (last.binding.kind !== "admitted")
|
|
217
|
+
return out;
|
|
218
|
+
const at = `head.history[${head.history.length - 1}].binding`;
|
|
219
|
+
if (base === null) {
|
|
220
|
+
push("S3", at, "is admitted, but the base has no ledger holding the setup it follows");
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
// Already proved: L3 on the head makes the entry before an admitted one its approved setup entry, and S2 makes that entry the base's latest;
|
|
224
|
+
// L3 makes an admitted entry an apply entry, and L4 leaves no deferred row after one.
|
|
225
|
+
// The one file an admitted generation may add: the Launcher guide, for an install set up before it existed. Its row is the only change to
|
|
226
|
+
// the files, is written by this generation, holds the guide's own bytes, and so the base holds none at that path (L8 forbids a repeat in
|
|
227
|
+
// any letter case).
|
|
228
|
+
const addedFiles = head.files.filter((row) => !base.files.some((other) => sameValue(other, row)));
|
|
229
|
+
const droppedFiles = base.files.filter((row) => !head.files.some((other) => sameValue(other, row)));
|
|
230
|
+
const guideAdded = droppedFiles.length === 0 &&
|
|
231
|
+
addedFiles.length === 1 &&
|
|
232
|
+
addedFiles[0].path === AGENTS_GUIDE_PATH &&
|
|
233
|
+
addedFiles[0].mode === "100644" &&
|
|
234
|
+
addedFiles[0].after === AGENTS_GUIDE_DIGEST &&
|
|
235
|
+
addedFiles[0].changeSet === last.changeSet;
|
|
236
|
+
if (addedFiles.length + droppedFiles.length > 0 && !guideAdded)
|
|
237
|
+
push("S3", "head.files", "differ from the base ledger's, and an admitted generation changes no file but may add the guide's");
|
|
238
|
+
if (!sameValue(head.entries, base.entries))
|
|
239
|
+
push("S3", "head.entries", "differ from the base ledger's, and an admitted generation changes no entry");
|
|
240
|
+
const kept = (rows, from) => from.every((row) => rows.some((other) => sameValue(other, row)));
|
|
241
|
+
if (!kept(head.keys, base.keys))
|
|
242
|
+
push("S3", "head.keys", "drop or change a key row the base ledger has");
|
|
243
|
+
if (!kept(head.packages, base.packages))
|
|
244
|
+
push("S3", "head.packages", "drop or change a package row the base ledger has");
|
|
245
|
+
const added = head.packages.filter((row) => !base.packages.some((other) => sameValue(other, row)));
|
|
246
|
+
const matchesDeferral = (row, deferral) => IDENTITY.every((member) => row[member] === deferral[member]) && row.changeSet === last.changeSet;
|
|
247
|
+
const exact = added.length === base.deferred.length && base.deferred.every((deferral) => added.filter((row) => matchesDeferral(row, deferral)).length === 1);
|
|
248
|
+
if (!exact)
|
|
249
|
+
push("S3", "head.packages", "add something other than exactly the installs the base ledger's setup deferred");
|
|
250
|
+
const addedKeys = head.keys.filter((row) => !base.keys.some((other) => sameValue(other, row)));
|
|
251
|
+
const keyed = (row) => row.changeSet === last.changeSet && added.some((pkg) => dependencyPointer(pkg.placement, pkg.name) === row.pointer && pkg.version === row.value);
|
|
252
|
+
if (!addedKeys.every(keyed))
|
|
253
|
+
push("S3", "head.keys", "add a key row that is not for an install the base ledger's setup deferred");
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Reads one side's ledger from its bytes: decoded with the strict
|
|
258
|
+
* `readContractDocument()` (refuses a byte order mark, invalid UTF-8, a
|
|
259
|
+
* syntax error and a repeated key by position), then valid under the
|
|
260
|
+
* contract, then compared byte for byte with `serializeInstalledLedger()`'s
|
|
261
|
+
* own re-encoding of it. A caller's decode is never trusted: the bytes prove
|
|
262
|
+
* themselves. Any argument that is not a `Uint8Array` is refused under rule
|
|
263
|
+
* `bytes` before anything reads it.
|
|
264
|
+
*/
|
|
265
|
+
function readLedgerBytes(input, side) {
|
|
266
|
+
const refuse = (message) => ({ ledger: null, violations: [{ rule: "bytes", side, path: "", message: `${side} ${message} (rule bytes)` }] });
|
|
267
|
+
if (!(input instanceof Uint8Array))
|
|
268
|
+
return refuse("is not a ledger's bytes as a Uint8Array");
|
|
269
|
+
let parsed;
|
|
270
|
+
try {
|
|
271
|
+
parsed = readContractDocument(input);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return refuse("is not a ledger's exact bytes: not strict UTF-8 JSON, with no byte order mark and no repeated key");
|
|
275
|
+
}
|
|
276
|
+
const violations = contractViolations(parsed, side, side);
|
|
277
|
+
if (violations.length > 0)
|
|
278
|
+
return { ledger: null, violations };
|
|
279
|
+
const rendered = Buffer.from(serializeInstalledLedger(parsed), "utf8");
|
|
280
|
+
if (!rendered.equals(Buffer.from(input)))
|
|
281
|
+
return refuse("is not the exact bytes the ledger contract's RENDER section gives this ledger");
|
|
282
|
+
return { ledger: parsed, violations: [] };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Reads a ledger from the exact bytes of clossys/.state/installed.json: the
|
|
286
|
+
* ledger when the bytes are valid under the contract and exactly the bytes
|
|
287
|
+
* RENDER gives it, else null. A repeated key, a byte order mark, invalid
|
|
288
|
+
* UTF-8, other spacing or member order, or any schema or code-rule refusal
|
|
289
|
+
* gives null, never a partial ledger; a non-`Uint8Array` argument also gives
|
|
290
|
+
* null. Well formed is not trusted: see TRUST in the contract.
|
|
291
|
+
*/
|
|
292
|
+
export function readInstalledLedger(bytes) {
|
|
293
|
+
return readLedgerBytes(bytes, "head").ledger;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Compares a pull request's head ledger with its base's, each given as the
|
|
297
|
+
* exact bytes of clossys/.state/installed.json (base null when the base has
|
|
298
|
+
* none), under the ledger contract's SUCCESSION rules. Each side must be a
|
|
299
|
+
* `Uint8Array`, valid and exactly canonical, or only those reasons are
|
|
300
|
+
* returned: a repeated key, a byte order mark, invalid UTF-8 or a second
|
|
301
|
+
* spelling is never read as an unchanged ledger, and two sides that decode to
|
|
302
|
+
* the same replacement text but differ in their actual bytes are never
|
|
303
|
+
* folded together, because each side is read from its own bytes independently.
|
|
304
|
+
* Then the head is either byte-identical to the base, or one next generation
|
|
305
|
+
* that keeps the base's history; and when that generation is admitted, it
|
|
306
|
+
* installs exactly what the base's setup deferred and changes no other row.
|
|
307
|
+
* An approved next generation is reported as approval-claimed: an
|
|
308
|
+
* unauthenticated claim, never an admission. It checks what the ledgers
|
|
309
|
+
* claim, not the files: whether the tree matches the head ledger is a
|
|
310
|
+
* separate check.
|
|
311
|
+
*/
|
|
312
|
+
export function ledgerSuccession(baseBytes, headBytes) {
|
|
313
|
+
const base = baseBytes === null ? { ledger: null, violations: [] } : readLedgerBytes(baseBytes, "base");
|
|
314
|
+
const head = readLedgerBytes(headBytes, "head");
|
|
315
|
+
const invalid = [...base.violations, ...head.violations];
|
|
316
|
+
if (invalid.length > 0 || head.ledger === null)
|
|
317
|
+
return { change: "next-generation", admission: null, violations: invalid };
|
|
318
|
+
if (baseBytes !== null && Buffer.from(baseBytes).equals(Buffer.from(headBytes)))
|
|
319
|
+
return { change: "none", admission: null, violations: [] };
|
|
320
|
+
const violations = successionRuleViolations(base.ledger, head.ledger).map((violation) => ({
|
|
321
|
+
...violation,
|
|
322
|
+
message: `${violation.path} ${violation.message} (rule ${violation.rule})`,
|
|
323
|
+
}));
|
|
324
|
+
if (violations.length > 0)
|
|
325
|
+
return { change: "next-generation", admission: null, violations };
|
|
326
|
+
const admitted = head.ledger.history.at(-1).binding.kind === "admitted";
|
|
327
|
+
return { change: "next-generation", admission: admitted ? "admitted" : "approval-claimed", violations: [] };
|
|
328
|
+
}
|
|
329
|
+
/** Every object's members, in the order installed-ledger.json declares them (RENDER). */
|
|
330
|
+
export const LEDGER_MEMBER_ORDER = {
|
|
331
|
+
ledger: ["schemaVersion", "kind", "repository", "generation", "history", "files", "keys", "entries", "packages", "deferred"],
|
|
332
|
+
repository: ["id", "nodeId"],
|
|
333
|
+
history: ["generation", "changeSet", "phase", "planDigest", "bundle", "baseCommit", "binding"],
|
|
334
|
+
approvedBinding: ["kind", "subjectDigest"],
|
|
335
|
+
admittedBinding: ["kind", "subjectDigest", "setupChangeSet"],
|
|
336
|
+
file: ["path", "mode", "after", "changeSet"],
|
|
337
|
+
key: ["file", "pointer", "value", "changeSet"],
|
|
338
|
+
entry: ["file", "key", "value", "changeSet"],
|
|
339
|
+
package: ["planItem", "act", "name", "version", "integrity", "placement", "changeSet"],
|
|
340
|
+
deferred: ["planItem", "act", "name", "version", "integrity", "placement", "reason", "changeSet"],
|
|
341
|
+
};
|
|
342
|
+
function ordered(value, members) {
|
|
343
|
+
const record = value;
|
|
344
|
+
return Object.fromEntries(members.map((member) => [member, record[member]]));
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* The exact bytes of a ledger, as the contract's RENDER section defines
|
|
348
|
+
* them: every object's members in the contract's declared order, two-space
|
|
349
|
+
* JSON and one line feed. Throws, naming positions only, when the ledger is
|
|
350
|
+
* refused, so no refused ledger ever gets bytes.
|
|
351
|
+
*/
|
|
352
|
+
export function serializeInstalledLedger(ledger) {
|
|
353
|
+
const violations = installedLedgerViolations(ledger);
|
|
354
|
+
if (violations.length > 0)
|
|
355
|
+
throw new TypeError(`a refused ledger has no bytes: ${violations.map((violation) => violation.message).join("; ")}`);
|
|
356
|
+
const order = LEDGER_MEMBER_ORDER;
|
|
357
|
+
const canonical = {
|
|
358
|
+
...ordered(ledger, order.ledger),
|
|
359
|
+
repository: ordered(ledger.repository, order.repository),
|
|
360
|
+
history: ledger.history.map((entry) => ({
|
|
361
|
+
...ordered(entry, order.history),
|
|
362
|
+
binding: ordered(entry.binding, entry.binding.kind === "approved" ? order.approvedBinding : order.admittedBinding),
|
|
363
|
+
})),
|
|
364
|
+
files: ledger.files.map((row) => ordered(row, order.file)),
|
|
365
|
+
keys: ledger.keys.map((row) => ordered(row, order.key)),
|
|
366
|
+
entries: ledger.entries.map((row) => ordered(row, order.entry)),
|
|
367
|
+
packages: ledger.packages.map((row) => ordered(row, order.package)),
|
|
368
|
+
deferred: ledger.deferred.map((row) => ordered(row, order.deferred)),
|
|
369
|
+
};
|
|
370
|
+
return `${JSON.stringify(canonical, null, 2)}\n`;
|
|
371
|
+
}
|
|
372
|
+
/** Whether a change-set file entry is a whole file (not derived): the digest section's own test for the same distinction. */
|
|
373
|
+
function isWholeFile(file) {
|
|
374
|
+
return !("derived" in file);
|
|
375
|
+
}
|
|
376
|
+
const sameIdentity = (left, right) => left.planItem === right.planItem && left.act === right.act && left.name === right.name && left.version === right.version && left.integrity === right.integrity && left.placement === right.placement;
|
|
377
|
+
/**
|
|
378
|
+
* The installed-state ledger a change set with digest `set.changeSetDigest`
|
|
379
|
+
* and binding `binding` writes over `previous` (null at generation 0):
|
|
380
|
+
* installed-ledger.json's RENDER section. Returns
|
|
381
|
+
* serializeInstalledLedger(ledger)'s bytes, so a result that fails the
|
|
382
|
+
* contract or its code rules throws before it is returned rather than being
|
|
383
|
+
* handed back malformed. `planPackages` gives the plan's identity for each
|
|
384
|
+
* planItem, which a deferred row needs since a change set's own deferral
|
|
385
|
+
* carries none. Throws a TypeError, naming only positions, never values,
|
|
386
|
+
* when: `set.changeSetDigest` is not this change set's own digest;
|
|
387
|
+
* `set.ledger.generation` is not previous's generation (0 with no
|
|
388
|
+
* previous); previous's repository differs from the set's; a deferred
|
|
389
|
+
* row's planItem names no plan package; an apply set keeps a whole file
|
|
390
|
+
* (before equal to after) at a path previous holds no row for, which would
|
|
391
|
+
* be an adoption row and only a setup set may adopt one; or an apply set
|
|
392
|
+
* writes a whole file whose before does not match previous's after at that
|
|
393
|
+
* path, or at a path previous holds no row for. The one apply-phase add is
|
|
394
|
+
* the Launcher guide (AGENTS_GUIDE_PATH, mode 100644, before null, after the
|
|
395
|
+
* digest of AGENTS_GUIDE_TEXT) over a previous ledger that holds no row for
|
|
396
|
+
* the path in any letter case: the row is written like any other. An add at
|
|
397
|
+
* any other path, or of other bytes, still throws.
|
|
398
|
+
*/
|
|
399
|
+
export function renderInstalledLedger(previous, set, binding, planPackages) {
|
|
400
|
+
const digest = changeSetDigest(set);
|
|
401
|
+
if (set.changeSetDigest !== digest)
|
|
402
|
+
throw new TypeError("set.changeSetDigest is not this change set's own digest");
|
|
403
|
+
const d = digest;
|
|
404
|
+
const baseGeneration = previous?.generation ?? 0;
|
|
405
|
+
if (set.ledger.generation !== baseGeneration)
|
|
406
|
+
throw new TypeError("set.ledger.generation does not match previous's generation");
|
|
407
|
+
if (previous !== null && (previous.repository.id !== set.repository.id || previous.repository.nodeId !== set.repository.nodeId)) {
|
|
408
|
+
throw new TypeError("previous.repository is not the set's repository");
|
|
409
|
+
}
|
|
410
|
+
const generation = set.ledger.generation + 1;
|
|
411
|
+
const history = [
|
|
412
|
+
...(previous?.history ?? []),
|
|
413
|
+
{ generation, changeSet: d, phase: set.phase, planDigest: set.planDigest, bundle: set.bundle, baseCommit: set.repository.baseCommit, binding },
|
|
414
|
+
];
|
|
415
|
+
// files: previous's rows, then each whole file of the set (a derived file, the ledger or the lockfile, is skipped).
|
|
416
|
+
const filesByPath = new Map();
|
|
417
|
+
for (const row of previous?.files ?? [])
|
|
418
|
+
filesByPath.set(row.path.toLowerCase(), row);
|
|
419
|
+
set.files.forEach((file, index) => {
|
|
420
|
+
if (!isWholeFile(file))
|
|
421
|
+
return;
|
|
422
|
+
const key = file.path.toLowerCase();
|
|
423
|
+
if (file.after === null) {
|
|
424
|
+
filesByPath.delete(key);
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const existing = filesByPath.get(key);
|
|
428
|
+
const isKeep = file.before === file.after;
|
|
429
|
+
if (isKeep && existing !== undefined && existing.after === file.after)
|
|
430
|
+
return; // unchanged: previous's row already holds this after
|
|
431
|
+
if (isKeep && set.phase === "apply")
|
|
432
|
+
throw new TypeError(`files[${index}] keeps a file previous holds no row for, which only a setup set may adopt`);
|
|
433
|
+
// The one apply-phase add: the Launcher guide's own bytes, for an install set up before it existed, where previous holds no row at its
|
|
434
|
+
// path. A row at that path that is not 100644 would also fail the output's own validation (L5) below.
|
|
435
|
+
const guideAdd = previous !== null && file.path === AGENTS_GUIDE_PATH && file.before === null && file.mode === "100644" && file.after === AGENTS_GUIDE_DIGEST && existing === undefined;
|
|
436
|
+
if (set.phase === "apply" && !isKeep && !guideAdd && (existing === undefined || existing.after !== file.before)) {
|
|
437
|
+
throw new TypeError(`files[${index}] has no matching previous row for an apply update`);
|
|
438
|
+
}
|
|
439
|
+
filesByPath.set(key, { path: file.path, mode: file.mode, after: file.after, changeSet: d });
|
|
440
|
+
});
|
|
441
|
+
const files = canonicalOrder([...filesByPath.values()], (row) => [row.path]);
|
|
442
|
+
// keys: previous's rows, then each key of the set.
|
|
443
|
+
const keysByPointer = new Map();
|
|
444
|
+
for (const row of previous?.keys ?? [])
|
|
445
|
+
keysByPointer.set(row.pointer, row);
|
|
446
|
+
for (const key of set.keys) {
|
|
447
|
+
if (key.after === null)
|
|
448
|
+
keysByPointer.delete(key.pointer);
|
|
449
|
+
else
|
|
450
|
+
keysByPointer.set(key.pointer, { file: "package.json", pointer: key.pointer, value: key.after, changeSet: d });
|
|
451
|
+
}
|
|
452
|
+
const keys = canonicalOrder([...keysByPointer.values()], (row) => [row.file, row.pointer]);
|
|
453
|
+
// entries: previous's rows, then one row per exempt-release-age item and per declare-root-entry entry the set adds, unless a path refusal names the item.
|
|
454
|
+
const entries = [...(previous?.entries ?? [])];
|
|
455
|
+
const hasEntry = (file, entryKey, value) => entries.some((row) => row.file === file && row.key === entryKey && row.value === value);
|
|
456
|
+
const pathRefused = (path) => set.refused.some((refusal) => "path" in refusal && refusal.path === path);
|
|
457
|
+
for (const item of set.items) {
|
|
458
|
+
if (item.act === "exempt-release-age") {
|
|
459
|
+
if (pathRefused(item.path))
|
|
460
|
+
continue;
|
|
461
|
+
const value = `${item.scope}/*`;
|
|
462
|
+
if (hasEntry(item.path, EXEMPTION_SURFACES[item.surface].key, value))
|
|
463
|
+
continue;
|
|
464
|
+
entries.push(item.surface === "pnpm-workspace"
|
|
465
|
+
? { file: "pnpm-workspace.yaml", key: "minimumReleaseAgeExclude", value, changeSet: d }
|
|
466
|
+
: { file: ".yarnrc.yml", key: "npmPreapprovedPackages", value, changeSet: d });
|
|
467
|
+
}
|
|
468
|
+
else if (item.act === "declare-root-entry") {
|
|
469
|
+
if (pathRefused(item.path))
|
|
470
|
+
continue;
|
|
471
|
+
for (const entry of item.entries) {
|
|
472
|
+
if (!hasEntry(item.path, "rootEntries", entry.name))
|
|
473
|
+
entries.push({ file: item.path, key: "rootEntries", value: entry.name, changeSet: d });
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
const orderedEntries = canonicalOrder(entries, (row) => [row.file, row.key, row.value]);
|
|
478
|
+
// packages: previous's rows, then each install or pin-starter item, unless a key refusal names its item.
|
|
479
|
+
let packages = [...(previous?.packages ?? [])];
|
|
480
|
+
const keyRefused = (itemId) => set.refused.some((refusal) => "pointer" in refusal && refusal.item === itemId);
|
|
481
|
+
for (const item of set.items) {
|
|
482
|
+
if (item.act !== "install" && item.act !== "pin-starter")
|
|
483
|
+
continue;
|
|
484
|
+
if (keyRefused(item.id))
|
|
485
|
+
continue;
|
|
486
|
+
const newRow = {
|
|
487
|
+
planItem: item.planItem,
|
|
488
|
+
act: item.act,
|
|
489
|
+
name: item.package.name,
|
|
490
|
+
version: item.package.version,
|
|
491
|
+
integrity: item.package.integrity,
|
|
492
|
+
placement: item.placement,
|
|
493
|
+
changeSet: d,
|
|
494
|
+
};
|
|
495
|
+
const matched = packages.filter((row) => row.planItem === newRow.planItem || row.name === newRow.name);
|
|
496
|
+
packages = packages.filter((row) => row.planItem !== newRow.planItem && row.name !== newRow.name);
|
|
497
|
+
const identical = matched.find((row) => sameIdentity(row, newRow));
|
|
498
|
+
packages.push(identical ?? newRow);
|
|
499
|
+
}
|
|
500
|
+
const orderedPackages = canonicalOrder(packages, (row) => [row.planItem]);
|
|
501
|
+
// deferred: exactly the set's deferred, with the plan's identity for each planItem.
|
|
502
|
+
const deferred = set.deferred.map((deferral, index) => {
|
|
503
|
+
const identity = planPackages.find((candidate) => candidate.planItem === deferral.planItem);
|
|
504
|
+
if (identity === undefined)
|
|
505
|
+
throw new TypeError(`deferred[${index}].planItem names no plan package identity`);
|
|
506
|
+
return {
|
|
507
|
+
planItem: identity.planItem,
|
|
508
|
+
act: "install",
|
|
509
|
+
name: identity.name,
|
|
510
|
+
version: identity.version,
|
|
511
|
+
integrity: identity.integrity,
|
|
512
|
+
placement: identity.placement,
|
|
513
|
+
reason: deferral.reason,
|
|
514
|
+
changeSet: d,
|
|
515
|
+
};
|
|
516
|
+
});
|
|
517
|
+
const orderedDeferred = canonicalOrder(deferred, (row) => [row.planItem]);
|
|
518
|
+
const ledger = {
|
|
519
|
+
schemaVersion: 1,
|
|
520
|
+
kind: "clossys.installed-ledger",
|
|
521
|
+
repository: { id: set.repository.id, nodeId: set.repository.nodeId },
|
|
522
|
+
generation,
|
|
523
|
+
history,
|
|
524
|
+
files,
|
|
525
|
+
keys,
|
|
526
|
+
entries: orderedEntries,
|
|
527
|
+
packages: orderedPackages,
|
|
528
|
+
deferred: orderedDeferred,
|
|
529
|
+
};
|
|
530
|
+
return serializeInstalledLedger(ledger);
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=ledger-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-contract.js","sourceRoot":"","sources":["../src/ledger-contract.ts"],"names":[],"mappings":"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"}
|