@cosmicdrift/kumiko-dev-server 0.387.0 → 0.389.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/dist/build-server-bundle.d.ts +1 -1
- package/dist/build-server-bundle.js +2 -2
- package/dist/create-kumiko-server-client-bundles.d.ts +21 -0
- package/dist/create-kumiko-server-client-bundles.js +97 -0
- package/dist/create-kumiko-server-html.d.ts +21 -0
- package/dist/create-kumiko-server-html.js +132 -0
- package/dist/create-kumiko-server-public-files.d.ts +6 -0
- package/dist/create-kumiko-server-public-files.js +96 -0
- package/dist/create-kumiko-server-reload.d.ts +14 -0
- package/dist/create-kumiko-server-reload.js +73 -0
- package/dist/create-kumiko-server-routes.d.ts +16 -0
- package/dist/create-kumiko-server-routes.js +206 -0
- package/dist/create-kumiko-server-shutdown.d.ts +14 -0
- package/dist/create-kumiko-server-shutdown.js +72 -0
- package/dist/create-kumiko-server-stack.d.ts +12 -0
- package/dist/create-kumiko-server-stack.js +102 -0
- package/dist/create-kumiko-server-stylesheet.d.ts +10 -0
- package/dist/create-kumiko-server-stylesheet.js +135 -0
- package/dist/create-kumiko-server-watcher.d.ts +22 -0
- package/dist/create-kumiko-server-watcher.js +155 -0
- package/dist/create-kumiko-server.d.ts +6 -20
- package/dist/create-kumiko-server.js +59 -1046
- package/dist/dev-server-runtime.d.ts +5 -0
- package/dist/dev-server-runtime.js +11 -0
- package/dist/framework-version.js +2 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/managed-files/app-jobs.js +1 -1
- package/dist/managed-files/check.js +1 -1
- package/dist/managed-files/registry.js +5 -1
- package/dist/run-dev-app-auth.d.ts +38 -0
- package/dist/run-dev-app-auth.js +156 -0
- package/dist/run-dev-app-config.d.ts +26 -0
- package/dist/run-dev-app-config.js +185 -0
- package/dist/run-dev-app-server-options.d.ts +13 -0
- package/dist/run-dev-app-server-options.js +49 -0
- package/dist/run-dev-app.d.ts +11 -7
- package/dist/run-dev-app.js +90 -463
- package/dist/scaffold-app.d.ts +2 -1
- package/dist/scaffold-app.js +29 -2
- package/dist/schema-apply.d.ts +1 -1
- package/dist/schema-apply.js +4 -4
- package/dist/setup-test-stack-from-features.d.ts +1 -0
- package/dist/setup-test-stack-from-features.js +6 -2
- package/dist/write-server-lockfile.js +23 -16
- package/package.json +15 -10
- package/src/changes.json +61 -0
- package/templates/deploy/Dockerfile.template +3 -2
- package/templates/managed/ci-public.yml.template +6 -2
- package/templates/managed/kumiko-schema.ts.template +1 -0
package/dist/scaffold-app.js
CHANGED
|
@@ -21,7 +21,9 @@ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
|
21
21
|
import { dirname, join, resolve } from "node:path";
|
|
22
22
|
import { APP_CONFIG_FILE } from "@cosmicdrift/kumiko-framework/config";
|
|
23
23
|
import { collectTableMetas, generateMigration, writeSnapshotJson, } from "@cosmicdrift/kumiko-framework/db";
|
|
24
|
+
import { escapeHtml } from "@cosmicdrift/kumiko-renderer/headless";
|
|
24
25
|
import { composeFeatures } from "@cosmicdrift/kumiko-server-runtime/compose-features";
|
|
26
|
+
import { resolveFrameworkVersion } from "./framework-version.js";
|
|
25
27
|
import { isKebabSegment } from "./kebab.js";
|
|
26
28
|
import { CURRENT_INFRA_REF, PREPARE_SCRIPT, resolveManagedAppFacts, syncManagedFiles, } from "./managed-files/index.js";
|
|
27
29
|
import { renderAgentsMd, renderClaudeMd, renderMountedFeatureList } from "./scaffold-agent-docs.js";
|
|
@@ -45,7 +47,10 @@ export async function scaffoldApp(options) {
|
|
|
45
47
|
if (existsSync(destination)) {
|
|
46
48
|
throw new Error(`scaffoldApp: ${destination} already exists — refusing to overwrite`);
|
|
47
49
|
}
|
|
48
|
-
const version = options.frameworkVersion ??
|
|
50
|
+
const version = options.frameworkVersion ?? resolveFrameworkVersion();
|
|
51
|
+
if (version === undefined) {
|
|
52
|
+
throw new Error("scaffoldApp: cannot resolve the framework version; pass frameworkVersion explicitly");
|
|
53
|
+
}
|
|
49
54
|
const testSetup = options.testSetup?.({ appName: options.name, frameworkVersion: version });
|
|
50
55
|
mkdirSync(join(destination, "bin"), { recursive: true });
|
|
51
56
|
mkdirSync(join(destination, "src"), { recursive: true });
|
|
@@ -84,6 +89,9 @@ export async function scaffoldApp(options) {
|
|
|
84
89
|
files.push("src/client.tsx");
|
|
85
90
|
write(join(destination, "src", "styles.css"), renderStylesCss());
|
|
86
91
|
files.push("src/styles.css");
|
|
92
|
+
mkdirSync(join(destination, "public"), { recursive: true });
|
|
93
|
+
write(join(destination, "public", "index.html"), renderIndexHtml(options.name));
|
|
94
|
+
files.push("public/index.html");
|
|
87
95
|
write(join(destination, ".env.example"), renderEnvExample(options.name));
|
|
88
96
|
files.push(".env.example");
|
|
89
97
|
write(join(destination, "docker-compose.yml"), renderDockerCompose());
|
|
@@ -161,7 +169,7 @@ function renderPackageJson(name, version, testSetup, infraRef) {
|
|
|
161
169
|
"@tailwindcss/cli": "^4.3.0",
|
|
162
170
|
"@types/react": "^19.2.0",
|
|
163
171
|
"@types/react-dom": "^19.2.0",
|
|
164
|
-
"bun-types": "^1.4.
|
|
172
|
+
"bun-types": "^1.4.4",
|
|
165
173
|
tailwindcss: "^4.3.0",
|
|
166
174
|
typescript: "^6.0.3",
|
|
167
175
|
...testSetup?.devDependencies,
|
|
@@ -552,6 +560,8 @@ services:
|
|
|
552
560
|
# Pinned to the project's own compose-file tag (663/1) — Alpine variant
|
|
553
561
|
# (~90MB vs ~400MB) and a reproducible patch version, bump on PG18 minors.
|
|
554
562
|
image: postgres:18.3-alpine
|
|
563
|
+
# Bun.SQL dials its whole pool eagerly; the default of 100 is too tight for app + tests.
|
|
564
|
+
command: postgres -c max_connections=300
|
|
555
565
|
environment:
|
|
556
566
|
POSTGRES_USER: postgres
|
|
557
567
|
POSTGRES_PASSWORD: postgres
|
|
@@ -660,6 +670,23 @@ Files whose first line reads \`kumiko-managed\` (deploy/, .github/workflows/,
|
|
|
660
670
|
For full docs see https://docs.kumiko.rocks.
|
|
661
671
|
`;
|
|
662
672
|
}
|
|
673
|
+
// No inline script: CSP is script-src 'self'.
|
|
674
|
+
function renderIndexHtml(appName) {
|
|
675
|
+
return `<!doctype html>
|
|
676
|
+
<html lang="en">
|
|
677
|
+
<head>
|
|
678
|
+
<meta charset="utf-8" />
|
|
679
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,interactive-widget=resizes-content" />
|
|
680
|
+
<title>${escapeHtml(appName)}</title>
|
|
681
|
+
<link rel="stylesheet" href="/styles.css" />
|
|
682
|
+
</head>
|
|
683
|
+
<body>
|
|
684
|
+
<div id="root"></div>
|
|
685
|
+
<script type="module" src="/client.js"></script>
|
|
686
|
+
</body>
|
|
687
|
+
</html>
|
|
688
|
+
`;
|
|
689
|
+
}
|
|
663
690
|
function renderStylesCss() {
|
|
664
691
|
return [
|
|
665
692
|
'@import "@cosmicdrift/kumiko-renderer/web/styles.css";',
|
package/dist/schema-apply.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export type SchemaApplyOptions = ComposeFeaturesOptions & {
|
|
|
4
4
|
/** App features (e.g. APP_FEATURES from run-config), composed with the
|
|
5
5
|
* bundled features for the projection rebuild registry. */
|
|
6
6
|
readonly features: readonly FeatureDefinition[];
|
|
7
|
-
/** Default INIT_CWD ?? process.cwd();
|
|
7
|
+
/** Default INIT_CWD ?? process.cwd(); migrations live under <appCwd>/kumiko/migrations. */
|
|
8
8
|
readonly appCwd?: string;
|
|
9
9
|
};
|
|
10
10
|
export declare function runSchemaApply(opts: SchemaApplyOptions): Promise<number>;
|
package/dist/schema-apply.js
CHANGED
|
@@ -22,7 +22,7 @@ export async function runSchemaApply(opts) {
|
|
|
22
22
|
const appCwd = opts.appCwd ?? process.env["INIT_CWD"] ?? process.cwd();
|
|
23
23
|
const migrationsDir = join(appCwd, "kumiko/migrations");
|
|
24
24
|
if (!existsSync(migrationsDir)) {
|
|
25
|
-
console.error(`\n ${migrationsDir}
|
|
25
|
+
console.error(`\n ${migrationsDir} is missing — kumiko/migrations/ must be part of the image.\n`);
|
|
26
26
|
return 1;
|
|
27
27
|
}
|
|
28
28
|
const { db, close } = createDbConnection({ url: dbUrl });
|
|
@@ -32,11 +32,11 @@ export async function runSchemaApply(opts) {
|
|
|
32
32
|
// on an empty Greenfield DB they create kumiko_events/_consumers/_projections
|
|
33
33
|
// before the app migrations run. Without this, an empty DB (e.g. cashcolt
|
|
34
34
|
// on a fresh CNPG) fails with `relation "kumiko_events" does not exist`.
|
|
35
|
-
console.log("\n
|
|
35
|
+
console.log("\n Creating framework infrastructure tables (idempotent)…");
|
|
36
36
|
await createEventsTable(db);
|
|
37
37
|
await createEventConsumerStateTable(db);
|
|
38
38
|
await createProjectionStateTable(db);
|
|
39
|
-
console.log(`
|
|
39
|
+
console.log(` Applying kumiko migrations (${migrationsDir})…`);
|
|
40
40
|
const result = await runMigrationsFromDir(db, migrationsDir);
|
|
41
41
|
if (result.applied.length === 0) {
|
|
42
42
|
console.log(`\n ✓ All ${result.skipped.length} migrations already applied.\n`);
|
|
@@ -79,6 +79,6 @@ export async function runStandaloneSchemaCli(opts) {
|
|
|
79
79
|
if (cmd === "schema" && sub === "apply") {
|
|
80
80
|
process.exit(await runSchemaApply(opts));
|
|
81
81
|
}
|
|
82
|
-
console.error(`\n
|
|
82
|
+
console.error(`\n Unknown command: kumiko ${cmd ?? ""} ${sub ?? ""}\n The standalone bundle only supports 'kumiko schema apply'.\n`);
|
|
83
83
|
process.exit(1);
|
|
84
84
|
}
|
|
@@ -5,6 +5,7 @@ export type TestStackPreset = "config" | "template-resolver";
|
|
|
5
5
|
export type SetupTestStackFromFeaturesOptions = Omit<TestStackOptions, "features"> & {
|
|
6
6
|
readonly includeBundled?: boolean;
|
|
7
7
|
readonly authOptions?: ComposeFeaturesOptions["authOptions"];
|
|
8
|
+
readonly bundledLists?: ComposeFeaturesOptions["bundledLists"];
|
|
8
9
|
readonly presets?: readonly TestStackPreset[];
|
|
9
10
|
};
|
|
10
11
|
export declare function mergeExtraContext(base: TestStackOptions["extraContext"], presets: readonly TestStackPreset[]): TestStackOptions["extraContext"];
|
|
@@ -36,8 +36,12 @@ export function mergeExtraContext(base, presets) {
|
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
export async function setupTestStackFromFeatures(appFeatures, options = {}) {
|
|
39
|
-
const { includeBundled = false, authOptions, presets = [], ...stackOptions } = options;
|
|
40
|
-
const features = composeFeatures(appFeatures, {
|
|
39
|
+
const { includeBundled = false, authOptions, bundledLists, presets = [], ...stackOptions } = options;
|
|
40
|
+
const features = composeFeatures(appFeatures, {
|
|
41
|
+
includeBundled,
|
|
42
|
+
authOptions,
|
|
43
|
+
...(bundledLists && { bundledLists }),
|
|
44
|
+
});
|
|
41
45
|
const extraContext = mergeExtraContext(stackOptions.extraContext, presets);
|
|
42
46
|
// Same run-logger wiring as prod, so jobs that declare tenantVisibleFailure
|
|
43
47
|
// write their failure rows in tests too.
|
|
@@ -17,29 +17,36 @@ function findSeedLockfile(startDir) {
|
|
|
17
17
|
dir = parent;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
const outDir = resolve(options.outDir);
|
|
22
|
-
const lockfile = join(outDir, "bun.lock");
|
|
23
|
-
const seedLockfile = findSeedLockfile(options.cwd);
|
|
24
|
-
if (seedLockfile !== undefined)
|
|
25
|
-
await copyFile(seedLockfile, lockfile);
|
|
20
|
+
async function runBun(args, cwd) {
|
|
26
21
|
// process.execPath: the lock format has to match the Bun that built the bundle.
|
|
27
|
-
const
|
|
28
|
-
cmd: [process.execPath,
|
|
29
|
-
cwd
|
|
22
|
+
const proc = Bun.spawn({
|
|
23
|
+
cmd: [process.execPath, ...args],
|
|
24
|
+
cwd,
|
|
30
25
|
stdout: "pipe",
|
|
31
26
|
stderr: "pipe",
|
|
32
27
|
});
|
|
33
28
|
const [exitCode, stdout, stderr] = await Promise.all([
|
|
34
|
-
|
|
35
|
-
new Response(
|
|
36
|
-
new Response(
|
|
29
|
+
proc.exited,
|
|
30
|
+
new Response(proc.stdout).text(),
|
|
31
|
+
new Response(proc.stderr).text(),
|
|
37
32
|
]);
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
return { exitCode, output: stderr.trim() || stdout.trim() };
|
|
34
|
+
}
|
|
35
|
+
export async function writeServerLockfile(options) {
|
|
36
|
+
const outDir = resolve(options.outDir);
|
|
37
|
+
const lockfile = join(outDir, "bun.lock");
|
|
38
|
+
const seedLockfile = findSeedLockfile(options.cwd);
|
|
39
|
+
if (seedLockfile !== undefined)
|
|
40
|
+
await copyFile(seedLockfile, lockfile);
|
|
41
|
+
const install = await runBun(["install", "--lockfile-only"], outDir);
|
|
42
|
+
if (install.exitCode !== 0) {
|
|
43
|
+
throw new Error(`bun install --lockfile-only failed in ${outDir} (exit ${install.exitCode}); shipping dist-server without a lockfile would leave runtime versions unpinned.\n${install.output}`);
|
|
40
44
|
}
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
// A seeded copy exists before the install, so file presence proves nothing: replay the
|
|
46
|
+
// runtime stage's frozen install to catch a lock that never re-resolved for this package.json.
|
|
47
|
+
const frozen = await runBun(["install", "--production", "--frozen-lockfile", "--lockfile-only"], outDir);
|
|
48
|
+
if (frozen.exitCode !== 0) {
|
|
49
|
+
throw new Error(`${lockfile} does not satisfy ${join(outDir, "package.json")} (frozen install exit ${frozen.exitCode}); the runtime image build would fail.\n${frozen.output}`);
|
|
43
50
|
}
|
|
44
51
|
return seedLockfile === undefined
|
|
45
52
|
? { mode: "resolved", lockfile }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-dev-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.389.0",
|
|
4
4
|
"description": "Dev-tooling for Kumiko apps: local dev-server bootstrap (runDevApp), scaffolding. Its compose-stacks/env-schema subpaths are consumed at prod boot too — see @cosmicdrift/kumiko-server-runtime for the prod runner itself.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
@@ -77,18 +77,23 @@
|
|
|
77
77
|
"kumiko-upgrade": "./bin/kumiko-upgrade.ts"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@cosmicdrift/kumiko-bundled-features": "0.
|
|
81
|
-
"@cosmicdrift/kumiko-framework": "0.
|
|
82
|
-
"@cosmicdrift/kumiko-renderer": "0.
|
|
83
|
-
"@cosmicdrift/kumiko-renderer-mail-html": "0.
|
|
84
|
-
"@cosmicdrift/kumiko-guards": "0.
|
|
85
|
-
"@cosmicdrift/kumiko-server-runtime": "0.
|
|
86
|
-
"@cosmicdrift/kumiko-testing": "0.
|
|
87
|
-
"@cosmicdrift/kumiko-types": "0.
|
|
88
|
-
"bun-types": "^1.3.13",
|
|
80
|
+
"@cosmicdrift/kumiko-bundled-features": "0.389.0",
|
|
81
|
+
"@cosmicdrift/kumiko-framework": "0.389.0",
|
|
82
|
+
"@cosmicdrift/kumiko-renderer": "0.389.0",
|
|
83
|
+
"@cosmicdrift/kumiko-renderer-mail-html": "0.389.0",
|
|
84
|
+
"@cosmicdrift/kumiko-guards": "0.389.0",
|
|
85
|
+
"@cosmicdrift/kumiko-server-runtime": "0.389.0",
|
|
86
|
+
"@cosmicdrift/kumiko-testing": "0.389.0",
|
|
87
|
+
"@cosmicdrift/kumiko-types": "0.389.0",
|
|
89
88
|
"ts-morph": "^28.0.0",
|
|
90
89
|
"zod": "^4.4.3"
|
|
91
90
|
},
|
|
91
|
+
"peerDependencies": {
|
|
92
|
+
"bun-types": "^1.4.4"
|
|
93
|
+
},
|
|
94
|
+
"devDependencies": {
|
|
95
|
+
"bun-types": "^1.4.4"
|
|
96
|
+
},
|
|
92
97
|
"publishConfig": {
|
|
93
98
|
"registry": "https://registry.npmjs.org",
|
|
94
99
|
"access": "public",
|
package/src/changes.json
CHANGED
|
@@ -1,4 +1,65 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.389.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "Scaffolded apps pin Bun 1.4.4",
|
|
6
|
+
"detail": "The deploy Dockerfile template, the managed public CI workflow and the scaffolded bun-types range move from Bun 1.4.0 to 1.4.4, the minimum the Bun.SQL driver needs. The managed CI workflow updates on the next sync; the deploy Dockerfile is only written at scaffold time.",
|
|
7
|
+
"migration": "Raise BUN_VERSION in an existing deploy Dockerfile to 1.4.4 and bun-types to ^1.4.4 by hand."
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"version": "0.389.0",
|
|
11
|
+
"type": "improvement",
|
|
12
|
+
"title": "Scaffolded docker-compose raises Postgres max_connections to 300",
|
|
13
|
+
"detail": "Bun.SQL dials its whole pool eagerly, so the default limit of 100 is too tight for an app plus its tests. Existing apps can add command postgres -c max_connections=300 to the postgres service."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"version": "0.389.0",
|
|
17
|
+
"type": "fix",
|
|
18
|
+
"title": "Fresh scaffolds build with bun run build",
|
|
19
|
+
"detail": "create-kumiko-app now writes public/index.html with the /styles.css and /client.js placeholders. Without it kumiko-build stopped with a missing-template error, so the scaffolded Dockerfile could not build either."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"version": "0.389.0",
|
|
23
|
+
"type": "fix",
|
|
24
|
+
"title": "Scaffolded apps get exact framework pins",
|
|
25
|
+
"detail": "resolveFrameworkVersion no longer prefixes ^ and scaffoldApp no longer falls back to \"*\", so a new app is green in kumiko check managed. Without a resolvable version and without an explicit frameworkVersion, scaffoldApp throws."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"version": "0.389.0",
|
|
29
|
+
"type": "improvement",
|
|
30
|
+
"title": "migrate-step.sh leaves the managed file set",
|
|
31
|
+
"detail": "Managed apps run migrations as the k3s InitContainer from release.yml, so deploy/migrate-step.sh is neither scaffolded nor synced for them. Delete it if present. kumiko-init-deploy keeps generating it for compose self-hosting."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"version": "0.388.0",
|
|
35
|
+
"type": "improvement",
|
|
36
|
+
"title": "English buildServerBundle errors",
|
|
37
|
+
"detail": "The errors for a missing bin/main.ts and a missing bin/kumiko.ts in buildServerBundle are now English."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"version": "0.388.0",
|
|
41
|
+
"type": "improvement",
|
|
42
|
+
"title": "Named boot phases for the dev server",
|
|
43
|
+
"detail": "createKumikoServer now reads as a list of phases: client bundles, Tailwind stylesheet, HTML templates, stack boot, background runners, fetch handler, HTTP server, shutdown, file watchers and signal handlers. Each phase lives in its own create-kumiko-server-*.ts file. Request routing is a route table instead of one if chain, and the file watcher classifies changes through suffix and directory tables. Responses, headers, cookies, the reload stream, log lines, exit codes and the start and stop order stay the same. PROD_BUNDLES_ENV, STYLESHEET_WATCH_ENV and resolveStylesheet are still exported from the package index."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"version": "0.388.0",
|
|
47
|
+
"type": "improvement",
|
|
48
|
+
"title": "runDevApp split into boot phases",
|
|
49
|
+
"detail": "runDevApp() keeps its signature and behavior. Config resolution and boot validation (run-dev-app-config.ts), late-bound tier, session and token wiring plus the onAfterSetup step (run-dev-app-auth.ts) and the createKumikoServer options (run-dev-app-server-options.ts) are separate phases. Steps shared with prod come from @cosmicdrift/kumiko-server-runtime/boot/shared-boot-steps. A new unit test covers the late-bound tier resolver's boot-order guard and trialGate delegation."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"version": "0.388.0",
|
|
53
|
+
"type": "fix",
|
|
54
|
+
"title": "runDevApp releases the KMS on any boot failure; server lockfile is verified",
|
|
55
|
+
"detail": "runDevApp closes the KMS wiring when a boot gate throws before the server is created. Stopping one app no longer replaces the session, MFA and PAT revokers a newer app bound on the same feature instances: the bind functions of sessions, auth-mfa and personal-access-tokens return an unbind that only clears its own binding. writeServerLockfile replays the frozen install the runtime image runs, so a lock that did not re-resolve fails in kumiko-build."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"version": "0.388.0",
|
|
59
|
+
"type": "fix",
|
|
60
|
+
"title": "Managed CI, app jobs and static config parsing",
|
|
61
|
+
"detail": "The public ci.yml sets MEILI_URL and MEILI_MASTER_KEY for the Meilisearch service. App-owned workflow jobs with a trailing comment or a quoted name survive a sync. kumiko.config.ts with shorthand or spread siblings next to literal ports is read as defined instead of invalid."
|
|
62
|
+
},
|
|
2
63
|
{
|
|
3
64
|
"version": "0.379.0",
|
|
4
65
|
"type": "fix",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#
|
|
12
12
|
# Build context: repository root (the full source tree is only used in the build stage).
|
|
13
13
|
|
|
14
|
-
ARG BUN_VERSION=1.4.
|
|
14
|
+
ARG BUN_VERSION=1.4.4
|
|
15
15
|
{{#hasPrivateGhPackages}}
|
|
16
16
|
# Registry auth for @cosmicdriftgamestudio: CI passes the token as
|
|
17
17
|
# NPM_AUTH_TOKEN via --build-arg. Multi-stage ARG scoping needs the
|
|
@@ -69,7 +69,8 @@ RUN bun install --production --frozen-lockfile
|
|
|
69
69
|
# Client build (static assets) — served by runProdApp.staticDir.
|
|
70
70
|
COPY --from=build --chown=app:app /app/dist ./dist
|
|
71
71
|
|
|
72
|
-
# Checked-in SQL migrations for the pre-deploy `kumiko schema apply` step
|
|
72
|
+
# Checked-in SQL migrations for the pre-deploy `kumiko schema apply` step
|
|
73
|
+
# (k3s InitContainer from release.yml, or migrate-step.sh on compose hosts).
|
|
73
74
|
# The shipped `kumiko-schema` bin reads `${INIT_CWD}/kumiko/migrations/*.sql`
|
|
74
75
|
# (see ENV INIT_CWD=/app below). kumiko/schema.ts is NOT needed at runtime
|
|
75
76
|
# (only generate reads it; apply is checksum-tracked SQL only).
|
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
fetch-depth: 0
|
|
32
32
|
- uses: oven-sh/setup-bun@v2
|
|
33
33
|
with:
|
|
34
|
-
bun-version: "1.4.
|
|
34
|
+
bun-version: "1.4.4"
|
|
35
35
|
- run: bun install --frozen-lockfile
|
|
36
36
|
- run: bun run typecheck
|
|
37
37
|
- run: bun run lint
|
|
@@ -81,7 +81,7 @@ jobs:
|
|
|
81
81
|
- uses: actions/checkout@v7
|
|
82
82
|
- uses: oven-sh/setup-bun@v2
|
|
83
83
|
with:
|
|
84
|
-
bun-version: "1.4.
|
|
84
|
+
bun-version: "1.4.4"
|
|
85
85
|
- run: bun install --frozen-lockfile
|
|
86
86
|
- name: Create test database
|
|
87
87
|
env:
|
|
@@ -95,6 +95,10 @@ jobs:
|
|
|
95
95
|
TEST_DATABASE_URL: postgresql://kumiko:kumiko@localhost:15432/kumiko_test
|
|
96
96
|
REDIS_URL: redis://localhost:16379
|
|
97
97
|
JWT_SECRET: testtesttesttesttesttesttesttest
|
|
98
|
+
{{#meilisearch}}
|
|
99
|
+
MEILI_URL: http://localhost:17700
|
|
100
|
+
MEILI_MASTER_KEY: kumiko-dev-key
|
|
101
|
+
{{/meilisearch}}
|
|
98
102
|
run: bun run test:integration
|
|
99
103
|
|
|
100
104
|
# Build on main only; the rollout runs through the manual release workflow.
|
|
@@ -22,6 +22,7 @@ const HAS_AUTH =
|
|
|
22
22
|
|
|
23
23
|
export const FEATURES: readonly FeatureDefinition[] = composeFeatures([...CONFIGURED_FEATURES], {
|
|
24
24
|
includeBundled: HAS_AUTH,
|
|
25
|
+
...(appConfig.bundledLists && { bundledLists: appConfig.bundledLists }),
|
|
25
26
|
});
|
|
26
27
|
|
|
27
28
|
// `kumiko check` validates the boot with the options kumiko.config.ts declares.
|