@cosmicdrift/kumiko-dev-server 0.386.0 → 0.388.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/LICENSE +21 -57
- package/dist/build-server-bundle.d.ts +7 -7
- package/dist/build-server-bundle.js +53 -53
- package/dist/build.js +3 -3
- package/dist/compose-stacks.d.ts +2 -2
- package/dist/compose-stacks.js +1 -2
- package/dist/crash-tracker.d.ts +3 -7
- package/dist/crash-tracker.js +4 -13
- 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 +101 -0
- package/dist/create-kumiko-server-stylesheet.d.ts +10 -0
- package/dist/create-kumiko-server-stylesheet.js +137 -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 +53 -71
- package/dist/create-kumiko-server.js +59 -1076
- package/dist/dev-server-runtime.d.ts +5 -0
- package/dist/dev-server-runtime.js +11 -0
- package/dist/env-schema.d.ts +1 -1
- package/dist/env-schema.js +4 -4
- package/dist/index.d.ts +3 -1
- package/dist/index.js +17 -15
- package/dist/managed-files/app-jobs.js +1 -1
- package/dist/managed-files/check.js +1 -1
- package/dist/run-dev-app-auth.d.ts +38 -0
- package/dist/run-dev-app-auth.js +155 -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 +52 -50
- package/dist/run-dev-app.js +100 -471
- package/dist/scaffold-app-feature.js +5 -4
- package/dist/scaffold-app.js +5 -7
- package/dist/schema-apply.d.ts +3 -3
- package/dist/schema-apply.js +16 -16
- package/dist/schema-tables-auth-mode.js +16 -15
- package/dist/schema-tables-minimal.js +7 -7
- package/dist/setup-test-stack-from-features.js +1 -1
- package/dist/welcome-banner.js +2 -2
- package/dist/write-server-lockfile.js +23 -16
- package/package.json +10 -10
- package/src/changes.json +30 -0
- package/templates/managed/ci-public.yml.template +4 -0
package/dist/scaffold-app.js
CHANGED
|
@@ -192,12 +192,10 @@ const FOUNDATION_FEATURES = [
|
|
|
192
192
|
callExpression: "createSessionsFeature()",
|
|
193
193
|
},
|
|
194
194
|
];
|
|
195
|
-
// composeFeatures({ includeBundled: true }) auto-
|
|
196
|
-
//
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
// jemand scaffoldApp() direkt mit allen Bundled-Feature-Entries aufruft
|
|
200
|
-
// rutschen die 4 nicht in run-config.ts.
|
|
195
|
+
// composeFeatures({ includeBundled: true }) auto-mounts these four foundation features.
|
|
196
|
+
// Listing them again in APP_FEATURES caused duplicate-registration warnings in
|
|
197
|
+
// scaffolded `bun dev`; filtering also protects direct scaffoldApp() calls that
|
|
198
|
+
// pass all bundled-feature entries, keeping these four out of run-config.ts.
|
|
201
199
|
const COMPOSE_AUTO_MOUNTED_NAMES = new Set(["config", "user", "tenant", "auth-email-password"]);
|
|
202
200
|
const MAX_LINE_WIDTH = 100;
|
|
203
201
|
// Mirrors Biome's import sort so generated files pass `biome check` untouched:
|
|
@@ -367,7 +365,7 @@ function renderMain(appName) {
|
|
|
367
365
|
'displayName: "Admin",',
|
|
368
366
|
]);
|
|
369
367
|
// Subject-key KMS is optional locally (plaintext + loud warning) but required
|
|
370
|
-
// under NODE_ENV=production
|
|
368
|
+
// under NODE_ENV=production.
|
|
371
369
|
return `// Production-bootstrap. KUMIKO_DRY_RUN_ENV=boot exits after
|
|
372
370
|
// composeFeatures + validateBoot + createRegistry without DB/Redis-connect
|
|
373
371
|
// (see @cosmicdrift/kumiko-server-runtime runProdApp).
|
package/dist/schema-apply.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type FeatureDefinition } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { type ComposeFeaturesOptions } from "@cosmicdrift/kumiko-server-runtime/compose-features";
|
|
3
3
|
export type SchemaApplyOptions = ComposeFeaturesOptions & {
|
|
4
|
-
/** App
|
|
5
|
-
*
|
|
4
|
+
/** App features (e.g. APP_FEATURES from run-config), composed with the
|
|
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
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// Standalone `kumiko schema apply`
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// Standalone `kumiko schema apply` for production bundles. Apps bundle a thin
|
|
2
|
+
// bin/kumiko.ts that only calls runStandaloneSchemaCli with the app features;
|
|
3
|
+
// all orchestration (infrastructure bootstrap, migrations, projection rebuild)
|
|
4
|
+
// lives here instead of being repeated as ~100 lines of boilerplate per app.
|
|
5
5
|
//
|
|
6
|
-
//
|
|
7
|
-
// kumiko-build
|
|
6
|
+
// The Pulumi-migrate-initContainer calls `bun /app/kumiko.js schema apply`;
|
|
7
|
+
// kumiko-build discovers the app bin via findRepoRoot() and bundles it.
|
|
8
8
|
import { existsSync } from "node:fs";
|
|
9
9
|
import { join } from "node:path";
|
|
10
10
|
import { createDbConnection, runMigrationsFromDir } from "@cosmicdrift/kumiko-framework/db";
|
|
@@ -22,21 +22,21 @@ 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 });
|
|
29
29
|
try {
|
|
30
|
-
//
|
|
31
|
-
// tableExists-gated idempotent:
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
console.log("\n
|
|
30
|
+
// Create infrastructure tables (event store + pipeline state) first; all are
|
|
31
|
+
// tableExists-gated and idempotent: on an existing DB this is a no-op, while
|
|
32
|
+
// on an empty Greenfield DB they create kumiko_events/_consumers/_projections
|
|
33
|
+
// before the app migrations run. Without this, an empty DB (e.g. cashcolt
|
|
34
|
+
// on a fresh CNPG) fails with `relation "kumiko_events" does not exist`.
|
|
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`);
|
|
@@ -52,7 +52,7 @@ export async function runSchemaApply(opts) {
|
|
|
52
52
|
// Projection rebuild: persistent queue instead of "only this run's
|
|
53
53
|
// result.applied" — otherwise a failed rebuild stays silently stuck
|
|
54
54
|
// forever, since the migration is already tracked applied and gets
|
|
55
|
-
// skipped on the next apply
|
|
55
|
+
// skipped on the next apply. queueRebuildsFromMarkers persists
|
|
56
56
|
// the marker tables BEFORE the rebuild; runPendingRebuilds unconditionally
|
|
57
57
|
// also picks up open entries from earlier, failed runs — not just the
|
|
58
58
|
// ones this run freshly applied.
|
|
@@ -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
|
}
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
// Drizzle
|
|
1
|
+
// Drizzle schema barrel: framework infrastructure tables.
|
|
2
2
|
//
|
|
3
|
-
// Re-
|
|
4
|
-
//
|
|
3
|
+
// Re-exports the framework-owned tables (event store + pipeline state)
|
|
4
|
+
// that every app must have in its database. The app author writes:
|
|
5
5
|
//
|
|
6
6
|
// // drizzle/schema.ts
|
|
7
7
|
// export * from "@cosmicdrift/kumiko-dev-server/drizzle-tables-auth-mode";
|
|
8
|
-
// export * from "./schema.generated"; // App-
|
|
8
|
+
// export * from "./schema.generated"; // App-owned + bundle entity tables
|
|
9
9
|
//
|
|
10
|
-
// drizzle-kit
|
|
11
|
-
//
|
|
10
|
+
// drizzle-kit only looks for pgTable instances in the schema module and
|
|
11
|
+
// ignores all other exports — `export *` is safe here.
|
|
12
12
|
//
|
|
13
|
-
// Bundle
|
|
14
|
-
// userSessionTable, tenantMembershipsTable etc.)
|
|
15
|
-
//
|
|
16
|
-
// r.entity()
|
|
17
|
-
//
|
|
18
|
-
//
|
|
13
|
+
// Bundle entity tables (configValuesTable, tenantTable, userTable,
|
|
14
|
+
// userSessionTable, tenantMembershipsTable, etc.) are intentionally NOT here:
|
|
15
|
+
// they come through schema.generated.ts via buildEntityTable from the
|
|
16
|
+
// r.entity() definitions, which has been the single source of truth since the
|
|
17
|
+
// entity.indexes API. Duplicate re-exports would create two pgTable instances
|
|
18
|
+
// with identical index names, causing a drizzle-kit warning.
|
|
19
19
|
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
22
|
-
//
|
|
20
|
+
// The file name "auth-mode" is historical — its contents are now purely
|
|
21
|
+
// framework infrastructure. Renaming it would be a breaking change for app
|
|
22
|
+
// imports.
|
|
23
|
+
// Framework infrastructure (always present, regardless of features)
|
|
23
24
|
export { archivedStreamsTable, eventsTable, snapshotsTable, } from "@cosmicdrift/kumiko-framework/event-store";
|
|
24
25
|
export { eventConsumerStateTable, projectionStateTable, } from "@cosmicdrift/kumiko-framework/pipeline";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
// Drizzle
|
|
1
|
+
// Minimal Drizzle schema barrel (framework infrastructure only, no auth).
|
|
2
2
|
//
|
|
3
|
-
// Apps
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Apps WITHOUT an auth stack (anonymous-only, embedded demos, headless APIs)
|
|
4
|
+
// need only the framework infrastructure tables — event store and
|
|
5
|
+
// pipeline state. Use in drizzle/schema.ts:
|
|
6
6
|
//
|
|
7
7
|
// export * from "@cosmicdrift/kumiko-dev-server/drizzle-tables-minimal";
|
|
8
|
-
// export * from "./schema.generated"; // App-
|
|
8
|
+
// export * from "./schema.generated"; // App-specific entity tables
|
|
9
9
|
//
|
|
10
|
-
//
|
|
11
|
-
// plus
|
|
10
|
+
// To include auth tables, use drizzle-tables-auth-mode (includes Minimal
|
|
11
|
+
// plus bundle tables for config, tenant, user, and sessions).
|
|
12
12
|
export { archivedStreamsTable, eventsTable, snapshotsTable, upcasterDeadLetterTable, } from "@cosmicdrift/kumiko-framework/event-store";
|
|
13
13
|
export { eventConsumerStateTable, projectionStateTable, } from "@cosmicdrift/kumiko-framework/pipeline";
|
|
@@ -25,7 +25,7 @@ export function mergeExtraContext(base, presets) {
|
|
|
25
25
|
const fromBase = typeof base === "function" ? base(deps) : base !== undefined ? { ...base } : {};
|
|
26
26
|
const merged = { ...fromBase };
|
|
27
27
|
if (presets.includes("config")) {
|
|
28
|
-
// Same precedence as mergeConfigResolverDefault (run-dev-app.ts) — a base-supplied resolver wins, factory always derives from it
|
|
28
|
+
// Same precedence as mergeConfigResolverDefault (run-dev-app.ts) — a base-supplied resolver wins, factory always derives from it.
|
|
29
29
|
const configResolver = resolveBaseConfigResolver(fromBase) ?? createConfigResolver();
|
|
30
30
|
Object.assign(merged, addConfigAccessorFactory({ configResolver }, deps.registry));
|
|
31
31
|
}
|
package/dist/welcome-banner.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// First-run welcome banner for `runDevApp({ welcomeBanner: true })`.
|
|
2
2
|
// Opt-in only — `bun dev` should not normalize this for apps that
|
|
3
3
|
// already log their own startup. Scaffolded apps (create-kumiko-app)
|
|
4
|
-
// flip it on so the first `bun dev` doesn't end on "
|
|
5
|
-
// the user wondering where to click.
|
|
4
|
+
// flip it on so the first `bun dev` doesn't end on a bare "server running"
|
|
5
|
+
// line with the user wondering where to click.
|
|
6
6
|
export function renderWelcomeBanner(input) {
|
|
7
7
|
const featuresDir = input.featuresDir ?? "src/features/";
|
|
8
8
|
const docsUrl = input.docsUrl ?? "https://docs.kumiko.rocks/quickstart";
|
|
@@ -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,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosmicdrift/kumiko-dev-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.388.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
|
-
"license": "
|
|
5
|
+
"license": "MIT",
|
|
6
6
|
"author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -77,14 +77,14 @@
|
|
|
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.
|
|
80
|
+
"@cosmicdrift/kumiko-bundled-features": "0.388.0",
|
|
81
|
+
"@cosmicdrift/kumiko-framework": "0.388.0",
|
|
82
|
+
"@cosmicdrift/kumiko-renderer": "0.388.0",
|
|
83
|
+
"@cosmicdrift/kumiko-renderer-mail-html": "0.388.0",
|
|
84
|
+
"@cosmicdrift/kumiko-guards": "0.388.0",
|
|
85
|
+
"@cosmicdrift/kumiko-server-runtime": "0.388.0",
|
|
86
|
+
"@cosmicdrift/kumiko-testing": "0.388.0",
|
|
87
|
+
"@cosmicdrift/kumiko-types": "0.388.0",
|
|
88
88
|
"bun-types": "^1.3.13",
|
|
89
89
|
"ts-morph": "^28.0.0",
|
|
90
90
|
"zod": "^4.4.3"
|
package/src/changes.json
CHANGED
|
@@ -1,4 +1,34 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.388.0",
|
|
4
|
+
"type": "improvement",
|
|
5
|
+
"title": "English buildServerBundle errors",
|
|
6
|
+
"detail": "The errors for a missing bin/main.ts and a missing bin/kumiko.ts in buildServerBundle are now English."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"version": "0.388.0",
|
|
10
|
+
"type": "improvement",
|
|
11
|
+
"title": "Named boot phases for the dev server",
|
|
12
|
+
"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."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.388.0",
|
|
16
|
+
"type": "improvement",
|
|
17
|
+
"title": "runDevApp split into boot phases",
|
|
18
|
+
"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."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"version": "0.388.0",
|
|
22
|
+
"type": "fix",
|
|
23
|
+
"title": "runDevApp releases the KMS on any boot failure; server lockfile is verified",
|
|
24
|
+
"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."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"version": "0.388.0",
|
|
28
|
+
"type": "fix",
|
|
29
|
+
"title": "Managed CI, app jobs and static config parsing",
|
|
30
|
+
"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."
|
|
31
|
+
},
|
|
2
32
|
{
|
|
3
33
|
"version": "0.379.0",
|
|
4
34
|
"type": "fix",
|
|
@@ -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.
|