@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,65 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - FRONTEND BUILD PLAN
3
+ # =============================================================================
4
+ # Decides how a frontend image runs its production build.
5
+ #
6
+ # A `"build": "tsc --noEmit && vite build"` script (the restaurant example uses it). Running that script
7
+ # inside the image build makes the type-check block the image and compete for
8
+ # CPU with other builds. When the script has exactly that standard shape, the
9
+ # image runs `vite build` directly and the type-check becomes a separate,
10
+ # non-blocking Tilt resource. Any other script runs unchanged.
11
+ # =============================================================================
12
+
13
+ DEFAULT_FRONTEND_BUILD_CMD = 'bun run build'
14
+
15
+ # Only a non-emitting type-check is moved out of the image. A plain `tsc` writes output that the build may
16
+ # use (the CLI scaffold's tsconfig emits to ./dist), so that script keeps running unchanged in the image.
17
+ _TSC_FORMS = ['tsc --noEmit']
18
+ # The generated config is copied into the image; any other config file is not, so a script that selects one is not used.
19
+ _IMAGE_CONFIG_DIR = '.autogenerated/'
20
+ _VITE_BUILD = 'vite build'
21
+
22
+
23
+ def _default_plan():
24
+ return {'build_cmd': DEFAULT_FRONTEND_BUILD_CMD, 'typecheck': False, 'typecheck_cmd': ''}
25
+
26
+
27
+ def frontend_build_plan(package_json_path):
28
+ """Returns {'build_cmd', 'typecheck', 'typecheck_cmd'} for the package.json at package_json_path.
29
+
30
+ build_cmd is the command the image runs; the generated Vite config is appended to it.
31
+ typecheck is True only when the standard `tsc --noEmit && vite build` form was recognised;
32
+ typecheck_cmd is then the host command for the non-blocking type-check resource.
33
+ A missing or unreadable package.json, or any other script, gets the default plan.
34
+ """
35
+ if not os.path.exists(package_json_path):
36
+ return _default_plan()
37
+
38
+ scripts = read_json(package_json_path).get('scripts', {})
39
+ script = scripts.get('build', '').strip()
40
+ steps = script.split(' && ')
41
+ if len(steps) != 2:
42
+ return _default_plan()
43
+
44
+ typecheck_step = steps[0].strip()
45
+ vite_step = steps[1].strip()
46
+ if typecheck_step not in _TSC_FORMS:
47
+ return _default_plan()
48
+ if vite_step != _VITE_BUILD and not vite_step.startswith(_VITE_BUILD + ' '):
49
+ return _default_plan()
50
+
51
+ # Flags after `vite build` are kept. A --config must name the generated config, which the image copies.
52
+ extra_args = vite_step[len(_VITE_BUILD):]
53
+ tokens = extra_args.split()
54
+ for i, token in enumerate(tokens):
55
+ value = ''
56
+ if token == '--config' and i + 1 < len(tokens):
57
+ value = tokens[i + 1]
58
+ elif token.startswith('--config='):
59
+ value = token[len('--config='):]
60
+ else:
61
+ continue
62
+ if not value.startswith(_IMAGE_CONFIG_DIR):
63
+ return _default_plan()
64
+
65
+ return {'build_cmd': 'bunx vite build' + extra_args, 'typecheck': True, 'typecheck_cmd': 'bunx tsc --noEmit'}
@@ -0,0 +1,37 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - GOLDEN LAYERED IMAGES PROVIDER
3
+ # =============================================================================
4
+ # Purpose: Public API facade for golden layered image orchestration.
5
+ # =============================================================================
6
+
7
+ load('./golden_image_constants.star',
8
+ 'GOLDEN_IMAGE_PREFIX',
9
+ 'GOLDEN_LAYERS',
10
+ 'get_layer_reference',
11
+ )
12
+ load('./golden_image_build.star', 'build_golden_layers')
13
+ load('./golden_image_dockerfile.star', 'generate_golden_dockerfile')
14
+
15
+
16
+ GoldenImage = struct(
17
+ # Build functions
18
+ build = build_golden_layers,
19
+
20
+ # Reference getters
21
+ get_layer = get_layer_reference,
22
+ l1 = lambda: get_layer_reference('l1'),
23
+ l2 = lambda: get_layer_reference('l2'),
24
+ l3_backend = lambda: get_layer_reference('l3-backend'),
25
+ l3_frontend = lambda: get_layer_reference('l3-frontend'),
26
+ l3_migrator = lambda: get_layer_reference('l3-migrator'),
27
+ l4_backend = lambda: get_layer_reference('l4-backend'),
28
+ l4_frontend = lambda: get_layer_reference('l4-frontend'),
29
+ l4_migrator = lambda: get_layer_reference('l4-migrator'),
30
+
31
+ # Constants
32
+ layers = GOLDEN_LAYERS,
33
+ prefix = GOLDEN_IMAGE_PREFIX,
34
+
35
+ # Generators
36
+ generate_dockerfile = generate_golden_dockerfile,
37
+ )
@@ -0,0 +1,144 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - GOLDEN IMAGE BUILDERS
3
+ # =============================================================================
4
+
5
+ load('./golden_image_constants.star', 'GOLDEN_DOCKERFILE', 'GOLDEN_IMAGE_PREFIX', 'GOLDEN_LAYERS', 'LEGACY_GOLDEN_IMAGES')
6
+
7
+ # Label that records which golden Dockerfile an image was built from.
8
+ GOLDEN_HASH_LABEL = 'tdk.golden.hash'
9
+
10
+ # Shell template for the golden build. Placeholders (@@...@@) are replaced in
11
+ # build_golden_layers(); plain `$VAR` references are expanded by the shell.
12
+ _GOLDEN_BUILD_TEMPLATE = '''
13
+ DF_REL=@@DF_REL@@
14
+ ROOT_REL=@@ROOT_REL@@
15
+ DF="$(cd "$(dirname "$DF_REL")" && pwd)/$(basename "$DF_REL")"
16
+ ROOT="$(cd "$ROOT_REL" && pwd)"
17
+ HASH="$(cat "$DF" | (sha256sum 2>/dev/null || shasum -a 256) | cut -c1-64)"
18
+ IMAGES="@@IMAGES@@"
19
+
20
+ if [ -z "$TDK_GOLDEN_REBUILD" ]; then
21
+ fresh=1
22
+ for img in $IMAGES; do
23
+ [ "$(docker image inspect -f '{{index .Config.Labels "@@HASH_LABEL@@"}}' "$img" 2>/dev/null)" = "$HASH" ] || fresh=0
24
+ done
25
+ if [ "$fresh" = 1 ]; then
26
+ echo "✅ Golden images are up to date (hash $HASH) - skipping build"
27
+ exit 0
28
+ fi
29
+ fi
30
+
31
+ echo "🏗️ Building golden layered images (@@COUNT@@ total)..."
32
+ if docker buildx version >/dev/null 2>&1; then
33
+ echo " 🧩 Building all golden targets with one docker buildx bake (independent stages run in parallel)"
34
+ cat > golden-layers.bake.hcl <<HCL
35
+ variable "HASH" {
36
+ default = ""
37
+ }
38
+
39
+ group "default" {
40
+ targets = [@@TARGET_NAMES@@]
41
+ }
42
+ @@BAKE_TARGETS@@
43
+ HCL
44
+ # Buildx 0.19 and later ask for read access outside the bake file's directory; older releases do not know the flag.
45
+ BUILDX_VER="$(docker buildx version 2>/dev/null | sed -n 's/.* v\\([0-9]*\\)\\.\\([0-9]*\\).*/\\1 \\2/p')"
46
+ BUILDX_MAJOR="${BUILDX_VER%% *}"
47
+ BUILDX_MINOR="${BUILDX_VER##* }"
48
+ BAKE_ALLOW=""
49
+ if [ "${BUILDX_MAJOR:-0}" -gt 0 ] || [ "${BUILDX_MINOR:-0}" -ge 19 ]; then BAKE_ALLOW="--allow fs.read=$ROOT"; fi
50
+ HASH="$HASH" docker buildx bake $BAKE_ALLOW -f golden-layers.bake.hcl --load
51
+ else
52
+ echo " ⚠️ docker buildx is not available - building golden targets one at a time"
53
+ @@SERIAL_BUILDS@@
54
+ fi
55
+
56
+ # Untag golden images that older engines built and nothing uses now; an image still in use is left alone.
57
+ for img in @@LEGACY_IMAGES@@; do
58
+ docker image rm "$img" >/dev/null 2>&1 && echo " 🧹 Removed legacy golden image $img"
59
+ done
60
+
61
+ echo "✅ Golden layers built (@@COUNT@@ images):"
62
+ @@SUMMARY@@
63
+ '''
64
+
65
+
66
+ def _sh_quote(text):
67
+ return "'" + text.replace("'", "'\\''") + "'"
68
+
69
+
70
+ def build_golden_layers(project_root='.'):
71
+ """
72
+ Build all golden layer images using local_resource.
73
+ Returns the resource name for dependency tracking.
74
+
75
+ project_root: path back to the project root from wherever
76
+ local_resource cmds actually run (the Tiltfile's own directory,
77
+ .tdk/.tdk-out/ - not the project root), e.g. '../../'. GOLDEN_DOCKERFILE
78
+ is itself project-root-relative, so it must be prefixed with this to
79
+ resolve correctly - passing project_root='.' (the default) only works
80
+ when the Tiltfile happens to live at the project root.
81
+
82
+ The build is skipped when every golden image already exists with a
83
+ `tdk.golden.hash` label matching the current Dockerfile. Set
84
+ TDK_GOLDEN_REBUILD=1 to force a rebuild. Otherwise all targets are built
85
+ with one `docker buildx bake`, falling back to serial `docker build` when
86
+ buildx is not installed.
87
+ """
88
+ resource_name = 'golden-layers-build'
89
+ dockerfile_from_tiltfile = (
90
+ GOLDEN_DOCKERFILE if project_root in (None, '.', '')
91
+ else project_root.rstrip('/') + '/' + GOLDEN_DOCKERFILE
92
+ )
93
+ context = project_root or '.'
94
+
95
+ images = []
96
+ summary = []
97
+ bake_targets = []
98
+ serial_builds = []
99
+ target_names = []
100
+ for key in GOLDEN_LAYERS:
101
+ layer = GOLDEN_LAYERS[key]
102
+ ref = layer['name'] + ':' + layer['tag']
103
+ images.append(ref)
104
+ summary.append('echo " ✓ ' + ref + '"')
105
+ target_names.append('"' + key + '"')
106
+ bake_targets.append('''target "{key}" {{
107
+ dockerfile = "$DF"
108
+ context = "$ROOT"
109
+ target = "{target}"
110
+ tags = ["{ref}"]
111
+ labels = {{
112
+ "{label}" = HASH
113
+ }}
114
+ }}
115
+ '''.format(key=key, target=layer['target'], ref=ref, label=GOLDEN_HASH_LABEL))
116
+ serial_builds.append(
117
+ 'docker build --label "{label}=$HASH" -f "$DF" --target {target} -t {ref} "$ROOT" || exit 1'.format(
118
+ label=GOLDEN_HASH_LABEL, target=layer['target'], ref=ref,
119
+ )
120
+ )
121
+
122
+ cmd = (_GOLDEN_BUILD_TEMPLATE
123
+ .replace('@@DF_REL@@', _sh_quote(dockerfile_from_tiltfile))
124
+ .replace('@@ROOT_REL@@', _sh_quote(context))
125
+ .replace('@@IMAGES@@', ' '.join(images))
126
+ .replace('@@LEGACY_IMAGES@@', ' '.join(LEGACY_GOLDEN_IMAGES))
127
+ .replace('@@HASH_LABEL@@', GOLDEN_HASH_LABEL)
128
+ .replace('@@COUNT@@', str(len(images)))
129
+ .replace('@@TARGET_NAMES@@', ', '.join(target_names))
130
+ .replace('@@BAKE_TARGETS@@', '\n'.join(bake_targets))
131
+ .replace('@@SERIAL_BUILDS@@', '\n '.join(serial_builds))
132
+ .replace('@@SUMMARY@@', '\n'.join(summary))
133
+ )
134
+
135
+ local_resource(
136
+ resource_name,
137
+ cmd=cmd,
138
+ labels=['infra.docker', 'golden-layers'],
139
+ deps=[dockerfile_from_tiltfile],
140
+ allow_parallel=True,
141
+ auto_init=True,
142
+ )
143
+
144
+ return resource_name
@@ -0,0 +1,100 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - GOLDEN IMAGE CONSTANTS
3
+ # =============================================================================
4
+
5
+ # Load project configuration to get the project name as prefix
6
+ # Falls back to 'tdk-project' if project.json is not found
7
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
8
+ def _load_golden_prefix():
9
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
10
+ project_json_path = '.tdk/project.json'
11
+ if project_root:
12
+ project_json_path = project_root + '/' + project_json_path
13
+
14
+ if os.path.exists(project_json_path):
15
+ _project_json = read_json(project_json_path)
16
+ return _project_json.get('project', {}).get('name', 'tdk-project')
17
+ return 'tdk-project'
18
+
19
+ _GOLDEN_IMAGE_PREFIX = _load_golden_prefix()
20
+
21
+ GOLDEN_IMAGE_PREFIX = _GOLDEN_IMAGE_PREFIX
22
+ GOLDEN_DOCKERFILE = '.tdk/.tdk-out/golden-layers.Dockerfile'
23
+
24
+ GOLDEN_LAYERS = {
25
+ 'l1': {
26
+ 'name': GOLDEN_IMAGE_PREFIX + '-l1',
27
+ 'tag': 'latest',
28
+ 'description': 'OS base + runtime environment',
29
+ 'target': 'l1_golden',
30
+ },
31
+ 'l2': {
32
+ 'name': GOLDEN_IMAGE_PREFIX + '-l2',
33
+ 'tag': 'latest',
34
+ 'description': 'Dependencies + node_modules',
35
+ 'target': 'l2_golden',
36
+ },
37
+ 'l3-backend': {
38
+ 'name': GOLDEN_IMAGE_PREFIX + '-l3-backend',
39
+ 'tag': 'latest',
40
+ 'description': 'Backend build tools (Prisma only, Infisical CLI skipped to avoid CDN hangs)',
41
+ 'target': 'l3_backend_golden',
42
+ },
43
+ 'l3-frontend': {
44
+ 'name': GOLDEN_IMAGE_PREFIX + '-l3-frontend',
45
+ 'tag': 'latest',
46
+ 'description': 'Frontend build tools (no Prisma)',
47
+ 'target': 'l3_frontend_golden',
48
+ },
49
+ 'l4-backend': {
50
+ 'name': GOLDEN_IMAGE_PREFIX + '-l4-backend',
51
+ 'tag': 'latest',
52
+ 'description': 'Backend production runtime (Bun, no Infisical CLI)',
53
+ 'target': 'l4_backend_bun',
54
+ },
55
+ 'l4-backend-node': {
56
+ 'name': GOLDEN_IMAGE_PREFIX + '-l4-backend-node',
57
+ 'tag': 'latest',
58
+ 'description': 'Backend production runtime (Node.js - lightweight, no Infisical CLI)',
59
+ 'target': 'l4_backend_node',
60
+ },
61
+ 'l4-frontend': {
62
+ 'name': GOLDEN_IMAGE_PREFIX + '-l4-frontend',
63
+ 'tag': 'latest',
64
+ 'description': 'Frontend production runtime',
65
+ 'target': 'l4_frontend_golden',
66
+ },
67
+ 'l4-migrator': {
68
+ 'name': GOLDEN_IMAGE_PREFIX + '-l4-migrator',
69
+ 'tag': 'latest',
70
+ 'description': 'Migrator production runtime (no Infisical CLI - uses env vars)',
71
+ 'target': 'l4_migrator_golden',
72
+ },
73
+ }
74
+
75
+
76
+ # Layers that are no longer built, mapped to the layer that replaced them.
77
+ # l3-migrator installed the same Prisma as l3-backend and produced identical layers.
78
+ LAYER_ALIASES = {
79
+ 'l3-migrator': 'l3-backend',
80
+ }
81
+
82
+ # Image names older engines built that nothing uses now; the golden build untags them.
83
+ LEGACY_GOLDEN_IMAGES = [
84
+ GOLDEN_IMAGE_PREFIX + '-l3-migrator:latest',
85
+ ]
86
+
87
+
88
+ def get_layer_reference(layer):
89
+ """Returns the full image reference for a specific layer."""
90
+ layer = LAYER_ALIASES.get(layer, layer)
91
+ if layer not in GOLDEN_LAYERS:
92
+ fail("Invalid layer: " + layer + ". Must be one of: l1, l2, l3, l4")
93
+
94
+ layer_info = GOLDEN_LAYERS[layer]
95
+ return '{name}:{tag}'.format(
96
+ name=layer_info['name'],
97
+ tag=layer_info['tag'],
98
+ )
99
+
100
+ CONSTANTS = {}
@@ -0,0 +1,263 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - GOLDEN IMAGE DOCKERFILE GENERATOR
3
+ # =============================================================================
4
+
5
+ load('../../../tilt/common/utils.star', 'Utils')
6
+ load('../config/healthcheck.star', 'DOCKER_HEALTHCHECK', 'dockerfile_healthcheck_flags')
7
+
8
+
9
+ # Load project name for dynamic naming
10
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
11
+ def _load_golden_prefix():
12
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
13
+ project_json_path = '.tdk/project.json'
14
+ if project_root:
15
+ project_json_path = project_root + '/' + project_json_path
16
+
17
+ if os.path.exists(project_json_path):
18
+ _project_json = read_json(project_json_path)
19
+ return _project_json.get('project', {}).get('name', 'tdk-project')
20
+ return 'tdk-project'
21
+
22
+ _GOLDEN_PREFIX = _load_golden_prefix()
23
+
24
+ def generate_golden_dockerfile():
25
+ """Generate the multi-stage golden-layers.Dockerfile."""
26
+ prefix = _GOLDEN_PREFIX
27
+ header = Utils.get_template_header(
28
+ 'dockerfile',
29
+ 'GoldenImage.generate_layered_dockerfile()',
30
+ prefix + '-l1-l4',
31
+ 'GOLDEN LAYERED IMAGES | L1-L4 Pre-built Layers',
32
+ )
33
+
34
+ return header + """
35
+ # =============================================================================
36
+ # 🏗️ GOLDEN LAYERED IMAGES - Multi-Stage Base Images
37
+ # =============================================================================
38
+ # This Dockerfile builds 8 golden images:
39
+ # - """ + prefix + """-l1:latest - OS base + Bun runtime
40
+ # - """ + prefix + """-l2:latest - Dependencies installed
41
+ # - """ + prefix + """-l3-backend:latest - Backend and migrator build tools (Prisma, no Infisical CLI)
42
+ # - """ + prefix + """-l3-frontend:latest - Frontend build tools (no Prisma)
43
+ # - """ + prefix + """-l4-backend:latest - Backend production runtime (Bun)
44
+ # - """ + prefix + """-l4-backend-node:latest - Backend production runtime (Node.js)
45
+ # - """ + prefix + """-l4-frontend:latest - Frontend production runtime (Nginx)
46
+ # - """ + prefix + """-l4-migrator:latest - Migrator production runtime
47
+ #
48
+ # Migrators build on l3-backend: a separate l3-migrator stage installed the same Prisma
49
+ # and produced identical layers under a second image name.
50
+ #
51
+ # Services use these as base images to skip heavy dependency installation.
52
+ #
53
+ # ⚠️ SKIP_INFISICAL_SETUP Support:
54
+ # All generated Dockerfiles support --build-arg SKIP_INFISICAL_SETUP=1
55
+ # to bypass Infisical CLI installation (avoids Cloudsmith CDN hangs).
56
+ # When SKIP_INFISICAL_SETUP=1, secrets are read from env vars only.
57
+ # See: engine/topologies/platform/docker/layers/l3_builder_layers.star
58
+ # =============================================================================
59
+
60
+ # =============================================================================
61
+ # L1: OS BASE + RUNTIME ENVIRONMENT
62
+ # =============================================================================
63
+ FROM oven/bun:1.3.11-alpine@sha256:7ed9f74c326d1c260abe247ac423ccbf5ac92af62bb442d515d1f92f21e8ea9b AS l1_golden
64
+
65
+ LABEL layer="l1" \
66
+ description="OS base with runtime environment" \
67
+ maintainer="{prefix}"
68
+
69
+ # System dependencies for all services
70
+ RUN apk add --no-cache \
71
+ ca-certificates \
72
+ tzdata \
73
+ curl \
74
+ bash \
75
+ openssl
76
+
77
+ # Create app user/group for security
78
+ RUN addgroup -S app && adduser -S app -G app
79
+
80
+ # Runtime environment
81
+ ENV NODE_ENV=development \
82
+ BUN_INSTALL_CACHE_DIR=/cache/bun
83
+
84
+ WORKDIR /app
85
+
86
+
87
+ # =============================================================================
88
+ # L2: DEPENDENCY RESOLVER
89
+ # =============================================================================
90
+ FROM l1_golden AS l2_golden
91
+
92
+ LABEL layer="l2" \
93
+ description="Base with common dependencies installed" \
94
+ maintainer="{prefix}"
95
+
96
+ # Install minimal debugging tools (removed: vim, python3, make, g++ = -67MB)
97
+ RUN apk add --no-cache \
98
+ curl \
99
+ netcat-openbsd \
100
+ jq \
101
+ bind-tools
102
+
103
+ # Pre-create cache directories
104
+ RUN mkdir -p /cache/bun /cache/prisma
105
+
106
+ # Bun is already installed in base image
107
+ RUN echo "Bun version: $(bun --version)"
108
+
109
+
110
+ # =============================================================================
111
+ # L3-BACKEND: BACKEND BUILD TOOLS (PRISMA)
112
+ # =============================================================================
113
+ FROM l2_golden AS l3_backend_golden
114
+
115
+ LABEL layer="l3-backend" \
116
+ description="Backend build tools with Prisma" \
117
+ maintainer="{prefix}"
118
+
119
+ # Install Prisma CLI globally (pinned for deterministic builds)
120
+ RUN bun add -g prisma@7.5.0 @prisma/client@7.5.0
121
+
122
+ # Verify Prisma installation
123
+ RUN echo "Prisma version: $(bunx prisma --version | head -1)"
124
+
125
+ # ⚠️ CRITICAL: Infisical CLI is NOT installed in golden L3 images
126
+ # Reason: curl to dl.cloudsmith.io hangs during Docker builds when CDN is slow
127
+ # Solution: Use SKIP_INFISICAL_SETUP=1 build arg or runtime env var injection
128
+ # Services read secrets from environment variables at runtime (no CLI needed)
129
+ # See: .tilt/topologies/platform/docker/layers/l3_builder_layers.star
130
+
131
+
132
+ # =============================================================================
133
+ # L3-FRONTEND: FRONTEND BUILD TOOLS (NO PRISMA)
134
+ # =============================================================================
135
+ FROM l2_golden AS l3_frontend_golden
136
+
137
+ LABEL layer="l3-frontend" \
138
+ description="Frontend build tools without Prisma" \
139
+ maintainer="{prefix}"
140
+
141
+ # Frontend doesn't need Prisma, just verify Bun
142
+ RUN echo "Bun version: $(bun --version)"
143
+
144
+
145
+ # =============================================================================
146
+ # L4-BACKEND-BUN: BACKEND PRODUCTION RUNTIME (BUN)
147
+ # =============================================================================
148
+ FROM l1_golden AS l4_backend_bun
149
+
150
+ LABEL layer="l4-backend-bun" \
151
+ description="Backend production runtime (Bun)" \
152
+ maintainer="{prefix}"
153
+
154
+ ENV NODE_ENV=production
155
+ # Smaller heap growth and more frequent GC: idle services dominate a 100-service landscape.
156
+ ENV BUN_OPTIONS=--smol
157
+
158
+ # Service-specific tooling (e.g. hugo) is installed per service by the L4 runtime
159
+ # layer when the manifest lists it in featuresEnabled - not here for every backend.
160
+
161
+ # ⚠️ Infisical CLI is NOT installed in golden L4 images
162
+ # Services use TypeScript SDK (fetch API) or read from env vars - no CLI needed
163
+ # The entrypoint.sh gracefully handles missing CLI (falls back to env vars)
164
+ # Build with --build-arg SKIP_INFISICAL_SETUP=1 to skip CLI installation
165
+
166
+ USER bun
167
+
168
+ # Backend-specific healthcheck: probes the service over HTTP. The image is shared by every backend,
169
+ # so the port and path come from the container env (PORT is set by compose, TDK_HEALTH_PATH is optional).
170
+ HEALTHCHECK {hc_flags} \
171
+ CMD bun -e "fetch('http://127.0.0.1:'+process.env.PORT+(process.env.TDK_HEALTH_PATH||'/health')).then(r=>process.exit(r.ok?0:1),()=>process.exit(1))" || exit 1
172
+
173
+ WORKDIR /app
174
+
175
+
176
+ # =============================================================================
177
+ # L4-BACKEND-NODE: BACKEND PRODUCTION RUNTIME (NODE.JS - LIGHTWEIGHT!)
178
+ # =============================================================================
179
+ FROM node:22-alpine@sha256:0a7108bf6c7bf5de370ffb1a3ed6be93d405b43ff159f681a8d18c0e2bc2e402 AS l4_backend_node
180
+
181
+ LABEL layer="l4-backend-node" \
182
+ description="Backend production runtime (Node.js - lightweight)" \
183
+ maintainer="{prefix}"
184
+
185
+ ENV NODE_ENV=production
186
+
187
+ # Minimal runtime dependencies
188
+ RUN apk add --no-cache ca-certificates tzdata curl
189
+
190
+ # Create app user for security
191
+ RUN addgroup -S app && adduser -S app -G app
192
+
193
+ # ⚠️ Infisical CLI is NOT installed in golden L4 images
194
+ # Services read secrets from environment variables at runtime
195
+
196
+ USER app
197
+
198
+ # Backend-specific healthcheck: probes the service over HTTP (port and path from container env, see the Bun stage)
199
+ HEALTHCHECK {hc_flags} \
200
+ CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+(process.env.TDK_HEALTH_PATH||'/health')).then(r=>process.exit(r.ok?0:1),()=>process.exit(1))" || exit 1
201
+
202
+ WORKDIR /app
203
+
204
+
205
+ # Alias for backwards compatibility - defaults to Bun (most efficient)
206
+ FROM l4_backend_bun AS l4_backend_golden
207
+
208
+
209
+ # =============================================================================
210
+ # L4-FRONTEND: FRONTEND PRODUCTION RUNTIME
211
+ # =============================================================================
212
+ FROM nginx:1.27-alpine@sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10 AS l4_frontend_golden
213
+
214
+ LABEL layer="l4-frontend" \
215
+ description="Frontend production runtime with Nginx" \
216
+ maintainer="{prefix}"
217
+
218
+ ENV NODE_ENV=production
219
+
220
+ # Install curl for healthchecks
221
+ RUN apk add --no-cache curl
222
+
223
+ # Frontend-specific healthcheck (checks Nginx)
224
+ HEALTHCHECK {hc_flags_frontend} \
225
+ CMD curl -f http://localhost/ || exit 1
226
+
227
+ WORKDIR /usr/share/nginx/html
228
+
229
+
230
+ # =============================================================================
231
+ # L4-MIGRATOR: MIGRATOR PRODUCTION RUNTIME
232
+ # =============================================================================
233
+ FROM l1_golden AS l4_migrator_golden
234
+
235
+ LABEL layer="l4-migrator" \
236
+ description="Migrator runtime with Prisma" \
237
+ maintainer="{prefix}"
238
+
239
+ ENV NODE_ENV=production
240
+
241
+ # Copy global Prisma installation from L3 (l3-backend carries the same pinned Prisma)
242
+ COPY --from=l3_backend_golden /root/.bun/install/global /root/.bun/install/global
243
+
244
+ # ⚠️ Infisical CLI is NOT included in golden L4 images
245
+ # The migrator reads secrets directly from environment variables at runtime
246
+ # (no entrypoint wrapper needed for database migrations)
247
+ # Use --build-arg SKIP_INFISICAL_SETUP=1 to skip CLI installation in derived images
248
+
249
+ # Ensure Bun cache path is writable for non-root runtime healthcheck commands.
250
+ RUN mkdir -p /cache/bun && chown -R bun:bun /cache/bun
251
+
252
+ USER bun
253
+
254
+ # Migrators are one-shot jobs (migrate.sh runs to completion), so no healthcheck.
255
+ # The per-service l4_migrator_runtime stage sets HEALTHCHECK NONE as well.
256
+ HEALTHCHECK NONE
257
+
258
+ WORKDIR /app
259
+ """.format(
260
+ hc_flags=dockerfile_healthcheck_flags(),
261
+ hc_flags_frontend=dockerfile_healthcheck_flags(DOCKER_HEALTHCHECK["frontend_start_period_seconds"]),
262
+ prefix=_GOLDEN_PREFIX,
263
+ )