@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,211 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🐳 PLATFORM DOCKER CONSTANTS
5
+ # =============================================================================
6
+ # Centralized configuration constants for Docker Compose generation.
7
+ # All DATABASE_URL formats, project names, runtime versions, and other
8
+ # shared constants are defined here to ensure consistency across the topology.
9
+ # =============================================================================
10
+
11
+ # Load project name from project.json (makes Flisk CLI portable across projects)
12
+ # Falls back to 'tdk_project' / 'tdk-project' if project.json not found
13
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
14
+ def _load_project_names():
15
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
16
+ project_json_path = '.tdk/project.json'
17
+ if project_root:
18
+ project_json_path = project_root + '/' + project_json_path
19
+
20
+ if os.path.exists(project_json_path):
21
+ _project_json = read_json(project_json_path)
22
+ _PROJECT_NAME_HYPHEN = _project_json.get('project', {}).get('name', 'tdk-project')
23
+ # Convert hyphenated name to underscore (e.g., "my-project" -> "my_project")
24
+ _PROJECT_NAME = _PROJECT_NAME_HYPHEN.replace('-', '_')
25
+ return _PROJECT_NAME, _PROJECT_NAME_HYPHEN
26
+ return "tdk_project", "tdk-project"
27
+
28
+ _PROJECT_NAME, _PROJECT_NAME_HYPHEN = _load_project_names()
29
+
30
+ # Project name constants
31
+ PROJECT_NAME = _PROJECT_NAME
32
+ PROJECT_NAME_HYPHEN = _PROJECT_NAME_HYPHEN
33
+
34
+ # Domain constants
35
+ LOCAL_DOMAIN = PROJECT_NAME_HYPHEN + ".localhost"
36
+ APP_SUBDOMAIN_PREFIX = "app"
37
+ API_SUBDOMAIN_PREFIX = "api"
38
+ APP_LOCAL_DOMAIN = APP_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
39
+ API_LOCAL_DOMAIN = API_SUBDOMAIN_PREFIX + "." + LOCAL_DOMAIN
40
+ EMAIL_DOMAIN = PROJECT_NAME_HYPHEN + ".local"
41
+
42
+ # Published resource-config JSON Schema, same for every project (not project-specific like EMAIL_DOMAIN)
43
+ RESOURCE_SCHEMA_URL = "https://tdk-landscape.github.io/schema.service.json"
44
+
45
+ # NPM scope constant
46
+ NPM_SCOPE = "@" + PROJECT_NAME_HYPHEN + "/"
47
+
48
+ # Bun runtime constants
49
+ BUN_VERSION = "1.3.11"
50
+ BUN_IMAGE = "oven/bun:" + BUN_VERSION + "-alpine"
51
+
52
+ # Database connection constants
53
+ DB_USER = PROJECT_NAME
54
+ DB_HOST = PROJECT_NAME + "_postgres"
55
+ DB_PORT = "5432"
56
+ # ⚠️ SECURITY: No default password - must be provided via DB_PASSWORD env var
57
+ DB_PASSWORD_SHELL = "${DB_PASSWORD}" # Requires DB_PASSWORD to be set
58
+ DB_SCHEMA = "public"
59
+
60
+ # Network names
61
+ NETWORK_TRAEFIK_PUBLIC = PROJECT_NAME + "_traefik-public"
62
+ NETWORK_BACKEND = PROJECT_NAME + "_backend"
63
+ NETWORK_DATABASE = PROJECT_NAME + "_database"
64
+ NETWORK_INFISICAL = PROJECT_NAME + "_infisical-network"
65
+ NETWORK_PROXY = PROJECT_NAME + "_proxy"
66
+
67
+ # Traefik file-provider dynamic config: one generated YAML per `sablier.deferStart`
68
+ # resource's static route (see openspec/changes/prioritized-cold-start), mounted
69
+ # read-only into the standalone Traefik container at /etc/traefik/dynamic.
70
+ TRAEFIK_DYNAMIC_DIR_REL = ".tdk/.tdk-out/traefik-dynamic"
71
+ TRAEFIK_WAKE_GATEWAY_CONTAINER = PROJECT_NAME_HYPHEN + "-wake-gateway"
72
+ TRAEFIK_WAKE_GATEWAY_PORT = 9999
73
+
74
+ # NATS constants
75
+ NATS_HOST = PROJECT_NAME + "_nats"
76
+ NATS_PORT = "4222"
77
+ NATS_URL = "nats://" + NATS_HOST + ":" + NATS_PORT
78
+
79
+ # Verdaccio constants
80
+ VERDACCIO_PORT = 4873
81
+ VERDACCIO_HOST = "localhost"
82
+ VERDACCIO_HOST_DOCKER = "host.docker.internal"
83
+ VERDACCIO_CONTAINER_NAME = PROJECT_NAME_HYPHEN + "-verdaccio"
84
+ VERDACCIO_URL_LOCAL = "http://" + VERDACCIO_HOST + ":" + str(VERDACCIO_PORT)
85
+ VERDACCIO_URL_DOCKER = "http://" + VERDACCIO_HOST_DOCKER + ":" + str(VERDACCIO_PORT)
86
+ VERDACCIO_NETWORK = PROJECT_NAME + "_verdaccio-network"
87
+ VERDACCIO_NPM_REGISTRY = "https://registry.npmjs.org/"
88
+ # Resource and service names
89
+ VERDACCIO_RESOURCE_NAME = "verdaccio"
90
+ VERDACCIO_CONNECT_NETWORK_RESOURCE = "verdaccio-connect-network"
91
+ VERDACCIO_DOMAIN = "verdaccio"
92
+ VERDACCIO_TRAEFIK_HOST = "verdaccio.localhost"
93
+
94
+ # Docker names for one stack's generated services. Every name carries the Flisk
95
+ # project, so two projects that both have a stack called `people` (two Tilt
96
+ # instances on one Docker daemon) never share a Compose project, container or
97
+ # image. Without it, the second `flisk up` runs `--remove-orphans` against the
98
+ # first project's containers and overwrites its images.
99
+ def compose_project_name(stack):
100
+ """Compose project for a stack: <project>-<stack>-autogenerated (e.g. tdk-erp-system-analytics-autogenerated)."""
101
+ return PROJECT_NAME_HYPHEN + "-" + stack + "-autogenerated"
102
+
103
+ def app_image_name(stack, res_name):
104
+ """Image tag (:dev) of one service: <project>_<stack>_<resource>:dev."""
105
+ return PROJECT_NAME + "_" + stack + "_" + res_name + ":dev"
106
+
107
+ def infra_compose_project_name(infra):
108
+ """Compose project for a shared platform stack: <project>-<infra> (e.g. tdk-erp-system-database-management)."""
109
+ return PROJECT_NAME_HYPHEN + "-" + infra
110
+
111
+ def migrator_image_name(stack):
112
+ """Image tag (:dev) of a stack's migrator: <project>_<stack>-db-migrator:dev."""
113
+ return PROJECT_NAME + "_" + stack + "-db-migrator:dev"
114
+
115
+ # Helper function to generate database name
116
+ def get_db_name(domain_or_service):
117
+ """Returns standardized database name for a domain or service."""
118
+ return PROJECT_NAME + "_" + domain_or_service.replace("-", "_")
119
+
120
+ # Base JDBC URL format (without database name)
121
+ def get_database_url_base():
122
+ """Returns base DATABASE_URL format without database name."""
123
+ return "postgresql://" + DB_USER + ":" + DB_PASSWORD_SHELL + "@" + DB_HOST + ":" + DB_PORT + "/"
124
+
125
+ # Complete DATABASE_URL with database name (for .env files)
126
+ def get_database_url_for_env(db_name):
127
+ """Returns DATABASE_URL format for .env files (shell syntax preserved)."""
128
+ return get_database_url_base() + db_name + "?schema=" + DB_SCHEMA
129
+
130
+ # Complete DATABASE_URL with database name (for shell scripts)
131
+ def get_database_url_for_shell(db_name):
132
+ """Returns DATABASE_URL format for shell scripts."""
133
+ return "postgresql://" + DB_USER + ":$DB_PASSWORD@" + DB_HOST + ":" + DB_PORT + "/" + db_name + "?schema=" + DB_SCHEMA
134
+
135
+ # Docker Compose environment variable format with fallback
136
+ def get_compose_env_database_url(db_name):
137
+ """Returns Docker Compose environment variable format with fallback."""
138
+ base_url = get_database_url_for_env(db_name)
139
+ return "${{DATABASE_URL:-" + base_url + "}}"
140
+
141
+ # Tilt resource DATABASE_URL format (for Starlark .format() with host/port placeholders)
142
+ def get_tilt_database_url_template():
143
+ """Returns DATABASE_URL template with {host} and {port} placeholders for .format()."""
144
+ # ⚠️ SECURITY: No default password - DB_PASSWORD must be set
145
+ return "postgresql://" + PROJECT_NAME + ":${DB_PASSWORD}@{host}:{port}/{db}?schema=public"
146
+
147
+ # Database config entry for config.star
148
+ DB_CONFIG = {
149
+ "host": DB_HOST,
150
+ "port": int(DB_PORT),
151
+ "user": DB_USER,
152
+ "password": DB_PASSWORD_SHELL,
153
+ "name_prefix": PROJECT_NAME + "_",
154
+ }
155
+
156
+ PlatformDockerConstants = struct(
157
+ PROJECT_NAME = PROJECT_NAME,
158
+ PROJECT_NAME_HYPHEN = PROJECT_NAME_HYPHEN,
159
+ LOCAL_DOMAIN = LOCAL_DOMAIN,
160
+ APP_SUBDOMAIN_PREFIX = APP_SUBDOMAIN_PREFIX,
161
+ API_SUBDOMAIN_PREFIX = API_SUBDOMAIN_PREFIX,
162
+ APP_LOCAL_DOMAIN = APP_LOCAL_DOMAIN,
163
+ API_LOCAL_DOMAIN = API_LOCAL_DOMAIN,
164
+ EMAIL_DOMAIN = EMAIL_DOMAIN,
165
+ RESOURCE_SCHEMA_URL = RESOURCE_SCHEMA_URL,
166
+ NPM_SCOPE = NPM_SCOPE,
167
+ BUN_VERSION = BUN_VERSION,
168
+ BUN_IMAGE = BUN_IMAGE,
169
+ DB_USER = DB_USER,
170
+ DB_HOST = DB_HOST,
171
+ DB_PORT = DB_PORT,
172
+ DB_PASSWORD_SHELL = DB_PASSWORD_SHELL,
173
+ DB_SCHEMA = DB_SCHEMA,
174
+ NETWORK_TRAEFIK_PUBLIC = NETWORK_TRAEFIK_PUBLIC,
175
+ NETWORK_BACKEND = NETWORK_BACKEND,
176
+ NETWORK_DATABASE = NETWORK_DATABASE,
177
+ NETWORK_INFISICAL = NETWORK_INFISICAL,
178
+ NETWORK_PROXY = NETWORK_PROXY,
179
+ TRAEFIK_DYNAMIC_DIR_REL = TRAEFIK_DYNAMIC_DIR_REL,
180
+ TRAEFIK_WAKE_GATEWAY_CONTAINER = TRAEFIK_WAKE_GATEWAY_CONTAINER,
181
+ TRAEFIK_WAKE_GATEWAY_PORT = TRAEFIK_WAKE_GATEWAY_PORT,
182
+ NATS_HOST = NATS_HOST,
183
+ NATS_PORT = NATS_PORT,
184
+ NATS_URL = NATS_URL,
185
+ # Verdaccio constants
186
+ VERDACCIO_PORT = VERDACCIO_PORT,
187
+ VERDACCIO_HOST = VERDACCIO_HOST,
188
+ VERDACCIO_HOST_DOCKER = VERDACCIO_HOST_DOCKER,
189
+ VERDACCIO_CONTAINER_NAME = VERDACCIO_CONTAINER_NAME,
190
+ VERDACCIO_URL_LOCAL = VERDACCIO_URL_LOCAL,
191
+ VERDACCIO_URL_DOCKER = VERDACCIO_URL_DOCKER,
192
+ VERDACCIO_NETWORK = VERDACCIO_NETWORK,
193
+ VERDACCIO_NPM_REGISTRY = VERDACCIO_NPM_REGISTRY,
194
+ VERDACCIO_RESOURCE_NAME = VERDACCIO_RESOURCE_NAME,
195
+ VERDACCIO_CONNECT_NETWORK_RESOURCE = VERDACCIO_CONNECT_NETWORK_RESOURCE,
196
+ VERDACCIO_DOMAIN = VERDACCIO_DOMAIN,
197
+ VERDACCIO_TRAEFIK_HOST = VERDACCIO_TRAEFIK_HOST,
198
+ DB_CONFIG = DB_CONFIG,
199
+ get_db_name = get_db_name,
200
+ compose_project_name = compose_project_name,
201
+ infra_compose_project_name = infra_compose_project_name,
202
+ app_image_name = app_image_name,
203
+ migrator_image_name = migrator_image_name,
204
+ get_database_url_base = get_database_url_base,
205
+ get_database_url_for_env = get_database_url_for_env,
206
+ get_database_url_for_shell = get_database_url_for_shell,
207
+ get_compose_env_database_url = get_compose_env_database_url,
208
+ get_tilt_database_url_template = get_tilt_database_url_template,
209
+ )
210
+
211
+ CONSTANTS = {}
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # Dockerfile generation exports
4
+ # === INLINED CONSTANTS for pure extension loading ===
5
+ BASE_PORT_FRONTEND = 3000
6
+ BASE_PORT_BACKEND = 4000
7
+ # === END INLINED CONSTANTS ===
8
+
9
+
10
+ load('../generators/golden_docker_generator_v2.star', 'L4_generate_orchestrator')
11
+
12
+
13
+ def generate_frontend_dockerfile(res_path, resource_name, port=BASE_PORT_FRONTEND, target_path='/app/dist', build_cmd='bun run build', cmd='bun run start', use_nginx=False, use_infisical=False, use_shared_libs=True, use_prisma=False, use_golden=True, manifest=None):
14
+ """Generate Dockerfile for frontend services."""
15
+ return L4_generate_orchestrator(
16
+ res_path=res_path,
17
+ res_type='frontend',
18
+ resource_name=resource_name,
19
+ use_nginx=use_nginx,
20
+ port=port,
21
+ target_path=target_path,
22
+ build_cmd=build_cmd,
23
+ cmd=cmd,
24
+ use_infisical=use_infisical,
25
+ use_shared_libs=use_shared_libs,
26
+ use_prisma=use_prisma,
27
+ use_golden=use_golden,
28
+ manifest=manifest,
29
+ )
30
+
31
+ def generate_app_dockerfile(res_path, resource_name, port=BASE_PORT_BACKEND, build_cmd='bun run build', cmd='bun run start', use_infisical=False, use_shared_libs=True, use_prisma=True, use_golden=True, manifest=None):
32
+ """Generate Dockerfile for backend/app services."""
33
+ return L4_generate_orchestrator(
34
+ res_path=res_path,
35
+ res_type='backend',
36
+ resource_name=resource_name,
37
+ port=port,
38
+ build_cmd=build_cmd,
39
+ cmd=cmd,
40
+ use_infisical=use_infisical,
41
+ use_shared_libs=use_shared_libs,
42
+ use_prisma=use_prisma,
43
+ use_golden=use_golden,
44
+ manifest=manifest,
45
+ )
46
+
47
+ def generate_migrator_dockerfile(res_path, resource_name, use_infisical=False, use_golden=True, manifest=None):
48
+ """Generate Dockerfile for database migrator services."""
49
+ return L4_generate_orchestrator(
50
+ res_path=res_path,
51
+ res_type='migrator',
52
+ resource_name=resource_name,
53
+ use_infisical=use_infisical,
54
+ use_golden=use_golden,
55
+ manifest=manifest,
56
+ )
@@ -0,0 +1,264 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # Dockerfiles for backends whose `language` is not the Bun default.
4
+ #
5
+ # Bun backends use the golden-image generator. Python backends are a small
6
+ # standalone image: language-specific base image and reload command, while the build
7
+ # context (project root), `production` target, health check, and PORT contract stay the
8
+ # same as every other backend.
9
+
10
+ BASE_PORT_BACKEND = 4000
11
+
12
+ # Languages whose runtime files are owned by the provider (no Vite/tsconfig/Bun config).
13
+ PROVIDER_OWNED_LANGUAGES = ["python", "go", "rust", "node"]
14
+
15
+ # Files a provider-owned language must scaffold; checked before generating anything.
16
+ LANGUAGE_REQUIRED_FILES = {
17
+ "python": ["pyproject.toml", "src/main.py"],
18
+ "go": ["go.mod", "main.go"],
19
+ "rust": ["Cargo.toml", "src/main.rs"],
20
+ "node": ["package.json", "src/index.js"],
21
+ }
22
+
23
+ _CURL = """RUN apt-get update && apt-get install -y --no-install-recommends curl \\
24
+ && rm -rf /var/lib/apt/lists/*
25
+ """
26
+
27
+ _HEALTHCHECK = """HEALTHCHECK --interval=10s --timeout=5s --retries=3 \\
28
+ CMD curl -f http://localhost:${{PORT:-{port}}}/health || exit 1
29
+ """
30
+
31
+ _PYTHON = """# Generated by Flisk for a Python backend. Do not edit; change service.json instead.
32
+ FROM python:3.12-slim@sha256:05cda9777409a9c3ffddd94a4c476b79f0769a0b4857f0c7ed9226b6800b0d6f AS base
33
+
34
+ WORKDIR /app/{res_path}
35
+
36
+ {curl}
37
+ COPY {res_path}/pyproject.toml ./
38
+ # Wheel then install the wheel only. Scorecard treats a pip install of a
39
+ # .whl as hash-pinned; `pip install .` is not.
40
+ RUN python -m pip wheel --no-cache-dir --wheel-dir /tmp/wheels .
41
+ RUN pip install --no-cache-dir /tmp/wheels/*.whl
42
+
43
+ COPY {res_path}/src ./src
44
+
45
+ FROM base AS test
46
+ RUN python -m pip wheel --no-cache-dir --wheel-dir /tmp/wheels-dev ".[dev]"
47
+ RUN pip install --no-cache-dir /tmp/wheels-dev/*.whl
48
+ COPY {res_path}/tests ./tests
49
+ RUN pytest
50
+
51
+ FROM base AS production
52
+
53
+ {healthcheck}
54
+ EXPOSE {port}
55
+
56
+ CMD ["sh", "-c", "uvicorn main:app --app-dir src --host 0.0.0.0 --port ${{PORT:-{port}}} --reload --reload-dir src"]
57
+ """
58
+
59
+ _GO = """# Generated by Flisk for a Go backend. Do not edit; change service.json instead.
60
+ FROM golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db AS build
61
+ # The official image pins GOTOOLCHAIN=local, so a go.mod that needs a newer Go (Gin 1.12 needs 1.25) stops with "requires go >= 1.25".
62
+ # `auto` lets Go fetch the toolchain go.mod asks for; a go.mod at or below the image's Go downloads nothing.
63
+ ENV GOTOOLCHAIN=auto
64
+
65
+ WORKDIR /app/{res_path}
66
+
67
+ COPY {res_path}/go.* ./
68
+ RUN go mod download
69
+
70
+ COPY {res_path}/ ./
71
+ RUN CGO_ENABLED=0 go build -o /out/app .
72
+
73
+ FROM build AS test
74
+ RUN go test ./...
75
+ {go_development}
76
+ FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS production
77
+
78
+ {curl}
79
+ COPY --from=build /out/app /usr/local/bin/app
80
+
81
+ {healthcheck}
82
+ EXPOSE {port}
83
+
84
+ CMD ["app"]
85
+ """
86
+
87
+ _RUST = """# Generated by Flisk for a Rust backend. Do not edit; change service.json instead.
88
+ # BuildKit cache mounts keep the registry and the target directory between builds, so a rebuild after a
89
+ # source change recompiles only the crate itself, not every dependency.
90
+ FROM rust:1-slim-bookworm@sha256:2c3a22f0a5533ea2dd5a16627bc841228151faa2d4de2644ac9987e4a2f1f2fa AS build
91
+
92
+ WORKDIR /app/{res_path}
93
+
94
+ COPY {res_path}/ ./
95
+ RUN --mount=type=cache,target=/usr/local/cargo/registry \\
96
+ --mount=type=cache,target=/app/{res_path}/target \\
97
+ cargo build --release && mkdir -p /out && cp target/release/app /out/app
98
+
99
+ FROM build AS test
100
+ RUN --mount=type=cache,target=/usr/local/cargo/registry \\
101
+ --mount=type=cache,target=/app/{res_path}/target \\
102
+ cargo test
103
+
104
+ FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS production
105
+
106
+ {curl}
107
+ COPY --from=build /out/app /usr/local/bin/app
108
+
109
+ {healthcheck}
110
+ EXPOSE {port}
111
+
112
+ CMD ["app"]
113
+ """
114
+
115
+ _NODE = """# Generated by Flisk for a Node.js backend. Do not edit; change service.json instead.
116
+ FROM node:22-slim@sha256:c3de60bf2f9dd0ac6370e6117950ff62d6e339527e7472301c9c78a017978392 AS base
117
+
118
+ WORKDIR /app/{res_path}
119
+
120
+ {curl}
121
+ COPY {res_path}/package*.json ./
122
+ RUN npm ci --omit=dev
123
+
124
+ COPY {res_path}/src ./src
125
+
126
+ FROM base AS test
127
+ RUN npm ci
128
+ COPY {res_path}/tests ./tests
129
+ RUN npm test
130
+
131
+ FROM base AS production
132
+
133
+ {healthcheck}
134
+ EXPOSE {port}
135
+
136
+ CMD ["node", "src/index.js"]
137
+ """
138
+
139
+ # The watcher the Go development target runs. It compiles a change into a staging binary while the running app keeps serving, and stops
140
+ # and swaps the app only when that build succeeds. Air was tried first and stops the app as soon as it sees a change (engine.go `start`
141
+ # calls stopBin before buildRun), so the service stayed down for the whole compile; a Traefik health check landing in that gap kept the
142
+ # route at 503 for up to 10s. A compile error is printed to the log and the last good build keeps serving.
143
+ # `-s -w` drops debug info, which shortens the link step; delve cannot attach to a binary built this way.
144
+ # `\\n` in find's -printf format is written with a doubled backslash so the shell receives a backslash and an n.
145
+ _GO_DEV_WATCH = """#!/bin/sh
146
+ app=/tmp/app
147
+ next=/tmp/app.next
148
+ pid=
149
+
150
+ # Path, mtime and size of every file a Go build can read. Dot-directories (.git, .autogenerated), tmp/, tests and docs are ignored.
151
+ signature() {
152
+ find . -type f -not -path '*/.*' -not -path './tmp/*' -not -name '*_test.go' -not -name '*.md' -printf '%p %T@ %s\\n' | sort | cksum
153
+ }
154
+
155
+ # The app runs in its own session so a signal reaches everything it forked and no child keeps the listen socket.
156
+ start_app() {
157
+ setsid "$app" &
158
+ pid=$!
159
+ }
160
+
161
+ # Succeeds only when the app is really gone; a swap on top of a live process would fail (ETXTBSY) or hit address-in-use.
162
+ stop_app() {
163
+ [ -n "$pid" ] || return 0
164
+ kill -TERM -- "-$pid" 2>/dev/null || kill "$pid" 2>/dev/null
165
+ waited=0
166
+ while kill -0 "$pid" 2>/dev/null && [ "$waited" -lt 50 ]; do
167
+ sleep 0.1
168
+ waited=$((waited + 1))
169
+ done
170
+ kill -KILL -- "-$pid" 2>/dev/null || kill -9 "$pid" 2>/dev/null
171
+ wait "$pid" 2>/dev/null
172
+ if kill -0 "$pid" 2>/dev/null; then
173
+ return 1
174
+ fi
175
+ pid=
176
+ }
177
+
178
+ trap 'stop_app; exit 0' TERM INT
179
+
180
+ last=$(signature)
181
+ echo "[flisk] watching for Go changes; the running app keeps serving while a rebuild compiles"
182
+ start_app
183
+
184
+ while true; do
185
+ sleep 0.2 &
186
+ wait $!
187
+ if [ -n "$pid" ] && ! kill -0 "$pid" 2>/dev/null; then
188
+ wait "$pid"
189
+ echo "[flisk] the app exited with status $?; waiting for a change to rebuild"
190
+ pid=
191
+ fi
192
+ now=$(signature)
193
+ [ "$now" = "$last" ] && continue
194
+ last=$now
195
+ echo "[flisk] change detected, rebuilding..."
196
+ if go build -ldflags='-s -w' -o "$next" . ; then
197
+ if stop_app && mv "$next" "$app"; then
198
+ start_app
199
+ echo "[flisk] rebuilt and restarted"
200
+ else
201
+ echo "[flisk] could not stop the running app or install the new build; save again to retry"
202
+ last=
203
+ fi
204
+ else
205
+ echo "[flisk] build failed; the last good build keeps running. Fix the error and save again."
206
+ fi
207
+ done
208
+ """
209
+
210
+ # Opt-in Go development target (`dev.liveReload`): the toolchain image plus the watcher above, which rebuilds and restarts the app when a
211
+ # source file changes. Dependencies are downloaded in their own layer and the module download is its own image layer, so an ordinary
212
+ # source edit recompiles incrementally. `go.mod`, `go.sum` and the Dockerfile still rebuild the image. The heredoc needs BuildKit's
213
+ # Dockerfile frontend 1.4 (Docker Engine 23+).
214
+ _GO_DEVELOPMENT = """
215
+ FROM golang:1.23-bookworm@sha256:167053a2bb901972bf2c1611f8f52c44d5fe7e762e5cab213708d82c421614db AS development
216
+ ENV GOTOOLCHAIN=auto
217
+ WORKDIR /app/{res_path}
218
+ COPY {res_path}/go.* ./
219
+ # A plain RUN (not a cache mount) keeps the modules in a layer keyed on go.mod and go.sum, so the priming build below reuses them.
220
+ RUN go mod download
221
+ COPY {res_path}/ ./
222
+ ENV GOFLAGS=-buildvcs=false CGO_ENABLED=0
223
+ # Prime the build cache inside the image (a cache mount would not be kept), so the first edit recompiles only what changed.
224
+ # Same flags as the watcher's builds (and CGO off like the production stage), so the primed binary and cache match every later one.
225
+ RUN go build -ldflags='-s -w' -o /tmp/app .
226
+ COPY --chmod=755 <<'FLISK_GO_DEV_WATCH' /usr/local/bin/flisk-go-watch
227
+ {watch_script}
228
+ FLISK_GO_DEV_WATCH
229
+ EXPOSE {port}
230
+ CMD ["flisk-go-watch"]
231
+ """
232
+
233
+ def generate_language_dockerfile(res_path, language, port = BASE_PORT_BACKEND, dev = False):
234
+ """Dockerfile text for a provider-owned backend language, or fail for an unknown one."""
235
+ template = {"python": _PYTHON, "go": _GO, "rust": _RUST, "node": _NODE}.get(language)
236
+ if template == None:
237
+ fail("No Dockerfile generator for backend language '{}'".format(language))
238
+ go_development = ""
239
+ if dev and language == "go":
240
+ go_development = _GO_DEVELOPMENT.format(res_path = res_path, port = port, watch_script = _GO_DEV_WATCH.rstrip("\n"))
241
+ return template.format(
242
+ res_path = res_path,
243
+ port = port,
244
+ go_development = go_development,
245
+ curl = _CURL,
246
+ healthcheck = _HEALTHCHECK.format(port = port),
247
+ )
248
+
249
+
250
+ def is_provider_owned_language(manifest):
251
+ """True when the manifest selects a provider-owned language (a missing language means Bun)."""
252
+ if not manifest:
253
+ return False
254
+ return manifest.get("appType", "backend") == "backend" and manifest.get("language", "bun") in PROVIDER_OWNED_LANGUAGES
255
+
256
+
257
+ def go_live_reload_enabled(manifest):
258
+ """True for a Go service that opted in with `dev.liveReload: true` (see _GO_DEVELOPMENT); anything else stays off."""
259
+ if not manifest or manifest.get("language", "bun") != "go":
260
+ return False
261
+ dev = manifest.get("dev")
262
+ if type(dev) != "dict":
263
+ return False
264
+ return dev.get("liveReload") == True
@@ -0,0 +1,76 @@
1
+ # === INLINED CONSTANTS for pure extension loading ===
2
+ OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
3
+ # === END INLINED CONSTANTS ===
4
+
5
+
6
+ BUN_BASE = "oven/bun:1.3.11-alpine"
7
+ ALPINE_BASE = "alpine:3.22"
8
+
9
+
10
+ load('../../../tilt/common/utils.star', 'Utils')
11
+ load('../../../tilt/manifest/constants.star', 'GENERATED_CONFIG_FILENAMES')
12
+
13
+ # Load layer generators from dedicated modules
14
+ load('../layers/l1_base_layers.star', 'L1_generate_os_base', 'L1_generate_runtime_env')
15
+ load('../layers/l2_dependency_layers.star', 'L2_generate_dependency_manifest')
16
+ load('../layers/l3_builder_layers.star',
17
+ 'L3_generate_backend_compiler',
18
+ 'L3_generate_frontend_builder',
19
+ 'L3_generate_production_purger'
20
+ )
21
+ load('../layers/prisma/prisma_build.star', 'L3_generate_migration_engine')
22
+ load('../layers/prisma/prisma_runtime.star', 'L4_generate_migrator_runtime')
23
+ load('../layers/l4_runtime_layers.star',
24
+ 'L4_generate_backend_runtime',
25
+ 'L4_generate_frontend_runtime',
26
+ )
27
+
28
+ def L4_generate_orchestrator(res_path, res_type = 'backend', resource_name = 'service', use_nginx = False, port = 3000, target_path = '/app/dist', build_cmd = 'bun run build', cmd = 'bun run start', use_infisical = False, use_shared_libs = True, use_prisma = True, use_golden = True, manifest = None):
29
+ parts = []
30
+ migrator_name_match = (
31
+ resource_name == 'migrator'
32
+ or resource_name.endswith('-migrator')
33
+ or resource_name.endswith('-db-migrator')
34
+ )
35
+ prisma_config_exists = use_prisma and read_file(res_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['prisma'], default='') != ''
36
+ parts.append(L1_generate_os_base(use_golden=use_golden))
37
+ parts.append(L1_generate_runtime_env(None))
38
+ parts.append(L2_generate_dependency_manifest(res_path, use_golden=use_golden))
39
+
40
+ if res_type == 'migrator' or (res_type == 'backend' and migrator_name_match):
41
+ # For migrators, skip backend_compiler and production_purger.
42
+ # Keep migration_engine only.
43
+ parts.append(L3_generate_migration_engine(res_path, use_golden=use_golden))
44
+ elif res_type == 'frontend':
45
+ parts.append(L3_generate_frontend_builder(res_path, build_cmd, use_infisical, use_shared_libs, use_golden=use_golden))
46
+ else:
47
+ parts.append(L3_generate_backend_compiler(res_path, build_cmd, use_prisma, use_shared_libs, use_infisical, use_golden=use_golden, has_prisma_config=prisma_config_exists))
48
+ # Backend runtime needs production-purged deps. Prisma migration stage
49
+ # is only required when Prisma is enabled for this resource.
50
+ if use_prisma:
51
+ parts.append(L3_generate_migration_engine(res_path, use_golden=use_golden))
52
+ parts.append(L3_generate_production_purger(res_path))
53
+
54
+ if res_type == 'frontend':
55
+ parts.append(L4_generate_frontend_runtime(res_path, target_path, use_nginx, use_golden=use_golden, port=port))
56
+ elif res_type == 'migrator' or (res_type == 'backend' and migrator_name_match):
57
+ parts.append(L4_generate_migrator_runtime(res_path, resource_name, use_golden=use_golden))
58
+ else:
59
+ parts.append(
60
+ L4_generate_backend_runtime(
61
+ res_path,
62
+ port,
63
+ cmd,
64
+ use_infisical,
65
+ resource_name,
66
+ use_golden=use_golden,
67
+ use_prisma=use_prisma,
68
+ has_prisma_config=prisma_config_exists,
69
+ manifest=manifest,
70
+ ),
71
+ )
72
+ dockerfile = "\n\n".join(parts)
73
+ footer = Utils.get_template_header("dockerfile", "golden_docker_generator_v2.L4_generate_orchestrator", resource_name, "Use docker_build(dockerfile_contents=...) in Tiltfile")
74
+ # Heredocs (RUN cat > ... << 'EOF') need the BuildKit frontend; without this line an older builder
75
+ # reads the heredoc body as instructions ("unknown instruction: export").
76
+ return "# syntax=docker/dockerfile:1\n" + dockerfile + "\n\n" + footer
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ load(
4
+ "./dockerfile/dockerfile.star",
5
+ "generate_frontend_dockerfile",
6
+ "generate_app_dockerfile",
7
+ "generate_migrator_dockerfile",
8
+ )
9
+ load(
10
+ "./dockerfile/language_dockerfile.star",
11
+ "generate_language_dockerfile",
12
+ "is_provider_owned_language",
13
+ "go_live_reload_enabled",
14
+ "LANGUAGE_REQUIRED_FILES",
15
+ )
16
+ load("./config/dockerignore.star", "generate_dockerignore")
17
+ load(
18
+ "./compose/compose.star",
19
+ "generate_frontend_compose",
20
+ "generate_backend_compose_entry",
21
+ "generate_app_compose_from_entries",
22
+ "generate_migrator_compose",
23
+ )
24
+ load("./build/golden_image.star", "GoldenImage")
25
+
26
+ Docker = struct(
27
+ frontend = generate_frontend_dockerfile,
28
+ backend = generate_app_dockerfile,
29
+ migrator = generate_migrator_dockerfile,
30
+ backend_language = generate_language_dockerfile,
31
+ is_provider_owned_language = is_provider_owned_language,
32
+ go_live_reload = go_live_reload_enabled,
33
+ language_required_files = LANGUAGE_REQUIRED_FILES,
34
+ generate_dockerignore = generate_dockerignore,
35
+ frontend_compose = generate_frontend_compose,
36
+ backend_compose = generate_backend_compose_entry,
37
+ app_compose = generate_app_compose_from_entries,
38
+ migrator_compose = generate_migrator_compose,
39
+ golden_image = GoldenImage,
40
+ )
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ """
4
+ Bun Helper Functions
5
+ """
6
+
7
+ def bun_hoisted_packages_symlink_fix():
8
+ """
9
+ Fix all Bun-hoisted package symlinks in node_modules.
10
+
11
+ When packages are installed with Bun's isolated store, they may be symlinked
12
+ from node_modules to .bun/. These symlinks break when copied to Docker.
13
+ This function recreates the necessary symlinks for runtime resolution.
14
+
15
+ Handles:
16
+ - Regular packages with nested node_modules (e.g., hono)
17
+ - Scoped packages (@hono/*, @prisma/*)
18
+ """
19
+ return (
20
+ "# Fix Bun hoisted package symlinks that break when copied to Docker\n"
21
+ + "USER root\n"
22
+ + "COPY shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
23
+ + "RUN chmod +x /usr/local/bin/bun-hoisted-symlink-fix.sh && /usr/local/bin/bun-hoisted-symlink-fix.sh\n"
24
+ + "USER bun\n"
25
+ )