@warpgogol/werkstatt-shared 0.14.1 → 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 +23 -15
- package/README.uk.md +1 -1
- package/package.json +517 -766
- 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/{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 +2 -2
- package/src/checks/tests/remediation-auto-populate.test.ts +1 -1
- 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/orchestrator.test.ts +47 -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 +1 -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/{share/semantic → node}/tests/derived-prices-loader.test.ts +14 -1
- package/src/{share/semantic → node}/tests/markdown-twin-provenance.test.ts +1 -1
- 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 +7 -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/text.ts +15 -0
- package/src/ontology/schemas/system.ts +6 -2
- 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/{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/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 +26 -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/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
- package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/business-projection.test.ts +179 -0
- package/src/semantic/tests/canonical-uri.test.ts +56 -0
- package/src/{share/semantic → semantic}/tests/extract.test.ts +83 -0
- package/src/semantic/tests/freshness.pbt.test.ts +108 -0
- package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
- 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/{share → semantic}/tests/llms-0789.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/llms.test.ts +46 -0
- package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
- package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
- package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
- package/src/{share/semantic → semantic}/tests/price-marker-resolver.test.ts +4 -2
- package/src/semantic/tests/project-claims.pbt.test.ts +60 -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/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/agent/tests/api-catalog.test.ts +0 -8
- package/src/share/agent/tests/ard-catalog.test.ts +0 -8
- package/src/share/agent/tests/capability.test.ts +0 -14
- package/src/share/agent/tests/fleet-catalog.test.ts +0 -15
- package/src/share/agent/tests/knowledge.test.ts +0 -20
- package/src/share/agent/tests/manifest.test.ts +0 -9
- package/src/share/agent/tests/mcp-card.test.ts +0 -8
- package/src/share/agent/tests/openapi.test.ts +0 -8
- package/src/share/agent/tests/proof.test.ts +0 -15
- 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/knowledge/tests/claim.test.ts +0 -11
- package/src/share/knowledge/tests/derivation.test.ts +0 -30
- package/src/share/knowledge/tests/freshness.test.ts +0 -18
- package/src/share/knowledge/tests/ledger.test.ts +0 -35
- package/src/share/knowledge/tests/plan.test.ts +0 -19
- package/src/share/knowledge/tests/source.test.ts +0 -19
- package/src/share/legal/index.ts +0 -1
- package/src/share/redirects.ts +0 -54
- package/src/share/remediation/remediation-catalog.ts +0 -196
- package/src/share/scripts/index.ts +0 -26
- package/src/share/scripts/tests/orchestrator.test.ts +0 -8
- package/src/share/semantic/jsonld/shared.ts +0 -31
- package/src/share/semantic/jsonld/types.ts +0 -19
- 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 -50
- 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/agent → agent}/tests/omit-empty.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}/tests/external-link-qr.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/external-links.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-counter.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-mountain-journey.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-parallax.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-reveal.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-stagger.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/inline-number-animation.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lenis.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/live-photos.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lordicon.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/scheduler.test.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/schemas → schemas}/tests/claim-records.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/claims.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/effects.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/features.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/horizontal-align.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/icon-color.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/live-photo.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/material-credit.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/media.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/navigation.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/page-base.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/participant.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/person.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/print.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-body.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cards.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cta.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-header.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-image.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-motion.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-shell.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-stats.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/site-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/standard-list-item.test.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/tests/article.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/breadcrumb.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/collection-list.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/faq.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/initiative.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/organization.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/person.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/service.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/shared.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/video.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/webpage.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/website.test.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}/tests/ai.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/block-extraction.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/breadcrumbs.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/build-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/feed.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/helpers.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/ids.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/image-sitemap.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/jsonld.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/llms-policy.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-hygiene.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/organization-profile.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/output-projection.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-markdown.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-utils.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/robots.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/update-stamp.test.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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>RFC-0357/RFC-0851: Zod schemas for release manifest (artifact-only prepared|ready), behavior snapshot wrapper, snapshot diff, and legacy release diagnostics.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not introduce app-specific runtime composition or deployment behavior into this reusable package source file.</item>
|
|
6
|
+
<item>Do not reintroduce legacy deployment states (published, dev-deployed, alt-deployed, promoted, main-deployed, rolled-back) into the artifact state schema.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-0357: initial release and behavior snapshot schemas.</item>
|
|
11
|
+
<item>RFC-0608: extend releaseStateSchema with alt-deployed and promoted; add buildIdentitySchema.</item>
|
|
12
|
+
<item>RFC-0627: add dev-deployed state (precedes alt-deployed in the three-channel deployment chain).</item>
|
|
13
|
+
<item>RFC-0628: remove dev-deployed state (workpiece-based dev deploy does not enter the release state machine).</item>
|
|
14
|
+
<item>RFC-0851: replace legacy state enum with artifact-only prepared|ready; make manifest strict; replace publishedAt with readyAt; add legacyReleaseStateSchema and legacyReleaseDiagnosticSchema.</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { STERNSYSTEM_ID_REGEX, MISSION_ID_REGEX, RELEASE_ID_REGEX } from "./naming-policy.ts";
|
|
20
|
+
import { releaseArtifactRefSchema as artifactRefSchema } from "./artifact-store.ts";
|
|
21
|
+
|
|
22
|
+
export const releaseArtifactStateSchema = z.enum(["prepared", "ready"]);
|
|
23
|
+
|
|
24
|
+
export const releaseStateSchema = releaseArtifactStateSchema;
|
|
25
|
+
|
|
26
|
+
export const legacyReleaseStateSchema = z.enum([
|
|
27
|
+
"published",
|
|
28
|
+
"dev-deployed",
|
|
29
|
+
"alt-deployed",
|
|
30
|
+
"promoted",
|
|
31
|
+
"main-deployed",
|
|
32
|
+
"rolled-back",
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
export const legacyReleaseDiagnosticSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
schema: z.literal("werkstatt/legacy-release-diagnostic@1"),
|
|
38
|
+
releaseId: z.string().regex(RELEASE_ID_REGEX),
|
|
39
|
+
legacyState: legacyReleaseStateSchema,
|
|
40
|
+
ruleId: z.literal("CERT-LEGACY-STATE-01"),
|
|
41
|
+
message: z.string().min(1),
|
|
42
|
+
fixHint: z.string().min(1),
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
45
|
+
|
|
46
|
+
export const releaseManifestSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
schemaVersion: z.string().min(1),
|
|
49
|
+
releaseId: z.string().regex(RELEASE_ID_REGEX),
|
|
50
|
+
systemId: z.string().regex(STERNSYSTEM_ID_REGEX),
|
|
51
|
+
missionId: z.string().regex(MISSION_ID_REGEX),
|
|
52
|
+
semver: z.string(),
|
|
53
|
+
platformVersion: z.string(),
|
|
54
|
+
createdAt: z.string().datetime(),
|
|
55
|
+
readyAt: z.string().datetime().nullable(),
|
|
56
|
+
state: releaseArtifactStateSchema,
|
|
57
|
+
commitSha: z.string(),
|
|
58
|
+
platformSemanticHash: z.string(),
|
|
59
|
+
siteContentHash: z.string(),
|
|
60
|
+
distTreeHash: z.string(),
|
|
61
|
+
distArtifactHash: z.string().nullable(),
|
|
62
|
+
artifact: artifactRefSchema.nullable(),
|
|
63
|
+
behaviorSnapshotHash: z.string(),
|
|
64
|
+
readableSnapshotHash: z.string(),
|
|
65
|
+
qualityReportHash: z.string().nullable(),
|
|
66
|
+
snapshotDiffVerdict: z.enum(["pass", "fail"]),
|
|
67
|
+
migratorVerdict: z.enum(["pass", "fail"]),
|
|
68
|
+
versionCompareVerdict: z.enum(["in-sync", "catch-up", "refuse-downgrade"]),
|
|
69
|
+
bootSmokeVerdict: z.enum(["pass", "fail"]),
|
|
70
|
+
})
|
|
71
|
+
.strict();
|
|
72
|
+
|
|
73
|
+
export const releaseArtifactRefSchema = z.object({
|
|
74
|
+
store: z.literal("werkstatt-local"),
|
|
75
|
+
algorithm: z.literal("sha256"),
|
|
76
|
+
digest: z.string(),
|
|
77
|
+
uri: z.string(),
|
|
78
|
+
manifestHash: z.string(),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
export const behaviorSnapshotDifferenceSchema = z.object({
|
|
82
|
+
field: z.string(),
|
|
83
|
+
kind: z.enum(["added", "removed", "changed"]),
|
|
84
|
+
detail: z.string(),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export const behaviorSnapshotDiffSchema = z.object({
|
|
88
|
+
schemaVersion: z.string().min(1),
|
|
89
|
+
baselineHash: z.string(),
|
|
90
|
+
candidateHash: z.string(),
|
|
91
|
+
verdict: z.enum(["pass", "fail"]),
|
|
92
|
+
differences: z.array(behaviorSnapshotDifferenceSchema),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export const buildIdentitySchema = z.object({
|
|
96
|
+
releaseId: z.string().regex(/^(workpiece-)?[a-z0-9]+(-[a-z0-9]+)*(-r\d{6}|-m\d{6})$/),
|
|
97
|
+
systemId: z.string().regex(STERNSYSTEM_ID_REGEX),
|
|
98
|
+
missionId: z.string().regex(MISSION_ID_REGEX),
|
|
99
|
+
semver: z.string(),
|
|
100
|
+
distTreeHash: z.string(),
|
|
101
|
+
behaviorSnapshotHash: z.string(),
|
|
102
|
+
siteContentHash: z.string(),
|
|
103
|
+
platformVersion: z.string(),
|
|
104
|
+
platformSemanticHash: z.string(),
|
|
105
|
+
commitSha: z.string(),
|
|
106
|
+
buildTimestamp: z.string().datetime(),
|
|
107
|
+
targetPlatform: z.string(),
|
|
108
|
+
// --- RFC-0931 signature fields (optional, added during signing phase) ---
|
|
109
|
+
signature: z.string().optional(),
|
|
110
|
+
publicKeyUrl: z.string().optional(),
|
|
111
|
+
signedAt: z.string().datetime().optional(),
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
export type ReleaseArtifactState = z.infer<typeof releaseArtifactStateSchema>;
|
|
115
|
+
export type ReleaseState = z.infer<typeof releaseStateSchema>;
|
|
116
|
+
export type LegacyReleaseState = z.infer<typeof legacyReleaseStateSchema>;
|
|
117
|
+
export type LegacyReleaseDiagnostic = z.infer<typeof legacyReleaseDiagnosticSchema>;
|
|
118
|
+
export type ReleaseManifest = z.infer<typeof releaseManifestSchema>;
|
|
119
|
+
export type BuildIdentity = z.infer<typeof buildIdentitySchema>;
|
|
120
|
+
export type BehaviorSnapshotDifference = z.infer<typeof behaviorSnapshotDifferenceSchema>;
|
|
121
|
+
export type BehaviorSnapshotDiff = z.infer<typeof behaviorSnapshotDiffSchema>;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
RFC-0354: Zod schemas for the Sternsystem bundle contract — the durable site unit,
|
|
5
|
+
fleet registry, and version pin. These schemas are the machine-checkable contract
|
|
6
|
+
for all Sternsystem operations.
|
|
7
|
+
RFC-0561: fleetRegistryEntrySchema gains optional owner field (did:web VC subject id).
|
|
8
|
+
RFC-0574: replace repo/mirror with parameterized mirrors[] array.
|
|
9
|
+
RFC-0752: add cloudflareZoneId to fleetRegistryEntrySchema, services[] with subdomains to fleetRegistrySchema.
|
|
10
|
+
RFC-0751: extend serviceEntrySchema with deployment fields (kind, url, publicEndpoints, routes, upstreams, lastDeployed, healthCheckPath).
|
|
11
|
+
RFC-0790: add systemConfigSchema, systemStateSchema, servicesRegistrySchema for convention-based discovery (replaces fleetRegistrySchema).
|
|
12
|
+
</purpose>
|
|
13
|
+
<non-goals>
|
|
14
|
+
<item>Do not perform file IO or git operations — pure shape only.</item>
|
|
15
|
+
<item>Do not define mission or release schemas — those live in subsequent RFCs.</item>
|
|
16
|
+
</non-goals>
|
|
17
|
+
</MODULE_CONTRACT>
|
|
18
|
+
<CHANGE_SUMMARY>
|
|
19
|
+
<item>RFC-0966: add passportRequired to systemStateSchema for passport enforcement gating.</item>
|
|
20
|
+
<item>RFC-0967: add ownershipRequired to systemStateSchema for ownership enforcement gating.</item>
|
|
21
|
+
<item>RFC-1065: add lagebild to systemStateSchema for Lagebild connection metadata.</item>
|
|
22
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
23
|
+
|
|
24
|
+
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>
|
|
25
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
26
|
+
|
|
27
|
+
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>
|
|
28
|
+
<history>RFC-0354, RFC-0479, RFC-0561, RFC-0574, RFC-0751, RFC-0752, RFC-0790, RFC-0806, RFC-0902, RFC-0964</history>
|
|
29
|
+
</CHANGE_SUMMARY>
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import { z } from "zod";
|
|
33
|
+
import { starNameSchema } from "@warpgogol/werkstatt-shared/ontology/cosmic";
|
|
34
|
+
import { deploymentStaticConfigSchema, lastPropagatedChannelSchema } from "./leitstand.ts";
|
|
35
|
+
|
|
36
|
+
const semverRe = /^\d+\.\d+\.\d+$/;
|
|
37
|
+
const sha256Re = /^sha256:[0-9a-f]{64}$/;
|
|
38
|
+
const kebabRe = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
39
|
+
const didWebRe = /^did:web:[a-z0-9.-]+#.+$/;
|
|
40
|
+
|
|
41
|
+
export const systemPinSchema = z.object({
|
|
42
|
+
schemaVersion: z.string().min(1),
|
|
43
|
+
systemId: z
|
|
44
|
+
.string()
|
|
45
|
+
.regex(kebabRe, "systemId must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
46
|
+
cosmicStar: starNameSchema,
|
|
47
|
+
pinnedAt: z.string().datetime(),
|
|
48
|
+
platform: z.object({
|
|
49
|
+
version: z.string().regex(semverRe, "platform.version must be x.y.z"),
|
|
50
|
+
commit: z.string().min(7),
|
|
51
|
+
rfcHead: z.string().regex(/^RFC-\d{4}$/, "rfcHead must be RFC-NNNN"),
|
|
52
|
+
platformSemanticHash: z
|
|
53
|
+
.string()
|
|
54
|
+
.regex(sha256Re, "platformSemanticHash must be sha256: prefixed hex"),
|
|
55
|
+
}),
|
|
56
|
+
migratorCursor: z.array(z.string()),
|
|
57
|
+
capabilities: z.array(
|
|
58
|
+
z.object({
|
|
59
|
+
semanticId: z.string().min(1),
|
|
60
|
+
version: z.string().min(1),
|
|
61
|
+
intent: z.array(z.string()),
|
|
62
|
+
}),
|
|
63
|
+
),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
export const mirrorStorageTypeSchema = z.enum(["non-bare", "bare", "bundle"]);
|
|
67
|
+
|
|
68
|
+
export type MirrorStorageType = z.infer<typeof mirrorStorageTypeSchema>;
|
|
69
|
+
|
|
70
|
+
export const mirrorEntrySchema = z.object({
|
|
71
|
+
path: z.string().min(1, "mirror path must be non-empty"),
|
|
72
|
+
storageType: mirrorStorageTypeSchema,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
export type MirrorEntry = z.infer<typeof mirrorEntrySchema>;
|
|
76
|
+
|
|
77
|
+
export const serviceSubdomainSchema = z.object({
|
|
78
|
+
domain: z.string().min(1, "subdomain domain must be non-empty"),
|
|
79
|
+
zone: z.string().min(1, "subdomain zone must be non-empty"),
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
export const serviceEntrySchema = z.object({
|
|
83
|
+
id: z
|
|
84
|
+
.string()
|
|
85
|
+
.regex(kebabRe, "service id must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
86
|
+
kind: z.enum(["proxy-worker", "scheduled-worker", "cloudflare-worker"]),
|
|
87
|
+
workerName: z.string().min(1, "workerName must be non-empty"),
|
|
88
|
+
hostedBy: z.enum(["studio"]),
|
|
89
|
+
url: z.string().min(1, "url must be non-empty"),
|
|
90
|
+
workersDevUrl: z.string().min(1, "workersDevUrl must be non-empty").optional(),
|
|
91
|
+
publicEndpoints: z.boolean().default(false),
|
|
92
|
+
routes: z.array(z.string()).optional(),
|
|
93
|
+
upstreams: z.array(z.string()).optional(),
|
|
94
|
+
subdomains: z.array(serviceSubdomainSchema).default([]),
|
|
95
|
+
lastDeployed: z
|
|
96
|
+
.object({
|
|
97
|
+
at: z.string().datetime().nullable(),
|
|
98
|
+
state: z.enum(["succeeded", "failed"]).nullable(),
|
|
99
|
+
operationId: z.string().nullable(),
|
|
100
|
+
})
|
|
101
|
+
.default({ at: null, state: null, operationId: null }),
|
|
102
|
+
lastDevDeployed: z
|
|
103
|
+
.object({
|
|
104
|
+
at: z.string().datetime().nullable(),
|
|
105
|
+
state: z.enum(["succeeded", "failed"]).nullable(),
|
|
106
|
+
operationId: z.string().nullable(),
|
|
107
|
+
})
|
|
108
|
+
.default({ at: null, state: null, operationId: null })
|
|
109
|
+
.describe("RFC-0806: last dev-channel deployment state"),
|
|
110
|
+
healthCheckPath: z.string().optional(),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// RFC-0790: Convention-based discovery schemas (replaces fleet registry)
|
|
114
|
+
|
|
115
|
+
export const systemConfigSchema = z.object({
|
|
116
|
+
schemaVersion: z.string().min(1),
|
|
117
|
+
id: z.string().regex(kebabRe, "id must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
118
|
+
cosmicStar: starNameSchema,
|
|
119
|
+
mirrors: z.array(mirrorEntrySchema).min(1, "mirrors must contain at least 1 entry"),
|
|
120
|
+
pinnedPlatform: z.string().regex(semverRe, "pinnedPlatform must be x.y.z"),
|
|
121
|
+
status: z.enum(["registered", "active", "paused", "archived"]),
|
|
122
|
+
registeredAt: z.string().datetime(),
|
|
123
|
+
deployment: deploymentStaticConfigSchema.optional(),
|
|
124
|
+
cloudflareZoneId: z
|
|
125
|
+
.string()
|
|
126
|
+
.min(1, "cloudflareZoneId must be non-empty")
|
|
127
|
+
.optional()
|
|
128
|
+
.describe("Cloudflare zone ID for DNS and Workers route management (RFC-0752)"),
|
|
129
|
+
owner: z
|
|
130
|
+
.string()
|
|
131
|
+
.regex(didWebRe, "owner must be a did:web identifier (did:web:<domain>#<key-version>)")
|
|
132
|
+
.optional()
|
|
133
|
+
.describe("VC subject id of the site owner (RFC-0558, RFC-0561)"),
|
|
134
|
+
notes: z.string().default(""),
|
|
135
|
+
fleet: z
|
|
136
|
+
.object({
|
|
137
|
+
canary: z.boolean().default(false),
|
|
138
|
+
})
|
|
139
|
+
.optional()
|
|
140
|
+
.describe("RFC-0964: fleet wave orchestration config"),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export const systemStateSchema = z.object({
|
|
144
|
+
schemaVersion: z.string().min(1),
|
|
145
|
+
systemId: z
|
|
146
|
+
.string()
|
|
147
|
+
.regex(kebabRe, "systemId must be kebab-case, lowercase, latin-only, no TLD suffix"),
|
|
148
|
+
currentMission: z.string().nullable().default(null),
|
|
149
|
+
lastRelease: z.string().nullable().default(null),
|
|
150
|
+
lastPropagated: z
|
|
151
|
+
.object({
|
|
152
|
+
dev: lastPropagatedChannelSchema.optional(),
|
|
153
|
+
alt: lastPropagatedChannelSchema.optional(),
|
|
154
|
+
main: lastPropagatedChannelSchema.optional(),
|
|
155
|
+
})
|
|
156
|
+
.default({}),
|
|
157
|
+
// RFC-0899: 4-digit PIN for dev/alt subdomain access protection. Null when not set.
|
|
158
|
+
accessPin: z
|
|
159
|
+
.string()
|
|
160
|
+
.regex(/^\d{4}$/, "accessPin must be a 4-digit numeric string")
|
|
161
|
+
.nullable()
|
|
162
|
+
.default(null),
|
|
163
|
+
// RFC-0966: Controls PASSPORT-01 warning vs blocking. false during rollout,
|
|
164
|
+
// set to true by sternsystem.passport.generate after first successful generation.
|
|
165
|
+
passportRequired: z.boolean().default(false),
|
|
166
|
+
// RFC-0967: Controls OWNERSHIP-01 warning vs blocking. false during rollout,
|
|
167
|
+
// set to true per-site when ready for blocking enforcement.
|
|
168
|
+
ownershipRequired: z.boolean().default(false),
|
|
169
|
+
// RFC-1065: Lagebild connection metadata. Undefined when not connected.
|
|
170
|
+
lagebild: z
|
|
171
|
+
.object({
|
|
172
|
+
connected: z.boolean(),
|
|
173
|
+
apiUrl: z.string(),
|
|
174
|
+
tenantId: z.string(),
|
|
175
|
+
sourceSystemId: z.string(),
|
|
176
|
+
connectedAt: z.string(),
|
|
177
|
+
channel: z.string(),
|
|
178
|
+
})
|
|
179
|
+
.optional(),
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
export const servicesRegistrySchema = z.object({
|
|
183
|
+
schemaVersion: z.string().min(1),
|
|
184
|
+
services: z.array(serviceEntrySchema),
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
export type SystemPin = z.infer<typeof systemPinSchema>;
|
|
188
|
+
export type ServiceSubdomain = z.infer<typeof serviceSubdomainSchema>;
|
|
189
|
+
export type ServiceEntry = z.infer<typeof serviceEntrySchema>;
|
|
190
|
+
export type SystemConfig = z.infer<typeof systemConfigSchema>;
|
|
191
|
+
export type SystemState = z.infer<typeof systemStateSchema>;
|
|
192
|
+
export type ServicesRegistry = z.infer<typeof servicesRegistrySchema>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
RFC-0362: Zod schemas for Werkstatt consistency primitives — lock files and
|
|
5
|
+
operation records. These schemas are the machine-checkable contract for all
|
|
6
|
+
Werkstatt lock and idempotency operations.
|
|
7
|
+
</purpose>
|
|
8
|
+
<non-goals>
|
|
9
|
+
<item>Do not perform file IO — pure shape only.</item>
|
|
10
|
+
<item>Do not define hash-chain Bordbuch format — that is RFC-0276/RFC-0355.</item>
|
|
11
|
+
</non-goals>
|
|
12
|
+
</MODULE_CONTRACT>
|
|
13
|
+
<CHANGE_SUMMARY>
|
|
14
|
+
<item>RFC-0362: initial Werkstatt schemas (WerkstattLock, WerkstattOperationRecord).</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
|
|
20
|
+
export const werkstattLockSchema = z.object({
|
|
21
|
+
schemaVersion: z.literal("1.0.0"),
|
|
22
|
+
scope: z.string().min(1),
|
|
23
|
+
operationId: z.string().min(1),
|
|
24
|
+
command: z.string().min(1),
|
|
25
|
+
owner: z.string().min(1),
|
|
26
|
+
pid: z.number().int(),
|
|
27
|
+
startedAt: z.string().datetime(),
|
|
28
|
+
heartbeatAt: z.string().datetime(),
|
|
29
|
+
timeoutSeconds: z.number().positive(),
|
|
30
|
+
depth: z.number().int().positive().optional(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const werkstattOperationRecordSchema = z.object({
|
|
34
|
+
schemaVersion: z.literal("1.0.0"),
|
|
35
|
+
operationId: z.string().min(1),
|
|
36
|
+
command: z.string().min(1),
|
|
37
|
+
scopes: z.array(z.string().min(1)),
|
|
38
|
+
state: z.enum(["started", "completed", "failed"]),
|
|
39
|
+
startedAt: z.string().datetime(),
|
|
40
|
+
completedAt: z.string().datetime().nullable(),
|
|
41
|
+
inputHash: z.string().min(1),
|
|
42
|
+
resultHash: z.string().nullable(),
|
|
43
|
+
artifacts: z.array(z.string()),
|
|
44
|
+
error: z.string().nullable(),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export type WerkstattLock = z.infer<typeof werkstattLockSchema>;
|
|
48
|
+
export type WerkstattOperationRecord = z.infer<typeof werkstattOperationRecordSchema>;
|
|
@@ -14,9 +14,14 @@ Applied via html[data-biome="<id>"] in the cascade layer stack.
|
|
|
14
14
|
</non-goals>
|
|
15
15
|
</MODULE_CONTRACT>
|
|
16
16
|
<CHANGE_SUMMARY>
|
|
17
|
-
<item>Wave 1 (RFC-0025): Initial creation.</item>
|
|
18
17
|
<item>RFC-0071: Replace narrow token overrides with the extended biome visual-DNA contract.</item>
|
|
19
18
|
<item>RFC-0371: Add optional <code>fonts</code> field for biome-driven Fontsource CSS imports.</item>
|
|
19
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
20
|
+
|
|
21
|
+
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>
|
|
22
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
23
|
+
|
|
24
|
+
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>
|
|
20
25
|
</CHANGE_SUMMARY>
|
|
21
26
|
*/
|
|
22
27
|
|
|
@@ -186,7 +191,7 @@ export const biomeConstraintsSchema = z
|
|
|
186
191
|
.strict();
|
|
187
192
|
|
|
188
193
|
// RFC-0114: site-background layer schema mirrored from
|
|
189
|
-
// @warpgogol/werkstatt-shared/
|
|
194
|
+
// @warpgogol/werkstatt-shared/schemas/site-background. Defined locally to avoid a
|
|
190
195
|
// cross-package import dependency (ontology must not depend on share).
|
|
191
196
|
const biomeSiteBackgroundLayerSchema = z.discriminatedUnion("kind", [
|
|
192
197
|
z
|
|
@@ -8,7 +8,7 @@ lossless projection to both OpenAPI (RFC-0289) and MCP tool schemas (RFC-0290).
|
|
|
8
8
|
</purpose>
|
|
9
9
|
<non-goals>
|
|
10
10
|
<item>Do not resolve entitlements or active-capability logic here — that is
|
|
11
|
-
@warpgogol/werkstatt-shared/
|
|
11
|
+
@warpgogol/werkstatt-shared/agent/capability.ts (resolveActiveCapabilities).</item>
|
|
12
12
|
<item>Do not widen the JSON-Schema subset beyond what OpenAPI + MCP both
|
|
13
13
|
accept verbatim — widening requires an RFC amending RFC-0288.</item>
|
|
14
14
|
</non-goals>
|
|
@@ -12,7 +12,12 @@ section archetypes that forms a proven page structure for a given intent
|
|
|
12
12
|
</non-goals>
|
|
13
13
|
</MODULE_CONTRACT>
|
|
14
14
|
<CHANGE_SUMMARY>
|
|
15
|
-
<item>
|
|
15
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
16
|
+
|
|
17
|
+
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>
|
|
18
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
19
|
+
|
|
20
|
+
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
21
|
</CHANGE_SUMMARY>
|
|
17
22
|
*/
|
|
18
23
|
|
|
@@ -9,10 +9,14 @@ Re-exports the Constellation, Biome, SiteFamily, and SystemManifest schemas and
|
|
|
9
9
|
</non-goals>
|
|
10
10
|
</MODULE_CONTRACT>
|
|
11
11
|
<CHANGE_SUMMARY>
|
|
12
|
-
<item>Wave 1 (RFC-0025): Initial creation.</item>
|
|
13
12
|
<item>RFC-0071: Re-export site-family contract and expanded biome surface.</item>
|
|
14
13
|
<item>RFC-0371: Re-export biome font entry schema and types.</item>
|
|
15
|
-
<item>
|
|
14
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
15
|
+
|
|
16
|
+
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>
|
|
17
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
18
|
+
|
|
19
|
+
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
20
|
</CHANGE_SUMMARY>
|
|
17
21
|
*/
|
|
18
22
|
|
|
@@ -11,8 +11,13 @@ filesystem I/O, YAML parsing, and fragment composition behind one interface.
|
|
|
11
11
|
</non-goals>
|
|
12
12
|
</MODULE_CONTRACT>
|
|
13
13
|
<CHANGE_SUMMARY>
|
|
14
|
-
<item>Architecture review 2026-07-10: extracted from page-entry.ts to separate declarative schemas from runtime I/O.</item>
|
|
15
14
|
<item>RFC-0484: suppress console.debug for directories without manifests — group directories are expected to have none.</item>
|
|
15
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
16
|
+
|
|
17
|
+
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>
|
|
18
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
19
|
+
|
|
20
|
+
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
21
|
</CHANGE_SUMMARY>
|
|
17
22
|
*/
|
|
18
23
|
|
|
@@ -6,14 +6,18 @@ Every page .md file under apps/<app>/src/content/pages/ must conform to PageEntr
|
|
|
6
6
|
Exports BlockEntrySchema and PageEntrySchema — pure declarative schemas, no I/O.
|
|
7
7
|
</purpose>
|
|
8
8
|
<non-goals>
|
|
9
|
-
<item>Do not implement the buildPage pipeline here — that lives in @warpgogol/werkstatt-shared/
|
|
9
|
+
<item>Do not implement the buildPage pipeline here — that lives in @warpgogol/werkstatt-shared/page.</item>
|
|
10
10
|
<item>Do not parse YAML here; callers provide parsed objects to schema.parse().</item>
|
|
11
11
|
<item>Do not validate cross-system.yaml references — that is page.block.validate's job.</item>
|
|
12
12
|
</non-goals>
|
|
13
13
|
</MODULE_CONTRACT>
|
|
14
14
|
<CHANGE_SUMMARY>
|
|
15
|
-
<item>
|
|
16
|
-
|
|
15
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
16
|
+
|
|
17
|
+
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>
|
|
18
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
19
|
+
|
|
20
|
+
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>
|
|
17
21
|
</CHANGE_SUMMARY>
|
|
18
22
|
*/
|
|
19
23
|
|
|
@@ -35,8 +39,8 @@ const PRINT_REGIONS = [
|
|
|
35
39
|
] as const;
|
|
36
40
|
|
|
37
41
|
// ---------------------------------------------------------------------------
|
|
38
|
-
// VisibilityExprSchema (re-declared here to avoid cross-package dep on @warpgogol/werkstatt-shared/
|
|
39
|
-
// page.block.validate uses the canonical one from @warpgogol/werkstatt-shared/
|
|
42
|
+
// VisibilityExprSchema (re-declared here to avoid cross-package dep on @warpgogol/werkstatt-shared/page)
|
|
43
|
+
// page.block.validate uses the canonical one from @warpgogol/werkstatt-shared/page;
|
|
40
44
|
// the schema here is for Astro content-collection integration.
|
|
41
45
|
// ---------------------------------------------------------------------------
|
|
42
46
|
|
|
@@ -8,7 +8,12 @@ Exports growthVendorSchema as the canonical vendor config shape, reused by @warp
|
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
10
|
<item>RFC-0303 Phase 3: extracted from schemas/system.ts as part of the domain split.</item>
|
|
11
|
-
<item>
|
|
11
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
12
|
+
|
|
13
|
+
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>
|
|
14
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
15
|
+
|
|
16
|
+
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
17
|
</CHANGE_SUMMARY>
|
|
13
18
|
*/
|
|
14
19
|
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
<item>RFC-0303 Phase 3: extracted from schemas/system.ts as part of the domain split.</item>
|
|
10
10
|
<item>RFC-0377: added optional `audience` field to the per-page pin schema.</item>
|
|
11
11
|
<item>ADR-0062: added `ctaTarget` to identity, `sectionNav` + `ctaTarget` to page pins, created `systemCollectionSchema` for content collection typing.</item>
|
|
12
|
+
<item>RFC-1106: step 2 — extend systemManifestSchema
|
|
13
|
+
|
|
14
|
+
Add identity.legal (RFC-0096) and seo.anchorText.extraStopPhrases (RFC-0911) to systemManifestSchema — the two interface-only fields with living consumers. No dead fields found: all other interface fields already exist in the schema.</item>
|
|
12
15
|
</CHANGE_SUMMARY>
|
|
13
16
|
*/
|
|
14
17
|
|
|
@@ -16,7 +19,7 @@ import { z } from "zod";
|
|
|
16
19
|
|
|
17
20
|
import { systemSharedContextSchema, systemGrowthSchema } from "./growth.ts";
|
|
18
21
|
import { systemReleaseSchema } from "./release.ts";
|
|
19
|
-
import { systemTextSchema } from "./text.ts";
|
|
22
|
+
import { systemTextSchema, systemTypographySchema } from "./text.ts";
|
|
20
23
|
import { systemIntegrationsSchema } from "./integrations.ts";
|
|
21
24
|
import { systemVerificationSchema } from "./verification.ts";
|
|
22
25
|
import { semanticPageTypeSchema, articleMetadataSchema, pageOutputSchema } from "./page-output.ts";
|
|
@@ -87,6 +90,18 @@ export const systemManifestSchema = z.object({
|
|
|
87
90
|
* Used by resolve-route.ts to populate `ctaTarget` in PageRouteData.
|
|
88
91
|
*/
|
|
89
92
|
ctaTarget: z.string().min(1).optional(),
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* RFC-0096: Operator details consumed by legal.scaffold to fill
|
|
96
|
+
* Impressum / Datenschutz stubs.
|
|
97
|
+
*/
|
|
98
|
+
legal: z
|
|
99
|
+
.object({
|
|
100
|
+
responsibleName: z.string().min(1).optional(),
|
|
101
|
+
address: z.string().min(1).optional(),
|
|
102
|
+
email: z.string().min(1).optional(),
|
|
103
|
+
})
|
|
104
|
+
.optional(),
|
|
90
105
|
}),
|
|
91
106
|
|
|
92
107
|
/**
|
|
@@ -294,6 +309,12 @@ export const systemManifestSchema = z.object({
|
|
|
294
309
|
*/
|
|
295
310
|
text: systemTextSchema.optional(),
|
|
296
311
|
|
|
312
|
+
/**
|
|
313
|
+
* RFC-1070: typography validator configuration. Allowed tokens and
|
|
314
|
+
* per-locale abbreviation overrides. Client-writable.
|
|
315
|
+
*/
|
|
316
|
+
typography: systemTypographySchema.optional(),
|
|
317
|
+
|
|
297
318
|
/**
|
|
298
319
|
* RFC-0169: subscription billing binding. `billing.stripeCustomerId` is the
|
|
299
320
|
* Stripe customer whose active Entitlements gate this site's paid modules.
|
|
@@ -494,6 +515,8 @@ export const systemManifestSchema = z.object({
|
|
|
494
515
|
* `responsibilityBlock.swapOrder` is true, the page handler swaps
|
|
495
516
|
* primaryItems/secondaryItems and labels.primary/labels.secondary at
|
|
496
517
|
* render time. Default false = render as authored in content.
|
|
518
|
+
* RFC-1087: `codeHighlightTheme` selects the Shiki theme for build-time
|
|
519
|
+
* syntax highlighting. Default "github-light" when absent.
|
|
497
520
|
*/
|
|
498
521
|
ui: z
|
|
499
522
|
.object({
|
|
@@ -502,6 +525,7 @@ export const systemManifestSchema = z.object({
|
|
|
502
525
|
swapOrder: z.boolean().optional().default(false),
|
|
503
526
|
})
|
|
504
527
|
.optional(),
|
|
528
|
+
codeHighlightTheme: z.string().min(1).optional(),
|
|
505
529
|
})
|
|
506
530
|
.optional(),
|
|
507
531
|
|
|
@@ -511,6 +535,21 @@ export const systemManifestSchema = z.object({
|
|
|
511
535
|
* When absent, search.verification.validate emits SEARCH-VERIFY-01.
|
|
512
536
|
*/
|
|
513
537
|
verification: systemVerificationSchema.optional(),
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* RFC-0911: SEO validator configuration extension point.
|
|
541
|
+
* Sites extend the built-in de/uk anchor-text stop-list via
|
|
542
|
+
* `seo.anchorText.extraStopPhrases` (lang → phrases).
|
|
543
|
+
*/
|
|
544
|
+
seo: z
|
|
545
|
+
.object({
|
|
546
|
+
anchorText: z
|
|
547
|
+
.object({
|
|
548
|
+
extraStopPhrases: z.record(z.string(), z.array(z.string())).optional(),
|
|
549
|
+
})
|
|
550
|
+
.optional(),
|
|
551
|
+
})
|
|
552
|
+
.optional(),
|
|
514
553
|
});
|
|
515
554
|
|
|
516
555
|
export type SystemManifest = z.infer<typeof systemManifestSchema>;
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
9
|
<item>RFC-0303 Phase 3: extracted from schemas/system.ts as part of the domain split.</item>
|
|
10
|
+
<item>RFC-1106: step 4 — single-source SemanticPageType
|
|
11
|
+
|
|
12
|
+
semanticPageTypeSchema (ontology/schemas/system/page-output.ts) is now the sole declaration of the closed DNA-19 vocabulary. semantic/models.ts derives the type via z.infer and SEMANTIC_PAGE_TYPES via schema.options — the hand-synced union/array and stale circular-dependency comments are deleted.</item>
|
|
10
13
|
</CHANGE_SUMMARY>
|
|
11
14
|
*/
|
|
12
15
|
|
|
@@ -15,13 +18,11 @@ import { z } from "zod";
|
|
|
15
18
|
/**
|
|
16
19
|
* RFC-0042/RFC-0050: the semantic role of a page. Drives semantic model
|
|
17
20
|
* construction and the default llms inclusion depth. Mirrors
|
|
18
|
-
* SemanticPageType in @warpgogol/werkstatt-shared/
|
|
21
|
+
* SemanticPageType in @warpgogol/werkstatt-shared/semantic.
|
|
19
22
|
*/
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
-
// compile-time contract. They are kept in sync manually to avoid a circular
|
|
24
|
-
// dependency between `ontology` and `share`.
|
|
23
|
+
// RFC-1106: this schema is the sole declaration of the SemanticPageType closed
|
|
24
|
+
// vocabulary (DNA-19). `semantic/models.ts` derives the type and the runtime
|
|
25
|
+
// array from it — do not declare a parallel union elsewhere.
|
|
25
26
|
export const semanticPageTypeSchema = z.enum([
|
|
26
27
|
"home",
|
|
27
28
|
"about",
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
9
|
<item>RFC-0303 Phase 3: extracted from schemas/system.ts as part of the domain split.</item>
|
|
10
|
+
<item>RFC-1070: added systemTypographySchema for typography validator configuration.</item>
|
|
10
11
|
</CHANGE_SUMMARY>
|
|
11
12
|
*/
|
|
12
13
|
|
|
@@ -49,6 +50,20 @@ export const systemTextNormalizeSchema = z
|
|
|
49
50
|
})
|
|
50
51
|
.strict();
|
|
51
52
|
|
|
53
|
+
/**
|
|
54
|
+
* The `typography` block in system.yaml (RFC-1070). Controls typography validator
|
|
55
|
+
* configuration: allowed tokens and per-locale abbreviation overrides.
|
|
56
|
+
* CLIENT-WRITABLE.
|
|
57
|
+
*/
|
|
58
|
+
export const systemTypographySchema = z
|
|
59
|
+
.object({
|
|
60
|
+
/** Additional allowed tokens exempt from TYPO-CASE-01 and TYPO-APOS rules. */
|
|
61
|
+
allowedTokens: z.array(z.string()).optional(),
|
|
62
|
+
/** Per-locale abbreviation overrides. Merged into built-in locale defaults. */
|
|
63
|
+
abbreviations: z.record(z.string(), z.array(z.string())).optional(),
|
|
64
|
+
})
|
|
65
|
+
.strict();
|
|
66
|
+
|
|
52
67
|
export const systemTextSchema = z
|
|
53
68
|
.object({
|
|
54
69
|
normalize: systemTextNormalizeSchema.optional(),
|