create-kumiko-app 0.4.176 → 0.4.178

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled + signup)",
3
- "featureCount": 60,
3
+ "featureCount": 62,
4
4
  "features": [
5
5
  {
6
6
  "name": "admin-shell",
@@ -354,6 +354,20 @@
354
354
  "recommended": false
355
355
  }
356
356
  },
357
+ {
358
+ "name": "collection-labels",
359
+ "description": "Nav labels for the content collections mounted by this sample app.",
360
+ "toggleableDefault": null,
361
+ "requires": [],
362
+ "optionalRequires": [],
363
+ "configReads": [],
364
+ "exposesApis": [],
365
+ "usesApis": [],
366
+ "extensionsUsed": [],
367
+ "configKeys": [],
368
+ "secrets": [],
369
+ "writeHandlers": []
370
+ },
357
371
  {
358
372
  "name": "compliance-profiles",
359
373
  "description": "Lets each tenant select a compliance regime (e.g. `eu-dsgvo`, `swiss-dsg`, `de-hr-dsgvo-hgb`) that bundles user-rights grace periods, breach-disclosure deadlines, sub-processor requirements, and audit-retention rules into a single named profile. Tenant admins call `compliance-profiles:write:set-profile` to choose a profile (with optional JSON override for edge cases); other features resolve the effective profile via the `compliance.forTenant` cross-feature API. Required by `user-data-rights` — mount this feature before it.",
@@ -1963,7 +1977,7 @@
1963
1977
  },
1964
1978
  {
1965
1979
  "name": "template-resolver",
1966
- "description": "The one content store: notification and mail templates, PDF document templates, AI prompts and plain editable text blocks all live here as one entity, distinguished by `kind` (`notification`, `mail-html`, `document-pdf`, `ai-prompt`, `text-block`, `image-snapshot`). Resolution uses a 4-level fallback: tenant+locale → system+locale → tenant+fallback-locale → system+fallback-locale, so tenants can override system defaults without touching application code. Call `ctx.templateResolver.resolveTemplate({ tenantId, slug, kind, locale })` at render time; manage templates via the `upsertSystem`, `upsertTenant`, `publish` and `archive` write handlers. Apps that want an editable collection in their navigation declare it at mount: `createTemplateResolverFeature({ collections: [{ id, kind, access: { roles }, nav }] })` — `access` belongs to the mount because a bundled feature does not know the host's role vocabulary. Each collection gets its own `<id>-list` / `<id>-item` / `<id>-set` handlers carrying that collection's access rule, so the dispatcher enforces the separation. Replaces the former `text-content` feature, whose blocks now live here as kind `text-block`.",
1980
+ "description": "The one content store: notification and mail templates, PDF document templates, AI prompts and plain editable text blocks all live here as one entity, distinguished by `kind` (`notification`, `mail-html`, `document-pdf`, `ai-prompt`, `text-block`, `image-snapshot`). Resolution uses a 4-level fallback: tenant+locale → system+locale → tenant+fallback-locale → system+fallback-locale, so tenants can override system defaults without touching application code. Call `ctx.templateResolver.resolveTemplate({ tenantId, slug, kind, locale })` at render time; manage templates via the `upsertSystem`, `upsertTenant`, `publish` and `archive` write handlers. Apps that want an editable collection in their navigation declare it at mount: `createTemplateResolverFeature({ collections: [{ id, kind, access: { roles }, nav }] })` — `access` belongs to the mount because a bundled feature does not know the host's role vocabulary. Each collection gets its own `<id>-list` / `<id>-item` / `<id>-set` handlers carrying that collection's access rule, so the dispatcher enforces the separation. A collection is either tenant-wide (default) or `ownership: \"user\"`, where every user keeps their own entries (mail signatures) in the separate `user-content-entry` entity — that one carries `userOwned` content, so mounting it also requires the `template-resolver-user-data` feature and an app-side migration. Replaces the former `text-content` feature, whose blocks now live here as kind `text-block`.",
1967
1981
  "toggleableDefault": null,
1968
1982
  "requires": [],
1969
1983
  "optionalRequires": [],
@@ -1976,7 +1990,9 @@
1976
1990
  "writeHandlers": [
1977
1991
  "template-resolver:write:archive",
1978
1992
  "template-resolver:write:publish",
1993
+ "template-resolver:write:reply-snippets-set",
1979
1994
  "template-resolver:write:set",
1995
+ "template-resolver:write:signatures-set",
1980
1996
  "template-resolver:write:upsert-system",
1981
1997
  "template-resolver:write:upsert-tenant"
1982
1998
  ],
@@ -1986,6 +2002,29 @@
1986
2002
  "recommended": false
1987
2003
  }
1988
2004
  },
2005
+ {
2006
+ "name": "template-resolver-user-data",
2007
+ "description": "GDPR (Art. 20 export / Art. 17 erasure) coverage for the `template-resolver` feature's `user-content-entry` entity — the per-user half of the content store (mail signatures, personal reply snippets). Mounts the EXT_USER_DATA export hook so a user's own entries land in the export bundle; the delete hook is a deliberate no-op because `content` is annotated `userOwned`, so erasure runs via crypto-shredding (destroying the owner's subject key) rather than a physical delete, which would not survive an event replay. Mount this whenever `createTemplateResolverFeature` declares a collection with `ownership: \"user\"` — the boot guard otherwise refuses the entity. Requires `user-data-rights`, optionalRequires `template-resolver`.",
2008
+ "toggleableDefault": null,
2009
+ "requires": [
2010
+ "user-data-rights"
2011
+ ],
2012
+ "optionalRequires": [
2013
+ "template-resolver"
2014
+ ],
2015
+ "configReads": [],
2016
+ "exposesApis": [],
2017
+ "usesApis": [],
2018
+ "extensionsUsed": [
2019
+ {
2020
+ "extensionName": "userData",
2021
+ "entityName": "user-content-entry"
2022
+ }
2023
+ ],
2024
+ "configKeys": [],
2025
+ "secrets": [],
2026
+ "writeHandlers": []
2027
+ },
1989
2028
  {
1990
2029
  "name": "tenant",
1991
2030
  "description": "Registers the three core multi-tenancy entities — `tenant`, `tenant-membership`, and `tenant-invitation` (DB tables `read_tenants`, `read_tenant_memberships`, and `read_tenant_invitations`) — along with write handlers for create/update/disable/enable/addMember/removeMember/updateMemberRoles and the matching queries. It also declares a set of per-tenant config keys (companyName, timezone, locale, SMTP credentials) and system-only keys (priceModel, maxUsers) via `r.config({ keys: { ... } })`. Use this feature in every multi-tenant app; membership resolution and invitation flows depend on it, and `auth-email-password` requires it.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-kumiko-app",
3
- "version": "0.4.176",
3
+ "version": "0.4.178",
4
4
  "description": "`bun create kumiko-app <name>` — scaffold a new Kumiko app with an interactive feature picker.",
5
5
  "license": "BUSL-1.1",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -30,9 +30,9 @@
30
30
  "vendor:manifest": "bun run scripts/vendor-manifest.ts"
31
31
  },
32
32
  "dependencies": {
33
- "@cosmicdrift/kumiko-dev-server": "0.178.1",
34
- "@cosmicdrift/kumiko-framework": "0.178.1",
35
- "@cosmicdrift/kumiko-server-runtime": "0.178.1",
33
+ "@cosmicdrift/kumiko-dev-server": "0.180.0",
34
+ "@cosmicdrift/kumiko-framework": "0.180.0",
35
+ "@cosmicdrift/kumiko-server-runtime": "0.180.0",
36
36
  "@inquirer/core": "^10.0.0",
37
37
  "@inquirer/prompts": "^7.4.0"
38
38
  },