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 +1 -0
- package/feature-manifest.json +23 -1
- package/package.json +5 -5
- package/src/changes.json +6 -0
- package/src/index.ts +16 -3
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
|
|
package/feature-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"source": "samples/apps/use-all-bundled APP_FEATURES (composeFeatures includeBundled + signup)",
|
|
3
|
-
"featureCount":
|
|
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.
|
|
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.
|
|
31
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
32
|
-
"@cosmicdrift/kumiko-server-runtime": "0.
|
|
33
|
-
"@cosmicdrift/kumiko-testing": "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 {
|
|
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 =
|
|
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(
|
|
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
|
}
|