@warpgogol/werkstatt-shared 0.14.0 → 0.15.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 +31 -13
- package/README.uk.md +25 -15
- package/package.json +519 -762
- package/src/{share/agent → agent}/ard-catalog.ts +6 -1
- package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
- package/src/{share/agent → agent}/manifest.ts +15 -1
- package/src/{share/agent → agent}/search.ts +6 -1
- package/src/{share → agent}/tests/api-catalog.test.ts +2 -2
- package/src/{share → agent}/tests/ard-catalog.test.ts +2 -2
- package/src/{share → agent}/tests/capability.test.ts +1 -1
- package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
- package/src/{share → agent}/tests/knowledge.test.ts +2 -2
- package/src/{share → agent}/tests/manifest.test.ts +1 -1
- package/src/{share → agent}/tests/mcp-card.test.ts +2 -2
- package/src/agent/tests/omit-empty.test.ts +33 -0
- package/src/{share → agent}/tests/openapi.test.ts +2 -2
- package/src/{share → agent}/tests/proof.test.ts +1 -1
- package/src/{share → attribution}/material-credits.ts +4 -4
- package/src/{share → checks}/check-hints.ts +6 -1
- package/src/checks/index.ts +4 -1
- package/src/checks/lib/astro-site-url.ts +6 -1
- package/src/checks/lib/i18n.ts +14 -0
- package/src/checks/result-helpers.ts +22 -5
- package/src/checks/tests/remediation-auto-populate.test.ts +83 -0
- package/src/{share → client-scripts}/counter-utils.ts +6 -2
- package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
- package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
- package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
- package/src/client-scripts/index.ts +35 -0
- package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
- package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
- package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
- package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
- package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
- package/src/client-scripts/scroll-spy.ts +106 -0
- package/src/client-scripts/tests/external-link-qr.test.ts +8 -0
- package/src/client-scripts/tests/external-links.test.ts +25 -0
- package/src/client-scripts/tests/gsap-counter.test.ts +8 -0
- package/src/client-scripts/tests/gsap-mountain-journey.test.ts +8 -0
- package/src/client-scripts/tests/gsap-parallax.test.ts +8 -0
- package/src/client-scripts/tests/gsap-reveal.test.ts +8 -0
- package/src/client-scripts/tests/gsap-stagger.test.ts +8 -0
- package/src/client-scripts/tests/inline-number-animation.test.ts +8 -0
- package/src/client-scripts/tests/lenis.test.ts +8 -0
- package/src/client-scripts/tests/live-photos.test.ts +8 -0
- package/src/client-scripts/tests/lordicon.test.ts +8 -0
- package/src/client-scripts/tests/orchestrator.test.ts +47 -0
- package/src/client-scripts/tests/scheduler.test.ts +23 -0
- package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
- package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
- package/src/component/contracts.ts +206 -0
- package/src/component/index.ts +11 -0
- package/src/{share → content}/content-reference.ts +3 -3
- package/src/{share/content → content}/entity-id.ts +6 -3
- package/src/content/index.ts +3 -0
- package/src/{share/content → content}/merge.ts +6 -1
- package/src/content/system-manifest.test.ts +107 -0
- package/src/content/system-manifest.ts +12 -94
- package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
- package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
- package/src/content-discipline/index.ts +19 -0
- package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
- package/src/{share/env.d.ts → env.d.ts} +6 -3
- package/src/fingerprint/canonical-json.ts +731 -0
- package/src/fingerprint/index.ts +12 -0
- package/src/fingerprint/primitives.ts +72 -0
- package/src/{share/i18n → i18n}/localization.ts +6 -2
- package/src/integration/adapters.ts +10 -71
- package/src/integration/dispatch.ts +1 -1
- package/src/integration/funnel.ts +6 -1
- package/src/integration/index.ts +101 -4
- package/src/integration/lagebild-destination-adapter.ts +108 -0
- package/src/integration/lagebild-ingress.ts +7 -12
- package/src/integration/orchestration.ts +11 -10
- package/src/integration/tests/deliver-event.test.ts +1 -1
- package/src/integration/tests/dispatch.test.ts +4 -4
- package/src/integration/tests/hub-runtime.test.ts +22 -14
- package/src/integration/vitest.config.ts +8 -0
- package/src/kernel/desired-state.ts +227 -0
- package/src/kernel/diagnostic.ts +289 -0
- package/src/kernel/fs-atomic.ts +131 -0
- package/src/kernel/index.ts +15 -0
- package/src/kernel/tests/fs-atomic.test.ts +150 -0
- package/src/kernel/tests/workspace-io.test.ts +187 -0
- package/src/kernel/types.ts +459 -0
- package/src/kernel/workspace-io.ts +248 -0
- package/src/{share → knowledge}/tests/claim.test.ts +1 -1
- package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
- package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
- package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
- package/src/{share → knowledge}/tests/plan.test.ts +1 -1
- package/src/{share → knowledge}/tests/source.test.ts +1 -1
- package/src/legal/index.ts +15 -0
- package/src/{share/middleware → middleware}/access-protection.ts +8 -8
- package/src/{share → node}/dev-props-validator.ts +6 -1
- package/src/{share → node}/import-scan.ts +23 -3
- package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
- package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
- package/src/node/tests/derived-prices-loader.test.ts +59 -0
- package/src/node/tests/markdown-twin-provenance.test.ts +152 -0
- package/src/observability/env-resolver.ts +6 -1
- package/src/observability/index.ts +6 -1
- package/src/observability/otlp-converter.ts +6 -1
- package/src/observability/otlp-transport.ts +6 -1
- package/src/observability/pusher.ts +6 -1
- package/src/observability/redact.ts +6 -1
- package/src/observability/typed-refs.ts +6 -2
- package/src/observability/vitest.config.ts +1 -0
- package/src/{share → offers}/formula-eval.ts +3 -3
- package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
- package/src/onboarding/index.ts +1 -0
- package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
- package/src/ontology/archetype-registry.ts +6 -1
- package/src/ontology/archetypes/index.json +33 -1
- package/src/ontology/archetypes/index.yaml +27 -1
- package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
- package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
- package/src/ontology/biome-token-projection.ts +6 -1
- package/src/ontology/cosmic/index.ts +6 -1
- package/src/ontology/cosmic/moon-catalog.ts +6 -1
- package/src/ontology/cosmic/planet-catalog.ts +6 -1
- package/src/ontology/cosmic/star-catalog.ts +6 -1
- package/src/ontology/enums.ts +6 -1
- package/src/ontology/external-surfaces/index.ts +1 -1
- package/src/ontology/index.ts +6 -2
- package/src/ontology/manifest.ts +26 -4
- package/src/ontology/operations/artifact-store.ts +45 -0
- package/src/ontology/operations/dht.ts +98 -0
- package/src/ontology/operations/handoff.ts +92 -0
- package/src/ontology/operations/index.ts +187 -1
- package/src/ontology/operations/leitstand.ts +99 -0
- package/src/ontology/operations/materialization.ts +90 -0
- package/src/ontology/operations/mission.ts +111 -0
- package/src/ontology/operations/naming-policy.ts +132 -0
- package/src/ontology/operations/notausgang.ts +64 -0
- package/src/ontology/operations/release.ts +121 -0
- package/src/ontology/operations/sternsystem.ts +192 -0
- package/src/ontology/operations/werkstatt.ts +48 -0
- package/src/ontology/schemas/biome.ts +7 -2
- package/src/ontology/schemas/capability.ts +1 -1
- package/src/ontology/schemas/constellation.ts +6 -1
- package/src/ontology/schemas/index.ts +6 -2
- package/src/ontology/schemas/manifest-resolver.ts +6 -1
- package/src/ontology/schemas/page-entry.ts +9 -5
- package/src/ontology/schemas/system/growth.ts +6 -1
- package/src/ontology/schemas/system/manifest.ts +40 -1
- package/src/ontology/schemas/system/page-output.ts +7 -6
- package/src/ontology/schemas/system/tests/growth.test.ts +22 -0
- package/src/ontology/schemas/system/tests/integrations.test.ts +12 -0
- package/src/ontology/schemas/system/tests/manifest.test.ts +22 -0
- package/src/ontology/schemas/system/tests/page-output.test.ts +13 -0
- package/src/ontology/schemas/system/tests/release.test.ts +22 -0
- package/src/ontology/schemas/system/tests/text.test.ts +18 -0
- package/src/ontology/schemas/system/tests/verification.test.ts +12 -0
- package/src/ontology/schemas/system/text.ts +15 -0
- package/src/ontology/schemas/system.ts +6 -2
- package/src/ontology/schemas/tests/biome.test.ts +19 -0
- package/src/ontology/schemas/tests/capability.test.ts +22 -0
- package/src/ontology/schemas/tests/constellation.test.ts +22 -0
- package/src/ontology/schemas/tests/dns-records.test.ts +13 -0
- package/src/ontology/schemas/tests/manifest-resolver.test.ts +13 -0
- package/src/ontology/schemas/tests/page-entry.test.ts +22 -0
- package/src/ontology/schemas/tests/section-archetype.test.ts +12 -0
- package/src/ontology/schemas/tests/site-family.test.ts +18 -0
- package/src/ontology/schemas/tests/system.test.ts +20 -0
- package/src/ontology/shared-section-props/body-fragments.ts +2 -0
- package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
- package/src/ontology/vitest.config.ts +1 -0
- package/src/{share → page}/page.ts +13 -9
- package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
- package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
- package/src/passport/index.ts +6 -1
- package/src/passport/key-rotate.ts +10 -2
- package/src/passport/schema.ts +6 -1
- package/src/passport/sign.ts +8 -3
- package/src/passport/vitest.config.ts +1 -0
- package/src/pbt/index.test.ts +95 -0
- package/src/pbt/index.ts +251 -0
- package/src/plugin/plugin-contract.ts +1 -1
- package/src/{share → policy}/entitlement.ts +24 -4
- package/src/{share → policy}/feature-policy.ts +8 -3
- package/src/{share → policy}/visibility.ts +7 -2
- package/src/redirects/redirects.ts +117 -0
- package/src/{share → redirects/tests}/redirects.test.ts +1 -1
- package/src/remediation/remediation-catalog.ts +316 -0
- package/src/{share/routes → routes}/template-filter.ts +1 -1
- package/src/{share → runtime}/runtime-context.ts +7 -2
- package/src/{share → runtime}/shared-context.ts +1 -1
- package/src/{share/schemas → schemas}/claims.ts +2 -2
- package/src/{share/schemas → schemas}/effects.ts +6 -1
- package/src/{share/schemas → schemas}/features.ts +1 -1
- package/src/{share/schemas → schemas}/index.ts +3 -3
- package/src/{share/schemas → schemas}/navigation.ts +6 -1
- package/src/{share/schemas → schemas}/page-base.ts +6 -2
- package/src/{share/schemas → schemas}/person.ts +1 -1
- package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
- package/src/schemas/tests/claim-records.test.ts +52 -0
- package/src/schemas/tests/claims.test.ts +23 -0
- package/src/schemas/tests/effects.test.ts +116 -0
- package/src/schemas/tests/features.test.ts +61 -0
- package/src/schemas/tests/horizontal-align.test.ts +16 -0
- package/src/schemas/tests/icon-color.test.ts +16 -0
- package/src/schemas/tests/live-photo.test.ts +40 -0
- package/src/schemas/tests/material-credit.test.ts +51 -0
- package/src/schemas/tests/media.test.ts +26 -0
- package/src/schemas/tests/navigation.test.ts +58 -0
- package/src/schemas/tests/page-base.test.ts +19 -0
- package/src/schemas/tests/participant.test.ts +26 -0
- package/src/schemas/tests/person.test.ts +12 -0
- package/src/schemas/tests/print.test.ts +30 -0
- package/src/schemas/tests/section-background.test.ts +31 -0
- package/src/schemas/tests/section-body.test.ts +16 -0
- package/src/schemas/tests/section-cards.test.ts +17 -0
- package/src/schemas/tests/section-cta.test.ts +41 -0
- package/src/schemas/tests/section-header.test.ts +31 -0
- package/src/schemas/tests/section-image.test.ts +24 -0
- package/src/schemas/tests/section-motion.test.ts +29 -0
- package/src/schemas/tests/section-shell.test.ts +42 -0
- package/src/schemas/tests/section-stats.test.ts +17 -0
- package/src/schemas/tests/site-background.test.ts +33 -0
- package/src/schemas/tests/standard-list-item.test.ts +16 -0
- package/src/{share → sections}/rfc0042-utils.ts +1 -1
- package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
- package/src/{share/semantic → semantic}/business-projection.ts +95 -1
- package/src/semantic/canonical-uri.ts +54 -0
- package/src/{share/semantic → semantic}/extract.ts +100 -1
- package/src/semantic/fact-extraction.test.ts +47 -0
- package/src/semantic/fact-extraction.ts +46 -0
- package/src/semantic/freshness.ts +67 -0
- package/src/{share/semantic → semantic}/ids.ts +6 -1
- package/src/{share/semantic → semantic}/index.ts +9 -2
- package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
- package/src/semantic/jsonld/shared.ts +36 -0
- package/src/semantic/jsonld/tests/article.test.ts +89 -0
- package/src/semantic/jsonld/tests/breadcrumb.test.ts +62 -0
- package/src/semantic/jsonld/tests/collection-list.test.ts +39 -0
- package/src/semantic/jsonld/tests/faq.test.ts +60 -0
- package/src/semantic/jsonld/tests/initiative.test.ts +56 -0
- package/src/semantic/jsonld/tests/organization.test.ts +123 -0
- package/src/semantic/jsonld/tests/person.test.ts +89 -0
- package/src/semantic/jsonld/tests/service.test.ts +65 -0
- package/src/semantic/jsonld/tests/shared.test.ts +41 -0
- package/src/semantic/jsonld/tests/video.test.ts +84 -0
- package/src/semantic/jsonld/tests/webpage.test.ts +93 -0
- package/src/semantic/jsonld/tests/website.test.ts +27 -0
- package/src/semantic/jsonld/types.ts +24 -0
- package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
- package/src/semantic/jsonld/website.ts +32 -0
- package/src/{share/semantic → semantic}/jsonld.ts +6 -1
- package/src/{share/semantic → semantic}/llms.ts +41 -3
- package/src/{share/semantic → semantic}/models.ts +27 -38
- package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
- package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
- package/src/{share/semantic → semantic}/page-utils.ts +6 -3
- package/src/semantic/tests/ai.test.ts +55 -0
- package/src/semantic/tests/block-extraction.test.ts +34 -0
- package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
- package/src/semantic/tests/breadcrumbs.test.ts +127 -0
- package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
- package/src/semantic/tests/build-page.test.ts +122 -0
- package/src/semantic/tests/business-projection.test.ts +367 -0
- package/src/semantic/tests/canonical-uri.test.ts +56 -0
- package/src/semantic/tests/extract.test.ts +209 -0
- package/src/semantic/tests/feed.test.ts +113 -0
- package/src/semantic/tests/freshness.pbt.test.ts +108 -0
- package/src/semantic/tests/helpers.ts +32 -0
- package/src/semantic/tests/ids.test.ts +118 -0
- package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
- package/src/semantic/tests/image-sitemap.test.ts +109 -0
- package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
- package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
- package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
- package/src/semantic/tests/jsonld.test.ts +61 -0
- package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
- package/src/semantic/tests/llms-policy.test.ts +60 -0
- package/src/semantic/tests/llms.test.ts +164 -0
- package/src/semantic/tests/markdown-hygiene.test.ts +72 -0
- package/src/semantic/tests/markdown-page.test.ts +97 -0
- package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
- package/src/semantic/tests/organization-profile.test.ts +107 -0
- package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
- package/src/semantic/tests/output-projection.test.ts +77 -0
- package/src/semantic/tests/page-markdown.test.ts +98 -0
- package/src/semantic/tests/page-utils.test.ts +88 -0
- package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
- package/src/semantic/tests/price-marker-resolver.test.ts +90 -0
- package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
- package/src/semantic/tests/robots.test.ts +70 -0
- package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
- package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
- package/src/semantic/tests/update-stamp.test.ts +102 -0
- package/src/signing/index.ts +13 -0
- package/src/signing/key.ts +139 -0
- package/src/signing/sign.ts +66 -0
- package/src/signing/types.ts +29 -0
- package/src/{share/slug → slug}/slug-url.ts +4 -1
- package/src/stack/run-tool.ts +108 -0
- package/src/stack/stack-checks.ts +124 -0
- package/src/stack/tests/run-tool.test.ts +138 -0
- package/src/stack/tests/stack-checks.test.ts +141 -0
- package/src/stack/tests/walk-files.test.ts +131 -0
- package/src/stack/walk-files.ts +114 -0
- package/src/surface/blueprint.ts +342 -66
- package/src/surface/decision-composer.ts +6 -1
- package/src/surface/geo.ts +6 -1
- package/src/surface/index.ts +11 -7
- package/src/surface/types.ts +2 -2
- package/src/surface/vitest.config.ts +1 -0
- package/src/tests/signing-core.test.ts +129 -0
- package/src/{share → text}/css-value-normalize.ts +6 -1
- package/src/text/string-utils.ts +24 -0
- package/src/{share → text}/tests/text-normalize.test.ts +5 -0
- package/src/{share → text}/text-normalize.ts +4 -3
- package/src/{share → text}/wrap-inline-numbers.ts +1 -1
- package/src/types/axiom-study.d.ts +36 -0
- package/src/types/hls-js-light.d.ts +21 -0
- package/src/types/qrcode-browser.d.ts +23 -0
- package/src/typography/fix.pbt.test.ts +208 -0
- package/src/typography/fix.ts +148 -0
- package/src/typography/index.ts +54 -0
- package/src/typography/locale-defaults.ts +97 -0
- package/src/typography/rules-tier1.test.ts +459 -0
- package/src/typography/rules-tier1.ts +925 -0
- package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
- package/src/typography/rules-tier2-locale.test.ts +286 -0
- package/src/typography/rules-tier2-locale.ts +399 -0
- package/src/typography/rules-tier2-structure.test.ts +330 -0
- package/src/typography/rules-tier2-structure.ts +378 -0
- package/src/typography/rules-tier3-advisory.test.ts +290 -0
- package/src/typography/rules-tier3-advisory.ts +239 -0
- package/src/typography/text-surface.test.ts +244 -0
- package/src/typography/text-surface.ts +448 -0
- package/src/index.ts +0 -14
- package/src/integration/port-barrel.ts +0 -105
- package/src/share/content/index.ts +0 -16
- package/src/share/content-discipline/index.ts +0 -14
- package/src/share/index.ts +0 -86
- package/src/share/legal/index.ts +0 -1
- package/src/share/redirects.ts +0 -54
- package/src/share/scripts/index.ts +0 -26
- package/src/share/semantic/jsonld/shared.ts +0 -31
- package/src/share/semantic/jsonld/types.ts +0 -18
- package/src/share/semantic/jsonld/website.ts +0 -27
- package/src/share/string-utils.ts +0 -19
- package/src/share/types/axiom-study.d.ts +0 -22
- package/src/share/types/hls-js-light.d.ts +0 -16
- package/src/share/types/qrcode-browser.d.ts +0 -18
- package/src/share/utility-registry.yaml +0 -36
- package/src/share/vitest.config.ts +0 -8
- package/src/surface/blueprint-schema.ts +0 -314
- package/src/surface/blueprint-types.ts +0 -256
- /package/src/{share/agent → agent}/api-catalog.ts +0 -0
- /package/src/{share/agent → agent}/capability.ts +0 -0
- /package/src/{share/agent → agent}/dns-aid.ts +0 -0
- /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
- /package/src/{share/agent → agent}/index.ts +0 -0
- /package/src/{share/agent → agent}/knowledge.ts +0 -0
- /package/src/{share/agent → agent}/mcp-card.ts +0 -0
- /package/src/{share/agent → agent}/omit-empty.ts +0 -0
- /package/src/{share/agent → agent}/openapi.ts +0 -0
- /package/src/{share/agent → agent}/proof.ts +0 -0
- /package/src/{share/agent → agent}/search.test.ts +0 -0
- /package/src/{share → attribution}/attribution-display.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
- /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
- /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
- /package/src/{share/content → content}/resolve-field-path.ts +0 -0
- /package/src/{share/content → content}/substitute-deep.ts +0 -0
- /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
- /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
- /package/src/{share → image-provider}/image-provider.ts +0 -0
- /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
- /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
- /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
- /package/src/{share/knowledge → knowledge}/index.ts +0 -0
- /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
- /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
- /package/src/{share/knowledge → knowledge}/source.ts +0 -0
- /package/src/{share/legal → legal}/translation-policy.ts +0 -0
- /package/src/{share/middleware → middleware}/language-redirect.ts +0 -0
- /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
- /package/src/{share → node}/fs/index.ts +0 -0
- /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
- /package/src/{share → offers}/offer-capacity.ts +0 -0
- /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
- /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
- /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
- /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
- /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
- /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
- /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
- /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
- /package/src/{share/schemas → schemas}/media.ts +0 -0
- /package/src/{share/schemas → schemas}/participant.ts +0 -0
- /package/src/{share/schemas → schemas}/print.ts +0 -0
- /package/src/{share/schemas → schemas}/section-background.ts +0 -0
- /package/src/{share/schemas → schemas}/section-body.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
- /package/src/{share/schemas → schemas}/section-header.ts +0 -0
- /package/src/{share/schemas → schemas}/section-image.ts +0 -0
- /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
- /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
- /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
- /package/src/{share/schemas → schemas}/site-background.ts +0 -0
- /package/src/{share/semantic → semantic}/ai.ts +0 -0
- /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
- /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
- /package/src/{share/semantic → semantic}/build-page.ts +0 -0
- /package/src/{share/semantic → semantic}/feed.ts +0 -0
- /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
- /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
- /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
- /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
- /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
- /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
- /package/src/{share/semantic → semantic}/robots.ts +0 -0
- /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
- /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
- /package/src/{share/slug → slug}/index.ts +0 -0
- /package/src/{share/slug → slug}/slug-id.ts +0 -0
- /package/src/{share/slug → slug}/strategies.ts +0 -0
- /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
- /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
- /package/src/{share → text}/text-position.ts +0 -0
|
@@ -6,7 +6,36 @@
|
|
|
6
6
|
<CHANGE_SUMMARY><item>RFC-0950: initial video-player tests.</item></CHANGE_SUMMARY>
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { test, expect, vi, beforeEach, afterEach } from "vitest";
|
|
9
|
+
import { test, expect, vi, beforeEach, afterEach, type Mock } from "vitest";
|
|
10
|
+
|
|
11
|
+
// ── Mock types ──────────────────────────────────────────────────────────────
|
|
12
|
+
|
|
13
|
+
interface MockVideo {
|
|
14
|
+
dataset: Record<string, string>;
|
|
15
|
+
canPlayType: ReturnType<typeof vi.fn>;
|
|
16
|
+
play: ReturnType<typeof vi.fn>;
|
|
17
|
+
pause: ReturnType<typeof vi.fn>;
|
|
18
|
+
load: ReturnType<typeof vi.fn>;
|
|
19
|
+
insertBefore: ReturnType<typeof vi.fn>;
|
|
20
|
+
firstChild: null;
|
|
21
|
+
}
|
|
22
|
+
interface MockHlsInstance {
|
|
23
|
+
loadSource: ReturnType<typeof vi.fn>;
|
|
24
|
+
attachMedia: ReturnType<typeof vi.fn>;
|
|
25
|
+
destroy: ReturnType<typeof vi.fn>;
|
|
26
|
+
on: Mock<(event: string, cb: () => void) => void>;
|
|
27
|
+
}
|
|
28
|
+
interface MockEntry {
|
|
29
|
+
isIntersecting: boolean;
|
|
30
|
+
target: MockVideo;
|
|
31
|
+
}
|
|
32
|
+
interface MockObserver {
|
|
33
|
+
unobserve: () => void;
|
|
34
|
+
}
|
|
35
|
+
interface MockDocument {
|
|
36
|
+
querySelectorAll: ReturnType<typeof vi.fn>;
|
|
37
|
+
createElement: ReturnType<typeof vi.fn>;
|
|
38
|
+
}
|
|
10
39
|
|
|
11
40
|
// ── Mocks ───────────────────────────────────────────────────────────────────
|
|
12
41
|
|
|
@@ -15,7 +44,7 @@ vi.mock("plyr", () => ({
|
|
|
15
44
|
}));
|
|
16
45
|
|
|
17
46
|
vi.mock("hls.js/light", () => {
|
|
18
|
-
const hlsRef = { current: null as
|
|
47
|
+
const hlsRef = { current: null as MockHlsInstance | null };
|
|
19
48
|
const fn = vi.fn(function Hls() {
|
|
20
49
|
return hlsRef.current;
|
|
21
50
|
});
|
|
@@ -28,8 +57,8 @@ vi.mock("hls.js/light", () => {
|
|
|
28
57
|
|
|
29
58
|
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
30
59
|
|
|
31
|
-
function createMockVideo(attrs: Record<string, string | undefined> = {}):
|
|
32
|
-
const video:
|
|
60
|
+
function createMockVideo(attrs: Record<string, string | undefined> = {}): MockVideo {
|
|
61
|
+
const video: MockVideo = {
|
|
33
62
|
dataset: {},
|
|
34
63
|
canPlayType: vi.fn(() => ""),
|
|
35
64
|
play: vi.fn(() => Promise.resolve()),
|
|
@@ -44,23 +73,15 @@ function createMockVideo(attrs: Record<string, string | undefined> = {}): any {
|
|
|
44
73
|
return video;
|
|
45
74
|
}
|
|
46
75
|
|
|
47
|
-
let observerCallbacks: ((
|
|
48
|
-
entries: { isIntersecting: boolean; target: any }[],
|
|
49
|
-
obs: { unobserve: () => void },
|
|
50
|
-
) => void)[] = [];
|
|
76
|
+
let observerCallbacks: ((entries: MockEntry[], obs: MockObserver) => void)[] = [];
|
|
51
77
|
let observerOptions: { threshold?: number; rootMargin?: string }[] = [];
|
|
78
|
+
let mockDocument: MockDocument;
|
|
52
79
|
|
|
53
80
|
class MockIntersectionObserver {
|
|
54
|
-
callback: (
|
|
55
|
-
entries: { isIntersecting: boolean; target: any }[],
|
|
56
|
-
obs: { unobserve: () => void },
|
|
57
|
-
) => void;
|
|
81
|
+
callback: (entries: MockEntry[], obs: MockObserver) => void;
|
|
58
82
|
options: { threshold?: number; rootMargin?: string };
|
|
59
83
|
constructor(
|
|
60
|
-
cb: (
|
|
61
|
-
entries: { isIntersecting: boolean; target: any }[],
|
|
62
|
-
obs: { unobserve: () => void },
|
|
63
|
-
) => void,
|
|
84
|
+
cb: (entries: MockEntry[], obs: MockObserver) => void,
|
|
64
85
|
opts: { threshold?: number; rootMargin?: string },
|
|
65
86
|
) {
|
|
66
87
|
this.callback = cb;
|
|
@@ -79,24 +100,23 @@ beforeEach(() => {
|
|
|
79
100
|
vi.clearAllMocks();
|
|
80
101
|
observerCallbacks = [];
|
|
81
102
|
observerOptions = [];
|
|
82
|
-
|
|
83
|
-
(globalThis as any).window = globalThis;
|
|
84
|
-
(globalThis as any).document = {
|
|
103
|
+
mockDocument = {
|
|
85
104
|
querySelectorAll: vi.fn(() => []),
|
|
86
105
|
createElement: vi.fn((tag: string) => ({ tagName: tag.toUpperCase() })),
|
|
87
106
|
};
|
|
107
|
+
vi.stubGlobal("IntersectionObserver", MockIntersectionObserver);
|
|
108
|
+
vi.stubGlobal("window", globalThis);
|
|
109
|
+
vi.stubGlobal("document", mockDocument);
|
|
88
110
|
});
|
|
89
111
|
|
|
90
112
|
afterEach(() => {
|
|
91
|
-
|
|
92
|
-
delete (globalThis as any).window;
|
|
93
|
-
delete (globalThis as any).document;
|
|
113
|
+
vi.unstubAllGlobals();
|
|
94
114
|
vi.restoreAllMocks();
|
|
95
115
|
});
|
|
96
116
|
|
|
97
|
-
async function triggerUpgrade(video:
|
|
98
|
-
const { initVideoPlayers } = await import("../
|
|
99
|
-
|
|
117
|
+
async function triggerUpgrade(video: MockVideo): Promise<void> {
|
|
118
|
+
const { initVideoPlayers } = await import("../video-player.ts");
|
|
119
|
+
mockDocument.querySelectorAll.mockReturnValue([video]);
|
|
100
120
|
await initVideoPlayers();
|
|
101
121
|
|
|
102
122
|
expect(observerCallbacks.length).toBeGreaterThanOrEqual(1);
|
|
@@ -107,12 +127,10 @@ async function triggerUpgrade(video: any): Promise<void> {
|
|
|
107
127
|
// ── Tests ───────────────────────────────────────────────────────────────────
|
|
108
128
|
|
|
109
129
|
test("initVideoPlayers: returns early when no [data-video-player] elements", async () => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const { initVideoPlayers } = await import("../scripts/video-player.ts");
|
|
130
|
+
mockDocument.querySelectorAll.mockReturnValue([]);
|
|
131
|
+
const { initVideoPlayers } = await import("../video-player.ts");
|
|
113
132
|
await initVideoPlayers();
|
|
114
133
|
expect(observerCallbacks.length).toBe(0);
|
|
115
|
-
querySelectorAll.mockRestore();
|
|
116
134
|
});
|
|
117
135
|
|
|
118
136
|
test("upgrade: data-controls='false' configures Plyr with only ['mute']", async () => {
|
|
@@ -165,7 +183,9 @@ test("upgrade: data-autoplay='true' with HLS waits for MEDIA_ATTACHED before pla
|
|
|
165
183
|
destroy: vi.fn(),
|
|
166
184
|
on: vi.fn(),
|
|
167
185
|
};
|
|
168
|
-
const Hls = (await import("hls.js/light")).default as
|
|
186
|
+
const Hls = (await import("hls.js/light")).default as unknown as {
|
|
187
|
+
_hlsRef: { current: MockHlsInstance | null };
|
|
188
|
+
};
|
|
169
189
|
Hls._hlsRef.current = hlsInstance;
|
|
170
190
|
|
|
171
191
|
await triggerUpgrade(video);
|
|
@@ -173,7 +193,7 @@ test("upgrade: data-autoplay='true' with HLS waits for MEDIA_ATTACHED before pla
|
|
|
173
193
|
expect(Hls).toHaveBeenCalled();
|
|
174
194
|
expect(hlsInstance.attachMedia).toHaveBeenCalledWith(video);
|
|
175
195
|
|
|
176
|
-
const attachedCall = hlsInstance.on.mock.calls.find((c
|
|
196
|
+
const attachedCall = hlsInstance.on.mock.calls.find((c) => c[0] === "hls.MEDIA_ATTACHED");
|
|
177
197
|
expect(attachedCall, "Hls must register a MEDIA_ATTACHED listener before play()").toBeDefined();
|
|
178
198
|
attachedCall![1]();
|
|
179
199
|
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>component contracts — component identity and declaration contract type definitions.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not implement components — this module defines the contract.</item>
|
|
6
|
+
</non-goals>
|
|
7
|
+
</MODULE_CONTRACT>
|
|
8
|
+
<CHANGE_SUMMARY>
|
|
9
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
10
|
+
|
|
11
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
12
|
+
</CHANGE_SUMMARY>
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { Sha256Digest } from "../fingerprint/primitives.ts";
|
|
16
|
+
|
|
17
|
+
export type ComponentId = `${string}/${string}`;
|
|
18
|
+
export type CapabilityId = `${string}/${string}`;
|
|
19
|
+
|
|
20
|
+
export type EffectClass =
|
|
21
|
+
"revertible" | "transactional" | "compensatable" | "irreversible-emission";
|
|
22
|
+
|
|
23
|
+
export type IsolationTier = 0 | 1 | 2 | 3;
|
|
24
|
+
|
|
25
|
+
export type GrantScope = "read" | "append" | "deploy" | "certify" | "administer";
|
|
26
|
+
|
|
27
|
+
export type ResourceKind = "cpu" | "memory" | "disk" | "network" | "timer" | "subprocess";
|
|
28
|
+
|
|
29
|
+
export type LifecycleScope = "process" | "request" | "session" | "scheduled";
|
|
30
|
+
|
|
31
|
+
export type ComponentScope =
|
|
32
|
+
"per-command" | "per-mission" | "per-session" | "per-workshop" | "per-fleet";
|
|
33
|
+
|
|
34
|
+
export interface ScopeContext {
|
|
35
|
+
readonly scope: ComponentScope;
|
|
36
|
+
readonly missionId?: string;
|
|
37
|
+
readonly sessionId?: string;
|
|
38
|
+
readonly fleetId?: string;
|
|
39
|
+
readonly invocationId?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ScopedRegistry {
|
|
43
|
+
readonly context: ScopeContext;
|
|
44
|
+
register(manifest: ComponentDeclaration): void;
|
|
45
|
+
resolve(capabilityId: CapabilityId): ComponentDeclaration | null;
|
|
46
|
+
dispose(): void;
|
|
47
|
+
list(): ReadonlyArray<ComponentDeclaration>;
|
|
48
|
+
getScope(): ComponentScope;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ScopeManager {
|
|
52
|
+
getRegistry(context: ScopeContext): ScopedRegistry;
|
|
53
|
+
disposeRegistry(context: ScopeContext): void;
|
|
54
|
+
resolveAcrossScopes(
|
|
55
|
+
capabilityId: CapabilityId,
|
|
56
|
+
context: ScopeContext,
|
|
57
|
+
): ComponentDeclaration | null;
|
|
58
|
+
inspect(): ReadonlyArray<{
|
|
59
|
+
context: ScopeContext;
|
|
60
|
+
componentCount: number;
|
|
61
|
+
componentIds: ComponentId[];
|
|
62
|
+
}>;
|
|
63
|
+
adopt(componentId: ComponentId, targetContext: ScopeContext): void;
|
|
64
|
+
getScope(componentId: ComponentId): ComponentScope | null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export const SCOPE_ERROR_CODES = {
|
|
68
|
+
SCOPE_01: "SCOPE-01",
|
|
69
|
+
SCOPE_02: "SCOPE-02",
|
|
70
|
+
SCOPE_03: "SCOPE-03",
|
|
71
|
+
SCOPE_04: "SCOPE-04",
|
|
72
|
+
SCOPE_05: "SCOPE-05",
|
|
73
|
+
} as const;
|
|
74
|
+
|
|
75
|
+
export interface CapabilityProvideV1 {
|
|
76
|
+
capability: CapabilityId;
|
|
77
|
+
version: string;
|
|
78
|
+
schemaHash: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface CapabilityRequireV1 {
|
|
82
|
+
capability: CapabilityId;
|
|
83
|
+
compatibility: string;
|
|
84
|
+
schemaHash: string | null;
|
|
85
|
+
optional: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface GrantRequestV1 {
|
|
89
|
+
scope: GrantScope;
|
|
90
|
+
resource: string;
|
|
91
|
+
attenuated: boolean;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface EffectDeclarationV1 {
|
|
95
|
+
effectClass: EffectClass;
|
|
96
|
+
description: string;
|
|
97
|
+
recoveryCommand: string | null;
|
|
98
|
+
commitMetadata: string | null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** RFC-1037: Probe type for compensation verification. */
|
|
102
|
+
export type CompensationProbeType =
|
|
103
|
+
"dns-resolved" | "http-status" | "cdn-cleared" | "mirror-synced" | "custom";
|
|
104
|
+
|
|
105
|
+
/** RFC-1037: A single verification probe that checks equivalence after compensation. */
|
|
106
|
+
export interface CompensationProbe {
|
|
107
|
+
readonly type: CompensationProbeType;
|
|
108
|
+
readonly target: string;
|
|
109
|
+
readonly expected: string;
|
|
110
|
+
readonly timeoutMs: number;
|
|
111
|
+
readonly customVerifyCommand?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** RFC-1037: The compensating action with verification probes. */
|
|
115
|
+
export interface CompensationAction {
|
|
116
|
+
readonly compensatingOperation: string;
|
|
117
|
+
readonly verificationProbes: readonly CompensationProbe[];
|
|
118
|
+
readonly verificationTimeoutMs: number;
|
|
119
|
+
readonly failureMode: "blocking" | "non-blocking";
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** RFC-1037: Result of a single probe execution. */
|
|
123
|
+
export interface ProbeResult {
|
|
124
|
+
readonly probe: CompensationProbe;
|
|
125
|
+
readonly passed: boolean;
|
|
126
|
+
readonly actualValue?: string;
|
|
127
|
+
readonly latencyMs: number;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** RFC-1037: Result of compensation verification. */
|
|
131
|
+
export interface CompensationResult {
|
|
132
|
+
readonly operationHash: Sha256Digest;
|
|
133
|
+
readonly compensationHash: Sha256Digest;
|
|
134
|
+
readonly verified: boolean;
|
|
135
|
+
readonly probeResults: readonly ProbeResult[];
|
|
136
|
+
readonly verifiedAt: string;
|
|
137
|
+
readonly failureReason?: string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** RFC-1037: Extension of EffectDeclarationV1 with compensation verification contracts. */
|
|
141
|
+
export interface EffectDeclarationExt extends EffectDeclarationV1 {
|
|
142
|
+
readonly compensation?: CompensationAction;
|
|
143
|
+
readonly commitBoundary?: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface IsolationRequirementV1 {
|
|
147
|
+
tier: IsolationTier;
|
|
148
|
+
adapterId: string | null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface ResourceBoundV1 {
|
|
152
|
+
kind: ResourceKind;
|
|
153
|
+
limit: string;
|
|
154
|
+
owner: ComponentId;
|
|
155
|
+
lifecycle: LifecycleScope;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export interface ComponentDeclaration {
|
|
159
|
+
schema: "werkstatt/component-declaration@1";
|
|
160
|
+
/** Stable component ID — survives reconfiguration without losing identity. */
|
|
161
|
+
componentId: ComponentId;
|
|
162
|
+
version: string;
|
|
163
|
+
artifactHash: Sha256Digest;
|
|
164
|
+
scope: ComponentScope;
|
|
165
|
+
provides: CapabilityProvideV1[];
|
|
166
|
+
requires: CapabilityRequireV1[];
|
|
167
|
+
requestedGrants: GrantRequestV1[];
|
|
168
|
+
effects: EffectDeclarationV1[];
|
|
169
|
+
isolation: IsolationRequirementV1;
|
|
170
|
+
resources: ResourceBoundV1[];
|
|
171
|
+
/** Configuration overrides for this component instance. */
|
|
172
|
+
config?: Record<string, unknown>;
|
|
173
|
+
/** Priority — higher priority components override lower for the same capability. */
|
|
174
|
+
priority: number;
|
|
175
|
+
/** Whether this component is desired to be active. */
|
|
176
|
+
active: boolean;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export interface ResolvedComponentIdentityV1 {
|
|
180
|
+
componentId: ComponentId;
|
|
181
|
+
version: string;
|
|
182
|
+
artifactHash: string;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export interface ResolvedComponentSetV1 {
|
|
186
|
+
schema: "werkstatt/resolved-component-set@1";
|
|
187
|
+
profileId: string;
|
|
188
|
+
components: ResolvedComponentIdentityV1[];
|
|
189
|
+
dependencyGraphHash: string;
|
|
190
|
+
grantSetHash: string;
|
|
191
|
+
effectPolicyHash: string;
|
|
192
|
+
isolationPolicyHash: string;
|
|
193
|
+
setHash: string;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export interface ComponentContractViolation {
|
|
197
|
+
rule: string;
|
|
198
|
+
path: string;
|
|
199
|
+
message: string;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export interface ComponentContractResult<T> {
|
|
203
|
+
status: "pass" | "fail";
|
|
204
|
+
data: T | null;
|
|
205
|
+
violations: ComponentContractViolation[];
|
|
206
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Barrel export for @warpgogol/werkstatt-shared/component sub-path. Re-exports component contract types (ComponentId, CapabilityId, EffectClass, IsolationTier, ComponentDeclaration) sunk from @warpgogol/werkstatt-engine per RFC-1104.</purpose>
|
|
4
|
+
<non-goals>Does not re-export engine component-runtime modules (identity, schemas, runtime registry).</non-goals>
|
|
5
|
+
</MODULE_CONTRACT>
|
|
6
|
+
<CHANGE_SUMMARY>
|
|
7
|
+
<item>RFC-1104: initial barrel — component contracts sunk from werkstatt-engine.</item>
|
|
8
|
+
</CHANGE_SUMMARY>
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export * from "./contracts.ts";
|
|
@@ -23,9 +23,9 @@ and resolves braceless collection.file.field references without astro:content (R
|
|
|
23
23
|
|
|
24
24
|
import { readFileSync } from "node:fs";
|
|
25
25
|
import { parse } from "yaml";
|
|
26
|
-
import { substituteRefsDeep } from "./
|
|
27
|
-
import { resolveFieldPath } from "./
|
|
28
|
-
import { scanFormulas, resolveFormula } from "
|
|
26
|
+
import { substituteRefsDeep } from "./substitute-deep.ts";
|
|
27
|
+
import { resolveFieldPath } from "./resolve-field-path.ts";
|
|
28
|
+
import { scanFormulas, resolveFormula } from "../offers/formula-eval.ts";
|
|
29
29
|
|
|
30
30
|
export interface ContentRefIndex {
|
|
31
31
|
version: 1;
|
|
@@ -10,9 +10,12 @@ language codes from them. Shared across all apps in apps/*; no app-specific impo
|
|
|
10
10
|
</non-goals>
|
|
11
11
|
</MODULE_CONTRACT>
|
|
12
12
|
<CHANGE_SUMMARY>
|
|
13
|
-
<item>
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
14
|
+
|
|
15
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
16
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
17
|
+
|
|
18
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
16
19
|
</CHANGE_SUMMARY>
|
|
17
20
|
*/
|
|
18
21
|
|
package/src/content/index.ts
CHANGED
|
@@ -13,6 +13,9 @@ markdown frontmatter utilities and system manifest loading (RFC-0868).</purpose>
|
|
|
13
13
|
|
|
14
14
|
export { parseMarkdownFrontmatter, stringifyMarkdownFrontmatter } from "./markdown-frontmatter.ts";
|
|
15
15
|
export type { ParsedFrontmatter } from "./markdown-frontmatter.ts";
|
|
16
|
+
export * from "./entity-id.ts";
|
|
17
|
+
export * from "./merge.ts";
|
|
18
|
+
export * from "./resolve-field-path.ts";
|
|
16
19
|
export {
|
|
17
20
|
loadSystemManifest,
|
|
18
21
|
loadSystemManifestSync,
|
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
9
|
<item>RFC-0133: backfilled MODULE_MAP and CHANGE_SUMMARY markers for compass.validate compliance.</item>
|
|
10
|
-
<item>
|
|
10
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
11
|
+
|
|
12
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
13
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
14
|
+
|
|
15
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
11
16
|
</CHANGE_SUMMARY>
|
|
12
17
|
*/
|
|
13
18
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Tests for loadSystemManifest / loadSystemManifestSync — RFC-1106: loaders execute systemManifestSchema.parse() at load time, so a valid manifest returns the schema-inferred type with defaults materialized and an invalid manifest throws ZodError.</purpose>
|
|
4
|
+
</MODULE_CONTRACT>
|
|
5
|
+
<CHANGE_SUMMARY>
|
|
6
|
+
<item>RFC-1106: created — pins the parse-at-load contract (AC-7).</item>
|
|
7
|
+
<item>RFC-1106: step 3 — sole SystemManifest definition, loaders parse()
|
|
8
|
+
|
|
9
|
+
Delete the hand-written SystemManifest interface; content/system-manifest.ts re-exports the schema-inferred type. Both loaders switch from 'as unknown as' to systemManifestSchema.parse() — the schema now executes at load. system.manifest.validate catches ZodError and maps issues into structured diagnostics; the post-load safeParse was dead code. Zero consumer breaks: all growth/release/tagline readers were already optional-safe. New adjacent test pins parse-at-load (AC-7).</item>
|
|
10
|
+
</CHANGE_SUMMARY>
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
14
|
+
import { mkdtemp, writeFile, rm } from "node:fs/promises";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { ZodError } from "zod";
|
|
18
|
+
import { loadSystemManifest, loadSystemManifestSync } from "./system-manifest.ts";
|
|
19
|
+
|
|
20
|
+
const VALID_SYSTEM_MD = `---
|
|
21
|
+
app: test-app
|
|
22
|
+
version: 1.0.0
|
|
23
|
+
identity:
|
|
24
|
+
systemStar: sirius
|
|
25
|
+
biome: urban
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Test system
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
const INVALID_SYSTEM_MD = `---
|
|
32
|
+
app: INVALID APP
|
|
33
|
+
version: not-semver
|
|
34
|
+
identity:
|
|
35
|
+
systemStar: sirius
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# Invalid system
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
describe("loadSystemManifest", () => {
|
|
42
|
+
let contentDir: string;
|
|
43
|
+
|
|
44
|
+
beforeEach(async () => {
|
|
45
|
+
contentDir = await mkdtemp(join(tmpdir(), "system-manifest-"));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
afterEach(async () => {
|
|
49
|
+
await rm(contentDir, { recursive: true, force: true });
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("parses a valid manifest and materializes schema defaults", async () => {
|
|
53
|
+
await writeFile(join(contentDir, "system.md"), VALID_SYSTEM_MD);
|
|
54
|
+
|
|
55
|
+
const result = await loadSystemManifest(contentDir);
|
|
56
|
+
|
|
57
|
+
expect(result.manifest.app).toBe("test-app");
|
|
58
|
+
expect(result.manifest.identity.systemStar).toBe("sirius");
|
|
59
|
+
// .default([]) materialized by parse — absent in source, present in output
|
|
60
|
+
expect(result.manifest.pages).toEqual([]);
|
|
61
|
+
expect(result.manifest.constellations).toEqual([]);
|
|
62
|
+
expect(result.manifest.clientEditable).toEqual([]);
|
|
63
|
+
expect(result.manifest.retiredRoutes).toEqual([]);
|
|
64
|
+
// optional fields stay absent
|
|
65
|
+
expect(result.manifest.growth).toBeUndefined();
|
|
66
|
+
expect(result.manifest.release).toBeUndefined();
|
|
67
|
+
expect(result.manifest.identity.tagline).toBeUndefined();
|
|
68
|
+
expect(result.source).toBe("system.md");
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("throws ZodError on an invalid manifest", async () => {
|
|
72
|
+
await writeFile(join(contentDir, "system.md"), INVALID_SYSTEM_MD);
|
|
73
|
+
|
|
74
|
+
await expect(loadSystemManifest(contentDir)).rejects.toBeInstanceOf(ZodError);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("throws when system.md does not exist", async () => {
|
|
78
|
+
await expect(loadSystemManifest(contentDir)).rejects.toThrow();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe("loadSystemManifestSync", () => {
|
|
83
|
+
let contentDir: string;
|
|
84
|
+
|
|
85
|
+
beforeEach(async () => {
|
|
86
|
+
contentDir = await mkdtemp(join(tmpdir(), "system-manifest-sync-"));
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
afterEach(async () => {
|
|
90
|
+
await rm(contentDir, { recursive: true, force: true });
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("parses a valid manifest synchronously", async () => {
|
|
94
|
+
await writeFile(join(contentDir, "system.md"), VALID_SYSTEM_MD);
|
|
95
|
+
|
|
96
|
+
const result = loadSystemManifestSync(contentDir);
|
|
97
|
+
|
|
98
|
+
expect(result.manifest.app).toBe("test-app");
|
|
99
|
+
expect(result.manifest.pages).toEqual([]);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("throws ZodError on an invalid manifest", async () => {
|
|
103
|
+
await writeFile(join(contentDir, "system.md"), INVALID_SYSTEM_MD);
|
|
104
|
+
|
|
105
|
+
expect(() => loadSystemManifestSync(contentDir)).toThrow(ZodError);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
@@ -10,6 +10,9 @@ Stack-agnostic utility used by both engine and site plugin (RFC-0868).</purpose>
|
|
|
10
10
|
<CHANGE_SUMMARY>
|
|
11
11
|
<item>RFC-0868: extracted from werkstatt-site/src/content/system-manifest.ts.</item>
|
|
12
12
|
<item>RFC-0911: add seo?.anchorText?.extraStopPhrases for anchor-text stop-list extension.</item>
|
|
13
|
+
<item>RFC-1106: step 3 — sole SystemManifest definition, loaders parse()
|
|
14
|
+
|
|
15
|
+
Delete the hand-written SystemManifest interface; content/system-manifest.ts re-exports the schema-inferred type. Both loaders switch from 'as unknown as' to systemManifestSchema.parse() — the schema now executes at load. system.manifest.validate catches ZodError and maps issues into structured diagnostics; the post-load safeParse was dead code. Zero consumer breaks: all growth/release/tagline readers were already optional-safe. New adjacent test pins parse-at-load (AC-7).</item>
|
|
13
16
|
</CHANGE_SUMMARY>
|
|
14
17
|
*/
|
|
15
18
|
|
|
@@ -17,99 +20,14 @@ import { readFile, access } from "node:fs/promises";
|
|
|
17
20
|
import { readFileSync, accessSync } from "node:fs";
|
|
18
21
|
import { join } from "node:path";
|
|
19
22
|
import { parseMarkdownFrontmatter } from "./markdown-frontmatter.ts";
|
|
23
|
+
import { systemManifestSchema } from "../ontology/schemas/system/manifest.ts";
|
|
24
|
+
import type { SystemManifest } from "../ontology/schemas/system/manifest.ts";
|
|
20
25
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
biome: string;
|
|
27
|
-
tagline: string;
|
|
28
|
-
domain?: string;
|
|
29
|
-
/** RFC-0087: Per-app default CTA pageId for shared header and final-cta. */
|
|
30
|
-
ctaTarget?: string;
|
|
31
|
-
/** RFC-0096: Operator details consumed by legal.scaffold to fill Impressum / Datenschutz stubs. */
|
|
32
|
-
legal?: {
|
|
33
|
-
responsibleName?: string;
|
|
34
|
-
address?: string;
|
|
35
|
-
email?: string;
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
|
-
i18n?: {
|
|
39
|
-
default: string;
|
|
40
|
-
supported: Record<string, unknown>;
|
|
41
|
-
};
|
|
42
|
-
constellations: string[];
|
|
43
|
-
clientEditable: string[];
|
|
44
|
-
sharedContext?: {
|
|
45
|
-
requiredPageIds: string[];
|
|
46
|
-
};
|
|
47
|
-
pages: Array<{
|
|
48
|
-
pageId: string;
|
|
49
|
-
routes?: Record<string, string>;
|
|
50
|
-
route?: string;
|
|
51
|
-
/** RFC-0097: explicit locale opt-in; the page exists only in these locales. */
|
|
52
|
-
locales?: string[];
|
|
53
|
-
cosmicStar: string;
|
|
54
|
-
planets: Array<{
|
|
55
|
-
cosmicPlanet: string;
|
|
56
|
-
pin: string;
|
|
57
|
-
}>;
|
|
58
|
-
}>;
|
|
59
|
-
growth: {
|
|
60
|
-
vendor: {
|
|
61
|
-
adapter: string;
|
|
62
|
-
options: Record<string, unknown>;
|
|
63
|
-
};
|
|
64
|
-
funnels: unknown[];
|
|
65
|
-
experiments: unknown[];
|
|
66
|
-
};
|
|
67
|
-
release: {
|
|
68
|
-
passport: {
|
|
69
|
-
enabled: boolean;
|
|
70
|
-
indexable: boolean;
|
|
71
|
-
keyVersion: string;
|
|
72
|
-
heartbeatUrl: string;
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
/**
|
|
76
|
-
* RFC-0211 Content Knowledge Lifecycle policy. Mirrors the `knowledge` block in
|
|
77
|
-
* the ontology systemManifestSchema; declared here so the CKL kernel commands
|
|
78
|
-
* (content.freshness.validate RFC-0213, content.plan.build RFC-0216) read it
|
|
79
|
-
* with real types instead of structural casts.
|
|
80
|
-
*/
|
|
81
|
-
knowledge?: {
|
|
82
|
-
freshness?: {
|
|
83
|
-
soonWindowDays?: number;
|
|
84
|
-
critical?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
|
|
85
|
-
};
|
|
86
|
-
derivation?: {
|
|
87
|
-
critical?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
|
|
88
|
-
};
|
|
89
|
-
plan?: {
|
|
90
|
-
leadTimeDays?: number;
|
|
91
|
-
defaultOwner?: string;
|
|
92
|
-
criticalityMap?: Array<{ match: string; criticality: "advisory" | "important" | "blocking" }>;
|
|
93
|
-
};
|
|
94
|
-
};
|
|
95
|
-
/** RFC-0487: Business model declaration. Closed enum — currently only "b2b-only". */
|
|
96
|
-
businessModel?: "b2b-only";
|
|
97
|
-
/** RFC-0487/RFC-0509: Retired page routes — 410 Gone tombstones or 301 redirects. */
|
|
98
|
-
retiredRoutes?: Array<{ slug: string; status: 410 } | { slug: string; status: 301; to: string }>;
|
|
99
|
-
/** UI-level rendering toggles for split-list column order. */
|
|
100
|
-
ui?: {
|
|
101
|
-
responsibilityBlock?: {
|
|
102
|
-
swapOrder?: boolean;
|
|
103
|
-
};
|
|
104
|
-
};
|
|
105
|
-
/** RFC-0911: SEO validator configuration extension point. */
|
|
106
|
-
seo?: {
|
|
107
|
-
anchorText?: {
|
|
108
|
-
/** Added to the built-in de/uk stop-list. */
|
|
109
|
-
extraStopPhrases?: Record<string, string[]>;
|
|
110
|
-
};
|
|
111
|
-
};
|
|
112
|
-
}
|
|
26
|
+
// RFC-1106: systemManifestSchema is the sole SystemManifest definition.
|
|
27
|
+
// The inferred output type materializes .default()s (pages, constellations,
|
|
28
|
+
// clientEditable, retiredRoutes, planets stay non-optional) and keeps
|
|
29
|
+
// growth/release/tagline optional — the old interface lied about those.
|
|
30
|
+
export type { SystemManifest };
|
|
113
31
|
|
|
114
32
|
export interface SystemManifestLoadResult {
|
|
115
33
|
manifest: SystemManifest;
|
|
@@ -132,7 +50,7 @@ export async function loadSystemManifest(
|
|
|
132
50
|
const parsed = parseMarkdownFrontmatter(content);
|
|
133
51
|
|
|
134
52
|
return {
|
|
135
|
-
manifest: parsed.data
|
|
53
|
+
manifest: systemManifestSchema.parse(parsed.data),
|
|
136
54
|
source: "system.md",
|
|
137
55
|
filePath: systemMdPath,
|
|
138
56
|
};
|
|
@@ -151,7 +69,7 @@ export function loadSystemManifestSync(contentDirectory: string): SystemManifest
|
|
|
151
69
|
const parsed = parseMarkdownFrontmatter(content);
|
|
152
70
|
|
|
153
71
|
return {
|
|
154
|
-
manifest: parsed.data
|
|
72
|
+
manifest: systemManifestSchema.parse(parsed.data),
|
|
155
73
|
source: "system.md",
|
|
156
74
|
filePath: systemMdPath,
|
|
157
75
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { test, expect } from "vitest";
|
|
2
|
-
import { resolveFieldPath } from "../
|
|
2
|
+
import { resolveFieldPath } from "../resolve-field-path.ts";
|
|
3
3
|
|
|
4
4
|
test("resolveFieldPath resolves shallow field", () => {
|
|
5
5
|
const result = resolveFieldPath({ companyName: "Warpgogol" }, ["companyName"]);
|