create-svc 0.1.10 → 0.1.11

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 (168) hide show
  1. package/README.md +46 -43
  2. package/bin/create-service.mjs +2 -0
  3. package/package.json +12 -9
  4. package/src/cli.test.ts +28 -10
  5. package/src/cli.ts +195 -30
  6. package/src/git-bootstrap.test.ts +40 -0
  7. package/src/git-bootstrap.ts +110 -0
  8. package/src/naming.test.ts +1 -0
  9. package/src/naming.ts +23 -0
  10. package/src/post-scaffold.test.ts +19 -0
  11. package/src/post-scaffold.ts +17 -4
  12. package/src/profiles.ts +2 -5
  13. package/src/scaffold.test.ts +231 -40
  14. package/src/scaffold.ts +84 -29
  15. package/src/vault.test.ts +61 -1
  16. package/src/vault.ts +77 -15
  17. package/templates/shared/.github/workflows/ci.yml +2 -1
  18. package/templates/shared/.github/workflows/deploy.yml +2 -0
  19. package/templates/shared/README.md +124 -47
  20. package/templates/shared/grafana/alerts.yaml +54 -0
  21. package/templates/shared/grafana/waitlist-dashboard.json +63 -0
  22. package/templates/shared/scripts/authctl.ts +231 -0
  23. package/templates/shared/scripts/cloudrun/bootstrap.ts +14 -5
  24. package/templates/shared/scripts/cloudrun/cleanup.ts +64 -4
  25. package/templates/shared/scripts/cloudrun/cli.ts +324 -7
  26. package/templates/shared/scripts/cloudrun/config.ts +11 -4
  27. package/templates/shared/scripts/cloudrun/deploy.ts +0 -4
  28. package/templates/shared/scripts/cloudrun/lib.ts +174 -41
  29. package/templates/shared/scripts/cloudrun/neon.ts +45 -0
  30. package/templates/shared/scripts/dev.ts +22 -0
  31. package/templates/shared/scripts/ensure-local-db.ts +3 -0
  32. package/templates/shared/scripts/local-docker.ts +63 -0
  33. package/templates/shared/scripts/local-env.ts +27 -0
  34. package/templates/shared/scripts/seed.ts +73 -0
  35. package/templates/shared/scripts/wait-for-db.ts +32 -0
  36. package/templates/shared/service.config.ts +59 -0
  37. package/templates/shared/service.yaml +24 -44
  38. package/templates/targets/workers/.github/workflows/ci.yml +19 -0
  39. package/templates/targets/workers/.github/workflows/deploy.yml +19 -0
  40. package/templates/targets/workers/Makefile +33 -0
  41. package/templates/targets/workers/README.md +75 -0
  42. package/templates/targets/workers/package.json +35 -0
  43. package/templates/targets/workers/scripts/workers/cli.ts +397 -0
  44. package/templates/targets/workers/src/auth.ts +178 -0
  45. package/templates/targets/workers/src/index.ts +198 -0
  46. package/templates/targets/workers/src/storage.ts +370 -0
  47. package/templates/targets/workers/test/app.test.ts +108 -0
  48. package/templates/targets/workers/tsconfig.json +11 -0
  49. package/templates/targets/workers/wrangler.toml +24 -0
  50. package/templates/variants/bun-connectrpc/Makefile +14 -8
  51. package/templates/variants/bun-connectrpc/gen/protos/waitlist/v1/waitlist_pb.ts +424 -0
  52. package/templates/variants/bun-connectrpc/migrations/0000_init.sql +12 -55
  53. package/templates/variants/bun-connectrpc/package.json +12 -5
  54. package/templates/variants/bun-connectrpc/protos/waitlist/v1/waitlist.proto +91 -0
  55. package/templates/variants/bun-connectrpc/scripts/codegen.ts +1 -1
  56. package/templates/variants/bun-connectrpc/scripts/migrate.ts +4 -1
  57. package/templates/variants/bun-connectrpc/src/auth.ts +200 -0
  58. package/templates/variants/bun-connectrpc/src/db/repository.ts +67 -420
  59. package/templates/variants/bun-connectrpc/src/db/schema.ts +15 -64
  60. package/templates/variants/bun-connectrpc/src/index.ts +76 -176
  61. package/templates/variants/bun-connectrpc/src/temporal/activities.ts +14 -0
  62. package/templates/variants/bun-connectrpc/src/temporal/worker.ts +38 -0
  63. package/templates/variants/bun-connectrpc/src/temporal/workflows.ts +10 -0
  64. package/templates/variants/bun-connectrpc/src/waitlist/service.ts +172 -0
  65. package/templates/variants/bun-connectrpc/src/waitlist/types.ts +45 -0
  66. package/templates/variants/bun-connectrpc/test/app.test.ts +4 -4
  67. package/templates/variants/bun-connectrpc/test/waitlist.integration.test.ts +71 -0
  68. package/templates/variants/bun-hono/Makefile +14 -8
  69. package/templates/variants/bun-hono/migrations/0000_init.sql +12 -55
  70. package/templates/variants/bun-hono/package.json +12 -5
  71. package/templates/variants/bun-hono/scripts/migrate.ts +4 -1
  72. package/templates/variants/bun-hono/src/auth.ts +181 -0
  73. package/templates/variants/bun-hono/src/db/repository.ts +68 -421
  74. package/templates/variants/bun-hono/src/db/schema.ts +15 -64
  75. package/templates/variants/bun-hono/src/index.ts +65 -180
  76. package/templates/variants/bun-hono/src/temporal/activities.ts +14 -0
  77. package/templates/variants/bun-hono/src/temporal/worker.ts +38 -0
  78. package/templates/variants/bun-hono/src/temporal/workflows.ts +10 -0
  79. package/templates/variants/bun-hono/src/waitlist/service.ts +166 -0
  80. package/templates/variants/bun-hono/src/waitlist/types.ts +50 -0
  81. package/templates/variants/bun-hono/test/app.test.ts +72 -41
  82. package/templates/variants/bun-hono/test/waitlist.integration.test.ts +102 -0
  83. package/templates/variants/go-chi/Makefile +27 -11
  84. package/templates/variants/go-chi/atlas.hcl +8 -0
  85. package/templates/variants/go-chi/cmd/server/main.go +21 -10
  86. package/templates/variants/go-chi/go.mod +1 -3
  87. package/templates/variants/go-chi/internal/app/service.go +202 -685
  88. package/templates/variants/go-chi/internal/auth/middleware.go +289 -0
  89. package/templates/variants/go-chi/internal/auth/middleware_test.go +38 -0
  90. package/templates/variants/go-chi/internal/config/config.go +27 -11
  91. package/templates/variants/go-chi/internal/httpapi/routes.go +78 -157
  92. package/templates/variants/go-chi/internal/httpapi/waitlist_integration_test.go +199 -0
  93. package/templates/variants/go-chi/internal/temporal/activities.go +27 -0
  94. package/templates/variants/go-chi/internal/temporal/worker.go +42 -0
  95. package/templates/variants/go-chi/internal/temporal/workflows.go +18 -0
  96. package/templates/variants/go-chi/migrations/0000_init.sql +12 -55
  97. package/templates/variants/go-chi/migrations/atlas.sum +2 -0
  98. package/templates/variants/go-chi/package.json +7 -1
  99. package/templates/variants/go-connectrpc/Makefile +26 -9
  100. package/templates/variants/go-connectrpc/atlas.hcl +8 -0
  101. package/templates/variants/go-connectrpc/buf.gen.yaml +2 -2
  102. package/templates/variants/go-connectrpc/cmd/server/main.go +23 -12
  103. package/templates/variants/go-connectrpc/gen/waitlist/v1/waitlist.pb.go +960 -0
  104. package/templates/variants/go-connectrpc/gen/waitlist/v1/waitlistv1connect/waitlist.connect.go +283 -0
  105. package/templates/variants/go-connectrpc/go.mod +1 -1
  106. package/templates/variants/go-connectrpc/internal/app/service.go +202 -685
  107. package/templates/variants/go-connectrpc/internal/auth/middleware.go +289 -0
  108. package/templates/variants/go-connectrpc/internal/auth/middleware_test.go +38 -0
  109. package/templates/variants/go-connectrpc/internal/config/config.go +27 -11
  110. package/templates/variants/go-connectrpc/internal/connectapi/handler.go +78 -201
  111. package/templates/variants/go-connectrpc/internal/connectapi/waitlist_integration_test.go +122 -0
  112. package/templates/variants/go-connectrpc/internal/httpapi/routes.go +147 -9
  113. package/templates/variants/go-connectrpc/internal/temporal/activities.go +27 -0
  114. package/templates/variants/go-connectrpc/internal/temporal/worker.go +42 -0
  115. package/templates/variants/go-connectrpc/internal/temporal/workflows.go +18 -0
  116. package/templates/variants/go-connectrpc/migrations/0000_init.sql +12 -55
  117. package/templates/variants/go-connectrpc/migrations/atlas.sum +2 -0
  118. package/templates/variants/go-connectrpc/package.json +7 -1
  119. package/templates/variants/go-connectrpc/protos/waitlist/v1/waitlist.proto +93 -0
  120. package/templates/root/.github/workflows/buf-publish.yml +0 -19
  121. package/templates/root/.github/workflows/ci.yml +0 -26
  122. package/templates/root/.github/workflows/deploy.yml +0 -22
  123. package/templates/root/Dockerfile +0 -23
  124. package/templates/root/README.md +0 -69
  125. package/templates/root/buf.gen.yaml +0 -10
  126. package/templates/root/buf.yaml +0 -9
  127. package/templates/root/cmd/server/main.go +0 -44
  128. package/templates/root/gen/dns/v1/dns.pb.go +0 -623
  129. package/templates/root/gen/dns/v1/dnsv1connect/dns.connect.go +0 -192
  130. package/templates/root/go.mod +0 -10
  131. package/templates/root/internal/app/service.go +0 -152
  132. package/templates/root/internal/app/token_source.go +0 -50
  133. package/templates/root/internal/cloudflare/client.go +0 -160
  134. package/templates/root/internal/config/config.go +0 -55
  135. package/templates/root/internal/connectapi/handler.go +0 -79
  136. package/templates/root/internal/httpapi/routes.go +0 -93
  137. package/templates/root/internal/vault/client.go +0 -148
  138. package/templates/root/package.json +0 -12
  139. package/templates/root/protos/dns/v1/dns.proto +0 -58
  140. package/templates/root/scripts/cloudrun/bootstrap.ts +0 -65
  141. package/templates/root/scripts/cloudrun/config.ts +0 -50
  142. package/templates/root/scripts/cloudrun/deploy.ts +0 -41
  143. package/templates/root/scripts/cloudrun/lib.ts +0 -244
  144. package/templates/root/service.yaml +0 -50
  145. package/templates/root/test/go.test.ts +0 -19
  146. package/templates/shared/scripts/cloudrun/integrations.ts +0 -111
  147. package/templates/variants/bun-connectrpc/gen/protos/chat/v1/chat_pb.ts +0 -1078
  148. package/templates/variants/bun-connectrpc/protos/chat/v1/chat.proto +0 -228
  149. package/templates/variants/bun-connectrpc/src/chat/service.ts +0 -384
  150. package/templates/variants/bun-connectrpc/src/chat/types.ts +0 -142
  151. package/templates/variants/bun-connectrpc/src/storage.ts +0 -72
  152. package/templates/variants/bun-connectrpc/src/webhooks.ts +0 -35
  153. package/templates/variants/bun-connectrpc/test/list-messages.integration.test.ts +0 -182
  154. package/templates/variants/bun-hono/src/chat/service.ts +0 -384
  155. package/templates/variants/bun-hono/src/chat/types.ts +0 -142
  156. package/templates/variants/bun-hono/src/storage.ts +0 -72
  157. package/templates/variants/bun-hono/src/webhooks.ts +0 -35
  158. package/templates/variants/bun-hono/test/list-messages.integration.test.ts +0 -256
  159. package/templates/variants/go-chi/buf.gen.yaml +0 -12
  160. package/templates/variants/go-chi/buf.yaml +0 -9
  161. package/templates/variants/go-chi/cmd/migrate/main.go +0 -101
  162. package/templates/variants/go-chi/internal/httpapi/list_messages_integration_test.go +0 -298
  163. package/templates/variants/go-chi/protos/chat/v1/chat.proto +0 -219
  164. package/templates/variants/go-connectrpc/cmd/migrate/main.go +0 -101
  165. package/templates/variants/go-connectrpc/gen/chat/v1/chat.pb.go +0 -2512
  166. package/templates/variants/go-connectrpc/gen/chat/v1/chatv1connect/chat.connect.go +0 -571
  167. package/templates/variants/go-connectrpc/internal/connectapi/list_messages_integration_test.go +0 -216
  168. package/templates/variants/go-connectrpc/protos/chat/v1/chat.proto +0 -232
package/README.md CHANGED
@@ -1,21 +1,19 @@
1
- # create-svc
1
+ # create-service
2
2
 
3
- `create-svc` is a local backend bootstrap CLI for generating standalone Cloud Run API services with:
3
+ `create-service` is a local microservice bootstrap CLI for generating standalone API services with:
4
4
 
5
5
  - a single `microservice` generation path
6
- - a Bun-first backend path built around `hono` and ConnectRPC
6
+ - explicit deploy target selection: Cloud Run or Cloudflare Workers
7
+ - Go or Bun runtime choices where the target supports them
8
+ - HTTP frameworks (`chi` or `hono`) and ConnectRPC variants
7
9
  - standalone package output that does not assume repo bootstrap
8
- - compatibility with future monorepo use in layouts like `apps/<service>`
9
- - a real `service.yaml` manifest
10
- - shared Cloud Run bootstrap, deploy, and cleanup automation
10
+ - a generated `service.config.ts` manifest
11
+ - a generated `service` lifecycle CLI for create, deploy, migrate, seed, dashboards, doctor, and destroy
11
12
  - local Docker Compose Postgres for first-run development
12
- - Neon-backed remote main, preview, and personal environments
13
- - GCS-backed image attachments
14
- - typed HTTP webhook ingress
15
- - a production API origin at `https://api.<appname>.anmho.com`
13
+ - Neon-backed remote environments
14
+ - a production API origin at `https://api.<service_id>.anmho.com`
16
15
 
17
- Local provisioning intentionally prefers known-good CLIs, especially `gcloud`, over SDK-heavy orchestration for Google Cloud operations.
18
- Terraform, control planes, and platform consoles are optional advanced paths, not default prerequisites.
16
+ Local provisioning intentionally prefers known-good CLIs over SDK-heavy orchestration where that keeps the generated service easier to inspect and repair.
19
17
 
20
18
  npm: <https://www.npmjs.com/package/create-svc>
21
19
 
@@ -25,6 +23,12 @@ npm: <https://www.npmjs.com/package/create-svc>
25
23
  bun create svc my-service
26
24
  ```
27
25
 
26
+ Compatibility alias:
27
+
28
+ ```bash
29
+ bun create svc my-service
30
+ ```
31
+
28
32
  or:
29
33
 
30
34
  ```bash
@@ -34,10 +38,17 @@ bunx create-svc my-service
34
38
  For the strict one-command production path:
35
39
 
36
40
  ```bash
37
- bun create svc my-service --profile microservice --bootstrap --yes
41
+ bun create svc my-service --yes
38
42
  ```
39
43
 
40
- `--profile microservice` is accepted as a compatibility no-op. Full app workspaces live in the private GitHub template repos `anmho/create-app-consumer` and `anmho/create-app-saas`.
44
+ `--profile microservice` is accepted as a compatibility no-op. App workspaces live outside this package in private app template repositories.
45
+
46
+ By default, a standalone generated service is initialized as a git repository,
47
+ committed with `Initial commit`, created as a private GitHub repository at
48
+ `anmho/<service-name>`, and pushed to `origin/main`. If the target directory is
49
+ inside an existing git worktree, create-service skips git and GitHub setup so the
50
+ parent repository remains in control. Pass `--no-git` to skip all git and GitHub
51
+ side effects.
41
52
 
42
53
  ## Local Testing
43
54
 
@@ -53,8 +64,8 @@ For faster iteration against your working tree:
53
64
 
54
65
  ```bash
55
66
  bun link
56
- bun link create-svc
57
- create-svc my-service
67
+ bun link create-service
68
+ create-service my-service
58
69
  ```
59
70
 
60
71
  During scaffold, the generator can discover:
@@ -62,8 +73,8 @@ During scaffold, the generator can discover:
62
73
  - accessible GCP projects
63
74
  - open billing accounts
64
75
 
65
- Remote `bootstrap` and `deploy` use Neon credentials from `NEON_API_KEY`, or Vault via `VAULT_ADDR` plus `VAULT_TOKEN`, `VAULT_TOKEN_FILE`, or `~/.vault-token`.
66
- Provider runtime credentials can be supplied through environment variables or Vault paths under `secret/prod/providers/*`; generated Cloud Run services receive runtime values through app-project Secret Manager.
76
+ Generated provisioning commands use Neon credentials from `NEON_API_KEY`, or Vault via `VAULT_ADDR` plus `VAULT_TOKEN`, `VAULT_TOKEN_FILE`, or `~/.vault-token`.
77
+ The base waitlist service keeps provider integrations out of the runtime by default; add provider-specific secrets only when the generated service actually uses that provider.
67
78
 
68
79
  Before running generated provisioning commands locally, authenticate `gcloud` on the machine:
69
80
 
@@ -71,13 +82,11 @@ Before running generated provisioning commands locally, authenticate `gcloud` on
71
82
  gcloud auth login
72
83
  ```
73
84
 
74
- ## Generated Backend Package
85
+ ## Generated Service Package
75
86
 
76
87
  First local run:
77
88
 
78
- ```bash
79
- docker compose up -d
80
- ```
89
+ `bun run migrate`, `make migrate`, `bun run dev`, and `make dev` open Docker Desktop when needed, wait for Docker readiness, and start Docker Compose Postgres before touching the local database.
81
90
 
82
91
  For Bun variants:
83
92
 
@@ -87,9 +96,9 @@ bun run dev
87
96
  bun run gen
88
97
  bun run lint
89
98
  bun run test
90
- bun run bootstrap
99
+ bun run create
91
100
  bun run deploy
92
- bun run cleanup
101
+ bun run destroy
93
102
  ```
94
103
 
95
104
  For Go variants:
@@ -100,18 +109,16 @@ make dev
100
109
  make gen
101
110
  make lint
102
111
  make test
103
- make bootstrap
112
+ make create
104
113
  make deploy
105
- make cleanup
114
+ make destroy
106
115
  ```
107
116
 
108
- The generated package is intended to be consumed by a Next.js web app or a mobile client over HTTPS. In v1, production is expected to live at `https://api.<appname>.anmho.com`, while preview and personal environments keep using deterministic Cloud Run URLs.
117
+ Language-specific tasks such as local running, linting, formatting, testing, and building stay in package scripts or Make targets. Service lifecycle operations are exposed through the generated `service` CLI.
109
118
 
110
- The microservice profile is moving toward a small waitlist/launch service example. The current generated plumbing still includes:
119
+ The generated service is intended to be consumed by a web app, mobile client, or another service over HTTPS. In v1, production is expected to live at `https://api.<service_id>.anmho.com`, while preview and personal environments keep using deterministic platform URLs where appropriate.
111
120
 
112
- - Postgres-backed `users`, `conversations`, `conversation_participants`, and `messages`
113
- - image attachment upload/finalize plumbing via GCS
114
- - generic typed webhook ingestion on plain HTTP
121
+ The generated microservice domain is a small waitlist/launch service example with public submit/status APIs and target-specific scheduled work.
115
122
 
116
123
  ## Development
117
124
 
@@ -129,33 +136,29 @@ bun run validate:generated -- --variant bun-hono
129
136
  bun run validate:generated -- --variant go-connectrpc --keep
130
137
  ```
131
138
 
132
- The validation harness scaffolds generated apps into ignored `bin/generated/run-*` workspaces, runs the generated public commands, starts the local server, and smoke-tests health or typed ConnectRPC clients where applicable.
139
+ The validation harness scaffolds generated services into ignored `bin/generated/run-*` workspaces, runs the generated public commands, starts the local server, and smoke-tests health or typed ConnectRPC clients where applicable.
133
140
 
134
141
  ## npm Trusted Publishing
135
142
 
136
- `create-svc` is set up for npm trusted publishing from GitHub Actions, so there is no long-lived npm publish token to store in Vault.
143
+ `create-service` is set up for npm trusted publishing from GitHub Actions, so there is no long-lived npm publish token to store in Vault.
137
144
 
138
145
  Repository workflow:
146
+
139
147
  - [publish.yml](.github/workflows/publish.yml)
140
- - Trigger: Git tags matching `v*`
148
+ - Trigger: pushes to `main`, Git tags matching `v*`, or manual `workflow_dispatch`
141
149
  - CI runtime: Bun for install/test/typecheck, npm for the final publish step
142
150
 
143
151
  npm package setup still has to be configured once in the npm UI to trust this repository and workflow:
144
152
 
145
- 1. Open the `create-svc` package settings on npm.
153
+ 1. Open the `create-service` package settings on npm.
146
154
  2. Go to `Settings` -> `Trusted Publisher`.
147
155
  3. Select `GitHub Actions`.
148
156
  4. Enter:
149
157
  - Organization or user: `anmho`
150
- - Repository: `create-svc`
158
+ - Repository: `create-service`
151
159
  - Workflow filename: `publish.yml`
152
160
  5. Save the trusted publisher.
153
161
 
154
- After that, publishing is:
155
-
156
- ```bash
157
- git tag v0.1.10
158
- git push origin v0.1.10
159
- ```
162
+ After that, publishing can be triggered by pushing to `main`, creating a `v*` tag, or running the workflow manually.
160
163
 
161
- The GitHub Actions workflow will authenticate with npm via OIDC and run `npm publish` without an npm token.
164
+ The GitHub Actions workflow authenticates with npm via OIDC and runs `npm publish` without an npm token.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env bun
2
+ import "../index.ts";
package/package.json CHANGED
@@ -1,19 +1,22 @@
1
1
  {
2
2
  "name": "create-svc",
3
- "version": "0.1.10",
4
- "description": "Local backend bootstrap CLI for Bun-first Cloud Run API services with Neon and Vault provisioning.",
3
+ "version": "0.1.11",
4
+ "description": "Local microservice bootstrap CLI for Cloud Run and Workers services with Neon-backed data.",
5
5
  "module": "index.ts",
6
6
  "type": "module",
7
7
  "license": "MIT",
8
8
  "bin": {
9
- "create-svc": "bin/create-svc.mjs",
10
- "create-service": "bin/create-svc.mjs"
9
+ "create-service": "bin/create-service.mjs",
10
+ "create-svc": "bin/create-svc.mjs"
11
11
  },
12
12
  "files": [
13
- "bin",
13
+ "bin/create-service.mjs",
14
+ "bin/create-svc.mjs",
14
15
  "index.ts",
15
16
  "src",
16
17
  "templates",
18
+ "!bin/generated",
19
+ "!templates/**/node_modules",
17
20
  "README.md"
18
21
  ],
19
22
  "scripts": {
@@ -45,12 +48,12 @@
45
48
  "@types/bun": "latest"
46
49
  },
47
50
  "peerDependencies": {
48
- "typescript": "^5"
51
+ "typescript": "^5.9.3"
49
52
  },
50
53
  "dependencies": {
51
- "@clack/prompts": "^1.2.0",
52
- "@google-cloud/billing": "^5.1.1",
53
- "@google-cloud/resource-manager": "^6.2.1",
54
+ "@clack/prompts": "^1.4.0",
55
+ "@google-cloud/billing": "^5.1.2",
56
+ "@google-cloud/resource-manager": "^6.2.2",
54
57
  "@neondatabase/api-client": "^2.7.1",
55
58
  "picocolors": "^1.1.1"
56
59
  }
package/src/cli.test.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import { expect, test } from "bun:test";
2
2
  import { mkdir } from "node:fs/promises";
3
- import { assertDiscoveryReady, normalizeValidationResult, parseArgs, validateServiceNameInput } from "./cli";
3
+ import {
4
+ assertDiscoveryReady,
5
+ normalizeValidationResult,
6
+ parseArgs,
7
+ validateTargetRuntimeFramework,
8
+ validateServiceNameInput,
9
+ } from "./cli";
4
10
 
5
11
  test("normalizeValidationResult converts success to undefined", () => {
6
12
  expect(normalizeValidationResult(true)).toBeUndefined();
@@ -24,24 +30,36 @@ test("assertDiscoveryReady no longer blocks scaffold when remote discovery is un
24
30
  });
25
31
  });
26
32
 
27
- test("parseArgs defaults to the microservice profile and treats bootstrap as strict deploy", () => {
33
+ test("parseArgs defaults to microservice and cloudrun target", () => {
28
34
  expect(parseArgs(["launch-api", "--yes"])).toMatchObject({
29
35
  directory: "launch-api",
30
36
  profile: "microservice",
31
37
  yes: true,
32
38
  });
33
- expect(parseArgs(["launch-api", "--yes"]).autoDeploy).toBeUndefined();
34
-
35
- expect(parseArgs(["launch-api", "--profile", "microservice", "--bootstrap"])).toMatchObject({
39
+ expect(parseArgs(["launch-api", "--target", "workers", "--yes"])).toMatchObject({
36
40
  directory: "launch-api",
37
- profile: "microservice",
38
- autoDeploy: true,
41
+ target: "workers",
42
+ yes: true,
39
43
  });
44
+ expect(parseArgs(["launch-api", "--yes"]).autoDeploy).toBeUndefined();
45
+ expect(parseArgs(["launch-api", "--yes", "--no-git"]).noGit).toBeTrue();
46
+
47
+ expect(() => parseArgs(["launch-api", "--profile", "microservice", "--bootstrap"])).toThrow("Unknown argument");
48
+ });
49
+
50
+ test("parseArgs rejects the removed app profile", () => {
51
+ expect(() => parseArgs(["tracker", "--profile=app", "--yes"])).toThrow("app profile has moved");
40
52
  });
41
53
 
42
- test("parseArgs rejects the moved app profile with private template guidance", () => {
43
- expect(() => parseArgs(["tracker", "--profile=app", "--yes"])).toThrow("anmho/create-app-consumer");
44
- expect(() => parseArgs(["tracker", "--profile", "app", "--yes"])).toThrow("anmho/create-app-saas");
54
+ test("target/runtime/framework combinations are validated", () => {
55
+ expect(() => validateTargetRuntimeFramework("cloudrun", "go", "connectrpc")).not.toThrow();
56
+ expect(() => validateTargetRuntimeFramework("workers", "bun", "hono")).not.toThrow();
57
+ expect(() => validateTargetRuntimeFramework("workers", "bun", "connectrpc")).toThrow(
58
+ "Framework connectrpc is not valid for target workers and runtime bun"
59
+ );
60
+ expect(() => validateTargetRuntimeFramework("workers", "go", "connectrpc")).toThrow(
61
+ "Framework connectrpc is not valid for target workers and runtime go"
62
+ );
45
63
  });
46
64
 
47
65
  test("validateServiceNameInput rejects a taken target directory", async () => {