@warpgogol/werkstatt-shared 0.2.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/package.json +352 -0
- package/src/checks/index.ts +24 -0
- package/src/checks/lib/astro-site-url.ts +30 -0
- package/src/checks/lib/i18n.ts +30 -0
- package/src/checks/result-helpers.ts +102 -0
- package/src/checks/suppressions-config.ts +195 -0
- package/src/index.ts +14 -0
- package/src/integration/README.md +38 -0
- package/src/integration/adapters.ts +143 -0
- package/src/integration/crm-buffer.ts +491 -0
- package/src/integration/dispatch.ts +106 -0
- package/src/integration/funnel.ts +379 -0
- package/src/integration/index.ts +56 -0
- package/src/integration/lifecycle.ts +155 -0
- package/src/integration/orchestration.ts +439 -0
- package/src/integration/port-barrel.ts +124 -0
- package/src/integration/port.ts +143 -0
- package/src/integration/qstash.ts +134 -0
- package/src/integration/sharding.ts +133 -0
- package/src/integration/tests/deliver-event.test.ts +52 -0
- package/src/integration/tests/dispatch.test.ts +88 -0
- package/src/integration/tests/funnel-bridge.test.ts +46 -0
- package/src/integration/tests/hub-runtime.test.ts +128 -0
- package/src/integration/tests/lifecycle.test.ts +69 -0
- package/src/integration/tests/qstash.test.ts +83 -0
- package/src/integration/tests/sharding.test.ts +64 -0
- package/src/integration/vitest.config.ts +8 -0
- package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
- package/src/integration-adapter-supabase-crm/client.ts +605 -0
- package/src/integration-adapter-supabase-crm/index.ts +28 -0
- package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
- package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
- package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
- package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
- package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
- package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
- package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
- package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
- package/src/integration-adapter-supabase-crm/worker.ts +223 -0
- package/src/observability/conventions.ts +93 -0
- package/src/observability/env-resolver.ts +57 -0
- package/src/observability/index.ts +57 -0
- package/src/observability/metric-registry.ts +184 -0
- package/src/observability/otlp-converter.ts +125 -0
- package/src/observability/otlp-json.ts +135 -0
- package/src/observability/otlp-transport.ts +68 -0
- package/src/observability/pusher.ts +142 -0
- package/src/observability/redact.ts +27 -0
- package/src/observability/tests/conventions.test.ts +100 -0
- package/src/observability/tests/metric-registry.test.ts +117 -0
- package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
- package/src/observability/tests/otlp-converter.test.ts +157 -0
- package/src/observability/tests/otlp-json.test.ts +120 -0
- package/src/observability/tests/pusher.test.ts +75 -0
- package/src/observability/tests/redact.pbt.test.ts +71 -0
- package/src/observability/tests/redact.test.ts +37 -0
- package/src/observability/typed-refs.ts +137 -0
- package/src/observability/vitest.config.ts +8 -0
- package/src/ontology/analytics/matomo-binding.yaml +172 -0
- package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
- package/src/ontology/analytics/messkanon.yaml +151 -0
- package/src/ontology/archetype-registry.ts +61 -0
- package/src/ontology/archetypes/components/brand-label.yaml +19 -0
- package/src/ontology/archetypes/components/copyright.yaml +19 -0
- package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
- package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
- package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
- package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
- package/src/ontology/archetypes/components/layout.yaml +19 -0
- package/src/ontology/archetypes/components/live-photo.yaml +20 -0
- package/src/ontology/archetypes/components/material-credit.yaml +20 -0
- package/src/ontology/archetypes/components/media.yaml +21 -0
- package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
- package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
- package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
- package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
- package/src/ontology/archetypes/components/not-found.yaml +22 -0
- package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
- package/src/ontology/archetypes/components/passport-header.yaml +19 -0
- package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
- package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
- package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
- package/src/ontology/archetypes/components/person-profile.yaml +20 -0
- package/src/ontology/archetypes/components/pulsar.yaml +20 -0
- package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
- package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
- package/src/ontology/archetypes/components/social-meta.yaml +20 -0
- package/src/ontology/archetypes/components/structured-data.yaml +19 -0
- package/src/ontology/archetypes/index.json +1003 -0
- package/src/ontology/archetypes/index.yaml +821 -0
- package/src/ontology/archetypes/sections/approach.yaml +23 -0
- package/src/ontology/archetypes/sections/article-list.yaml +30 -0
- package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
- package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
- package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
- package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
- package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
- package/src/ontology/archetypes/sections/credits.yaml +29 -0
- package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
- package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
- package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
- package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
- package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
- package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
- package/src/ontology/archetypes/sections/hero.yaml +50 -0
- package/src/ontology/archetypes/sections/impact.yaml +23 -0
- package/src/ontology/archetypes/sections/markdown.yaml +43 -0
- package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
- package/src/ontology/archetypes/sections/navigation.yaml +20 -0
- package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
- package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
- package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
- package/src/ontology/archetypes/sections/people.yaml +48 -0
- package/src/ontology/archetypes/sections/price-card.yaml +50 -0
- package/src/ontology/archetypes/sections/problem.yaml +23 -0
- package/src/ontology/archetypes/sections/send-message.yaml +63 -0
- package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
- package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
- package/src/ontology/archetypes/sections/transparency.yaml +32 -0
- package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
- package/src/ontology/archetypes/sections/video-section.yaml +27 -0
- package/src/ontology/archetypes/sections/women.yaml +29 -0
- package/src/ontology/biome-token-projection.ts +229 -0
- package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
- package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
- package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
- package/src/ontology/blueprints/offer.yaml +39 -0
- package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
- package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
- package/src/ontology/blueprints/ratgeber.yaml +62 -0
- package/src/ontology/blueprints/website-local.yaml +309 -0
- package/src/ontology/blueprints/website-service.yaml +84 -0
- package/src/ontology/capabilities/lead.submit.yaml +44 -0
- package/src/ontology/cosmic/index.ts +48 -0
- package/src/ontology/cosmic/moon-catalog.ts +173 -0
- package/src/ontology/cosmic/planet-catalog.ts +82 -0
- package/src/ontology/cosmic/star-catalog.ts +337 -0
- package/src/ontology/enums.ts +159 -0
- package/src/ontology/external-surfaces/index.ts +158 -0
- package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
- package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
- package/src/ontology/external-surfaces/url-schema.yaml +95 -0
- package/src/ontology/growth/events/contact-email-click.yaml +21 -0
- package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
- package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
- package/src/ontology/growth/events/contact-route-click.yaml +21 -0
- package/src/ontology/growth/events/contact-submit.yaml +28 -0
- package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
- package/src/ontology/growth/events/cta-click.yaml +30 -0
- package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
- package/src/ontology/growth/events/donation-form-start.yaml +21 -0
- package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
- package/src/ontology/growth/events/donation-intent.yaml +29 -0
- package/src/ontology/growth/events/form-error.yaml +27 -0
- package/src/ontology/growth/events/form-start.yaml +21 -0
- package/src/ontology/growth/events/form-submit.yaml +21 -0
- package/src/ontology/growth/events/outbound-click.yaml +25 -0
- package/src/ontology/growth/events/page-view.yaml +24 -0
- package/src/ontology/growth/events/passport-view.yaml +28 -0
- package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
- package/src/ontology/index.ts +165 -0
- package/src/ontology/manifest.ts +344 -0
- package/src/ontology/operations/index.ts +1 -0
- package/src/ontology/schemas/biome.ts +303 -0
- package/src/ontology/schemas/capability.ts +104 -0
- package/src/ontology/schemas/constellation.ts +114 -0
- package/src/ontology/schemas/dns-records.ts +53 -0
- package/src/ontology/schemas/index.ts +95 -0
- package/src/ontology/schemas/manifest-resolver.ts +123 -0
- package/src/ontology/schemas/page-entry.ts +213 -0
- package/src/ontology/schemas/section-archetype.ts +109 -0
- package/src/ontology/schemas/site-family.ts +98 -0
- package/src/ontology/schemas/system/growth.ts +80 -0
- package/src/ontology/schemas/system/integrations.ts +143 -0
- package/src/ontology/schemas/system/manifest.ts +492 -0
- package/src/ontology/schemas/system/page-output.ts +99 -0
- package/src/ontology/schemas/system/release.ts +58 -0
- package/src/ontology/schemas/system/text.ts +58 -0
- package/src/ontology/schemas/system.ts +53 -0
- package/src/ontology/shared-section-props/body-fragments.ts +182 -0
- package/src/ontology/shared-section-props/catalog.ts +195 -0
- package/src/ontology/shared-section-props/common.ts +178 -0
- package/src/ontology/shared-section-props/index.ts +34 -0
- package/src/ontology/shared-section-props/visual-header.ts +163 -0
- package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
- package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
- package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
- package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
- package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
- package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
- package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
- package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
- package/src/ontology/tests/enums.test.ts +203 -0
- package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
- package/src/ontology/vitest.config.ts +8 -0
- package/src/passport/dht-sign.test.ts +99 -0
- package/src/passport/dht-sign.ts +73 -0
- package/src/passport/identity-sign.test.ts +134 -0
- package/src/passport/identity-sign.ts +85 -0
- package/src/passport/index.ts +53 -0
- package/src/passport/key-rotate.ts +133 -0
- package/src/passport/schema.ts +198 -0
- package/src/passport/sign.ts +225 -0
- package/src/passport/tests/schema.pbt.test.ts +93 -0
- package/src/passport/tests/schema.test.ts +222 -0
- package/src/passport/vitest.config.ts +8 -0
- package/src/share/agent/api-catalog.ts +77 -0
- package/src/share/agent/capability.ts +68 -0
- package/src/share/agent/dns-aid.test.ts +74 -0
- package/src/share/agent/dns-aid.ts +53 -0
- package/src/share/agent/fleet-catalog.ts +149 -0
- package/src/share/agent/index.ts +29 -0
- package/src/share/agent/knowledge.ts +96 -0
- package/src/share/agent/manifest.ts +126 -0
- package/src/share/agent/mcp-card.ts +63 -0
- package/src/share/agent/omit-empty.ts +77 -0
- package/src/share/agent/openapi.ts +157 -0
- package/src/share/agent/proof.ts +61 -0
- package/src/share/attribution-display.ts +86 -0
- package/src/share/check-hints.ts +38 -0
- package/src/share/content/entity-id.ts +65 -0
- package/src/share/content/index.ts +16 -0
- package/src/share/content/merge.ts +86 -0
- package/src/share/content/resolve-field-path.ts +39 -0
- package/src/share/content/substitute-deep.ts +47 -0
- package/src/share/content-discipline/index.ts +14 -0
- package/src/share/content-discipline/parsers.ts +66 -0
- package/src/share/content-discipline/types.ts +118 -0
- package/src/share/content-reference.ts +333 -0
- package/src/share/counter-utils.ts +75 -0
- package/src/share/css-value-normalize.ts +48 -0
- package/src/share/dev-props-validator.ts +131 -0
- package/src/share/entitlement.ts +172 -0
- package/src/share/env.d.ts +73 -0
- package/src/share/feature-policy.ts +367 -0
- package/src/share/formula-eval.ts +364 -0
- package/src/share/fs/index.ts +96 -0
- package/src/share/i18n/localization.ts +57 -0
- package/src/share/image-provider.ts +314 -0
- package/src/share/index.ts +86 -0
- package/src/share/knowledge/claim.ts +129 -0
- package/src/share/knowledge/derivation.ts +55 -0
- package/src/share/knowledge/freshness.ts +127 -0
- package/src/share/knowledge/index.ts +23 -0
- package/src/share/knowledge/ledger.ts +222 -0
- package/src/share/knowledge/plan.ts +122 -0
- package/src/share/knowledge/source.ts +170 -0
- package/src/share/legal/translation-policy.ts +133 -0
- package/src/share/material-credits.ts +181 -0
- package/src/share/middleware/language-redirect.ts +49 -0
- package/src/share/offer-capacity.ts +149 -0
- package/src/share/onboarding-yaml/index.ts +162 -0
- package/src/share/page.ts +351 -0
- package/src/share/redirects.test.ts +62 -0
- package/src/share/redirects.ts +54 -0
- package/src/share/rfc0042-utils.ts +95 -0
- package/src/share/runtime-context.ts +70 -0
- package/src/share/schemas/claim-records.ts +69 -0
- package/src/share/schemas/claims.ts +150 -0
- package/src/share/schemas/effects.ts +212 -0
- package/src/share/schemas/features.ts +147 -0
- package/src/share/schemas/horizontal-align.ts +22 -0
- package/src/share/schemas/icon-color.ts +27 -0
- package/src/share/schemas/index.ts +43 -0
- package/src/share/schemas/live-photo.ts +53 -0
- package/src/share/schemas/material-credit.ts +292 -0
- package/src/share/schemas/media.ts +220 -0
- package/src/share/schemas/navigation.ts +74 -0
- package/src/share/schemas/page-base.ts +33 -0
- package/src/share/schemas/participant.ts +247 -0
- package/src/share/schemas/person.ts +24 -0
- package/src/share/schemas/print.ts +93 -0
- package/src/share/schemas/section-background.ts +106 -0
- package/src/share/schemas/section-body.ts +138 -0
- package/src/share/schemas/section-cards.ts +37 -0
- package/src/share/schemas/section-cta.ts +74 -0
- package/src/share/schemas/section-header.ts +77 -0
- package/src/share/schemas/section-image.ts +77 -0
- package/src/share/schemas/section-motion.ts +52 -0
- package/src/share/schemas/section-shell.ts +63 -0
- package/src/share/schemas/section-stats.ts +37 -0
- package/src/share/schemas/site-background.ts +78 -0
- package/src/share/schemas/standard-list-item.ts +38 -0
- package/src/share/scripts/external-links.ts +45 -0
- package/src/share/scripts/gsap-counter.ts +168 -0
- package/src/share/scripts/gsap-mountain-journey.ts +236 -0
- package/src/share/scripts/gsap-parallax.ts +50 -0
- package/src/share/scripts/gsap-reveal.ts +65 -0
- package/src/share/scripts/gsap-stagger.ts +54 -0
- package/src/share/scripts/index.ts +25 -0
- package/src/share/scripts/inline-number-animation.ts +120 -0
- package/src/share/scripts/lenis.ts +109 -0
- package/src/share/scripts/live-photos.ts +250 -0
- package/src/share/scripts/lordicon.ts +94 -0
- package/src/share/scripts/orchestrator.ts +138 -0
- package/src/share/scripts/scheduler.ts +53 -0
- package/src/share/scripts/video-player.ts +116 -0
- package/src/share/semantic/ai.ts +140 -0
- package/src/share/semantic/block-extraction.ts +52 -0
- package/src/share/semantic/block-extractors/index.ts +502 -0
- package/src/share/semantic/breadcrumbs.ts +120 -0
- package/src/share/semantic/build-page.ts +309 -0
- package/src/share/semantic/business-projection.ts +278 -0
- package/src/share/semantic/derived-prices-loader.ts +36 -0
- package/src/share/semantic/extract.ts +118 -0
- package/src/share/semantic/feed.ts +124 -0
- package/src/share/semantic/ids.ts +76 -0
- package/src/share/semantic/image-sitemap.ts +153 -0
- package/src/share/semantic/index.ts +36 -0
- package/src/share/semantic/jsonld/article.ts +47 -0
- package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
- package/src/share/semantic/jsonld/collection-list.ts +30 -0
- package/src/share/semantic/jsonld/context.ts +46 -0
- package/src/share/semantic/jsonld/faq.ts +49 -0
- package/src/share/semantic/jsonld/initiative.ts +53 -0
- package/src/share/semantic/jsonld/organization.ts +101 -0
- package/src/share/semantic/jsonld/person.ts +71 -0
- package/src/share/semantic/jsonld/service.ts +80 -0
- package/src/share/semantic/jsonld/shared.ts +31 -0
- package/src/share/semantic/jsonld/types.ts +18 -0
- package/src/share/semantic/jsonld/webpage.ts +98 -0
- package/src/share/semantic/jsonld/website.ts +27 -0
- package/src/share/semantic/jsonld.ts +75 -0
- package/src/share/semantic/llms-policy.ts +74 -0
- package/src/share/semantic/llms.ts +394 -0
- package/src/share/semantic/markdown-hygiene.ts +68 -0
- package/src/share/semantic/markdown-twin-provenance.ts +242 -0
- package/src/share/semantic/models.ts +402 -0
- package/src/share/semantic/organization-profile.ts +160 -0
- package/src/share/semantic/output-projection.ts +131 -0
- package/src/share/semantic/page-builders/markdown-page.ts +84 -0
- package/src/share/semantic/page-markdown.ts +234 -0
- package/src/share/semantic/page-utils.ts +125 -0
- package/src/share/semantic/price-marker-resolver.ts +92 -0
- package/src/share/semantic/robots.ts +127 -0
- package/src/share/semantic/update-stamp.ts +136 -0
- package/src/share/shared-context.ts +177 -0
- package/src/share/string-utils.ts +19 -0
- package/src/share/tests/api-catalog.test.ts +97 -0
- package/src/share/tests/breadcrumbs.test.ts +126 -0
- package/src/share/tests/build-page-price-markers.test.ts +160 -0
- package/src/share/tests/capability.test.ts +107 -0
- package/src/share/tests/claim.test.ts +90 -0
- package/src/share/tests/content-ref-index.test.ts +328 -0
- package/src/share/tests/create-dev-props-validator.test.ts +38 -0
- package/src/share/tests/derivation.test.ts +39 -0
- package/src/share/tests/dev-props-validator.test.ts +88 -0
- package/src/share/tests/fleet-catalog.test.ts +134 -0
- package/src/share/tests/formula-eval.test.ts +619 -0
- package/src/share/tests/freshness.test.ts +60 -0
- package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
- package/src/share/tests/image-sitemap.test.ts +101 -0
- package/src/share/tests/jsonld-service.test.ts +282 -0
- package/src/share/tests/knowledge.test.ts +86 -0
- package/src/share/tests/ledger.test.ts +125 -0
- package/src/share/tests/llms-0789.test.ts +63 -0
- package/src/share/tests/manifest.test.ts +100 -0
- package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
- package/src/share/tests/mcp-card.test.ts +57 -0
- package/src/share/tests/onboarding-yaml.test.ts +111 -0
- package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
- package/src/share/tests/openapi.test.ts +116 -0
- package/src/share/tests/organization-jsonld.test.ts +74 -0
- package/src/share/tests/output-projection.test.ts +61 -0
- package/src/share/tests/plan.test.ts +97 -0
- package/src/share/tests/price-marker-resolver.test.ts +141 -0
- package/src/share/tests/proof.test.ts +72 -0
- package/src/share/tests/resolve-field-path.test.ts +52 -0
- package/src/share/tests/source.test.ts +81 -0
- package/src/share/tests/substitute-deep.test.ts +65 -0
- package/src/share/tests/text-normalize.pbt.test.ts +143 -0
- package/src/share/tests/text-normalize.test.ts +285 -0
- package/src/share/tests/twin-path.test.ts +43 -0
- package/src/share/text-normalize.ts +548 -0
- package/src/share/text-position.ts +19 -0
- package/src/share/types/hls-js-light.d.ts +16 -0
- package/src/share/visibility.ts +167 -0
- package/src/share/vitest.config.ts +8 -0
- package/src/share/wrap-inline-numbers.ts +139 -0
- package/src/surface/blueprint-schema.ts +314 -0
- package/src/surface/blueprint-types.ts +256 -0
- package/src/surface/blueprint.ts +300 -0
- package/src/surface/breaker.ts +57 -0
- package/src/surface/decision-composer.ts +156 -0
- package/src/surface/eligibility.ts +372 -0
- package/src/surface/evidence-records.ts +97 -0
- package/src/surface/fleet.ts +60 -0
- package/src/surface/geo.ts +170 -0
- package/src/surface/governance.ts +146 -0
- package/src/surface/index.ts +216 -0
- package/src/surface/io/index.ts +18 -0
- package/src/surface/io/surface-module-context-io.ts +60 -0
- package/src/surface/io/visibility-outcomes-io.ts +46 -0
- package/src/surface/module-context.ts +120 -0
- package/src/surface/substance.ts +161 -0
- package/src/surface/tests/eligibility.pbt.test.ts +137 -0
- package/src/surface/tests/eligibility.test.ts +302 -0
- package/src/surface/types.ts +289 -0
- package/src/surface/visibility.ts +57 -0
- package/src/surface/vitest.config.ts +8 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Blueprint: ratgeber (RFC-0500)
|
|
2
|
+
# Editorial knowledge hub — article collection with category taxonomy.
|
|
3
|
+
# RFC-0500: restructured from flat topic list into editorial hub with CollectionPage semantic type.
|
|
4
|
+
id: ratgeber
|
|
5
|
+
entitlement: pseo
|
|
6
|
+
|
|
7
|
+
dataset:
|
|
8
|
+
collection: articles
|
|
9
|
+
status: active
|
|
10
|
+
|
|
11
|
+
axes:
|
|
12
|
+
- id: article
|
|
13
|
+
universe: { collection: articles, field: slug }
|
|
14
|
+
match: { recordField: slug }
|
|
15
|
+
|
|
16
|
+
levels:
|
|
17
|
+
- depth: 0
|
|
18
|
+
slug: { de: ratgeber, uk: porady }
|
|
19
|
+
constellation: ratgeber-hub
|
|
20
|
+
geo: twin-only
|
|
21
|
+
titleTemplate: { de: Ratgeber, uk: Поради }
|
|
22
|
+
intro:
|
|
23
|
+
de: "Verständliche Antworten auf die häufigsten Fragen rund um Website, lokale Sichtbarkeit und digitales Fundament für kleines Gewerbe und Handwerk."
|
|
24
|
+
uk: "Зрозумілі відповіді на найпоширеніші питання про сайт, локальну видимість і цифровий фундамент для малого бізнесу та ремесла."
|
|
25
|
+
semanticType: collection
|
|
26
|
+
hub:
|
|
27
|
+
cardFields:
|
|
28
|
+
- category
|
|
29
|
+
- title
|
|
30
|
+
- question
|
|
31
|
+
- summary
|
|
32
|
+
- articleType
|
|
33
|
+
- readTime
|
|
34
|
+
- reviewedAt
|
|
35
|
+
reservedSlugs:
|
|
36
|
+
- redaktion
|
|
37
|
+
- depth: 1
|
|
38
|
+
slug: { de: "ratgeber/{article}", uk: "porady/{article}" }
|
|
39
|
+
constellation: ratgeber-article
|
|
40
|
+
geo: full
|
|
41
|
+
titleTemplate: { de: "{article.title}", uk: "{article.title}" }
|
|
42
|
+
semanticType: article
|
|
43
|
+
|
|
44
|
+
policy:
|
|
45
|
+
minRecordsPerDepth: { 0: 0, 1: 1 }
|
|
46
|
+
noindexBelowPerDepth: { 1: 1 }
|
|
47
|
+
redirectPolicy: nearest-ancestor
|
|
48
|
+
trailingSlash: true
|
|
49
|
+
maxStubDepth: 1
|
|
50
|
+
substanceMin: 20
|
|
51
|
+
maxThinShare: 0.5
|
|
52
|
+
bake: lazy
|
|
53
|
+
statusGate:
|
|
54
|
+
allowedStatuses:
|
|
55
|
+
- published
|
|
56
|
+
excludedStatuses:
|
|
57
|
+
- draft
|
|
58
|
+
- review-required
|
|
59
|
+
|
|
60
|
+
linking:
|
|
61
|
+
children: { limit: 12 }
|
|
62
|
+
siblings: { limit: 8 }
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# Blueprint: website-local v2 (RFC-0238)
|
|
2
|
+
# Five-axis geo-demand cascade: industry × country × region × city × demand.
|
|
3
|
+
# Datasets live in the app: apps/<app>/src/content/surface/{industries,demands}/<lang>/*.md
|
|
4
|
+
# Geo axes (country, region, city) are resolved from @warpgogol/geo (RFC-0237).
|
|
5
|
+
# Gated by the single `pseo` entitlement (RFC-0169 / RFC-0240).
|
|
6
|
+
id: website-local
|
|
7
|
+
entitlement: pseo
|
|
8
|
+
|
|
9
|
+
# The record set the eligibility engine counts. Each demand record lists the industries,
|
|
10
|
+
# country, region, and city it applies to; a tuple is live when matching records exist.
|
|
11
|
+
dataset:
|
|
12
|
+
collection: demands
|
|
13
|
+
status: active
|
|
14
|
+
|
|
15
|
+
axes:
|
|
16
|
+
- id: industry
|
|
17
|
+
universe: { collection: industries, field: slug }
|
|
18
|
+
match: { recordField: industries }
|
|
19
|
+
- id: country
|
|
20
|
+
universe: { provider: geo.countries }
|
|
21
|
+
match: { recordField: country }
|
|
22
|
+
- id: region
|
|
23
|
+
universe: { provider: geo.regions }
|
|
24
|
+
match: { recordField: region }
|
|
25
|
+
- id: city
|
|
26
|
+
universe: { provider: geo.cities }
|
|
27
|
+
match: { recordField: city }
|
|
28
|
+
- id: demand
|
|
29
|
+
universe: { collection: demands, field: slug }
|
|
30
|
+
match: { recordField: slug }
|
|
31
|
+
|
|
32
|
+
levels:
|
|
33
|
+
- depth: 0
|
|
34
|
+
slug: { de: website, uk: sait }
|
|
35
|
+
constellation: website-pillar
|
|
36
|
+
geo: twin-only
|
|
37
|
+
semanticType: collection
|
|
38
|
+
titleTemplate:
|
|
39
|
+
de: "Website für Handwerk und Gewerbe | Branchenübersicht | Warpgogol"
|
|
40
|
+
uk: "Сайт для ремесла та бізнесу | Огляд галузей | Warpgogol"
|
|
41
|
+
descriptionTemplate:
|
|
42
|
+
de: "Wie das Digitale Fundament an Elektriker, Friseure und andere lokale Betriebe angepasst wird: Leistungen, Einsatzgebiet, Kontaktwege und passende Funktionen."
|
|
43
|
+
uk: "Як Цифровий фундамент адаптується до електриків, перукарів та іншого локального бізнесу: послуги, зона роботи, шляхи контакту та відповідні функції."
|
|
44
|
+
intro:
|
|
45
|
+
de: "Das Digitale Fundament bleibt dasselbe. Aufbau, Inhalte, Kontaktwege und optionale Funktionen werden an den jeweiligen Betrieb angepasst. Hinweise zur lokalen Sichtbarkeit im Ratgeber [Lokale Sichtbarkeit](/ratgeber/lokale-sichtbarkeit/)."
|
|
46
|
+
uk: "Цифровий фундамент залишається тим самим. Структуру, контент, шляхи контакту та додаткові функції адаптуємо до конкретного бізнесу. Вказівки щодо локальної видимості у пораднику [Локальна видимість](/porady/lokalna-vydymist/)."
|
|
47
|
+
pillar:
|
|
48
|
+
hero:
|
|
49
|
+
eyebrow:
|
|
50
|
+
de: Digitales Fundament für Ihr Gewerbe
|
|
51
|
+
uk: Цифровий фундамент для вашого бізнесу
|
|
52
|
+
heading:
|
|
53
|
+
de: Welche Website braucht Ihr Betrieb?
|
|
54
|
+
uk: Який сайт потрібен вашому бізнесу?
|
|
55
|
+
lead:
|
|
56
|
+
de: "Ein Elektrikerbetrieb, ein Friseursalon und eine Gebäudereinigung benötigen nicht dieselben Inhalte und Kontaktwege. Hier sehen Sie, wie das Digitale Fundament an unterschiedliche Gewerbe angepasst wird."
|
|
57
|
+
uk: "Електромонтаж, перукарня та прибирання будівель потребують різного контенту та шляхів контакту. Тут видно, як Цифровий фундамент адаптується до різних видів бізнесу."
|
|
58
|
+
primaryCta:
|
|
59
|
+
label:
|
|
60
|
+
de: Gewerbe auswählen
|
|
61
|
+
uk: Обрати галузь
|
|
62
|
+
target: "#industry-catalog"
|
|
63
|
+
secondaryCta:
|
|
64
|
+
label:
|
|
65
|
+
de: Digitales Fundament verstehen
|
|
66
|
+
uk: Зрозуміти Цифровий фундамент
|
|
67
|
+
target: digitalesFundament
|
|
68
|
+
adaptation:
|
|
69
|
+
heading:
|
|
70
|
+
de: Was sich je nach Gewerbe verändert
|
|
71
|
+
uk: Що змінюється залежно від галузі
|
|
72
|
+
dimensions:
|
|
73
|
+
- heading:
|
|
74
|
+
de: Leistungen und Sprache
|
|
75
|
+
uk: Послуги та мова
|
|
76
|
+
body:
|
|
77
|
+
de: Welche Leistungen unterschieden werden und wie Kunden sie nennen.
|
|
78
|
+
uk: Які послуги потрібно розрізняти і як їх називають клієнти.
|
|
79
|
+
- heading:
|
|
80
|
+
de: Einsatzgebiet
|
|
81
|
+
uk: Зона роботи
|
|
82
|
+
body:
|
|
83
|
+
de: "Ob der Betrieb an einem Standort, in einem Radius, in mehreren Städten, mit Notdienst oder nur nach Termin arbeitet."
|
|
84
|
+
uk: "Чи працює бізнес на одному місці, в певному радіусі, у кількох містах, з аварійною службою чи лише за записом."
|
|
85
|
+
- heading:
|
|
86
|
+
de: Kontakt und Handlung
|
|
87
|
+
uk: Контакт та дія
|
|
88
|
+
body:
|
|
89
|
+
de: "Welche Aktionen wichtig sind: Anruf, Termin, Notdienst, Angebot, Rückruf, Wegbeschreibung."
|
|
90
|
+
uk: "Які дії важливі: дзвінок, запис, аварійна служба, пропозиція, зворотний дзвінок, маршрут."
|
|
91
|
+
- heading:
|
|
92
|
+
de: Nachweise und Vertrauen
|
|
93
|
+
uk: Докази та довіра
|
|
94
|
+
body:
|
|
95
|
+
de: "Welche Angaben helfen, den Betrieb einzuschätzen: Qualifikationen, Meisterbetrieb, Fotos, Bewertungen, Öffnungszeiten."
|
|
96
|
+
uk: "Які відомості допомагають оцінити бізнес: кваліфікації, майстерність, фото, відгуки, години роботи."
|
|
97
|
+
catalogHeading:
|
|
98
|
+
de: "Gewerbe auswählen"
|
|
99
|
+
uk: "Обрати галузь"
|
|
100
|
+
productPrice:
|
|
101
|
+
heading:
|
|
102
|
+
de: "Gleiche Grundlage, angepasste Struktur"
|
|
103
|
+
uk: "Спільна основа, адаптована структура"
|
|
104
|
+
body:
|
|
105
|
+
de: "Die Branche verändert nicht automatisch den Basispreis. Zusätzliche Seiten, Sprachen, Buchungsfunktionen oder Integrationen werden gesondert vereinbart."
|
|
106
|
+
uk: "Галузь не змінює автоматично базову ціну. Додаткові сторінки, мови, функції бронювання чи інтеграції узгоджуються окремо."
|
|
107
|
+
priceRef: "business-profile.offerings/digital-foundation.presentation.price"
|
|
108
|
+
finalCta:
|
|
109
|
+
heading:
|
|
110
|
+
de: Ihr Gewerbe ist noch nicht aufgeführt?
|
|
111
|
+
uk: Вашої галузі ще немає в списку?
|
|
112
|
+
body:
|
|
113
|
+
de: "Beschreiben Sie kurz Ihren Betrieb, Ihre Leistungen und Ihr Einsatzgebiet. Warpgogol prüft, wie das Digitale Fundament für Ihre Situation aufgebaut werden kann."
|
|
114
|
+
uk: "Коротко опишіть свій бізнес, послуги та зону роботи. Warpgogol перевірить, як Цифровий фундамент можна побудувати для вашої ситуації."
|
|
115
|
+
primaryCta:
|
|
116
|
+
label:
|
|
117
|
+
de: Unverbindliche Anfrage starten
|
|
118
|
+
uk: "Почати необов'язковий запит"
|
|
119
|
+
target: contact
|
|
120
|
+
secondaryCta:
|
|
121
|
+
label:
|
|
122
|
+
de: Preis ansehen
|
|
123
|
+
uk: Переглянути ціну
|
|
124
|
+
target: pricing
|
|
125
|
+
- depth: 1
|
|
126
|
+
slug: { de: "website/{industry}", uk: "sait/{industry}" }
|
|
127
|
+
constellation: website-industry
|
|
128
|
+
geo: full
|
|
129
|
+
titleTemplate:
|
|
130
|
+
{
|
|
131
|
+
de: "Website für {industry.name} erstellen lassen",
|
|
132
|
+
uk: "Сайт для напрямку: {industry.name}",
|
|
133
|
+
}
|
|
134
|
+
# RFC-0492: industry dossier configuration
|
|
135
|
+
dossier:
|
|
136
|
+
gate:
|
|
137
|
+
minServiceCategories: 5
|
|
138
|
+
minCustomerJourneys: 3
|
|
139
|
+
minTrustSignals: 4
|
|
140
|
+
minArchitectureEntries: 1
|
|
141
|
+
minModuleMappings: 3
|
|
142
|
+
minUniqueFaq: 5
|
|
143
|
+
claimRestrictions:
|
|
144
|
+
- "mehr Anfragen"
|
|
145
|
+
- "mehr Termin-Anfragen"
|
|
146
|
+
- "echte Aufträge"
|
|
147
|
+
- "steigt die Wahrscheinlichkeit"
|
|
148
|
+
- "weniger Streuverluste"
|
|
149
|
+
- "höhere Conversion"
|
|
150
|
+
- "besser gefunden"
|
|
151
|
+
- "stärkstes Conversion-Signal"
|
|
152
|
+
doorwayMaxFlaggedShare: 0.30
|
|
153
|
+
duplicateMaxSimilarity: 0.70
|
|
154
|
+
mode: warn
|
|
155
|
+
- depth: 2
|
|
156
|
+
slug: { de: "website/{industry}/{country}", uk: "sait/{industry}/{country}" }
|
|
157
|
+
constellation: website-country
|
|
158
|
+
geo: full
|
|
159
|
+
titleTemplate:
|
|
160
|
+
{
|
|
161
|
+
de: "Website für {industry.name} in {country.name}",
|
|
162
|
+
uk: "{industry.name}: сайт у {country.name}",
|
|
163
|
+
}
|
|
164
|
+
- depth: 3
|
|
165
|
+
slug: { de: "website/{industry}/{region}", uk: "sait/{industry}/{region}" }
|
|
166
|
+
constellation: website-region
|
|
167
|
+
geo: full
|
|
168
|
+
titleTemplate:
|
|
169
|
+
{
|
|
170
|
+
de: "Website für {industry.name} in {region.name}",
|
|
171
|
+
uk: "{industry.name}: сайт у регіоні {region.name}",
|
|
172
|
+
}
|
|
173
|
+
- depth: 4
|
|
174
|
+
slug: { de: "website/{industry}/{city}", uk: "sait/{industry}/{city}" }
|
|
175
|
+
constellation: website-city
|
|
176
|
+
geo: full
|
|
177
|
+
titleTemplate:
|
|
178
|
+
{
|
|
179
|
+
de: "Website für {industry.name} in {city.name}",
|
|
180
|
+
uk: "{industry.name}: сайт у місті {city.name}",
|
|
181
|
+
}
|
|
182
|
+
- depth: 5
|
|
183
|
+
slug: { de: "website/{industry}/{city}/{demand}", uk: "sait/{industry}/{city}/{demand}" }
|
|
184
|
+
constellation: bedarfskarte
|
|
185
|
+
geo: full
|
|
186
|
+
titleTemplate:
|
|
187
|
+
{
|
|
188
|
+
de: "{demand.name} für {industry.name} in {city.name}",
|
|
189
|
+
uk: "{demand.name} для {industry.name} у {city.name}",
|
|
190
|
+
}
|
|
191
|
+
# RFC-0497: intersection gate — depth-5 pages require explicit intersection records
|
|
192
|
+
intersection:
|
|
193
|
+
gate:
|
|
194
|
+
minLocalServiceQuestions: 3
|
|
195
|
+
minScenarios: 2
|
|
196
|
+
minLocalEvidence: 2
|
|
197
|
+
minUniqueContentBlocks: 1
|
|
198
|
+
minUniqueFaq: 3
|
|
199
|
+
minSources: 1
|
|
200
|
+
similarity:
|
|
201
|
+
similarityToIndustryPage: 0.70
|
|
202
|
+
similarityToCityPage: 0.70
|
|
203
|
+
similarityToServicePage: 0.70
|
|
204
|
+
similarityToOtherIntersections: 0.70
|
|
205
|
+
substanceIndependenceThreshold: 0.50
|
|
206
|
+
mode: warn
|
|
207
|
+
|
|
208
|
+
policy:
|
|
209
|
+
minRecordsPerDepth: { 0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1 }
|
|
210
|
+
noindexBelowPerDepth: { 5: 1 }
|
|
211
|
+
redirectPolicy: nearest-ancestor
|
|
212
|
+
trailingSlash: true
|
|
213
|
+
maxStubDepth: 1
|
|
214
|
+
# RFC-0194 / RFC-0238: anti-thin-content. A Bedarfskarte below substanceMin is auto-noindexed;
|
|
215
|
+
# pseo.validate fails if more than maxThinShare of a family is thin.
|
|
216
|
+
substanceMin: 24
|
|
217
|
+
substanceMinPerDepth: { 0: 24, 1: 36, 4: 52, 5: 64 }
|
|
218
|
+
# RFC-0274: d5 Bedarfskarten require tuple-specific proof before indexability.
|
|
219
|
+
evidencePerDepth:
|
|
220
|
+
5:
|
|
221
|
+
existenceSource: works
|
|
222
|
+
minWerkEvidence: 1
|
|
223
|
+
approvedNarrative: required
|
|
224
|
+
requiredRecordFields:
|
|
225
|
+
- searchedAs
|
|
226
|
+
- neededPage
|
|
227
|
+
- trustProofs
|
|
228
|
+
- leadLosingMistakes
|
|
229
|
+
preferredEvidenceSources:
|
|
230
|
+
- works
|
|
231
|
+
- references
|
|
232
|
+
- verifiedClaims
|
|
233
|
+
minTupleSpecificFacts: 2
|
|
234
|
+
freshness: valid-and-current
|
|
235
|
+
duplicate:
|
|
236
|
+
method: shingle
|
|
237
|
+
maxSimilarityWithinCluster: 0.86
|
|
238
|
+
leadImage: warning
|
|
239
|
+
mode: error
|
|
240
|
+
depthRoles:
|
|
241
|
+
1:
|
|
242
|
+
indexability: index
|
|
243
|
+
2:
|
|
244
|
+
indexability: navigation-noindex
|
|
245
|
+
canonicalTarget: tradeHub
|
|
246
|
+
follow: true
|
|
247
|
+
includeInSitemap: false
|
|
248
|
+
geo: off
|
|
249
|
+
3:
|
|
250
|
+
indexability: navigation-noindex
|
|
251
|
+
canonicalTarget: tradeHub
|
|
252
|
+
follow: true
|
|
253
|
+
includeInSitemap: false
|
|
254
|
+
geo: off
|
|
255
|
+
4:
|
|
256
|
+
indexability: evidence-gated
|
|
257
|
+
localEvidence:
|
|
258
|
+
minVerifiedFacts: 3
|
|
259
|
+
minCitySpecificQa: 1
|
|
260
|
+
minUniqueTokenShare: 0.30
|
|
261
|
+
maxBodySimilarityWithinBranch: 0.70
|
|
262
|
+
demandPerDepth:
|
|
263
|
+
5:
|
|
264
|
+
minVolume: 20
|
|
265
|
+
allowIntents: [commercial, transactional]
|
|
266
|
+
missing: do-not-emit
|
|
267
|
+
staleAfterDays: 365
|
|
268
|
+
maxThinShare: 0.4
|
|
269
|
+
# RFC-0240: the region-hub level (d3) is the regional-hub upsell — suppressed on the base `pseo`
|
|
270
|
+
# tier and unlocked only when the resolved entitlements report `pseo.regionalUnlocked`.
|
|
271
|
+
regionalGateDepths: [3]
|
|
272
|
+
|
|
273
|
+
linking:
|
|
274
|
+
children: { limit: 12 }
|
|
275
|
+
siblings: { limit: 8 }
|
|
276
|
+
teasers:
|
|
277
|
+
relevance:
|
|
278
|
+
- { sharedAxis: industry, weight: 5 }
|
|
279
|
+
- { sharedAxis: demand, weight: 4 }
|
|
280
|
+
- { sharedAxis: city, weight: 3 }
|
|
281
|
+
|
|
282
|
+
# RFC-0196 / RFC-0238: Freshness Ledger. Per-depth SLA tuned for five-level cascade.
|
|
283
|
+
freshness:
|
|
284
|
+
field: lastVerified
|
|
285
|
+
slaDaysPerDepth: { 0: 3650, 1: 540, 2: 540, 3: 540, 4: 365, 5: 270 }
|
|
286
|
+
# "all": an aggregate page decays only when every contributing record is stale.
|
|
287
|
+
mode: all
|
|
288
|
+
|
|
289
|
+
rotation:
|
|
290
|
+
variantsByTupleHash: true
|
|
291
|
+
|
|
292
|
+
projection:
|
|
293
|
+
title:
|
|
294
|
+
de: Website erstellen lassen
|
|
295
|
+
|
|
296
|
+
# RFC-0197/0207: build-time, frozen, provenanced LLM enrichment.
|
|
297
|
+
enrichedFields:
|
|
298
|
+
- field: narrative
|
|
299
|
+
promptId: website-local-narrative
|
|
300
|
+
kind: narrative
|
|
301
|
+
scope: tuple
|
|
302
|
+
scopeDepth: 5
|
|
303
|
+
maxTokens: 800
|
|
304
|
+
- field: localMarket
|
|
305
|
+
promptId: local-market-signal
|
|
306
|
+
kind: field
|
|
307
|
+
scope: tuple
|
|
308
|
+
scopeDepth: 5
|
|
309
|
+
maxTokens: 200
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Blueprint: website-service (RFC-0496)
|
|
2
|
+
# Service dossier pages — a separate surface from website-local.
|
|
3
|
+
# Two axes: industry × service. One level: depth-1 (service dossier).
|
|
4
|
+
# Datasets live in the app: apps/<app>/src/content/surface/services/<lang>/*.md
|
|
5
|
+
# Gated by the single `pseo` entitlement (RFC-0169 / RFC-0240).
|
|
6
|
+
id: website-service
|
|
7
|
+
entitlement: pseo
|
|
8
|
+
|
|
9
|
+
# The record set the eligibility engine counts. Each service record lists the
|
|
10
|
+
# industry and service slug it applies to; a tuple is live when a matching record exists.
|
|
11
|
+
dataset:
|
|
12
|
+
collection: services
|
|
13
|
+
status: active
|
|
14
|
+
|
|
15
|
+
axes:
|
|
16
|
+
- id: industry
|
|
17
|
+
universe: { collection: industries, field: slug }
|
|
18
|
+
match: { recordField: industryId }
|
|
19
|
+
- id: service
|
|
20
|
+
universe: { collection: services, field: slug }
|
|
21
|
+
match: { recordField: slug }
|
|
22
|
+
|
|
23
|
+
levels:
|
|
24
|
+
- depth: 0
|
|
25
|
+
slug: { de: "leistungen/website-service", uk: "posluhy/sait-service" }
|
|
26
|
+
constellation: website-service-root
|
|
27
|
+
geo: twin-only
|
|
28
|
+
semanticType: collection
|
|
29
|
+
titleTemplate: { de: "Website-Services | Warpgogol", uk: "Сайт-сервіси | Warpgogol" }
|
|
30
|
+
- depth: 1
|
|
31
|
+
slug: { de: "website/{industry}/service", uk: "sait/{industry}/service" }
|
|
32
|
+
constellation: website-service-industry
|
|
33
|
+
geo: full
|
|
34
|
+
titleTemplate:
|
|
35
|
+
{ de: "Website-Services für {industry.name}", uk: "Сайт-сервіси для {industry.name}" }
|
|
36
|
+
- depth: 2
|
|
37
|
+
slug: { de: "website/{industry}/{service}", uk: "sait/{industry}/{service}" }
|
|
38
|
+
constellation: website-service
|
|
39
|
+
geo: full
|
|
40
|
+
titleTemplate:
|
|
41
|
+
{
|
|
42
|
+
de: "{service.name} für {industry.name} — Website-Struktur",
|
|
43
|
+
uk: "{service.name} для {industry.name} — структура сайту",
|
|
44
|
+
}
|
|
45
|
+
# RFC-0496: service dossier configuration
|
|
46
|
+
service:
|
|
47
|
+
gate:
|
|
48
|
+
minServiceVariants: 3
|
|
49
|
+
minCustomerQuestions: 3
|
|
50
|
+
minPriceModels: 3
|
|
51
|
+
minFaq: 5
|
|
52
|
+
minPageStructure: 1
|
|
53
|
+
claimRestrictions:
|
|
54
|
+
- "mehr Anfragen"
|
|
55
|
+
- "mehr Termin-Anfragen"
|
|
56
|
+
- "mehr Buchungen"
|
|
57
|
+
- "echte Aufträge"
|
|
58
|
+
- "steigt die Wahrscheinlichkeit"
|
|
59
|
+
- "weniger Streuverluste"
|
|
60
|
+
- "höhere Conversion"
|
|
61
|
+
- "besser gefunden"
|
|
62
|
+
- "stärkstes Conversion-Signal"
|
|
63
|
+
- "garantierte Ergebnisse"
|
|
64
|
+
- "guaranteed results"
|
|
65
|
+
- "no. 1"
|
|
66
|
+
- "number one"
|
|
67
|
+
- "leading provider"
|
|
68
|
+
- "top rated"
|
|
69
|
+
- "beste Preis"
|
|
70
|
+
- "best price"
|
|
71
|
+
- "cheapest"
|
|
72
|
+
- "günstigste"
|
|
73
|
+
mode: warn
|
|
74
|
+
|
|
75
|
+
policy:
|
|
76
|
+
minRecordsPerDepth: { 0: 0, 1: 1, 2: 1 }
|
|
77
|
+
trailingSlash: true
|
|
78
|
+
maxStubDepth: 2
|
|
79
|
+
|
|
80
|
+
linking:
|
|
81
|
+
parent:
|
|
82
|
+
surface: website-local
|
|
83
|
+
depth: 1
|
|
84
|
+
joinField: industryId
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
id: lead.submit
|
|
2
|
+
version: 1
|
|
3
|
+
kind: action
|
|
4
|
+
title:
|
|
5
|
+
de: "Anfrage senden"
|
|
6
|
+
en: "Submit a lead"
|
|
7
|
+
description:
|
|
8
|
+
de: "Reicht eine Kontaktanfrage (Name, E-Mail, Nachricht) beim Gewerbe ein. Die Anfrage wird asynchron zugestellt — die Bestätigung signalisiert Annahme, nicht Zustellung."
|
|
9
|
+
en: "Submit a contact request (name, email, message) to the business. The request is delivered asynchronously — the confirmation signals acceptance, not delivery."
|
|
10
|
+
input:
|
|
11
|
+
type: object
|
|
12
|
+
required: [name, email, message]
|
|
13
|
+
additionalProperties: false
|
|
14
|
+
properties:
|
|
15
|
+
name:
|
|
16
|
+
type: string
|
|
17
|
+
minLength: 1
|
|
18
|
+
maxLength: 200
|
|
19
|
+
email:
|
|
20
|
+
type: string
|
|
21
|
+
format: email
|
|
22
|
+
maxLength: 254
|
|
23
|
+
message:
|
|
24
|
+
type: string
|
|
25
|
+
minLength: 1
|
|
26
|
+
maxLength: 5000
|
|
27
|
+
output:
|
|
28
|
+
type: object
|
|
29
|
+
required: [accepted]
|
|
30
|
+
additionalProperties: false
|
|
31
|
+
properties:
|
|
32
|
+
accepted:
|
|
33
|
+
type: boolean
|
|
34
|
+
integration:
|
|
35
|
+
eventKind: lead
|
|
36
|
+
source: agent
|
|
37
|
+
requires:
|
|
38
|
+
entitlements: [agent.actions]
|
|
39
|
+
sections: [send-message]
|
|
40
|
+
humanEquivalent:
|
|
41
|
+
sectionType: send-message
|
|
42
|
+
limits:
|
|
43
|
+
perMinutePerIp: 3
|
|
44
|
+
maxPayloadBytes: 10240
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>
|
|
4
|
+
Barrel export for the @warpgogol/werkstatt-shared/ontology/cosmic sub-path.
|
|
5
|
+
Re-exports all three closed catalogs, their union types, and Zod schemas
|
|
6
|
+
so consumers can import from a single entry point (DNA-23, RFC-0025).
|
|
7
|
+
</purpose>
|
|
8
|
+
<non-goals>
|
|
9
|
+
<item>Do not add runtime logic.</item>
|
|
10
|
+
<item>Do not import from outside the cosmic directory or zod.</item>
|
|
11
|
+
</non-goals>
|
|
12
|
+
</MODULE_CONTRACT>
|
|
13
|
+
<CHANGE_SUMMARY>
|
|
14
|
+
<item>Wave 1 (RFC-0025): Initial creation — cosmic barrel with cross-catalog union.</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
import { StarCatalog } from "./star-catalog.ts";
|
|
20
|
+
import { PlanetCatalog } from "./planet-catalog.ts";
|
|
21
|
+
import { MoonCatalog } from "./moon-catalog.ts";
|
|
22
|
+
|
|
23
|
+
// Re-export individual catalogs, schemas, and types
|
|
24
|
+
export { StarCatalog, starNameSchema } from "./star-catalog.ts";
|
|
25
|
+
export type { StarName } from "./star-catalog.ts";
|
|
26
|
+
|
|
27
|
+
export { PlanetCatalog, planetNameSchema } from "./planet-catalog.ts";
|
|
28
|
+
export type { PlanetName } from "./planet-catalog.ts";
|
|
29
|
+
|
|
30
|
+
export { MoonCatalog, moonNameSchema } from "./moon-catalog.ts";
|
|
31
|
+
export type { MoonName } from "./moon-catalog.ts";
|
|
32
|
+
|
|
33
|
+
// ── Cross-catalog union ────────────────────────────────────────────────────
|
|
34
|
+
// CosmicName is the full set of valid cosmicName values across all layers.
|
|
35
|
+
// Use the per-layer schemas (starNameSchema, planetNameSchema, moonNameSchema)
|
|
36
|
+
// for layer-specific validation; cosmicNameSchema accepts any catalog entry.
|
|
37
|
+
|
|
38
|
+
export type CosmicName =
|
|
39
|
+
| import("./star-catalog.ts").StarName
|
|
40
|
+
| import("./planet-catalog.ts").PlanetName
|
|
41
|
+
| import("./moon-catalog.ts").MoonName;
|
|
42
|
+
|
|
43
|
+
/** Runtime schema that accepts any name from any catalog. */
|
|
44
|
+
export const cosmicNameSchema = z.union([
|
|
45
|
+
z.enum(StarCatalog),
|
|
46
|
+
z.enum(PlanetCatalog),
|
|
47
|
+
z.enum(MoonCatalog),
|
|
48
|
+
]);
|