@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,577 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🎯 TILT SDK - MANIFEST-DRIVEN CONFIG GENERATOR
5
+ # =============================================================================
6
+ # Path: .tilt/provisioner/orchestrator/generators/manifest_resource.star
7
+ # Purpose: Per-manifest config generation as Tilt resources
8
+ # =============================================================================
9
+ #
10
+ # Creates individual Tilt resources for each manifest that trigger all
11
+ # config generators (tsconfig, dockerfile, vite, npmrc, etc.) for that
12
+ # specific service.
13
+ #
14
+ # Benefits:
15
+ # - Granular tracking (see "my-service-config-gen" in Tilt UI)
16
+ # - Efficient updates (only regenerate changed manifests)
17
+ # - Better dependency management (explicit resource deps)
18
+ # - Cleaner architecture (manifest → resource → 10 generators)
19
+ # =============================================================================
20
+
21
+ # === INLINED CONSTANTS for pure extension loading ===
22
+ OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
23
+ # === END INLINED CONSTANTS ===
24
+
25
+
26
+ load('../../../../../topologies/tilt/common/utils.star', 'Utils')
27
+ load('../../../../../../discovery/loading.star', 'Manifest')
28
+ load('../../../../../topologies/tilt/manifest/constants.star', 'AUTOGENERATED_CONFIG_PATHS', 'PACKAGE_CONFIG_FILENAMES', 'GENERATED_CONFIG_FILENAMES', 'MANIFEST_FILENAME', 'MANIFEST_FILENAME_YAML', 'BASE_PORT_FRONTEND')
29
+ # Load OUTPUT for AUTOGENERATED_FOLDER
30
+ load('../../../generators/vite_config.star', 'Vite')
31
+ load('../../../generators/nginx_conf.star', 'Nginx')
32
+ load('../../../generators/api_gateway.star', 'ApiGateway')
33
+ load('../../../generators/tsconfig.star', 'TSConfig')
34
+ load('../../../../platform/docker/index.star', 'Docker')
35
+ load('../../../../platform/docker/build/frontend_build_plan.star', 'frontend_build_plan')
36
+ load('../../../generators/npmrc.star', 'PackageConfig')
37
+ load('../../libs.star', 'Libs')
38
+ load('./env.star', 'EnvGenerators')
39
+ load('./frontend.star', 'FrontendGenerators')
40
+ load('../helpers.star', 'OrchestratorHelpers')
41
+
42
+ # =============================================================================
43
+ # NEW: Pre-Flight Validation Generators (v2.0)
44
+ # These generators prevent vibe-coding failures by validating before build
45
+ # =============================================================================
46
+ load('../../../generators/index.star', 'Generators')
47
+
48
+ _generate_env_file = EnvGenerators.generate_env_file
49
+ _generate_frontend_api_files = FrontendGenerators.generate_all
50
+ _get_db_name_for_resource = OrchestratorHelpers.get_db_name
51
+ _get_resource_display_name = OrchestratorHelpers.get_display_name
52
+
53
+
54
+ def _run_pre_flight_validations(resource_name, resource_path, manifest, ctx):
55
+ """
56
+ Run pre-flight validations before generating configs.
57
+
58
+ This catches issues BEFORE they cause build failures:
59
+ - Docker path alias issues
60
+ - Missing dependencies
61
+ - Database config problems
62
+ - Package publishing gaps
63
+
64
+ Returns validation report for logging.
65
+ """
66
+ global_config = ctx.get('global_config', {})
67
+ all_services = ctx.get('all_services', [])
68
+
69
+ # Only run validations if Generators module loaded successfully
70
+ if not Generators:
71
+ return {"status": "SKIPPED", "reason": "Generators module not loaded"}
72
+
73
+ # Run all validations
74
+ report = Generators.run_pre_flight_validations(
75
+ resource_path,
76
+ manifest,
77
+ all_services,
78
+ global_config,
79
+ )
80
+
81
+ # Log summary to Tilt UI
82
+ if report.get("overall_status") == "FAILED":
83
+ print("⚠️ {}: Validation failures detected - check " + OUTPUT.AUTOGENERATED_FOLDER + "/validation-*.json".format(resource_name))
84
+ elif report.get("summary", {}).get("warnings", 0) > 0:
85
+ print("⚡ {}: Validations passed with warnings".format(resource_name))
86
+ else:
87
+ print("✅ {}: All validations passed".format(resource_name))
88
+
89
+ return report
90
+
91
+
92
+ def _escape_for_double_quoted_shell(value):
93
+ escaped = str(value)
94
+ escaped = escaped.replace("\\", "\\\\")
95
+ escaped = escaped.replace('"', '\\"')
96
+ escaped = escaped.replace("$", "\\$")
97
+ escaped = escaped.replace("`", "\\`")
98
+ return escaped
99
+
100
+
101
+ def _get_file_emoji(filename):
102
+ """Return an emoji based on the file type."""
103
+ if 'Dockerfile' in filename:
104
+ return '🐳'
105
+ elif filename.endswith('.ts'):
106
+ return '📜'
107
+ elif filename.endswith('.json'):
108
+ return '📋'
109
+ elif filename.endswith('.toml'):
110
+ return '⚙️'
111
+ elif filename.endswith('.conf'):
112
+ return '🔧'
113
+ elif filename.endswith('.env') or '.env.' in filename:
114
+ return '🔐'
115
+ elif '.npmrc' in filename:
116
+ return '📦'
117
+ elif '.dockerignore' in filename:
118
+ return '🚫'
119
+ elif filename.endswith('.md'):
120
+ return '🤖'
121
+ else:
122
+ return '📄'
123
+
124
+
125
+ def _build_generated_file_list(resource_config, resource_path, manifest):
126
+ """
127
+ Build the expected generated file list for logging in config-gen resources.
128
+ Mirrors _generate_all_configs_for_resource() behavior.
129
+ """
130
+ files = []
131
+ app_type = manifest.get('appType', 'backend')
132
+ if app_type == 'bring-your-own':
133
+ return []
134
+ is_frontend = resource_config.get('frontend', False) or app_type == 'frontend'
135
+
136
+ # Vite
137
+ if is_frontend:
138
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['vite_frontend'])
139
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['vite_build'])
140
+ elif app_type == 'backend':
141
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['vite_backend'])
142
+ elif app_type == 'sdk':
143
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['vite_sdk'])
144
+
145
+ # Nginx (frontends)
146
+ if is_frontend:
147
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['nginx'])
148
+
149
+ # Env
150
+ if is_frontend:
151
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['env_frontend'])
152
+ else:
153
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['env_backend'])
154
+
155
+ # Dockerfile + dockerignore
156
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['dockerfile_app'])
157
+ dockerfile_rel_path = resource_config.get('dockerfile', '')
158
+ if dockerfile_rel_path:
159
+ dockerfile_path = resource_path + "/" + dockerfile_rel_path
160
+ files.append(dockerfile_path + '.dockerignore')
161
+
162
+ # TS config(s)
163
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['tsconfig_docker'])
164
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['tsconfig_local'])
165
+
166
+ # Prisma config (non-frontends)
167
+ if not is_frontend:
168
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['prisma'])
169
+
170
+ # Playwright config (optional)
171
+ if manifest.get('playwright', False):
172
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['playwright'])
173
+
174
+ # Package configs
175
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + PACKAGE_CONFIG_FILENAMES['npmrc_docker_autogenerated'])
176
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + PACKAGE_CONFIG_FILENAMES['bunfig_docker_autogenerated'])
177
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + PACKAGE_CONFIG_FILENAMES['npmrc'])
178
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + PACKAGE_CONFIG_FILENAMES['bunfig'])
179
+
180
+ # AGENTS.md (AI agent guard rail)
181
+ files.append(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['agents_md'])
182
+
183
+ return files
184
+
185
+
186
+ def _build_config_log_cmd(resource_name, generated_files, config_gen_resource_name):
187
+ """Build a tree-structured log command with emojis for generated files.
188
+
189
+ Includes auto-removal of the config-gen resource after logging since
190
+ it's only needed for initial generation and watching for changes.
191
+ """
192
+ cmd_parts = [
193
+ 'echo ""',
194
+ 'echo "╔══════════════════════════════════════════════════════════════════════╗"',
195
+ 'echo "║ ⚡ ' + _escape_for_double_quoted_shell(resource_name) + ' configs generated by Starlark"',
196
+ 'echo "╚══════════════════════════════════════════════════════════════════════╝"',
197
+ 'echo ""',
198
+ ]
199
+
200
+ # Group files by directory
201
+ dirs = {}
202
+ for file_path in generated_files:
203
+ parts = file_path.rsplit('/', 1)
204
+ if len(parts) == 2:
205
+ dir_path, filename = parts
206
+ else:
207
+ dir_path = '.'
208
+ filename = file_path
209
+ if dir_path not in dirs:
210
+ dirs[dir_path] = []
211
+ dirs[dir_path].append(filename)
212
+
213
+ # Sort directories for consistent output
214
+ sorted_dirs = sorted(dirs.keys())
215
+ total_files = len(generated_files)
216
+
217
+ cmd_parts.append('echo "📦 Generated ' + str(total_files) + ' files:"')
218
+ cmd_parts.append('echo ""')
219
+
220
+ for dir_idx, dir_path in enumerate(sorted_dirs):
221
+ is_last_dir = (dir_idx == len(sorted_dirs) - 1)
222
+ dir_prefix = '└── ' if is_last_dir else '├── '
223
+
224
+ cmd_parts.append('echo "' + dir_prefix + '📁 ' + _escape_for_double_quoted_shell(dir_path) + '/"')
225
+
226
+ files_in_dir = sorted(dirs[dir_path])
227
+ for file_idx, filename in enumerate(files_in_dir):
228
+ is_last_file = (file_idx == len(files_in_dir) - 1)
229
+ file_prefix = ' └── ' if is_last_file else ' ├── '
230
+ if not is_last_dir:
231
+ file_prefix = '│ └── ' if is_last_file else '│ ├── '
232
+
233
+ emoji = _get_file_emoji(filename)
234
+ cmd_parts.append('echo "' + file_prefix + emoji + ' ' + _escape_for_double_quoted_shell(filename) + '"')
235
+
236
+ cmd_parts.append('echo ""')
237
+ cmd_parts.append('echo "✅ All configs ready!"')
238
+ cmd_parts.append('echo ""')
239
+
240
+ # Auto-remove this config-gen resource after logging
241
+ # This prevents clutter in the Tilt UI since config-gen is only needed for initial generation
242
+ cmd_parts.append('echo "🧹 Auto-removing config-gen resource..."')
243
+ cmd_parts.append('tilt delete uiresource ' + config_gen_resource_name + ' 2>/dev/null || true')
244
+ cmd_parts.append('echo "✅ Config-gen resource auto-removed"')
245
+ cmd_parts.append('echo ""')
246
+
247
+ return " && ".join(cmd_parts)
248
+
249
+
250
+ def _generate_all_configs_for_resource(
251
+ resource_name,
252
+ resource_config,
253
+ resource_path,
254
+ manifest,
255
+ backend_manifest,
256
+ ctx
257
+ ):
258
+ """
259
+ Generate ALL configuration files for a single resource.
260
+
261
+ This function is the core of the manifest-driven architecture.
262
+ It generates 10+ config files for one service based on its manifest.
263
+
264
+ Args:
265
+ resource_name: Parent service name (e.g., 'my-service')
266
+ resource_config: Resource dict from registry
267
+ resource_path: Full path to resource (e.g., 'services/product/users/user-backend')
268
+ manifest: Loaded manifest for this resource
269
+ backend_manifest: Backend manifest (for frontends only)
270
+ ctx: Tilt context with write_file, should_enable, etc.
271
+ """
272
+ write_file = ctx['write_file']
273
+ should_enable = ctx['should_enable']
274
+ global_config = ctx['global_config']
275
+
276
+ # Env generation needs the actual service directory on the manifest. Set it
277
+ # before the BYO fast path too; otherwise Compose references an env file that
278
+ # was never written for bring-your-own resources.
279
+ manifest['_resource_path'] = resource_path
280
+
281
+ if manifest.get('appType') == 'bring-your-own':
282
+ _generate_env_file(manifest, backend_manifest, write_file)
283
+ _generate_yaml_manifest(resource_path, manifest, write_file)
284
+ return
285
+
286
+ # WORKAROUND: Prevent infinite recursion by checking recursion depth
287
+ # Use a unique key per resource to track depth, avoiding interference between different resources
288
+ recursion_key = '_recursion_depth_' + resource_name
289
+ recursion_depth = ctx.get(recursion_key, 0)
290
+ if recursion_depth > 5:
291
+ print("⚠️ Recursion depth exceeded for {}, skipping config generation".format(resource_name))
292
+ return
293
+ # Create a new context copy to avoid mutating shared state for other resources
294
+ ctx = dict(ctx)
295
+ ctx[recursion_key] = recursion_depth + 1
296
+
297
+ # ==========================================================================
298
+ # NEW: PRE-FLIGHT VALIDATIONS (v2.0)
299
+ # Run validations BEFORE generating configs to catch issues early
300
+ # ==========================================================================
301
+ validation_report = _run_pre_flight_validations(
302
+ resource_name,
303
+ resource_path,
304
+ manifest,
305
+ ctx
306
+ )
307
+
308
+ # Store validation report for later reference
309
+ write_file(
310
+ resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER + "/validation-report.autogenerated.json",
311
+ Utils.encode_json(validation_report)
312
+ )
313
+
314
+ app_type = manifest.get('appType', 'backend')
315
+ is_frontend = resource_config.get('frontend', False) or app_type == 'frontend'
316
+ # Provider-owned backends (Python, Go) own their runtime files (package/pyproject, Dockerfile,
317
+ # reload command). Bun-only configs below (Vite, tsconfig, Prisma, bunfig) are skipped.
318
+ provider_owned = Docker.is_provider_owned_language(manifest)
319
+ if provider_owned:
320
+ # Fail before generating anything, with the missing file named, instead of a Docker
321
+ # COPY error halfway through the image build.
322
+ root = ctx.get('project_root', '')
323
+ prefix = (root.rstrip('/') + '/' if root else '') + resource_path + '/'
324
+ for required in Docker.language_required_files.get(manifest.get('language'), []):
325
+ if not os.path.exists(prefix + required):
326
+ fail("{}: language '{}' requires {} but {}{} does not exist".format(
327
+ resource_name, manifest.get('language'), required, resource_path + '/', required))
328
+
329
+ # ==========================================================================
330
+ # 1. VITE CONFIG
331
+ # ==========================================================================
332
+ if is_frontend:
333
+ if backend_manifest:
334
+ Vite.for_manifest(manifest, backend_manifest, write_file)
335
+ else:
336
+ Vite.for_manifest(manifest, None, write_file)
337
+ elif app_type == 'backend' and not provider_owned:
338
+ Vite.for_manifest(manifest, None, write_file)
339
+ elif app_type == 'sdk':
340
+ Vite.for_manifest(manifest, None, write_file)
341
+
342
+ # ==========================================================================
343
+ # 2. NGINX CONFIG (for frontends)
344
+ # ==========================================================================
345
+ if is_frontend:
346
+ # Generate referer map using ApiGateway and pass to Nginx
347
+ referer_map_block = ApiGateway.build_referer_map_block(manifest)
348
+ Nginx.frontend(manifest, write_file, referer_map_block)
349
+
350
+ # ==========================================================================
351
+ # 3. ENV FILE
352
+ # ==========================================================================
353
+ _generate_env_file(manifest, backend_manifest, write_file)
354
+
355
+ # ==========================================================================
356
+ # 3.5 FRONTEND API CLIENT FILES (for frontends only)
357
+ # ==========================================================================
358
+ if is_frontend:
359
+ FrontendGenerators.generate_all(manifest, write_file)
360
+
361
+ # ==========================================================================
362
+ # 4. PLAYWRIGHT CONFIG (if enabled)
363
+ # ==========================================================================
364
+ if manifest.get('playwright', False):
365
+ resource_type = 'frontend' if is_frontend else 'backend'
366
+ TSConfig.playwright(resource_path, resource_type, write_file)
367
+
368
+ # ==========================================================================
369
+ # 5. DOCKERFILE
370
+ # ==========================================================================
371
+ if is_frontend:
372
+ target_path = resource_config.get('target_path', '/usr/share/nginx/html')
373
+ use_nginx = 'nginx' in target_path or target_path == '/usr/share/nginx/html'
374
+ port = resource_config.get('port', manifest.get('port', BASE_PORT_FRONTEND))
375
+ root = ctx.get('project_root', '')
376
+ plan = frontend_build_plan((root.rstrip('/') + '/' if root else '') + resource_path + '/package.json')
377
+ dockerfile_content = Docker.frontend(
378
+ res_path=resource_path,
379
+ resource_name=resource_config['name'],
380
+ port=port,
381
+ target_path=target_path,
382
+ use_nginx=use_nginx,
383
+ use_golden=should_enable('golden-image'),
384
+ build_cmd=plan['build_cmd'],
385
+ )
386
+ elif provider_owned:
387
+ dockerfile_content = Docker.backend_language(
388
+ res_path=resource_path,
389
+ language=manifest.get('language'),
390
+ port=manifest.get('port', 4000),
391
+ dev=Docker.go_live_reload(manifest),
392
+ )
393
+ else:
394
+ dockerfile_content = Docker.backend(
395
+ res_path=resource_path,
396
+ resource_name=resource_name,
397
+ use_golden=should_enable('golden-image'),
398
+ use_prisma='prisma' in manifest.get('featuresEnabled', []),
399
+ manifest=manifest,
400
+ )
401
+
402
+ write_file(resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER + "/" + GENERATED_CONFIG_FILENAMES['dockerfile_app'], dockerfile_content)
403
+
404
+ # ==========================================================================
405
+ # 6. DOCKERIGNORE
406
+ # ==========================================================================
407
+ dockerfile_rel_path = resource_config.get('dockerfile', '')
408
+ if dockerfile_rel_path:
409
+ resource_type = 'frontend' if is_frontend else ('migrator' if 'migrator' in resource_config['name'] else 'backend')
410
+ dockerignore_content = Docker.generate_dockerignore(resource_path, resource_type)
411
+ # dockerfile_rel_path (e.g. ".autogenerated/Dockerfile.app.autogenerated") is relative
412
+ # to this resource's OWN directory - same convention _register_docker_build uses in
413
+ # apply_compose_resource_registration.star. Stripping a path segment here (previously
414
+ # resource_path.rsplit('/', 1)[0]) pointed at the parent STACK directory instead, so
415
+ # every sibling service in a stack (e.g. dashboard-api and dashboard-app under
416
+ # services/app) collided on one shared dockerignore file, each overwriting it with a
417
+ # different (backend vs frontend) ruleset on every Tiltfile load - a real diff every
418
+ # single run, which Tilt saw as a file change and used to trigger an infinite reload loop.
419
+ dockerfile_path = resource_path + "/" + dockerfile_rel_path
420
+ dockerignore_path = dockerfile_path + ".dockerignore"
421
+ write_file(dockerignore_path, dockerignore_content)
422
+
423
+ # ==========================================================================
424
+ # 7. TYPESCRIPT CONFIGS
425
+ # ==========================================================================
426
+ internal_deps_map = Libs.get_deps_mapping(ctx, resource_path)
427
+
428
+ if is_frontend:
429
+ # CRITICAL FIX (v2.0): For Docker builds, we MUST NOT pass internal_deps
430
+ # This prevents "Module not found" errors when path aliases point to
431
+ # source files outside the Docker context.
432
+ #
433
+ # Local builds: Use path aliases to source for faster development
434
+ # Docker builds: Resolve from node_modules (packages must be published)
435
+
436
+ # Docker tsconfig: NO path aliases to internal deps
437
+ TSConfig.frontend(
438
+ resource_path, write_file, internal_deps=None, is_docker=True,
439
+ framework=manifest.get('framework', 'react'),
440
+ )
441
+
442
+ # Local tsconfig: CAN use path aliases to internal deps
443
+ TSConfig.frontend(
444
+ resource_path, write_file, internal_deps=internal_deps_map, is_docker=False,
445
+ framework=manifest.get('framework', 'react'),
446
+ )
447
+ elif not provider_owned:
448
+ prisma_path = resource_config.get('prisma_client_path', './node_modules/.prisma/client')
449
+ resource_features = manifest.get('featuresEnabled', [])
450
+ TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=True, features=resource_features)
451
+ TSConfig.backend(resource_path, prisma_path, write_file, internal_deps=internal_deps_map, is_docker=False, features=resource_features)
452
+
453
+ # Prisma config
454
+ db_name = _get_db_name_for_resource(resource_name, resource_config['name'])
455
+ resource_display_name = _get_resource_display_name(resource_name, resource_config['name'])
456
+ TSConfig.prisma(resource_path=resource_path, resource_name=resource_display_name, db_name=db_name, write_fn=write_file)
457
+
458
+ # ==========================================================================
459
+ # 8. PACKAGE CONFIGS (npmrc, bunfig)
460
+ # ==========================================================================
461
+ verdaccio_enabled = global_config.get('verdaccio_enabled', True)
462
+ if not provider_owned:
463
+ PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
464
+ PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_docker'], is_docker=True, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
465
+ PackageConfig.npmrc(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
466
+ PackageConfig.bunfig(resource_path=resource_path, registry_url=global_config['verdaccio_url_local'], is_docker=False, write_fn=write_file, verdaccio_enabled=verdaccio_enabled)
467
+
468
+ # ==========================================================================
469
+ # 9. YAML MANIFEST (for verification)
470
+ # ==========================================================================
471
+ _generate_yaml_manifest(resource_path, manifest, write_file)
472
+
473
+ # ==========================================================================
474
+ # 10. AGENTS.MD (AI agent guard rail for .autogenerated/ folder)
475
+ # ==========================================================================
476
+ # Generates AGENTS.md in .autogenerated/ to warn AI agents not to modify
477
+ # machine-generated files. Explains single source of truth principle.
478
+ Generators.AgentsMd.generate(manifest, write_file)
479
+
480
+
481
+ def _generate_yaml_manifest(resource_path, manifest, write_file):
482
+ """Generate an allowlisted YAML shadow beside other Flisk-owned outputs."""
483
+ yaml_path = resource_path + "/.autogenerated/" + MANIFEST_FILENAME_YAML
484
+
485
+ # Check if YAML already exists and is up-to-date by comparing with JSON
486
+ json_path = resource_path + "/" + MANIFEST_FILENAME
487
+ json_mtime = local("stat -f %m " + json_path + " 2>/dev/null || stat -c %Y " + json_path + " 2>/dev/null || echo 0", quiet=True)
488
+ yaml_mtime = local("stat -f %m " + yaml_path + " 2>/dev/null || stat -c %Y " + yaml_path + " 2>/dev/null || echo 0", quiet=True)
489
+
490
+ if str(json_mtime).strip() <= str(yaml_mtime).strip() and yaml_mtime != "0":
491
+ # YAML is up-to-date, skip generation
492
+ return
493
+
494
+ # Generate YAML using the json_to_yaml.py converter
495
+ # NOTE: Path relative to Flisk CLI installation root (where this file is located)
496
+ # json_to_yaml.py is in engine/topologies/tilt/manifest/ relative to tdk-cli root
497
+ converter_path = "engine/topologies/tilt/manifest/json_to_yaml.py"
498
+ yaml_content = str(local("python3 " + converter_path + " " + json_path, quiet=True)).strip()
499
+ write_file(yaml_path, yaml_content)
500
+
501
+
502
+ # =============================================================================
503
+ # 📦 EXPORTED STRUCT
504
+ # =============================================================================
505
+
506
+ def create_manifest_config_resource(
507
+ resource_name,
508
+ resource_config,
509
+ resource_path,
510
+ manifest,
511
+ backend_manifest,
512
+ ctx
513
+ ):
514
+ """
515
+ Create a Tilt local_resource for manifest-driven config generation.
516
+
517
+ This creates a visible Tilt resource (e.g., "my-service-config-gen")
518
+ that watches the manifest and package.json, regenerating all configs
519
+ when they change.
520
+
521
+ Args:
522
+ resource_name: Parent service name
523
+ resource_config: Resource dict from registry
524
+ resource_path: Base service path
525
+ manifest: Loaded manifest
526
+ backend_manifest: Backend manifest (for frontends)
527
+ ctx: Tilt context
528
+
529
+ Returns:
530
+ Resource name (e.g., "my-service-config-gen")
531
+ """
532
+ resource_name = resource_config['name']
533
+ # resource_path is now correctly passed from apply_manifest_orchestration.star
534
+ # which uses resource.get('_resource_path', ...) to get the actual path
535
+ resource_path = resource_path
536
+ config_gen_resource_name = resource_name + '-config-gen'
537
+ auto_init_config_gen = ctx.get('auto_init_config_gen', True)
538
+
539
+ # Dependencies to watch
540
+ manifest_path = resource_path + "/" + MANIFEST_FILENAME
541
+ package_json_path = resource_path + "/package.json"
542
+
543
+ # Generate configs immediately (synchronously)
544
+ _generate_all_configs_for_resource(
545
+ resource_name,
546
+ resource_config,
547
+ resource_path,
548
+ manifest,
549
+ backend_manifest,
550
+ ctx
551
+ )
552
+ generated_files = _build_generated_file_list(resource_config, resource_path, manifest)
553
+ log_cmd = _build_config_log_cmd(resource_name, generated_files, config_gen_resource_name)
554
+
555
+ # Create a Tilt resource to watch for changes
556
+ # Note: Generation happens in Starlark before this resource runs.
557
+ # We log the expected generated file set for quick visibility in Tilt logs.
558
+ # The real value is in the deps watching and labels.
559
+ # The command auto-removes this resource after completion via tilt delete.
560
+ local_resource(
561
+ name=config_gen_resource_name,
562
+ cmd=log_cmd,
563
+ deps=[manifest_path] if manifest.get('appType') == 'bring-your-own' else [manifest_path, package_json_path],
564
+ labels=['config-gen', resource_name],
565
+ allow_parallel=True,
566
+ auto_init=auto_init_config_gen
567
+ )
568
+
569
+ return config_gen_resource_name
570
+
571
+
572
+ ManifestResource = struct(
573
+ generate_all_configs = _generate_all_configs_for_resource,
574
+ create_config_resource = create_manifest_config_resource,
575
+ )
576
+
577
+ VALIDATION = {}
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🧩 TILT SDK - ORCHESTRATOR HELPERS
5
+ # =============================================================================
6
+ # Path: .tilt/provisioner/orchestrator/helpers.star
7
+ # Purpose: Shared helper functions for orchestrator
8
+ # =============================================================================
9
+
10
+ def _get_db_name_for_resource(resource_name, res_name):
11
+ """Get database name from manifest databaseName field dynamically."""
12
+ # Database names now come from service.json databaseName field
13
+ # No hardcoded mappings - all from service.json
14
+ # Default: {project}_{resource_name}
15
+ return resource_name
16
+
17
+
18
+ def _get_resource_display_name(resource_name, res_name):
19
+ """Get human-readable service name for display."""
20
+ display_name = resource_name.replace('-', ' ').title()
21
+
22
+ # Dynamic service type detection from resource name
23
+ # No hardcoded service names - pattern-based detection
24
+ if '-planner' in res_name or 'planner' in res_name:
25
+ return display_name + ' Planner'
26
+ elif '-management' in res_name:
27
+ return display_name + ' Management'
28
+
29
+ return display_name
30
+
31
+
32
+ OrchestratorHelpers = struct(
33
+ get_db_name = _get_db_name_for_resource,
34
+ get_display_name = _get_resource_display_name,
35
+ )
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🎯 TILT SDK - SERVICE ORCHESTRATOR
5
+ # =============================================================================
6
+ # Path: .tilt/provisioner/orchestrator.star
7
+ # Purpose: Application service lifecycle management
8
+ # =============================================================================
9
+ #
10
+ # This module handles the complete lifecycle of loading and configuring
11
+ # application services. It orchestrates:
12
+ # - Manifest loading and validation
13
+ # - Config generation (Vite, TSConfig, Docker)
14
+ # - Resource registration and dependency tracking
15
+ #
16
+ # Key Functions:
17
+ # Orchestrator.apply_service(resource_config, ctx) - Load and configure a service
18
+ # Orchestrator.apply_all(services, ctx) - Load all services
19
+ # =============================================================================
20
+
21
+ load('./orchestrator/apply.star', 'apply_app_service')
22
+ load('./orchestrator/helpers.star', 'OrchestratorHelpers')
23
+ load('./orchestrator/generators/env.star', 'EnvGenerators')
24
+
25
+ _get_db_name_for_resource = OrchestratorHelpers.get_db_name
26
+ _get_resource_display_name = OrchestratorHelpers.get_display_name
27
+ _generate_env_file = EnvGenerators.generate_env_file
28
+
29
+
30
+ def apply_all_services(services, ctx):
31
+ """Apply all services in the list."""
32
+ for resource_config in services:
33
+ # BUG FIX: Skip services without required 'name' field
34
+ if type(resource_config) != "dict":
35
+ print("⚠️ Skipping invalid service config (not a dict): " + str(resource_config))
36
+ continue
37
+ if "name" not in resource_config:
38
+ print("⚠️ Skipping service config without 'name' field: " + str(resource_config))
39
+ continue
40
+ apply_app_service(resource_config, ctx)
41
+
42
+
43
+ # =============================================================================
44
+ # 📦 ORCHESTRATOR STRUCT (Public API)
45
+ # =============================================================================
46
+
47
+ Orchestrator = struct(
48
+ # Main functions
49
+ apply_service = apply_app_service,
50
+ apply_all = apply_all_services,
51
+
52
+ # Helpers (exposed for testing)
53
+ generate_env_file = _generate_env_file,
54
+ get_db_name = _get_db_name_for_resource,
55
+ get_display_name = _get_resource_display_name,
56
+ )
@@ -0,0 +1,5 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ load("./infra-loader.star", _Infra = "Infra")
4
+
5
+ Infra = _Infra