render-create 0.1.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.
Files changed (82) hide show
  1. package/README.md +207 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.js +45 -0
  4. package/dist/commands/check.d.ts +8 -0
  5. package/dist/commands/check.js +96 -0
  6. package/dist/commands/init.d.ts +12 -0
  7. package/dist/commands/init.js +1201 -0
  8. package/dist/commands/sync.d.ts +8 -0
  9. package/dist/commands/sync.js +126 -0
  10. package/dist/types.d.ts +246 -0
  11. package/dist/types.js +4 -0
  12. package/dist/utils.d.ts +53 -0
  13. package/dist/utils.js +142 -0
  14. package/package.json +65 -0
  15. package/templates/LINTING_SETUP.md +205 -0
  16. package/templates/README_TEMPLATE.md +68 -0
  17. package/templates/STYLE_GUIDE.md +241 -0
  18. package/templates/assets/favicon.png +0 -0
  19. package/templates/assets/favicon.svg +17 -0
  20. package/templates/biome.json +43 -0
  21. package/templates/cursor/rules/drizzle.mdc +165 -0
  22. package/templates/cursor/rules/fastify.mdc +132 -0
  23. package/templates/cursor/rules/general.mdc +112 -0
  24. package/templates/cursor/rules/nextjs.mdc +89 -0
  25. package/templates/cursor/rules/python.mdc +89 -0
  26. package/templates/cursor/rules/react.mdc +200 -0
  27. package/templates/cursor/rules/sqlalchemy.mdc +205 -0
  28. package/templates/cursor/rules/tailwind.mdc +139 -0
  29. package/templates/cursor/rules/typescript.mdc +112 -0
  30. package/templates/cursor/rules/vite.mdc +169 -0
  31. package/templates/cursor/rules/workflows.mdc +349 -0
  32. package/templates/docker-compose.example.yml +55 -0
  33. package/templates/drizzle/db-index.ts +15 -0
  34. package/templates/drizzle/drizzle.config.ts +10 -0
  35. package/templates/drizzle/schema.ts +12 -0
  36. package/templates/env.example +15 -0
  37. package/templates/fastapi/app/__init__.py +1 -0
  38. package/templates/fastapi/app/config.py +12 -0
  39. package/templates/fastapi/app/database.py +16 -0
  40. package/templates/fastapi/app/models.py +13 -0
  41. package/templates/fastapi/main.py +22 -0
  42. package/templates/fastify/index.ts +40 -0
  43. package/templates/github/CODEOWNERS +10 -0
  44. package/templates/github/ISSUE_TEMPLATE/bug_report.md +39 -0
  45. package/templates/github/ISSUE_TEMPLATE/feature_request.md +23 -0
  46. package/templates/github/PULL_REQUEST_TEMPLATE.md +25 -0
  47. package/templates/gitignore/node.gitignore +41 -0
  48. package/templates/gitignore/python.gitignore +49 -0
  49. package/templates/multi-api/README.md +60 -0
  50. package/templates/multi-api/gitignore +28 -0
  51. package/templates/multi-api/node-api/drizzle.config.ts +10 -0
  52. package/templates/multi-api/node-api/package-simple.json +13 -0
  53. package/templates/multi-api/node-api/package.json +16 -0
  54. package/templates/multi-api/node-api/src/db/index.ts +13 -0
  55. package/templates/multi-api/node-api/src/db/schema.ts +9 -0
  56. package/templates/multi-api/node-api/src/index-simple.ts +36 -0
  57. package/templates/multi-api/node-api/src/index.ts +50 -0
  58. package/templates/multi-api/node-api/tsconfig.json +20 -0
  59. package/templates/multi-api/python-api/app/__init__.py +1 -0
  60. package/templates/multi-api/python-api/app/config.py +12 -0
  61. package/templates/multi-api/python-api/app/database.py +16 -0
  62. package/templates/multi-api/python-api/app/models.py +13 -0
  63. package/templates/multi-api/python-api/main-simple.py +25 -0
  64. package/templates/multi-api/python-api/main.py +44 -0
  65. package/templates/multi-api/python-api/requirements-simple.txt +3 -0
  66. package/templates/multi-api/python-api/requirements.txt +8 -0
  67. package/templates/next/globals.css +126 -0
  68. package/templates/next/layout.tsx +34 -0
  69. package/templates/next/next.config.static.ts +10 -0
  70. package/templates/next/page-fullstack.tsx +120 -0
  71. package/templates/next/page.tsx +72 -0
  72. package/templates/presets.json +581 -0
  73. package/templates/ruff.toml +30 -0
  74. package/templates/tsconfig.base.json +17 -0
  75. package/templates/vite/index.css +127 -0
  76. package/templates/vite/vite.config.ts +7 -0
  77. package/templates/worker/py/cron.py +53 -0
  78. package/templates/worker/py/worker.py +95 -0
  79. package/templates/worker/py/workflow.py +73 -0
  80. package/templates/worker/ts/cron.ts +49 -0
  81. package/templates/worker/ts/worker.ts +84 -0
  82. package/templates/worker/ts/workflow.ts +67 -0
@@ -0,0 +1,581 @@
1
+ {
2
+ "components": {
3
+ "frontends": {
4
+ "nextjs": {
5
+ "name": "Next.js",
6
+ "description": "Next.js + Tailwind + React",
7
+ "subdir": "frontend",
8
+ "rules": ["typescript", "nextjs", "tailwind", "react"],
9
+ "configs": ["biome", "gitignore-node"],
10
+ "supportsWebservice": true,
11
+ "createCommand": "npx create-next-app@latest {{PROJECT_NAME}} --yes --typescript --tailwind --eslint --app --src-dir --import-alias \"@/*\" --turbopack",
12
+ "postCreateDevDependencies": ["@biomejs/biome", "@tailwindcss/typography"],
13
+ "postCreateFiles": {
14
+ "src/app/icon.png": "assets/favicon.png",
15
+ "src/app/globals.css": "next/globals.css",
16
+ "src/app/layout.tsx": "next/layout.tsx",
17
+ "src/app/page.tsx": "next/page.tsx"
18
+ },
19
+ "postCreateFilesStatic": {
20
+ "next.config.ts": "next/next.config.static.ts"
21
+ },
22
+ "postCreateDelete": ["src/app/favicon.ico"],
23
+ "blueprintStatic": {
24
+ "type": "web",
25
+ "runtime": "static",
26
+ "buildCommand": "npm install && npm run build",
27
+ "staticPublishPath": "out",
28
+ "envVars": [
29
+ { "key": "NODE_ENV", "value": "production" }
30
+ ],
31
+ "routes": [
32
+ { "type": "rewrite", "source": "/*", "destination": "/index.html" }
33
+ ]
34
+ },
35
+ "blueprintWebservice": {
36
+ "type": "web",
37
+ "runtime": "node",
38
+ "buildCommand": "npm install && npm run build",
39
+ "startCommand": "npm start",
40
+ "healthCheckPath": "/",
41
+ "envVars": [
42
+ { "key": "NODE_ENV", "value": "production" }
43
+ ]
44
+ }
45
+ },
46
+ "vite": {
47
+ "name": "Vite SPA",
48
+ "description": "Vite + React + Tailwind",
49
+ "subdir": "frontend",
50
+ "rules": ["typescript", "vite", "tailwind", "react"],
51
+ "configs": ["biome", "gitignore-node"],
52
+ "supportsWebservice": false,
53
+ "createCommand": "npm create vite@latest {{PROJECT_NAME}} -- --template react-ts",
54
+ "postCreateDevDependencies": ["tailwindcss", "@tailwindcss/vite", "@tailwindcss/typography", "@biomejs/biome"],
55
+ "postCreateFiles": {
56
+ "vite.config.ts": "vite/vite.config.ts",
57
+ "src/index.css": "vite/index.css",
58
+ "public/favicon.svg": "assets/favicon.svg"
59
+ },
60
+ "blueprintStatic": {
61
+ "type": "web",
62
+ "runtime": "static",
63
+ "buildCommand": "npm install && npm run build",
64
+ "staticPublishPath": "dist",
65
+ "envVars": [
66
+ { "key": "NODE_ENV", "value": "production" }
67
+ ],
68
+ "routes": [
69
+ { "type": "rewrite", "source": "/*", "destination": "/index.html" }
70
+ ]
71
+ }
72
+ }
73
+ },
74
+ "apis": {
75
+ "fastify": {
76
+ "name": "Fastify (Node.js)",
77
+ "description": "Fastify + Drizzle + Zod",
78
+ "subdir": "node-api",
79
+ "runtime": "node",
80
+ "rules": ["typescript", "fastify", "drizzle"],
81
+ "configs": ["biome", "tsconfig", "gitignore-node"],
82
+ "dependencies": ["fastify", "@fastify/cors", "@fastify/env", "drizzle-orm", "zod", "postgres"],
83
+ "devDependencies": ["typescript", "@types/node", "tsx", "drizzle-kit", "@biomejs/biome"],
84
+ "scripts": {
85
+ "dev": "tsx watch src/index.ts",
86
+ "build": "tsc",
87
+ "start": "node dist/index.js",
88
+ "lint": "biome check .",
89
+ "format": "biome check --write .",
90
+ "db:generate": "drizzle-kit generate",
91
+ "db:migrate": "drizzle-kit migrate",
92
+ "db:studio": "drizzle-kit studio"
93
+ },
94
+ "scaffoldFiles": {
95
+ "src/index.ts": "fastify/index.ts",
96
+ "src/db/index.ts": "drizzle/db-index.ts",
97
+ "src/db/schema.ts": "drizzle/schema.ts",
98
+ "drizzle.config.ts": "drizzle/drizzle.config.ts"
99
+ },
100
+ "blueprint": {
101
+ "type": "web",
102
+ "runtime": "node",
103
+ "buildCommand": "npm install && npm run build",
104
+ "startCommand": "npm run start",
105
+ "healthCheckPath": "/health",
106
+ "envVars": [
107
+ { "key": "NODE_ENV", "value": "production" },
108
+ { "key": "PORT", "value": "10000" },
109
+ { "key": "HOST", "value": "0.0.0.0" }
110
+ ]
111
+ }
112
+ },
113
+ "fastapi": {
114
+ "name": "FastAPI (Python)",
115
+ "description": "FastAPI + SQLAlchemy + Pydantic",
116
+ "subdir": "python-api",
117
+ "runtime": "python",
118
+ "rules": ["python", "sqlalchemy"],
119
+ "configs": ["ruff", "gitignore-python"],
120
+ "pythonDependencies": ["fastapi", "uvicorn[standard]", "sqlalchemy", "psycopg2-binary", "pydantic", "pydantic-settings", "python-dotenv", "alembic"],
121
+ "scaffoldFiles": {
122
+ "main.py": "fastapi/main.py",
123
+ "app/__init__.py": "fastapi/app/__init__.py",
124
+ "app/config.py": "fastapi/app/config.py",
125
+ "app/database.py": "fastapi/app/database.py",
126
+ "app/models.py": "fastapi/app/models.py"
127
+ },
128
+ "blueprint": {
129
+ "type": "web",
130
+ "runtime": "python",
131
+ "buildCommand": "pip install -r requirements.txt",
132
+ "startCommand": "uvicorn main:app --host 0.0.0.0 --port $PORT",
133
+ "healthCheckPath": "/health",
134
+ "envVars": [
135
+ { "key": "PYTHON_VERSION", "value": "3.12" }
136
+ ]
137
+ }
138
+ }
139
+ },
140
+ "workers": {
141
+ "workflow-ts": {
142
+ "name": "Workflow (TypeScript)",
143
+ "description": "Render Workflow with SDK",
144
+ "subdir": "workflow",
145
+ "workerType": "workflow",
146
+ "runtime": "node",
147
+ "sdk": "@renderinc/sdk",
148
+ "rules": ["typescript", "workflows"],
149
+ "configs": ["biome", "tsconfig", "gitignore-node"],
150
+ "dependencies": ["@renderinc/sdk"],
151
+ "devDependencies": ["typescript", "@types/node", "tsx", "@biomejs/biome"],
152
+ "scripts": {
153
+ "dev": "tsx watch src/workflow.ts",
154
+ "build": "tsc",
155
+ "start": "node dist/workflow.js",
156
+ "lint": "biome check .",
157
+ "format": "biome check --write ."
158
+ },
159
+ "scaffoldFiles": {
160
+ "src/workflow.ts": "worker/ts/workflow.ts"
161
+ }
162
+ },
163
+ "workflow-py": {
164
+ "name": "Workflow (Python)",
165
+ "description": "Render Workflow with SDK",
166
+ "subdir": "workflow",
167
+ "workerType": "workflow",
168
+ "runtime": "python",
169
+ "sdk": "render-sdk",
170
+ "rules": ["python", "workflows"],
171
+ "configs": ["ruff", "gitignore-python"],
172
+ "pythonDependencies": ["render-sdk", "python-dotenv"],
173
+ "scaffoldFiles": {
174
+ "workflow.py": "worker/py/workflow.py"
175
+ }
176
+ },
177
+ "worker-ts": {
178
+ "name": "Background Worker (TypeScript)",
179
+ "description": "Long-running background process",
180
+ "subdir": "worker",
181
+ "workerType": "worker",
182
+ "runtime": "node",
183
+ "rules": ["typescript"],
184
+ "configs": ["biome", "tsconfig", "gitignore-node"],
185
+ "dependencies": [],
186
+ "devDependencies": ["typescript", "@types/node", "tsx", "@biomejs/biome"],
187
+ "scripts": {
188
+ "dev": "tsx watch src/worker.ts",
189
+ "build": "tsc",
190
+ "start": "node dist/worker.js",
191
+ "lint": "biome check .",
192
+ "format": "biome check --write ."
193
+ },
194
+ "scaffoldFiles": {
195
+ "src/worker.ts": "worker/ts/worker.ts"
196
+ },
197
+ "blueprint": {
198
+ "type": "worker",
199
+ "runtime": "node",
200
+ "buildCommand": "npm install && npm run build",
201
+ "startCommand": "npm run start",
202
+ "envVars": [
203
+ { "key": "NODE_ENV", "value": "production" }
204
+ ]
205
+ }
206
+ },
207
+ "worker-py": {
208
+ "name": "Background Worker (Python)",
209
+ "description": "Long-running background process",
210
+ "subdir": "worker",
211
+ "workerType": "worker",
212
+ "runtime": "python",
213
+ "rules": ["python"],
214
+ "configs": ["ruff", "gitignore-python"],
215
+ "pythonDependencies": ["python-dotenv"],
216
+ "scaffoldFiles": {
217
+ "worker.py": "worker/py/worker.py"
218
+ },
219
+ "blueprint": {
220
+ "type": "worker",
221
+ "runtime": "python",
222
+ "buildCommand": "pip install -r requirements.txt",
223
+ "startCommand": "python worker.py",
224
+ "envVars": [
225
+ { "key": "PYTHON_VERSION", "value": "3.12" }
226
+ ]
227
+ }
228
+ },
229
+ "cron-ts": {
230
+ "name": "Cron Job (TypeScript)",
231
+ "description": "Scheduled task",
232
+ "subdir": "cron",
233
+ "workerType": "cron",
234
+ "runtime": "node",
235
+ "rules": ["typescript"],
236
+ "configs": ["biome", "tsconfig", "gitignore-node"],
237
+ "dependencies": [],
238
+ "devDependencies": ["typescript", "@types/node", "tsx", "@biomejs/biome"],
239
+ "scripts": {
240
+ "dev": "tsx src/cron.ts",
241
+ "build": "tsc",
242
+ "start": "node dist/cron.js",
243
+ "lint": "biome check .",
244
+ "format": "biome check --write ."
245
+ },
246
+ "scaffoldFiles": {
247
+ "src/cron.ts": "worker/ts/cron.ts"
248
+ },
249
+ "blueprint": {
250
+ "type": "cron",
251
+ "runtime": "node",
252
+ "buildCommand": "npm install && npm run build",
253
+ "startCommand": "npm run start",
254
+ "schedule": "0 * * * *",
255
+ "envVars": [
256
+ { "key": "NODE_ENV", "value": "production" }
257
+ ]
258
+ }
259
+ },
260
+ "cron-py": {
261
+ "name": "Cron Job (Python)",
262
+ "description": "Scheduled task",
263
+ "subdir": "cron",
264
+ "workerType": "cron",
265
+ "runtime": "python",
266
+ "rules": ["python"],
267
+ "configs": ["ruff", "gitignore-python"],
268
+ "pythonDependencies": ["python-dotenv"],
269
+ "scaffoldFiles": {
270
+ "cron.py": "worker/py/cron.py"
271
+ },
272
+ "blueprint": {
273
+ "type": "cron",
274
+ "runtime": "python",
275
+ "buildCommand": "pip install -r requirements.txt",
276
+ "startCommand": "python cron.py",
277
+ "schedule": "0 * * * *",
278
+ "envVars": [
279
+ { "key": "PYTHON_VERSION", "value": "3.12" }
280
+ ]
281
+ }
282
+ }
283
+ },
284
+ "databases": {
285
+ "postgres": {
286
+ "name": "PostgreSQL",
287
+ "description": "Managed PostgreSQL database",
288
+ "blueprint": {
289
+ "name": "{{PROJECT_NAME}}-db"
290
+ }
291
+ }
292
+ },
293
+ "caches": {
294
+ "redis": {
295
+ "name": "Redis (KeyVal)",
296
+ "description": "Managed Redis instance",
297
+ "blueprint": {
298
+ "type": "keyvalue",
299
+ "name": "{{PROJECT_NAME}}-cache"
300
+ }
301
+ }
302
+ }
303
+ },
304
+ "presets": {
305
+ "next-fullstack": {
306
+ "name": "Next.js Full Stack",
307
+ "description": "Next.js + Tailwind + Drizzle + Zod",
308
+ "rules": ["general", "typescript", "nextjs", "tailwind", "drizzle", "react"],
309
+ "configs": ["biome", "gitignore-node"],
310
+ "packageManager": "npm",
311
+ "createCommand": "npx create-next-app@latest {{PROJECT_NAME}} --yes --typescript --tailwind --eslint --app --src-dir --import-alias \"@/*\" --turbopack",
312
+ "postCreateDependencies": [
313
+ "drizzle-orm",
314
+ "zod",
315
+ "postgres"
316
+ ],
317
+ "postCreateDevDependencies": [
318
+ "drizzle-kit",
319
+ "@biomejs/biome",
320
+ "@tailwindcss/typography"
321
+ ],
322
+ "postCreateScripts": {
323
+ "db:generate": "drizzle-kit generate",
324
+ "db:migrate": "drizzle-kit migrate",
325
+ "db:studio": "drizzle-kit studio"
326
+ },
327
+ "postCreateFiles": {
328
+ "src/db/index.ts": "drizzle/db-index.ts",
329
+ "src/db/schema.ts": "drizzle/schema.ts",
330
+ "drizzle.config.ts": "drizzle/drizzle.config.ts",
331
+ "src/app/icon.png": "assets/favicon.png",
332
+ "src/app/globals.css": "next/globals.css",
333
+ "src/app/layout.tsx": "next/layout.tsx",
334
+ "src/app/page.tsx": "next/page-fullstack.tsx"
335
+ },
336
+ "postCreateDelete": ["src/app/favicon.ico"],
337
+ "blueprint": {
338
+ "services": [
339
+ {
340
+ "type": "web",
341
+ "runtime": "node",
342
+ "buildCommand": "npm install && npm run build",
343
+ "startCommand": "npm run start",
344
+ "healthCheckPath": "/",
345
+ "envVars": [
346
+ { "key": "NODE_ENV", "value": "production" },
347
+ { "key": "DATABASE_URL", "fromDatabase": { "name": "{{PROJECT_NAME}}-db", "property": "connectionString" } }
348
+ ]
349
+ }
350
+ ],
351
+ "databases": [
352
+ {
353
+ "name": "{{PROJECT_NAME}}-db"
354
+ }
355
+ ]
356
+ }
357
+ },
358
+ "next-frontend": {
359
+ "name": "Next.js Frontend",
360
+ "description": "Next.js + Tailwind (static export)",
361
+ "rules": ["general", "typescript", "nextjs", "tailwind", "react"],
362
+ "configs": ["biome", "gitignore-node"],
363
+ "packageManager": "npm",
364
+ "createCommand": "npx create-next-app@latest {{PROJECT_NAME}} --yes --typescript --tailwind --eslint --app --src-dir --import-alias \"@/*\" --turbopack",
365
+ "postCreateDevDependencies": [
366
+ "@biomejs/biome",
367
+ "@tailwindcss/typography"
368
+ ],
369
+ "postCreateFiles": {
370
+ "next.config.ts": "next/next.config.static.ts",
371
+ "src/app/icon.png": "assets/favicon.png",
372
+ "src/app/globals.css": "next/globals.css",
373
+ "src/app/layout.tsx": "next/layout.tsx",
374
+ "src/app/page.tsx": "next/page.tsx"
375
+ },
376
+ "postCreateDelete": ["src/app/favicon.ico"],
377
+ "blueprint": {
378
+ "services": [
379
+ {
380
+ "type": "web",
381
+ "runtime": "static",
382
+ "buildCommand": "npm install && npm run build",
383
+ "staticPublishPath": "out",
384
+ "envVars": [
385
+ { "key": "NODE_ENV", "value": "production" }
386
+ ],
387
+ "routes": [
388
+ { "type": "rewrite", "source": "/*", "destination": "/index.html" }
389
+ ]
390
+ }
391
+ ]
392
+ }
393
+ },
394
+ "vite-spa": {
395
+ "name": "Vite SPA",
396
+ "description": "Vite + React + Tailwind",
397
+ "rules": ["general", "typescript", "vite", "tailwind", "react"],
398
+ "configs": ["biome", "gitignore-node"],
399
+ "packageManager": "npm",
400
+ "createCommand": "npm create vite@latest {{PROJECT_NAME}} -- --template react-ts",
401
+ "postCreateDependencies": [],
402
+ "postCreateDevDependencies": [
403
+ "tailwindcss",
404
+ "@tailwindcss/vite",
405
+ "@tailwindcss/typography",
406
+ "@biomejs/biome"
407
+ ],
408
+ "postCreateFiles": {
409
+ "vite.config.ts": "vite/vite.config.ts",
410
+ "src/index.css": "vite/index.css",
411
+ "public/favicon.svg": "assets/favicon.svg"
412
+ },
413
+ "blueprint": {
414
+ "services": [
415
+ {
416
+ "type": "web",
417
+ "runtime": "static",
418
+ "buildCommand": "npm install && npm run build",
419
+ "staticPublishPath": "dist",
420
+ "envVars": [
421
+ { "key": "NODE_ENV", "value": "production" }
422
+ ],
423
+ "routes": [
424
+ { "type": "rewrite", "source": "/*", "destination": "/index.html" }
425
+ ]
426
+ }
427
+ ]
428
+ }
429
+ },
430
+ "fastify-api": {
431
+ "name": "Fastify API",
432
+ "description": "Fastify + Drizzle + Zod",
433
+ "rules": ["general", "typescript", "fastify", "drizzle"],
434
+ "configs": ["biome", "tsconfig", "gitignore-node"],
435
+ "packageManager": "npm",
436
+ "dependencies": [
437
+ "fastify",
438
+ "@fastify/cors",
439
+ "@fastify/env",
440
+ "drizzle-orm",
441
+ "zod",
442
+ "postgres"
443
+ ],
444
+ "devDependencies": [
445
+ "typescript",
446
+ "@types/node",
447
+ "tsx",
448
+ "drizzle-kit",
449
+ "@biomejs/biome"
450
+ ],
451
+ "scripts": {
452
+ "dev": "tsx watch src/index.ts",
453
+ "build": "tsc",
454
+ "start": "node dist/index.js",
455
+ "lint": "biome check .",
456
+ "format": "biome check --write .",
457
+ "db:generate": "drizzle-kit generate",
458
+ "db:migrate": "drizzle-kit migrate",
459
+ "db:studio": "drizzle-kit studio"
460
+ },
461
+ "scaffoldFiles": {
462
+ "src/index.ts": "fastify/index.ts",
463
+ "src/db/index.ts": "drizzle/db-index.ts",
464
+ "src/db/schema.ts": "drizzle/schema.ts",
465
+ "drizzle.config.ts": "drizzle/drizzle.config.ts"
466
+ },
467
+ "blueprint": {
468
+ "services": [
469
+ {
470
+ "type": "web",
471
+ "runtime": "node",
472
+ "buildCommand": "npm install && npm run build",
473
+ "startCommand": "npm run start",
474
+ "healthCheckPath": "/health",
475
+ "envVars": [
476
+ { "key": "NODE_ENV", "value": "production" },
477
+ { "key": "PORT", "value": "10000" },
478
+ { "key": "HOST", "value": "0.0.0.0" },
479
+ { "key": "DATABASE_URL", "fromDatabase": { "name": "{{PROJECT_NAME}}-db", "property": "connectionString" } }
480
+ ]
481
+ }
482
+ ],
483
+ "databases": [
484
+ {
485
+ "name": "{{PROJECT_NAME}}-db"
486
+ }
487
+ ]
488
+ }
489
+ },
490
+ "multi-api": {
491
+ "name": "Multi-Backend API",
492
+ "description": "Node.js (Fastify) + Python (FastAPI) side-by-side",
493
+ "rules": ["general", "typescript", "fastify", "python"],
494
+ "configs": [],
495
+ "packageManager": "npm",
496
+ "scaffoldFiles": {
497
+ "README.md": "multi-api/README.md",
498
+ ".gitignore": "multi-api/gitignore",
499
+ "node-api/package.json": "multi-api/node-api/package-simple.json",
500
+ "node-api/tsconfig.json": "multi-api/node-api/tsconfig.json",
501
+ "node-api/src/index.ts": "multi-api/node-api/src/index-simple.ts",
502
+ "python-api/requirements.txt": "multi-api/python-api/requirements-simple.txt",
503
+ "python-api/main.py": "multi-api/python-api/main-simple.py"
504
+ },
505
+ "blueprint": {
506
+ "services": [
507
+ {
508
+ "type": "web",
509
+ "name": "node-api",
510
+ "runtime": "node",
511
+ "rootDir": "node-api",
512
+ "buildCommand": "npm install && npm run build",
513
+ "startCommand": "npm run start",
514
+ "healthCheckPath": "/health",
515
+ "envVars": [
516
+ { "key": "NODE_ENV", "value": "production" },
517
+ { "key": "PORT", "value": "10000" },
518
+ { "key": "HOST", "value": "0.0.0.0" }
519
+ ]
520
+ },
521
+ {
522
+ "type": "web",
523
+ "name": "python-api",
524
+ "runtime": "python",
525
+ "rootDir": "python-api",
526
+ "buildCommand": "pip install -r requirements.txt",
527
+ "startCommand": "uvicorn main:app --host 0.0.0.0 --port $PORT",
528
+ "healthCheckPath": "/health",
529
+ "envVars": [
530
+ { "key": "PYTHON_VERSION", "value": "3.12" }
531
+ ]
532
+ }
533
+ ]
534
+ }
535
+ },
536
+ "fastapi": {
537
+ "name": "FastAPI",
538
+ "description": "FastAPI + SQLAlchemy + Pydantic",
539
+ "rules": ["general", "python", "sqlalchemy"],
540
+ "configs": ["ruff", "gitignore-python"],
541
+ "packageManager": "pip",
542
+ "pythonDependencies": [
543
+ "fastapi",
544
+ "uvicorn[standard]",
545
+ "sqlalchemy",
546
+ "psycopg2-binary",
547
+ "pydantic",
548
+ "pydantic-settings",
549
+ "python-dotenv",
550
+ "alembic"
551
+ ],
552
+ "scaffoldFiles": {
553
+ "main.py": "fastapi/main.py",
554
+ "app/__init__.py": "fastapi/app/__init__.py",
555
+ "app/config.py": "fastapi/app/config.py",
556
+ "app/database.py": "fastapi/app/database.py",
557
+ "app/models.py": "fastapi/app/models.py"
558
+ },
559
+ "blueprint": {
560
+ "services": [
561
+ {
562
+ "type": "web",
563
+ "runtime": "python",
564
+ "buildCommand": "pip install -r requirements.txt",
565
+ "startCommand": "uvicorn main:app --host 0.0.0.0 --port $PORT",
566
+ "healthCheckPath": "/health",
567
+ "envVars": [
568
+ { "key": "PYTHON_VERSION", "value": "3.12" },
569
+ { "key": "DATABASE_URL", "fromDatabase": { "name": "{{PROJECT_NAME}}-db", "property": "connectionString" } }
570
+ ]
571
+ }
572
+ ],
573
+ "databases": [
574
+ {
575
+ "name": "{{PROJECT_NAME}}-db"
576
+ }
577
+ ]
578
+ }
579
+ }
580
+ }
581
+ }
@@ -0,0 +1,30 @@
1
+ # Ruff configuration for Python linting and formatting
2
+ # https://docs.astral.sh/ruff/
3
+
4
+ line-length = 100
5
+ target-version = "py312"
6
+
7
+ [lint]
8
+ select = [
9
+ "E", # pycodestyle errors
10
+ "W", # pycodestyle warnings
11
+ "F", # Pyflakes
12
+ "I", # isort
13
+ "B", # flake8-bugbear
14
+ "C4", # flake8-comprehensions
15
+ "UP", # pyupgrade
16
+ "SIM", # flake8-simplify
17
+ ]
18
+ ignore = [
19
+ "E501", # line too long (handled by formatter)
20
+ "B008", # do not perform function calls in argument defaults
21
+ "SIM108", # ternary operator (can reduce readability)
22
+ ]
23
+
24
+ [lint.isort]
25
+ known-first-party = []
26
+
27
+ [format]
28
+ quote-style = "double"
29
+ indent-style = "space"
30
+ line-ending = "auto"
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "noImplicitReturns": true,
9
+ "skipLibCheck": true,
10
+ "esModuleInterop": true,
11
+ "resolveJsonModule": true,
12
+ "declaration": true,
13
+ "declarationMap": true,
14
+ "sourceMap": true,
15
+ "forceConsistentCasingInFileNames": true
16
+ }
17
+ }