@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.
Files changed (403) hide show
  1. package/package.json +352 -0
  2. package/src/checks/index.ts +24 -0
  3. package/src/checks/lib/astro-site-url.ts +30 -0
  4. package/src/checks/lib/i18n.ts +30 -0
  5. package/src/checks/result-helpers.ts +102 -0
  6. package/src/checks/suppressions-config.ts +195 -0
  7. package/src/index.ts +14 -0
  8. package/src/integration/README.md +38 -0
  9. package/src/integration/adapters.ts +143 -0
  10. package/src/integration/crm-buffer.ts +491 -0
  11. package/src/integration/dispatch.ts +106 -0
  12. package/src/integration/funnel.ts +379 -0
  13. package/src/integration/index.ts +56 -0
  14. package/src/integration/lifecycle.ts +155 -0
  15. package/src/integration/orchestration.ts +439 -0
  16. package/src/integration/port-barrel.ts +124 -0
  17. package/src/integration/port.ts +143 -0
  18. package/src/integration/qstash.ts +134 -0
  19. package/src/integration/sharding.ts +133 -0
  20. package/src/integration/tests/deliver-event.test.ts +52 -0
  21. package/src/integration/tests/dispatch.test.ts +88 -0
  22. package/src/integration/tests/funnel-bridge.test.ts +46 -0
  23. package/src/integration/tests/hub-runtime.test.ts +128 -0
  24. package/src/integration/tests/lifecycle.test.ts +69 -0
  25. package/src/integration/tests/qstash.test.ts +83 -0
  26. package/src/integration/tests/sharding.test.ts +64 -0
  27. package/src/integration/vitest.config.ts +8 -0
  28. package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
  29. package/src/integration-adapter-supabase-crm/client.ts +605 -0
  30. package/src/integration-adapter-supabase-crm/index.ts +28 -0
  31. package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
  32. package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
  33. package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
  34. package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
  35. package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
  36. package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
  37. package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
  38. package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
  39. package/src/integration-adapter-supabase-crm/worker.ts +223 -0
  40. package/src/observability/conventions.ts +93 -0
  41. package/src/observability/env-resolver.ts +57 -0
  42. package/src/observability/index.ts +57 -0
  43. package/src/observability/metric-registry.ts +184 -0
  44. package/src/observability/otlp-converter.ts +125 -0
  45. package/src/observability/otlp-json.ts +135 -0
  46. package/src/observability/otlp-transport.ts +68 -0
  47. package/src/observability/pusher.ts +142 -0
  48. package/src/observability/redact.ts +27 -0
  49. package/src/observability/tests/conventions.test.ts +100 -0
  50. package/src/observability/tests/metric-registry.test.ts +117 -0
  51. package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
  52. package/src/observability/tests/otlp-converter.test.ts +157 -0
  53. package/src/observability/tests/otlp-json.test.ts +120 -0
  54. package/src/observability/tests/pusher.test.ts +75 -0
  55. package/src/observability/tests/redact.pbt.test.ts +71 -0
  56. package/src/observability/tests/redact.test.ts +37 -0
  57. package/src/observability/typed-refs.ts +137 -0
  58. package/src/observability/vitest.config.ts +8 -0
  59. package/src/ontology/analytics/matomo-binding.yaml +172 -0
  60. package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
  61. package/src/ontology/analytics/messkanon.yaml +151 -0
  62. package/src/ontology/archetype-registry.ts +61 -0
  63. package/src/ontology/archetypes/components/brand-label.yaml +19 -0
  64. package/src/ontology/archetypes/components/copyright.yaml +19 -0
  65. package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
  66. package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
  67. package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
  68. package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
  69. package/src/ontology/archetypes/components/layout.yaml +19 -0
  70. package/src/ontology/archetypes/components/live-photo.yaml +20 -0
  71. package/src/ontology/archetypes/components/material-credit.yaml +20 -0
  72. package/src/ontology/archetypes/components/media.yaml +21 -0
  73. package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
  74. package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
  75. package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
  76. package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
  77. package/src/ontology/archetypes/components/not-found.yaml +22 -0
  78. package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
  79. package/src/ontology/archetypes/components/passport-header.yaml +19 -0
  80. package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
  81. package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
  82. package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
  83. package/src/ontology/archetypes/components/person-profile.yaml +20 -0
  84. package/src/ontology/archetypes/components/pulsar.yaml +20 -0
  85. package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
  86. package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
  87. package/src/ontology/archetypes/components/social-meta.yaml +20 -0
  88. package/src/ontology/archetypes/components/structured-data.yaml +19 -0
  89. package/src/ontology/archetypes/index.json +1003 -0
  90. package/src/ontology/archetypes/index.yaml +821 -0
  91. package/src/ontology/archetypes/sections/approach.yaml +23 -0
  92. package/src/ontology/archetypes/sections/article-list.yaml +30 -0
  93. package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
  94. package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
  95. package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
  96. package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
  97. package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
  98. package/src/ontology/archetypes/sections/credits.yaml +29 -0
  99. package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
  100. package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
  101. package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
  102. package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
  103. package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
  104. package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
  105. package/src/ontology/archetypes/sections/hero.yaml +50 -0
  106. package/src/ontology/archetypes/sections/impact.yaml +23 -0
  107. package/src/ontology/archetypes/sections/markdown.yaml +43 -0
  108. package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
  109. package/src/ontology/archetypes/sections/navigation.yaml +20 -0
  110. package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
  111. package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
  112. package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
  113. package/src/ontology/archetypes/sections/people.yaml +48 -0
  114. package/src/ontology/archetypes/sections/price-card.yaml +50 -0
  115. package/src/ontology/archetypes/sections/problem.yaml +23 -0
  116. package/src/ontology/archetypes/sections/send-message.yaml +63 -0
  117. package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
  118. package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
  119. package/src/ontology/archetypes/sections/transparency.yaml +32 -0
  120. package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
  121. package/src/ontology/archetypes/sections/video-section.yaml +27 -0
  122. package/src/ontology/archetypes/sections/women.yaml +29 -0
  123. package/src/ontology/biome-token-projection.ts +229 -0
  124. package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
  125. package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
  126. package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
  127. package/src/ontology/blueprints/offer.yaml +39 -0
  128. package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
  129. package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
  130. package/src/ontology/blueprints/ratgeber.yaml +62 -0
  131. package/src/ontology/blueprints/website-local.yaml +309 -0
  132. package/src/ontology/blueprints/website-service.yaml +84 -0
  133. package/src/ontology/capabilities/lead.submit.yaml +44 -0
  134. package/src/ontology/cosmic/index.ts +48 -0
  135. package/src/ontology/cosmic/moon-catalog.ts +173 -0
  136. package/src/ontology/cosmic/planet-catalog.ts +82 -0
  137. package/src/ontology/cosmic/star-catalog.ts +337 -0
  138. package/src/ontology/enums.ts +159 -0
  139. package/src/ontology/external-surfaces/index.ts +158 -0
  140. package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
  141. package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
  142. package/src/ontology/external-surfaces/url-schema.yaml +95 -0
  143. package/src/ontology/growth/events/contact-email-click.yaml +21 -0
  144. package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
  145. package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
  146. package/src/ontology/growth/events/contact-route-click.yaml +21 -0
  147. package/src/ontology/growth/events/contact-submit.yaml +28 -0
  148. package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
  149. package/src/ontology/growth/events/cta-click.yaml +30 -0
  150. package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
  151. package/src/ontology/growth/events/donation-form-start.yaml +21 -0
  152. package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
  153. package/src/ontology/growth/events/donation-intent.yaml +29 -0
  154. package/src/ontology/growth/events/form-error.yaml +27 -0
  155. package/src/ontology/growth/events/form-start.yaml +21 -0
  156. package/src/ontology/growth/events/form-submit.yaml +21 -0
  157. package/src/ontology/growth/events/outbound-click.yaml +25 -0
  158. package/src/ontology/growth/events/page-view.yaml +24 -0
  159. package/src/ontology/growth/events/passport-view.yaml +28 -0
  160. package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
  161. package/src/ontology/index.ts +165 -0
  162. package/src/ontology/manifest.ts +344 -0
  163. package/src/ontology/operations/index.ts +1 -0
  164. package/src/ontology/schemas/biome.ts +303 -0
  165. package/src/ontology/schemas/capability.ts +104 -0
  166. package/src/ontology/schemas/constellation.ts +114 -0
  167. package/src/ontology/schemas/dns-records.ts +53 -0
  168. package/src/ontology/schemas/index.ts +95 -0
  169. package/src/ontology/schemas/manifest-resolver.ts +123 -0
  170. package/src/ontology/schemas/page-entry.ts +213 -0
  171. package/src/ontology/schemas/section-archetype.ts +109 -0
  172. package/src/ontology/schemas/site-family.ts +98 -0
  173. package/src/ontology/schemas/system/growth.ts +80 -0
  174. package/src/ontology/schemas/system/integrations.ts +143 -0
  175. package/src/ontology/schemas/system/manifest.ts +492 -0
  176. package/src/ontology/schemas/system/page-output.ts +99 -0
  177. package/src/ontology/schemas/system/release.ts +58 -0
  178. package/src/ontology/schemas/system/text.ts +58 -0
  179. package/src/ontology/schemas/system.ts +53 -0
  180. package/src/ontology/shared-section-props/body-fragments.ts +182 -0
  181. package/src/ontology/shared-section-props/catalog.ts +195 -0
  182. package/src/ontology/shared-section-props/common.ts +178 -0
  183. package/src/ontology/shared-section-props/index.ts +34 -0
  184. package/src/ontology/shared-section-props/visual-header.ts +163 -0
  185. package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
  186. package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
  187. package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
  188. package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
  189. package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
  190. package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
  191. package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
  192. package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
  193. package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
  194. package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
  195. package/src/ontology/tests/enums.test.ts +203 -0
  196. package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
  197. package/src/ontology/vitest.config.ts +8 -0
  198. package/src/passport/dht-sign.test.ts +99 -0
  199. package/src/passport/dht-sign.ts +73 -0
  200. package/src/passport/identity-sign.test.ts +134 -0
  201. package/src/passport/identity-sign.ts +85 -0
  202. package/src/passport/index.ts +53 -0
  203. package/src/passport/key-rotate.ts +133 -0
  204. package/src/passport/schema.ts +198 -0
  205. package/src/passport/sign.ts +225 -0
  206. package/src/passport/tests/schema.pbt.test.ts +93 -0
  207. package/src/passport/tests/schema.test.ts +222 -0
  208. package/src/passport/vitest.config.ts +8 -0
  209. package/src/share/agent/api-catalog.ts +77 -0
  210. package/src/share/agent/capability.ts +68 -0
  211. package/src/share/agent/dns-aid.test.ts +74 -0
  212. package/src/share/agent/dns-aid.ts +53 -0
  213. package/src/share/agent/fleet-catalog.ts +149 -0
  214. package/src/share/agent/index.ts +29 -0
  215. package/src/share/agent/knowledge.ts +96 -0
  216. package/src/share/agent/manifest.ts +126 -0
  217. package/src/share/agent/mcp-card.ts +63 -0
  218. package/src/share/agent/omit-empty.ts +77 -0
  219. package/src/share/agent/openapi.ts +157 -0
  220. package/src/share/agent/proof.ts +61 -0
  221. package/src/share/attribution-display.ts +86 -0
  222. package/src/share/check-hints.ts +38 -0
  223. package/src/share/content/entity-id.ts +65 -0
  224. package/src/share/content/index.ts +16 -0
  225. package/src/share/content/merge.ts +86 -0
  226. package/src/share/content/resolve-field-path.ts +39 -0
  227. package/src/share/content/substitute-deep.ts +47 -0
  228. package/src/share/content-discipline/index.ts +14 -0
  229. package/src/share/content-discipline/parsers.ts +66 -0
  230. package/src/share/content-discipline/types.ts +118 -0
  231. package/src/share/content-reference.ts +333 -0
  232. package/src/share/counter-utils.ts +75 -0
  233. package/src/share/css-value-normalize.ts +48 -0
  234. package/src/share/dev-props-validator.ts +131 -0
  235. package/src/share/entitlement.ts +172 -0
  236. package/src/share/env.d.ts +73 -0
  237. package/src/share/feature-policy.ts +367 -0
  238. package/src/share/formula-eval.ts +364 -0
  239. package/src/share/fs/index.ts +96 -0
  240. package/src/share/i18n/localization.ts +57 -0
  241. package/src/share/image-provider.ts +314 -0
  242. package/src/share/index.ts +86 -0
  243. package/src/share/knowledge/claim.ts +129 -0
  244. package/src/share/knowledge/derivation.ts +55 -0
  245. package/src/share/knowledge/freshness.ts +127 -0
  246. package/src/share/knowledge/index.ts +23 -0
  247. package/src/share/knowledge/ledger.ts +222 -0
  248. package/src/share/knowledge/plan.ts +122 -0
  249. package/src/share/knowledge/source.ts +170 -0
  250. package/src/share/legal/translation-policy.ts +133 -0
  251. package/src/share/material-credits.ts +181 -0
  252. package/src/share/middleware/language-redirect.ts +49 -0
  253. package/src/share/offer-capacity.ts +149 -0
  254. package/src/share/onboarding-yaml/index.ts +162 -0
  255. package/src/share/page.ts +351 -0
  256. package/src/share/redirects.test.ts +62 -0
  257. package/src/share/redirects.ts +54 -0
  258. package/src/share/rfc0042-utils.ts +95 -0
  259. package/src/share/runtime-context.ts +70 -0
  260. package/src/share/schemas/claim-records.ts +69 -0
  261. package/src/share/schemas/claims.ts +150 -0
  262. package/src/share/schemas/effects.ts +212 -0
  263. package/src/share/schemas/features.ts +147 -0
  264. package/src/share/schemas/horizontal-align.ts +22 -0
  265. package/src/share/schemas/icon-color.ts +27 -0
  266. package/src/share/schemas/index.ts +43 -0
  267. package/src/share/schemas/live-photo.ts +53 -0
  268. package/src/share/schemas/material-credit.ts +292 -0
  269. package/src/share/schemas/media.ts +220 -0
  270. package/src/share/schemas/navigation.ts +74 -0
  271. package/src/share/schemas/page-base.ts +33 -0
  272. package/src/share/schemas/participant.ts +247 -0
  273. package/src/share/schemas/person.ts +24 -0
  274. package/src/share/schemas/print.ts +93 -0
  275. package/src/share/schemas/section-background.ts +106 -0
  276. package/src/share/schemas/section-body.ts +138 -0
  277. package/src/share/schemas/section-cards.ts +37 -0
  278. package/src/share/schemas/section-cta.ts +74 -0
  279. package/src/share/schemas/section-header.ts +77 -0
  280. package/src/share/schemas/section-image.ts +77 -0
  281. package/src/share/schemas/section-motion.ts +52 -0
  282. package/src/share/schemas/section-shell.ts +63 -0
  283. package/src/share/schemas/section-stats.ts +37 -0
  284. package/src/share/schemas/site-background.ts +78 -0
  285. package/src/share/schemas/standard-list-item.ts +38 -0
  286. package/src/share/scripts/external-links.ts +45 -0
  287. package/src/share/scripts/gsap-counter.ts +168 -0
  288. package/src/share/scripts/gsap-mountain-journey.ts +236 -0
  289. package/src/share/scripts/gsap-parallax.ts +50 -0
  290. package/src/share/scripts/gsap-reveal.ts +65 -0
  291. package/src/share/scripts/gsap-stagger.ts +54 -0
  292. package/src/share/scripts/index.ts +25 -0
  293. package/src/share/scripts/inline-number-animation.ts +120 -0
  294. package/src/share/scripts/lenis.ts +109 -0
  295. package/src/share/scripts/live-photos.ts +250 -0
  296. package/src/share/scripts/lordicon.ts +94 -0
  297. package/src/share/scripts/orchestrator.ts +138 -0
  298. package/src/share/scripts/scheduler.ts +53 -0
  299. package/src/share/scripts/video-player.ts +116 -0
  300. package/src/share/semantic/ai.ts +140 -0
  301. package/src/share/semantic/block-extraction.ts +52 -0
  302. package/src/share/semantic/block-extractors/index.ts +502 -0
  303. package/src/share/semantic/breadcrumbs.ts +120 -0
  304. package/src/share/semantic/build-page.ts +309 -0
  305. package/src/share/semantic/business-projection.ts +278 -0
  306. package/src/share/semantic/derived-prices-loader.ts +36 -0
  307. package/src/share/semantic/extract.ts +118 -0
  308. package/src/share/semantic/feed.ts +124 -0
  309. package/src/share/semantic/ids.ts +76 -0
  310. package/src/share/semantic/image-sitemap.ts +153 -0
  311. package/src/share/semantic/index.ts +36 -0
  312. package/src/share/semantic/jsonld/article.ts +47 -0
  313. package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
  314. package/src/share/semantic/jsonld/collection-list.ts +30 -0
  315. package/src/share/semantic/jsonld/context.ts +46 -0
  316. package/src/share/semantic/jsonld/faq.ts +49 -0
  317. package/src/share/semantic/jsonld/initiative.ts +53 -0
  318. package/src/share/semantic/jsonld/organization.ts +101 -0
  319. package/src/share/semantic/jsonld/person.ts +71 -0
  320. package/src/share/semantic/jsonld/service.ts +80 -0
  321. package/src/share/semantic/jsonld/shared.ts +31 -0
  322. package/src/share/semantic/jsonld/types.ts +18 -0
  323. package/src/share/semantic/jsonld/webpage.ts +98 -0
  324. package/src/share/semantic/jsonld/website.ts +27 -0
  325. package/src/share/semantic/jsonld.ts +75 -0
  326. package/src/share/semantic/llms-policy.ts +74 -0
  327. package/src/share/semantic/llms.ts +394 -0
  328. package/src/share/semantic/markdown-hygiene.ts +68 -0
  329. package/src/share/semantic/markdown-twin-provenance.ts +242 -0
  330. package/src/share/semantic/models.ts +402 -0
  331. package/src/share/semantic/organization-profile.ts +160 -0
  332. package/src/share/semantic/output-projection.ts +131 -0
  333. package/src/share/semantic/page-builders/markdown-page.ts +84 -0
  334. package/src/share/semantic/page-markdown.ts +234 -0
  335. package/src/share/semantic/page-utils.ts +125 -0
  336. package/src/share/semantic/price-marker-resolver.ts +92 -0
  337. package/src/share/semantic/robots.ts +127 -0
  338. package/src/share/semantic/update-stamp.ts +136 -0
  339. package/src/share/shared-context.ts +177 -0
  340. package/src/share/string-utils.ts +19 -0
  341. package/src/share/tests/api-catalog.test.ts +97 -0
  342. package/src/share/tests/breadcrumbs.test.ts +126 -0
  343. package/src/share/tests/build-page-price-markers.test.ts +160 -0
  344. package/src/share/tests/capability.test.ts +107 -0
  345. package/src/share/tests/claim.test.ts +90 -0
  346. package/src/share/tests/content-ref-index.test.ts +328 -0
  347. package/src/share/tests/create-dev-props-validator.test.ts +38 -0
  348. package/src/share/tests/derivation.test.ts +39 -0
  349. package/src/share/tests/dev-props-validator.test.ts +88 -0
  350. package/src/share/tests/fleet-catalog.test.ts +134 -0
  351. package/src/share/tests/formula-eval.test.ts +619 -0
  352. package/src/share/tests/freshness.test.ts +60 -0
  353. package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
  354. package/src/share/tests/image-sitemap.test.ts +101 -0
  355. package/src/share/tests/jsonld-service.test.ts +282 -0
  356. package/src/share/tests/knowledge.test.ts +86 -0
  357. package/src/share/tests/ledger.test.ts +125 -0
  358. package/src/share/tests/llms-0789.test.ts +63 -0
  359. package/src/share/tests/manifest.test.ts +100 -0
  360. package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
  361. package/src/share/tests/mcp-card.test.ts +57 -0
  362. package/src/share/tests/onboarding-yaml.test.ts +111 -0
  363. package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
  364. package/src/share/tests/openapi.test.ts +116 -0
  365. package/src/share/tests/organization-jsonld.test.ts +74 -0
  366. package/src/share/tests/output-projection.test.ts +61 -0
  367. package/src/share/tests/plan.test.ts +97 -0
  368. package/src/share/tests/price-marker-resolver.test.ts +141 -0
  369. package/src/share/tests/proof.test.ts +72 -0
  370. package/src/share/tests/resolve-field-path.test.ts +52 -0
  371. package/src/share/tests/source.test.ts +81 -0
  372. package/src/share/tests/substitute-deep.test.ts +65 -0
  373. package/src/share/tests/text-normalize.pbt.test.ts +143 -0
  374. package/src/share/tests/text-normalize.test.ts +285 -0
  375. package/src/share/tests/twin-path.test.ts +43 -0
  376. package/src/share/text-normalize.ts +548 -0
  377. package/src/share/text-position.ts +19 -0
  378. package/src/share/types/hls-js-light.d.ts +16 -0
  379. package/src/share/visibility.ts +167 -0
  380. package/src/share/vitest.config.ts +8 -0
  381. package/src/share/wrap-inline-numbers.ts +139 -0
  382. package/src/surface/blueprint-schema.ts +314 -0
  383. package/src/surface/blueprint-types.ts +256 -0
  384. package/src/surface/blueprint.ts +300 -0
  385. package/src/surface/breaker.ts +57 -0
  386. package/src/surface/decision-composer.ts +156 -0
  387. package/src/surface/eligibility.ts +372 -0
  388. package/src/surface/evidence-records.ts +97 -0
  389. package/src/surface/fleet.ts +60 -0
  390. package/src/surface/geo.ts +170 -0
  391. package/src/surface/governance.ts +146 -0
  392. package/src/surface/index.ts +216 -0
  393. package/src/surface/io/index.ts +18 -0
  394. package/src/surface/io/surface-module-context-io.ts +60 -0
  395. package/src/surface/io/visibility-outcomes-io.ts +46 -0
  396. package/src/surface/module-context.ts +120 -0
  397. package/src/surface/substance.ts +161 -0
  398. package/src/surface/tests/eligibility.pbt.test.ts +137 -0
  399. package/src/surface/tests/eligibility.test.ts +302 -0
  400. package/src/surface/types.ts +289 -0
  401. package/src/surface/visibility.ts +57 -0
  402. package/src/surface/vitest.config.ts +8 -0
  403. 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
+ ]);