@adammcarter/use-cases 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/migration/SKILL.md +85 -0
- package/.agents/skills/showcase/SKILL.md +60 -0
- package/.agents/skills/use-cases/SKILL.md +161 -0
- package/.agents/skills/walkthrough/SKILL.md +48 -0
- package/.claude-plugin/plugin.json +14 -0
- package/.codex-plugin/plugin.json +33 -0
- package/.mcp.json +8 -0
- package/.opencode/plugin/use-cases.js +32 -0
- package/CHANGELOG.md +125 -0
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/bootstrap/use-cases.md +60 -0
- package/docs/README.md +51 -0
- package/docs/acceptance.md +16 -0
- package/docs/activation.md +89 -0
- package/docs/adr/0001-p0-bootstrap-decisions.md +107 -0
- package/docs/adr/0002-p1-schema-contracts.md +136 -0
- package/docs/adr/0003-p2-use-case-matrix-contracts.md +67 -0
- package/docs/adr/0004-p3-evidence-ledger-contracts.md +85 -0
- package/docs/adr/0005-p4-cli-contract.md +70 -0
- package/docs/adr/0006-trusted-user-approval-path.md +125 -0
- package/docs/cli.md +108 -0
- package/docs/data-model.md +56 -0
- package/docs/getting-started.md +296 -0
- package/docs/hosts.md +30 -0
- package/docs/markers-adoption.md +100 -0
- package/docs/mcp.md +114 -0
- package/docs/migration.md +90 -0
- package/docs/reference/error-codes.md +123 -0
- package/docs/reference/stability.md +123 -0
- package/docs/release.md +26 -0
- package/docs/security/ci-hardening.md +144 -0
- package/docs/security/key-management.md +158 -0
- package/docs/security.md +66 -0
- package/docs/showcase.md +39 -0
- package/docs/tutorials/python-pytest.md +188 -0
- package/examples/basic-product/demo-capsules/product-search.yml +23 -0
- package/examples/basic-product/evidence/by-id/ev/evidence-basic-search.jsonl +1 -0
- package/examples/basic-product/showcase-runs/run.basic.product.search/events.jsonl +4 -0
- package/examples/basic-product/use-cases/product.yml +85 -0
- package/examples/basic-product/use-cases.yml +9 -0
- package/examples/damaged-product/evidence/broken.jsonl +1 -0
- package/examples/damaged-product/use-cases/duplicate-a.yml +28 -0
- package/examples/damaged-product/use-cases/duplicate-b.yml +28 -0
- package/examples/damaged-product/use-cases/malformed.yml +14 -0
- package/examples/damaged-product/use-cases/valid-sibling.yml +28 -0
- package/examples/damaged-product/use-cases.yml +9 -0
- package/examples/host-projections/use-cases.yml +9 -0
- package/examples/python-pytest/README.md +39 -0
- package/examples/python-pytest/pytest.ini +8 -0
- package/examples/python-pytest/src/coupon.py +32 -0
- package/examples/python-pytest/tests/use_cases/example.checkout.apply_coupon_test.py +31 -0
- package/examples/python-pytest/use-cases/checkout.yml +47 -0
- package/examples/python-pytest/use-cases.yml +19 -0
- package/hooks/hooks-codex.json +16 -0
- package/hooks/hooks.json +16 -0
- package/hooks/session-start +42 -0
- package/hosts/claude.yml +29 -0
- package/hosts/codex.yml +29 -0
- package/hosts/copilot.yml +29 -0
- package/hosts/opencode.yml +29 -0
- package/package.json +81 -0
- package/packages/cli/README.md +37 -0
- package/packages/cli/dist/args/parse.d.ts +6 -0
- package/packages/cli/dist/args/parse.d.ts.map +1 -0
- package/packages/cli/dist/args/parse.js +55 -0
- package/packages/cli/dist/args/parse.js.map +1 -0
- package/packages/cli/dist/args/validate.d.ts +3 -0
- package/packages/cli/dist/args/validate.d.ts.map +1 -0
- package/packages/cli/dist/args/validate.js +80 -0
- package/packages/cli/dist/args/validate.js.map +1 -0
- package/packages/cli/dist/builtins.d.ts +2 -0
- package/packages/cli/dist/builtins.d.ts.map +1 -0
- package/packages/cli/dist/builtins.js +235 -0
- package/packages/cli/dist/builtins.js.map +1 -0
- package/packages/cli/dist/command/dispatch.d.ts +4 -0
- package/packages/cli/dist/command/dispatch.d.ts.map +1 -0
- package/packages/cli/dist/command/dispatch.js +45 -0
- package/packages/cli/dist/command/dispatch.js.map +1 -0
- package/packages/cli/dist/command/help-catalog.d.ts +13 -0
- package/packages/cli/dist/command/help-catalog.d.ts.map +1 -0
- package/packages/cli/dist/command/help-catalog.js +42 -0
- package/packages/cli/dist/command/help-catalog.js.map +1 -0
- package/packages/cli/dist/command/registry.d.ts +3 -0
- package/packages/cli/dist/command/registry.d.ts.map +1 -0
- package/packages/cli/dist/command/registry.js +33 -0
- package/packages/cli/dist/command/registry.js.map +1 -0
- package/packages/cli/dist/command/types.d.ts +32 -0
- package/packages/cli/dist/command/types.d.ts.map +1 -0
- package/packages/cli/dist/command/types.js +6 -0
- package/packages/cli/dist/command/types.js.map +1 -0
- package/packages/cli/dist/commands/capsule.d.ts +7 -0
- package/packages/cli/dist/commands/capsule.d.ts.map +1 -0
- package/packages/cli/dist/commands/capsule.js +178 -0
- package/packages/cli/dist/commands/capsule.js.map +1 -0
- package/packages/cli/dist/commands/common.d.ts +7 -0
- package/packages/cli/dist/commands/common.d.ts.map +1 -0
- package/packages/cli/dist/commands/common.js +32 -0
- package/packages/cli/dist/commands/common.js.map +1 -0
- package/packages/cli/dist/commands/doctor.d.ts +6 -0
- package/packages/cli/dist/commands/doctor.d.ts.map +1 -0
- package/packages/cli/dist/commands/doctor.js +133 -0
- package/packages/cli/dist/commands/doctor.js.map +1 -0
- package/packages/cli/dist/commands/evidence.d.ts +6 -0
- package/packages/cli/dist/commands/evidence.d.ts.map +1 -0
- package/packages/cli/dist/commands/evidence.js +191 -0
- package/packages/cli/dist/commands/evidence.js.map +1 -0
- package/packages/cli/dist/commands/host.d.ts +6 -0
- package/packages/cli/dist/commands/host.d.ts.map +1 -0
- package/packages/cli/dist/commands/host.js +180 -0
- package/packages/cli/dist/commands/host.js.map +1 -0
- package/packages/cli/dist/commands/keygen.d.ts +4 -0
- package/packages/cli/dist/commands/keygen.d.ts.map +1 -0
- package/packages/cli/dist/commands/keygen.js +132 -0
- package/packages/cli/dist/commands/keygen.js.map +1 -0
- package/packages/cli/dist/commands/markers.d.ts +8 -0
- package/packages/cli/dist/commands/markers.d.ts.map +1 -0
- package/packages/cli/dist/commands/markers.js +455 -0
- package/packages/cli/dist/commands/markers.js.map +1 -0
- package/packages/cli/dist/commands/matrix.d.ts +8 -0
- package/packages/cli/dist/commands/matrix.d.ts.map +1 -0
- package/packages/cli/dist/commands/matrix.js +237 -0
- package/packages/cli/dist/commands/matrix.js.map +1 -0
- package/packages/cli/dist/commands/migrate.d.ts +4 -0
- package/packages/cli/dist/commands/migrate.d.ts.map +1 -0
- package/packages/cli/dist/commands/migrate.js +82 -0
- package/packages/cli/dist/commands/migrate.js.map +1 -0
- package/packages/cli/dist/commands/plan.d.ts +6 -0
- package/packages/cli/dist/commands/plan.d.ts.map +1 -0
- package/packages/cli/dist/commands/plan.js +129 -0
- package/packages/cli/dist/commands/plan.js.map +1 -0
- package/packages/cli/dist/commands/recover.d.ts +4 -0
- package/packages/cli/dist/commands/recover.d.ts.map +1 -0
- package/packages/cli/dist/commands/recover.js +352 -0
- package/packages/cli/dist/commands/recover.js.map +1 -0
- package/packages/cli/dist/commands/schema.d.ts +5 -0
- package/packages/cli/dist/commands/schema.d.ts.map +1 -0
- package/packages/cli/dist/commands/schema.js +51 -0
- package/packages/cli/dist/commands/schema.js.map +1 -0
- package/packages/cli/dist/commands/showcase.d.ts +14 -0
- package/packages/cli/dist/commands/showcase.d.ts.map +1 -0
- package/packages/cli/dist/commands/showcase.js +638 -0
- package/packages/cli/dist/commands/showcase.js.map +1 -0
- package/packages/cli/dist/commands/workflow.d.ts +5 -0
- package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
- package/packages/cli/dist/commands/workflow.js +107 -0
- package/packages/cli/dist/commands/workflow.js.map +1 -0
- package/packages/cli/dist/coreLoader.d.ts +6 -0
- package/packages/cli/dist/coreLoader.d.ts.map +1 -0
- package/packages/cli/dist/coreLoader.js +34 -0
- package/packages/cli/dist/coreLoader.js.map +1 -0
- package/packages/cli/dist/index.d.ts +5 -0
- package/packages/cli/dist/index.d.ts.map +1 -0
- package/packages/cli/dist/index.js +83 -0
- package/packages/cli/dist/index.js.map +1 -0
- package/packages/cli/dist/render.d.ts +2 -0
- package/packages/cli/dist/render.d.ts.map +1 -0
- package/packages/cli/dist/render.js +88 -0
- package/packages/cli/dist/render.js.map +1 -0
- package/packages/cli/dist/runtime.d.ts +25 -0
- package/packages/cli/dist/runtime.d.ts.map +1 -0
- package/packages/cli/dist/runtime.js +89 -0
- package/packages/cli/dist/runtime.js.map +1 -0
- package/packages/cli/package.json +38 -0
- package/packages/core/README.md +37 -0
- package/packages/core/dist/capsules/index.d.ts +4 -0
- package/packages/core/dist/capsules/index.d.ts.map +1 -0
- package/packages/core/dist/capsules/index.js +4 -0
- package/packages/core/dist/capsules/index.js.map +1 -0
- package/packages/core/dist/capsules/loadCapsule.d.ts +11 -0
- package/packages/core/dist/capsules/loadCapsule.d.ts.map +1 -0
- package/packages/core/dist/capsules/loadCapsule.js +167 -0
- package/packages/core/dist/capsules/loadCapsule.js.map +1 -0
- package/packages/core/dist/capsules/runCapsule.d.ts +3 -0
- package/packages/core/dist/capsules/runCapsule.d.ts.map +1 -0
- package/packages/core/dist/capsules/runCapsule.js +333 -0
- package/packages/core/dist/capsules/runCapsule.js.map +1 -0
- package/packages/core/dist/capsules/types.d.ts +106 -0
- package/packages/core/dist/capsules/types.d.ts.map +1 -0
- package/packages/core/dist/capsules/types.js +2 -0
- package/packages/core/dist/capsules/types.js.map +1 -0
- package/packages/core/dist/durableWrite.d.ts +2 -0
- package/packages/core/dist/durableWrite.d.ts.map +1 -0
- package/packages/core/dist/durableWrite.js +34 -0
- package/packages/core/dist/durableWrite.js.map +1 -0
- package/packages/core/dist/errors/registry.d.ts +122 -0
- package/packages/core/dist/errors/registry.d.ts.map +1 -0
- package/packages/core/dist/errors/registry.js +206 -0
- package/packages/core/dist/errors/registry.js.map +1 -0
- package/packages/core/dist/errors/render.d.ts +3 -0
- package/packages/core/dist/errors/render.d.ts.map +1 -0
- package/packages/core/dist/errors/render.js +64 -0
- package/packages/core/dist/errors/render.js.map +1 -0
- package/packages/core/dist/errors.d.ts +5 -0
- package/packages/core/dist/errors.d.ts.map +1 -0
- package/packages/core/dist/errors.js +9 -0
- package/packages/core/dist/errors.js.map +1 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.d.ts +27 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.d.ts.map +1 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.js +218 -0
- package/packages/core/dist/evidence/appendEvidenceEvent.js.map +1 -0
- package/packages/core/dist/evidence/assurance.d.ts +18 -0
- package/packages/core/dist/evidence/assurance.d.ts.map +1 -0
- package/packages/core/dist/evidence/assurance.js +38 -0
- package/packages/core/dist/evidence/assurance.js.map +1 -0
- package/packages/core/dist/evidence/index.d.ts +8 -0
- package/packages/core/dist/evidence/index.d.ts.map +1 -0
- package/packages/core/dist/evidence/index.js +8 -0
- package/packages/core/dist/evidence/index.js.map +1 -0
- package/packages/core/dist/evidence/jsonlLedger.d.ts +13 -0
- package/packages/core/dist/evidence/jsonlLedger.d.ts.map +1 -0
- package/packages/core/dist/evidence/jsonlLedger.js +171 -0
- package/packages/core/dist/evidence/jsonlLedger.js.map +1 -0
- package/packages/core/dist/evidence/linkEvidence.d.ts +4 -0
- package/packages/core/dist/evidence/linkEvidence.d.ts.map +1 -0
- package/packages/core/dist/evidence/linkEvidence.js +53 -0
- package/packages/core/dist/evidence/linkEvidence.js.map +1 -0
- package/packages/core/dist/evidence/replayEvidence.d.ts +6 -0
- package/packages/core/dist/evidence/replayEvidence.d.ts.map +1 -0
- package/packages/core/dist/evidence/replayEvidence.js +216 -0
- package/packages/core/dist/evidence/replayEvidence.js.map +1 -0
- package/packages/core/dist/evidence/results.d.ts +4 -0
- package/packages/core/dist/evidence/results.d.ts.map +1 -0
- package/packages/core/dist/evidence/results.js +32 -0
- package/packages/core/dist/evidence/results.js.map +1 -0
- package/packages/core/dist/evidence/types.d.ts +149 -0
- package/packages/core/dist/evidence/types.d.ts.map +1 -0
- package/packages/core/dist/evidence/types.js +2 -0
- package/packages/core/dist/evidence/types.js.map +1 -0
- package/packages/core/dist/host-profiles/claude.yml +29 -0
- package/packages/core/dist/host-profiles/codex.yml +29 -0
- package/packages/core/dist/host-profiles/copilot.yml +29 -0
- package/packages/core/dist/host-profiles/opencode.yml +29 -0
- package/packages/core/dist/hosts/conformanceStatus.d.ts +16 -0
- package/packages/core/dist/hosts/conformanceStatus.d.ts.map +1 -0
- package/packages/core/dist/hosts/conformanceStatus.js +160 -0
- package/packages/core/dist/hosts/conformanceStatus.js.map +1 -0
- package/packages/core/dist/hosts/index.d.ts +5 -0
- package/packages/core/dist/hosts/index.d.ts.map +1 -0
- package/packages/core/dist/hosts/index.js +5 -0
- package/packages/core/dist/hosts/index.js.map +1 -0
- package/packages/core/dist/hosts/loadHostProfile.d.ts +6 -0
- package/packages/core/dist/hosts/loadHostProfile.d.ts.map +1 -0
- package/packages/core/dist/hosts/loadHostProfile.js +41 -0
- package/packages/core/dist/hosts/loadHostProfile.js.map +1 -0
- package/packages/core/dist/hosts/projectHostFiles.d.ts +16 -0
- package/packages/core/dist/hosts/projectHostFiles.d.ts.map +1 -0
- package/packages/core/dist/hosts/projectHostFiles.js +272 -0
- package/packages/core/dist/hosts/projectHostFiles.js.map +1 -0
- package/packages/core/dist/hosts/types.d.ts +122 -0
- package/packages/core/dist/hosts/types.d.ts.map +1 -0
- package/packages/core/dist/hosts/types.js +2 -0
- package/packages/core/dist/hosts/types.js.map +1 -0
- package/packages/core/dist/index.d.ts +26 -0
- package/packages/core/dist/index.d.ts.map +1 -0
- package/packages/core/dist/index.js +31 -0
- package/packages/core/dist/index.js.map +1 -0
- package/packages/core/dist/init/index.d.ts +2 -0
- package/packages/core/dist/init/index.d.ts.map +1 -0
- package/packages/core/dist/init/index.js +3 -0
- package/packages/core/dist/init/index.js.map +1 -0
- package/packages/core/dist/init/scaffold.d.ts +28 -0
- package/packages/core/dist/init/scaffold.d.ts.map +1 -0
- package/packages/core/dist/init/scaffold.js +293 -0
- package/packages/core/dist/init/scaffold.js.map +1 -0
- package/packages/core/dist/markers/appendOnly.d.ts +23 -0
- package/packages/core/dist/markers/appendOnly.d.ts.map +1 -0
- package/packages/core/dist/markers/appendOnly.js +75 -0
- package/packages/core/dist/markers/appendOnly.js.map +1 -0
- package/packages/core/dist/markers/bindingSetHash.d.ts +28 -0
- package/packages/core/dist/markers/bindingSetHash.d.ts.map +1 -0
- package/packages/core/dist/markers/bindingSetHash.js +33 -0
- package/packages/core/dist/markers/bindingSetHash.js.map +1 -0
- package/packages/core/dist/markers/canonicalJson.d.ts +4 -0
- package/packages/core/dist/markers/canonicalJson.d.ts.map +1 -0
- package/packages/core/dist/markers/canonicalJson.js +51 -0
- package/packages/core/dist/markers/canonicalJson.js.map +1 -0
- package/packages/core/dist/markers/ciAuthority.d.ts +17 -0
- package/packages/core/dist/markers/ciAuthority.d.ts.map +1 -0
- package/packages/core/dist/markers/ciAuthority.js +131 -0
- package/packages/core/dist/markers/ciAuthority.js.map +1 -0
- package/packages/core/dist/markers/cli/bind.d.ts +48 -0
- package/packages/core/dist/markers/cli/bind.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/bind.js +198 -0
- package/packages/core/dist/markers/cli/bind.js.map +1 -0
- package/packages/core/dist/markers/cli/index.d.ts +9 -0
- package/packages/core/dist/markers/cli/index.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/index.js +15 -0
- package/packages/core/dist/markers/cli/index.js.map +1 -0
- package/packages/core/dist/markers/cli/io.d.ts +18 -0
- package/packages/core/dist/markers/cli/io.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/io.js +62 -0
- package/packages/core/dist/markers/cli/io.js.map +1 -0
- package/packages/core/dist/markers/cli/precommit.d.ts +32 -0
- package/packages/core/dist/markers/cli/precommit.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/precommit.js +174 -0
- package/packages/core/dist/markers/cli/precommit.js.map +1 -0
- package/packages/core/dist/markers/cli/prove.d.ts +69 -0
- package/packages/core/dist/markers/cli/prove.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/prove.js +381 -0
- package/packages/core/dist/markers/cli/prove.js.map +1 -0
- package/packages/core/dist/markers/cli/scan.d.ts +63 -0
- package/packages/core/dist/markers/cli/scan.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/scan.js +233 -0
- package/packages/core/dist/markers/cli/scan.js.map +1 -0
- package/packages/core/dist/markers/cli/shared.d.ts +25 -0
- package/packages/core/dist/markers/cli/shared.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/shared.js +123 -0
- package/packages/core/dist/markers/cli/shared.js.map +1 -0
- package/packages/core/dist/markers/cli/validateLedger.d.ts +38 -0
- package/packages/core/dist/markers/cli/validateLedger.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/validateLedger.js +81 -0
- package/packages/core/dist/markers/cli/validateLedger.js.map +1 -0
- package/packages/core/dist/markers/cli/verify.d.ts +65 -0
- package/packages/core/dist/markers/cli/verify.d.ts.map +1 -0
- package/packages/core/dist/markers/cli/verify.js +245 -0
- package/packages/core/dist/markers/cli/verify.js.map +1 -0
- package/packages/core/dist/markers/commentPrefix.d.ts +7 -0
- package/packages/core/dist/markers/commentPrefix.d.ts.map +1 -0
- package/packages/core/dist/markers/commentPrefix.js +79 -0
- package/packages/core/dist/markers/commentPrefix.js.map +1 -0
- package/packages/core/dist/markers/constants.d.ts +10 -0
- package/packages/core/dist/markers/constants.d.ts.map +1 -0
- package/packages/core/dist/markers/constants.js +13 -0
- package/packages/core/dist/markers/constants.js.map +1 -0
- package/packages/core/dist/markers/evidenceLedger.d.ts +150 -0
- package/packages/core/dist/markers/evidenceLedger.d.ts.map +1 -0
- package/packages/core/dist/markers/evidenceLedger.js +391 -0
- package/packages/core/dist/markers/evidenceLedger.js.map +1 -0
- package/packages/core/dist/markers/freshness.d.ts +125 -0
- package/packages/core/dist/markers/freshness.d.ts.map +1 -0
- package/packages/core/dist/markers/freshness.js +605 -0
- package/packages/core/dist/markers/freshness.js.map +1 -0
- package/packages/core/dist/markers/index.d.ts +26 -0
- package/packages/core/dist/markers/index.d.ts.map +1 -0
- package/packages/core/dist/markers/index.js +38 -0
- package/packages/core/dist/markers/index.js.map +1 -0
- package/packages/core/dist/markers/keygen.d.ts +6 -0
- package/packages/core/dist/markers/keygen.d.ts.map +1 -0
- package/packages/core/dist/markers/keygen.js +18 -0
- package/packages/core/dist/markers/keygen.js.map +1 -0
- package/packages/core/dist/markers/keyring.d.ts +23 -0
- package/packages/core/dist/markers/keyring.d.ts.map +1 -0
- package/packages/core/dist/markers/keyring.js +93 -0
- package/packages/core/dist/markers/keyring.js.map +1 -0
- package/packages/core/dist/markers/markerLine.d.ts +35 -0
- package/packages/core/dist/markers/markerLine.d.ts.map +1 -0
- package/packages/core/dist/markers/markerLine.js +125 -0
- package/packages/core/dist/markers/markerLine.js.map +1 -0
- package/packages/core/dist/markers/physicalLines.d.ts +10 -0
- package/packages/core/dist/markers/physicalLines.d.ts.map +1 -0
- package/packages/core/dist/markers/physicalLines.js +48 -0
- package/packages/core/dist/markers/physicalLines.js.map +1 -0
- package/packages/core/dist/markers/policyHash.d.ts +4 -0
- package/packages/core/dist/markers/policyHash.d.ts.map +1 -0
- package/packages/core/dist/markers/policyHash.js +14 -0
- package/packages/core/dist/markers/policyHash.js.map +1 -0
- package/packages/core/dist/markers/proofSignature.d.ts +29 -0
- package/packages/core/dist/markers/proofSignature.d.ts.map +1 -0
- package/packages/core/dist/markers/proofSignature.js +106 -0
- package/packages/core/dist/markers/proofSignature.js.map +1 -0
- package/packages/core/dist/markers/reconcile.d.ts +26 -0
- package/packages/core/dist/markers/reconcile.d.ts.map +1 -0
- package/packages/core/dist/markers/reconcile.js +52 -0
- package/packages/core/dist/markers/reconcile.js.map +1 -0
- package/packages/core/dist/markers/registry.d.ts +53 -0
- package/packages/core/dist/markers/registry.d.ts.map +1 -0
- package/packages/core/dist/markers/registry.js +161 -0
- package/packages/core/dist/markers/registry.js.map +1 -0
- package/packages/core/dist/markers/rowHash.d.ts +2 -0
- package/packages/core/dist/markers/rowHash.d.ts.map +1 -0
- package/packages/core/dist/markers/rowHash.js +10 -0
- package/packages/core/dist/markers/rowHash.js.map +1 -0
- package/packages/core/dist/markers/scanner.d.ts +67 -0
- package/packages/core/dist/markers/scanner.d.ts.map +1 -0
- package/packages/core/dist/markers/scanner.js +292 -0
- package/packages/core/dist/markers/scanner.js.map +1 -0
- package/packages/core/dist/markers/schemas/binding-registry-event.schema.json +41 -0
- package/packages/core/dist/markers/schemas/freshness-status.schema.json +134 -0
- package/packages/core/dist/markers/schemas/proof-event.schema.json +170 -0
- package/packages/core/dist/markers/spanCanon.d.ts +4 -0
- package/packages/core/dist/markers/spanCanon.d.ts.map +1 -0
- package/packages/core/dist/markers/spanCanon.js +42 -0
- package/packages/core/dist/markers/spanCanon.js.map +1 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.d.ts +36 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.d.ts.map +1 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.js +638 -0
- package/packages/core/dist/markers/swiftFuncRecognizer.js.map +1 -0
- package/packages/core/dist/markers/validators.d.ts +13 -0
- package/packages/core/dist/markers/validators.d.ts.map +1 -0
- package/packages/core/dist/markers/validators.js +64 -0
- package/packages/core/dist/markers/validators.js.map +1 -0
- package/packages/core/dist/markers/verificationContextHash.d.ts +23 -0
- package/packages/core/dist/markers/verificationContextHash.d.ts.map +1 -0
- package/packages/core/dist/markers/verificationContextHash.js +96 -0
- package/packages/core/dist/markers/verificationContextHash.js.map +1 -0
- package/packages/core/dist/markers/verifierPresets.d.ts +18 -0
- package/packages/core/dist/markers/verifierPresets.d.ts.map +1 -0
- package/packages/core/dist/markers/verifierPresets.js +71 -0
- package/packages/core/dist/markers/verifierPresets.js.map +1 -0
- package/packages/core/dist/markers/verifierResolver.d.ts +27 -0
- package/packages/core/dist/markers/verifierResolver.d.ts.map +1 -0
- package/packages/core/dist/markers/verifierResolver.js +151 -0
- package/packages/core/dist/markers/verifierResolver.js.map +1 -0
- package/packages/core/dist/migration/index.d.ts +2 -0
- package/packages/core/dist/migration/index.d.ts.map +1 -0
- package/packages/core/dist/migration/index.js +2 -0
- package/packages/core/dist/migration/index.js.map +1 -0
- package/packages/core/dist/migration/testMatrix.d.ts +42 -0
- package/packages/core/dist/migration/testMatrix.d.ts.map +1 -0
- package/packages/core/dist/migration/testMatrix.js +351 -0
- package/packages/core/dist/migration/testMatrix.js.map +1 -0
- package/packages/core/dist/package/index.d.ts +2 -0
- package/packages/core/dist/package/index.d.ts.map +1 -0
- package/packages/core/dist/package/index.js +2 -0
- package/packages/core/dist/package/index.js.map +1 -0
- package/packages/core/dist/package/inspectPackage.d.ts +67 -0
- package/packages/core/dist/package/inspectPackage.d.ts.map +1 -0
- package/packages/core/dist/package/inspectPackage.js +371 -0
- package/packages/core/dist/package/inspectPackage.js.map +1 -0
- package/packages/core/dist/presentation/candidates.d.ts +13 -0
- package/packages/core/dist/presentation/candidates.d.ts.map +1 -0
- package/packages/core/dist/presentation/candidates.js +86 -0
- package/packages/core/dist/presentation/candidates.js.map +1 -0
- package/packages/core/dist/presentation/index.d.ts +8 -0
- package/packages/core/dist/presentation/index.d.ts.map +1 -0
- package/packages/core/dist/presentation/index.js +8 -0
- package/packages/core/dist/presentation/index.js.map +1 -0
- package/packages/core/dist/presentation/items.d.ts +18 -0
- package/packages/core/dist/presentation/items.d.ts.map +1 -0
- package/packages/core/dist/presentation/items.js +228 -0
- package/packages/core/dist/presentation/items.js.map +1 -0
- package/packages/core/dist/presentation/ordering.d.ts +8 -0
- package/packages/core/dist/presentation/ordering.d.ts.map +1 -0
- package/packages/core/dist/presentation/ordering.js +31 -0
- package/packages/core/dist/presentation/ordering.js.map +1 -0
- package/packages/core/dist/presentation/planHelpers.d.ts +26 -0
- package/packages/core/dist/presentation/planHelpers.d.ts.map +1 -0
- package/packages/core/dist/presentation/planHelpers.js +62 -0
- package/packages/core/dist/presentation/planHelpers.js.map +1 -0
- package/packages/core/dist/presentation/presentationFormat.d.ts +39 -0
- package/packages/core/dist/presentation/presentationFormat.d.ts.map +1 -0
- package/packages/core/dist/presentation/presentationFormat.js +58 -0
- package/packages/core/dist/presentation/presentationFormat.js.map +1 -0
- package/packages/core/dist/presentation/renderCard.d.ts +37 -0
- package/packages/core/dist/presentation/renderCard.d.ts.map +1 -0
- package/packages/core/dist/presentation/renderCard.js +129 -0
- package/packages/core/dist/presentation/renderCard.js.map +1 -0
- package/packages/core/dist/presentation/scoring.d.ts +10 -0
- package/packages/core/dist/presentation/scoring.d.ts.map +1 -0
- package/packages/core/dist/presentation/scoring.js +82 -0
- package/packages/core/dist/presentation/scoring.js.map +1 -0
- package/packages/core/dist/presentation/selectPlan.d.ts +4 -0
- package/packages/core/dist/presentation/selectPlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectPlan.js +122 -0
- package/packages/core/dist/presentation/selectPlan.js.map +1 -0
- package/packages/core/dist/presentation/selectShowcasePlan.d.ts +3 -0
- package/packages/core/dist/presentation/selectShowcasePlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectShowcasePlan.js +6 -0
- package/packages/core/dist/presentation/selectShowcasePlan.js.map +1 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts +3 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.d.ts.map +1 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.js +6 -0
- package/packages/core/dist/presentation/selectWalkthroughPlan.js.map +1 -0
- package/packages/core/dist/presentation/selection.d.ts +7 -0
- package/packages/core/dist/presentation/selection.d.ts.map +1 -0
- package/packages/core/dist/presentation/selection.js +20 -0
- package/packages/core/dist/presentation/selection.js.map +1 -0
- package/packages/core/dist/presentation/snapshot.d.ts +12 -0
- package/packages/core/dist/presentation/snapshot.d.ts.map +1 -0
- package/packages/core/dist/presentation/snapshot.js +53 -0
- package/packages/core/dist/presentation/snapshot.js.map +1 -0
- package/packages/core/dist/presentation/types.d.ts +172 -0
- package/packages/core/dist/presentation/types.d.ts.map +1 -0
- package/packages/core/dist/presentation/types.js +2 -0
- package/packages/core/dist/presentation/types.js.map +1 -0
- package/packages/core/dist/redact.d.ts +11 -0
- package/packages/core/dist/redact.d.ts.map +1 -0
- package/packages/core/dist/redact.js +17 -0
- package/packages/core/dist/redact.js.map +1 -0
- package/packages/core/dist/roots.d.ts +81 -0
- package/packages/core/dist/roots.d.ts.map +1 -0
- package/packages/core/dist/roots.js +220 -0
- package/packages/core/dist/roots.js.map +1 -0
- package/packages/core/dist/schema/cliResult.d.ts +34 -0
- package/packages/core/dist/schema/cliResult.d.ts.map +1 -0
- package/packages/core/dist/schema/cliResult.js +35 -0
- package/packages/core/dist/schema/cliResult.js.map +1 -0
- package/packages/core/dist/schema/diagnostic.d.ts +26 -0
- package/packages/core/dist/schema/diagnostic.d.ts.map +1 -0
- package/packages/core/dist/schema/diagnostic.js +28 -0
- package/packages/core/dist/schema/diagnostic.js.map +1 -0
- package/packages/core/dist/schema/index.d.ts +8 -0
- package/packages/core/dist/schema/index.d.ts.map +1 -0
- package/packages/core/dist/schema/index.js +9 -0
- package/packages/core/dist/schema/index.js.map +1 -0
- package/packages/core/dist/schema/registry.d.ts +15 -0
- package/packages/core/dist/schema/registry.d.ts.map +1 -0
- package/packages/core/dist/schema/registry.js +206 -0
- package/packages/core/dist/schema/registry.js.map +1 -0
- package/packages/core/dist/schema/syntheticContracts.d.ts +3 -0
- package/packages/core/dist/schema/syntheticContracts.d.ts.map +1 -0
- package/packages/core/dist/schema/syntheticContracts.js +342 -0
- package/packages/core/dist/schema/syntheticContracts.js.map +1 -0
- package/packages/core/dist/schema/validate.d.ts +21 -0
- package/packages/core/dist/schema/validate.d.ts.map +1 -0
- package/packages/core/dist/schema/validate.js +210 -0
- package/packages/core/dist/schema/validate.js.map +1 -0
- package/packages/core/dist/schemas/v1/authority.schema.json +70 -0
- package/packages/core/dist/schemas/v1/cli-result.schema.json +30 -0
- package/packages/core/dist/schemas/v1/common.schema.json +274 -0
- package/packages/core/dist/schemas/v1/demo-capsule.schema.json +78 -0
- package/packages/core/dist/schemas/v1/evidence-append-result.schema.json +14 -0
- package/packages/core/dist/schemas/v1/evidence-event.schema.json +181 -0
- package/packages/core/dist/schemas/v1/evidence-status-result.schema.json +68 -0
- package/packages/core/dist/schemas/v1/host-profile.schema.json +94 -0
- package/packages/core/dist/schemas/v1/host-status-result.schema.json +49 -0
- package/packages/core/dist/schemas/v1/keyring.schema.json +77 -0
- package/packages/core/dist/schemas/v1/ledger.schema.json +99 -0
- package/packages/core/dist/schemas/v1/marker.schema.json +84 -0
- package/packages/core/dist/schemas/v1/matrix-list-result.schema.json +67 -0
- package/packages/core/dist/schemas/v1/matrix-mutation-result.schema.json +49 -0
- package/packages/core/dist/schemas/v1/matrix-validation-result.schema.json +77 -0
- package/packages/core/dist/schemas/v1/mcp-tool-results.schema.json +34 -0
- package/packages/core/dist/schemas/v1/migration-test-matrix-result.schema.json +76 -0
- package/packages/core/dist/schemas/v1/presentation-plan-result.schema.json +62 -0
- package/packages/core/dist/schemas/v1/presentation-plan.schema.json +259 -0
- package/packages/core/dist/schemas/v1/release-gate-result.schema.json +136 -0
- package/packages/core/dist/schemas/v1/showcase-approval-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/showcase-event-append-result.schema.json +17 -0
- package/packages/core/dist/schemas/v1/showcase-event.schema.json +235 -0
- package/packages/core/dist/schemas/v1/showcase-finish-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/showcase-run-status-result.schema.json +70 -0
- package/packages/core/dist/schemas/v1/showcase-start-result.schema.json +5 -0
- package/packages/core/dist/schemas/v1/use-case-file.schema.json +178 -0
- package/packages/core/dist/schemas/v1/workflow-mode.schema.json +16 -0
- package/packages/core/dist/schemas/v1/workspace-config.schema.json +58 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.d.ts +116 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.d.ts.map +1 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.js +353 -0
- package/packages/core/dist/showcase/appendShowcaseEvent.js.map +1 -0
- package/packages/core/dist/showcase/approval.d.ts +2 -0
- package/packages/core/dist/showcase/approval.d.ts.map +1 -0
- package/packages/core/dist/showcase/approval.js +2 -0
- package/packages/core/dist/showcase/approval.js.map +1 -0
- package/packages/core/dist/showcase/approvalAuthority.d.ts +19 -0
- package/packages/core/dist/showcase/approvalAuthority.d.ts.map +1 -0
- package/packages/core/dist/showcase/approvalAuthority.js +46 -0
- package/packages/core/dist/showcase/approvalAuthority.js.map +1 -0
- package/packages/core/dist/showcase/index.d.ts +11 -0
- package/packages/core/dist/showcase/index.d.ts.map +1 -0
- package/packages/core/dist/showcase/index.js +11 -0
- package/packages/core/dist/showcase/index.js.map +1 -0
- package/packages/core/dist/showcase/jsonlLedger.d.ts +11 -0
- package/packages/core/dist/showcase/jsonlLedger.d.ts.map +1 -0
- package/packages/core/dist/showcase/jsonlLedger.js +50 -0
- package/packages/core/dist/showcase/jsonlLedger.js.map +1 -0
- package/packages/core/dist/showcase/planBinding.d.ts +5 -0
- package/packages/core/dist/showcase/planBinding.d.ts.map +1 -0
- package/packages/core/dist/showcase/planBinding.js +33 -0
- package/packages/core/dist/showcase/planBinding.js.map +1 -0
- package/packages/core/dist/showcase/replayRun.d.ts +5 -0
- package/packages/core/dist/showcase/replayRun.d.ts.map +1 -0
- package/packages/core/dist/showcase/replayRun.js +199 -0
- package/packages/core/dist/showcase/replayRun.js.map +1 -0
- package/packages/core/dist/showcase/results.d.ts +3 -0
- package/packages/core/dist/showcase/results.d.ts.map +1 -0
- package/packages/core/dist/showcase/results.js +4 -0
- package/packages/core/dist/showcase/results.js.map +1 -0
- package/packages/core/dist/showcase/revisionEpochs.d.ts +2 -0
- package/packages/core/dist/showcase/revisionEpochs.d.ts.map +1 -0
- package/packages/core/dist/showcase/revisionEpochs.js +2 -0
- package/packages/core/dist/showcase/revisionEpochs.js.map +1 -0
- package/packages/core/dist/showcase/startRun.d.ts +2 -0
- package/packages/core/dist/showcase/startRun.d.ts.map +1 -0
- package/packages/core/dist/showcase/startRun.js +2 -0
- package/packages/core/dist/showcase/startRun.js.map +1 -0
- package/packages/core/dist/showcase/types.d.ts +66 -0
- package/packages/core/dist/showcase/types.d.ts.map +1 -0
- package/packages/core/dist/showcase/types.js +2 -0
- package/packages/core/dist/showcase/types.js.map +1 -0
- package/packages/core/dist/skills/canonicalSkills.d.ts +3 -0
- package/packages/core/dist/skills/canonicalSkills.d.ts.map +1 -0
- package/packages/core/dist/skills/canonicalSkills.js +7 -0
- package/packages/core/dist/skills/canonicalSkills.js.map +1 -0
- package/packages/core/dist/skills/index.d.ts +4 -0
- package/packages/core/dist/skills/index.d.ts.map +1 -0
- package/packages/core/dist/skills/index.js +4 -0
- package/packages/core/dist/skills/index.js.map +1 -0
- package/packages/core/dist/skills/types.d.ts +26 -0
- package/packages/core/dist/skills/types.d.ts.map +1 -0
- package/packages/core/dist/skills/types.js +2 -0
- package/packages/core/dist/skills/types.js.map +1 -0
- package/packages/core/dist/skills/validateSkillAssets.d.ts +6 -0
- package/packages/core/dist/skills/validateSkillAssets.d.ts.map +1 -0
- package/packages/core/dist/skills/validateSkillAssets.js +218 -0
- package/packages/core/dist/skills/validateSkillAssets.js.map +1 -0
- package/packages/core/dist/useCases/integrity.d.ts +11 -0
- package/packages/core/dist/useCases/integrity.d.ts.map +1 -0
- package/packages/core/dist/useCases/integrity.js +178 -0
- package/packages/core/dist/useCases/integrity.js.map +1 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts +7 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.d.ts.map +1 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.js +74 -0
- package/packages/core/dist/useCases/loadUseCaseMatrix.js.map +1 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts +25 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.d.ts.map +1 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.js +198 -0
- package/packages/core/dist/useCases/mutateUseCaseMatrix.js.map +1 -0
- package/packages/core/dist/useCases/query.d.ts +12 -0
- package/packages/core/dist/useCases/query.d.ts.map +1 -0
- package/packages/core/dist/useCases/query.js +47 -0
- package/packages/core/dist/useCases/query.js.map +1 -0
- package/packages/core/dist/useCases/types.d.ts +149 -0
- package/packages/core/dist/useCases/types.d.ts.map +1 -0
- package/packages/core/dist/useCases/types.js +2 -0
- package/packages/core/dist/useCases/types.js.map +1 -0
- package/packages/core/dist/useCases/validateUseCaseFile.d.ts +9 -0
- package/packages/core/dist/useCases/validateUseCaseFile.d.ts.map +1 -0
- package/packages/core/dist/useCases/validateUseCaseFile.js +107 -0
- package/packages/core/dist/useCases/validateUseCaseFile.js.map +1 -0
- package/packages/core/dist/version.d.ts +9 -0
- package/packages/core/dist/version.d.ts.map +1 -0
- package/packages/core/dist/version.js +17 -0
- package/packages/core/dist/version.js.map +1 -0
- package/packages/core/package.json +39 -0
- package/packages/mcp/README.md +48 -0
- package/packages/mcp/dist/index.d.ts +20 -0
- package/packages/mcp/dist/index.d.ts.map +1 -0
- package/packages/mcp/dist/index.js +180 -0
- package/packages/mcp/dist/index.js.map +1 -0
- package/packages/mcp/dist/prompts.d.ts +32 -0
- package/packages/mcp/dist/prompts.d.ts.map +1 -0
- package/packages/mcp/dist/prompts.js +199 -0
- package/packages/mcp/dist/prompts.js.map +1 -0
- package/packages/mcp/dist/resources.d.ts +22 -0
- package/packages/mcp/dist/resources.d.ts.map +1 -0
- package/packages/mcp/dist/resources.js +342 -0
- package/packages/mcp/dist/resources.js.map +1 -0
- package/packages/mcp/dist/toolHandlers.d.ts +28 -0
- package/packages/mcp/dist/toolHandlers.d.ts.map +1 -0
- package/packages/mcp/dist/toolHandlers.js +592 -0
- package/packages/mcp/dist/toolHandlers.js.map +1 -0
- package/packages/mcp/dist/toolSchemas.d.ts +23 -0
- package/packages/mcp/dist/toolSchemas.d.ts.map +1 -0
- package/packages/mcp/dist/toolSchemas.js +223 -0
- package/packages/mcp/dist/toolSchemas.js.map +1 -0
- package/packages/mcp/dist/tools.d.ts +22 -0
- package/packages/mcp/dist/tools.d.ts.map +1 -0
- package/packages/mcp/dist/tools.js +65 -0
- package/packages/mcp/dist/tools.js.map +1 -0
- package/packages/mcp/package.json +38 -0
- package/plugin.json +6 -0
- package/schemas/v1/authority.schema.json +70 -0
- package/schemas/v1/cli-result.schema.json +30 -0
- package/schemas/v1/common.schema.json +274 -0
- package/schemas/v1/demo-capsule.schema.json +78 -0
- package/schemas/v1/evidence-append-result.schema.json +14 -0
- package/schemas/v1/evidence-event.schema.json +181 -0
- package/schemas/v1/evidence-status-result.schema.json +68 -0
- package/schemas/v1/host-profile.schema.json +94 -0
- package/schemas/v1/host-status-result.schema.json +49 -0
- package/schemas/v1/keyring.schema.json +77 -0
- package/schemas/v1/ledger.schema.json +99 -0
- package/schemas/v1/marker.schema.json +84 -0
- package/schemas/v1/matrix-list-result.schema.json +67 -0
- package/schemas/v1/matrix-mutation-result.schema.json +49 -0
- package/schemas/v1/matrix-validation-result.schema.json +77 -0
- package/schemas/v1/mcp-tool-results.schema.json +34 -0
- package/schemas/v1/migration-test-matrix-result.schema.json +76 -0
- package/schemas/v1/presentation-plan-result.schema.json +62 -0
- package/schemas/v1/presentation-plan.schema.json +259 -0
- package/schemas/v1/release-gate-result.schema.json +136 -0
- package/schemas/v1/showcase-approval-result.schema.json +5 -0
- package/schemas/v1/showcase-event-append-result.schema.json +17 -0
- package/schemas/v1/showcase-event.schema.json +235 -0
- package/schemas/v1/showcase-finish-result.schema.json +5 -0
- package/schemas/v1/showcase-run-status-result.schema.json +70 -0
- package/schemas/v1/showcase-start-result.schema.json +5 -0
- package/schemas/v1/use-case-file.schema.json +178 -0
- package/schemas/v1/workflow-mode.schema.json +16 -0
- package/schemas/v1/workspace-config.schema.json +58 -0
- package/use-cases/capsule/demos.yml +212 -0
- package/use-cases/capsule/runner.yml +49 -0
- package/use-cases/diagnostics/contracts.yml +239 -0
- package/use-cases/evidence/core.yml +32 -0
- package/use-cases/evidence/ledger.yml +330 -0
- package/use-cases/hosts/profiles.yml +365 -0
- package/use-cases/hosts/projections.yml +96 -0
- package/use-cases/lifecycle/loop.yml +229 -0
- package/use-cases/matrix/core.yml +92 -0
- package/use-cases/matrix/product.yml +289 -0
- package/use-cases/mcp/surface.yml +257 -0
- package/use-cases/mcp/wrapper.yml +100 -0
- package/use-cases/migration/importer.yml +171 -0
- package/use-cases/migration/test-matrix.yml +32 -0
- package/use-cases/planning/cards.yml +215 -0
- package/use-cases/release/package.yml +80 -0
- package/use-cases/release/proof.yml +180 -0
- package/use-cases/roadmap/deferred.yml +184 -0
- package/use-cases/showcase/flow.yml +269 -0
- package/use-cases/showcase/live.yml +44 -0
- package/use-cases/skills/assets.yml +92 -0
- package/use-cases.yml +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/markers/index.ts"],"names":[],"mappings":"AAGA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAEhC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAE7B,cAAc,0BAA0B,CAAC;AAEzC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,cAAc,CAAC;AAE7B,cAAc,aAAa,CAAC;AAE5B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Public API for the use-case-markers Phase 1 primitives:
|
|
2
|
+
// schema ids/constants, canonical JSON + sha256, the row/policy/binding-set
|
|
3
|
+
// hashes, and the JSON-schema validators.
|
|
4
|
+
export * from "./constants.js";
|
|
5
|
+
export * from "./canonicalJson.js";
|
|
6
|
+
export * from "./rowHash.js";
|
|
7
|
+
export * from "./policyHash.js";
|
|
8
|
+
export * from "./verifierPresets.js";
|
|
9
|
+
export * from "./verifierResolver.js";
|
|
10
|
+
export * from "./verificationContextHash.js";
|
|
11
|
+
export * from "./bindingSetHash.js";
|
|
12
|
+
export * from "./validators.js";
|
|
13
|
+
// Phase 2: marker parser + explicit-span scanner.
|
|
14
|
+
export * from "./commentPrefix.js";
|
|
15
|
+
export * from "./markerLine.js";
|
|
16
|
+
export * from "./spanCanon.js";
|
|
17
|
+
export * from "./physicalLines.js";
|
|
18
|
+
export * from "./scanner.js";
|
|
19
|
+
// Phase 4: Swift function recognizer (inferred-end spans).
|
|
20
|
+
export * from "./swiftFuncRecognizer.js";
|
|
21
|
+
// Phase 3: append-only binding registry + reconciliation.
|
|
22
|
+
export * from "./registry.js";
|
|
23
|
+
export * from "./appendOnly.js";
|
|
24
|
+
export * from "./reconcile.js";
|
|
25
|
+
// Phase 5: evidence ledger validation + trusted-CI proof signatures.
|
|
26
|
+
export * from "./proofSignature.js";
|
|
27
|
+
export * from "./evidenceLedger.js";
|
|
28
|
+
// Public-v1: opt-in multi-key keyring resolver (rotation / revocation).
|
|
29
|
+
export * from "./keyring.js";
|
|
30
|
+
// Public-v1: opt-in signed-tier ed25519 keypair generation (`uc keygen`).
|
|
31
|
+
export * from "./keygen.js";
|
|
32
|
+
// Public-v1: CI-neutral provenance authority detection.
|
|
33
|
+
export * from "./ciAuthority.js";
|
|
34
|
+
// Phase 6: freshness state machine (status derivation + policy gate).
|
|
35
|
+
export * from "./freshness.js";
|
|
36
|
+
// Phase 7: CLI command cores (bind / scan / prove / validate-ledger).
|
|
37
|
+
export * from "./cli/index.js";
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markers/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,4EAA4E;AAC5E,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,kDAAkD;AAClD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,cAAc,CAAC;AAC7B,2DAA2D;AAC3D,cAAc,0BAA0B,CAAC;AACzC,0DAA0D;AAC1D,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,qEAAqE;AACrE,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,wEAAwE;AACxE,cAAc,cAAc,CAAC;AAC7B,0EAA0E;AAC1E,cAAc,aAAa,CAAC;AAC5B,wDAAwD;AACxD,cAAc,kBAAkB,CAAC;AACjC,sEAAsE;AACtE,cAAc,gBAAgB,CAAC;AAC/B,sEAAsE;AACtE,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.d.ts","sourceRoot":"","sources":["../../src/markers/keygen.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAG7B,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,wBAAgB,sBAAsB,IAAI,cAAc,CAMvD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// ed25519 keypair generation for the OPT-IN signed proof tier (spec 5.2/5.3).
|
|
2
|
+
//
|
|
3
|
+
// This mirrors the recipe in docs/security/key-management.md exactly: the
|
|
4
|
+
// private key is exported as a PKCS8 PEM and the public key as an SPKI PEM —
|
|
5
|
+
// the two formats `prove --signing-key-env` (via createPrivateKey) and
|
|
6
|
+
// `--public-key` (via createPublicKey) already consume. Everything here is pure
|
|
7
|
+
// crypto over in-memory values; no filesystem, git, or process access. The CLI
|
|
8
|
+
// layer owns where (if anywhere) the keys are written and the CI-only warning.
|
|
9
|
+
import { generateKeyPairSync } from "node:crypto";
|
|
10
|
+
// Generate a new ed25519 signing keypair. Each call returns a distinct pair.
|
|
11
|
+
export function generateSigningKeypair() {
|
|
12
|
+
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
13
|
+
return {
|
|
14
|
+
privatePem: privateKey.export({ type: "pkcs8", format: "pem" }).toString(),
|
|
15
|
+
publicPem: publicKey.export({ type: "spki", format: "pem" }).toString()
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=keygen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keygen.js","sourceRoot":"","sources":["../../src/markers/keygen.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,uEAAuE;AACvE,gFAAgF;AAChF,+EAA+E;AAC/E,+EAA+E;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAYlD,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB;IACpC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACjE,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC1E,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;KACxE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PublicKeyResolver } from "./proofSignature.js";
|
|
2
|
+
export declare const KEYRING_SCHEMA_ID = "https://use-cases.dev/schemas/v1/keyring.schema.json";
|
|
3
|
+
export interface KeyringKey {
|
|
4
|
+
key_id: string;
|
|
5
|
+
algorithm: "ed25519";
|
|
6
|
+
public_key: string;
|
|
7
|
+
valid_from: string;
|
|
8
|
+
valid_until: string | null;
|
|
9
|
+
status: "active" | "revoked";
|
|
10
|
+
}
|
|
11
|
+
export interface Keyring {
|
|
12
|
+
keyring_schema_id: "ucase-public-key-registry-v1";
|
|
13
|
+
keys: KeyringKey[];
|
|
14
|
+
}
|
|
15
|
+
export declare class KeyringError extends Error {
|
|
16
|
+
readonly code: string;
|
|
17
|
+
constructor(code: string, message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare function parseKeyring(value: unknown, sourcePath?: string | null): Keyring;
|
|
20
|
+
export declare function loadKeyring(filePath: string): Keyring;
|
|
21
|
+
export declare function keyringResolver(keyring: Keyring): PublicKeyResolver;
|
|
22
|
+
export declare function keyringPublicKeyResolverFromFile(filePath: string): PublicKeyResolver;
|
|
23
|
+
//# sourceMappingURL=keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../src/markers/keyring.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,eAAO,MAAM,iBAAiB,yDAAyD,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,iBAAiB,EAAE,8BAA8B,CAAC;IAClD,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAGD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAOtF;AAGD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAoBrD;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAiCnE;AAGD,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAEpF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Multi-key public-key registry (keyring) for verifying trusted-CI proof-event
|
|
2
|
+
// signatures (schemas/v1/keyring.schema.json).
|
|
3
|
+
//
|
|
4
|
+
// This is the OPT-IN alternative to the single `--public-key` path. Where
|
|
5
|
+
// singleKeyResolver trusts one explicitly-provided key unconditionally, a
|
|
6
|
+
// keyring carries several keys, each with a validity window and a revocation
|
|
7
|
+
// status, so keys can be rotated and retired without changing code.
|
|
8
|
+
//
|
|
9
|
+
// Resolution is FAIL-CLOSED: a key_id resolves to a public key ONLY when the
|
|
10
|
+
// key exists, its status is "active", and the proof's created_at falls inside
|
|
11
|
+
// [valid_from, valid_until] (valid_until null = open-ended). A revoked, unknown,
|
|
12
|
+
// or out-of-window key_id resolves to undefined, so verifyEvent reports
|
|
13
|
+
// UNKNOWN_KEY_ID and the proof does not verify.
|
|
14
|
+
import { readFileSync } from "node:fs";
|
|
15
|
+
import { validateBySchemaId } from "../schema/index.js";
|
|
16
|
+
export const KEYRING_SCHEMA_ID = "https://use-cases.dev/schemas/v1/keyring.schema.json";
|
|
17
|
+
// A loader/validator error carrying a stable `code` so callers can branch.
|
|
18
|
+
export class KeyringError extends Error {
|
|
19
|
+
code;
|
|
20
|
+
constructor(code, message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "KeyringError";
|
|
23
|
+
this.code = code;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Parse + schema-validate a keyring object. Throws KeyringError on any failure.
|
|
27
|
+
export function parseKeyring(value, sourcePath = null) {
|
|
28
|
+
const result = validateBySchemaId(KEYRING_SCHEMA_ID, value, sourcePath);
|
|
29
|
+
if (!result.ok) {
|
|
30
|
+
const details = result.diagnostics.map((d) => `${d.json_pointer ?? ""} ${d.message}`.trim()).join("; ");
|
|
31
|
+
throw new KeyringError("keyring_schema_invalid", `keyring file is not a valid keyring: ${details}`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
// Read, JSON-parse, and schema-validate a keyring file from disk.
|
|
36
|
+
export function loadKeyring(filePath) {
|
|
37
|
+
let text;
|
|
38
|
+
try {
|
|
39
|
+
text = readFileSync(filePath, "utf8");
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw new KeyringError("keyring_unreadable", `could not read keyring file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
43
|
+
}
|
|
44
|
+
let value;
|
|
45
|
+
try {
|
|
46
|
+
value = JSON.parse(text);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new KeyringError("keyring_invalid_json", `keyring file ${filePath} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
50
|
+
}
|
|
51
|
+
return parseKeyring(value, filePath);
|
|
52
|
+
}
|
|
53
|
+
// Build a fail-closed resolver over a keyring. A key_id resolves to its PEM only
|
|
54
|
+
// when the key is active and the proof's createdAt is within its window.
|
|
55
|
+
export function keyringResolver(keyring) {
|
|
56
|
+
const byId = new Map();
|
|
57
|
+
for (const key of keyring.keys) {
|
|
58
|
+
// First entry per key_id wins; later duplicates are ignored.
|
|
59
|
+
if (!byId.has(key.key_id)) {
|
|
60
|
+
byId.set(key.key_id, key);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return (keyId, createdAt) => {
|
|
64
|
+
const key = byId.get(keyId);
|
|
65
|
+
if (!key || key.status !== "active") {
|
|
66
|
+
return undefined; // unknown or revoked -> fail closed
|
|
67
|
+
}
|
|
68
|
+
// Without a created_at we cannot prove the window holds -> fail closed.
|
|
69
|
+
if (createdAt === undefined) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const at = Date.parse(createdAt);
|
|
73
|
+
if (Number.isNaN(at)) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const from = Date.parse(key.valid_from);
|
|
77
|
+
if (Number.isNaN(from) || at < from) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
if (key.valid_until !== null) {
|
|
81
|
+
const until = Date.parse(key.valid_until);
|
|
82
|
+
if (Number.isNaN(until) || at > until) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return key.public_key;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Convenience used by the CLI: load a keyring file and build its resolver.
|
|
90
|
+
export function keyringPublicKeyResolverFromFile(filePath) {
|
|
91
|
+
return keyringResolver(loadKeyring(filePath));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=keyring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../src/markers/keyring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const MarkerErrorCode: Readonly<{
|
|
2
|
+
readonly FORBIDDEN_MARKER_PAYLOAD: "FORBIDDEN_MARKER_PAYLOAD";
|
|
3
|
+
readonly MALFORMED_MARKER: "MALFORMED_MARKER";
|
|
4
|
+
readonly MALFORMED_END_MARKER: "MALFORMED_END_MARKER";
|
|
5
|
+
readonly MISMATCHED_END_MARKER: "MISMATCHED_END_MARKER";
|
|
6
|
+
readonly END_WITHOUT_START: "END_WITHOUT_START";
|
|
7
|
+
readonly UNSUPPORTED_INFERENCE: "UNSUPPORTED_INFERENCE";
|
|
8
|
+
readonly NESTED_SPAN: "NESTED_SPAN";
|
|
9
|
+
readonly DUPLICATE_BINDING_SLUG: "DUPLICATE_BINDING_SLUG";
|
|
10
|
+
}>;
|
|
11
|
+
export type MarkerErrorCode = (typeof MarkerErrorCode)[keyof typeof MarkerErrorCode];
|
|
12
|
+
export declare function isValidSlug(slug: string): boolean;
|
|
13
|
+
export declare function splitSlug(slug: string): {
|
|
14
|
+
row_id: string;
|
|
15
|
+
suffix: string | null;
|
|
16
|
+
} | null;
|
|
17
|
+
export type MarkerLineParse = {
|
|
18
|
+
kind: "none";
|
|
19
|
+
} | {
|
|
20
|
+
kind: "start";
|
|
21
|
+
slug: string;
|
|
22
|
+
column: number;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "end";
|
|
25
|
+
slug: string;
|
|
26
|
+
column: number;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "invalid";
|
|
29
|
+
code: MarkerErrorCode;
|
|
30
|
+
message: string;
|
|
31
|
+
column: number;
|
|
32
|
+
slug?: string;
|
|
33
|
+
};
|
|
34
|
+
export declare function parseMarkerLine(line: string, commentPrefix: string): MarkerLineParse;
|
|
35
|
+
//# sourceMappingURL=markerLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markerLine.d.ts","sourceRoot":"","sources":["../../src/markers/markerLine.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe;;;;;;;;;EAWjB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAYrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CASxF;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAQ/F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,eAAe,CA4EpF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Marker-line parser (spec section 1: grammar 1.2, slug rules 1.3).
|
|
2
|
+
//
|
|
3
|
+
// Recognizes one physical source line of the form
|
|
4
|
+
// <comment-prefix>: @use-case: <payload>
|
|
5
|
+
// and classifies it as a start marker, an end marker, "not a marker", or an
|
|
6
|
+
// INVALID marker with a precise error code. The marker carries identity ONLY:
|
|
7
|
+
// any payload beyond a bare slug (a `fresh=`, `sha256=`, `role=`, `tier1`, ...)
|
|
8
|
+
// or beyond a valid `end <slug>` is rejected as a forbidden payload.
|
|
9
|
+
// Stable error codes for every way a marker / span can be invalid. Marker-line
|
|
10
|
+
// codes are produced here; span-pairing codes are produced by the scanner.
|
|
11
|
+
export const MarkerErrorCode = Object.freeze({
|
|
12
|
+
// Marker-line level.
|
|
13
|
+
FORBIDDEN_MARKER_PAYLOAD: "FORBIDDEN_MARKER_PAYLOAD",
|
|
14
|
+
MALFORMED_MARKER: "MALFORMED_MARKER",
|
|
15
|
+
MALFORMED_END_MARKER: "MALFORMED_END_MARKER",
|
|
16
|
+
// Span-pairing level.
|
|
17
|
+
MISMATCHED_END_MARKER: "MISMATCHED_END_MARKER",
|
|
18
|
+
END_WITHOUT_START: "END_WITHOUT_START",
|
|
19
|
+
UNSUPPORTED_INFERENCE: "UNSUPPORTED_INFERENCE",
|
|
20
|
+
NESTED_SPAN: "NESTED_SPAN",
|
|
21
|
+
DUPLICATE_BINDING_SLUG: "DUPLICATE_BINDING_SLUG"
|
|
22
|
+
});
|
|
23
|
+
// Full slug grammar (spec 1.2 / 1.3):
|
|
24
|
+
// slug = row-id ["#" binding-suffix]
|
|
25
|
+
// row-id = ident {"." ident}
|
|
26
|
+
// binding-suffix = suffix-ident {"." suffix-ident}
|
|
27
|
+
// ident = lower-alpha {lower-alpha | digit | "_"}
|
|
28
|
+
// suffix-ident = lower-alpha {lower-alpha | digit | "_" | "-"}
|
|
29
|
+
const ROW_ID = "[a-z][a-z0-9_]*(?:\\.[a-z][a-z0-9_]*)*";
|
|
30
|
+
const BINDING_SUFFIX = "[a-z][a-z0-9_-]*(?:\\.[a-z][a-z0-9_-]*)*";
|
|
31
|
+
const SLUG_RE = new RegExp(`^${ROW_ID}(?:#${BINDING_SUFFIX})?$`);
|
|
32
|
+
export function isValidSlug(slug) {
|
|
33
|
+
return SLUG_RE.test(slug);
|
|
34
|
+
}
|
|
35
|
+
// Split a valid slug into its row id and optional binding suffix.
|
|
36
|
+
// Returns null when the slug is not grammatical.
|
|
37
|
+
export function splitSlug(slug) {
|
|
38
|
+
if (!isValidSlug(slug)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const hash = slug.indexOf("#");
|
|
42
|
+
if (hash < 0) {
|
|
43
|
+
return { row_id: slug, suffix: null };
|
|
44
|
+
}
|
|
45
|
+
return { row_id: slug.slice(0, hash), suffix: slug.slice(hash + 1) };
|
|
46
|
+
}
|
|
47
|
+
// Parse a single physical line against a known comment prefix.
|
|
48
|
+
//
|
|
49
|
+
// A line is only considered a marker if, after optional leading whitespace, it
|
|
50
|
+
// begins with exactly `<prefix>: @use-case:`. Otherwise it is "none" (an
|
|
51
|
+
// ordinary line/comment that the scanner ignores). Once that token matches, the
|
|
52
|
+
// payload MUST be a bare slug or `end <slug>`; anything else is invalid.
|
|
53
|
+
export function parseMarkerLine(line, commentPrefix) {
|
|
54
|
+
const indentMatch = /^[ \t]*/.exec(line);
|
|
55
|
+
const indent = indentMatch ? indentMatch[0] : "";
|
|
56
|
+
const column = indent.length + 1;
|
|
57
|
+
const rest = line.slice(indent.length);
|
|
58
|
+
const token = `${commentPrefix}: @use-case:`;
|
|
59
|
+
if (!rest.startsWith(token)) {
|
|
60
|
+
return { kind: "none" };
|
|
61
|
+
}
|
|
62
|
+
const payloadRaw = rest.slice(token.length);
|
|
63
|
+
const payload = payloadRaw.replace(/^[ \t]+/, "").replace(/[ \t]+$/, "");
|
|
64
|
+
if (payload === "") {
|
|
65
|
+
return {
|
|
66
|
+
kind: "invalid",
|
|
67
|
+
code: MarkerErrorCode.MALFORMED_MARKER,
|
|
68
|
+
message: "use-case marker has an empty payload",
|
|
69
|
+
column
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const tokens = payload.split(/[ \t]+/);
|
|
73
|
+
if (tokens[0] === "end") {
|
|
74
|
+
if (tokens.length === 1) {
|
|
75
|
+
return {
|
|
76
|
+
kind: "invalid",
|
|
77
|
+
code: MarkerErrorCode.MALFORMED_END_MARKER,
|
|
78
|
+
message: "end marker has no slug; expected `end <slug>`",
|
|
79
|
+
column
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (tokens.length > 2) {
|
|
83
|
+
return {
|
|
84
|
+
kind: "invalid",
|
|
85
|
+
code: MarkerErrorCode.FORBIDDEN_MARKER_PAYLOAD,
|
|
86
|
+
message: `forbidden payload after end slug: ${tokens.slice(2).join(" ")}`,
|
|
87
|
+
column,
|
|
88
|
+
slug: tokens[1]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const slug = tokens[1];
|
|
92
|
+
if (!isValidSlug(slug)) {
|
|
93
|
+
return {
|
|
94
|
+
kind: "invalid",
|
|
95
|
+
code: MarkerErrorCode.MALFORMED_MARKER,
|
|
96
|
+
message: `invalid slug in end marker: ${slug}`,
|
|
97
|
+
column,
|
|
98
|
+
slug
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { kind: "end", slug, column };
|
|
102
|
+
}
|
|
103
|
+
// Start marker: payload must be exactly one valid slug.
|
|
104
|
+
if (tokens.length > 1) {
|
|
105
|
+
return {
|
|
106
|
+
kind: "invalid",
|
|
107
|
+
code: MarkerErrorCode.FORBIDDEN_MARKER_PAYLOAD,
|
|
108
|
+
message: `forbidden payload after slug: ${tokens.slice(1).join(" ")}`,
|
|
109
|
+
column,
|
|
110
|
+
slug: tokens[0]
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const slug = tokens[0];
|
|
114
|
+
if (!isValidSlug(slug)) {
|
|
115
|
+
return {
|
|
116
|
+
kind: "invalid",
|
|
117
|
+
code: MarkerErrorCode.MALFORMED_MARKER,
|
|
118
|
+
message: `invalid slug: ${slug}`,
|
|
119
|
+
column,
|
|
120
|
+
slug
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { kind: "start", slug, column };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=markerLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markerLine.js","sourceRoot":"","sources":["../../src/markers/markerLine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface PhysicalLine {
|
|
2
|
+
text: string;
|
|
3
|
+
charStart: number;
|
|
4
|
+
charEnd: number;
|
|
5
|
+
byteStart: number;
|
|
6
|
+
byteEnd: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function splitPhysicalLines(content: string): PhysicalLine[];
|
|
9
|
+
export declare function lineIndexOfChar(lines: ReadonlyArray<PhysicalLine>, charPos: number): number;
|
|
10
|
+
//# sourceMappingURL=physicalLines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalLines.d.ts","sourceRoot":"","sources":["../../src/markers/physicalLines.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAyBlE;AAKD,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO3F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Physical line splitting with both JS-char and UTF-8 byte offsets.
|
|
2
|
+
//
|
|
3
|
+
// Shared by the explicit-span scanner (which needs UTF-8 byte offsets for span
|
|
4
|
+
// byte ranges, spec 4.4) and the Swift function recognizer (which lexes in
|
|
5
|
+
// JS-char space but must report UTF-8 byte offsets, spec 9.3). Both consumers
|
|
6
|
+
// split lines identically, so line index `i` denotes the same physical line in
|
|
7
|
+
// either coordinate system.
|
|
8
|
+
// Split content into physical lines with char and UTF-8 byte offsets. Handles
|
|
9
|
+
// LF, CR and CRLF terminators; a file ending in a terminator does not yield a
|
|
10
|
+
// trailing empty line, while an interior blank line is preserved.
|
|
11
|
+
export function splitPhysicalLines(content) {
|
|
12
|
+
const lines = [];
|
|
13
|
+
const n = content.length;
|
|
14
|
+
let pos = 0;
|
|
15
|
+
let byteStart = 0;
|
|
16
|
+
while (pos < n) {
|
|
17
|
+
let eol = pos;
|
|
18
|
+
while (eol < n && content[eol] !== "\n" && content[eol] !== "\r") {
|
|
19
|
+
eol += 1;
|
|
20
|
+
}
|
|
21
|
+
const text = content.slice(pos, eol);
|
|
22
|
+
let termLen = 0;
|
|
23
|
+
if (eol < n) {
|
|
24
|
+
termLen = content[eol] === "\r" && content[eol + 1] === "\n" ? 2 : 1;
|
|
25
|
+
}
|
|
26
|
+
const charStart = pos;
|
|
27
|
+
const charEnd = eol + termLen;
|
|
28
|
+
const textBytes = Buffer.byteLength(text, "utf8");
|
|
29
|
+
// CR / LF / CRLF are all ASCII, so terminator bytes == terminator length.
|
|
30
|
+
const byteEnd = byteStart + textBytes + termLen;
|
|
31
|
+
lines.push({ text, charStart, charEnd, byteStart, byteEnd });
|
|
32
|
+
byteStart = byteEnd;
|
|
33
|
+
pos = charEnd;
|
|
34
|
+
}
|
|
35
|
+
return lines;
|
|
36
|
+
}
|
|
37
|
+
// Map a JS-char position to the index of the physical line that contains it.
|
|
38
|
+
// Returns -1 if the position is past the end of the content. A position that
|
|
39
|
+
// falls on a line terminator belongs to the line it terminates.
|
|
40
|
+
export function lineIndexOfChar(lines, charPos) {
|
|
41
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
42
|
+
if (charPos >= lines[i].charStart && charPos < lines[i].charEnd) {
|
|
43
|
+
return i;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return -1;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=physicalLines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physicalLines.js","sourceRoot":"","sources":["../../src/markers/physicalLines.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,4BAA4B;AAU5B,8EAA8E;AAC9E,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;QACf,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,OAAO,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACjE,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,0EAA0E;QAC1E,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,SAAS,GAAG,OAAO,CAAC;QACpB,GAAG,GAAG,OAAO,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,6EAA6E;AAC7E,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAAC,KAAkC,EAAE,OAAe;IACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAChE,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function computePolicyHash(policy: unknown): string;
|
|
2
|
+
export declare function computeVerificationPolicyHash(verificationPolicy: unknown): string;
|
|
3
|
+
export declare function computeApprovalPolicyHash(approvalPolicy: unknown): string;
|
|
4
|
+
//# sourceMappingURL=policyHash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyHash.d.ts","sourceRoot":"","sources":["../../src/markers/policyHash.ts"],"names":[],"mappings":"AAGA,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEzD;AAGD,wBAAgB,6BAA6B,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CAEjF;AAGD,wBAAgB,yBAAyB,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { canonicalJsonSha256 } from "./canonicalJson.js";
|
|
2
|
+
// Hash of an arbitrary policy object via canonical_json + sha256.
|
|
3
|
+
export function computePolicyHash(policy) {
|
|
4
|
+
return canonicalJsonSha256(policy);
|
|
5
|
+
}
|
|
6
|
+
// verification_policy_hash: hash of the row's verification_policy object.
|
|
7
|
+
export function computeVerificationPolicyHash(verificationPolicy) {
|
|
8
|
+
return computePolicyHash(verificationPolicy);
|
|
9
|
+
}
|
|
10
|
+
// approval_policy_hash: hash of the row's approval_policy object.
|
|
11
|
+
export function computeApprovalPolicyHash(approvalPolicy) {
|
|
12
|
+
return computePolicyHash(approvalPolicy);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=policyHash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyHash.js","sourceRoot":"","sources":["../../src/markers/policyHash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,6BAA6B,CAAC,kBAA2B;IACvE,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AAC/C,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,yBAAyB,CAAC,cAAuB;IAC/D,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type KeyObject } from "node:crypto";
|
|
2
|
+
export interface ProofSignatureBlock {
|
|
3
|
+
alg: "ed25519";
|
|
4
|
+
key_id: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export type PemOrKeyObject = string | KeyObject;
|
|
8
|
+
export type PublicKeyResolver = (keyId: string, createdAt?: string) => PemOrKeyObject | undefined;
|
|
9
|
+
export declare const SignatureFailureCode: Readonly<{
|
|
10
|
+
readonly SIGNATURE_MISSING: "SIGNATURE_MISSING";
|
|
11
|
+
readonly SIGNATURE_ALG_UNSUPPORTED: "SIGNATURE_ALG_UNSUPPORTED";
|
|
12
|
+
readonly UNKNOWN_KEY_ID: "UNKNOWN_KEY_ID";
|
|
13
|
+
readonly BAD_SIGNATURE: "BAD_SIGNATURE";
|
|
14
|
+
}>;
|
|
15
|
+
export type SignatureFailureCode = (typeof SignatureFailureCode)[keyof typeof SignatureFailureCode];
|
|
16
|
+
export type VerifyEventResult = {
|
|
17
|
+
ok: true;
|
|
18
|
+
key_id: string;
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
code: SignatureFailureCode;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function proofSigningPayload(event: Record<string, unknown>): string;
|
|
25
|
+
export declare function signEvent<T extends Record<string, unknown>>(eventWithoutSignature: T, privateKey: PemOrKeyObject, keyId: string): Omit<T, "signature"> & {
|
|
26
|
+
signature: ProofSignatureBlock;
|
|
27
|
+
};
|
|
28
|
+
export declare function verifyEvent(event: Record<string, unknown>, resolver: PublicKeyResolver): VerifyEventResult;
|
|
29
|
+
//# sourceMappingURL=proofSignature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofSignature.d.ts","sourceRoot":"","sources":["../../src/markers/proofSignature.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAI3D,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAShD,MAAM,MAAM,iBAAiB,GAAG,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,KACf,cAAc,GAAG,SAAS,CAAC;AAIhC,eAAO,MAAM,oBAAoB;;;;;EAKtB,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAC9B,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC;AAEnE,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAkB/D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE1E;AAOD,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,qBAAqB,EAAE,CAAC,EACxB,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,MAAM,GACZ,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,EAAE,mBAAmB,CAAA;CAAE,CAO3D;AAUD,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,iBAAiB,GAC1B,iBAAiB,CAsDnB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// ed25519 signing + verification for trusted-CI proof events (spec 5.2/5.3,
|
|
2
|
+
// amendment 3).
|
|
3
|
+
//
|
|
4
|
+
// The signing payload is `canonical_json(event without the signature field)`
|
|
5
|
+
// (spec 5.3). The private signing key exists only in trusted CI; the public
|
|
6
|
+
// verification key lives in the repo/config. ed25519 is used through node:crypto
|
|
7
|
+
// with a null algorithm: `crypto.sign(null, data, privateKey)` and
|
|
8
|
+
// `crypto.verify(null, data, publicKey, signature)`. Everything here is pure
|
|
9
|
+
// crypto over in-memory values; no filesystem or git access.
|
|
10
|
+
import { sign, verify } from "node:crypto";
|
|
11
|
+
import { canonicalJson } from "./canonicalJson.js";
|
|
12
|
+
// Stable reasons a signature can fail verification. These line up 1:1 with the
|
|
13
|
+
// signature-related EvidenceErrorCode values so the ledger can forward them.
|
|
14
|
+
export const SignatureFailureCode = Object.freeze({
|
|
15
|
+
SIGNATURE_MISSING: "SIGNATURE_MISSING",
|
|
16
|
+
SIGNATURE_ALG_UNSUPPORTED: "SIGNATURE_ALG_UNSUPPORTED",
|
|
17
|
+
UNKNOWN_KEY_ID: "UNKNOWN_KEY_ID",
|
|
18
|
+
BAD_SIGNATURE: "BAD_SIGNATURE"
|
|
19
|
+
});
|
|
20
|
+
// Drop the `signature` field (if any) from a shallow copy of an event.
|
|
21
|
+
function stripSignature(event) {
|
|
22
|
+
const rest = {};
|
|
23
|
+
for (const [key, value] of Object.entries(event)) {
|
|
24
|
+
if (key !== "signature") {
|
|
25
|
+
rest[key] = value;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return rest;
|
|
29
|
+
}
|
|
30
|
+
// The canonical signing payload: canonical_json(event without signature)
|
|
31
|
+
// (spec 5.3). Defensive: any embedded signature is removed before canonicalizing
|
|
32
|
+
// so signing and verifying always agree on the payload.
|
|
33
|
+
export function proofSigningPayload(event) {
|
|
34
|
+
return canonicalJson(stripSignature(event));
|
|
35
|
+
}
|
|
36
|
+
// Sign an unsigned proof event with an ed25519 private key, returning the event
|
|
37
|
+
// with its `signature` block attached. The caller passes the event WITHOUT a
|
|
38
|
+
// signature; any pre-existing signature field is ignored and replaced.
|
|
39
|
+
//
|
|
40
|
+
// node:crypto call: sign(null, data, privateKey) -> Buffer (ed25519).
|
|
41
|
+
export function signEvent(eventWithoutSignature, privateKey, keyId) {
|
|
42
|
+
const payload = proofSigningPayload(eventWithoutSignature);
|
|
43
|
+
const value = sign(null, Buffer.from(payload, "utf8"), privateKey).toString("base64");
|
|
44
|
+
return {
|
|
45
|
+
...stripSignature(eventWithoutSignature),
|
|
46
|
+
signature: { alg: "ed25519", key_id: keyId, value }
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Verify a proof event's ed25519 signature against the public key resolved from
|
|
50
|
+
// its key_id (spec 5.3). Returns ok, or a precise failure reason:
|
|
51
|
+
// SIGNATURE_MISSING - no signature block / missing fields (rule 1)
|
|
52
|
+
// SIGNATURE_ALG_UNSUPPORTED - alg is not "ed25519"
|
|
53
|
+
// UNKNOWN_KEY_ID - resolver has no key for key_id (rule 2)
|
|
54
|
+
// BAD_SIGNATURE - signature does not verify (rule 3)
|
|
55
|
+
//
|
|
56
|
+
// node:crypto call: verify(null, data, publicKey, signature) -> boolean.
|
|
57
|
+
export function verifyEvent(event, resolver) {
|
|
58
|
+
const signature = event.signature;
|
|
59
|
+
if (!signature ||
|
|
60
|
+
typeof signature !== "object" ||
|
|
61
|
+
typeof signature.key_id !== "string" ||
|
|
62
|
+
typeof signature.value !== "string") {
|
|
63
|
+
return {
|
|
64
|
+
ok: false,
|
|
65
|
+
code: SignatureFailureCode.SIGNATURE_MISSING,
|
|
66
|
+
message: "proof event has no usable signature block (unsigned events are invalid)"
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (signature.alg !== "ed25519") {
|
|
70
|
+
return {
|
|
71
|
+
ok: false,
|
|
72
|
+
code: SignatureFailureCode.SIGNATURE_ALG_UNSUPPORTED,
|
|
73
|
+
message: `unsupported signature alg: ${String(signature.alg)} (only ed25519 is allowed)`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Thread the event's created_at to the resolver so a keyring can enforce
|
|
77
|
+
// per-key validity windows / revocation against the moment of signing. A
|
|
78
|
+
// single-key resolver ignores this argument.
|
|
79
|
+
const createdAt = typeof event.created_at === "string" ? event.created_at : undefined;
|
|
80
|
+
const publicKey = resolver(signature.key_id, createdAt);
|
|
81
|
+
if (publicKey === undefined) {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
code: SignatureFailureCode.UNKNOWN_KEY_ID,
|
|
85
|
+
message: `unknown signature key_id: ${signature.key_id}`
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const payload = proofSigningPayload(event);
|
|
89
|
+
let verified = false;
|
|
90
|
+
try {
|
|
91
|
+
verified = verify(null, Buffer.from(payload, "utf8"), publicKey, Buffer.from(signature.value, "base64"));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// A malformed key or signature surfaces as a bad signature, not a throw.
|
|
95
|
+
verified = false;
|
|
96
|
+
}
|
|
97
|
+
if (!verified) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
code: SignatureFailureCode.BAD_SIGNATURE,
|
|
101
|
+
message: `signature for key_id ${signature.key_id} did not verify`
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return { ok: true, key_id: signature.key_id };
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=proofSignature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofSignature.js","sourceRoot":"","sources":["../../src/markers/proofSignature.ts"],"names":[],"mappings":"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"}
|