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 +1 -0
- package/feature-manifest.json +26 -25
- 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",
|
|
@@ -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.
|
|
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
|
}
|