okengine 0.10.3 → 0.11.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/package.json +76 -10
- package/site/content/docs/deployment/docker-swarm.mdx +48 -111
- package/site/content/docs/deployment/docker.mdx +43 -36
- package/site/content/docs/deployment/index.mdx +9 -9
- package/site/content/docs/deployment/kubernetes.mdx +4 -4
- package/site/content/docs/elements/ai.mdx +7 -7
- package/site/content/docs/elements/channel.mdx +9 -7
- package/site/content/docs/elements/clock.mdx +8 -8
- package/site/content/docs/elements/flow.mdx +46 -47
- package/site/content/docs/elements/gate.mdx +6 -5
- package/site/content/docs/elements/signal.mdx +2 -2
- package/site/content/docs/elements/store.mdx +71 -78
- package/site/content/docs/elements/vault.mdx +89 -70
- package/site/content/docs/get-started/basic-usage.mdx +8 -8
- package/site/content/docs/get-started/installation.mdx +36 -36
- package/site/content/docs/get-started/introduction.mdx +11 -0
- package/site/content/docs/get-started/why.mdx +2 -2
- package/site/content/docs/plugins/anonymous.mdx +1 -1
- package/site/content/docs/plugins/magic-link.mdx +11 -11
- package/site/content/docs/plugins/otp.mdx +2 -2
- package/site/content/docs/plugins/passkey.mdx +1 -1
- package/site/content/docs/plugins/two-factor.mdx +1 -1
- package/site/content/docs/plugins/username.mdx +1 -1
- package/site/content/docs/recipes/caddy.mdx +1 -1
- package/site/content/docs/recipes/cockroachdb.mdx +2 -2
- package/site/content/docs/recipes/dragonfly.mdx +1 -1
- package/site/content/docs/recipes/index.mdx +1 -2
- package/site/content/docs/recipes/llama-cpp.mdx +21 -23
- package/site/content/docs/recipes/mailpit.mdx +11 -11
- package/site/content/docs/recipes/meilisearch.mdx +10 -10
- package/site/content/docs/recipes/meta.json +0 -1
- package/site/content/docs/recipes/ollama.mdx +1 -1
- package/site/content/docs/recipes/pgdog.mdx +12 -9
- package/site/content/docs/recipes/postgres.mdx +3 -3
- package/site/content/docs/recipes/redis.mdx +2 -2
- package/site/content/docs/recipes/rustfs.mdx +10 -7
- package/site/content/docs/recipes/sglang.mdx +1 -1
- package/site/content/docs/recipes/supabase-docker.mdx +1 -1
- package/site/content/docs/recipes/timescale.mdx +2 -2
- package/site/content/docs/recipes/valkey.mdx +1 -1
- package/site/content/docs/recipes/vllm.mdx +1 -1
- package/site/content/docs/recipes/yugabytedb.mdx +2 -2
- package/site/content/docs/reference/cli.md +61 -38
- package/site/content/docs/reference/configuration.mdx +145 -70
- package/site/content/docs/reference/environment-variables.mdx +36 -28
- package/site/content/docs/reference/errors.mdx +28 -29
- package/site/content/docs/reference/fx.mdx +11 -4
- package/site/content/docs/reference/i18n.mdx +17 -6
- package/site/content/docs/reference/index.mdx +5 -0
- package/site/content/docs/reference/meta.json +1 -0
- package/site/content/docs/reference/migrating-environments.mdx +158 -0
- package/site/content/docs/reference/plugins.mdx +2 -2
- package/src/auth/gate-auth.test.ts +12 -10
- package/src/cli/ai-setup/ai-setup.test.ts +27 -15
- package/src/cli/ai-setup/apply.ts +111 -15
- package/src/cli/ai-setup/catalog.ts +3 -3
- package/src/cli/ai-setup/index.ts +1 -1
- package/src/cli/ai-setup/prompts.ts +1 -1
- package/src/cli/ai-setup/recommend.test.ts +1 -1
- package/src/cli/ask-seed.test.ts +3 -3
- package/src/cli/build.ts +1 -1
- package/src/cli/db-auto-push.test.ts +6 -3
- package/src/cli/db-auto-push.ts +7 -5
- package/src/cli/db-seed.ts +7 -8
- package/src/cli/db.test.ts +70 -71
- package/src/cli/db.ts +86 -12
- package/src/cli/dev-controller.test.ts +35 -0
- package/src/cli/dev-controller.ts +298 -0
- package/src/cli/dev-controls.ts +11 -65
- package/src/cli/dev-db-push.test.ts +47 -15
- package/src/cli/dev-schema-sync.test.ts +11 -11
- package/src/cli/dev-schema-sync.ts +10 -10
- package/src/cli/dev-session-lock.test.ts +106 -0
- package/src/cli/dev-session-lock.ts +209 -0
- package/src/cli/dev.test.ts +166 -121
- package/src/cli/dev.ts +138 -192
- package/src/cli/doc-staleness.test.ts +3 -6
- package/src/cli/docker-clean.test.ts +33 -1
- package/src/cli/docker-clean.ts +28 -33
- package/src/cli/docker-cli.test.ts +12 -11
- package/src/cli/docker.ts +95 -20
- package/src/cli/doctor.test.ts +40 -0
- package/src/cli/doctor.ts +55 -15
- package/src/cli/drizzle-env.test.ts +11 -13
- package/src/cli/drizzle-env.ts +18 -11
- package/src/cli/ensure-drizzle-config.ts +11 -14
- package/src/cli/hero-meta.test.ts +15 -15
- package/src/cli/hero-meta.ts +10 -9
- package/src/cli/index.ts +36 -6
- package/src/cli/load-config.images.test.ts +16 -12
- package/src/cli/load-config.source.test.ts +50 -0
- package/src/cli/load-config.ts +34 -28
- package/src/cli/meilisearch-local.ts +1 -2
- package/src/cli/mode.ts +7 -58
- package/src/cli/registry.ts +175 -19
- package/src/cli/resolve-dev-sql-env.test.ts +8 -16
- package/src/cli/resolve-dev-sql-env.ts +13 -15
- package/src/cli/safe-defaults.test.ts +28 -10
- package/src/cli/schema.ts +65 -16
- package/src/cli/test.ts +58 -0
- package/src/cli/tui/App.tsx +252 -0
- package/src/cli/tui/DevLive.tsx +116 -0
- package/src/cli/tui/components/ConfirmDialog.tsx +48 -0
- package/src/cli/tui/components/HeaderBar.tsx +67 -0
- package/src/cli/tui/components/LogStream.tsx +47 -0
- package/src/cli/tui/components/PanelCard.tsx +39 -0
- package/src/cli/tui/components/SelectRow.tsx +37 -0
- package/src/cli/tui/components/SlashPalette.tsx +172 -0
- package/src/cli/tui/components/Spinner.tsx +32 -0
- package/src/cli/tui/components/StatusBar.tsx +51 -0
- package/src/cli/tui/components/StatusDot.tsx +37 -0
- package/src/cli/tui/components/TabBar.tsx +49 -0
- package/src/cli/tui/components/Wordmark.tsx +43 -0
- package/src/cli/tui/format.ts +38 -0
- package/src/cli/tui/keys.test.ts +18 -0
- package/src/cli/tui/keys.ts +26 -0
- package/src/cli/tui/launch.test.ts +18 -0
- package/src/cli/tui/launch.ts +57 -0
- package/src/cli/tui/panels/Dashboard.tsx +201 -0
- package/src/cli/tui/panels/Database.tsx +198 -0
- package/src/cli/tui/panels/Dev.tsx +257 -0
- package/src/cli/tui/panels/Docker.tsx +357 -0
- package/src/cli/tui/panels/Navigator.test.ts +22 -0
- package/src/cli/tui/panels/Navigator.tsx +213 -0
- package/src/cli/tui/slash-catalog.test.ts +31 -0
- package/src/cli/tui/slash-catalog.ts +184 -0
- package/src/cli/tui/slash-run.ts +54 -0
- package/src/cli/tui/state/ports.ts +95 -0
- package/src/cli/tui/theme.ts +24 -0
- package/src/cli/vault-cmd.test.ts +402 -0
- package/src/cli/vault-cmd.ts +727 -69
- package/src/cli/vault-secure-input.test.ts +56 -0
- package/src/cli/vault-secure-input.ts +124 -0
- package/src/compiler/effects-infer.ts +7 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -1
- package/src/compiler/fixtures/skyport.expected.json +1 -1
- package/src/compiler-entry.ts +7 -0
- package/src/config/define-config.test.ts +111 -47
- package/src/config/driver-defaults.test.ts +16 -23
- package/src/config/driver-defaults.ts +33 -63
- package/src/config/index.ts +169 -144
- package/src/config/resolve-driver.test.ts +14 -19
- package/src/console/server/app.ts +4 -2
- package/src/console/server/console.test.ts +58 -1
- package/src/console/server/flows.ts +22 -2
- package/src/console/server/index.ts +3 -0
- package/src/console/server/operator-db.test.ts +55 -13
- package/src/console/server/operator-db.ts +305 -263
- package/src/console/server/serve.ts +16 -7
- package/src/console/server/state.ts +31 -9
- package/src/console/server/vault.test.ts +120 -5
- package/src/console/server/vault.ts +208 -12
- package/src/console/ui/dist/assets/{index-D-9KFce5.js → index--Y0Uaz-m.js} +2 -2
- package/src/console/ui/dist/assets/panel-vault-BkZdJPX8.js +1 -0
- package/src/console/ui/dist/assets/style-C3L349iZ.css +3 -0
- package/src/console/ui/dist/index.html +2 -2
- package/src/console/ui/shell/client.ts +16 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +54 -1
- package/src/console/ui/vault/VaultA11yView.tsx +33 -1
- package/src/console/ui/vault/backend.test.ts +75 -0
- package/src/console/ui/vault/backend.ts +117 -0
- package/src/console/ui/vault/fixture.ts +21 -2
- package/src/console/ui/vault/index.ts +11 -1
- package/src/console/ui/vault/types.ts +26 -0
- package/src/docker/compose.ts +164 -61
- package/src/docker/derive.ts +106 -12
- package/src/docker/docker.test.ts +156 -110
- package/src/docker/helpers.ts +98 -0
- package/src/docker/images-config.test.ts +3 -8
- package/src/docker/index.ts +30 -5
- package/src/docker/recipes/index.ts +0 -3
- package/src/docker/recipes/llama-cpp.ts +4 -4
- package/src/docker/recipes/pgdog.ts +9 -2
- package/src/docker/resources.test.ts +71 -0
- package/src/docker/resources.ts +176 -0
- package/src/docker/stack-id.test.ts +11 -4
- package/src/docker/stack-id.ts +42 -32
- package/src/docker/stack.integration.test.ts +4 -15
- package/src/docker/types.ts +35 -3
- package/src/drivers/ai-ollama.integration.test.ts +2 -2
- package/src/drivers/conformance.test.ts +11 -12
- package/src/drivers/drizzle-dialect.test.ts +0 -4
- package/src/drivers/drizzle-dialect.ts +7 -13
- package/src/drivers/index.ts +24 -7
- package/src/drivers/journal-postgres.test.ts +3 -1
- package/src/drivers/journal-postgres.ts +4 -2
- package/src/drivers/meilisearch.ts +1 -1
- package/src/drivers/pglite.ts +28 -5
- package/src/drivers/types.ts +9 -11
- package/src/drivers/vault-aws-secrets-manager.test.ts +159 -0
- package/src/drivers/vault-aws-secrets-manager.ts +333 -0
- package/src/drivers/vault-builtin.test.ts +110 -0
- package/src/drivers/vault-builtin.ts +184 -0
- package/src/drivers/vault-driver-removal.test.ts +13 -0
- package/src/drivers/vault-managed.test.ts +95 -0
- package/src/drivers/vault-managed.ts +101 -25
- package/src/drivers/vault-types.ts +25 -5
- package/src/elements/ai/runtime.ts +1 -1
- package/src/elements/clock/chaos.test.ts +4 -1
- package/src/elements/clock/durable.ts +57 -4
- package/src/elements/clock.test.ts +13 -14
- package/src/elements/gate/constants.ts +18 -0
- package/src/elements/gate.test.ts +1 -1
- package/src/elements/gate.ts +2 -2
- package/src/elements/store/domain-ddl.test.ts +5 -12
- package/src/elements/store/emit-drizzle.ts +44 -19
- package/src/elements/store/index-boot.test.ts +15 -116
- package/src/elements/store/load-plugin-tables.ts +1 -1
- package/src/elements/store/resource-list-docs.fixture.ts +12 -6
- package/src/elements/store/resource-list-docs.test.ts +64 -44
- package/src/elements/store/resource.test.ts +17 -10
- package/src/elements/store/runtime.ts +9 -12
- package/src/elements/store/schema-decl.test.ts +16 -32
- package/src/elements/store/seed.test.ts +1 -2
- package/src/elements/store/seed.ts +7 -8
- package/src/elements/store/sql-condition.test.ts +2 -2
- package/src/elements/store/sql-session.test.ts +8 -10
- package/src/elements/store/sql-session.ts +10 -2
- package/src/elements/store.test.ts +13 -13
- package/src/elements/vault/audit.ts +233 -0
- package/src/elements/vault/boot-chain.test.ts +78 -0
- package/src/elements/vault/boot-chain.ts +43 -39
- package/src/elements/vault/builtin-adapter.test.ts +479 -0
- package/src/elements/vault/builtin-adapter.ts +1184 -0
- package/src/elements/vault/crypto.test.ts +237 -0
- package/src/elements/vault/crypto.ts +431 -0
- package/src/elements/vault/declare.ts +164 -3
- package/src/elements/vault/errors.ts +56 -0
- package/src/elements/vault/kms-unseal.test.ts +76 -0
- package/src/elements/vault/kms-unseal.ts +181 -0
- package/src/elements/vault/path.ts +90 -0
- package/src/elements/vault/resilience.test.ts +102 -0
- package/src/elements/vault/resilience.ts +107 -0
- package/src/elements/vault/runtime.ts +36 -4
- package/src/elements/vault/security-checklist.test.ts +130 -0
- package/src/elements/vault/storage.ts +448 -0
- package/src/elements/vault/types.ts +288 -0
- package/src/elements/vault/unseal.ts +150 -0
- package/src/elements/vault.test.ts +72 -4
- package/src/elements/vault.ts +91 -2
- package/src/full.ts +248 -0
- package/src/http.ts +41 -0
- package/src/i18n/interpolate-simple.ts +37 -0
- package/src/i18n/messages.ts +51 -4
- package/src/i18n-entry.ts +7 -0
- package/src/index.ts +35 -145
- package/src/journal-entry.ts +20 -0
- package/src/kernel/adopt-barrel-fresh.test.ts +25 -10
- package/src/kernel/app.ts +40 -42
- package/src/kernel/auto-registry.test.ts +2 -2
- package/src/kernel/boot-bind/ai.test.ts +5 -5
- package/src/kernel/boot-bind/ai.ts +2 -1
- package/src/kernel/boot-bind/channel.test.ts +6 -6
- package/src/kernel/boot-bind/channel.ts +3 -10
- package/src/kernel/boot-bind/clock.ts +2 -2
- package/src/kernel/boot-bind/gate.ts +5 -9
- package/src/kernel/boot-bind/honor-config.test.ts +42 -42
- package/src/kernel/boot-bind/journal.ts +2 -2
- package/src/kernel/boot-bind/store.test.ts +43 -44
- package/src/kernel/boot-bind/store.ts +16 -41
- package/src/kernel/boot-bind/vault.ts +16 -1
- package/src/kernel/boot.test.ts +12 -4
- package/src/kernel/boot.ts +31 -19
- package/src/kernel/budget-entry.ts +1 -1
- package/src/kernel/compensate.test.ts +288 -1
- package/src/kernel/compensate.ts +126 -0
- package/src/kernel/concurrency.test.ts +10 -9
- package/src/kernel/effects-stamping.test.ts +27 -2
- package/src/kernel/element-registries.ts +5 -3
- package/src/kernel/flow.ts +4 -2
- package/src/kernel/fx.test.ts +119 -3
- package/src/kernel/fx.ts +215 -40
- package/src/kernel/index.ts +14 -0
- package/src/kernel/journal.ts +130 -7
- package/src/kernel/pipeline.test.ts +20 -6
- package/src/kernel/redacted.test.ts +35 -0
- package/src/kernel/redacted.ts +24 -2
- package/src/kernel/router/create-default.ts +16 -0
- package/src/kernel/router/create-edge.ts +18 -0
- package/src/kernel/router/create.ts +23 -0
- package/src/kernel/router/index.ts +23 -0
- package/src/kernel/router/linear.ts +88 -0
- package/src/kernel/router/regexp.ts +188 -0
- package/src/kernel/router/smart.ts +120 -0
- package/src/kernel/router/trie.ts +108 -0
- package/src/kernel/router/types.ts +56 -0
- package/src/kernel/router.ts +18 -532
- package/src/kernel-entry.ts +43 -0
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/plugins/config-source.test.ts +7 -7
- package/src/release/build-lib.ts +58 -0
- package/src/release/exports.test.ts +4 -2
- package/src/release/exports.ts +30 -4
- package/src/release/measure.ts +101 -22
- package/src/runs/duckdb.ts +7 -2
- package/src/shared/optional-peer.ts +41 -0
- package/src/term.test.ts +3 -44
- package/src/test/create-test-app.ts +12 -0
- package/src/test/provisions.integration.test.ts +1 -1
- package/src/test/reset-element-registries.ts +2 -0
- package/src/upgrade/codemods.test.ts +7 -20
- package/src/upgrade/codemods.ts +93 -60
- package/site/content/docs/recipes/openbao.mdx +0 -141
- package/src/cli/ask-dev-mode.ts +0 -40
- package/src/cli/dev-mode.test.ts +0 -45
- package/src/cli/dev-mode.ts +0 -78
- package/src/cli/openbao-bootstrap.test.ts +0 -150
- package/src/cli/openbao-bootstrap.ts +0 -321
- package/src/cli/openbao-restart.integration.test.ts +0 -145
- package/src/console/ui/dist/assets/panel-vault-Za1GyJfM.js +0 -1
- package/src/console/ui/dist/assets/style-C8MxEWPd.css +0 -3
- package/src/docker/recipes/openbao.ts +0 -47
- package/src/drivers/libsql.ts +0 -179
- package/src/drivers/sqlite.ts +0 -44
- package/src/drivers/vault-openbao.test.ts +0 -97
- package/src/drivers/vault-openbao.ts +0 -143
package/src/cli/drizzle-env.ts
CHANGED
|
@@ -64,36 +64,43 @@ export async function applyComposeEnvToProcess(cwd: string): Promise<readonly st
|
|
|
64
64
|
* Dialect comes from the configured driver via the exhaustive
|
|
65
65
|
* `SQL_DRIVER_TO_DRIZZLE_DIALECT` map — a missing/unsupported driver id is a
|
|
66
66
|
* compile-time gap there, and a clear runtime error here (never a silent
|
|
67
|
-
*
|
|
67
|
+
* fallback).
|
|
68
68
|
*
|
|
69
69
|
* @param cwd - Project root
|
|
70
|
-
* @param config - Loaded `oke.config.ts` (null →
|
|
71
|
-
* @param env - Active
|
|
70
|
+
* @param config - Loaded `oke.config.ts` (null → postgres/dev defaults)
|
|
71
|
+
* @param env - Active {@link ConfigEnv}
|
|
72
72
|
*/
|
|
73
73
|
export async function resolveDrizzleKitEnv(
|
|
74
74
|
cwd: string,
|
|
75
75
|
config: OkeConfig | null | undefined,
|
|
76
76
|
env: ConfigEnv,
|
|
77
77
|
): Promise<DrizzleKitEnvContext> {
|
|
78
|
-
const driverId = resolveDriverId(config?.drivers?.store?.sql, env) ?? "
|
|
79
|
-
if (driverId !== "
|
|
78
|
+
const driverId = resolveDriverId(config?.drivers?.store?.sql, env) ?? "postgres";
|
|
79
|
+
if (driverId !== "postgres" && driverId !== "pglite") {
|
|
80
80
|
throw new Error(
|
|
81
|
-
`oke db: store.sql driver "${driverId}" is not supported by drizzle-kit (
|
|
81
|
+
`oke db: store.sql driver "${driverId}" is not supported by drizzle-kit (postgres | pglite)`,
|
|
82
82
|
);
|
|
83
83
|
}
|
|
84
84
|
const dialect = drizzleDialectFromSqlDriver(driverId);
|
|
85
85
|
|
|
86
|
-
const compose = env === "
|
|
86
|
+
const compose = env === "dev" ? await readComposeEnv(cwd) : new Map<string, string>();
|
|
87
87
|
|
|
88
88
|
const overlay: Record<string, string> = { OKE_DRIZZLE_DIALECT: dialect };
|
|
89
|
-
if (
|
|
89
|
+
if (driverId === "pglite") {
|
|
90
90
|
const url =
|
|
91
|
+
process.env.OKE_PGLITE_URL ??
|
|
92
|
+
compose.get("OKE_PGLITE_URL") ??
|
|
93
|
+
(env === "test" ? "memory://" : ".oke/pgdata");
|
|
94
|
+
overlay.OKE_PGLITE_URL = url;
|
|
95
|
+
// drizzle-kit still wants a postgres-shaped URL for dialect postgresql when
|
|
96
|
+
// not using PGlite kit plugins — prefer DATABASE_URL from compose for push.
|
|
97
|
+
const pgUrl =
|
|
91
98
|
process.env.DATABASE_URL ?? compose.get("DATABASE_URL") ?? compose.get("OKE_STORE_SQL_URL");
|
|
92
|
-
if (
|
|
99
|
+
if (pgUrl !== undefined) overlay.DATABASE_URL = pgUrl;
|
|
93
100
|
} else {
|
|
94
101
|
const url =
|
|
95
|
-
process.env.
|
|
96
|
-
overlay.
|
|
102
|
+
process.env.DATABASE_URL ?? compose.get("DATABASE_URL") ?? compose.get("OKE_STORE_SQL_URL");
|
|
103
|
+
if (url !== undefined) overlay.DATABASE_URL = url;
|
|
97
104
|
}
|
|
98
105
|
return { env, dialect, overlay };
|
|
99
106
|
}
|
|
@@ -5,32 +5,29 @@
|
|
|
5
5
|
|
|
6
6
|
import { resolve } from "node:path";
|
|
7
7
|
|
|
8
|
-
/**
|
|
8
|
+
/** PostgreSQL-only template (matches create-oke templates' drizzle.config.ts). */
|
|
9
9
|
const DRIZZLE_CONFIG_TEMPLATE = `import { defineConfig } from "drizzle-kit";
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Domain schema sync for \`oke db push|generate|migrate\`.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* for the active dialect as a pre-step of \`oke db\` / \`oke dev\`.
|
|
14
|
+
* SQL is PostgreSQL-only (postgres / pglite). Domain tables come from
|
|
15
|
+
* \`src/db/schema.decl.ts\` → \`src/db/schema.drizzle.ts\` (emitted as a
|
|
16
|
+
* pre-step of \`oke db\` / \`oke dev\`).
|
|
18
17
|
*
|
|
19
|
-
*
|
|
18
|
+
* System / auth / plugin stubs are separate: \`oke schema generate\` →
|
|
19
|
+
* \`.oke/schema/oke.ts\` (gitignored with \`.oke/\`). Re-run after adding plugins.
|
|
20
|
+
*
|
|
21
|
+
* Versioned prod migrations land in \`./src/db/migrations\`.
|
|
20
22
|
*/
|
|
21
|
-
const dialect = (process.env.OKE_DRIZZLE_DIALECT ?? "sqlite") as "sqlite" | "postgresql";
|
|
22
|
-
|
|
23
23
|
export default defineConfig({
|
|
24
|
-
dialect,
|
|
25
|
-
schema: "./src/db/schema.
|
|
24
|
+
dialect: "postgresql",
|
|
25
|
+
schema: "./src/db/schema.drizzle.ts",
|
|
26
26
|
out: "./src/db/migrations",
|
|
27
27
|
// Core runtime tables (oke_crons, …) are created by drivers — not domain schema.
|
|
28
28
|
tablesFilter: ["!oke_*"],
|
|
29
29
|
dbCredentials: {
|
|
30
|
-
url:
|
|
31
|
-
dialect === "postgresql"
|
|
32
|
-
? (process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL!)
|
|
33
|
-
: (process.env.OKE_SQLITE_URL ?? "file:.oke/app.sqlite"),
|
|
30
|
+
url: process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL!,
|
|
34
31
|
},
|
|
35
32
|
});
|
|
36
33
|
`;
|
|
@@ -15,23 +15,23 @@ import {
|
|
|
15
15
|
const SAMPLE: OkeConfig = {
|
|
16
16
|
drivers: {
|
|
17
17
|
store: {
|
|
18
|
-
sql: {
|
|
19
|
-
kv: {
|
|
18
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
19
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
20
20
|
},
|
|
21
|
-
signal: {
|
|
22
|
-
clock: {
|
|
23
|
-
vault: {
|
|
21
|
+
signal: { dev: "redis", test: "memory", prod: "redis" },
|
|
22
|
+
clock: { dev: "file", test: "memory", prod: "file" },
|
|
23
|
+
vault: { dev: "vault", test: "env", prod: "vault" },
|
|
24
24
|
channel: {
|
|
25
|
-
email: {
|
|
25
|
+
email: { dev: "smtp", test: "console", prod: "smtp" },
|
|
26
26
|
},
|
|
27
|
-
ai: {
|
|
27
|
+
ai: { dev: "mock", test: "mock" },
|
|
28
28
|
},
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
describe("hero-meta", () => {
|
|
32
|
-
test("resolveDevProfile maps docker
|
|
33
|
-
expect(resolveDevProfile({ docker: false })).toBe("
|
|
34
|
-
expect(resolveDevProfile({ docker: true })).toBe("
|
|
32
|
+
test("resolveDevProfile maps NODE_ENV (docker flag ignored)", () => {
|
|
33
|
+
expect(resolveDevProfile({ docker: false })).toBe("dev");
|
|
34
|
+
expect(resolveDevProfile({ docker: true })).toBe("dev");
|
|
35
35
|
expect(resolveDevProfile({ docker: false, nodeEnv: "test" })).toBe("test");
|
|
36
36
|
expect(resolveDevProfile({ docker: false, nodeEnv: "production" })).toBe("production");
|
|
37
37
|
});
|
|
@@ -48,12 +48,12 @@ describe("hero-meta", () => {
|
|
|
48
48
|
"channel",
|
|
49
49
|
"ai",
|
|
50
50
|
]);
|
|
51
|
-
expect(rows.find((r) => r.element === "store")?.detail).toContain("
|
|
51
|
+
expect(rows.find((r) => r.element === "store")?.detail).toContain("pglite");
|
|
52
52
|
expect(rows.find((r) => r.element === "flow")?.detail).toBe("");
|
|
53
53
|
expect(rows.find((r) => r.element === "flow")?.status).toBe("ready");
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
test("
|
|
56
|
+
test("dev (compose) profile applies to every element", () => {
|
|
57
57
|
const rows = resolveHeroElements(SAMPLE, {
|
|
58
58
|
docker: true,
|
|
59
59
|
sqlDriver: "postgres",
|
|
@@ -62,7 +62,7 @@ describe("hero-meta", () => {
|
|
|
62
62
|
const store = rows.find((r) => r.element === "store")?.detail ?? "";
|
|
63
63
|
expect(store).toContain("postgres");
|
|
64
64
|
expect(store).toContain("redis");
|
|
65
|
-
expect(store).not.toContain("
|
|
65
|
+
expect(store).not.toContain("pglite");
|
|
66
66
|
expect(rows.find((r) => r.element === "signal")?.detail).toBe("redis");
|
|
67
67
|
expect(rows.find((r) => r.element === "clock")?.detail).toBe("file");
|
|
68
68
|
expect(rows.find((r) => r.element === "gate")?.detail).toBe("redis");
|
|
@@ -78,8 +78,8 @@ describe("hero-meta", () => {
|
|
|
78
78
|
version: "0.2.4",
|
|
79
79
|
nodeEnv: "development",
|
|
80
80
|
});
|
|
81
|
-
expect(snap.profile).toBe("
|
|
82
|
-
expect(snap.runtimeEnv).toBe("
|
|
81
|
+
expect(snap.profile).toBe("dev");
|
|
82
|
+
expect(snap.runtimeEnv).toBe("dev");
|
|
83
83
|
expect(decodeHeroSnapshot(encodeHeroSnapshot(snap))).toEqual(snap);
|
|
84
84
|
});
|
|
85
85
|
|
package/src/cli/hero-meta.ts
CHANGED
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
} from "../config/index.ts";
|
|
12
12
|
import type { DevStatus } from "../term.ts";
|
|
13
13
|
|
|
14
|
-
/** How the process is running (
|
|
15
|
-
export type DevRuntimeProfile = "
|
|
14
|
+
/** How the process is running (dev Compose → production). */
|
|
15
|
+
export type DevRuntimeProfile = "dev" | "test" | "production";
|
|
16
16
|
|
|
17
|
-
/** Data plane: still on a laptop vs
|
|
18
|
-
export type DevRuntimeEnv = "
|
|
17
|
+
/** Data plane: still on a laptop vs production deploy. */
|
|
18
|
+
export type DevRuntimeEnv = "dev" | "production";
|
|
19
19
|
|
|
20
20
|
/** One of the eight elements with its active driver summary. */
|
|
21
21
|
export type HeroElementRow = {
|
|
@@ -69,16 +69,17 @@ export function resolveDevProfile(options: {
|
|
|
69
69
|
}): DevRuntimeProfile {
|
|
70
70
|
if (options.nodeEnv === "test") return "test";
|
|
71
71
|
if (options.nodeEnv === "production") return "production";
|
|
72
|
-
|
|
72
|
+
void options.docker;
|
|
73
|
+
return "dev";
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
/**
|
|
76
|
-
* Data-plane environment (
|
|
77
|
+
* Data-plane environment (dev machine vs production deploy).
|
|
77
78
|
*
|
|
78
79
|
* @param profile - Runtime profile
|
|
79
80
|
*/
|
|
80
81
|
export function resolveDevRuntimeEnv(profile: DevRuntimeProfile): DevRuntimeEnv {
|
|
81
|
-
return profile === "production" ? "production" : "
|
|
82
|
+
return profile === "production" ? "production" : "dev";
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
/**
|
|
@@ -155,13 +156,13 @@ export function resolveHeroElements(
|
|
|
155
156
|
readonly aiModel?: string;
|
|
156
157
|
/** AI readiness when known (model loading / ready). */
|
|
157
158
|
readonly aiStatus?: DevStatus;
|
|
158
|
-
/** Which driver map column to read (default `
|
|
159
|
+
/** Which driver map column to read (default `test` unless `docker`). */
|
|
159
160
|
readonly configEnv?: ConfigEnv;
|
|
160
161
|
},
|
|
161
162
|
): readonly HeroElementRow[] {
|
|
162
163
|
const drivers = config?.drivers;
|
|
163
164
|
// `-d` reads the `docker` profile for every element (not a store-only override).
|
|
164
|
-
const configEnv: ConfigEnv = options.configEnv ?? (options.docker ? "
|
|
165
|
+
const configEnv: ConfigEnv = options.configEnv ?? (options.docker ? "dev" : "test");
|
|
165
166
|
|
|
166
167
|
// Gate rates share `drivers.store.kv` (no separate drivers.gate).
|
|
167
168
|
const gateKv =
|
package/src/cli/index.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
3
|
* `oke` CLI entry.
|
|
4
|
+
*
|
|
5
|
+
* Bare `oke` (TTY) → interactive Ink TUI. `oke <command>` runs directly.
|
|
4
6
|
*/
|
|
5
7
|
|
|
6
8
|
import { aiCli } from "./ai.ts";
|
|
@@ -23,11 +25,32 @@ import { replayCli } from "./replay.ts";
|
|
|
23
25
|
import { schemaCli } from "./schema.ts";
|
|
24
26
|
import { stackCli } from "./stack.ts";
|
|
25
27
|
import { startCli } from "./start.ts";
|
|
28
|
+
import { testCli } from "./test.ts";
|
|
26
29
|
import { upgradeCli } from "./upgrade.ts";
|
|
27
30
|
import { vaultCli } from "./vault-cmd.ts";
|
|
28
31
|
|
|
29
|
-
const
|
|
32
|
+
const rawArgv = process.argv.slice(2);
|
|
33
|
+
const wantTui = rawArgv.includes("--tui");
|
|
34
|
+
const argv = rawArgv.filter((a) => a !== "--tui");
|
|
30
35
|
const [cmd, sub, ...rest] = argv;
|
|
36
|
+
/** Nested TUI / slash child — never re-enter the interactive shell. */
|
|
37
|
+
const noTui = process.env["OKE_NO_TUI"] === "1";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Launch interactive TUI when allowed; otherwise print help (non-TTY).
|
|
41
|
+
*/
|
|
42
|
+
async function maybeLaunchTui(): Promise<never> {
|
|
43
|
+
const { canRenderTui, launchTui } = await import("./tui/launch.ts");
|
|
44
|
+
if (noTui || !canRenderTui(process.stdout)) {
|
|
45
|
+
console.log(formatOkeHelp());
|
|
46
|
+
process.exit(EXIT_USAGE);
|
|
47
|
+
}
|
|
48
|
+
process.exit(await launchTui(process.cwd()));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (wantTui && !noTui) {
|
|
52
|
+
await maybeLaunchTui();
|
|
53
|
+
}
|
|
31
54
|
|
|
32
55
|
if (cmd === "dev") {
|
|
33
56
|
process.exit(await devCli(sub ? [sub, ...rest] : rest));
|
|
@@ -37,6 +60,10 @@ if (cmd === "mode") {
|
|
|
37
60
|
process.exit(await modeCli(sub ? [sub, ...rest] : rest));
|
|
38
61
|
}
|
|
39
62
|
|
|
63
|
+
if (cmd === "test") {
|
|
64
|
+
process.exit(await testCli(sub ? [sub, ...rest] : rest));
|
|
65
|
+
}
|
|
66
|
+
|
|
40
67
|
if (cmd === "start") {
|
|
41
68
|
process.exit(await startCli(sub ? [sub, ...rest] : rest));
|
|
42
69
|
}
|
|
@@ -109,11 +136,14 @@ if (cmd === "completion") {
|
|
|
109
136
|
process.exit(completionCli(sub ? [sub, ...rest] : rest));
|
|
110
137
|
}
|
|
111
138
|
|
|
112
|
-
if (cmd ===
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
139
|
+
if (cmd === "--help" || cmd === "-h" || cmd === "help") {
|
|
140
|
+
console.log(`${formatOkeHelp()}${EXIT_CODE_HELP}`);
|
|
141
|
+
process.exit(EXIT_OK);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (cmd === undefined) {
|
|
145
|
+
// Bare `oke` — TUI on TTY; help + EXIT_USAGE when piped / CI / OKE_NO_TUI.
|
|
146
|
+
await maybeLaunchTui();
|
|
117
147
|
}
|
|
118
148
|
|
|
119
149
|
console.error(`Unknown command: ${cmd}${sub ? ` ${sub}` : ""}`);
|
|
@@ -14,9 +14,13 @@ describe("flattenImagesConfig", () => {
|
|
|
14
14
|
test("flattens store/channel nesting to dotted keys; flat roles pass through", () => {
|
|
15
15
|
expect(
|
|
16
16
|
flattenImagesConfig({
|
|
17
|
-
store: {
|
|
17
|
+
store: {
|
|
18
|
+
sql: "postgres:18-alpine",
|
|
19
|
+
kv: "redis:8-alpine",
|
|
20
|
+
files: "rustfs/rustfs:1.0.0",
|
|
21
|
+
index: "getmeili/meilisearch:v1.37",
|
|
22
|
+
},
|
|
18
23
|
channel: { email: "axllent/mailpit:v1.22.3" },
|
|
19
|
-
vault: "openbao/openbao:2.6.1",
|
|
20
24
|
ai: "ollama/ollama:0.32.6",
|
|
21
25
|
pgdog: "ghcr.io/pgdogdev/pgdog:v0.1.51",
|
|
22
26
|
proxy: "caddy:2-alpine",
|
|
@@ -25,8 +29,8 @@ describe("flattenImagesConfig", () => {
|
|
|
25
29
|
"store.sql": "postgres:18-alpine",
|
|
26
30
|
"store.kv": "redis:8-alpine",
|
|
27
31
|
"store.files": "rustfs/rustfs:1.0.0",
|
|
32
|
+
"store.index": "getmeili/meilisearch:v1.37",
|
|
28
33
|
"channel.email": "axllent/mailpit:v1.22.3",
|
|
29
|
-
vault: "openbao/openbao:2.6.1",
|
|
30
34
|
ai: "ollama/ollama:0.32.6",
|
|
31
35
|
pgdog: "ghcr.io/pgdogdev/pgdog:v0.1.51",
|
|
32
36
|
proxy: "caddy:2-alpine",
|
|
@@ -97,7 +101,7 @@ describe("defaultImagesFromConfig", () => {
|
|
|
97
101
|
expect(defaultImagesFromConfig({})).toEqual({});
|
|
98
102
|
expect(
|
|
99
103
|
defaultImagesFromConfig({
|
|
100
|
-
drivers: { store: { sql: { prod: "
|
|
104
|
+
drivers: { store: { sql: { prod: "memory" } } },
|
|
101
105
|
}),
|
|
102
106
|
).toEqual({});
|
|
103
107
|
});
|
|
@@ -132,20 +136,20 @@ describe("resolveImages", () => {
|
|
|
132
136
|
});
|
|
133
137
|
|
|
134
138
|
describe("dockerDevDriverMismatches", () => {
|
|
135
|
-
test("flags
|
|
139
|
+
test("flags dev pglite/memory when containers are up", () => {
|
|
136
140
|
const mismatches = dockerDevDriverMismatches(
|
|
137
141
|
{
|
|
138
142
|
drivers: {
|
|
139
143
|
store: {
|
|
140
|
-
sql: {
|
|
141
|
-
kv: {
|
|
144
|
+
sql: { dev: "pglite", test: "pglite", prod: "postgres" },
|
|
145
|
+
kv: { test: "memory", dev: "memory", prod: "memory" },
|
|
142
146
|
},
|
|
143
147
|
},
|
|
144
148
|
},
|
|
145
149
|
["store.sql", "store.kv"],
|
|
146
150
|
);
|
|
147
151
|
expect(mismatches).toEqual([
|
|
148
|
-
{ label: "sql", using: "
|
|
152
|
+
{ label: "sql", using: "pglite", container: "postgres" },
|
|
149
153
|
{ label: "kv", using: "memory", container: "redis" },
|
|
150
154
|
]);
|
|
151
155
|
});
|
|
@@ -155,8 +159,8 @@ describe("dockerDevDriverMismatches", () => {
|
|
|
155
159
|
{
|
|
156
160
|
drivers: {
|
|
157
161
|
store: {
|
|
158
|
-
sql: {
|
|
159
|
-
kv: {
|
|
162
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
163
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
160
164
|
},
|
|
161
165
|
},
|
|
162
166
|
},
|
|
@@ -170,8 +174,8 @@ describe("dockerDevDriverMismatches", () => {
|
|
|
170
174
|
{
|
|
171
175
|
drivers: {
|
|
172
176
|
store: {
|
|
173
|
-
sql: {
|
|
174
|
-
kv: {
|
|
177
|
+
sql: { dev: "postgres", test: "pglite", prod: "postgres" },
|
|
178
|
+
kv: { dev: "redis", test: "memory", prod: "redis" },
|
|
175
179
|
},
|
|
176
180
|
},
|
|
177
181
|
},
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI rejects removed env keys / drivers in oke.config source.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { assertOkeConfigSource, loadOkeConfig } from "./load-config.ts";
|
|
10
|
+
|
|
11
|
+
describe("assertOkeConfigSource", () => {
|
|
12
|
+
test("rejects local: env keys", () => {
|
|
13
|
+
expect(() =>
|
|
14
|
+
assertOkeConfigSource(`drivers: { store: { sql: { local: "postgres" } } }`),
|
|
15
|
+
).toThrow(`"local" is no longer a valid environment key in oke.config.ts.`);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test('rejects "sqlite" driver pins', () => {
|
|
19
|
+
expect(() => assertOkeConfigSource(`drivers: { store: { sql: { dev: "sqlite" } } }`)).toThrow(
|
|
20
|
+
`"sqlite" is no longer a valid driver in oke.config.ts.`,
|
|
21
|
+
);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("allows modern three-key maps", () => {
|
|
25
|
+
expect(() =>
|
|
26
|
+
assertOkeConfigSource(`sql: { dev: "postgres", test: "pglite", prod: "postgres" }`),
|
|
27
|
+
).not.toThrow();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("does not false-positive on localhost", () => {
|
|
31
|
+
expect(() => assertOkeConfigSource(`url: "http://localhost:5432"`)).not.toThrow();
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("loadOkeConfig source gate", () => {
|
|
36
|
+
test("fails before import when local: is present", async () => {
|
|
37
|
+
const dir = await mkdtemp(join(tmpdir(), "oke-cfg-local-"));
|
|
38
|
+
try {
|
|
39
|
+
await writeFile(
|
|
40
|
+
join(dir, "oke.config.ts"),
|
|
41
|
+
`export default { drivers: { store: { sql: { local: "postgres", test: "pglite", prod: "postgres" } } } };\n`,
|
|
42
|
+
);
|
|
43
|
+
await expect(loadOkeConfig(dir)).rejects.toThrow(
|
|
44
|
+
`"local" is no longer a valid environment key in oke.config.ts.`,
|
|
45
|
+
);
|
|
46
|
+
} finally {
|
|
47
|
+
await rm(dir, { recursive: true, force: true });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
package/src/cli/load-config.ts
CHANGED
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
driverRefId,
|
|
8
|
+
flattenImagesConfig,
|
|
9
|
+
normalizeEnvDriverMap,
|
|
10
|
+
type EnvDriverInput,
|
|
11
|
+
type OkeConfig,
|
|
12
|
+
} from "../config/index.ts";
|
|
7
13
|
import type { Manifest } from "../manifest/types.ts";
|
|
8
14
|
|
|
9
15
|
/** Default image pins when `images` is omitted but prod drivers need containers. */
|
|
@@ -11,27 +17,15 @@ const DEFAULT_SQL_IMAGE = "postgres:18-alpine";
|
|
|
11
17
|
const DEFAULT_PGVECTOR_IMAGE = "pgvector/pgvector:pg17";
|
|
12
18
|
const DEFAULT_PGDOG_IMAGE = "ghcr.io/pgdogdev/pgdog:v0.1.51";
|
|
13
19
|
const DEFAULT_KV_IMAGE = "redis:8-alpine";
|
|
14
|
-
const DEFAULT_VAULT_IMAGE = "openbao/openbao:2.6.1";
|
|
15
20
|
|
|
16
21
|
/**
|
|
17
|
-
*
|
|
22
|
+
* Prefer `dev` then `prod` for a driver map (compose infra ≈ production).
|
|
18
23
|
*
|
|
19
|
-
* @param
|
|
24
|
+
* @param map - Env driver input (normalized first)
|
|
20
25
|
*/
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
return
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Prefer `docker` then `prod` for a driver map (compose infra ≈ production).
|
|
28
|
-
*
|
|
29
|
-
* @param map - Env driver map
|
|
30
|
-
*/
|
|
31
|
-
function dockerOrProdId(
|
|
32
|
-
map: { readonly docker?: DriverRef; readonly prod?: DriverRef } | undefined,
|
|
33
|
-
): string | undefined {
|
|
34
|
-
return driverId(map?.docker) ?? driverId(map?.prod);
|
|
26
|
+
function dockerOrProdId(map: EnvDriverInput | undefined): string | undefined {
|
|
27
|
+
const normalized = normalizeEnvDriverMap(map);
|
|
28
|
+
return driverRefId(normalized?.dev) ?? driverRefId(normalized?.prod);
|
|
35
29
|
}
|
|
36
30
|
|
|
37
31
|
/**
|
|
@@ -75,11 +69,6 @@ export function defaultImagesFromConfig(config: OkeConfig): Readonly<Record<stri
|
|
|
75
69
|
out["store.kv"] = DEFAULT_KV_IMAGE;
|
|
76
70
|
}
|
|
77
71
|
|
|
78
|
-
const vault = dockerOrProdId(config.drivers?.vault);
|
|
79
|
-
if (vault === "openbao") {
|
|
80
|
-
out.vault = DEFAULT_VAULT_IMAGE;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
72
|
return out;
|
|
84
73
|
}
|
|
85
74
|
|
|
@@ -89,6 +78,21 @@ export interface LoadedConfig {
|
|
|
89
78
|
readonly path: string;
|
|
90
79
|
}
|
|
91
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Reject removed env keys / drivers in `oke.config.*` source.
|
|
83
|
+
* Migration is documented — no soft-compat rewrite.
|
|
84
|
+
*
|
|
85
|
+
* @param source - File contents
|
|
86
|
+
*/
|
|
87
|
+
export function assertOkeConfigSource(source: string): void {
|
|
88
|
+
if (/(^|[^\w.])local\s*:/.test(source)) {
|
|
89
|
+
throw new Error(`"local" is no longer a valid environment key in oke.config.ts.`);
|
|
90
|
+
}
|
|
91
|
+
if (/(["'])sqlite\1/.test(source)) {
|
|
92
|
+
throw new Error(`"sqlite" is no longer a valid driver in oke.config.ts.`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
92
96
|
/**
|
|
93
97
|
* Load `oke.config.ts` (or `.js` / `.mts`) from a directory.
|
|
94
98
|
*
|
|
@@ -110,6 +114,8 @@ export async function loadOkeConfig(
|
|
|
110
114
|
for (const path of candidates) {
|
|
111
115
|
const file = Bun.file(path);
|
|
112
116
|
if (!(await file.exists())) continue;
|
|
117
|
+
const source = await file.text();
|
|
118
|
+
assertOkeConfigSource(source);
|
|
113
119
|
const mod = (await import(path)) as { default?: OkeConfig };
|
|
114
120
|
if (!mod.default || typeof mod.default !== "object") {
|
|
115
121
|
throw new Error(`oke: ${path} must default-export defineConfig({...})`);
|
|
@@ -174,14 +180,14 @@ export function dockerDevDriverMismatches(
|
|
|
174
180
|
): readonly StackDriverMismatch[] {
|
|
175
181
|
const roles = new Set(stackRoles);
|
|
176
182
|
const out: StackDriverMismatch[] = [];
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
const
|
|
180
|
-
|
|
183
|
+
const sqlMap = normalizeEnvDriverMap(config.drivers?.store?.sql);
|
|
184
|
+
const kvMap = normalizeEnvDriverMap(config.drivers?.store?.kv);
|
|
185
|
+
const sqlDocker = driverRefId(sqlMap?.dev) ?? driverRefId(sqlMap?.prod);
|
|
186
|
+
const kvDocker = driverRefId(kvMap?.dev) ?? driverRefId(kvMap?.prod);
|
|
181
187
|
|
|
182
188
|
if (
|
|
183
189
|
roles.has("store.sql") &&
|
|
184
|
-
(sqlDocker === "
|
|
190
|
+
(sqlDocker === "memory" || sqlDocker === "pglite" || sqlDocker === undefined)
|
|
185
191
|
) {
|
|
186
192
|
out.push({
|
|
187
193
|
label: "sql",
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* opts into the `meilisearch` store.index driver. This module:
|
|
6
6
|
*
|
|
7
7
|
* - generates the master key once and persists it under `.oke/meilisearch/`
|
|
8
|
-
* (`0700` dir / `0600` file, atomic write —
|
|
9
|
-
* OpenBao, minus the init/unseal ceremony: a single static key),
|
|
8
|
+
* (`0700` dir / `0600` file, atomic write — a single static key),
|
|
10
9
|
* - resolves the `meilisearch` binary from `PATH` (a documented prerequisite,
|
|
11
10
|
* like Docker for `--docker`; we never auto-download binaries),
|
|
12
11
|
* - spawns it via `Bun.spawn` with its own data dir + port, polls `/health`,
|
package/src/cli/mode.ts
CHANGED
|
@@ -1,65 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `oke mode
|
|
3
|
-
* Setting a mode also syncs domain schema for that env (emit + push).
|
|
2
|
+
* `oke mode` — removed. `oke dev` always uses Docker Compose.
|
|
4
3
|
*/
|
|
5
4
|
|
|
6
|
-
import { parseDevMode, readDevMode, writeDevMode, type DevMode } from "./dev-mode.ts";
|
|
7
|
-
import { sqlDialectForEnv, syncDevSchema } from "./dev-schema-sync.ts";
|
|
8
|
-
import { loadOkeConfig } from "./load-config.ts";
|
|
9
|
-
|
|
10
5
|
/**
|
|
11
|
-
* CLI entry for `oke mode`.
|
|
6
|
+
* CLI entry for deprecated `oke mode`.
|
|
12
7
|
*
|
|
13
|
-
* @param
|
|
8
|
+
* @param _args - Ignored
|
|
14
9
|
*/
|
|
15
|
-
export async function modeCli(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.log(`oke mode [local|docker]
|
|
20
|
-
|
|
21
|
-
Get or set the default infrastructure mode for \`oke dev\`
|
|
22
|
-
(saved in .oke/mode). Setting a mode syncs domain schema for that env:
|
|
23
|
-
emits schema.generated.ts for the active dialect, then runs \`oke db push\`.
|
|
24
|
-
Data planes stay isolated — switching modes never copies rows.
|
|
25
|
-
Session flags \`oke dev --local\` / \`oke dev --docker\` never change this
|
|
26
|
-
preference.
|
|
27
|
-
`);
|
|
28
|
-
return 0;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const positional = args.filter((a) => !a.startsWith("-"));
|
|
33
|
-
if (positional.length === 0) {
|
|
34
|
-
const saved = await readDevMode(cwd);
|
|
35
|
-
if (saved === null) {
|
|
36
|
-
console.log("oke mode: unset (default local until chosen)");
|
|
37
|
-
return 0;
|
|
38
|
-
}
|
|
39
|
-
console.log(saved);
|
|
40
|
-
return 0;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const next = parseDevMode(positional[0]);
|
|
44
|
-
if (next === null) {
|
|
45
|
-
console.error(`oke mode: expected local|docker, got ${JSON.stringify(positional[0])}`);
|
|
46
|
-
return 1;
|
|
47
|
-
}
|
|
48
|
-
await writeDevMode(cwd, next satisfies DevMode);
|
|
49
|
-
|
|
50
|
-
try {
|
|
51
|
-
const result = await syncDevSchema(cwd, next);
|
|
52
|
-
console.log(`oke mode: saved ${next} · dialect ${result.dialect}`);
|
|
53
|
-
return result.code;
|
|
54
|
-
} catch (err) {
|
|
55
|
-
const loaded = await loadOkeConfig(cwd).catch(() => null);
|
|
56
|
-
const dialect = loaded?.config
|
|
57
|
-
? sqlDialectForEnv(loaded.config, next).dialect
|
|
58
|
-
: next === "docker"
|
|
59
|
-
? "postgresql"
|
|
60
|
-
: "sqlite";
|
|
61
|
-
console.error(`oke mode: saved ${next} · dialect ${dialect}`);
|
|
62
|
-
console.error(err instanceof Error ? err.message : String(err));
|
|
63
|
-
return 1;
|
|
64
|
-
}
|
|
10
|
+
export async function modeCli(_args: readonly string[]): Promise<number> {
|
|
11
|
+
void _args;
|
|
12
|
+
console.error("oke mode was removed — `oke dev` always uses Docker Compose");
|
|
13
|
+
return 1;
|
|
65
14
|
}
|