@flisk-sh/flisk 0.0.0-stage โ†’ 1.3.190

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 (440) hide show
  1. package/CHANGELOG.md +492 -0
  2. package/LICENSE +21 -0
  3. package/README.md +479 -2
  4. package/Tiltfile +151 -0
  5. package/cli/bin/flisk.js +42 -0
  6. package/cli/dist/agent-runtimes/custom.js +335 -0
  7. package/cli/dist/agent-runtimes/registry.js +34 -0
  8. package/cli/dist/backend-frameworks/elysia.js +38 -0
  9. package/cli/dist/backend-frameworks/express.js +49 -0
  10. package/cli/dist/backend-frameworks/fastify.js +43 -0
  11. package/cli/dist/backend-frameworks/h3.js +37 -0
  12. package/cli/dist/backend-frameworks/koa.js +47 -0
  13. package/cli/dist/backend-frameworks/mcp.js +86 -0
  14. package/cli/dist/backend-frameworks/nestjs.js +55 -0
  15. package/cli/dist/backend-frameworks/registry.js +134 -0
  16. package/cli/dist/backend-frameworks/types.js +1 -0
  17. package/cli/dist/backend-languages/bun.js +76 -0
  18. package/cli/dist/backend-languages/go.js +125 -0
  19. package/cli/dist/backend-languages/node.js +122 -0
  20. package/cli/dist/backend-languages/python.js +94 -0
  21. package/cli/dist/backend-languages/registry.js +37 -0
  22. package/cli/dist/backend-languages/rust.js +82 -0
  23. package/cli/dist/backend-languages/types.js +1 -0
  24. package/cli/dist/cli.js +29 -0
  25. package/cli/dist/commands/__tests__/project-e2e-helpers.js +49 -0
  26. package/cli/dist/commands/__tests__/ui-loading-screen.test.js +16 -0
  27. package/cli/dist/commands/agent.js +182 -0
  28. package/cli/dist/commands/completion-candidates.js +116 -0
  29. package/cli/dist/commands/completion.js +843 -0
  30. package/cli/dist/commands/config.js +362 -0
  31. package/cli/dist/commands/doctor.js +1504 -0
  32. package/cli/dist/commands/down.js +114 -0
  33. package/cli/dist/commands/eject.js +108 -0
  34. package/cli/dist/commands/help.js +152 -0
  35. package/cli/dist/commands/import.js +164 -0
  36. package/cli/dist/commands/logs.js +119 -0
  37. package/cli/dist/commands/maintainers.js +102 -0
  38. package/cli/dist/commands/mcp.js +28 -0
  39. package/cli/dist/commands/networks.js +306 -0
  40. package/cli/dist/commands/project.js +447 -0
  41. package/cli/dist/commands/projects.js +103 -0
  42. package/cli/dist/commands/registry.js +53 -0
  43. package/cli/dist/commands/resource.js +992 -0
  44. package/cli/dist/commands/resources.js +127 -0
  45. package/cli/dist/commands/restart.js +89 -0
  46. package/cli/dist/commands/runtime.js +75 -0
  47. package/cli/dist/commands/stack.js +171 -0
  48. package/cli/dist/commands/stacks.js +71 -0
  49. package/cli/dist/commands/status.js +211 -0
  50. package/cli/dist/commands/ui.js +725 -0
  51. package/cli/dist/commands/up.js +609 -0
  52. package/cli/dist/commands/upgrade.js +840 -0
  53. package/cli/dist/commands/version.js +10 -0
  54. package/cli/dist/components/Accessible.js +11 -0
  55. package/cli/dist/components/BaseTooltip.js +30 -0
  56. package/cli/dist/components/DetailPanel.js +33 -0
  57. package/cli/dist/components/FileTree.js +51 -0
  58. package/cli/dist/components/ResourceSelectInput.js +42 -0
  59. package/cli/dist/components/ResourceTable.js +35 -0
  60. package/cli/dist/components/ServiceIssues.js +13 -0
  61. package/cli/dist/components/TUIHeader.js +27 -0
  62. package/cli/dist/components/TabBar.js +27 -0
  63. package/cli/dist/components/Tooltip.js +13 -0
  64. package/cli/dist/components/index.js +11 -0
  65. package/cli/dist/components/ui-theme.js +120 -0
  66. package/cli/dist/config/platform-standards.js +182 -0
  67. package/cli/dist/frontend-frameworks/lit.js +64 -0
  68. package/cli/dist/frontend-frameworks/preact.js +62 -0
  69. package/cli/dist/frontend-frameworks/qwik.js +61 -0
  70. package/cli/dist/frontend-frameworks/react.js +69 -0
  71. package/cli/dist/frontend-frameworks/registry.js +83 -0
  72. package/cli/dist/frontend-frameworks/solid.js +62 -0
  73. package/cli/dist/frontend-frameworks/svelte.js +67 -0
  74. package/cli/dist/frontend-frameworks/tanstack-router.js +101 -0
  75. package/cli/dist/frontend-frameworks/types.js +1 -0
  76. package/cli/dist/frontend-frameworks/vanilla.js +59 -0
  77. package/cli/dist/frontend-frameworks/vue.js +72 -0
  78. package/cli/dist/generator/__tests__/golden-helpers.js +43 -0
  79. package/cli/dist/generator/extension-fetch.js +291 -0
  80. package/cli/dist/generator/resource-templates.js +133 -0
  81. package/cli/dist/generator/template-engine.js +801 -0
  82. package/cli/dist/index.js +10 -0
  83. package/cli/dist/mcp/server.js +101 -0
  84. package/cli/dist/mcp/tools.js +351 -0
  85. package/cli/dist/program.js +37 -0
  86. package/cli/dist/types/index.js +38 -0
  87. package/cli/dist/utils/agent-host.js +36 -0
  88. package/cli/dist/utils/atomic-write.js +36 -0
  89. package/cli/dist/utils/bun-floor.js +9 -0
  90. package/cli/dist/utils/bun-requirement.js +10 -0
  91. package/cli/dist/utils/cache.js +63 -0
  92. package/cli/dist/utils/cold-preflight.js +257 -0
  93. package/cli/dist/utils/command-helpers.js +57 -0
  94. package/cli/dist/utils/constants.js +160 -0
  95. package/cli/dist/utils/discovery-context.js +71 -0
  96. package/cli/dist/utils/discovery-paths.js +93 -0
  97. package/cli/dist/utils/docker.js +34 -0
  98. package/cli/dist/utils/doctor-crashloop.js +161 -0
  99. package/cli/dist/utils/doctor-fix.js +391 -0
  100. package/cli/dist/utils/doctor-host.js +66 -0
  101. package/cli/dist/utils/doctor-report.js +78 -0
  102. package/cli/dist/utils/doctor-runtime.js +880 -0
  103. package/cli/dist/utils/doctor-starlark.js +132 -0
  104. package/cli/dist/utils/doctor-wiring.js +698 -0
  105. package/cli/dist/utils/down-cleanup.js +125 -0
  106. package/cli/dist/utils/env-validator.js +266 -0
  107. package/cli/dist/utils/errors.js +175 -0
  108. package/cli/dist/utils/exec-async.js +31 -0
  109. package/cli/dist/utils/file-helpers.js +104 -0
  110. package/cli/dist/utils/formatting.js +165 -0
  111. package/cli/dist/utils/generated-paths.js +51 -0
  112. package/cli/dist/utils/help-command.js +11 -0
  113. package/cli/dist/utils/host-port-config.js +140 -0
  114. package/cli/dist/utils/host-port-plan.js +100 -0
  115. package/cli/dist/utils/json-output.js +29 -0
  116. package/cli/dist/utils/machine-output.js +33 -0
  117. package/cli/dist/utils/paths.js +43 -0
  118. package/cli/dist/utils/platform.js +58 -0
  119. package/cli/dist/utils/port-assignment.js +75 -0
  120. package/cli/dist/utils/port-conflict-fix.js +25 -0
  121. package/cli/dist/utils/port-fallback-notice.js +17 -0
  122. package/cli/dist/utils/port-listener-probe.js +20 -0
  123. package/cli/dist/utils/project-config-defaults.js +17 -0
  124. package/cli/dist/utils/project-features.js +91 -0
  125. package/cli/dist/utils/project-templates.js +32 -0
  126. package/cli/dist/utils/prompt.js +97 -0
  127. package/cli/dist/utils/resource-features.js +184 -0
  128. package/cli/dist/utils/resource-kind.js +9 -0
  129. package/cli/dist/utils/schema-version-gate.js +45 -0
  130. package/cli/dist/utils/search-status.js +12 -0
  131. package/cli/dist/utils/secret-redaction.js +73 -0
  132. package/cli/dist/utils/service-config-checks.js +189 -0
  133. package/cli/dist/utils/service-manifest.js +254 -0
  134. package/cli/dist/utils/service-runtime-state.js +66 -0
  135. package/cli/dist/utils/service-urls.js +112 -0
  136. package/cli/dist/utils/services.js +360 -0
  137. package/cli/dist/utils/shared-infra.js +45 -0
  138. package/cli/dist/utils/shared-platform-postgres.js +232 -0
  139. package/cli/dist/utils/single-flight.js +21 -0
  140. package/cli/dist/utils/smoke.js +401 -0
  141. package/cli/dist/utils/spinner.js +40 -0
  142. package/cli/dist/utils/stack-features.js +15 -0
  143. package/cli/dist/utils/stack-status.js +14 -0
  144. package/cli/dist/utils/startup-report.js +78 -0
  145. package/cli/dist/utils/status-message.js +21 -0
  146. package/cli/dist/utils/status-ports.js +33 -0
  147. package/cli/dist/utils/suggestions.js +63 -0
  148. package/cli/dist/utils/tar.js +46 -0
  149. package/cli/dist/utils/tdk-version.js +51 -0
  150. package/cli/dist/utils/terminal-layout.js +19 -0
  151. package/cli/dist/utils/tilt-events.js +194 -0
  152. package/cli/dist/utils/tilt-logs.js +61 -0
  153. package/cli/dist/utils/tilt-port-owner.js +63 -0
  154. package/cli/dist/utils/tilt-process.js +54 -0
  155. package/cli/dist/utils/tilt-resource-state.js +32 -0
  156. package/cli/dist/utils/tilt-startup.js +49 -0
  157. package/cli/dist/utils/tilt-unreachable-message.js +9 -0
  158. package/cli/dist/utils/tilt.js +104 -0
  159. package/cli/dist/utils/ui-keymap.js +129 -0
  160. package/cli/dist/utils/ui-service-state.js +34 -0
  161. package/cli/dist/utils/up-only.js +28 -0
  162. package/cli/dist/utils/up-readiness.js +118 -0
  163. package/cli/dist/utils/url-actions.js +103 -0
  164. package/cli/dist/utils/validation.js +62 -0
  165. package/cli/dist/utils/which.js +56 -0
  166. package/cli/dist/utils/windows-doctor.js +176 -0
  167. package/cli/dist-bundle/chunk-6EA4DGCY.js +2 -0
  168. package/cli/dist-bundle/chunk-BZ4H7MM4.js +3 -0
  169. package/cli/dist-bundle/chunk-CLCUIDBH.js +510 -0
  170. package/cli/dist-bundle/cli.js +2017 -0
  171. package/cli/dist-bundle/cold-preflight-SY26O2IG.js +2 -0
  172. package/cli/dist-bundle/devtools-ZUHXW33W.js +5 -0
  173. package/cli/dist-bundle/extension-fetch-J4FFH7TJ.js +2 -0
  174. package/cli/package.json +83 -0
  175. package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  176. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  177. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  178. package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  179. package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  180. package/cli/templates/.tiltignore.hbs +72 -0
  181. package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +220 -0
  182. package/cli/templates/TILT_TECH_STACK.star.hbs +149 -0
  183. package/cli/templates/Tiltfile.hbs +381 -0
  184. package/cli/templates/spec.master.hbs +192 -0
  185. package/discovery/AGENTS.md +362 -0
  186. package/discovery/TILT_DISCOVERY.star +429 -0
  187. package/discovery/Tiltfile +58 -0
  188. package/discovery/config.star +265 -0
  189. package/discovery/constants.star +167 -0
  190. package/discovery/deterministic.star +213 -0
  191. package/discovery/discovery_daemon.star +193 -0
  192. package/discovery/discovery_orchestrator.star +492 -0
  193. package/discovery/filtering.star +7 -0
  194. package/discovery/identity-management-backend/service.yaml +26 -0
  195. package/discovery/identity-management-frontend/service.yaml +29 -0
  196. package/discovery/identity-sdk/service.yaml +9 -0
  197. package/discovery/incremental_discovery.star +215 -0
  198. package/discovery/indexing.star +9 -0
  199. package/discovery/json_manifest_scanner.star +57 -0
  200. package/discovery/libraries.star +48 -0
  201. package/discovery/loading.star +25 -0
  202. package/discovery/manifest/constants.star +106 -0
  203. package/discovery/manifest/loading.star +418 -0
  204. package/discovery/manifest/normalize.star +289 -0
  205. package/discovery/manifest/validation.star +110 -0
  206. package/discovery/normalization.star +13 -0
  207. package/discovery/registry.star +562 -0
  208. package/discovery/resource_snapshot.py +384 -0
  209. package/discovery/resource_snapshot.star +145 -0
  210. package/discovery/schemas.star +3 -0
  211. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  212. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  213. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  214. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  215. package/discovery/test_resource_snapshot.py +253 -0
  216. package/discovery/validation.star +80 -0
  217. package/discovery/versioning.star +3 -0
  218. package/engine/AGENTS.md +706 -0
  219. package/engine/README.md +31 -0
  220. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  221. package/engine/Tiltfile +86 -0
  222. package/engine/assets/docker/golden-layers.Dockerfile +204 -0
  223. package/engine/assets/docker/wake-gateway/Dockerfile +28 -0
  224. package/engine/assets/docker/wake-gateway/decide.test.ts +177 -0
  225. package/engine/assets/docker/wake-gateway/decide.ts +135 -0
  226. package/engine/assets/docker/wake-gateway/server.ts +363 -0
  227. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +39 -0
  228. package/engine/assets/scripts/cleanup-tilt-images.sh +122 -0
  229. package/engine/assets/scripts/mac-m1-resource-monitor.sh +123 -0
  230. package/engine/config.star +5 -0
  231. package/engine/entrypoint.star +101 -0
  232. package/engine/lifecycle/orchestrator.star +263 -0
  233. package/engine/paths.star +719 -0
  234. package/engine/schemas/project-schema.json +147 -0
  235. package/engine/schemas/service-schema.json +537 -0
  236. package/engine/scripts/README.md +89 -0
  237. package/engine/scripts/build-and-publish-lib.sh +207 -0
  238. package/engine/scripts/check-lib-publish.sh +87 -0
  239. package/engine/scripts/debug-container.sh +265 -0
  240. package/engine/scripts/generate-manifest.sh +200 -0
  241. package/engine/spec.master +702 -0
  242. package/engine/spec.master.example +341 -0
  243. package/engine/topologies/README.md +33 -0
  244. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  245. package/engine/topologies/platform/docker/auth/auth.star +207 -0
  246. package/engine/topologies/platform/docker/build/frontend_build_plan.star +65 -0
  247. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  248. package/engine/topologies/platform/docker/build/golden_image_build.star +144 -0
  249. package/engine/topologies/platform/docker/build/golden_image_constants.star +100 -0
  250. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +263 -0
  251. package/engine/topologies/platform/docker/compose/compose.star +637 -0
  252. package/engine/topologies/platform/docker/compose/compose_helpers.star +54 -0
  253. package/engine/topologies/platform/docker/compose/traefik_standalone.star +171 -0
  254. package/engine/topologies/platform/docker/config/bunignore.star +144 -0
  255. package/engine/topologies/platform/docker/config/dockerignore.star +152 -0
  256. package/engine/topologies/platform/docker/config/healthcheck.star +58 -0
  257. package/engine/topologies/platform/docker/constants.star +211 -0
  258. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +56 -0
  259. package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +264 -0
  260. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +76 -0
  261. package/engine/topologies/platform/docker/index.star +40 -0
  262. package/engine/topologies/platform/docker/layers/bun_helpers.star +25 -0
  263. package/engine/topologies/platform/docker/layers/infisical/index.star +42 -0
  264. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +264 -0
  265. package/engine/topologies/platform/docker/layers/l1_base_layers.star +89 -0
  266. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +147 -0
  267. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +229 -0
  268. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +282 -0
  269. package/engine/topologies/platform/docker/layers/prisma/constants.star +138 -0
  270. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +98 -0
  271. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +131 -0
  272. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +100 -0
  273. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +128 -0
  274. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +205 -0
  275. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +121 -0
  276. package/engine/topologies/platform/docker/networking/api_path_constants.star +206 -0
  277. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +31 -0
  278. package/engine/topologies/platform/docker/networking/traefik.star +266 -0
  279. package/engine/topologies/platform/docker/networking/traefik_constants.star +148 -0
  280. package/engine/topologies/platform/docker/networking/traefik_helpers.star +162 -0
  281. package/engine/topologies/platform/docker/networking/traefik_static_routes.star +165 -0
  282. package/engine/topologies/platform/docker/secrets/env_secrets.star +74 -0
  283. package/engine/topologies/platform/docker/secrets/infisical.star +109 -0
  284. package/engine/topologies/platform/net/AGENTS.md +64 -0
  285. package/engine/topologies/platform/net/proxy.star +6 -0
  286. package/engine/topologies/platform/registries/local.star +6 -0
  287. package/engine/topologies/platform/registries/verdaccio_loader.star +20 -0
  288. package/engine/topologies/platform/security/AGENTS.md +49 -0
  289. package/engine/topologies/platform/security/secrets.star +241 -0
  290. package/engine/topologies/platform/state/AGENTS.md +64 -0
  291. package/engine/topologies/platform/state/relational.star +6 -0
  292. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  293. package/engine/topologies/tilt/common/utils.star +409 -0
  294. package/engine/topologies/tilt/common/utils_debug.star +71 -0
  295. package/engine/topologies/tilt/common/utils_deterministic.star +170 -0
  296. package/engine/topologies/tilt/common/utils_docker_networks.star +54 -0
  297. package/engine/topologies/tilt/common/utils_env.star +92 -0
  298. package/engine/topologies/tilt/common/utils_output.star +99 -0
  299. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  300. package/engine/topologies/tilt/config/defaults.star +5 -0
  301. package/engine/topologies/tilt/config/feature_flags.star +12 -0
  302. package/engine/topologies/tilt/config/global.star +57 -0
  303. package/engine/topologies/tilt/config/profiles.star +398 -0
  304. package/engine/topologies/tilt/generators/agents_md.star +64 -0
  305. package/engine/topologies/tilt/generators/api_gateway.star +147 -0
  306. package/engine/topologies/tilt/generators/index.star +126 -0
  307. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  308. package/engine/topologies/tilt/generators/infisical/examples.star +314 -0
  309. package/engine/topologies/tilt/generators/infisical/index.star +59 -0
  310. package/engine/topologies/tilt/generators/infisical/machine_identity.star +422 -0
  311. package/engine/topologies/tilt/generators/infisical/organization.star +536 -0
  312. package/engine/topologies/tilt/generators/infisical/path_manager.star +478 -0
  313. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +422 -0
  314. package/engine/topologies/tilt/generators/nginx_conf.star +145 -0
  315. package/engine/topologies/tilt/generators/npmrc.star +132 -0
  316. package/engine/topologies/tilt/generators/tsconfig.star +25 -0
  317. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +73 -0
  318. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +137 -0
  319. package/engine/topologies/tilt/generators/typescript/common.star +9 -0
  320. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +78 -0
  321. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +140 -0
  322. package/engine/topologies/tilt/generators/typescript/include.star +25 -0
  323. package/engine/topologies/tilt/generators/typescript/playwright_config.star +42 -0
  324. package/engine/topologies/tilt/generators/typescript/prisma_config.star +51 -0
  325. package/engine/topologies/tilt/generators/validators.star +868 -0
  326. package/engine/topologies/tilt/generators/vite/backend.star +80 -0
  327. package/engine/topologies/tilt/generators/vite/frameworks/lit.star +92 -0
  328. package/engine/topologies/tilt/generators/vite/frameworks/preact.star +94 -0
  329. package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +94 -0
  330. package/engine/topologies/tilt/generators/vite/frameworks/react.star +128 -0
  331. package/engine/topologies/tilt/generators/vite/frameworks/solid.star +94 -0
  332. package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +94 -0
  333. package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +92 -0
  334. package/engine/topologies/tilt/generators/vite/frameworks/vue.star +94 -0
  335. package/engine/topologies/tilt/generators/vite/frontend.star +153 -0
  336. package/engine/topologies/tilt/generators/vite/generators.star +45 -0
  337. package/engine/topologies/tilt/generators/vite/helpers.star +256 -0
  338. package/engine/topologies/tilt/generators/vite/library.star +67 -0
  339. package/engine/topologies/tilt/generators/vite/sdk.star +75 -0
  340. package/engine/topologies/tilt/generators/vite/templates.star +460 -0
  341. package/engine/topologies/tilt/generators/vite_config.star +24 -0
  342. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  343. package/engine/topologies/tilt/manifest/README.md +679 -0
  344. package/engine/topologies/tilt/manifest/__init__.star +220 -0
  345. package/engine/topologies/tilt/manifest/constants.star +262 -0
  346. package/engine/topologies/tilt/manifest/errors.star +268 -0
  347. package/engine/topologies/tilt/manifest/integration.star +348 -0
  348. package/engine/topologies/tilt/manifest/json_to_yaml.py +61 -0
  349. package/engine/topologies/tilt/manifest/loader.star +239 -0
  350. package/engine/topologies/tilt/manifest/mapper.star +229 -0
  351. package/engine/topologies/tilt/manifest/parser.star +490 -0
  352. package/engine/topologies/tilt/manifest/schema.star +502 -0
  353. package/engine/topologies/tilt/manifest/tests/test_integration.star +278 -0
  354. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +475 -0
  355. package/engine/topologies/tilt/manifest/tests/test_manifest.star +319 -0
  356. package/engine/topologies/tilt/manifest/tests/test_validator.star +472 -0
  357. package/engine/topologies/tilt/manifest/validator.star +744 -0
  358. package/engine/topologies/tilt/manifest/yaml_to_json.py +20 -0
  359. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  360. package/engine/topologies/tilt/resources/build_concurrency.star +56 -0
  361. package/engine/topologies/tilt/resources/conditions.star +5 -0
  362. package/engine/topologies/tilt/resources/databases.star +246 -0
  363. package/engine/topologies/tilt/resources/declaration.star +5 -0
  364. package/engine/topologies/tilt/resources/deps.star +5 -0
  365. package/engine/topologies/tilt/resources/infra-loader.star +504 -0
  366. package/engine/topologies/tilt/resources/libs.star +32 -0
  367. package/engine/topologies/tilt/resources/libs_discovery.star +104 -0
  368. package/engine/topologies/tilt/resources/libs_paths.star +81 -0
  369. package/engine/topologies/tilt/resources/libs_resource_definition.star +153 -0
  370. package/engine/topologies/tilt/resources/libs_setup.star +166 -0
  371. package/engine/topologies/tilt/resources/libs_tsconfig.star +39 -0
  372. package/engine/topologies/tilt/resources/orchestrator/apply.star +79 -0
  373. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +864 -0
  374. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +90 -0
  375. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +150 -0
  376. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +38 -0
  377. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +46 -0
  378. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +193 -0
  379. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  380. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +23 -0
  381. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +136 -0
  382. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +219 -0
  383. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +172 -0
  384. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +577 -0
  385. package/engine/topologies/tilt/resources/orchestrator/helpers.star +35 -0
  386. package/engine/topologies/tilt/resources/orchestrator.star +56 -0
  387. package/engine/topologies/tilt/resources/ordering.star +5 -0
  388. package/engine/topologies/tilt/resources/shared-platform-postgres.star +30 -0
  389. package/engine/topologies/tilt/resources/triggers.star +5 -0
  390. package/engine/topologies/tilt/resources/watchers.star +304 -0
  391. package/engine/where-things-live.star +719 -0
  392. package/examples/tdk-example/LICENSE +21 -0
  393. package/examples/tdk-example/README.md +23 -0
  394. package/examples/tdk-example/TILT_SERVICE_DEFAULTS.star +42 -0
  395. package/examples/tdk-example/TILT_TECH_STACK.star +67 -0
  396. package/examples/tdk-example/Tiltfile +25 -0
  397. package/examples/tdk-example/services/platform/messaging/docker-compose.yml +26 -0
  398. package/examples/tdk-example/services/shop/orders-api/package.json +20 -0
  399. package/examples/tdk-example/services/shop/orders-api/service.json +14 -0
  400. package/examples/tdk-example/services/shop/orders-api/src/index.ts +81 -0
  401. package/examples/tdk-example/services/shop/orders-app/index.html +12 -0
  402. package/examples/tdk-example/services/shop/orders-app/package.json +23 -0
  403. package/examples/tdk-example/services/shop/orders-app/public/.gitkeep +0 -0
  404. package/examples/tdk-example/services/shop/orders-app/service.json +9 -0
  405. package/examples/tdk-example/services/shop/orders-app/src/main.tsx +9 -0
  406. package/examples/tdk-example/services/shop/orders-app/src/orders.tsx +67 -0
  407. package/examples/tdk-example/services/shop/orders-app/src/style.css +15 -0
  408. package/examples/tdk-example/services/shop/orders-worker/package.json +18 -0
  409. package/examples/tdk-example/services/shop/orders-worker/service.json +13 -0
  410. package/examples/tdk-example/services/shop/orders-worker/src/index.ts +33 -0
  411. package/ext/Tiltfile +66 -0
  412. package/ext/ide-components/README.md +221 -0
  413. package/ext/ide-components/code_viewer/server.py +208 -0
  414. package/ext/ide-components/config_inspector/server.py +1052 -0
  415. package/ext/ide-components/file_browser/server.py +287 -0
  416. package/ext/ide-components/shared/config_service.py +471 -0
  417. package/ext/ide-components/shared/file_utils.py +300 -0
  418. package/ext/ide-components/shared/http_utils.py +234 -0
  419. package/ext/ide-components/shared/static/styles.css +1334 -0
  420. package/ext/ide-components/shared/syntax_highlighter.py +142 -0
  421. package/ext/ide-components/shared/template_engine.py +125 -0
  422. package/ext/ide-components/shared/templates/base.html +121 -0
  423. package/ext/ide-components/shared/test_config_service.py +328 -0
  424. package/ext/ide-components/shared/tilt_integration.py +160 -0
  425. package/ext/ui-enhancements/cron-status-server.sh +51 -0
  426. package/ext/ui-enhancements/cron-status-tracker.sh +148 -0
  427. package/ext/ui-enhancements/extension.yaml +36 -0
  428. package/ext/ui-enhancements/tiltfile.py +101 -0
  429. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  430. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  431. package/ext/ui-enhancements/ui/icons.css +125 -0
  432. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  433. package/package.json +94 -4
  434. package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  435. package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  436. package/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  437. package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  438. package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  439. package/specs/specs/TILT_SERVICE_DEFAULTS.star +207 -0
  440. package/specs/specs/TILT_TECH_STACK.star +161 -0
@@ -0,0 +1,43 @@
1
+ export function getFastifyIndexTemplate(name) {
2
+ return `import Fastify from 'fastify';
3
+
4
+ const app = Fastify();
5
+
6
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
7
+ app.get('/health', async () => ({ status: 'ok', service: '${name}' }));
8
+
9
+ app.get('/health/live', async () => ({ status: 'alive', timestamp: Date.now() }));
10
+
11
+ app.get('/health/ready', async (_request, reply) => {
12
+ const dependencies: Record<string, string> = {};
13
+ let allReady = true;
14
+
15
+ // Add dependency checks here (database, cache, etc.)
16
+ // Mark allReady = false if any dependency is unhealthy
17
+
18
+ const status = allReady ? 'ready' : 'not_ready';
19
+ return reply.code(allReady ? 200 : 503).send({ status, dependencies });
20
+ });
21
+
22
+ app.get('/', async () => ({
23
+ service: '${name}',
24
+ version: '1.0.0',
25
+ endpoints: ['/health', '/health/live', '/health/ready']
26
+ }));
27
+
28
+ const port = Number(process.env.PORT || 3000);
29
+
30
+ // Bind beyond loopback: Traefik reaches the container over the Docker network.
31
+ await app.listen({ port, host: '0.0.0.0' });
32
+
33
+ console.log('\\n๐Ÿš€ ${name} running on http://localhost:' + port);
34
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
35
+ `;
36
+ }
37
+ export const fastifyBackendProvider = {
38
+ id: "fastify",
39
+ label: "Bun + Fastify",
40
+ dependencies: { fastify: "^5.0.0" },
41
+ devDependencies: {},
42
+ createIndex: getFastifyIndexTemplate,
43
+ };
@@ -0,0 +1,37 @@
1
+ export function getH3IndexTemplate(name) {
2
+ return `import { createServer } from 'node:http';
3
+ import { createApp, createRouter, defineEventHandler, toNodeListener } from 'h3';
4
+
5
+ const app = createApp();
6
+ const router = createRouter();
7
+
8
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
9
+ router.get('/health', defineEventHandler(() => ({ status: 'ok', service: '${name}' })));
10
+
11
+ router.get('/health/live', defineEventHandler(() => ({ status: 'alive', timestamp: Date.now() })));
12
+
13
+ router.get('/', defineEventHandler(() => ({
14
+ service: '${name}',
15
+ version: '1.0.0',
16
+ endpoints: ['/health', '/health/live']
17
+ })));
18
+
19
+ app.use(router);
20
+
21
+ const port = Number(process.env.PORT || 3000);
22
+
23
+ // node:http works on Bun. Bind beyond loopback: Traefik reaches the container over the Docker network.
24
+ createServer(toNodeListener(app)).listen(port, '0.0.0.0', () => {
25
+ console.log('\\n๐Ÿš€ ${name} running on http://localhost:' + port);
26
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
27
+ });
28
+ `;
29
+ }
30
+ export const h3BackendProvider = {
31
+ id: "h3",
32
+ label: "Bun + h3",
33
+ // h3's npm "latest" tag is a 2.0 release candidate; the scaffold stays on the stable 1.x line.
34
+ dependencies: { h3: "^1.15.0" },
35
+ devDependencies: {},
36
+ createIndex: getH3IndexTemplate,
37
+ };
@@ -0,0 +1,47 @@
1
+ export function getKoaIndexTemplate(name) {
2
+ return `import Koa from 'koa';
3
+
4
+ const app = new Koa();
5
+
6
+ // Plain Koa middleware, so the scaffold needs no router dependency.
7
+ app.use(async (ctx) => {
8
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
9
+ if (ctx.path === '/health') {
10
+ ctx.body = { status: 'ok', service: '${name}' };
11
+ return;
12
+ }
13
+
14
+ if (ctx.path === '/health/live') {
15
+ ctx.body = { status: 'alive', timestamp: Date.now() };
16
+ return;
17
+ }
18
+
19
+ if (ctx.path === '/') {
20
+ ctx.body = {
21
+ service: '${name}',
22
+ version: '1.0.0',
23
+ endpoints: ['/health', '/health/live']
24
+ };
25
+ return;
26
+ }
27
+
28
+ ctx.status = 404;
29
+ ctx.body = { error: 'not_found' };
30
+ });
31
+
32
+ const port = Number(process.env.PORT || 3000);
33
+
34
+ // Bind beyond loopback: Traefik reaches the container over the Docker network.
35
+ app.listen(port, '0.0.0.0', () => {
36
+ console.log('\\n๐Ÿš€ ${name} running on http://localhost:' + port);
37
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
38
+ });
39
+ `;
40
+ }
41
+ export const koaBackendProvider = {
42
+ id: "koa",
43
+ label: "Bun + Koa",
44
+ dependencies: { koa: "^3.0.0" },
45
+ devDependencies: { "@types/koa": "^3.0.0" },
46
+ createIndex: getKoaIndexTemplate,
47
+ };
@@ -0,0 +1,86 @@
1
+ export function getMcpIndexTemplate(name) {
2
+ return `import { createServer } from 'node:http';
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
5
+ import { z } from 'zod';
6
+
7
+ // A new McpServer per request keeps the endpoint stateless, so there is no session to lose when the container restarts.
8
+ function buildServer() {
9
+ const server = new McpServer({ name: '${name}', version: '1.0.0' });
10
+
11
+ // Add your tools, resources and prompts here. This one is a placeholder you can delete.
12
+ server.registerTool(
13
+ 'echo',
14
+ { description: 'Echo a message back', inputSchema: { message: z.string() } },
15
+ async ({ message }) => ({ content: [{ type: 'text', text: message }] })
16
+ );
17
+
18
+ return server;
19
+ }
20
+
21
+ async function readBody(req: import('node:http').IncomingMessage) {
22
+ const chunks: Buffer[] = [];
23
+ for await (const chunk of req) chunks.push(chunk as Buffer);
24
+ const raw = Buffer.concat(chunks).toString('utf8');
25
+ return raw ? JSON.parse(raw) : undefined;
26
+ }
27
+
28
+ const httpServer = createServer(async (req, res) => {
29
+ const path = (req.url ?? '/').split('?')[0];
30
+
31
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
32
+ if (path === '/health') {
33
+ res.setHeader('content-type', 'application/json');
34
+ res.end(JSON.stringify({ status: 'ok', service: '${name}' }));
35
+ return;
36
+ }
37
+
38
+ // MCP over Streamable HTTP. Clients POST JSON-RPC here.
39
+ if (path === '/mcp') {
40
+ if (req.method !== 'POST') {
41
+ res.statusCode = 405;
42
+ res.setHeader('allow', 'POST');
43
+ res.setHeader('content-type', 'application/json');
44
+ res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32000, message: 'Method not allowed' }, id: null }));
45
+ return;
46
+ }
47
+
48
+ const server = buildServer();
49
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
50
+ res.on('close', () => {
51
+ transport.close();
52
+ server.close();
53
+ });
54
+ await server.connect(transport);
55
+ await transport.handleRequest(req, res, await readBody(req));
56
+ return;
57
+ }
58
+
59
+ res.statusCode = 404;
60
+ res.setHeader('content-type', 'application/json');
61
+ res.end(JSON.stringify({ error: 'not_found' }));
62
+ });
63
+
64
+ const port = Number(process.env.PORT || 3000);
65
+
66
+ // Bind beyond loopback: Traefik reaches the container over the Docker network.
67
+ httpServer.listen(port, '0.0.0.0', () => {
68
+ console.log('\\n๐Ÿš€ ${name} MCP server on http://localhost:' + port + '/mcp');
69
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
70
+ });
71
+ `;
72
+ }
73
+ /**
74
+ * The scaffold for \`--type mcp\`. It is not in BACKEND_FRAMEWORKS: \`mcp\` is a resource type of its own, not a \`--framework\`
75
+ * choice for a backend.
76
+ */
77
+ export const mcpBackendProvider = {
78
+ id: "mcp",
79
+ label: "Bun + Model Context Protocol server",
80
+ dependencies: {
81
+ "@modelcontextprotocol/sdk": "^1.32.0",
82
+ zod: "^4.0.0",
83
+ },
84
+ devDependencies: {},
85
+ createIndex: getMcpIndexTemplate,
86
+ };
@@ -0,0 +1,55 @@
1
+ export function getNestIndexTemplate(name) {
2
+ return `import 'reflect-metadata';
3
+ import { Controller, Get, Module } from '@nestjs/common';
4
+ import { NestFactory } from '@nestjs/core';
5
+
6
+ @Controller()
7
+ class AppController {
8
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
9
+ @Get('health')
10
+ health() {
11
+ return { status: 'ok', service: '${name}' };
12
+ }
13
+
14
+ @Get('health/live')
15
+ live() {
16
+ return { status: 'alive', timestamp: Date.now() };
17
+ }
18
+
19
+ @Get()
20
+ root() {
21
+ return { service: '${name}', version: '1.0.0', endpoints: ['/health', '/health/live'] };
22
+ }
23
+ }
24
+
25
+ @Module({ controllers: [AppController] })
26
+ class AppModule {}
27
+
28
+ async function bootstrap() {
29
+ const app = await NestFactory.create(AppModule, { logger: ['error', 'warn', 'log'] });
30
+ const port = Number(process.env.PORT || 3000);
31
+
32
+ // Bind beyond loopback: Traefik reaches the container over the Docker network.
33
+ await app.listen(port, '0.0.0.0');
34
+ console.log('\\n๐Ÿš€ ${name} running on http://localhost:' + port);
35
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
36
+ }
37
+
38
+ bootstrap();
39
+ `;
40
+ }
41
+ export const nestBackendProvider = {
42
+ id: "nestjs",
43
+ label: "Bun + NestJS",
44
+ dependencies: {
45
+ "@nestjs/common": "^11.0.0",
46
+ "@nestjs/core": "^11.0.0",
47
+ "@nestjs/platform-express": "^11.0.0",
48
+ "reflect-metadata": "^0.2.2",
49
+ rxjs: "^7.8.1",
50
+ },
51
+ devDependencies: {},
52
+ // Nest's decorators need these; the engine's generated Docker tsconfig already sets them.
53
+ compilerOptions: { experimentalDecorators: true, emitDecoratorMetadata: true },
54
+ createIndex: getNestIndexTemplate,
55
+ };
@@ -0,0 +1,134 @@
1
+ // Copyright (c) 2026 Flisk Landscape contributors
2
+ // SPDX-License-Identifier: MIT
3
+ import { resolveAgentRuntime } from "../agent-runtimes/registry.js";
4
+ import { getBackendIndexTemplate } from "../backend-languages/bun.js";
5
+ import { BACKEND_LANGUAGES, getBackendLanguage } from "../backend-languages/registry.js";
6
+ import { TdkError } from "../utils/errors.js";
7
+ import { elysiaBackendProvider } from "./elysia.js";
8
+ import { expressBackendProvider } from "./express.js";
9
+ import { fastifyBackendProvider } from "./fastify.js";
10
+ import { h3BackendProvider } from "./h3.js";
11
+ import { koaBackendProvider } from "./koa.js";
12
+ import { mcpBackendProvider } from "./mcp.js";
13
+ import { nestBackendProvider } from "./nestjs.js";
14
+ /** Hono is the historical default; omitting --framework keeps the exact historical output. */
15
+ export const DEFAULT_BACKEND_FRAMEWORK = "hono";
16
+ export const honoBackendProvider = {
17
+ id: "hono",
18
+ label: "Bun + Hono",
19
+ dependencies: { hono: "^4.0.0" },
20
+ devDependencies: {},
21
+ createIndex: getBackendIndexTemplate,
22
+ };
23
+ export const BACKEND_FRAMEWORKS = {
24
+ hono: honoBackendProvider,
25
+ express: expressBackendProvider,
26
+ elysia: elysiaBackendProvider,
27
+ fastify: fastifyBackendProvider,
28
+ h3: h3BackendProvider,
29
+ koa: koaBackendProvider,
30
+ nestjs: nestBackendProvider,
31
+ };
32
+ /**
33
+ * The languages a framework can be combined with, decided by the same validation the resource command
34
+ * uses: a language that owns its runtime (python, go, rust, node) cannot be combined with a framework.
35
+ */
36
+ function compatibleLanguages(frameworkId) {
37
+ return Object.keys(BACKEND_LANGUAGES).filter((languageId) => {
38
+ try {
39
+ resolveBackendFramework("backend", frameworkId, BACKEND_LANGUAGES[languageId]);
40
+ return true;
41
+ }
42
+ catch (error) {
43
+ // Only the "a language that owns its runtime cannot be combined with a framework" rule is
44
+ // expected here. Any other error is a bug and must surface instead of silently shrinking
45
+ // the language column.
46
+ if (error instanceof TdkError)
47
+ return false;
48
+ throw error;
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * Lists the registered backend frameworks with the language (and runtime) they are scaffolded with, so
54
+ * `flisk resource --type backend --frameworks` is the whole backend discovery surface.
55
+ *
56
+ * `languageId` is the language the listing is judged against; the default Bun language is used when it
57
+ * is omitted. A language that was asked for is named in the printed command, so copying a row never
58
+ * scaffolds a different language than the one the listing was about.
59
+ */
60
+ export function listBackendFrameworks(languageId) {
61
+ const requested = getBackendLanguage(languageId);
62
+ const namesLanguage = languageId !== undefined;
63
+ return Object.entries(BACKEND_FRAMEWORKS).map(([id, provider]) => {
64
+ const languages = compatibleLanguages(id);
65
+ const compatible = languages.includes(requested.id);
66
+ const languageFlag = namesLanguage ? ` --language ${requested.id}` : "";
67
+ // A language that owns its runtime cannot be combined with a framework, so the row carries the
68
+ // command that creates the resource in that language, without a framework.
69
+ const command = compatible
70
+ ? `flisk resource <name> --type backend --framework ${id}${languageFlag}`
71
+ : `flisk resource <name> --type backend${languageFlag}`;
72
+ return {
73
+ id,
74
+ label: provider.label,
75
+ languages,
76
+ compatible,
77
+ command,
78
+ };
79
+ });
80
+ }
81
+ export function getBackendFramework(frameworkId) {
82
+ const id = (frameworkId ?? DEFAULT_BACKEND_FRAMEWORK).trim().toLowerCase();
83
+ const provider = Object.hasOwn(BACKEND_FRAMEWORKS, id) ? BACKEND_FRAMEWORKS[id] : undefined;
84
+ if (!provider) {
85
+ const supportedIds = Object.keys(BACKEND_FRAMEWORKS).join(", ");
86
+ throw new TdkError(`Unknown backend framework "${frameworkId}". Supported frameworks: ${supportedIds}.`, [`Use one of: ${supportedIds}`, `Omit --framework to use ${DEFAULT_BACKEND_FRAMEWORK}`]);
87
+ }
88
+ return provider;
89
+ }
90
+ /**
91
+ * Returns the provider for an explicit `--framework` on a backend, or undefined when none was given
92
+ * (the historical Hono scaffold). Python owns its runtime, so a framework cannot be combined with it.
93
+ */
94
+ export function resolveBackendFramework(resourceType, frameworkId, language) {
95
+ // `mcp` is a resource type with one fixed scaffold, so a framework choice does not apply to it.
96
+ if (resourceType === "mcp") {
97
+ if (frameworkId !== undefined) {
98
+ throw new TdkError("--framework cannot be combined with --type mcp.", [
99
+ "An mcp resource always scaffolds a Model Context Protocol server",
100
+ "Drop --framework, or use --type backend --framework <id>",
101
+ ]);
102
+ }
103
+ if (language?.createFiles) {
104
+ throw new TdkError(`--language ${language.id} cannot be combined with --type mcp.`, [
105
+ "An mcp resource is a Bun service; drop --language",
106
+ ]);
107
+ }
108
+ return mcpBackendProvider;
109
+ }
110
+ // `agent` is scaffolded by an agent runtime (src/agent-runtimes/), not a framework. Only the default runtime is reachable here:
111
+ // `flisk resource` validates --runtime before it scaffolds, so the package.json and tsconfig always match the chosen runtime.
112
+ if (resourceType === "agent") {
113
+ if (frameworkId !== undefined && frameworkId !== "custom") {
114
+ throw new TdkError("--framework cannot be combined with --type agent.", [
115
+ "An agent resource is scaffolded by an agent runtime; use --runtime <id> instead",
116
+ ]);
117
+ }
118
+ if (language?.createFiles) {
119
+ throw new TdkError(`--language ${language.id} cannot be combined with --type agent.`, [
120
+ "An agent resource is a Bun service; drop --language",
121
+ ]);
122
+ }
123
+ return resolveAgentRuntime();
124
+ }
125
+ if (resourceType !== "backend" || frameworkId === undefined)
126
+ return undefined;
127
+ if (language?.createFiles) {
128
+ throw new TdkError(`--framework cannot be combined with --language ${language.id}.`, [
129
+ `The ${language.id} provider owns its runtime and framework`,
130
+ "Drop --framework, or use --language bun",
131
+ ]);
132
+ }
133
+ return getBackendFramework(frameworkId);
134
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,76 @@
1
+ export function getBackendIndexTemplate(name) {
2
+ return renderBackendIndex(name, false);
3
+ }
4
+ /** The Bun + Hono backend with a `/health/db` route that runs a query through the Drizzle client. */
5
+ export function getDrizzleBackendIndexTemplate(name) {
6
+ return renderBackendIndex(name, true);
7
+ }
8
+ function renderBackendIndex(name, drizzle) {
9
+ const drizzleImports = drizzle
10
+ ? "import { sql } from 'drizzle-orm';\nimport { db } from './db.js';\n"
11
+ : "";
12
+ const drizzleRoute = drizzle
13
+ ? `// Database check: runs a trivial query through the Drizzle client (src/db.ts).
14
+ app.get('/health/db', async (c) => {
15
+ try {
16
+ await db.execute(sql\`select 1\`);
17
+ return c.json({ status: 'ok', database: 'up' });
18
+ } catch (error) {
19
+ console.error('Database health check failed:', error);
20
+ return c.json({ status: 'error', database: 'down' }, 503);
21
+ }
22
+ });
23
+
24
+ `
25
+ : "";
26
+ return `import { Hono } from 'hono';
27
+ ${drizzleImports}
28
+ const app = new Hono();
29
+
30
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
31
+ app.get('/health', (c) => {
32
+ return c.json({ status: 'ok', service: '${name}' });
33
+ });
34
+
35
+ app.get('/health/live', (c) => {
36
+ return c.json({ status: 'alive', timestamp: Date.now() });
37
+ });
38
+
39
+ app.get('/health/ready', async (c) => {
40
+ const dependencies: Record<string, string> = {};
41
+ let allReady = true;
42
+
43
+ // Add dependency checks here (database, cache, etc.)
44
+ // Mark allReady = false if any dependency is unhealthy
45
+
46
+ const status = allReady ? 'ready' : 'not_ready';
47
+ return c.json({ status, dependencies }, allReady ? 200 : 503);
48
+ });
49
+
50
+ ${drizzleRoute}app.get('/', (c) => {
51
+ return c.json({
52
+ service: '${name}',
53
+ version: '1.0.0',
54
+ endpoints: ['/health', '/health/live', '/health/ready'${drizzle ? ", '/health/db'" : ""}]
55
+ });
56
+ });
57
+
58
+ const port = process.env.PORT || 3000;
59
+ console.log('\\n๐Ÿš€ ${name} running on http://localhost:' + port);
60
+ console.log('๐Ÿ“Š Health check: http://localhost:' + port + '/health\\n');
61
+
62
+ export default {
63
+ port,
64
+ fetch: app.fetch,
65
+ };
66
+ `;
67
+ }
68
+ /**
69
+ * The historical default. Package scripts, tsconfig, Dockerfile, and the vitest smoke test stay in
70
+ * the shared scaffold so omitted-language output is byte-identical to before providers existed.
71
+ */
72
+ export const bunBackendProvider = {
73
+ id: "bun",
74
+ label: "Bun + Hono",
75
+ installHint: "bun install",
76
+ };
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Go has no reload process inside the image, so the dev command is only what a developer would run by
3
+ * hand. Tilt rebuilds the image when a watched file changes (the engine returns no live-update rules).
4
+ */
5
+ export const GO_DEV_COMMAND = "go run .";
6
+ export const goBackendProvider = {
7
+ id: "go",
8
+ label: "Go 1.23 (net/http)",
9
+ devCommand: GO_DEV_COMMAND,
10
+ watch: ["**/*.go", "go.mod", "go.sum"],
11
+ installHint: "go mod tidy # optional: Docker builds the image for you",
12
+ createFiles(name) {
13
+ return [
14
+ {
15
+ filename: "go.mod",
16
+ content: `module ${name}
17
+
18
+ go 1.23
19
+ `,
20
+ description: "Generating go.mod",
21
+ emoji: "๐Ÿ“ฆ",
22
+ },
23
+ {
24
+ filename: "main.go",
25
+ content: `package main
26
+
27
+ import (
28
+ "encoding/json"
29
+ "log"
30
+ "net/http"
31
+ "os"
32
+ )
33
+
34
+ func writeJSON(w http.ResponseWriter, status int, body any) {
35
+ w.Header().Set("Content-Type", "application/json")
36
+ w.WriteHeader(status)
37
+ _ = json.NewEncoder(w).Encode(body)
38
+ }
39
+
40
+ func newMux() *http.ServeMux {
41
+ mux := http.NewServeMux()
42
+
43
+ // Health check endpoint (required by TILT_RESOURCE_DEFAULTS.star)
44
+ mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) {
45
+ writeJSON(w, http.StatusOK, map[string]string{"status": "ok", "service": "${name}"})
46
+ })
47
+
48
+ mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) {
49
+ writeJSON(w, http.StatusOK, map[string]any{
50
+ "service": "${name}",
51
+ "version": "1.0.0",
52
+ "endpoints": []string{"/health"},
53
+ })
54
+ })
55
+
56
+ return mux
57
+ }
58
+
59
+ func main() {
60
+ port := os.Getenv("PORT")
61
+ if port == "" {
62
+ port = "3000"
63
+ }
64
+
65
+ // ":" + port listens on every interface, which Traefik needs inside the container network.
66
+ log.Printf("${name} listening on :%s", port)
67
+ log.Fatal(http.ListenAndServe(":"+port, newMux()))
68
+ }
69
+ `,
70
+ description: "Generating backend source",
71
+ emoji: "๐Ÿ’ป",
72
+ },
73
+ {
74
+ filename: "main_test.go",
75
+ content: `package main
76
+
77
+ import (
78
+ "encoding/json"
79
+ "net/http"
80
+ "net/http/httptest"
81
+ "testing"
82
+ )
83
+
84
+ func TestHealth(t *testing.T) {
85
+ rec := httptest.NewRecorder()
86
+ newMux().ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/health", nil))
87
+
88
+ if rec.Code != http.StatusOK {
89
+ t.Fatalf("GET /health = %d, want %d", rec.Code, http.StatusOK)
90
+ }
91
+ }
92
+
93
+ func TestRoot(t *testing.T) {
94
+ rec := httptest.NewRecorder()
95
+ newMux().ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/", nil))
96
+
97
+ if rec.Code != http.StatusOK {
98
+ t.Fatalf("GET / = %d, want %d", rec.Code, http.StatusOK)
99
+ }
100
+ if got := rec.Header().Get("Content-Type"); got != "application/json" {
101
+ t.Fatalf("GET / Content-Type = %q, want %q", got, "application/json")
102
+ }
103
+
104
+ var body map[string]any
105
+ if err := json.NewDecoder(rec.Body).Decode(&body); err != nil {
106
+ t.Fatalf("GET / body is not JSON: %v", err)
107
+ }
108
+ if body["service"] != "${name}" {
109
+ t.Errorf("service = %v, want %q", body["service"], "${name}")
110
+ }
111
+ if body["version"] != "1.0.0" {
112
+ t.Errorf("version = %v, want %q", body["version"], "1.0.0")
113
+ }
114
+ endpoints, ok := body["endpoints"].([]any)
115
+ if !ok || len(endpoints) != 1 || endpoints[0] != "/health" {
116
+ t.Errorf("endpoints = %v, want [/health]", body["endpoints"])
117
+ }
118
+ }
119
+ `,
120
+ description: "Generating smoke test",
121
+ emoji: "๐Ÿงช",
122
+ },
123
+ ];
124
+ },
125
+ };