@cosmicdrift/kumiko-bundled-features 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/package.json +2 -2
  2. package/src/__tests__/env-schemas.test.ts +1 -1
  3. package/src/__tests__/es-ops-e2e.integration.ts +10 -9
  4. package/src/audit/__tests__/audit.integration.ts +3 -3
  5. package/src/audit/handlers/list.query.ts +39 -51
  6. package/src/auth-email-password/__tests__/account-lockout-no-redis.integration.ts +4 -3
  7. package/src/auth-email-password/__tests__/account-lockout.integration.ts +4 -3
  8. package/src/auth-email-password/__tests__/auth-claims.integration.ts +5 -4
  9. package/src/auth-email-password/__tests__/auth.integration.ts +4 -3
  10. package/src/auth-email-password/__tests__/confirm-token-flow.test.ts +1 -1
  11. package/src/auth-email-password/__tests__/email-templates.test.ts +1 -1
  12. package/src/auth-email-password/__tests__/email-verification.integration.ts +7 -10
  13. package/src/auth-email-password/__tests__/identity-v3-hash.test.ts +1 -1
  14. package/src/auth-email-password/__tests__/identity-v3-login.integration.ts +4 -3
  15. package/src/auth-email-password/__tests__/invite-flow.integration.ts +16 -43
  16. package/src/auth-email-password/__tests__/multi-roles.integration.ts +6 -9
  17. package/src/auth-email-password/__tests__/password-reset.integration.ts +8 -7
  18. package/src/auth-email-password/__tests__/public-routes-rate-limit.integration.ts +4 -3
  19. package/src/auth-email-password/__tests__/seed-admin.integration.ts +19 -32
  20. package/src/auth-email-password/__tests__/session-callbacks.integration.ts +6 -5
  21. package/src/auth-email-password/__tests__/session-strict-mode.integration.ts +1 -1
  22. package/src/auth-email-password/__tests__/signed-token.test.ts +1 -1
  23. package/src/auth-email-password/__tests__/signup-flow.integration.ts +11 -15
  24. package/src/auth-email-password/handlers/invite-accept-with-login.write.ts +26 -26
  25. package/src/auth-email-password/handlers/invite-accept.write.ts +24 -21
  26. package/src/auth-email-password/handlers/invite-create.write.ts +3 -8
  27. package/src/auth-email-password/handlers/invite-signup-complete.write.ts +20 -17
  28. package/src/auth-email-password/handlers/signup-confirm.write.ts +3 -7
  29. package/src/auth-email-password/seeding.ts +1 -1
  30. package/src/auth-email-password/web/__tests__/auth-gate.test.tsx +1 -2
  31. package/src/auth-email-password/web/__tests__/forgot-password-screen.test.tsx +10 -19
  32. package/src/auth-email-password/web/__tests__/login-screen.test.tsx +12 -18
  33. package/src/auth-email-password/web/__tests__/reset-password-screen.test.tsx +12 -17
  34. package/src/auth-email-password/web/__tests__/session-roles.test.ts +1 -1
  35. package/src/auth-email-password/web/__tests__/tenant-switcher.test.tsx +1 -8
  36. package/src/auth-email-password/web/__tests__/test-utils.tsx +4 -8
  37. package/src/auth-email-password/web/__tests__/user-menu.test.tsx +2 -8
  38. package/src/auth-email-password/web/__tests__/verify-email-screen.test.tsx +10 -15
  39. package/src/billing-foundation/__tests__/billing-foundation.integration.ts +1 -1
  40. package/src/billing-foundation/__tests__/feature.test.ts +1 -1
  41. package/src/billing-foundation/__tests__/webhook-handler.test.ts +6 -5
  42. package/src/billing-foundation/db/queries/subscription-projection.ts +15 -0
  43. package/src/billing-foundation/get-subscription-for-tenant.ts +2 -6
  44. package/src/billing-foundation/handlers/create-portal-session.write.ts +2 -2
  45. package/src/billing-foundation/handlers/list-subscriptions.query.ts +4 -1
  46. package/src/billing-foundation/projection.ts +32 -13
  47. package/src/cap-counter/__tests__/cap-counter.integration.ts +1 -1
  48. package/src/cap-counter/__tests__/enforce-cap.test.ts +37 -32
  49. package/src/cap-counter/__tests__/with-cap-enforcement.integration.ts +1 -1
  50. package/src/cap-counter/enforce-cap.ts +14 -20
  51. package/src/cap-counter/handlers/get-counter.query.ts +7 -13
  52. package/src/cap-counter/handlers/increment.write.ts +2 -2
  53. package/src/cap-counter/handlers/mark-soft-warned.write.ts +2 -2
  54. package/src/channel-in-app/handlers/inbox.query.ts +7 -13
  55. package/src/channel-in-app/handlers/mark-all-read.write.ts +7 -9
  56. package/src/channel-in-app/handlers/mark-read.write.ts +8 -14
  57. package/src/channel-in-app/handlers/unread-count.query.ts +10 -9
  58. package/src/channel-in-app/in-app-channel.ts +10 -12
  59. package/src/channel-in-app/tables.ts +1 -1
  60. package/src/compliance-profiles/__tests__/compliance-profiles.integration.ts +1 -1
  61. package/src/compliance-profiles/__tests__/seeding.integration.ts +1 -1
  62. package/src/compliance-profiles/handlers/for-tenant.query.ts +4 -7
  63. package/src/compliance-profiles/handlers/needs-profile.query.ts +4 -7
  64. package/src/compliance-profiles/handlers/set-profile.write.ts +5 -7
  65. package/src/compliance-profiles/resolve-for-tenant.ts +5 -7
  66. package/src/compliance-profiles/schema/profile-selection.ts +2 -2
  67. package/src/compliance-profiles/seeding.ts +4 -7
  68. package/src/config/__tests__/app-overrides.test.ts +1 -1
  69. package/src/config/__tests__/cascade.integration.ts +1 -1
  70. package/src/config/__tests__/config.integration.ts +8 -27
  71. package/src/config/db/queries/resolver.ts +47 -0
  72. package/src/config/handlers/__tests__/prepare-config-write.test.ts +1 -1
  73. package/src/config/resolver.ts +14 -62
  74. package/src/config/table.ts +4 -4
  75. package/src/config/write-helpers.ts +7 -11
  76. package/src/custom-fields/__tests__/audit-integration.integration.ts +6 -6
  77. package/src/custom-fields/__tests__/custom-fields.integration.ts +7 -7
  78. package/src/custom-fields/__tests__/feature.test.ts +1 -1
  79. package/src/custom-fields/__tests__/field-access.integration.ts +6 -6
  80. package/src/custom-fields/__tests__/quota.integration.ts +6 -6
  81. package/src/custom-fields/__tests__/retention.integration.ts +12 -10
  82. package/src/custom-fields/__tests__/user-data-rights.integration.ts +27 -17
  83. package/src/custom-fields/__tests__/wire-for-entity.test.ts +5 -5
  84. package/src/custom-fields/db/queries/field-access.ts +16 -0
  85. package/src/custom-fields/db/queries/projection.ts +43 -0
  86. package/src/custom-fields/db/queries/quota.ts +14 -0
  87. package/src/custom-fields/db/queries/retention.ts +39 -0
  88. package/src/custom-fields/db/queries/user-data-rights.ts +54 -0
  89. package/src/custom-fields/lib/field-access.ts +2 -41
  90. package/src/custom-fields/lib/quota.ts +2 -25
  91. package/src/custom-fields/run-retention.ts +19 -21
  92. package/src/custom-fields/wire-for-entity.ts +30 -23
  93. package/src/custom-fields/wire-user-data-rights.ts +33 -85
  94. package/src/data-retention/__tests__/data-retention.integration.ts +1 -1
  95. package/src/data-retention/__tests__/keep-for.test.ts +1 -1
  96. package/src/data-retention/__tests__/override-schema.test.ts +1 -1
  97. package/src/data-retention/__tests__/policy-for.integration.ts +1 -1
  98. package/src/data-retention/__tests__/resolver.test.ts +1 -1
  99. package/src/data-retention/handlers/policy-for.query.ts +5 -8
  100. package/src/data-retention/resolve-for-tenant.ts +6 -8
  101. package/src/data-retention/schema/tenant-retention-override.ts +2 -2
  102. package/src/delivery/__tests__/delivery-events.integration.ts +8 -21
  103. package/src/delivery/__tests__/delivery.integration.ts +100 -190
  104. package/src/delivery/db/queries/preferences.ts +30 -0
  105. package/src/delivery/delivery-service.ts +8 -36
  106. package/src/delivery/feature.ts +2 -1
  107. package/src/delivery/handlers/log.query.ts +5 -7
  108. package/src/delivery/handlers/preferences.query.ts +2 -5
  109. package/src/delivery/tables.ts +26 -1
  110. package/src/delivery/upsert-preference.ts +8 -14
  111. package/src/feature-toggles/__tests__/feature-toggles.integration.ts +30 -30
  112. package/src/feature-toggles/__tests__/registered-system-tenant.test.ts +7 -6
  113. package/src/feature-toggles/db/queries/toggle-state.ts +25 -0
  114. package/src/feature-toggles/feature.ts +16 -2
  115. package/src/feature-toggles/global-feature-state-table.ts +1 -1
  116. package/src/feature-toggles/handlers/list.query.ts +9 -2
  117. package/src/feature-toggles/handlers/registered.query.ts +3 -7
  118. package/src/feature-toggles/handlers/set.write.ts +37 -25
  119. package/src/feature-toggles/toggle-runtime.ts +3 -6
  120. package/src/file-foundation/__tests__/feature.test.ts +1 -1
  121. package/src/file-foundation/__tests__/file-foundation.integration.ts +1 -1
  122. package/src/file-provider-inmemory/__tests__/feature.test.ts +1 -1
  123. package/src/file-provider-s3/__tests__/feature.test.ts +1 -1
  124. package/src/files/__tests__/files.integration.ts +18 -7
  125. package/src/files/schema/file-ref.ts +1 -1
  126. package/src/files-provider-s3/__tests__/env-helper.test.ts +1 -1
  127. package/src/files-provider-s3/__tests__/s3-provider.integration.ts +1 -1
  128. package/src/files-provider-s3/__tests__/s3-provider.test.ts +1 -1
  129. package/src/jobs/__tests__/job-system-user.integration.ts +1 -1
  130. package/src/jobs/__tests__/jobs-events.integration.ts +8 -21
  131. package/src/jobs/__tests__/jobs-feature.integration.ts +1 -1
  132. package/src/jobs/feature.ts +22 -14
  133. package/src/jobs/handlers/detail.query.ts +10 -8
  134. package/src/jobs/handlers/list.query.ts +9 -21
  135. package/src/jobs/handlers/retry.write.ts +2 -7
  136. package/src/jobs/job-run-logger.ts +3 -9
  137. package/src/jobs/job-run-table.ts +49 -17
  138. package/src/legal-pages/__tests__/legal-pages.integration.ts +1 -1
  139. package/src/mail-foundation/__tests__/feature.test.ts +1 -1
  140. package/src/mail-foundation/__tests__/mail-foundation.integration.ts +1 -1
  141. package/src/mail-transport-inmemory/__tests__/feature.test.ts +1 -1
  142. package/src/mail-transport-smtp/__tests__/feature.test.ts +1 -1
  143. package/src/rate-limiting/__tests__/rate-limiting.integration.ts +1 -1
  144. package/src/renderer-foundation/__tests__/api.test.ts +2 -2
  145. package/src/renderer-foundation/__tests__/collect-plugins.integration.ts +1 -1
  146. package/src/renderer-simple/__tests__/adapter.test.ts +2 -2
  147. package/src/renderer-simple/__tests__/simple-renderer.test.ts +1 -1
  148. package/src/secrets/__tests__/require-secrets-context.test.ts +6 -5
  149. package/src/secrets/__tests__/rotate.integration.ts +6 -9
  150. package/src/secrets/__tests__/secrets-events.integration.ts +6 -12
  151. package/src/secrets/__tests__/secrets.integration.ts +6 -11
  152. package/src/secrets/db/queries/read.ts +16 -0
  153. package/src/secrets/handlers/list.query.ts +16 -17
  154. package/src/secrets/handlers/rotate.job.ts +8 -12
  155. package/src/secrets/secrets-context.ts +9 -21
  156. package/src/secrets/table.ts +1 -1
  157. package/src/sessions/__tests__/cleanup.integration.ts +8 -6
  158. package/src/sessions/__tests__/password-auto-revoke.integration.ts +7 -6
  159. package/src/sessions/__tests__/sessions.integration.ts +23 -38
  160. package/src/sessions/__tests__/test-helpers.ts +1 -1
  161. package/src/sessions/db/queries/cleanup.ts +21 -0
  162. package/src/sessions/handlers/cleanup.job.ts +6 -29
  163. package/src/sessions/handlers/list.query.ts +24 -24
  164. package/src/sessions/handlers/mine.query.ts +24 -23
  165. package/src/sessions/handlers/revoke-all-for-user.write.ts +7 -11
  166. package/src/sessions/handlers/revoke-all-others.write.ts +7 -12
  167. package/src/sessions/handlers/revoke.write.ts +11 -18
  168. package/src/sessions/schema/user-session.ts +2 -2
  169. package/src/sessions/session-callbacks.ts +19 -21
  170. package/src/subscription-mollie/__tests__/feature.test.ts +1 -1
  171. package/src/subscription-mollie/__tests__/mollie-foundation.integration.ts +1 -1
  172. package/src/subscription-mollie/__tests__/verify-webhook.test.ts +8 -7
  173. package/src/subscription-stripe/__tests__/feature.test.ts +1 -1
  174. package/src/subscription-stripe/__tests__/plugin-methods.test.ts +14 -15
  175. package/src/subscription-stripe/__tests__/stripe-foundation.integration.ts +1 -1
  176. package/src/subscription-stripe/__tests__/verify-webhook.test.ts +14 -14
  177. package/src/subscription-stripe/verify-webhook.ts +1 -1
  178. package/src/template-resolver/__tests__/handlers.integration.ts +1 -1
  179. package/src/template-resolver/__tests__/template-resolver.integration.ts +3 -2
  180. package/src/template-resolver/api.ts +7 -13
  181. package/src/template-resolver/handlers/archive.write.ts +4 -7
  182. package/src/template-resolver/handlers/find-by-id.query.ts +4 -7
  183. package/src/template-resolver/handlers/list.query.ts +13 -21
  184. package/src/template-resolver/handlers/publish.write.ts +4 -7
  185. package/src/template-resolver/handlers/upsert-system.write.ts +7 -10
  186. package/src/template-resolver/handlers/upsert-tenant.write.ts +7 -10
  187. package/src/template-resolver/table.ts +2 -5
  188. package/src/tenant/__tests__/multi-tenant.integration.ts +1 -1
  189. package/src/tenant/__tests__/seed-testing.integration.ts +19 -45
  190. package/src/tenant/__tests__/tenant.integration.ts +1 -1
  191. package/src/tenant/handlers/active-tenant-ids.query.ts +3 -8
  192. package/src/tenant/handlers/add-member.write.ts +6 -8
  193. package/src/tenant/handlers/cancel-invitation.write.ts +5 -7
  194. package/src/tenant/handlers/invitations.query.ts +5 -10
  195. package/src/tenant/handlers/me.query.ts +2 -3
  196. package/src/tenant/handlers/members.query.ts +4 -5
  197. package/src/tenant/handlers/memberships.query.ts +2 -5
  198. package/src/tenant/handlers/remove-member.write.ts +6 -8
  199. package/src/tenant/handlers/resolve-user-ids.query.ts +6 -16
  200. package/src/tenant/handlers/update-member-roles.write.ts +6 -8
  201. package/src/tenant/invitation-table.ts +2 -5
  202. package/src/tenant/membership-table.ts +3 -6
  203. package/src/tenant/schema/tenant.ts +2 -2
  204. package/src/tenant/seeding.ts +12 -18
  205. package/src/text-content/README.md +1 -1
  206. package/src/text-content/__tests__/text-content.integration.ts +2 -2
  207. package/src/text-content/api.ts +2 -9
  208. package/src/text-content/handlers/by-slug.query.ts +6 -9
  209. package/src/text-content/handlers/by-tenant.query.ts +2 -2
  210. package/src/text-content/handlers/set.write.ts +7 -9
  211. package/src/text-content/seeding.ts +6 -9
  212. package/src/text-content/table.ts +2 -2
  213. package/src/text-content/web/__tests__/editor-read-only.test.tsx +31 -45
  214. package/src/text-content/web/__tests__/group-blocks.test.ts +1 -18
  215. package/src/text-content/web/client-plugin.tsx +11 -23
  216. package/src/tier-engine/__tests__/auto-default-tier.integration.ts +10 -16
  217. package/src/tier-engine/__tests__/compose-app.test.ts +1 -1
  218. package/src/tier-engine/__tests__/drift.test.ts +1 -1
  219. package/src/tier-engine/__tests__/resolver.integration.ts +6 -6
  220. package/src/tier-engine/__tests__/tier-engine.integration.ts +1 -1
  221. package/src/tier-engine/feature.ts +9 -16
  222. package/src/user/__tests__/seed-testing.integration.ts +10 -22
  223. package/src/user/__tests__/user-status.test.ts +1 -1
  224. package/src/user/__tests__/user.integration.ts +6 -5
  225. package/src/user/handlers/create.write.ts +5 -7
  226. package/src/user/handlers/find-for-auth.query.ts +5 -7
  227. package/src/user/schema/user.ts +2 -2
  228. package/src/user/seeding.ts +2 -3
  229. package/src/user-data-rights/__tests__/audit-log.integration.ts +24 -12
  230. package/src/user-data-rights/__tests__/cross-data-matrix.integration.ts +64 -37
  231. package/src/user-data-rights/__tests__/download.integration.ts +29 -46
  232. package/src/user-data-rights/__tests__/export-job-idempotency.integration.ts +35 -28
  233. package/src/user-data-rights/__tests__/export-job-schema.test.ts +2 -2
  234. package/src/user-data-rights/__tests__/policy-to-strategy.test.ts +1 -1
  235. package/src/user-data-rights/__tests__/request-cancel-deletion.integration.ts +11 -15
  236. package/src/user-data-rights/__tests__/request-deletion-callback.integration.ts +10 -12
  237. package/src/user-data-rights/__tests__/request-export.integration.ts +23 -16
  238. package/src/user-data-rights/__tests__/restriction-flow.integration.ts +24 -32
  239. package/src/user-data-rights/__tests__/run-export-jobs.integration.ts +142 -137
  240. package/src/user-data-rights/__tests__/run-forget-cleanup.integration.ts +46 -28
  241. package/src/user-data-rights/__tests__/run-user-export.integration.ts +20 -14
  242. package/src/user-data-rights/__tests__/token-helpers.test.ts +1 -1
  243. package/src/user-data-rights/__tests__/user-data-rights.integration.ts +1 -1
  244. package/src/user-data-rights/__tests__/zip-path.test.ts +1 -1
  245. package/src/user-data-rights/audit-download.ts +3 -3
  246. package/src/user-data-rights/db/queries/export-jobs.ts +23 -0
  247. package/src/user-data-rights/db/queries/forget-cleanup.ts +13 -0
  248. package/src/user-data-rights/handlers/cancel-deletion.write.ts +28 -22
  249. package/src/user-data-rights/handlers/download-by-job.query.ts +11 -21
  250. package/src/user-data-rights/handlers/download-by-token.query.ts +20 -35
  251. package/src/user-data-rights/handlers/export-status.query.ts +19 -33
  252. package/src/user-data-rights/handlers/lift-restriction.write.ts +7 -12
  253. package/src/user-data-rights/handlers/list-download-attempts.query.ts +14 -23
  254. package/src/user-data-rights/handlers/my-audit-log.query.ts +33 -23
  255. package/src/user-data-rights/handlers/request-deletion.write.ts +15 -15
  256. package/src/user-data-rights/handlers/request-export.write.ts +7 -11
  257. package/src/user-data-rights/handlers/restrict-account.write.ts +12 -12
  258. package/src/user-data-rights/run-export-jobs.ts +20 -60
  259. package/src/user-data-rights/run-forget-cleanup.ts +19 -33
  260. package/src/user-data-rights/run-user-export.ts +4 -6
  261. package/src/user-data-rights/schema/download-attempt.ts +2 -2
  262. package/src/user-data-rights/schema/download-token.ts +2 -2
  263. package/src/user-data-rights/schema/export-job.ts +2 -3
  264. package/src/user-data-rights-defaults/__tests__/user-data-rights-defaults.integration.ts +37 -30
  265. package/src/user-data-rights-defaults/db/queries/user-hook.ts +17 -0
  266. package/src/user-data-rights-defaults/hooks/file-ref.userdata-hook.ts +12 -27
  267. package/src/user-data-rights-defaults/hooks/user.userdata-hook.ts +16 -18
  268. package/CHANGELOG.md +0 -689
package/CHANGELOG.md DELETED
@@ -1,689 +0,0 @@
1
- # @cosmicdrift/kumiko-bundled-features
2
-
3
- ## 0.14.0
4
-
5
- ### Patch Changes
6
-
7
- - @cosmicdrift/kumiko-framework@0.14.0
8
- - @cosmicdrift/kumiko-dispatcher-live@0.14.0
9
- - @cosmicdrift/kumiko-renderer@0.14.0
10
- - @cosmicdrift/kumiko-renderer-web@0.14.0
11
-
12
- ## 0.13.0
13
-
14
- ### Minor Changes
15
-
16
- - 7f56b2f: **Framework**: add `JsonbFieldDef` + `createJsonbField()` primitive. Schema-less jsonb-Spalte (default `{}`, NOT NULL) für tenant-defined extension-data, AI-inferred metadata, free-form config-blobs. Vs. `embedded` (typed sub-schema): jsonb akzeptiert beliebige keys. Table-builder + schema-builder + e2e-generator alle aktualisiert.
17
-
18
- **custom-fields-Bundle (B2)**: ergänzt B1 um Custom-Field-VALUES:
19
-
20
- - `customField.set` + `customField.cleared` Event-Types (auf host-aggregate stream)
21
- - `set-custom-field` + `clear-custom-field` write-handlers (emit events)
22
- - `r.extendsRegistrar("customFields")` für consumer opt-in via `useExtension`
23
- - `customFieldsField()` helper für entity-fields-definition
24
- - `wireCustomFieldsFor(r, entityName, entityTable)` consumer-side-API registriert:
25
- - `r.useExtension("customFields", entity)` opt-in marker
26
- - MultiStreamProjection: customField.set/.cleared/fieldDefinition.deleted → UPDATE entityTable.customFields jsonb (jsonb_set / minus-operator)
27
- - `r.entityHook("postQuery", entity, ...)` — flatten row.customFields auf API-root (Spec-Promise "indistinguishable von Stammfeldern")
28
- - `r.searchPayloadExtension(entity, ...)` — customFields-keys flach ins Meilisearch-Index (F3 wiring)
29
-
30
- **Out-of-B2** (future iterations): cross-scope-conflict (tenant override system fieldKey), cap-counter quota, user-data-rights anonymization, value-validation gegen fieldDefinition.serializedField, system+tenant UNION-read.
31
-
32
- Part of custom-fields-bundle Sprint Phase B2 (Plan-Doc: kumiko-platform/docs/plans/custom-fields-sprint.md).
33
-
34
- - 9121928: T1 — integration tests for custom-fields bundle. 6 full-stack scenarios via setupTestStack:
35
-
36
- - Define field → set value → query: customField lands flat in entity-response (postQuery hook + MSP)
37
- - Clear: fieldKey gone from response after clear-custom-field
38
- - Multiple fields on same entity: all merge flat
39
- - Entity without customField values: still queryable
40
- - fieldDefinition-delete cascade: orphan values removed from all entity-rows via MSP
41
- - Last-Wins on concurrent set: last value wins (unsafeAppendEvent without expectedVersion)
42
-
43
- Plus bugfix: Event-short-name-constants haben jetzt kebab-dashes statt Punkten (toKebab collapsed dots → Registry-Drift bei type-string-templates).
44
-
45
- - 72518fa: custom-fields: per-field `fieldAccess.write` enforcement (T1.5b).
46
-
47
- `set-custom-field` and `clear-custom-field` handlers now read `fieldDefinition.serializedField.fieldAccess.write[]` and reject with `unprocessable` + `reason: "field_access_denied"` when the caller's roles do not intersect. Handler-level RBAC (TenantAdmin/Member) keeps applying on top.
48
-
49
- When `fieldAccess.write` is absent or empty, behavior is unchanged — existing consumers stay green without code changes.
50
-
51
- `serializedField` schema gains the optional `fieldAccess: { read?: string[], write?: string[] }` shape (read is reserved for T1.5c).
52
-
53
- - 0a00e7b: custom-fields: user-data-rights wiring (T1.5c).
54
-
55
- New `wireCustomFieldsUserDataRightsFor(r, { entityName, entityTable, userIdColumn })` opt-in helper. Registers a second `r.useExtension(EXT_USER_DATA, ...)` for the host entity whose hooks handle the customFields jsonb under DSGVO Art. 15+17+20:
56
-
57
- - **Export**: every row owned by the user contributes its customFields jsonb into the export bundle under `<entity>.customFields`.
58
- - **Forget anonymize**: sensitive customFields keys (declared via `serializedField.sensitive: true`) are stripped from the jsonb. Non-sensitive keys stay.
59
- - **Forget delete**: no-op — the host entity's own user-data-rights hook removes the row, jsonb travels with it.
60
-
61
- `serializedField` gains optional `sensitive: boolean` alongside `fieldAccess` (T1.5b).
62
-
63
- - aca1443: custom-fields: per-field retention sweep (T1.5d).
64
-
65
- New `runCustomFieldsRetention(opts)` walks one host entity's rows and strips/nulls customField values whose host-row `modified_at` is older than the per-field `retention.keepFor` policy. Strategy `delete` removes the key; `anonymize` sets it to `null`.
66
-
67
- `serializedField` gains optional `retention: { keepFor: string; strategy: "delete" | "anonymize" }`.
68
-
69
- Designed to run alongside (or inside) the data-retention bundle's daily cron. No auto-registration — the consumer chooses the schedule and which host entities to sweep.
70
-
71
- - c6cb96c: custom-fields: per-tenant fieldDefinition quota (T1.5e).
72
-
73
- `createCustomFieldsFeature({ fieldDefinitionLimitPerTenant: N })` installs a quota-aware `define-tenant-field` handler. The handler runs a `COUNT(*)` on `read_custom_field_definitions` per tenant before insert and rejects with `unprocessable` + `reason: cap_exceeded` once the limit is reached.
74
-
75
- Cap is per-tenant total (across all entity-names), not per entity-name — the natural unit for tier-pricing.
76
-
77
- Without the option, behavior is unchanged: the singleton feature and its handler retain pre-T1.5e semantics.
78
-
79
- ### Patch Changes
80
-
81
- - 68b8118: custom-fields: typed `eventDef.name` pattern statt Template-Literal-Konstruktion.
82
-
83
- `createCustomFieldsFeature()` returnt jetzt typed `exports` (`setEvent`, `clearedEvent`, `fieldDefinitionDeletedEvent`). Handler + `wireCustomFieldsFor` nutzen `customFieldsFeature.exports.<event>.name` als compile-time literal-typed qualified-string — keine hand-gebauten `${FEATURE}:event:${SHORT}`-Strings mehr.
84
-
85
- Rationale: T1 hat den toKebab-collapse-Bug aufgedeckt (Dots in short-names kollabieren zu Dashes → Registry-Mismatch bei hand-gebauten Strings). Mit dem refactor wird die Drift compile-time-strukturell unmöglich (siehe Memory feedback_event_def_exports_pattern).
86
-
87
- Kein API-Change für consumers: `createCustomFieldsFeature()` bleibt unverändert; zusätzlicher named export `customFieldsFeature` (Singleton) ist additiv.
88
-
89
- - 3d5e9ef: `kumiko-schema-check` CLI — Empfehlung 3 aus Sprint-9.8-Retro
90
- (`luminous-watching-moler.md`). Diff't APP_FEATURES (runtime, aus
91
- `src/run-config.ts`) gegen FEATURE_IMPORT_REGISTRY (statisch, aus
92
- `drizzle/generate.ts`). Fängt Studio's 9.8-Drama: registry 18 features
93
- hinter APP_FEATURES → migrations fehlten für mounted features.
94
-
95
- Usage (im app-workspace):
96
-
97
- ```sh
98
- bunx kumiko-schema-check
99
- # or with custom paths:
100
- bunx kumiko-schema-check --run-config src/run-config.ts --generate drizzle/generate.ts
101
- ```
102
-
103
- Plus: 5 bundled-features hatten camelCase feature-names statt kebab-case
104
- (Memory `feedback_kebab_aggregates`) — aufgedeckt durch den schema-check
105
- gegen use-all-bundled. Fix: `channelEmail` → `channel-email`,
106
- `channelInApp` → `channel-in-app`, `channelPush` → `channel-push`,
107
- `rateLimiting` → `rate-limiting`, `rendererSimple` → `renderer-simple`.
108
-
109
- Plus `CHANNEL_IN_APP_FEATURE` und `RATE_LIMITING_FEATURE` Konstanten
110
- angepasst (waren intern auf camelCase, jetzt kebab-case).
111
-
112
- - Updated dependencies [7f56b2f]
113
- - @cosmicdrift/kumiko-framework@0.13.0
114
- - @cosmicdrift/kumiko-renderer@0.13.0
115
- - @cosmicdrift/kumiko-dispatcher-live@0.13.0
116
- - @cosmicdrift/kumiko-renderer-web@0.13.0
117
-
118
- ## 0.12.2
119
-
120
- ### Patch Changes
121
-
122
- - Updated dependencies [597de52]
123
- - @cosmicdrift/kumiko-framework@0.12.2
124
- - @cosmicdrift/kumiko-renderer@0.12.2
125
- - @cosmicdrift/kumiko-dispatcher-live@0.12.2
126
- - @cosmicdrift/kumiko-renderer-web@0.12.2
127
-
128
- ## 0.12.1
129
-
130
- ### Patch Changes
131
-
132
- - Updated dependencies [f2ad7c4]
133
- - @cosmicdrift/kumiko-framework@0.12.1
134
- - @cosmicdrift/kumiko-renderer@0.12.1
135
- - @cosmicdrift/kumiko-dispatcher-live@0.12.1
136
- - @cosmicdrift/kumiko-renderer-web@0.12.1
137
-
138
- ## 0.12.0
139
-
140
- ### Minor Changes
141
-
142
- - 0c1ebe5: Add `@cosmicdrift/kumiko-bundled-features/custom-fields` — B1 phase of the custom-fields-bundle Sprint.
143
-
144
- **Contents:**
145
-
146
- - `fieldDefinition` entity (event-sourced) — stores tenant-scoped and system-scoped (`tenantId = SYSTEM_TENANT_ID`) custom-field definitions side-by-side
147
- - 4 write-handlers: `define-tenant-field` (TenantAdmin), `define-system-field` (SystemAdmin), `delete-tenant-field`, `delete-system-field`
148
- - 1 query-handler: list (tenant-scoped; B2 will add system+tenant UNION resolution)
149
- - Deterministic aggregate-id from `(tenantId, entityName, fieldKey)` — same-scope conflicts surface naturally as `version_conflict`
150
- - Builder-Reuse-ready: `serializedField` jsonb stores the dehydrated field-builder-options; B2 will rehydrate for value-validation against `customField.set` events
151
-
152
- **Not in B1 (deferred to B2):**
153
-
154
- - Event-types `customField.set` / `customField.cleared`
155
- - MSP for value-projection in `read_<entity>.customFields` jsonb
156
- - Schema-Migration trigger for jsonb-column on host-entities
157
- - `r.extendsRegistrar("customFields", ...)` + onRegister wiring
158
- - F1 postQuery + F3 search-payload-extension integration
159
- - Cross-scope-conflict (tenant trying to override system fieldKey)
160
- - user-data-rights anonymization wiring
161
- - cap-counter quota wiring on define
162
- - In-place type-change-lock (DELETE+CREATE workaround for v1)
163
-
164
- Part of custom-fields-bundle Sprint Phase B1.
165
-
166
- ### Patch Changes
167
-
168
- - @cosmicdrift/kumiko-framework@0.12.0
169
- - @cosmicdrift/kumiko-dispatcher-live@0.12.0
170
- - @cosmicdrift/kumiko-renderer@0.12.0
171
- - @cosmicdrift/kumiko-renderer-web@0.12.0
172
-
173
- ## 0.11.2
174
-
175
- ### Patch Changes
176
-
177
- - Updated dependencies [92a84f0]
178
- - @cosmicdrift/kumiko-framework@0.11.2
179
- - @cosmicdrift/kumiko-renderer@0.11.2
180
- - @cosmicdrift/kumiko-dispatcher-live@0.11.2
181
- - @cosmicdrift/kumiko-renderer-web@0.11.2
182
-
183
- ## 0.11.1
184
-
185
- ### Patch Changes
186
-
187
- - e6f702f: `user-data-rights` declares `r.requires("sessions")` for the `sessions.revokeAllForUser` API it uses.
188
-
189
- The feature called `r.usesApi("sessions.revokeAllForUser")` but didn't list `sessions` in `r.requires(...)`. The framework's `validateApiExposureMatching` boot-check rejects that as inconsistent (any feature exposed by another must be in requires/optionalRequires). Surfaced in studio's production-bundle boot.
190
-
191
- - @cosmicdrift/kumiko-framework@0.11.1
192
- - @cosmicdrift/kumiko-dispatcher-live@0.11.1
193
- - @cosmicdrift/kumiko-renderer@0.11.1
194
- - @cosmicdrift/kumiko-renderer-web@0.11.1
195
-
196
- ## 0.11.0
197
-
198
- ### Patch Changes
199
-
200
- - Updated dependencies [30ea981]
201
- - Updated dependencies [9347212]
202
- - @cosmicdrift/kumiko-framework@0.11.0
203
- - @cosmicdrift/kumiko-renderer@0.11.0
204
- - @cosmicdrift/kumiko-dispatcher-live@0.11.0
205
- - @cosmicdrift/kumiko-renderer-web@0.11.0
206
-
207
- ## 0.10.0
208
-
209
- ### Patch Changes
210
-
211
- - Updated dependencies [d06f029]
212
- - Updated dependencies [753d392]
213
- - @cosmicdrift/kumiko-framework@0.10.0
214
- - @cosmicdrift/kumiko-renderer@0.10.0
215
- - @cosmicdrift/kumiko-dispatcher-live@0.10.0
216
- - @cosmicdrift/kumiko-renderer-web@0.10.0
217
-
218
- ## 0.9.0
219
-
220
- ### Patch Changes
221
-
222
- - Updated dependencies [51e22f5]
223
- - @cosmicdrift/kumiko-framework@0.9.0
224
- - @cosmicdrift/kumiko-renderer@0.9.0
225
- - @cosmicdrift/kumiko-dispatcher-live@0.9.0
226
- - @cosmicdrift/kumiko-renderer-web@0.9.0
227
-
228
- ## 0.8.1
229
-
230
- ### Patch Changes
231
-
232
- - Updated dependencies [4b5f91e]
233
- - @cosmicdrift/kumiko-framework@0.8.1
234
- - @cosmicdrift/kumiko-renderer@0.8.1
235
- - @cosmicdrift/kumiko-dispatcher-live@0.8.1
236
- - @cosmicdrift/kumiko-renderer-web@0.8.1
237
-
238
- ## 0.8.0
239
-
240
- ### Minor Changes
241
-
242
- - 145b8df: Add env-var contracts for four bundled-features (Sprint 9.3, Migration Phase 2).
243
-
244
- **New API:**
245
-
246
- - `secretsEnvSchema` — `KUMIKO_SECRETS_MASTER_KEY_V1` (base64-32 KEK, refined for length) + `KUMIKO_SECRETS_MASTER_KEY_CURRENT_VERSION` (default `"1"`).
247
- - `authEmailPasswordEnvSchema` — `JWT_SECRET` (≥32 chars) + `JWT_ISSUER` (optional).
248
- - `subscriptionStripeEnvSchema` — `STRIPE_WEBHOOK_SECRET` + `STRIPE_API_KEY` (both non-empty, both `pulumi.secret=true`).
249
- - `subscriptionMollieEnvSchema` — `MOLLIE_API_KEY` (`test_` or `live_` prefix, `pulumi.secret=true`).
250
-
251
- Each schema is exported from its feature's barrel and attached via `r.envSchema(...)` at feature-mount-time. Apps that mount these features via `composeEnvSchema({ features, ... })` get aggregated boot-validation for the relevant env-vars with source-attribution (`(auth-email-password)`, `(secrets)`, `(subscription-stripe)`, `(subscription-mollie)`).
252
-
253
- **Plan-Doc-Drift dokumentiert:** `mail-transport-smtp` bekommt KEIN envSchema. SMTP_HOST/PORT/SECURE/FROM/AUTH-USER sind tenant-config, SMTP_PASSWORD ist tenant-secret via `r.secret()` — keine process.env-Vars im Feature. Apps die SMTP_HOST etc. aus env seeden, deklarieren das in ihrem `extend`-block.
254
-
255
- **Kumiko-Pattern:** Das schema ist Contract, nicht Doku. Wenn eine App die var anders nennt (z.B. `MY_JWT` statt `JWT_SECRET`), ist sie off-pattern — `composeEnvSchema` würde sie unter dem standardisierten Namen erwarten.
256
-
257
- **Backward-compat:** Purely additive. Apps ohne `composeEnvSchema({features})` behavior unverändert.
258
-
259
- ### Patch Changes
260
-
261
- - Updated dependencies [f34af9a]
262
- - Updated dependencies [dff4123]
263
- - @cosmicdrift/kumiko-framework@0.8.0
264
- - @cosmicdrift/kumiko-renderer@0.8.0
265
- - @cosmicdrift/kumiko-dispatcher-live@0.8.0
266
- - @cosmicdrift/kumiko-renderer-web@0.8.0
267
-
268
- ## 0.7.0
269
-
270
- ### Minor Changes
271
-
272
- - bcf43b6: es-ops: `SeedMembershipRow` exposes `streamTenantId` (stream-tenant aus `kumiko_events.v1`) neben dem payload-`tenantId`. Seed-Authors müssen den `kumiko_events`-JOIN nicht mehr selbst bauen — `m.streamTenantId` ist der korrekte Wert für `systemWriteAs`'s `tenantIdOverride` wenn das Aggregate von einem fremden Executor angelegt wurde (typisches `seedTenantMembership(by=systemAdmin)`-Pattern).
273
-
274
- ### Patch Changes
275
-
276
- - Updated dependencies [bcf43b6]
277
- - @cosmicdrift/kumiko-framework@0.7.0
278
- - @cosmicdrift/kumiko-dispatcher-live@0.7.0
279
- - @cosmicdrift/kumiko-renderer@0.7.0
280
- - @cosmicdrift/kumiko-renderer-web@0.7.0
281
-
282
- ## 0.6.0
283
-
284
- ### Minor Changes
285
-
286
- - 8489d18: feat(es-ops): Phase 1.5 — tenantIdOverride + dry-run-validator + E2E-Test + Doku
287
-
288
- Phase 1.5 schließt die Lücken aus Phase 1 die den ersten Driver-Use-Case
289
- (publicstatus admin-roles) blockten. Siehe Retro:
290
- `kumiko-platform/docs/plans/features/es-ops-phase1-retro.md` (PR #9).
291
-
292
- **A1 — tenantIdOverride:**
293
- `SeedMigrationContext.systemWriteAs(qn, payload, tenantIdOverride?)`.
294
- Default SYSTEM_TENANT_ID (unverändert für System-scope-Aggregates wie
295
- config-values). Mit override: `createSystemUser(tenantIdOverride)` als
296
- Executor, damit der Event-Store-Executor den Aggregate-Stream im
297
- richtigen Tenant findet. Fix für die `version_conflict`-Klasse-Bug
298
- (Memory `feedback_event_store_tenant_consistency.md`).
299
-
300
- **A2 — dry-run-validator:**
301
- Runner parsed seed-files vor `migration.run()` per regex
302
- `systemWriteAs\(["']([^"']+)["']`, sammelt handler-QNs, validiert
303
- gegen `registry.getWriteHandler(qn)`. Fail-fast mit klarer Message
304
-
305
- - Datei + QN statt zur Runtime "handler not found". Catched camelCase-
306
- typos (kebab-case-vs-camelCase Drift) + andere QN-Drift zur Boot-Zeit.
307
- runProdApp reicht den richtigen Registry rein (`registry` neu in
308
- RunPendingSeedMigrationsArgs).
309
-
310
- **A3 — E2E-Test:**
311
- `packages/bundled-features/src/__tests__/es-ops-e2e.integration.ts`
312
- mit `setupTestStack`-Pattern: tenant+config Features echt geladen,
313
- echtes Membership-Aggregate via TenantHandlers.addMember im Demo-Tenant,
314
- seed-migration ruft update-member-roles mit tenantIdOverride → write
315
- geht durch, Marker landed, Event in Store, Read-Model aktualisiert.
316
- Plus typo-Test: seed mit camelCase fail-t Dry-Run mit
317
- `/dry-run found.*unknown handler-QN/`. **TDD-First**: ohne A1+A2 wäre
318
- der test rot.
319
-
320
- **A4 — Doku:**
321
- `framework/src/es-ops/README.md` erweitert um „Wann brauche ich
322
- tenantIdOverride?" + „Deployment-Anforderungen" (Docker COPY, Idempotenz,
323
- Multi-Replica) + „Lokaler Smoke vor Push". Recipe-README + seed-files
324
- auf neue API aktualisiert.
325
-
326
- **A5 — Smoke-Skript-Template:**
327
- `samples/recipes/seed-migration/scripts/smoke.ts` als copy-paste-Template
328
- für App-Authors: Bun-runnable, offline (read-only, kein DB-Write),
329
- validiert Module-Load + QN-Resolution + System-User-Access. Recipe-
330
- README dokumentiert Pflicht-Pattern.
331
-
332
- **Bonus-Fix:**
333
- `tenant:write:create`-access auf `["system", "SystemAdmin"]` erweitert
334
- (symmetrisch zu update-member-roles). Aufgedeckt durch Recipe-Smoke +
335
- initial-tenants-Seed. Pinning-Test in `tenant.integration.ts` updated.
336
-
337
- **Test-State:** 45/45 grün (Pre-Push). Typecheck clean. Biome clean.
338
- as-cast-Audit clean. Guard-silent-skip clean. Recipe-Smoke clean.
339
-
340
- **Folge-Step (separater PR):** publicstatus driver-sample reaktivieren
341
- mit lokalem Pre-Push-Smoke gegen publicstatus' echtes Feature-Set.
342
-
343
- ### Patch Changes
344
-
345
- - Updated dependencies [8489d18]
346
- - @cosmicdrift/kumiko-framework@0.6.0
347
- - @cosmicdrift/kumiko-dispatcher-live@0.6.0
348
- - @cosmicdrift/kumiko-renderer@0.6.0
349
- - @cosmicdrift/kumiko-renderer-web@0.6.0
350
-
351
- ## 0.5.2
352
-
353
- ### Patch Changes
354
-
355
- - 4f0d781: fix(tenant): updateMemberRoles erlaubt "system"-Rolle (symmetrisch zu create)
356
-
357
- Drift innerhalb des tenant-Features: `tenant:write:create` akzeptierte
358
- `["system", "SystemAdmin"]`, `tenant:write:update-member-roles` aber
359
- nur `["SystemAdmin"]`. Konsequenz: ops-tooling und seed-migrations
360
- (`createSystemUser` mit `roles: ["system"]`) konnten den Handler nicht
361
- aufrufen — `access_denied`.
362
-
363
- Live entdeckt beim ersten Driver-Sample der es-ops Phase 1: publicstatus
364
- seed `2026-05-20-fix-admin-roles.ts` rief `update-member-roles` via
365
- `systemWriteAs` → access_denied → Pod CrashLoopBackOff.
366
-
367
- Plus access-rule-Pinning-Test in `tenant.integration.ts`-scenario-7.
368
-
369
- - Updated dependencies [4f0d781]
370
- - @cosmicdrift/kumiko-framework@0.5.2
371
- - @cosmicdrift/kumiko-dispatcher-live@0.5.2
372
- - @cosmicdrift/kumiko-renderer@0.5.2
373
- - @cosmicdrift/kumiko-renderer-web@0.5.2
374
-
375
- ## 0.5.1
376
-
377
- ### Patch Changes
378
-
379
- - 0e00015: fix(es-ops): path.resolve statt path.join für seedsDir → seed-files
380
-
381
- Bun's `await import()` braucht absolute Pfade. Wenn der App-Author
382
- `runProdApp({ seedsDir: "./seeds" })` setzt (relativ), würde
383
- `path.join("./seeds", "foo.ts")` einen relativen Pfad liefern → Bun's
384
- Import-Resolver such relativ zum `runner.ts`-Modul (nicht zum
385
- `process.cwd()`) → `Cannot find module 'seeds/...' from '<runner-path>'`.
386
-
387
- `path.resolve` löst gegen `process.cwd()` auf → absolute Pfade →
388
- Import funktioniert. Aufgedeckt beim ersten Live-Boot der publicstatus-
389
- Driver-Migration (Pod CrashLoopBackOff).
390
-
391
- - Updated dependencies [0e00015]
392
- - @cosmicdrift/kumiko-framework@0.5.1
393
- - @cosmicdrift/kumiko-dispatcher-live@0.5.1
394
- - @cosmicdrift/kumiko-renderer@0.5.1
395
- - @cosmicdrift/kumiko-renderer-web@0.5.1
396
-
397
- ## 0.5.0
398
-
399
- ### Minor Changes
400
-
401
- - 7ff69ab: feat(es-ops): Phase 1 — file-based seed-migrations
402
-
403
- Neues first-class Operations-Pattern fürs Framework. Liefert `seed-migrations`
404
- als drizzle-migrate-equivalent für Event-Sourcing-Aggregate-Updates die
405
- idempotent-Seeder nicht erfassen können (z.B. „Member hat schon eine
406
- Rolle, aber jetzt soll noch eine dazukommen").
407
-
408
- Public-API:
409
-
410
- - `runProdApp({ seedsDir })` — Auto-apply pending Migrations beim Boot
411
- - `SeedMigration`-Interface (default-Export einer `seeds/<id>.ts`-File)
412
- - `SeedMigrationContext` mit `systemWriteAs` (ruft existing write-handler
413
- als System-User) + Read-Helpers (`findUserByEmail`,
414
- `findMembershipsOfUser`, `findTenants`)
415
- - CLI: `bunx kumiko ops seed:new|status|apply`
416
- - Tracking-Table `kumiko_es_operations` mit `operation_type`-Discriminator
417
- (vorbereitet auf Phase 2+ Operations: projection-rebuild, event-replay,
418
- stream-migration, ...)
419
- - Env-Flags: `KUMIKO_SKIP_ES_OPS=1` (alle skippen für Recovery),
420
- `KUMIKO_SKIP_ES_OPS_<ID>=1` (einzelne kaputte skippen)
421
-
422
- Garantien: single-run via tracking, atomic via per-migration-Tx,
423
- chronological order via filename-prefix, fail-stop bei Failure (kein
424
- Partial-Apply), ES-konform via Handler-Dispatch.
425
-
426
- Sub-path-Export: `@cosmicdrift/kumiko-framework/es-ops`
427
-
428
- Plan-Doc: `kumiko-platform/docs/plans/features/es-ops.md`
429
- Recipe: `samples/recipes/seed-migration/`
430
- Driver-Use-Case: publicstatus admin-roles-drift (parallel-Branch
431
- `feat/es-ops-driver-admin-roles`).
432
-
433
- Phase 2+ skizziert + offen markiert — Implementation pro Use-Case.
434
-
435
- ### Patch Changes
436
-
437
- - Updated dependencies [7ff69ab]
438
- - @cosmicdrift/kumiko-framework@0.5.0
439
- - @cosmicdrift/kumiko-dispatcher-live@0.5.0
440
- - @cosmicdrift/kumiko-renderer@0.5.0
441
- - @cosmicdrift/kumiko-renderer-web@0.5.0
442
-
443
- ## 0.4.1
444
-
445
- ### Patch Changes
446
-
447
- - 010b410: feat(auth-email-password): "Bestätigungs-Mail erneut senden" im LoginScreen
448
-
449
- LoginScreen bietet bei reason=email_not_verified jetzt einen Resend-Link
450
- im Fehler-Banner — der existierende `requestEmailVerification`-Endpoint
451
- wird direkt aufgerufen, der Banner wechselt nach Erfolg zum Info-Variant
452
- ("Wir haben dir eine neue Bestätigungs-Mail geschickt.").
453
-
454
- UX-Details:
455
-
456
- - Bei 429 → inline-Hint "Bitte warte kurz und versuche es erneut."
457
- - Bei Netzwerk/sonstigen Fehlern → inline-Hint "Konnte nicht senden."
458
- - Anti-Typo-Gate: ändert der User die Email-Eingabe nach dem Login-Fail,
459
- verschwindet der Resend-Link — sonst würde Resend silent-success an die
460
- geänderte (potentiell typoed) Adresse gehen ohne User-Feedback.
461
- - Andere Failure-Codes (invalid_credentials etc.) zeigen weiterhin keinen
462
- Resend-Link.
463
-
464
- i18n: 4 neue Keys (DE+EN) im `auth.login.resend*`-Namespace, additive.
465
- Apps die ihre Translations override-en müssen nichts ändern.
466
-
467
- Additive UI-Feature — keine API-Breaks, keine Schema-Migration.
468
-
469
- - Updated dependencies [010b410]
470
- - @cosmicdrift/kumiko-framework@0.4.1
471
- - @cosmicdrift/kumiko-dispatcher-live@0.4.1
472
- - @cosmicdrift/kumiko-renderer@0.4.1
473
- - @cosmicdrift/kumiko-renderer-web@0.4.1
474
-
475
- ## 0.4.0
476
-
477
- ### Minor Changes
478
-
479
- - 825e7d2: Visual-Tree V.1.4 → V.1.6 — Feature-complete Editor + Folder-Hierarchy + Roving-tabindex.
480
-
481
- **V.1.4** — explicit `folder?: string` Schema-Field auf text-block-entity. Slug bleibt
482
- kebab-only validiert, Folder explizit gesetzt. Tree gruppiert via `groupBlocksByFolder`
483
- (ersetzt `groupBlocksBySlugPrefix`). `Subscribe<T>` Signature um optional `emitError`
484
- erweitert für explicit async-error-Pfade. ProviderBranch zeigt Error-Banner mit
485
- Retry-Button. Drift-Test pinnt seedTextBlock-vs-set.write Slug-Validation.
486
-
487
- **V.1.4b** — URL-State-Routing für Editor-Target via `nav.searchParams`. F5 + Back-Button
488
- stellen den Editor-State wieder her. Format: `?t=text-content:edit&a_slug=...&a_lang=...`.
489
- Plus `useDispatchTarget` hook ersetzt globalen `dispatchTarget` als empfohlenen Production-
490
- Pfad (legacy bleibt für Test-Hooks).
491
-
492
- **V.1.5** — Arrow-Key-Navigation (`<aside role="tree">`, ARIA-tree-Pattern) + SSE-driven
493
- Tree-Refresh. `ClientFeatureDefinition.treeEntities?: string[]` listet Entity-Namen pro
494
- Provider; live-events triggern provider-re-mount → Stale-Tree-state="stub"→"filled"
495
- flippt nach save automatisch.
496
-
497
- **V.1.5c+d** — Active-Node-Highlight (explicit blue + 2px border-l + scrollIntoView),
498
- VS-Code-Polish (compact spacing, focus-visible, folder-icon-color text-amber, indent-
499
- guides per ancestor-depth), Folder-Wrapper für legal-pages ("📁 Legal" + slug-first
500
- Verschachtelung) und text-content ("📁 Content").
501
-
502
- **V.1.6** — Multi-level Folder-Splitting (`folder="page/marketing"` → nested folders,
503
- walk-or-create-pattern, folder/leaf-collision-tolerant). Roving-tabindex (nur focused-
504
- treeitem hat tabIndex=0, Tab cyclt aus dem Tree raus).
505
-
506
- 35/35 kumiko check PASS, 13/13 group-blocks + 22/22 text-content integration tests grün.
507
- Browser + Keyboard lokal validated.
508
-
509
- **Breaking**: `TreeContext` Type entfernt (V.1.2 SR2-Rip — war nie genutzt). Provider sind
510
- session-bound: `TreeChildrenSubscribe = () => Subscribe<T>` statt `(ctx) => Subscribe<T>`.
511
-
512
- **V.1.7-Followups**: useEffect-deps in VisualTree-focus-init (Performance), Cancellation-
513
- Token in TreeProvider's fetch (emit-after-unmount-warning), inline-rename, drag-drop,
514
- file-icons per slug-extension, parent-jump bei ArrowLeft auf collapsed-item.
515
-
516
- ### Patch Changes
517
-
518
- - Updated dependencies [825e7d2]
519
- - @cosmicdrift/kumiko-framework@0.4.0
520
- - @cosmicdrift/kumiko-dispatcher-live@0.4.0
521
- - @cosmicdrift/kumiko-renderer@0.4.0
522
- - @cosmicdrift/kumiko-renderer-web@0.4.0
523
-
524
- ## 0.3.0
525
-
526
- ### Minor Changes
527
-
528
- - 0.3.0 bringt zwei neue Subsysteme (Step-Engine Tier-3 + Visual-Tree) plus
529
- eine AST-Codemod-Pipeline als Vorarbeit für den L2-AI-Layer.
530
-
531
- ### Breaking Changes
532
-
533
- - `skipTransitionGuard` → `unsafeSkipTransitionGuard` (Rename in
534
- feature-ast + engine). Der `unsafe`-Prefix macht die Tragweite des
535
- Casts sichtbar und ist konsistent zur `unsafeProjectionUpsert`- und
536
- `r.rawTable`-Konvention. Migration: 1:1-Ersetzung, keine Verhaltens-Änderung.
537
-
538
- ### Features
539
-
540
- - **Step-Engine M.4 — Tier-3 Workflow-Engine.** Neue Step-Vocabulary
541
- `wait`, `waitForEvent`, `retry` ermöglicht persistierte Long-Running-Flows
542
- über Job-Boundaries hinweg. Q7 Snapshot-at-Start hängt jedem Step-Run
543
- einen SHA-256-Fingerprint des Aggregat-Zustands an, sodass Replays
544
- deterministisch gegen den ursprünglichen Eingangszustand laufen.
545
- - **Visual-Tree V.1.x — Tree-API + Editor-Panel.** Neue `VisualTree`-
546
- Component plus TreeProvider-Pattern; erste TreeProviders für
547
- `text-content` und `legal-pages` (CMS-light + Impressum/Privacy).
548
- Fundament für den späteren No-Code-Designer (~3000 LOC, 98 Tests).
549
- - **Codemod-Pipeline.** AST-basierte Patcher-Module für strukturelle
550
- Feature-Edits — wird vom kommenden L2-AI-Layer als Tool-Surface
551
- verwendet, ist aber eigenständig nutzbar für ts-morph-style Migrationen.
552
- - **user-data-rights Sample-Recipe.** DSGVO Art. 15/17/18/20 vollständig
553
- als Sample-Recipe (`samples/recipes/`) inklusive README — zeigt die
554
- Export- und Forget-Pipeline gegen den `compliance-profiles`-Default
555
- (`eu-dsgvo`).
556
-
557
- ### Fixes
558
-
559
- - `tier-engine`: auto-default-tier-Hook benutzt jetzt `ctx.db.raw` für
560
- Event-Store-Operationen (#37, vorher: stiller Bug, 22 Tage live).
561
- - `engine`: unsafe-projection-upsert nutzt `as never` statt `as any` —
562
- schmaler Cast-Surface, weniger Compiler-Knebel.
563
- - `visual-tree`: runtime-isolation marker für client-konsumierte Files,
564
- damit der Multi-Entry-Build den richtigen Bundle-Split bekommt.
565
- - `feature-ast`: vollständiger `unsafeSkipTransitionGuard`-Rename (war
566
- in zwei Modulen noch der alte Name).
567
- - `framework`: Error-Reasons + `noConsole`-Lint + No-Date-API-Guard
568
- wieder push-ready.
569
-
570
- ### Library-Updates
571
-
572
- hono 4.12, jose 6.2, stripe 22.1, meilisearch 0.58, marked 18,
573
- bun-types 1.3.13, lucide-react 1.14, bullmq 5.76, ioredis 5.10,
574
- i18next 26.0, react + radix-ui-primitives auf aktuelle Minors.
575
-
576
- ### Patch Changes
577
-
578
- - Updated dependencies
579
- - @cosmicdrift/kumiko-framework@0.3.0
580
- - @cosmicdrift/kumiko-dispatcher-live@0.3.0
581
- - @cosmicdrift/kumiko-renderer@0.3.0
582
- - @cosmicdrift/kumiko-renderer-web@0.3.0
583
-
584
- ## 0.2.3
585
-
586
- ### Patch Changes
587
-
588
- - 1dbd038: Fix `db.execute is not a function` crash in `createTierEngineFeature`'s
589
- auto-default-tier postSave-hook when called via the dispatcher path
590
- (`tenant:write:create`). The hook used `ctx.db as DbConnection` — a
591
- type-lie. AppContext.db in the inTransaction-phase is a TenantDb, which
592
- exposes select/insert/update/delete but not execute(). The event-store-
593
- append (event-store.ts:102) calls `db.execute(sql\`SELECT pg_notify(...)\`)`,
594
- which crashed at runtime.
595
-
596
- Fix: typeguard via `if (!("raw" in ctx.db)) return` then use `ctx.db.raw
597
- as DbConnection` (pattern matched signup-confirm.write.ts:107).
598
-
599
- Plus: regression integration-test in `tier-engine/__tests__/auto-default-
600
- tier.integration.ts` covering the dispatcher path (sysadmin →
601
- tenant:write:create → tier_assignments-row + idempotency on tenant-update).
602
-
603
- **Known production gap (separate from this fix):** Self-Signup goes through
604
- `provisionSignupAccount → seedTenant` (event-store-direct), which bypasses
605
- the dispatcher → postSave-hooks never fire in production self-signup. This
606
- fix makes the dispatcher path coherent. Real-signup auto-default needs
607
- follow-up work (either seedTenant fires hooks or signup-confirm calls
608
- explicit seed-helpers).
609
-
610
- - @cosmicdrift/kumiko-framework@0.2.3
611
- - @cosmicdrift/kumiko-dispatcher-live@0.2.3
612
- - @cosmicdrift/kumiko-renderer@0.2.3
613
- - @cosmicdrift/kumiko-renderer-web@0.2.3
614
-
615
- ## 0.2.2
616
-
617
- ### Patch Changes
618
-
619
- - 7a7da3e: Re-publish 0.2.1 → 0.2.2 mit korrekt aufgelösten cross-package-Versionen.
620
- 0.2.1 hatte `workspace:*` als Wert in den dependencies (npm publish ohne
621
- yarn-pack rewrite), Konsumenten bekamen "Workspace not found".
622
-
623
- publish-with-oidc.sh nutzt jetzt `yarn pack` (rewrited workspace:\*) +
624
- `npm publish <tarball>` (OIDC + provenance).
625
-
626
- - Updated dependencies [7a7da3e]
627
- - @cosmicdrift/kumiko-framework@0.2.2
628
- - @cosmicdrift/kumiko-dispatcher-live@0.2.2
629
- - @cosmicdrift/kumiko-renderer@0.2.2
630
- - @cosmicdrift/kumiko-renderer-web@0.2.2
631
-
632
- ## 0.2.1
633
-
634
- ### Patch Changes
635
-
636
- - 48b7f6a: CI: switch publish to npm-CLI with OIDC Trusted Publishing + provenance.
637
- No source changes — verifies the new publish path produces a verified-
638
- provenance attestation on npmjs.com instead of token-based publish.
639
- - Updated dependencies [48b7f6a]
640
- - @cosmicdrift/kumiko-framework@0.2.1
641
- - @cosmicdrift/kumiko-dispatcher-live@0.2.1
642
- - @cosmicdrift/kumiko-renderer@0.2.1
643
- - @cosmicdrift/kumiko-renderer-web@0.2.1
644
-
645
- ## 0.2.0
646
-
647
- ### Minor Changes
648
-
649
- - 6c70b6f: fix(tenant): seedTenant idempotent gegen Event-Store-Projection-Drift.
650
-
651
- Verhindert version_conflict beim App-Boot wenn Aggregat existiert aber
652
- Projection-Row fehlt (rebuild-drift, async-lag, manueller DB-Eingriff).
653
-
654
- ### Patch Changes
655
-
656
- - Updated dependencies [6c70b6f]
657
- - @cosmicdrift/kumiko-framework@0.2.0
658
- - @cosmicdrift/kumiko-dispatcher-live@0.2.0
659
- - @cosmicdrift/kumiko-renderer@0.2.0
660
- - @cosmicdrift/kumiko-renderer-web@0.2.0
661
-
662
- ## 0.1.0
663
-
664
- ### Minor Changes
665
-
666
- - 59ba6d7: Initial public release of Kumiko — AI-native backend builder.
667
-
668
- What ships in 0.1.0:
669
-
670
- - **Engine** (`@cosmicdrift/kumiko-framework`): `defineFeature`, `r.entity`, `r.writeHandler`, `r.queryHandler`, `r.projection`, `r.multiStreamProjection`, `r.hook`, `r.translations`, `r.crud`, `r.referenceData`, `r.screen`, `r.nav`, `r.authClaims`, full lifecycle pipeline with field-level access checks
671
- - **Pipeline** (`@cosmicdrift/kumiko-framework`): `createDispatcher`, JWT auth via jose, Zod schema validation, role-based access checks, command/write/query split
672
- - **DB** (`@cosmicdrift/kumiko-framework`): Drizzle helpers (`buildDrizzleTable`, `applyCursorQuery`), CRUD executor, Postgres dialect, optimistic locking, soft delete, multi-tenant scoping
673
- - **Event sourcing** (`@cosmicdrift/kumiko-framework`): aggregate streams, single + multi-stream projections, event upcasters, asOf queries, archive support, AsyncDaemon-pattern dispatcher
674
- - **Bundled features** (`@cosmicdrift/kumiko-bundled-features`): auth-email-password, sessions, tenants, users, jobs, secrets, file-provider-s3, mail-transport-smtp/inmemory, billing-foundation, cap-counter, channel-in-app, delivery, feature-toggles, legal-pages
675
- - **Renderer** (`@cosmicdrift/kumiko-renderer`, `@cosmicdrift/kumiko-renderer-web`): schema-driven CRUD UI for React + Expo Web, override paths, list debounce, theme tokens
676
- - **Headless** (`@cosmicdrift/kumiko-headless`): view-models for list/edit screens, locale-aware
677
- - **Dev server** (`@cosmicdrift/kumiko-dev-server`): `runDevApp`, `runProdApp`, `kumiko-build` for production bundles (client + server), Docker-ready
678
- - **Realtime** (`@cosmicdrift/kumiko-dispatcher-live`): SSE broadcast across tenants, Redis Pub/Sub backend
679
- - **CLI** (`bin/kumiko.ts`): interactive dev menu, test runners, check pipeline (Biome + TypeScript + 18 guards + Vitest)
680
-
681
- This is a pre-1.0 release — APIs may change between minor versions. Breaking changes will be documented per release.
682
-
683
- ### Patch Changes
684
-
685
- - Updated dependencies [59ba6d7]
686
- - @cosmicdrift/kumiko-framework@0.1.0
687
- - @cosmicdrift/kumiko-dispatcher-live@0.1.0
688
- - @cosmicdrift/kumiko-renderer@0.1.0
689
- - @cosmicdrift/kumiko-renderer-web@0.1.0