create-kumiko-app 0.409.0 → 0.411.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.
package/README.md CHANGED
@@ -15,6 +15,7 @@ are resolved automatically — picking `auth-email-password` pulls in
15
15
 
16
16
  ```sh
17
17
  bun create kumiko-app my-app --yes # take every recommended feature
18
+ bun create kumiko-app my-app --blank # no demo tasks, no seeded password; set it via "forgot password"
18
19
  bun create kumiko-app --print-manifest # JSON dump of the picker choices
19
20
  ```
20
21
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled + signup)",
3
- "featureCount": 92,
3
+ "featureCount": 93,
4
4
  "features": [
5
5
  {
6
6
  "name": "account-security",
@@ -704,10 +704,11 @@
704
704
  "delivery",
705
705
  "user-data-rights",
706
706
  "files",
707
- "notes-history",
707
+ "notes-history"
708
+ ],
709
+ "optionalRequires": [
708
710
  "channel-telegram"
709
711
  ],
710
- "optionalRequires": [],
711
712
  "configReads": [],
712
713
  "exposesApis": [],
713
714
  "usesApis": [],
@@ -742,27 +743,6 @@
742
743
  "readRoles": [
743
744
  "SystemAdmin"
744
745
  ]
745
- },
746
- {
747
- "key": "telegram-chat",
748
- "qualifiedName": "contact:config:telegram-chat",
749
- "type": "text",
750
- "scope": "system",
751
- "default": "",
752
- "encrypted": false,
753
- "computed": false,
754
- "validated": false,
755
- "options": null,
756
- "bounds": null,
757
- "pattern": {
758
- "regex": "^$|^(-?[0-9]{1,20}|@[A-Za-z0-9_]{5,32})$"
759
- },
760
- "writeRoles": [
761
- "SystemAdmin"
762
- ],
763
- "readRoles": [
764
- "SystemAdmin"
765
- ]
766
746
  }
767
747
  ],
768
748
  "secrets": [],
@@ -773,7 +753,6 @@
773
753
  "contact:write:reply",
774
754
  "contact:write:report",
775
755
  "contact:write:send-reply-mail",
776
- "contact:write:send-test",
777
756
  "contact:write:submit"
778
757
  ],
779
758
  "uiHints": {
@@ -2270,6 +2249,28 @@
2270
2249
  "recommended": false
2271
2250
  }
2272
2251
  },
2252
+ {
2253
+ "name": "presence",
2254
+ "description": "Who else is on this record right now: a browser sends a heartbeat every 15 seconds for one row of an allow-listed entity and gets the other viewers and editors back, with a live signal to them on a change. State is ephemeral (Redis hash per tenant, entity and row, in-memory without Redis), keyed by the session tenant, expires after ttlSeconds without a heartbeat and holds user ids only; display names are looked up per response. A caller sees presence only for rows visible to them. Mount with createPresenceFeature({ entities: [\"task\"] }).",
2255
+ "toggleableDefault": null,
2256
+ "requires": [],
2257
+ "optionalRequires": [],
2258
+ "configReads": [],
2259
+ "exposesApis": [],
2260
+ "usesApis": [],
2261
+ "extensionsUsed": [],
2262
+ "configKeys": [],
2263
+ "secrets": [],
2264
+ "writeHandlers": [
2265
+ "presence:write:heartbeat",
2266
+ "presence:write:leave"
2267
+ ],
2268
+ "uiHints": {
2269
+ "displayLabel": "Presence",
2270
+ "category": "communication",
2271
+ "recommended": false
2272
+ }
2273
+ },
2273
2274
  {
2274
2275
  "name": "rate-limiting",
2275
2276
  "description": "Adds an ops-side `rate-limiting:query:status` query handler for inspecting current bucket state; the actual request throttling is wired automatically by the dispatcher when any handler declares a `rateLimit` option (e.g. `{ per: 'user', limit: 3, windowSeconds: 60 }`) or when you pass `context.rateLimit` to `buildServer`. Loading this feature is optional if you only need L3 per-handler rate limits and have no need for ops introspection.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-kumiko-app",
3
- "version": "0.409.0",
3
+ "version": "0.411.0",
4
4
  "description": "`bun create kumiko-app <name>` — scaffold a new Kumiko app with an interactive feature picker.",
5
5
  "license": "MIT",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
@@ -27,10 +27,10 @@
27
27
  }
28
28
  },
29
29
  "dependencies": {
30
- "@cosmicdrift/kumiko-dev-server": "0.409.0",
31
- "@cosmicdrift/kumiko-framework": "0.409.0",
32
- "@cosmicdrift/kumiko-server-runtime": "0.409.0",
33
- "@cosmicdrift/kumiko-testing": "0.409.0",
30
+ "@cosmicdrift/kumiko-dev-server": "0.411.0",
31
+ "@cosmicdrift/kumiko-framework": "0.411.0",
32
+ "@cosmicdrift/kumiko-server-runtime": "0.411.0",
33
+ "@cosmicdrift/kumiko-testing": "0.411.0",
34
34
  "@inquirer/core": "^10.3.2",
35
35
  "@inquirer/prompts": "^7.10.1"
36
36
  },
package/src/changes.json CHANGED
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "version": "0.411.0",
4
+ "type": "improvement",
5
+ "title": "--blank flag",
6
+ "detail": "`bun create kumiko-app <name> --blank` scaffolds the blank starter: no demo tasks, no seeded password; the creator sets one through \"forgot password\" after the first start with `KUMIKO_BOOTSTRAP_ADMIN_EMAIL`."
7
+ },
2
8
  {
3
9
  "version": "0.409.0",
4
10
  "type": "improvement",
package/src/index.ts CHANGED
@@ -4,14 +4,19 @@
4
4
  // --print-manifest / --yes) → resolve deps → map to scaffold entries →
5
5
  // scaffoldApp() → print next-steps.
6
6
 
7
- import { type ScaffoldFeatureEntry, scaffoldApp } from "@cosmicdrift/kumiko-dev-server";
7
+ import {
8
+ type ScaffoldFeatureEntry,
9
+ type ScaffoldStarter,
10
+ scaffoldApp,
11
+ } from "@cosmicdrift/kumiko-dev-server";
8
12
  import { renderTestSetup } from "@cosmicdrift/kumiko-testing/scaffold";
9
13
  import { resolveDeps } from "./dep-resolver";
10
14
  import { FEATURE_CONSTRUCTORS } from "./feature-constructors";
11
15
  import { loadManifest, type Manifest } from "./manifest";
12
16
  import { buildChoices, runPicker } from "./picker";
13
17
 
14
- const USAGE = "Usage: bun create kumiko-app <name> [--yes] [--print-manifest] [-h | --help]";
18
+ const USAGE =
19
+ "Usage: bun create kumiko-app <name> [--yes] [--blank] [--print-manifest] [-h | --help]";
15
20
 
16
21
  export type CliArgs = {
17
22
  /** App name (kebab-case). Required for `scaffold` mode. */
@@ -20,6 +25,8 @@ export type CliArgs = {
20
25
  readonly printManifest?: boolean;
21
26
  /** Skip the interactive picker, take every `recommended:true` feature. */
22
27
  readonly yes?: boolean;
28
+ /** `blank` scaffolds no demo tasks and no seeded password; the creator sets one via password reset. */
29
+ readonly starter?: ScaffoldStarter;
23
30
  /** Print usage and exit 0 without scaffolding. */
24
31
  readonly help?: boolean;
25
32
  /** Override cwd for scaffoldApp (mostly for the smoke test). */
@@ -76,6 +83,7 @@ export async function runCreate(args: CliArgs): Promise<number> {
76
83
  cwd: args.cwd,
77
84
  features,
78
85
  testSetup: renderTestSetup,
86
+ ...(args.starter !== undefined && { starter: args.starter }),
79
87
  });
80
88
 
81
89
  log("");
@@ -86,7 +94,11 @@ export async function runCreate(args: CliArgs): Promise<number> {
86
94
  log(" bun install");
87
95
  log(" cp .env.example .env # set JWT_SECRET + KUMIKO_SECRETS_MASTER_KEY_V1");
88
96
  log(" docker compose up -d # if you don't have Postgres + Redis running yet");
89
- log(" bun dev # demo tasks are pre-seeded — URL + login in the banner");
97
+ log(
98
+ args.starter === "blank"
99
+ ? " bun dev # URL + local dev login in the banner; prod admin: see README"
100
+ : " bun dev # demo tasks are pre-seeded — URL + login in the banner",
101
+ );
90
102
  return 0;
91
103
  }
92
104
 
@@ -101,6 +113,7 @@ export function parseArgv(argv: readonly string[]): CliArgs {
101
113
  for (const arg of argv) {
102
114
  if (arg === "--print-manifest") out.printManifest = true;
103
115
  else if (arg === "--yes" || arg === "-y") out.yes = true;
116
+ else if (arg === "--blank") out.starter = "blank";
104
117
  else if (arg === "--help" || arg === "-h") out.help = true;
105
118
  else if (!arg.startsWith("-") && out.name === undefined) out.name = arg;
106
119
  }