@clossys/launcher 0.3.0 → 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 +1328 -60
- package/contracts/conversation-contract.md +2 -1
- 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 -5
- package/skeleton/README.md +14 -9
- package/skeleton/package.json +2 -1
- package/skill/SKILL.md +20 -16
- package/skill-catalogue/advisor/SKILL.md +100 -11
- package/skill-catalogue/architect/SKILL.md +2 -13
- package/skill-catalogue/bouncer/SKILL.md +2 -13
- package/skill-catalogue/builder/SKILL.md +2 -13
- package/skill-catalogue/butler/SKILL.md +2 -13
- package/skill-catalogue/controller/SKILL.md +2 -13
- package/skill-catalogue/customer/SKILL.md +4 -13
- package/skill-catalogue/designer/SKILL.md +9 -14
- package/skill-catalogue/giver/SKILL.md +2 -13
- package/skill-catalogue/influencer/SKILL.md +2 -13
- package/skill-catalogue/inspector/SKILL.md +2 -13
- package/skill-catalogue/integrator/SKILL.md +2 -13
- package/skill-catalogue/keeper/SKILL.md +2 -13
- package/skill-catalogue/launcher/SKILL.md +20 -16
- package/skill-catalogue/locksmith/SKILL.md +2 -13
- package/skill-catalogue/messenger/SKILL.md +2 -13
- package/skill-catalogue/observer/SKILL.md +2 -13
- package/skill-catalogue/publisher/SKILL.md +11 -17
- package/skill-catalogue/starter/SKILL.md +3 -13
- package/skill-catalogue/strategist/SKILL.md +14 -17
- package/skill-catalogue/writer/SKILL.md +7 -14
- 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
- package/CHANGELOG.md +0 -131
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provenance-gate.js","sourceRoot":"","sources":["../src/provenance-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ApprovalBinding, RepositoryChangeSet } from "./change-set-contract.js";
|
|
2
|
+
export type PullRequestRefusalReason = "change-set-invalid" | "title-mismatch" | "binding-invalid" | "binding-phase-mismatch" | "task-record-invalid" | "supersedes-invalid" | "value-unsafe" | "body-invalid" | "render-failed";
|
|
3
|
+
/** A refusal: a fixed token, never a value. */
|
|
4
|
+
export interface PullRequestRefusal {
|
|
5
|
+
readonly state: "refused";
|
|
6
|
+
readonly reason: PullRequestRefusalReason;
|
|
7
|
+
}
|
|
8
|
+
export interface RenderPullRequestInput {
|
|
9
|
+
readonly set: RepositoryChangeSet;
|
|
10
|
+
/** What admission decided for this set (decideSetBinding). It is shown, not checked here beyond its shape. */
|
|
11
|
+
readonly binding: ApprovalBinding;
|
|
12
|
+
/** The number of the task-record issue in the target repository: a positive safe integer. */
|
|
13
|
+
readonly taskRecord: number;
|
|
14
|
+
/**
|
|
15
|
+
* The numbers of the pull requests of older change sets this one replaces (RFC section 6, D6): each a positive safe integer,
|
|
16
|
+
* none repeated and none the task record. Written ascending under `## Supersedes`. Absent or empty: no such section, and the
|
|
17
|
+
* body is the one it was without this option.
|
|
18
|
+
*/
|
|
19
|
+
readonly supersedes?: readonly number[];
|
|
20
|
+
}
|
|
21
|
+
export interface PullRequestText {
|
|
22
|
+
readonly state: "rendered";
|
|
23
|
+
readonly title: string;
|
|
24
|
+
readonly body: string;
|
|
25
|
+
/** `sha256:` and the hex SHA-256 of the body's UTF-8 bytes. */
|
|
26
|
+
readonly bodySha256: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The change-set digest a body carries, or null. Exactly one line must be
|
|
30
|
+
* exactly `<!-- clossys-change-set: sha256:<64 hex> -->`, and the marker's
|
|
31
|
+
* name must appear nowhere else in the body, so a second marker line, or a
|
|
32
|
+
* marker inside another line, reads as none.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readChangeSetMarker(body: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* The pull request title and body for one stored change set. The title is
|
|
37
|
+
* exactly `set.pullRequest.title`, which must be `Clossys: apply plan ` and
|
|
38
|
+
* the first 12 hex digits of the set's own digest. Refuses a set that fails
|
|
39
|
+
* validateRepositoryChangeSet or whose digest does not recompute, a malformed
|
|
40
|
+
* binding, an `admitted` binding on a setup set, a task record that is not a
|
|
41
|
+
* positive safe integer, and any value it cannot prove safe to write. Never
|
|
42
|
+
* throws.
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderPullRequest(input: RenderPullRequestInput): PullRequestText | PullRequestRefusal;
|
|
45
|
+
//# sourceMappingURL=pull-request-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-request-body.d.ts","sourceRoot":"","sources":["../src/pull-request-body.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,eAAe,EAAiB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpG,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,GACjB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,cAAc,GACd,cAAc,GACd,eAAe,CAAC;AAEpB,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,mBAAmB,CAAC;IAClC,8GAA8G;IAC9G,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAyCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,eAAe,GAAG,kBAAkB,CAMrG"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// The title and body of one repository's pull request (issue #1178; the apply
|
|
2
|
+
// RFC's section 6 body marker, threat T6, decision D31 and section 12.7, in the
|
|
3
|
+
// public repository, not shipped in this package). A pure function of three
|
|
4
|
+
// inputs: a stored change set, the ApprovalBinding admission decided for it,
|
|
5
|
+
// and the number of the task-record issue. It reads nothing, writes nothing and
|
|
6
|
+
// opens nothing; a later step decides the binding, passes it in, records
|
|
7
|
+
// `bodySha256` and hands the text to the agent that opens the pull request.
|
|
8
|
+
// The caller may also pass the numbers of the older pull requests this one
|
|
9
|
+
// replaces; they are written ascending under `## Supersedes` and nothing else.
|
|
10
|
+
//
|
|
11
|
+
// This is a public-safety surface, so every ambiguity refuses:
|
|
12
|
+
//
|
|
13
|
+
// - The text carries ids, act names, versions and digests only: never a brief,
|
|
14
|
+
// plan prose, `texts`, a key value, a path or a file's contents. Every value
|
|
15
|
+
// is matched against its own strict pattern before it is written, and any
|
|
16
|
+
// that holds `<`, `>`, a backtick, `|`, a carriage return or a line feed is
|
|
17
|
+
// refused, so no value can start a marker, close a code span or add a line.
|
|
18
|
+
// - Each value is written inside a code span, so a package name such as
|
|
19
|
+
// `@scope/name` is never read by GitHub as a mention.
|
|
20
|
+
// - The body opens with the one marker line and holds no other, and it is read
|
|
21
|
+
// back with readChangeSetMarker before it is returned.
|
|
22
|
+
// - The renderer does not decide the binding: it shows what the caller passes.
|
|
23
|
+
// It does not check that the task-record issue exists, and it cannot stop a
|
|
24
|
+
// pull request's body being edited after it is opened; `bodySha256` and the
|
|
25
|
+
// marker are how a later `status` sees that.
|
|
26
|
+
//
|
|
27
|
+
// A refusal carries a fixed token, never an id, a digest or any input text.
|
|
28
|
+
import { createHash } from "node:crypto";
|
|
29
|
+
import { validateRepositoryChangeSet } from "./change-set-contract.js";
|
|
30
|
+
import { changeSetDigest } from "./change-set-digest.js";
|
|
31
|
+
const DIGEST = /^sha256:[0-9a-f]{64}$/u;
|
|
32
|
+
const TITLE = /^Clossys: apply plan [0-9a-f]{12}$/u;
|
|
33
|
+
const MARKER_LINE = /^<!-- clossys-change-set: (sha256:[0-9a-f]{64}) -->$/u;
|
|
34
|
+
const REPOSITORY_ID = /^(?:[A-Za-z0-9][A-Za-z0-9-]{0,38}\/)?[A-Za-z0-9._-]{1,100}$/u;
|
|
35
|
+
// 355 characters: a repository id of up to 140, a colon and a package name of up to 214 (the planItem the contract derives, C16).
|
|
36
|
+
const ITEM_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,354}$/u;
|
|
37
|
+
const ID_TOKEN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/u;
|
|
38
|
+
const PACKAGE_NAME = /^(?=.{1,214}$)@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*$/u;
|
|
39
|
+
const EXACT_VERSION = /^(?:0|[1-9][0-9]{0,15})\.(?:0|[1-9][0-9]{0,15})\.(?:0|[1-9][0-9]{0,15})$/u;
|
|
40
|
+
const UNSAFE = /[<>`|\r\n]/u;
|
|
41
|
+
const PRINTABLE_LINES = /^[\x20-\x7e\n]*$/u;
|
|
42
|
+
const MARKER_WORD = /clossys-change-set/giu;
|
|
43
|
+
const PHASES = new Set(["setup", "apply"]);
|
|
44
|
+
const ACTS = new Set([
|
|
45
|
+
"write-record",
|
|
46
|
+
"compose-skills",
|
|
47
|
+
"install",
|
|
48
|
+
"pin-starter",
|
|
49
|
+
"exempt-release-age",
|
|
50
|
+
"declare-root-entry",
|
|
51
|
+
"write-ledger",
|
|
52
|
+
"add-caller-workflow",
|
|
53
|
+
"write-starter-request",
|
|
54
|
+
"add-ci-template",
|
|
55
|
+
"add-path-scope-job",
|
|
56
|
+
]);
|
|
57
|
+
const refuse = (reason) => ({ state: "refused", reason });
|
|
58
|
+
/** A value that may be interpolated: a string that matches its own pattern and holds nothing that could start a marker, close a code span or add a line. */
|
|
59
|
+
function safe(value, pattern) {
|
|
60
|
+
return typeof value === "string" && !UNSAFE.test(value) && pattern.test(value);
|
|
61
|
+
}
|
|
62
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
63
|
+
const sha256Of = (text) => `sha256:${createHash("sha256").update(Buffer.from(text, "utf8")).digest("hex")}`;
|
|
64
|
+
/**
|
|
65
|
+
* The change-set digest a body carries, or null. Exactly one line must be
|
|
66
|
+
* exactly `<!-- clossys-change-set: sha256:<64 hex> -->`, and the marker's
|
|
67
|
+
* name must appear nowhere else in the body, so a second marker line, or a
|
|
68
|
+
* marker inside another line, reads as none.
|
|
69
|
+
*/
|
|
70
|
+
export function readChangeSetMarker(body) {
|
|
71
|
+
if (typeof body !== "string")
|
|
72
|
+
return null;
|
|
73
|
+
const found = body.split("\n").flatMap((line) => MARKER_LINE.exec(line)?.[1] ?? []);
|
|
74
|
+
if (found.length !== 1)
|
|
75
|
+
return null;
|
|
76
|
+
if ((body.match(MARKER_WORD) ?? []).length !== 1)
|
|
77
|
+
return null;
|
|
78
|
+
return found[0];
|
|
79
|
+
}
|
|
80
|
+
function itemLine(item) {
|
|
81
|
+
if (!safe(item.id, ITEM_ID) || typeof item.act !== "string" || !ACTS.has(item.act))
|
|
82
|
+
return null;
|
|
83
|
+
if (item.act !== "install" && item.act !== "pin-starter")
|
|
84
|
+
return `- \`${item.id}\` \`${item.act}\``;
|
|
85
|
+
if (!safe(item.package.name, PACKAGE_NAME) || !safe(item.package.version, EXACT_VERSION))
|
|
86
|
+
return null;
|
|
87
|
+
return `- \`${item.id}\` \`${item.act}\` \`${item.package.name}@${item.package.version}\``;
|
|
88
|
+
}
|
|
89
|
+
function bindingLines(binding, set) {
|
|
90
|
+
if (!isRecord(binding))
|
|
91
|
+
return refuse("binding-invalid");
|
|
92
|
+
const keys = Object.keys(binding).sort().join(",");
|
|
93
|
+
if (binding.kind === "approved") {
|
|
94
|
+
if (keys !== "kind,subjectDigest" || !safe(binding.subjectDigest, DIGEST))
|
|
95
|
+
return refuse("binding-invalid");
|
|
96
|
+
return ["- Binding: `approved`", `- Approved subject: \`${binding.subjectDigest}\``];
|
|
97
|
+
}
|
|
98
|
+
if (binding.kind === "admitted") {
|
|
99
|
+
if (keys !== "kind,setupChangeSet,subjectDigest" || !safe(binding.subjectDigest, DIGEST) || !safe(binding.setupChangeSet, DIGEST))
|
|
100
|
+
return refuse("binding-invalid");
|
|
101
|
+
if (set.phase !== "apply")
|
|
102
|
+
return refuse("binding-phase-mismatch");
|
|
103
|
+
// Admission never binds a set to itself, or to the bundle that holds the set.
|
|
104
|
+
if (binding.setupChangeSet === set.changeSetDigest || binding.subjectDigest === set.bundle)
|
|
105
|
+
return refuse("binding-invalid");
|
|
106
|
+
return ["- Binding: `admitted`", `- Admitted subject: \`${binding.subjectDigest}\``, `- Setup change set: \`${binding.setupChangeSet}\``];
|
|
107
|
+
}
|
|
108
|
+
return refuse("binding-invalid");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The pull request title and body for one stored change set. The title is
|
|
112
|
+
* exactly `set.pullRequest.title`, which must be `Clossys: apply plan ` and
|
|
113
|
+
* the first 12 hex digits of the set's own digest. Refuses a set that fails
|
|
114
|
+
* validateRepositoryChangeSet or whose digest does not recompute, a malformed
|
|
115
|
+
* binding, an `admitted` binding on a setup set, a task record that is not a
|
|
116
|
+
* positive safe integer, and any value it cannot prove safe to write. Never
|
|
117
|
+
* throws.
|
|
118
|
+
*/
|
|
119
|
+
export function renderPullRequest(input) {
|
|
120
|
+
try {
|
|
121
|
+
return render(input);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return refuse("render-failed");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function render(input) {
|
|
128
|
+
const { taskRecord } = input;
|
|
129
|
+
if (typeof taskRecord !== "number" || !Number.isSafeInteger(taskRecord) || taskRecord < 1)
|
|
130
|
+
return refuse("task-record-invalid");
|
|
131
|
+
// Read once, like the set: what is checked is what is written. Only a list of distinct positive safe integers other than the task record passes.
|
|
132
|
+
let supersedes = [];
|
|
133
|
+
if (input.supersedes !== undefined) {
|
|
134
|
+
let read;
|
|
135
|
+
try {
|
|
136
|
+
read = JSON.parse(JSON.stringify(input.supersedes));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return refuse("supersedes-invalid");
|
|
140
|
+
}
|
|
141
|
+
if (!Array.isArray(read))
|
|
142
|
+
return refuse("supersedes-invalid");
|
|
143
|
+
for (const entry of read)
|
|
144
|
+
if (typeof entry !== "number" || !Number.isSafeInteger(entry) || entry < 1 || entry === taskRecord)
|
|
145
|
+
return refuse("supersedes-invalid");
|
|
146
|
+
supersedes = read.slice().sort((left, right) => left - right);
|
|
147
|
+
if (supersedes.some((entry, index) => index > 0 && entry === supersedes[index - 1]))
|
|
148
|
+
return refuse("supersedes-invalid");
|
|
149
|
+
}
|
|
150
|
+
// One snapshot, so a getter or a proxy cannot show the checks one value and the text another.
|
|
151
|
+
let set;
|
|
152
|
+
let binding;
|
|
153
|
+
try {
|
|
154
|
+
set = JSON.parse(JSON.stringify(input.set));
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return refuse("change-set-invalid");
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
binding = JSON.parse(JSON.stringify(input.binding));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return refuse("binding-invalid");
|
|
164
|
+
}
|
|
165
|
+
if (!validateRepositoryChangeSet(set).valid || changeSetDigest(set) !== set.changeSetDigest)
|
|
166
|
+
return refuse("change-set-invalid");
|
|
167
|
+
// The contract's rule C5 already ties the title to the digest; this is the same rule, held here too.
|
|
168
|
+
const digest = set.changeSetDigest;
|
|
169
|
+
if (!safe(digest, DIGEST))
|
|
170
|
+
return refuse("change-set-invalid");
|
|
171
|
+
if (!safe(set.pullRequest.title, TITLE) || set.pullRequest.title !== `Clossys: apply plan ${digest.slice("sha256:".length, "sha256:".length + 12)}`)
|
|
172
|
+
return refuse("title-mismatch");
|
|
173
|
+
const bound = bindingLines(binding, set);
|
|
174
|
+
if (!Array.isArray(bound))
|
|
175
|
+
return bound;
|
|
176
|
+
const repositoryId = set.repository.id;
|
|
177
|
+
if (!safe(repositoryId, REPOSITORY_ID) || repositoryId === "." || repositoryId === ".." || repositoryId.endsWith("/.") || repositoryId.endsWith("/.."))
|
|
178
|
+
return refuse("value-unsafe");
|
|
179
|
+
if (typeof set.phase !== "string" || !PHASES.has(set.phase))
|
|
180
|
+
return refuse("value-unsafe");
|
|
181
|
+
if (!safe(set.planDigest, DIGEST) || !safe(set.bundle, DIGEST))
|
|
182
|
+
return refuse("value-unsafe");
|
|
183
|
+
const items = [];
|
|
184
|
+
for (const item of set.items) {
|
|
185
|
+
const line = itemLine(item);
|
|
186
|
+
if (line === null)
|
|
187
|
+
return refuse("value-unsafe");
|
|
188
|
+
items.push(line);
|
|
189
|
+
}
|
|
190
|
+
const notes = [];
|
|
191
|
+
for (const deferral of set.deferred) {
|
|
192
|
+
if (!safe(deferral.planItem, ITEM_ID) || !safe(deferral.reason, ID_TOKEN))
|
|
193
|
+
return refuse("value-unsafe");
|
|
194
|
+
notes.push(`- Deferred: \`${deferral.planItem}\` \`${deferral.reason}\``);
|
|
195
|
+
}
|
|
196
|
+
for (const refusal of set.refused) {
|
|
197
|
+
if (!safe(refusal.item, ITEM_ID) || !safe(refusal.reason, ID_TOKEN))
|
|
198
|
+
return refuse("value-unsafe");
|
|
199
|
+
notes.push(`- Refused: \`${refusal.item}\` \`${refusal.reason}\``);
|
|
200
|
+
}
|
|
201
|
+
const lines = [
|
|
202
|
+
`<!-- clossys-change-set: ${digest} -->`,
|
|
203
|
+
"",
|
|
204
|
+
"## Change set",
|
|
205
|
+
"",
|
|
206
|
+
`- Repository: \`${repositoryId}\``,
|
|
207
|
+
`- Phase: \`${set.phase}\``,
|
|
208
|
+
`- Change set: \`${digest}\``,
|
|
209
|
+
`- Plan: \`${set.planDigest}\``,
|
|
210
|
+
`- Bundle: \`${set.bundle}\``,
|
|
211
|
+
"",
|
|
212
|
+
"## Binding",
|
|
213
|
+
"",
|
|
214
|
+
...bound,
|
|
215
|
+
"",
|
|
216
|
+
"## Items",
|
|
217
|
+
"",
|
|
218
|
+
...items,
|
|
219
|
+
...(notes.length === 0 ? [] : ["", "## Not applied", "", ...notes]),
|
|
220
|
+
...(supersedes.length === 0 ? [] : ["", "## Supersedes", "", ...supersedes.map((number) => `- #${number}`)]),
|
|
221
|
+
"",
|
|
222
|
+
"## Task record",
|
|
223
|
+
"",
|
|
224
|
+
`- #${taskRecord}`,
|
|
225
|
+
];
|
|
226
|
+
const body = `${lines.join("\n")}\n`;
|
|
227
|
+
// The last word: printable ASCII and line feeds only, no line feed at the end but one, and the marker reads back as this set's digest.
|
|
228
|
+
if (!PRINTABLE_LINES.test(body) || body.endsWith("\n\n") || readChangeSetMarker(body) !== digest || !body.startsWith(`<!-- clossys-change-set: ${digest} -->\n`))
|
|
229
|
+
return refuse("body-invalid");
|
|
230
|
+
return { state: "rendered", title: set.pullRequest.title, body, bodySha256: sha256Of(body) };
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=pull-request-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-request-body.js","sourceRoot":"","sources":["../src/pull-request-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** Where the snapshot is written by default, relative to the hub root. */
|
|
2
|
+
export declare const REGISTRY_SNAPSHOT_REL = "clossys/.state/apply/registry-snapshot.json";
|
|
3
|
+
/** The most bytes read from any one registry response (10 MiB). */
|
|
4
|
+
export declare const MAX_RESPONSE_BYTES: number;
|
|
5
|
+
/** How long one request, its body included, may take. */
|
|
6
|
+
export declare const DEFAULT_TIMEOUT_MS = 30000;
|
|
7
|
+
/**
|
|
8
|
+
* The port every registry read goes through: the shape of Node's `fetch`,
|
|
9
|
+
* as Integrator's transport has. The request's URL and init are built here,
|
|
10
|
+
* never by the transport's caller, so tests inspect exactly what would be sent.
|
|
11
|
+
*/
|
|
12
|
+
export type Transport = (input: URL, init: RequestInit) => Promise<Response>;
|
|
13
|
+
/** Node's own `fetch`. It reads no npm configuration and adds no registry credential (a proxy URL's own username and password, if any, go only to that proxy). */
|
|
14
|
+
export declare const nodeFetchTransport: Transport;
|
|
15
|
+
/** One version of a package, projected from the registry's document. */
|
|
16
|
+
export interface RegistrySnapshotVersion {
|
|
17
|
+
readonly version: string;
|
|
18
|
+
readonly integrity: string | null;
|
|
19
|
+
readonly tarball: string;
|
|
20
|
+
readonly deprecated: boolean;
|
|
21
|
+
readonly publishedAt: string | null;
|
|
22
|
+
readonly hasAttestations: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** One requested package. */
|
|
25
|
+
export interface RegistrySnapshotPackage {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly status: "found" | "not-found";
|
|
28
|
+
readonly latest: string | null;
|
|
29
|
+
readonly versions: readonly RegistrySnapshotVersion[];
|
|
30
|
+
readonly responseSha256: string;
|
|
31
|
+
}
|
|
32
|
+
/** clossys/.state/apply/registry-snapshot.json (docs/contracts/registry-snapshot.json, in the public repository, not shipped in this package). */
|
|
33
|
+
export interface RegistrySnapshot {
|
|
34
|
+
readonly schemaVersion: 1;
|
|
35
|
+
readonly kind: "clossys.registry-snapshot";
|
|
36
|
+
readonly registry: string;
|
|
37
|
+
readonly fetchedAt: string;
|
|
38
|
+
readonly fetchedBy: {
|
|
39
|
+
readonly name: string;
|
|
40
|
+
readonly version: string;
|
|
41
|
+
};
|
|
42
|
+
readonly packages: readonly RegistrySnapshotPackage[];
|
|
43
|
+
}
|
|
44
|
+
/** One reason a snapshot is refused: `rule` is "schema" for the contract's keywords, else the code rule's id. */
|
|
45
|
+
export interface RegistrySnapshotViolation {
|
|
46
|
+
readonly rule: "schema" | "N1" | "N2" | "N3";
|
|
47
|
+
/** The field at fault, like `packages[1].versions[0].integrity`, or "" for the document itself. */
|
|
48
|
+
readonly path: string;
|
|
49
|
+
/** What is wrong, by position only, never quoting a value or an undeclared key. */
|
|
50
|
+
readonly message: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Why the snapshot step stopped. The message names a package only by its
|
|
54
|
+
* position in the request (`names[<n>]`), never by its name: a name is
|
|
55
|
+
* request text, and a request is a file anyone could have written. It
|
|
56
|
+
* never carries registry content either.
|
|
57
|
+
*/
|
|
58
|
+
export declare class RegistrySnapshotError extends Error {
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Every violation of the registry snapshot contract: its schema, then, only
|
|
62
|
+
* for a snapshot whose shape is known good, its code rules N1-N3 (no package
|
|
63
|
+
* named twice, no version recorded twice for one package, no `latest` or
|
|
64
|
+
* versions for a package that was not found). Implemented separately from
|
|
65
|
+
* @clossys/advisor's reader; both are tested against the one corpus,
|
|
66
|
+
* docs/contracts/registry-snapshot.fixture.json (in the public repository,
|
|
67
|
+
* not shipped in this package). Never throws.
|
|
68
|
+
*/
|
|
69
|
+
export declare function registrySnapshotViolations(value: unknown): RegistrySnapshotViolation[];
|
|
70
|
+
/** The snapshot in the contract's canonical order: packages sorted by name, each package's versions sorted by version. */
|
|
71
|
+
export declare function canonicalRegistrySnapshot(snapshot: RegistrySnapshot): RegistrySnapshot;
|
|
72
|
+
/**
|
|
73
|
+
* A package name's registry path segment. Copied, unchanged, from
|
|
74
|
+
* `registryEncodedName` in @clossys/integrator's provenance-check.ts, which
|
|
75
|
+
* this package must not depend on at runtime; a test compares the two
|
|
76
|
+
* function bodies so they cannot drift apart. The leading `@` stays literal
|
|
77
|
+
* and only the slash is percent-encoded (`@scope%2Fname`), the convention
|
|
78
|
+
* npm-compatible registries share; `encodeURIComponent` on the whole name
|
|
79
|
+
* would also encode the `@`, which none of them expect.
|
|
80
|
+
*/
|
|
81
|
+
export declare function registryEncodedName(name: string): string;
|
|
82
|
+
/** The full registry document's URL for `name`: `{registry}/{encoded name}`. */
|
|
83
|
+
export declare function packumentUrl(registry: string, name: string): URL;
|
|
84
|
+
/**
|
|
85
|
+
* The package names in a snapshot request: the report `advisor-package-request`
|
|
86
|
+
* prints, `{ state: "satisfied", names, findings: [] }`, or just `{ names }`.
|
|
87
|
+
* Every name must be a scoped package name in the packed publishing scope,
|
|
88
|
+
* named once. A refusal names positions only, never the request's text.
|
|
89
|
+
*/
|
|
90
|
+
export declare function requestedPackageNames(request: unknown, scope?: string): string[];
|
|
91
|
+
/**
|
|
92
|
+
* Projects a registry document into one snapshot entry's `latest` and
|
|
93
|
+
* `versions`, reading only what the contract records: the version the
|
|
94
|
+
* `latest` dist-tag names, and that one version's integrity, tarball,
|
|
95
|
+
* deprecation, publish time and attestation presence. Every other version,
|
|
96
|
+
* dist-tag and field is ignored. When `latest` names a version the document
|
|
97
|
+
* does not list, `versions` is empty, so a resolver refuses it by name.
|
|
98
|
+
*/
|
|
99
|
+
export declare function projectPackument(name: string, document: unknown): {
|
|
100
|
+
latest: string | null;
|
|
101
|
+
versions: RegistrySnapshotVersion[];
|
|
102
|
+
};
|
|
103
|
+
export interface FetchSnapshotOptions {
|
|
104
|
+
readonly transport?: Transport;
|
|
105
|
+
readonly timeoutMs?: number;
|
|
106
|
+
/** An ISO 8601 date-time, taken once every fetch has finished. */
|
|
107
|
+
readonly now?: () => string;
|
|
108
|
+
/** The package taking the snapshot; read from this package's own package.json unless given. */
|
|
109
|
+
readonly fetchedBy?: {
|
|
110
|
+
readonly name: string;
|
|
111
|
+
readonly version: string;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Fetches every named package's full registry document, one at a time, and
|
|
116
|
+
* returns the snapshot in canonical order, validated against the contract.
|
|
117
|
+
* Throws RegistrySnapshotError, having fetched no further, on the first
|
|
118
|
+
* package whose read fails: a transport error, a timeout, a redirect, an
|
|
119
|
+
* answer other than 200 or 404, a body over MAX_RESPONSE_BYTES, a 200 body
|
|
120
|
+
* that is not strict JSON or not a registry document for that package, or a
|
|
121
|
+
* projection the contract refuses. A 404 records `status: "not-found"`.
|
|
122
|
+
* `names` must already have passed `requestedPackageNames()`.
|
|
123
|
+
*/
|
|
124
|
+
export declare function takeRegistrySnapshot(names: readonly string[], options?: FetchSnapshotOptions): Promise<RegistrySnapshot>;
|
|
125
|
+
/** The snapshot's file text: two-space JSON with a final newline, in the order given. */
|
|
126
|
+
export declare function serializeRegistrySnapshot(snapshot: RegistrySnapshot): string;
|
|
127
|
+
/**
|
|
128
|
+
* Writes `text` to `path` so that a reader sees the old file or the whole
|
|
129
|
+
* new one, never part of it: the bytes go to a new temporary file in the same
|
|
130
|
+
* directory, are flushed to disk, and the temporary file is then renamed over
|
|
131
|
+
* `path`. On any failure the temporary file is removed and `path` is left as
|
|
132
|
+
* it was.
|
|
133
|
+
*/
|
|
134
|
+
export declare function writeFileAtomically(path: string, text: string): void;
|
|
135
|
+
/**
|
|
136
|
+
* Serializes a snapshot, re-reads that exact text strictly and validates it
|
|
137
|
+
* against the contract, and only then writes it atomically to `path`. The
|
|
138
|
+
* bytes on disk are therefore exactly the bytes that validated.
|
|
139
|
+
*/
|
|
140
|
+
export declare function writeRegistrySnapshot(path: string, snapshot: RegistrySnapshot): void;
|
|
141
|
+
//# sourceMappingURL=registry-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-snapshot.d.ts","sourceRoot":"","sources":["../src/registry-snapshot.ts"],"names":[],"mappings":"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"}
|