@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,104 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-0288: the closed capability catalog record schema — one YAML file per
5
+ AI-agent-invocable action (packages/werkstatt-site/src/domain/ontology/capabilities/*.yaml). The
6
+ input/output shape is a deliberately closed JSON-Schema subset chosen for
7
+ lossless projection to both OpenAPI (RFC-0289) and MCP tool schemas (RFC-0290).
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Do not resolve entitlements or active-capability logic here — that is
11
+ @warpgogol/werkstatt-shared/share/agent/capability.ts (resolveActiveCapabilities).</item>
12
+ <item>Do not widen the JSON-Schema subset beyond what OpenAPI + MCP both
13
+ accept verbatim — widening requires an RFC amending RFC-0288.</item>
14
+ </non-goals>
15
+ </MODULE_CONTRACT>
16
+ <CHANGE_SUMMARY>
17
+ <item>RFC-0288: initial capability record schema.</item>
18
+ </CHANGE_SUMMARY>
19
+ */
20
+
21
+ import { z } from "zod";
22
+
23
+ /** Localized string map: language code → string. At least one entry required. */
24
+ const localizedStringSchema = z
25
+ .record(z.string().min(1), z.string().min(1))
26
+ .refine((v) => Object.keys(v).length > 0, { message: "must declare at least one language" });
27
+
28
+ const capabilityPropertySchema = z
29
+ .object({
30
+ type: z.enum(["string", "boolean", "integer"]),
31
+ format: z.enum(["email", "uuid", "uri", "date"]).optional(),
32
+ minLength: z.number().int().nonnegative().optional(),
33
+ maxLength: z.number().int().positive().optional(),
34
+ })
35
+ .strict();
36
+
37
+ /**
38
+ * RFC-0288: the closed JSON-Schema subset. Deliberately small — every field
39
+ * here must be losslessly projectable to an OpenAPI 3.1 schema object AND an
40
+ * MCP tool inputSchema verbatim, with no transformation.
41
+ */
42
+ export const capabilityInputOutputSchema = z
43
+ .object({
44
+ type: z.literal("object"),
45
+ required: z.array(z.string().min(1)).optional(),
46
+ additionalProperties: z.literal(false),
47
+ properties: z.record(z.string().min(1), capabilityPropertySchema),
48
+ })
49
+ .strict()
50
+ .refine((schema) => (schema.required ?? []).every((key) => key in schema.properties), {
51
+ message: "required[] entries must all exist in properties",
52
+ });
53
+
54
+ export type CapabilityInputOutputSchema = z.infer<typeof capabilityInputOutputSchema>;
55
+
56
+ const capabilityIntegrationSchema = z
57
+ .object({
58
+ eventKind: z.enum(["lead", "message", "appointment"]),
59
+ source: z.literal("agent"),
60
+ })
61
+ .strict();
62
+
63
+ const capabilityRequiresSchema = z
64
+ .object({
65
+ entitlements: z.array(z.string().min(1)).default([]),
66
+ sections: z.array(z.string().min(1)).default([]),
67
+ })
68
+ .strict();
69
+
70
+ const capabilityHumanEquivalentSchema = z
71
+ .object({
72
+ sectionType: z.string().min(1),
73
+ })
74
+ .strict();
75
+
76
+ const capabilityLimitsSchema = z
77
+ .object({
78
+ perMinutePerIp: z.number().int().positive(),
79
+ maxPayloadBytes: z.number().int().positive(),
80
+ })
81
+ .strict();
82
+
83
+ /** RFC-0288: one capability catalog record (packages/werkstatt-site/src/domain/ontology/capabilities/<id>.yaml). */
84
+ export const capabilityRecordSchema = z
85
+ .object({
86
+ /** Dot-separated, lowercase; the file stem MUST equal this id. */
87
+ id: z
88
+ .string()
89
+ .regex(/^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)+$/, "id must be dot-separated lowercase"),
90
+ /** Integer; bump on breaking input/output change (by RFC). */
91
+ version: z.number().int().positive(),
92
+ kind: z.literal("action"),
93
+ title: localizedStringSchema,
94
+ description: localizedStringSchema,
95
+ input: capabilityInputOutputSchema,
96
+ output: capabilityInputOutputSchema,
97
+ integration: capabilityIntegrationSchema,
98
+ requires: capabilityRequiresSchema,
99
+ humanEquivalent: capabilityHumanEquivalentSchema,
100
+ limits: capabilityLimitsSchema,
101
+ })
102
+ .strict();
103
+
104
+ export type CapabilityRecord = z.infer<typeof capabilityRecordSchema>;
@@ -0,0 +1,114 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Zod schema for Constellation definition files (packages/werkstatt-site/src/domain/ontology/constellations/*.yaml).
5
+ A Constellation is a named, reusable composition pattern — an ordered sequence of
6
+ section archetypes that forms a proven page structure for a given intent
7
+ (DNA-23, RFC-0025).
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Do not parse YAML here; the caller is responsible for parsing.</item>
11
+ <item>Do not add rendering or runtime logic.</item>
12
+ </non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY>
15
+ <item>Wave 1 (RFC-0025): Initial creation.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ import { z } from "zod";
20
+ import { planetNameSchema } from "../cosmic/planet-catalog.ts";
21
+ import { starNameSchema } from "../cosmic/star-catalog.ts";
22
+
23
+ // ---------------------------------------------------------------------------
24
+ // Constellation slot schema
25
+ // ---------------------------------------------------------------------------
26
+
27
+ /**
28
+ * One step in the constellation sequence — references a section archetype by
29
+ * its cosmicName (PlanetName) and states why it appears at that position.
30
+ */
31
+ export const constellationSlotSchema = z.object({
32
+ /**
33
+ * The section cosmicName that occupies this position.
34
+ * **Exactly ONE Planet per slot.** If a constellation accepts more than one
35
+ * archetype at a given narrative position (e.g. "DNA-style feature list" OR
36
+ * "approach-style card grid"), model it as TWO separate slots, each marked
37
+ * `optional: true`. Do NOT introduce arrays/unions here — schema simplicity
38
+ * is the contract. See packages/AGENTS.md "Constellation slots".
39
+ * Must reference a value from PlanetCatalog.
40
+ */
41
+ cosmicName: planetNameSchema,
42
+
43
+ /**
44
+ * Human-readable label for this slot in documentation / tooling output.
45
+ * Example: "Value proposition hero", "Social proof band"
46
+ */
47
+ label: z.string().min(1),
48
+
49
+ /**
50
+ * Why this section appears at this position in the sequence.
51
+ * Describes the conversion / trust / narrative logic.
52
+ */
53
+ rationale: z.string().min(1),
54
+
55
+ /**
56
+ * When true, this slot is optional — the constellation is still valid
57
+ * without it. Validators warn but do not fail on missing optional slots.
58
+ * Default: false.
59
+ */
60
+ optional: z.boolean().optional().default(false),
61
+ });
62
+
63
+ export type ConstellationSlot = z.infer<typeof constellationSlotSchema>;
64
+
65
+ // ---------------------------------------------------------------------------
66
+ // Constellation schema
67
+ // ---------------------------------------------------------------------------
68
+
69
+ /**
70
+ * A Constellation definition — a named, reusable page-composition pattern.
71
+ * Stored as packages/werkstatt-site/src/domain/ontology/constellations/<slug>.yaml.
72
+ */
73
+ export const constellationSchema = z.object({
74
+ /**
75
+ * Stable kebab-case identifier for this constellation.
76
+ * Used as the reference key in system.yaml `constellations[]`.
77
+ * Example: "nonprofit-donation-funnel"
78
+ */
79
+ id: z
80
+ .string()
81
+ .regex(/^[a-z][a-z0-9-]*$/, "id must be kebab-case (lowercase letters, digits, hyphens)"),
82
+
83
+ /**
84
+ * Display name for tooling, docs, and the Cosmic Passport map.
85
+ * Example: "Nonprofit Donation Funnel"
86
+ */
87
+ name: z.string().min(1),
88
+
89
+ /**
90
+ * One-sentence description of the pattern's purpose and audience.
91
+ */
92
+ description: z.string().min(1),
93
+
94
+ /**
95
+ * The star (page) archetype this constellation is designed for.
96
+ * Ensures the composition pattern is matched to the right page layer.
97
+ */
98
+ forStar: starNameSchema,
99
+
100
+ /**
101
+ * Ordered sequence of section slots composing this constellation.
102
+ * Position is meaningful — validators check order compliance when
103
+ * constellation.compose.validate is run.
104
+ */
105
+ slots: z.array(constellationSlotSchema).min(1),
106
+
107
+ /**
108
+ * Semantic version of this constellation definition.
109
+ * Increment minor when slots are added; major when order changes.
110
+ */
111
+ version: z.string().regex(/^\d+\.\d+\.\d+(?:-[a-z0-9.-]+)?$/i, "version must be valid semver"),
112
+ });
113
+
114
+ export type Constellation = z.infer<typeof constellationSchema>;
@@ -0,0 +1,53 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-0753: Zod schema for DNS record declaration files (systems-cache/<id>/dns-records.yaml).
5
+ Defines the canonical structure for version-controlled DNS record declarations
6
+ that are synced to Cloudflare via the dns.record.* command family.
7
+ </purpose>
8
+ <non-goals>
9
+ <item>Do not define Cloudflare API response shapes — those live in the API client.</item>
10
+ <item>Do not include private key material — only public TXT values are declared.</item>
11
+ </non-goals>
12
+ </MODULE_CONTRACT>
13
+ <CHANGE_SUMMARY>
14
+ <item>RFC-0753: initial DNS record declaration schema — dnsRecordTypeSchema, dnsRecordDeclarationSchema, dnsRecordFileSchema.</item>
15
+ <item>RFC-0786: add ttl?: number field to dnsRecordDeclarationSchema for DNS-AID records.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ import { z } from "zod";
20
+
21
+ export const dnsRecordTypeSchema = z.enum([
22
+ "A",
23
+ "AAAA",
24
+ "CNAME",
25
+ "MX",
26
+ "TXT",
27
+ "SRV",
28
+ "CAA",
29
+ "SVCB",
30
+ "HTTPS",
31
+ ]);
32
+
33
+ export const dnsRecordDeclarationSchema = z.object({
34
+ name: z.string().min(1),
35
+ type: dnsRecordTypeSchema,
36
+ content: z.string(),
37
+ priority: z.number().int().min(0).max(65535).optional(),
38
+ proxied: z.boolean().optional().default(false),
39
+ ttl: z.number().int().min(1).max(86400).optional(),
40
+ comment: z.string().optional(),
41
+ });
42
+
43
+ export const dnsRecordFileSchema = z.object({
44
+ kind: z.literal("dns-records"),
45
+ schemaVersion: z.literal(1),
46
+ zone: z.string().min(1),
47
+ updatedAt: z.string(),
48
+ records: z.array(dnsRecordDeclarationSchema),
49
+ });
50
+
51
+ export type DnsRecordType = z.infer<typeof dnsRecordTypeSchema>;
52
+ export type DnsRecordDeclaration = z.infer<typeof dnsRecordDeclarationSchema>;
53
+ export type DnsRecordFile = z.infer<typeof dnsRecordFileSchema>;
@@ -0,0 +1,95 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Barrel export for @warpgogol/werkstatt-shared/ontology/schemas sub-path.
5
+ Re-exports the Constellation, Biome, SiteFamily, and SystemManifest schemas and types.
6
+ </purpose>
7
+ <non-goals>
8
+ <item>Do not introduce app-specific runtime composition or deployment behavior into this reusable package source file.</item>
9
+ </non-goals>
10
+ </MODULE_CONTRACT>
11
+ <CHANGE_SUMMARY>
12
+ <item>Wave 1 (RFC-0025): Initial creation.</item>
13
+ <item>RFC-0071: Re-export site-family contract and expanded biome surface.</item>
14
+ <item>RFC-0371: Re-export biome font entry schema and types.</item>
15
+ <item>Architecture review 2026-07-10: extracted platform operations schemas to @warpgogol/werkstatt-shared/ontology/operations; re-export getSectionPropsSchema from manifest-resolver.ts.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ export { constellationSchema, constellationSlotSchema } from "./constellation.ts";
20
+ export type { Constellation, ConstellationSlot } from "./constellation.ts";
21
+
22
+ export {
23
+ biomeSchema,
24
+ biomeAxesSchema,
25
+ biomeConstraintsSchema,
26
+ biomeFontEntrySchema,
27
+ biomeFontsSchema,
28
+ biomeGeometrySchema,
29
+ biomeMotionSchema,
30
+ biomePaletteSchema,
31
+ biomeProvenanceSchema,
32
+ biomeSiteBackgroundSchema,
33
+ biomeSpacingSchema,
34
+ biomeTypographySchema,
35
+ } from "./biome.ts";
36
+ export type {
37
+ Biome,
38
+ BiomeAxes,
39
+ BiomeConstraints,
40
+ BiomeFontEntry,
41
+ BiomeFontsConfig,
42
+ BiomeGeometry,
43
+ BiomeMotion,
44
+ BiomePalette,
45
+ BiomeProvenance,
46
+ BiomeSiteBackground,
47
+ BiomeSpacing,
48
+ BiomeTypography,
49
+ } from "./biome.ts";
50
+
51
+ export {
52
+ SiteFamilyContract,
53
+ siteFamilyDetectionSchema,
54
+ siteFamilyRecipeSchema,
55
+ siteFamilySchema,
56
+ } from "./site-family.ts";
57
+ export type { SiteFamily, SiteFamilyDetection, SiteFamilyRecipe } from "./site-family.ts";
58
+
59
+ export { sectionArchetypeSchema } from "./section-archetype.ts";
60
+ export type {
61
+ SectionArchetypeContract,
62
+ SectionArchetypeId,
63
+ SectionArchetypeLayoutHint,
64
+ } from "./section-archetype.ts";
65
+
66
+ export { systemManifestSchema } from "./system.ts";
67
+ export type { SystemManifest, SystemPagePin, SystemPlanetPin } from "./system.ts";
68
+
69
+ // Architecture review 2026-07-10: Re-export growthVendorSchema for @warpgogol/werkstatt-site/growth/config.ts.
70
+ export { growthVendorSchema } from "./system.ts";
71
+ export type { GrowthVendor } from "./system.ts";
72
+
73
+ export { PageEntrySchema, BlockEntrySchema } from "./page-entry.ts";
74
+ export type { PageEntry, BlockEntry } from "./page-entry.ts";
75
+ // getSectionPropsSchema is NOT re-exported here — it lives in manifest-resolver.ts
76
+ // which imports node:fs/promises. Re-exporting it from this barrel pulls Node-only
77
+ // modules into the Vite client bundle (growth/config.ts imports growthVendorSchema
78
+ // from this barrel). Node-side consumers import from
79
+ // @warpgogol/werkstatt-shared/ontology/schemas/manifest-resolver directly.
80
+
81
+ // RFC-0288: Agent Surface closed capability catalog record.
82
+ export { capabilityInputOutputSchema, capabilityRecordSchema } from "./capability.ts";
83
+ export type { CapabilityInputOutputSchema, CapabilityRecord } from "./capability.ts";
84
+
85
+ // RFC-0753: DNS record declaration file schema
86
+ export {
87
+ dnsRecordTypeSchema,
88
+ dnsRecordDeclarationSchema,
89
+ dnsRecordFileSchema,
90
+ } from "./dns-records.ts";
91
+ export type { DnsRecordType, DnsRecordDeclaration, DnsRecordFile } from "./dns-records.ts";
92
+
93
+ // Platform operations schemas (handoff, sternsystem, werkstatt, mission,
94
+ // release, leitstand, notausgang, materialization, artifact-store,
95
+ // naming-policy) have been extracted to @warpgogol/werkstatt-shared/ontology/operations.
@@ -0,0 +1,123 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Manifest resolver: reads section/component manifest YAML from packages/ui/src
5
+ and returns the composed propsSchema for a given cosmicName. Concentrates all
6
+ filesystem I/O, YAML parsing, and fragment composition behind one interface.
7
+ </purpose>
8
+ <non-goals>
9
+ <item>Do not define Zod schemas here — pure resolution and I/O.</item>
10
+ <item>Do not validate cross-system.yaml references — that is page.block.validate's job.</item>
11
+ </non-goals>
12
+ </MODULE_CONTRACT>
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
+ <item>RFC-0484: suppress console.debug for directories without manifests — group directories are expected to have none.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ import { readdir, readFile } from "node:fs/promises";
20
+ import { join } from "node:path";
21
+ import { parse as parseYaml } from "yaml";
22
+ import { sectionManifestSchema } from "../manifest.ts";
23
+ import { composeManifestPropsSchema } from "../shared-section-props/index.ts";
24
+
25
+ /**
26
+ * Reads the manifest YAML for the section assigned to `planetName` and returns
27
+ * its `propsSchema` (JSON Schema object) along with the section's `semanticId`
28
+ * and current `version`.
29
+ *
30
+ * Returns null when no manifest is found for the given planet name, or when
31
+ * the manifest has no `propsSchema` declared.
32
+ *
33
+ * @param cosmicName — PlanetCatalog or passport-reserved MoonCatalog name
34
+ * @param packagesUiRoot — absolute path to packages/ui/src (for locating manifests)
35
+ *
36
+ * Usage (in page.block.validate):
37
+ * ```ts
38
+ * const schema = await getSectionPropsSchema("Europa", "/workspace/packages/ui/src");
39
+ * ```
40
+ */
41
+ export async function getSectionPropsSchema(
42
+ cosmicName: string,
43
+ packagesUiRoot: string,
44
+ ): Promise<{
45
+ propsSchema: Record<string, unknown>;
46
+ semanticId: string;
47
+ version: string;
48
+ } | null> {
49
+ // Scan section AND component manifests — the five PASSPORT-RESERVED moons
50
+ // resolve to component manifests (passport components are invoked as
51
+ // page-blocks on cosmic/passport and cosmic/star-map routes — RFC-0028).
52
+ const candidates: Array<{ dir: string; layer: "sections" | "components" }> = [];
53
+ for (const layer of ["sections", "components"] as const) {
54
+ const layerDir = join(packagesUiRoot, layer);
55
+ try {
56
+ const entries = await readdir(layerDir);
57
+ for (const e of entries) candidates.push({ dir: e, layer });
58
+ } catch (err) {
59
+ console.debug(
60
+ `[manifest-resolver] ${layerDir} not readable — skipping (${err instanceof Error ? err.message : String(err)})`,
61
+ );
62
+ }
63
+ }
64
+
65
+ for (const { dir, layer } of candidates) {
66
+ const layerSuffix = layer === "sections" ? "-section" : "-component";
67
+ const layerDir = join(packagesUiRoot, layer);
68
+ const manifestPath = join(layerDir, dir, `${dir}${layerSuffix}.manifest.yaml`);
69
+ const manifestPathAlt = join(layerDir, dir, `${dir}.manifest.yaml`);
70
+
71
+ let raw: string | null = null;
72
+ try {
73
+ raw = await readFile(manifestPath, "utf8");
74
+ } catch {
75
+ try {
76
+ raw = await readFile(manifestPathAlt, "utf8");
77
+ } catch {
78
+ // No manifest file found for this directory — expected for group
79
+ // directories (effects, section-body, seo) that contain sub-components
80
+ // but are not components themselves. Skip silently (RFC-0484).
81
+ continue;
82
+ }
83
+ }
84
+
85
+ if (!raw) continue;
86
+
87
+ let parsed: unknown;
88
+ try {
89
+ parsed = parseYaml(raw);
90
+ } catch (err) {
91
+ console.debug(
92
+ `[manifest-resolver] YAML parse failed for ${dir}: ${err instanceof Error ? err.message : String(err)}`,
93
+ );
94
+ continue;
95
+ }
96
+
97
+ const result = sectionManifestSchema.safeParse(parsed);
98
+ if (!result.success) continue;
99
+
100
+ if (result.data.cosmicName === cosmicName) {
101
+ const compose = result.data.propsSchemaCompose;
102
+ const local = result.data.propsSchema;
103
+
104
+ // RFC-0101 + RFC-0102 + RFC-0103: when the manifest declares
105
+ // propsSchemaCompose, merge the referenced shared fragments before
106
+ // validation. A manifest without either field disables strict prop
107
+ // validation (existing behaviour preserved).
108
+ if (!compose && !local) return null;
109
+
110
+ const composed = composeManifestPropsSchema({
111
+ compose,
112
+ local: local as Record<string, unknown> | undefined,
113
+ });
114
+ return {
115
+ propsSchema: composed,
116
+ semanticId: result.data.semanticId,
117
+ version: result.data.version,
118
+ };
119
+ }
120
+ }
121
+
122
+ return null;
123
+ }