create-kumiko-app 0.410.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",
@@ -2249,6 +2249,28 @@
2249
2249
  "recommended": false
2250
2250
  }
2251
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
+ },
2252
2274
  {
2253
2275
  "name": "rate-limiting",
2254
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.410.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.410.0",
31
- "@cosmicdrift/kumiko-framework": "0.410.0",
32
- "@cosmicdrift/kumiko-server-runtime": "0.410.0",
33
- "@cosmicdrift/kumiko-testing": "0.410.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
  }