@cosmicdrift/kumiko-samples 0.353.0 → 0.354.1

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 (137) hide show
  1. package/package.json +1 -1
  2. package/packages/bundled-features/package.json +18 -2
  3. package/packages/bundled-features/src/agent-tools/agent-doc-lint.ts +66 -0
  4. package/packages/bundled-features/src/agent-tools/agent-manifest.ts +11 -5
  5. package/packages/bundled-features/src/agent-tools/feature.ts +13 -2
  6. package/packages/bundled-features/src/agent-tools/index.ts +6 -1
  7. package/packages/bundled-features/src/agent-tools/tool-dispatch.ts +1 -1
  8. package/packages/bundled-features/src/auth-email-password/changes.json +24 -0
  9. package/packages/bundled-features/src/auth-email-password/handlers/change-password.write.ts +1 -0
  10. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept-with-login.write.ts +3 -2
  11. package/packages/bundled-features/src/auth-email-password/handlers/invite-accept.write.ts +3 -2
  12. package/packages/bundled-features/src/auth-email-password/handlers/invite-create.write.ts +21 -0
  13. package/packages/bundled-features/src/auth-email-password/handlers/invite-signup-complete.write.ts +4 -1
  14. package/packages/bundled-features/src/auth-email-password/handlers/login.write.ts +1 -0
  15. package/packages/bundled-features/src/auth-email-password/handlers/reset-password.write.ts +1 -0
  16. package/packages/bundled-features/src/auth-email-password/handlers/signup-confirm.write.ts +5 -0
  17. package/packages/bundled-features/src/auth-email-password/handlers/signup-request.write.ts +53 -96
  18. package/packages/bundled-features/src/auth-email-password/handlers/token-request-handler.ts +1 -0
  19. package/packages/bundled-features/src/auth-email-password/handlers/verify-email.write.ts +1 -0
  20. package/packages/bundled-features/src/auth-email-password/index.ts +12 -0
  21. package/packages/bundled-features/src/auth-email-password/seeding.ts +38 -7
  22. package/packages/bundled-features/src/auth-email-password/signup-activation.ts +83 -0
  23. package/packages/bundled-features/src/auth-email-password/signup-token-store.ts +9 -3
  24. package/packages/bundled-features/src/auth-email-password/web/auth-gate.tsx +7 -7
  25. package/packages/bundled-features/src/auth-email-password/web/auth-redirect.ts +15 -0
  26. package/packages/bundled-features/src/auth-email-password/web/login-screen.tsx +2 -2
  27. package/packages/bundled-features/src/auth-email-password/web/user-menu.tsx +1 -1
  28. package/packages/bundled-features/src/auth-mfa/changes.json +7 -0
  29. package/packages/bundled-features/src/auth-mfa/feature.ts +5 -0
  30. package/packages/bundled-features/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +1 -0
  31. package/packages/bundled-features/src/auth-mfa/handlers/verify.write.ts +1 -0
  32. package/packages/bundled-features/src/auth-mfa/web/mfa-recovery-codes-reveal.tsx +6 -8
  33. package/packages/bundled-features/src/auth-mfa/web/mfa-setup-preauth-screen.tsx +18 -21
  34. package/packages/bundled-features/src/auth-mfa/web/mfa-verify-screen.tsx +2 -2
  35. package/packages/bundled-features/src/billing-foundation/billing-info-query.ts +4 -4
  36. package/packages/bundled-features/src/billing-foundation/changes.json +6 -0
  37. package/packages/bundled-features/src/channel-in-app/changes.json +8 -1
  38. package/packages/bundled-features/src/channel-in-app/in-app-channel.ts +1 -1
  39. package/packages/bundled-features/src/channel-in-app/tables.ts +18 -12
  40. package/packages/bundled-features/src/crypto-shredding/changes.json +12 -0
  41. package/packages/bundled-features/src/crypto-shredding/handlers/forget-subject.write.ts +154 -69
  42. package/packages/bundled-features/src/delivery/changes.json +6 -0
  43. package/packages/bundled-features/src/delivery/db/queries/address-opt-outs.ts +18 -12
  44. package/packages/bundled-features/src/delivery/delivery-service.ts +103 -16
  45. package/packages/bundled-features/src/delivery/unsubscribe.ts +81 -13
  46. package/packages/bundled-features/src/feature-toggles/feature.ts +2 -3
  47. package/packages/bundled-features/src/feature-toggles/toggle-runtime.ts +34 -5
  48. package/packages/bundled-features/src/feature-toggles/toggle-sync-signal.ts +31 -8
  49. package/packages/bundled-features/src/file-derivatives/handlers/public-variant.query.ts +10 -1
  50. package/packages/bundled-features/src/files/changes.json +24 -0
  51. package/packages/bundled-features/src/files-tenant-data/changes.json +5 -0
  52. package/packages/bundled-features/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +4 -0
  53. package/packages/bundled-features/src/files-tenant-data/hooks.ts +72 -23
  54. package/packages/bundled-features/src/folders/changes.json +6 -0
  55. package/packages/bundled-features/src/folders/handlers/delete-folder.write.ts +41 -9
  56. package/packages/bundled-features/src/foundation-shared/index.ts +1 -0
  57. package/packages/bundled-features/src/foundation-shared/mail-host-policy.ts +16 -4
  58. package/packages/bundled-features/src/inbound-provider-imap/changes.json +6 -0
  59. package/packages/bundled-features/src/inbound-provider-imap/feature.ts +2 -0
  60. package/packages/bundled-features/src/inbound-provider-imap/imap-client.ts +3 -4
  61. package/packages/bundled-features/src/jobs/changes.json +30 -0
  62. package/packages/bundled-features/src/jobs/constants.ts +1 -0
  63. package/packages/bundled-features/src/jobs/db/queries/retention.ts +12 -0
  64. package/packages/bundled-features/src/jobs/db/queries/stale-run-sweep.ts +26 -2
  65. package/packages/bundled-features/src/jobs/feature.ts +7 -1
  66. package/packages/bundled-features/src/jobs/handlers/list.query.ts +1 -1
  67. package/packages/bundled-features/src/jobs/handlers/tenant-failures.query.ts +1 -1
  68. package/packages/bundled-features/src/jobs/handlers/tenant-runs.query.ts +94 -0
  69. package/packages/bundled-features/src/jobs/index.ts +2 -0
  70. package/packages/bundled-features/src/jobs/job-run-logger.ts +177 -10
  71. package/packages/bundled-features/src/jobs/tenant-job-failure-table.ts +27 -8
  72. package/packages/bundled-features/src/jobs/tenant-job-run-table.ts +55 -0
  73. package/packages/bundled-features/src/ledger/changes.json +23 -0
  74. package/packages/bundled-features/src/ledger/entity.ts +13 -5
  75. package/packages/bundled-features/src/ledger/feature.ts +3 -0
  76. package/packages/bundled-features/src/ledger/handlers/confirm-schedule-period.write.ts +15 -3
  77. package/packages/bundled-features/src/ledger/handlers/create-transaction.write.ts +1 -0
  78. package/packages/bundled-features/src/ledger/handlers/reverse-transaction.write.ts +1 -0
  79. package/packages/bundled-features/src/ledger/schedule-subject-pair.ts +27 -0
  80. package/packages/bundled-features/src/mail-transport-smtp/feature.ts +4 -15
  81. package/packages/bundled-features/src/notes-history/changes.json +13 -0
  82. package/packages/bundled-features/src/notes-history/entity.ts +4 -0
  83. package/packages/bundled-features/src/personal-access-tokens/handlers/create.write.ts +1 -0
  84. package/packages/bundled-features/src/sessions/feature.ts +21 -8
  85. package/packages/bundled-features/src/sessions/handlers/detail.query.ts +34 -33
  86. package/packages/bundled-features/src/sessions/handlers/list.query.ts +68 -65
  87. package/packages/bundled-features/src/sessions/screens.ts +10 -8
  88. package/packages/bundled-features/src/shared/encrypt-for-direct-write.ts +15 -8
  89. package/packages/bundled-features/src/shared/index.ts +2 -1
  90. package/packages/bundled-features/src/shared/parent-visibility.ts +31 -1
  91. package/packages/bundled-features/src/shared/row-bound-grant.ts +18 -2
  92. package/packages/bundled-features/src/shared/session-locale-field.ts +7 -0
  93. package/packages/bundled-features/src/template-resolver/api.ts +3 -3
  94. package/packages/bundled-features/src/template-resolver/changes.json +5 -0
  95. package/packages/bundled-features/src/template-resolver/handlers/list.query.ts +2 -2
  96. package/packages/bundled-features/src/tenant/changes.json +12 -0
  97. package/packages/bundled-features/src/tenant/feature.ts +8 -1
  98. package/packages/bundled-features/src/tenant/handlers/toggle-enabled.write.ts +2 -0
  99. package/packages/bundled-features/src/tenant/handlers/update-member-roles.write.ts +1 -0
  100. package/packages/bundled-features/src/tenant/invitation-table.ts +6 -0
  101. package/packages/bundled-features/src/tenant/invited-membership.ts +45 -12
  102. package/packages/bundled-features/src/tenant-handover/changes.json +6 -0
  103. package/packages/bundled-features/src/tenant-handover/transfer-graph.ts +14 -96
  104. package/packages/bundled-features/src/tenant-lifecycle/boot-checks.ts +16 -0
  105. package/packages/bundled-features/src/tenant-lifecycle/changes.json +22 -0
  106. package/packages/bundled-features/src/tenant-lifecycle/constants.ts +8 -0
  107. package/packages/bundled-features/src/tenant-lifecycle/events.ts +6 -0
  108. package/packages/bundled-features/src/tenant-lifecycle/feature.ts +13 -1
  109. package/packages/bundled-features/src/tenant-lifecycle/run-tenant-destroy.ts +100 -29
  110. package/packages/bundled-features/src/tenant-lifecycle/stages.ts +41 -9
  111. package/packages/bundled-features/src/tenant-lifecycle/testing.ts +58 -0
  112. package/packages/bundled-features/src/tier-engine/changes.json +5 -0
  113. package/packages/bundled-features/src/tier-engine/handlers/set-tenant-tier.write.ts +1 -0
  114. package/packages/bundled-features/src/user/changes.json +15 -0
  115. package/packages/bundled-features/src/user/handlers/detail.query.ts +1 -0
  116. package/packages/bundled-features/src/user/handlers/list.query.ts +3 -0
  117. package/packages/bundled-features/src/user/handlers/update.write.ts +1 -0
  118. package/packages/bundled-features/src/user/seeding.ts +34 -0
  119. package/packages/bundled-features/src/user-data-rights/changes.json +6 -0
  120. package/packages/bundled-features/src/user-data-rights/handlers/request-deletion.write.ts +1 -0
  121. package/packages/bundled-features/src/user-data-rights/index.ts +1 -0
  122. package/packages/bundled-features/src/user-data-rights/schema/download-attempt.ts +17 -9
  123. package/packages/bundled-features/src/user-profile/handlers/change-email.write.ts +8 -2
  124. package/packages/bundled-features/src/workflow-runner/event-trigger.ts +72 -14
  125. package/packages/bundled-features/src/workflow-runner/handlers/resume-run.write.ts +6 -1
  126. package/packages/bundled-features/src/workflow-runner/runner.ts +8 -2
  127. package/samples/apps/showcase/src/features/items/feature.ts +2 -1
  128. package/samples/apps/styleguide/src/features/widgets/feature.ts +83 -0
  129. package/samples/apps/styleguide/src/features/widgets/i18n.ts +12 -0
  130. package/samples/apps/styleguide/src/features/widgets/web/Widgets.tsx +4 -0
  131. package/samples/apps/ui-walkthrough/package.json +3 -0
  132. package/samples/apps/use-all-bundled/README.md +1 -2
  133. package/samples/apps/use-all-bundled/feature-manifest.json +1 -1
  134. package/samples/apps/user-data-rights-demo/README.md +1 -3
  135. package/samples/recipes/legal-pages/README.md +3 -4
  136. package/samples/recipes/managed-pages/README.md +2 -2
  137. package/samples/recipes/seed-migration/README.md +0 -2
@@ -15,6 +15,44 @@ const RESPONSE_POINTS = Array.from({ length: 48 }, (_, i) => ({
15
15
  value: i === 20 ? null : 120 + Math.round(80 * Math.abs(Math.sin(i / 5))),
16
16
  }));
17
17
 
18
+ const LOAN_START_MS = Date.UTC(2020, 0, 1);
19
+ const LOAN_TODAY_MS = Date.UTC(2026, 5, 15);
20
+ const LOAN_MONTHS = 240;
21
+ const LOAN_PRINCIPAL_MINOR = 25_000_000;
22
+ const LOAN_MONTHLY_RATE = 0.035 / 12;
23
+
24
+ const loanMonthMs = (monthIndex: number): number => Date.UTC(2020, monthIndex, 1);
25
+
26
+ // Annuity loan over 20 years: remaining principal falls, cumulative interest
27
+ // grows. "Today" is a fixed date, not the clock, so the window and the
28
+ // screenshots stay stable.
29
+ const growth = (1 + LOAN_MONTHLY_RATE) ** LOAN_MONTHS;
30
+ const annuityMinor = (LOAN_PRINCIPAL_MINOR * LOAN_MONTHLY_RATE * growth) / (growth - 1);
31
+ let balanceMinor: number = LOAN_PRINCIPAL_MINOR;
32
+ let interestPaidMinor = 0;
33
+ const LOAN_REMAINING_POINTS = [{ atMs: loanMonthMs(0), value: LOAN_PRINCIPAL_MINOR }];
34
+ const LOAN_INTEREST_POINTS = [{ atMs: loanMonthMs(0), value: 0 }];
35
+ for (let i = 1; i <= LOAN_MONTHS; i++) {
36
+ const interest = balanceMinor * LOAN_MONTHLY_RATE;
37
+ balanceMinor = Math.max(0, balanceMinor - (annuityMinor - interest));
38
+ interestPaidMinor += interest;
39
+ LOAN_REMAINING_POINTS.push({ atMs: loanMonthMs(i), value: Math.round(balanceMinor) });
40
+ LOAN_INTEREST_POINTS.push({ atMs: loanMonthMs(i), value: Math.round(interestPaidMinor) });
41
+ }
42
+ const LOAN_SERIES = [
43
+ { key: "remaining", label: "widgets:dashboard:loan-remaining", points: LOAN_REMAINING_POINTS },
44
+ { key: "interest", label: "widgets:dashboard:loan-interest", points: LOAN_INTEREST_POINTS },
45
+ ];
46
+ const LOAN_MARKERS = [
47
+ { atMs: loanMonthMs(84), label: { i18nKey: "widgets:dashboard:marker-extra-1" }, kind: "extra" },
48
+ { atMs: loanMonthMs(150), label: { i18nKey: "widgets:dashboard:marker-extra-2" }, kind: "extra" },
49
+ {
50
+ atMs: loanMonthMs(LOAN_MONTHS),
51
+ label: { i18nKey: "widgets:dashboard:marker-payoff" },
52
+ kind: "payoff",
53
+ },
54
+ ];
55
+
18
56
  const SENDERS = ["William Smith", "Alice Smith", "Bob Johnson", "Emily Davis"] as const;
19
57
  const SUBJECTS = ["Meeting Tomorrow", "Re: Project Update", "Weekend Plans", "Re: Budget"] as const;
20
58
 
@@ -104,6 +142,31 @@ export const widgetsFeature = defineFeature("widgets", (r) => {
104
142
  chart: "timeseries",
105
143
  query: "widgets:query:metrics:response-times",
106
144
  },
145
+ {
146
+ kind: "chart",
147
+ id: "loan",
148
+ label: "widgets:dashboard:loan",
149
+ chart: "stacked-area",
150
+ query: "widgets:query:metrics:loan",
151
+ valueFormat: { kind: "currency", currency: "EUR", fractionDigits: 0 },
152
+ brush: true,
153
+ legendTotals: false,
154
+ initialWindow: "from-today",
155
+ markerLegend: "legend",
156
+ markerKinds: {
157
+ extra: { tone: "active", label: "widgets:dashboard:kind-extra" },
158
+ payoff: { tone: "positive", label: "widgets:dashboard:kind-payoff" },
159
+ },
160
+ ranges: {
161
+ default: "max",
162
+ options: [
163
+ { value: "y1", label: "widgets:dashboard:range-y1", months: 12 },
164
+ { value: "y3", label: "widgets:dashboard:range-y3", months: 36 },
165
+ { value: "y5", label: "widgets:dashboard:range-y5", months: 60 },
166
+ { value: "max", label: "widgets:dashboard:range-all" },
167
+ ],
168
+ },
169
+ },
107
170
  {
108
171
  kind: "list",
109
172
  id: "latest",
@@ -204,6 +267,26 @@ export const widgetsFeature = defineFeature("widgets", (r) => {
204
267
  },
205
268
  },
206
269
  );
270
+ r.queryHandler(
271
+ "metrics:loan",
272
+ z.object({}),
273
+ async () => ({
274
+ series: LOAN_SERIES,
275
+ markers: LOAN_MARKERS,
276
+ windowStartMs: LOAN_START_MS,
277
+ windowEndMs: loanMonthMs(LOAN_MONTHS),
278
+ todayMs: LOAN_TODAY_MS,
279
+ }),
280
+ {
281
+ access: {
282
+ openToAll: {
283
+ reason:
284
+ "demo dashboard widget: returns static canned data with no per-user or " +
285
+ "tenant scoping; any signed-in user may query it",
286
+ },
287
+ },
288
+ },
289
+ );
207
290
  r.queryHandler(
208
291
  "metrics:latest-items",
209
292
  z.object({}),
@@ -19,6 +19,18 @@ export const WIDGETS_I18N = {
19
19
  "widgets:dashboard:net-worth-assets": { de: "Vermögen", en: "Assets" },
20
20
  "widgets:dashboard:net-worth-debts": { de: "Schulden", en: "Debts" },
21
21
  "widgets:dashboard:response-times": { de: "Antwortzeit", en: "Response time" },
22
+ "widgets:dashboard:loan": { de: "Kreditverlauf", en: "Loan balance" },
23
+ "widgets:dashboard:loan-remaining": { de: "Restschuld", en: "Remaining balance" },
24
+ "widgets:dashboard:loan-interest": { de: "Gezahlte Zinsen", en: "Interest paid" },
25
+ "widgets:dashboard:kind-extra": { de: "Sondertilgung", en: "Extra repayment" },
26
+ "widgets:dashboard:kind-payoff": { de: "Ablösung", en: "Payoff" },
27
+ "widgets:dashboard:marker-extra-1": { de: "Sondertilgung 2027", en: "Extra repayment 2027" },
28
+ "widgets:dashboard:marker-extra-2": { de: "Sondertilgung 2032", en: "Extra repayment 2032" },
29
+ "widgets:dashboard:marker-payoff": { de: "Kredit getilgt", en: "Loan repaid" },
30
+ "widgets:dashboard:range-y1": { de: "1 Jahr", en: "1 year" },
31
+ "widgets:dashboard:range-y3": { de: "3 Jahre", en: "3 years" },
32
+ "widgets:dashboard:range-y5": { de: "5 Jahre", en: "5 years" },
33
+ "widgets:dashboard:range-all": { de: "Alles", en: "All" },
22
34
  "widgets:dashboard:latest": { de: "Neueste Ereignisse", en: "Latest events" },
23
35
  "widgets:dashboard:col-name": { de: "Name", en: "Name" },
24
36
  "widgets:dashboard:col-status": { de: "Status", en: "Status" },
@@ -146,6 +146,10 @@ export function Widgets(): ReactNode {
146
146
  </div>
147
147
  </SectionCard>
148
148
 
149
+ <div className="flex h-12 w-64 items-stretch" data-testid="progress-stretch-host">
150
+ <ProgressBar value={0.5} testId="progress-stretch-bar" />
151
+ </div>
152
+
149
153
  <SectionCard
150
154
  title={t("widgets:catalog:repayment-model")}
151
155
  action={
@@ -19,5 +19,8 @@
19
19
  "react-dom": "^19.2.6",
20
20
  "zod": "^4.4.3",
21
21
  "@cosmicdrift/kumiko-locale-de": "workspace:*"
22
+ },
23
+ "devDependencies": {
24
+ "@cosmicdrift/kumiko-testing": "workspace:*"
22
25
  }
23
26
  }
@@ -6,8 +6,7 @@ Canonical smoke-sample. Mounts every bundled-feature so framework-CI catches fea
6
6
 
7
7
  Sprint 9.8 found 12 framework bugs in a Studio deployment that all could have
8
8
  been caught earlier: 27 of 30 bundled features had zero integration coverage
9
- from any real app. This sample is the gate; deployment-specific rollout notes
10
- belong to your private operations documentation.
9
+ from any real app. This sample is the gate.
11
10
 
12
11
  ## CI-Gate
13
12
 
@@ -1399,7 +1399,7 @@
1399
1399
  },
1400
1400
  {
1401
1401
  "name": "jobs",
1402
- "description": "Persistence and operator tooling for background jobs registered via `r.job(...)`. Every job execution writes directly into `store_job_runs` (current status + duration) and `store_job_run_logs` (per-line log rows) from the BullMQ callbacks — no event stream in between (#2243). A daily `retention-cleanup` job deletes runs (and their logs) older than `retentionDays`; an hourly `stale-run-sweep` job marks runs stuck at status `running` past `staleRunTimeoutHours` as `failed` (#2246 — a crashed worker never fires the completion callback, so nothing else ever revisits the row). Exposes `jobs:write:trigger` (manual run) and `jobs:write:retry` (operator retry of a failed run), plus `jobs:query:list`, `jobs:query:details`, and `jobs:query:catalog` (manual jobs) for the operator UI. A job that declares `tenantVisibleFailure` also records its last failed attempt per tenant and subject in `store_tenant_job_failures`, which the tenant itself reads through `jobs:query:failures` — a translation key only, never the provider's message (fw#3079).",
1402
+ "description": "Persistence and operator tooling for background jobs registered via `r.job(...)`. Every job execution writes directly into `store_job_runs` (current status + duration) and `store_job_run_logs` (per-line log rows) from the BullMQ callbacks — no event stream in between (#2243). A daily `retention-cleanup` job deletes runs (and their logs) older than `retentionDays`; an hourly `stale-run-sweep` job marks runs stuck at status `running` past `staleRunTimeoutHours` as `failed` (#2246 — a crashed worker never fires the completion callback, so nothing else ever revisits the row). Exposes `jobs:write:trigger` (manual run) and `jobs:write:retry` (operator retry of a failed run), plus `jobs:query:list`, `jobs:query:details`, and `jobs:query:catalog` (manual jobs) for the operator UI. A job that declares `tenantVisibleFailure` also records its last failed attempt per tenant and subject in `store_tenant_job_failures`, which the tenant itself reads through `jobs:query:failures` — a translation key only, never the provider's message (fw#3079). A job that declares `tenantVisibleRun` also keeps its run state per tenant and subject in `store_tenant_job_runs` (queued, running, plus the latest completed or failed run, no payload, error text or logs), which the tenant reads through `jobs:query:tenant-runs` (fw#3616); the stale-run sweep fails its stuck `running` rows and drops its stuck `queued` rows.",
1403
1403
  "toggleableDefault": null,
1404
1404
  "requires": [],
1405
1405
  "optionalRequires": [],
@@ -115,9 +115,7 @@ then 500s). For a real deploy, swap to the persistent provider in
115
115
 
116
116
  Then set `S3_BUCKET` / `S3_REGION` / `S3_ACCESS_KEY` / `S3_SECRET_KEY` (plus
117
117
  optional `S3_ENDPOINT` for Hetzner/S3-compatible stores) and the app override
118
- `file-foundation:config:provider = "s3-env"`. For full wiring and production
119
- verification, follow your deployment team's private operations documentation.
120
-
118
+ `file-foundation:config:provider = "s3-env"`.
121
119
  ## Adding your own domain
122
120
 
123
121
  To add another DSGVO-compliant entity to the demo:
@@ -87,8 +87,8 @@ imprint" decision.
87
87
 
88
88
  ```bash
89
89
  # In the app workspace:
90
- bun kumiko migrate generate # detects text-block entity → SQL migration
91
- bun kumiko migrate apply # one-time (pre-deploy step in prod)
90
+ bun kumiko-schema generate <name> # detects text-block entity → SQL migration
91
+ bun kumiko-schema apply # one-time (pre-deploy step in prod)
92
92
  ```
93
93
 
94
94
  ### 3. Initial seed of the required blocks
@@ -141,8 +141,7 @@ await seedTextBlock(db, {
141
141
  ```
142
142
 
143
143
  → Templates for full legally-sound texts: e-recht24.de
144
- or datenschutz-generator.de by Dr. Schwenke. Follow your deployment team's
145
- private legal-template documentation for the approved source process.
144
+ or datenschutz-generator.de by Dr. Schwenke.
146
145
 
147
146
  ### 4. Visit the pages
148
147
 
@@ -81,8 +81,8 @@ the recipe lists `createConfigFeature()` explicitly (see `src/feature.ts`).
81
81
  ### 2. Create the table
82
82
 
83
83
  ```bash
84
- bun kumiko migrate generate # detects the `page` entity → SQL migration
85
- bun kumiko migrate apply
84
+ bun kumiko-schema generate <name> # detects the `page` entity → SQL migration
85
+ bun kumiko-schema apply
86
86
  ```
87
87
 
88
88
  ### 3. Authoring + branding
@@ -88,6 +88,4 @@ Wenn eine kaputte Migration den Boot blockiert: setze `skippable: true` im seed-
88
88
 
89
89
  ## See also
90
90
 
91
- - **Plan-Doc:** your deployment team's private operations documentation —
92
- Phase-2+ Operations (projection-rebuild, event-replay, stream-migration, ...)
93
91
  - **Driver-Use-Case:** `seeds/2026-02-01-fix-admin-roles.ts` in this recipe