create-kumiko-app 0.4.103 → 0.4.105
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.
- package/feature-manifest.json +142 -2
- package/package.json +3 -3
- package/src/index.ts +5 -5
package/feature-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled)",
|
|
3
|
-
"featureCount":
|
|
3
|
+
"featureCount": 53,
|
|
4
4
|
"features": [
|
|
5
5
|
{
|
|
6
6
|
"name": "admin-shell",
|
|
@@ -1054,7 +1054,7 @@
|
|
|
1054
1054
|
},
|
|
1055
1055
|
{
|
|
1056
1056
|
"name": "managed-pages",
|
|
1057
|
-
"description": "Tenant-editable, server-rendered public pages with per-tenant branding. Stores one Markdown `page` per `(tenantId, slug, lang)` in the `read_pages` entity table with a `published` gate plus `description`/`ogImage` SEO meta. Registers an anonymous `GET {basePath}/:slug` route that resolves the tenant from the request Host via the app-supplied `resolveApexTenant`, serves only published pages (drafts → 404), renders Markdown through the hardened `page-render` core, and isolates per-tenant content with `Vary: Host`. Ships TenantAdmin/SystemAdmin admin screens (`entityList` + `entityEdit`) backed by convention CRUD handlers (`managed-pages:write:page:{create,update,delete}`, `managed-pages:query:page:{list,detail}`); the app wires nav/workspace onto `managed-pages:screen:page-list`. Branding (via `config`, scope tenant): `branding-{title,description,site-url,accent-color,logo-url,layout-preset}` keys with write-time validation (hex color, https URLs), a `configEdit` self-service screen (`managed-pages:screen:branding-settings`), and a `managed-pages:query:branding` read that the render path applies as scoped `:root` CSS vars + a logo/title header. Also exposes `managed-pages:write:set` (idempotent slug-keyed upsert, SystemAdmin cross-tenant via `tenantIdOverride`) as a provisioning API. Requires `config` + `anonymousAccess` wired at app bootstrap.",
|
|
1057
|
+
"description": "Tenant-editable, server-rendered public pages with per-tenant branding. Stores one Markdown `page` per `(tenantId, slug, lang)` in the `read_pages` entity table with a `published` gate plus `description`/`ogImage` SEO meta. Registers an anonymous `GET {basePath}/:slug` route that resolves the tenant from the request Host via the app-supplied `resolveApexTenant`, serves only published pages (drafts → 404), renders Markdown through the hardened `page-render` core, and isolates per-tenant content with `Vary: Host`. Ships TenantAdmin/SystemAdmin admin screens (`entityList` + `entityEdit`) backed by convention CRUD handlers (`managed-pages:write:page:{create,update,delete}`, `managed-pages:query:page:{list,detail}`); the app wires nav/workspace onto `managed-pages:screen:page-list`. Also exposes `managed-pages:query:by-tenant-published` (anonymous, SQL-filtered on `published`) for sitemap/discovery consumers such as the `seo` feature. Branding (via `config`, scope tenant): `branding-{title,description,site-url,accent-color,logo-url,layout-preset}` keys with write-time validation (hex color, https URLs), a `configEdit` self-service screen (`managed-pages:screen:branding-settings`), and a `managed-pages:query:branding` read that the render path applies as scoped `:root` CSS vars + a logo/title header. Also exposes `managed-pages:write:set` (idempotent slug-keyed upsert, SystemAdmin cross-tenant via `tenantIdOverride`) as a provisioning API. Requires `config` + `anonymousAccess` wired at app bootstrap.",
|
|
1058
1058
|
"toggleableDefault": null,
|
|
1059
1059
|
"requires": [
|
|
1060
1060
|
"config"
|
|
@@ -1378,6 +1378,146 @@
|
|
|
1378
1378
|
"recommended": true
|
|
1379
1379
|
}
|
|
1380
1380
|
},
|
|
1381
|
+
{
|
|
1382
|
+
"name": "seo",
|
|
1383
|
+
"description": "Site-discovery + SEO/AEO/GEO surface for apex/content pages. Serves GET /sitemap.xml and GET /llms.txt (both anonymous, revalidate-cached), merging the app-supplied sitemapEntries() callback with legal-pages' fixed routes (includeLegalPages) and/or managed-pages' published slugs (managedPages.resolveApexTenant) when opted in. Serves GET /robots.txt only when robotsPolicy is supplied (default off — the static public/robots.txt already covers the common case). Tenant-scoped config keys (seo:config:seo-organization-{name,logo-url}, seo:config:seo-twitter-site, seo:config:seo-llms-summary, seo:config:seo-default-og-image) feed the Organization JSON-LD helper + llms.txt summary. Also exports pure schema.org JSON-LD builders (organizationSchema/webPageSchema/faqPageSchema) for apps to pass into ApexHead.schemaJson or wrapInLayout({ seo: { schemaJson } }) directly — this feature does not inject JSON-LD on its own routes.",
|
|
1384
|
+
"toggleableDefault": null,
|
|
1385
|
+
"requires": [
|
|
1386
|
+
"config"
|
|
1387
|
+
],
|
|
1388
|
+
"optionalRequires": [
|
|
1389
|
+
"legal-pages",
|
|
1390
|
+
"managed-pages"
|
|
1391
|
+
],
|
|
1392
|
+
"configReads": [],
|
|
1393
|
+
"exposesApis": [],
|
|
1394
|
+
"usesApis": [],
|
|
1395
|
+
"extensionsUsed": [],
|
|
1396
|
+
"configKeys": [
|
|
1397
|
+
{
|
|
1398
|
+
"key": "seo-default-og-image",
|
|
1399
|
+
"qualifiedName": "seo:config:seo-default-og-image",
|
|
1400
|
+
"type": "text",
|
|
1401
|
+
"scope": "tenant",
|
|
1402
|
+
"default": "",
|
|
1403
|
+
"encrypted": false,
|
|
1404
|
+
"computed": false,
|
|
1405
|
+
"options": null,
|
|
1406
|
+
"bounds": null,
|
|
1407
|
+
"pattern": {
|
|
1408
|
+
"regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
|
|
1409
|
+
},
|
|
1410
|
+
"writeRoles": [
|
|
1411
|
+
"system",
|
|
1412
|
+
"TenantAdmin",
|
|
1413
|
+
"Admin",
|
|
1414
|
+
"SystemAdmin"
|
|
1415
|
+
],
|
|
1416
|
+
"readRoles": [
|
|
1417
|
+
"all"
|
|
1418
|
+
]
|
|
1419
|
+
},
|
|
1420
|
+
{
|
|
1421
|
+
"key": "seo-llms-summary",
|
|
1422
|
+
"qualifiedName": "seo:config:seo-llms-summary",
|
|
1423
|
+
"type": "text",
|
|
1424
|
+
"scope": "tenant",
|
|
1425
|
+
"default": "",
|
|
1426
|
+
"encrypted": false,
|
|
1427
|
+
"computed": false,
|
|
1428
|
+
"options": null,
|
|
1429
|
+
"bounds": null,
|
|
1430
|
+
"pattern": {
|
|
1431
|
+
"regex": "^[\\s\\S]{0,500}$"
|
|
1432
|
+
},
|
|
1433
|
+
"writeRoles": [
|
|
1434
|
+
"system",
|
|
1435
|
+
"TenantAdmin",
|
|
1436
|
+
"Admin",
|
|
1437
|
+
"SystemAdmin"
|
|
1438
|
+
],
|
|
1439
|
+
"readRoles": [
|
|
1440
|
+
"all"
|
|
1441
|
+
]
|
|
1442
|
+
},
|
|
1443
|
+
{
|
|
1444
|
+
"key": "seo-organization-logo-url",
|
|
1445
|
+
"qualifiedName": "seo:config:seo-organization-logo-url",
|
|
1446
|
+
"type": "text",
|
|
1447
|
+
"scope": "tenant",
|
|
1448
|
+
"default": "",
|
|
1449
|
+
"encrypted": false,
|
|
1450
|
+
"computed": false,
|
|
1451
|
+
"options": null,
|
|
1452
|
+
"bounds": null,
|
|
1453
|
+
"pattern": {
|
|
1454
|
+
"regex": "^$|^https://[^\\s\"'<>]{1,2000}$"
|
|
1455
|
+
},
|
|
1456
|
+
"writeRoles": [
|
|
1457
|
+
"system",
|
|
1458
|
+
"TenantAdmin",
|
|
1459
|
+
"Admin",
|
|
1460
|
+
"SystemAdmin"
|
|
1461
|
+
],
|
|
1462
|
+
"readRoles": [
|
|
1463
|
+
"all"
|
|
1464
|
+
]
|
|
1465
|
+
},
|
|
1466
|
+
{
|
|
1467
|
+
"key": "seo-organization-name",
|
|
1468
|
+
"qualifiedName": "seo:config:seo-organization-name",
|
|
1469
|
+
"type": "text",
|
|
1470
|
+
"scope": "tenant",
|
|
1471
|
+
"default": "",
|
|
1472
|
+
"encrypted": false,
|
|
1473
|
+
"computed": false,
|
|
1474
|
+
"options": null,
|
|
1475
|
+
"bounds": null,
|
|
1476
|
+
"pattern": {
|
|
1477
|
+
"regex": "^[\\s\\S]{0,500}$"
|
|
1478
|
+
},
|
|
1479
|
+
"writeRoles": [
|
|
1480
|
+
"system",
|
|
1481
|
+
"TenantAdmin",
|
|
1482
|
+
"Admin",
|
|
1483
|
+
"SystemAdmin"
|
|
1484
|
+
],
|
|
1485
|
+
"readRoles": [
|
|
1486
|
+
"all"
|
|
1487
|
+
]
|
|
1488
|
+
},
|
|
1489
|
+
{
|
|
1490
|
+
"key": "seo-twitter-site",
|
|
1491
|
+
"qualifiedName": "seo:config:seo-twitter-site",
|
|
1492
|
+
"type": "text",
|
|
1493
|
+
"scope": "tenant",
|
|
1494
|
+
"default": "",
|
|
1495
|
+
"encrypted": false,
|
|
1496
|
+
"computed": false,
|
|
1497
|
+
"options": null,
|
|
1498
|
+
"bounds": null,
|
|
1499
|
+
"pattern": {
|
|
1500
|
+
"regex": "^[\\s\\S]{0,500}$"
|
|
1501
|
+
},
|
|
1502
|
+
"writeRoles": [
|
|
1503
|
+
"system",
|
|
1504
|
+
"TenantAdmin",
|
|
1505
|
+
"Admin",
|
|
1506
|
+
"SystemAdmin"
|
|
1507
|
+
],
|
|
1508
|
+
"readRoles": [
|
|
1509
|
+
"all"
|
|
1510
|
+
]
|
|
1511
|
+
}
|
|
1512
|
+
],
|
|
1513
|
+
"secrets": [],
|
|
1514
|
+
"writeHandlers": [],
|
|
1515
|
+
"uiHints": {
|
|
1516
|
+
"displayLabel": "SEO / Site Discovery",
|
|
1517
|
+
"category": "content",
|
|
1518
|
+
"recommended": false
|
|
1519
|
+
}
|
|
1520
|
+
},
|
|
1381
1521
|
{
|
|
1382
1522
|
"name": "sessions",
|
|
1383
1523
|
"description": "Tracks signed-in clients in the `read_user_sessions` table (one row per JWT, keyed by the `sid`/`jti` claim) and exposes handlers for `mine` (list your sessions), `revoke`, and `revokeAllOthers`. Session creation and revocation on the hot auth path are handled by `createSessionCallbacks()`, wired into `buildServer({ auth: { ... } })` outside the dispatcher; the feature also ships a manual-trigger cleanup job for pruning expired rows and an optional `autoRevokeOnPasswordChange` hook that mass-revokes all sessions for a user whenever their `passwordHash` changes.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-kumiko-app",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.105",
|
|
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,8 +30,8 @@
|
|
|
30
30
|
"vendor:manifest": "bun run scripts/vendor-manifest.ts"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@cosmicdrift/kumiko-dev-server": "0.
|
|
34
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
33
|
+
"@cosmicdrift/kumiko-dev-server": "0.146.0",
|
|
34
|
+
"@cosmicdrift/kumiko-framework": "0.146.0",
|
|
35
35
|
"@inquirer/core": "^10.0.0",
|
|
36
36
|
"@inquirer/prompts": "^7.4.0"
|
|
37
37
|
},
|
package/src/index.ts
CHANGED
|
@@ -39,7 +39,7 @@ export async function runCreate(args: CliArgs): Promise<number> {
|
|
|
39
39
|
|
|
40
40
|
const selected = args.yes ? defaultSelection(manifest) : await runPicker(manifest);
|
|
41
41
|
if (selected.length === 0) {
|
|
42
|
-
log("
|
|
42
|
+
log("No features selected — aborting.");
|
|
43
43
|
return 1;
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -71,12 +71,12 @@ export async function runCreate(args: CliArgs): Promise<number> {
|
|
|
71
71
|
log("");
|
|
72
72
|
log(`✓ ${result.appName} scaffolded → ${result.destination}`);
|
|
73
73
|
log("");
|
|
74
|
-
log("
|
|
74
|
+
log("Next steps:");
|
|
75
75
|
log(` cd ${args.name}`);
|
|
76
76
|
log(" bun install");
|
|
77
|
-
log(" cp .env.example .env # JWT_SECRET + KUMIKO_SECRETS_MASTER_KEY_V1
|
|
78
|
-
log(" docker compose up -d #
|
|
79
|
-
log(" bun dev #
|
|
77
|
+
log(" cp .env.example .env # set JWT_SECRET + KUMIKO_SECRETS_MASTER_KEY_V1");
|
|
78
|
+
log(" docker compose up -d # if you don't have Postgres + Redis running yet");
|
|
79
|
+
log(" bun dev # demo tasks are pre-seeded — URL + login in the banner");
|
|
80
80
|
return 0;
|
|
81
81
|
}
|
|
82
82
|
|