create-oke 0.2.3 → 0.2.8

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.
Files changed (71) hide show
  1. package/README.md +32 -20
  2. package/examples/linkly/.env.example +15 -0
  3. package/examples/linkly/drizzle.config.ts +11 -0
  4. package/examples/linkly/oke.config.ts +6 -4
  5. package/examples/linkly/package.json +7 -4
  6. package/examples/linkly/src/flows/analytics/index.ts +29 -14
  7. package/examples/linkly/src/flows/links/index.ts +58 -35
  8. package/examples/linkly/src/flows/links/signals.ts +4 -3
  9. package/examples/linkly/src/gates.ts +4 -2
  10. package/examples/linkly/src/schema.decl.ts +39 -0
  11. package/examples/linkly/src/schema.generated.ts +30 -0
  12. package/examples/linkly/src/schema.ts +2 -17
  13. package/examples/linkly/tests/linkly.test.ts +9 -9
  14. package/examples/notes/.env.example +12 -0
  15. package/examples/notes/drizzle.config.ts +11 -0
  16. package/examples/notes/oke.config.ts +8 -1
  17. package/examples/notes/package.json +7 -4
  18. package/examples/notes/src/app.ts +1 -1
  19. package/examples/notes/src/flows/notes/index.ts +44 -30
  20. package/examples/notes/src/schema.ts +3 -3
  21. package/examples/notes/tests/notes.test.ts +1 -1
  22. package/examples/provisions/.env.example +19 -0
  23. package/examples/provisions/drizzle.config.ts +11 -0
  24. package/examples/provisions/oke.config.ts +10 -8
  25. package/examples/provisions/package.json +7 -4
  26. package/examples/provisions/src/app.ts +3 -3
  27. package/examples/provisions/src/channels.ts +4 -3
  28. package/examples/provisions/src/flows/notifications/index.ts +13 -7
  29. package/examples/provisions/src/flows/orders/index.ts +58 -31
  30. package/examples/provisions/src/flows/payments/index.ts +12 -6
  31. package/examples/provisions/src/schema.ts +7 -7
  32. package/examples/provisions/src/vault.ts +2 -2
  33. package/examples/provisions/tests/orders.test.ts +9 -8
  34. package/examples/skyport/.env.example +34 -0
  35. package/examples/skyport/drizzle.config.ts +11 -0
  36. package/examples/skyport/oke.config.ts +25 -22
  37. package/examples/skyport/package.json +8 -5
  38. package/examples/skyport/src/ai.ts +4 -4
  39. package/examples/skyport/src/app.ts +2 -13
  40. package/examples/skyport/src/flows/bookings/index.ts +45 -22
  41. package/examples/skyport/src/flows/bookings/shapes.ts +4 -4
  42. package/examples/skyport/src/flows/bookings/signals.ts +6 -2
  43. package/examples/skyport/src/flows/support/index.ts +37 -25
  44. package/examples/skyport/src/schema.ts +11 -8
  45. package/examples/skyport/src/vault.ts +1 -1
  46. package/examples/skyport/tests/support.test.ts +6 -6
  47. package/package.json +9 -9
  48. package/src/cli.test.ts +132 -64
  49. package/src/cli.ts +58 -33
  50. package/src/index.ts +0 -0
  51. package/src/scaffold.ts +53 -15
  52. package/src/sync-templates.ts +2 -11
  53. package/src/templates.ts +1 -2
  54. package/src/transform.ts +59 -9
  55. package/templates/full/.env.example +24 -0
  56. package/templates/full/README.md +22 -6
  57. package/templates/full/drizzle.config.ts +14 -0
  58. package/templates/full/oke.config.ts +38 -9
  59. package/templates/full/package.json +3 -0
  60. package/templates/hello/.env.example +9 -0
  61. package/templates/hello/README.md +6 -4
  62. package/templates/minimal/.env.example +13 -0
  63. package/templates/minimal/README.md +15 -7
  64. package/templates/minimal/drizzle.config.ts +14 -0
  65. package/templates/minimal/oke.config.ts +8 -1
  66. package/templates/minimal/package.json +3 -0
  67. package/templates/standard/.env.example +21 -0
  68. package/templates/standard/README.md +25 -8
  69. package/templates/standard/drizzle.config.ts +14 -0
  70. package/templates/standard/oke.config.ts +36 -8
  71. package/templates/standard/package.json +3 -0
@@ -3,19 +3,48 @@ import { defineConfig } from "okengine/config";
3
3
  export default defineConfig({
4
4
  drivers: {
5
5
  store: {
6
- sql: { dev: "sqlite", test: "memory", prod: "postgres" },
7
- kv: { dev: "memory", test: "memory", prod: "redis" },
6
+ sql: {
7
+ local: "sqlite",
8
+ docker: "postgres",
9
+ test: "memory",
10
+ prod: "postgres",
11
+ },
12
+ kv: {
13
+ local: "memory",
14
+ docker: "redis",
15
+ test: "memory",
16
+ prod: "redis",
17
+ },
18
+ },
19
+ signal: {
20
+ local: "memory",
21
+ docker: "postgres",
22
+ test: "memory",
23
+ prod: "postgres",
24
+ },
25
+ clock: {
26
+ local: "memory",
27
+ docker: "postgres",
28
+ test: "frozen",
29
+ prod: "postgres",
30
+ },
31
+ vault: {
32
+ local: "dotenv",
33
+ docker: "dotenv",
34
+ test: "memory",
35
+ prod: "sops",
8
36
  },
9
- signal: { dev: "memory", test: "memory", prod: "postgres" },
10
- clock: { dev: "memory", test: "frozen", prod: "postgres" },
11
- vault: { dev: "dotenv", test: "memory", prod: "sops" },
12
37
  channel: {
13
- email: { dev: "console", test: "console", prod: "smtp" },
14
- sms: { dev: "console", test: "console", prod: "unifonic" },
15
- whatsapp: { dev: "console", test: "console", prod: "wa-cloud" },
38
+ email: {
39
+ local: "console",
40
+ docker: "smtp",
41
+ test: "console",
42
+ prod: "smtp",
43
+ },
16
44
  },
17
45
  ai: {
18
- dev: "mock",
46
+ local: "mock",
47
+ docker: "mock",
19
48
  test: "mock",
20
49
  },
21
50
  },
@@ -8,6 +8,9 @@
8
8
  "drizzle-orm": "^1.0.0-rc.4",
9
9
  "zod": "^4.4.3"
10
10
  },
11
+ "devDependencies": {
12
+ "drizzle-kit": "^1.0.0-rc.4"
13
+ },
11
14
  "scripts": {
12
15
  "test": "bun test",
13
16
  "dev": "oke dev"
@@ -0,0 +1,9 @@
1
+ # Environment template — copy to `.env.local` for local overrides.
2
+ # create-oke copies this file to `.env.local` when you scaffold a new project.
3
+ #
4
+ # Resolution order (first hit wins):
5
+ # process.env → .env.local → docker/.env.docker → vault driver → dev fallback
6
+ #
7
+ # This template has no Vault declarations and no pinned infrastructure drivers.
8
+ # Add variables here when you introduce `vault.secret(...)` in src/vault.ts or
9
+ # pin postgres/redis/s3/smtp drivers in oke.config.ts.
@@ -7,18 +7,20 @@ Fastest possible “it works” — one unit, two HTTP flows, **no Store**.
7
7
  ```bash
8
8
  bun install
9
9
  oke dev # app :6530 · Console :6533 · MCP :6535
10
+ # or: oke mode docker && oke dev # compose infra on host Bun
10
11
  ```
11
12
 
12
- | Port | Try |
13
- |---|---|
13
+ | Port | Try |
14
+ | ------- | ---------------------- |
14
15
  | `:6530` | `GET /` · `GET /hello` |
15
- | `:6533` | Console |
16
- | `:6535` | MCP |
16
+ | `:6533` | Console |
17
+ | `:6535` | MCP |
17
18
 
18
19
  ## What’s in this template
19
20
 
20
21
  ```text
21
22
  hello/
23
+ ├── .env.example # copied to .env.local by create-oke
22
24
  ├── oke.config.ts
23
25
  ├── src/
24
26
  │ ├── app.ts # oke({ name: "hello" }).adopt({ hello })
@@ -0,0 +1,13 @@
1
+ # Environment template — copy to `.env.local` for local overrides.
2
+ # create-oke copies this file to `.env.local` when you scaffold a new project.
3
+ #
4
+ # Resolution order (first hit wins):
5
+ # process.env → .env.local → docker/.env.docker → vault driver → dev fallback
6
+ #
7
+ # --- Infrastructure (optional) ---
8
+ # This app pins postgres for docker/prod SQL in oke.config.ts.
9
+ # Local dev uses sqlite by default; uncomment only when overriding postgres URLs.
10
+ # Run `oke dev --docker` to write role-accurate keys into `docker/.env.docker`.
11
+
12
+ # DATABASE_URL — primary Postgres connection; from your host (Neon, RDS, …) or `docker/.env.docker` after `oke dev --docker`
13
+ # DATABASE_URL=postgres://user:password@127.0.0.1:5432/oke
@@ -7,23 +7,29 @@ Smallest shape you’d actually ship — **Store + HTTP flows** over a single ta
7
7
  ```bash
8
8
  bun install
9
9
  oke dev # app :6530 · Console :6533 · MCP :6535
10
+ # or: oke mode docker && oke dev # postgres via compose
10
11
  ```
11
12
 
12
- | Port | Try |
13
- |---|---|
13
+ Local `oke dev` auto-runs `oke db push` when `schema.ts` changes (opt out:
14
+ `--no-db-push`). Docker/prod never auto-apply DDL — use `oke db migrate`.
15
+
16
+ | Port | Try |
17
+ | ------- | ------------------------------------------- |
14
18
  | `:6530` | `GET /` · `GET /entries` · `POST /entries` |
15
- | `:6533` | Console |
16
- | `:6535` | MCP |
19
+ | `:6533` | Console |
20
+ | `:6535` | MCP |
17
21
 
18
22
  ## What’s in this template
19
23
 
20
24
  ```text
21
25
  minimal/
22
- ├── oke.config.ts
26
+ ├── .env.example # copied to .env.local by create-oke
27
+ ├── drizzle.config.ts # oke db push|generate|migrate
28
+ ├── oke.config.ts # local: sqlite · docker/prod: postgres
23
29
  ├── src/
24
30
  │ ├── app.ts # adopt({ main }), stores: [db]
25
31
  │ ├── core.ts # store.sql("…")
26
- │ ├── schema.ts # entries table (Drizzle)
32
+ │ ├── schema.ts # entries table (Drizzle escape hatch)
27
33
  │ └── flows/main/index.ts # GET / · GET|POST /entries
28
34
  └── tests/minimal.test.ts
29
35
  ```
@@ -33,7 +39,9 @@ minimal/
33
39
  - **Flows:** `root`, `list` (`GET /entries`), `create` (`POST /entries` with `{ body }`)
34
40
  - **Schema:** `entries` — `id`, `body`, `createdAt`
35
41
 
36
- Swap `entries` for your domain table and grow flows beside it. Need gates,
42
+ Swap `entries` for your domain table and grow flows beside it. Prefer
43
+ `store.schema.table` + `field.*` in `schema.decl.ts` when you want ORM-agnostic
44
+ declare (Linkly); hand-written `schema.ts` remains the escape hatch. Need gates,
37
45
  channels, or locales? Use `standard`.
38
46
 
39
47
  ## Agent contract
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from "drizzle-kit";
2
+
3
+ /**
4
+ * Domain schema sync for `oke db push|generate|migrate`.
5
+ * Versioned prod migrations land in `./drizzle` — never mix with `.oke/`.
6
+ */
7
+ export default defineConfig({
8
+ dialect: "sqlite",
9
+ schema: "./src/schema.ts",
10
+ out: "./drizzle",
11
+ dbCredentials: {
12
+ url: process.env.OKE_SQLITE_URL ?? "file:.oke/app.sqlite",
13
+ },
14
+ });
@@ -2,6 +2,13 @@ import { defineConfig } from "okengine/config";
2
2
 
3
3
  export default defineConfig({
4
4
  drivers: {
5
- store: { sql: { dev: "sqlite", test: "memory", prod: "postgres" } },
5
+ store: {
6
+ sql: {
7
+ local: "sqlite",
8
+ docker: "postgres",
9
+ test: "memory",
10
+ prod: "postgres",
11
+ },
12
+ },
6
13
  },
7
14
  });
@@ -8,6 +8,9 @@
8
8
  "drizzle-orm": "^1.0.0-rc.4",
9
9
  "zod": "^4.4.3"
10
10
  },
11
+ "devDependencies": {
12
+ "drizzle-kit": "^1.0.0-rc.4"
13
+ },
11
14
  "scripts": {
12
15
  "test": "bun test",
13
16
  "dev": "oke dev"
@@ -0,0 +1,21 @@
1
+ # Environment template — copy to `.env.local` for local overrides.
2
+ # create-oke copies this file to `.env.local` when you scaffold a new project.
3
+ #
4
+ # Resolution order (first hit wins):
5
+ # process.env → .env.local → docker/.env.docker → vault driver → dev fallback
6
+ #
7
+ # --- Vault (app secrets) ---
8
+ # Declare secrets in src/vault.ts with `vault.secret(...)`, then uncomment lines here.
9
+
10
+ # --- Infrastructure (optional) ---
11
+ # Commented — this app pins postgres, redis, and smtp (Mailpit) in oke.config.ts.
12
+ # Run `oke dev --docker` to write role-accurate keys into `docker/.env.docker`.
13
+
14
+ # DATABASE_URL — primary Postgres connection; from your host or `docker/.env.docker` after `oke dev --docker`
15
+ # DATABASE_URL=postgres://user:password@127.0.0.1:5432/oke
16
+
17
+ # REDIS_URL — Redis/Valkey connection for store.kv; from your host or `docker/.env.docker` after `oke dev --docker`
18
+ # REDIS_URL=redis://:password@127.0.0.1:6379
19
+
20
+ # SMTP_URL — outbound email (Mailpit in docker dev); from your provider or `docker/.env.docker` after `oke dev --docker`
21
+ # SMTP_URL=smtp://127.0.0.1:1025
@@ -8,19 +8,25 @@ business logic. Default `create-oke` template.
8
8
  ```bash
9
9
  bun install
10
10
  oke dev # app :6530 · Console :6533 · MCP :6535
11
+ # or: oke mode docker && oke dev # postgres · redis · Mailpit · RustFS · sops
11
12
  ```
12
13
 
13
- | Port | Try |
14
- |---|---|
15
- | `:6530` | `GET /` · `GET /health` |
16
- | `:6533` | Console |
17
- | `:6535` | MCP |
14
+ Local `oke dev` auto-runs `oke db push` when `schema.ts` changes (opt out:
15
+ `--no-db-push`). Docker/prod never auto-apply DDL — use `oke db migrate`.
16
+
17
+ | Port | Try |
18
+ | ------- | ------------------------- |
19
+ | `:6530` | `GET /` · `GET /health` |
20
+ | `:6533` | Console |
21
+ | `:6535` | MCP |
18
22
 
19
23
  ## What’s in this template
20
24
 
21
25
  ```text
22
26
  standard/
23
- ├── oke.config.ts
27
+ ├── .env.example # copied to .env.local by create-oke
28
+ ├── drizzle.config.ts # oke db push|generate|migrate
29
+ ├── oke.config.ts # local: sqlite · docker/prod: postgres
24
30
  ├── src/
25
31
  │ ├── app.ts # adopt({ main }); wires stores + side modules
26
32
  │ ├── core.ts / schema.ts # Store (replace the placeholder table)
@@ -39,8 +45,19 @@ standard/
39
45
  - **Unit:** `main`
40
46
  - **Flows to replace:** `root`, `health` — delete or rename once your domain exists
41
47
 
42
- Fill `schema.ts`, then add real flows under `src/flows/<unit>/`. Prefer this
43
- layout for new products; use `hello` / `minimal` only when you want less surface.
48
+ Fill `schema.ts` (or `schema.decl.ts` + `oke db`), then add real flows under
49
+ `src/flows/<unit>/`. Prefer this layout for new products; use `hello` / `minimal`
50
+ only when you want less surface.
51
+
52
+ ## Docker mode (`oke dev --docker`)
53
+
54
+ Closest to production protocols: Postgres, Redis, SMTP (Mailpit), S3 (RustFS),
55
+ vault `sops`/age. Compose credentials land in `docker/.env.docker`.
56
+
57
+ | Surface | URL |
58
+ | -------------- | ------------------------------------------------ |
59
+ | Mailpit UI | [http://127.0.0.1:8025](http://127.0.0.1:8025) |
60
+ | RustFS console | [http://127.0.0.1:9001](http://127.0.0.1:9001) |
44
61
 
45
62
  ## Agent contract
46
63
 
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from "drizzle-kit";
2
+
3
+ /**
4
+ * Domain schema sync for `oke db push|generate|migrate`.
5
+ * Versioned prod migrations land in `./drizzle` — never mix with `.oke/`.
6
+ */
7
+ export default defineConfig({
8
+ dialect: "sqlite",
9
+ schema: "./src/schema.ts",
10
+ out: "./drizzle",
11
+ dbCredentials: {
12
+ url: process.env.OKE_SQLITE_URL ?? "file:.oke/app.sqlite",
13
+ },
14
+ });
@@ -3,16 +3,44 @@ import { defineConfig } from "okengine/config";
3
3
  export default defineConfig({
4
4
  drivers: {
5
5
  store: {
6
- sql: { dev: "sqlite", test: "memory", prod: "postgres" },
7
- kv: { dev: "memory", test: "memory", prod: "redis" },
6
+ sql: {
7
+ local: "sqlite",
8
+ docker: "postgres",
9
+ test: "memory",
10
+ prod: "postgres",
11
+ },
12
+ kv: {
13
+ local: "memory",
14
+ docker: "redis",
15
+ test: "memory",
16
+ prod: "redis",
17
+ },
18
+ },
19
+ signal: {
20
+ local: "memory",
21
+ docker: "postgres",
22
+ test: "memory",
23
+ prod: "postgres",
24
+ },
25
+ clock: {
26
+ local: "memory",
27
+ docker: "postgres",
28
+ test: "frozen",
29
+ prod: "postgres",
30
+ },
31
+ vault: {
32
+ local: "dotenv",
33
+ docker: "dotenv",
34
+ test: "memory",
35
+ prod: "sops",
8
36
  },
9
- signal: { dev: "memory", test: "memory", prod: "postgres" },
10
- clock: { dev: "memory", test: "frozen", prod: "postgres" },
11
- vault: { dev: "dotenv", test: "memory", prod: "sops" },
12
37
  channel: {
13
- email: { dev: "console", test: "console", prod: "smtp" },
14
- sms: { dev: "console", test: "console", prod: "unifonic" },
15
- whatsapp: { dev: "console", test: "console", prod: "wa-cloud" },
38
+ email: {
39
+ local: "console",
40
+ docker: "smtp",
41
+ test: "console",
42
+ prod: "smtp",
43
+ },
16
44
  },
17
45
  },
18
46
  images: {
@@ -8,6 +8,9 @@
8
8
  "drizzle-orm": "^1.0.0-rc.4",
9
9
  "zod": "^4.4.3"
10
10
  },
11
+ "devDependencies": {
12
+ "drizzle-kit": "^1.0.0-rc.4"
13
+ },
11
14
  "scripts": {
12
15
  "test": "bun test",
13
16
  "dev": "oke dev"