@flisk-sh/flisk 0.0.0-stage → 1.3.189

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-QWYXYAX6.js +510 -0
  170. package/cli/dist-bundle/cli.js +2017 -0
  171. package/cli/dist-bundle/cold-preflight-MM46GFQA.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,398 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🎯 TOPOLOGIES - FOCUS PROFILES
5
+ # =============================================================================
6
+
7
+ load("../../../topologies/tilt/common/utils.star", "Utils")
8
+ load(
9
+ "../../../../discovery/registry.star",
10
+ "APP_RESOURCES",
11
+ "CORE_INFRA_EXPORT",
12
+ "INFRA_STACK_MAP_EXPORT",
13
+ "OPTIONAL_INFRA_EXPORT",
14
+ "DEFAULTS_EXPORT",
15
+ "FOCUS_PRE_ALPHA_EXPORT",
16
+ "FOCUS_ALPHA_EXPORT",
17
+ "FOCUS_BETA_EXPORT",
18
+ "get_app_resources",
19
+ "get_app_resources_ref",
20
+ "get_resource_aliases_ref",
21
+ "get_resource_dependencies_ref",
22
+ )
23
+
24
+ # =============================================================================
25
+ # 🎯 RELEASE PHASE MAPPINGS
26
+ # =============================================================================
27
+ # Map release phase names to service lists from spec.master
28
+
29
+ RELEASE_PHASES = {
30
+ "pre-alpha": FOCUS_PRE_ALPHA_EXPORT,
31
+ "alpha": FOCUS_ALPHA_EXPORT,
32
+ "beta": FOCUS_BETA_EXPORT,
33
+ }
34
+
35
+ def expand_release_targets(targets):
36
+ """Expand release phase targets (pre-alpha, alpha, beta) to service lists."""
37
+ expanded = []
38
+ for target in targets:
39
+ target_lower = target.lower()
40
+ if target_lower in RELEASE_PHASES:
41
+ phase_services = RELEASE_PHASES[target_lower]
42
+ for svc in phase_services:
43
+ expanded.append(svc)
44
+ else:
45
+ expanded.append(target)
46
+ return expanded
47
+
48
+ def _get_resources_for_domain(domain_name):
49
+ """Get resource names (backend, frontend) for a domain from APP_RESOURCES.
50
+
51
+ Returns both the actual service resources and YAML tracking resources.
52
+ Library resources (appType == 'library') only return YAML resources.
53
+
54
+ Matches by stack name (domain) which is the canonical service identifier.
55
+ """
56
+ resources = []
57
+ for service in get_app_resources_ref():
58
+ # Match by stack name (domain) - this is the canonical identifier in spec.master
59
+ service_stack = service.get("stack", "")
60
+ service_name = service.get("name", "")
61
+ if service_stack == domain_name or service_name == domain_name:
62
+ for res in service.get("resources", []):
63
+ res_name = res.get("name", "")
64
+ if res_name:
65
+ # Check if this is a library resource - libraries don't have runtime resources
66
+ manifest = res.get("_manifest", {})
67
+ if manifest.get("appType") == "library":
68
+ # For libraries, only add YAML tracking resource
69
+ resources.append(res_name + "-yaml")
70
+ else:
71
+ # For actual services (backend, frontend), add both:
72
+ # 1. The actual service resource (for docker_build/docker_compose)
73
+ resources.append(res_name)
74
+ # 2. The YAML tracking resource
75
+ resources.append(res_name + "-yaml")
76
+ return resources
77
+
78
+
79
+ def get_all_needed_services(targets, skip_frontend = False):
80
+ needed = {}
81
+ visited = {}
82
+
83
+ def _resolve_alias(resource_name):
84
+ if resource_name in get_resource_aliases_ref():
85
+ alias_value = get_resource_aliases_ref()[resource_name]
86
+ # get_resource_aliases_ref() maps names to paths (strings), not to resource lists
87
+ # Only return alias_value if it's a list (of resource names)
88
+ if type(alias_value) == "list":
89
+ return alias_value
90
+ return [resource_name]
91
+
92
+ def _filter_frontends(resources, include_frontends):
93
+ if include_frontends:
94
+ return resources
95
+ return [resource for resource in resources if "frontend" not in resource]
96
+
97
+ def resolve_target(resource_name):
98
+ # Explicit focus targets keep their frontends unless --no-frontend is set.
99
+ return _filter_frontends(_resolve_alias(resource_name), not skip_frontend)
100
+
101
+ def resolve_dependency(resource_name):
102
+ # Transitive domain dependencies should not pull dependency UIs.
103
+ return _filter_frontends(_resolve_alias(resource_name), False)
104
+
105
+ def discover(service):
106
+ if service in visited:
107
+ return
108
+ visited[service] = True
109
+
110
+ if skip_frontend and "frontend" in service:
111
+ return
112
+
113
+ needed[service] = True
114
+
115
+ deps = get_resource_dependencies_ref().get(service, [])
116
+ for dep in deps:
117
+ for resolved in resolve_dependency(dep):
118
+ discover(resolved)
119
+
120
+ for target in targets:
121
+ for resolved in resolve_target(target):
122
+ discover(resolved)
123
+
124
+ # Expand any domain names in needed to their actual resources
125
+ # e.g., "identity" -> ["identity-management-backend", "identity-management-frontend", ...]
126
+ expanded_needed = {}
127
+ for service in needed:
128
+ resources = _get_resources_for_domain(service)
129
+ if resources:
130
+ for res in resources:
131
+ expanded_needed[res] = True
132
+ else:
133
+ expanded_needed[service] = True
134
+
135
+ return expanded_needed.keys()
136
+
137
+
138
+ def _load_focus_lists():
139
+ """Load focus lists from project spec.master directly."""
140
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
141
+ if not project_root:
142
+ return ([], [], [])
143
+
144
+ # Load from spec.master
145
+ spec_paths = [
146
+ project_root + "/.tdk/.tdk-out/spec.master",
147
+ project_root + "/spec.master",
148
+ ]
149
+
150
+ for spec_path in spec_paths:
151
+ check_cmd = "test -f '{}' && echo 'yes' || echo 'no'".format(spec_path)
152
+ exists = str(local(check_cmd, quiet=True, echo_off=True)).strip() == 'yes'
153
+ if exists:
154
+ # Parse PRE_ALPHA_RESOURCES from spec.master
155
+ pre_alpha = []
156
+ alpha = []
157
+ beta = []
158
+
159
+ content = str(local("cat '" + spec_path + "' 2>/dev/null || true", quiet=True, echo_off=True))
160
+
161
+ # Simple parsing for PRE_ALPHA_RESOURCES = {"key": True, ...}
162
+ if "PRE_ALPHA_RESOURCES" in content:
163
+ start = content.find("PRE_ALPHA_RESOURCES = {")
164
+ if start != -1:
165
+ start = content.find("{", start)
166
+ end = content.find("}", start)
167
+ if start != -1 and end != -1:
168
+ dict_content = content[start+1:end]
169
+ for line in dict_content.split("\n"):
170
+ line = line.strip()
171
+ if line and not line.startswith("#"):
172
+ # Extract key from "key": True format
173
+ if '"' in line or "'" in line:
174
+ quote_char = '"' if '"' in line else "'"
175
+ key_start = line.find(quote_char)
176
+ key_end = line.find(quote_char, key_start + 1)
177
+ if key_start != -1 and key_end != -1:
178
+ key = line[key_start+1:key_end]
179
+ if "True" in line:
180
+ pre_alpha.append(key)
181
+
182
+ if "ALPHA_RESOURCES" in content:
183
+ start = content.find("ALPHA_RESOURCES = {")
184
+ if start != -1:
185
+ start = content.find("{", start)
186
+ end = content.find("}", start)
187
+ if start != -1 and end != -1:
188
+ dict_content = content[start+1:end]
189
+ for line in dict_content.split("\n"):
190
+ line = line.strip()
191
+ if line and not line.startswith("#"):
192
+ if '"' in line or "'" in line:
193
+ quote_char = '"' if '"' in line else "'"
194
+ key_start = line.find(quote_char)
195
+ key_end = line.find(quote_char, key_start + 1)
196
+ if key_start != -1 and key_end != -1:
197
+ key = line[key_start+1:key_end]
198
+ if "True" in line:
199
+ alpha.append(key)
200
+
201
+ if "BETA_RESOURCES" in content:
202
+ start = content.find("BETA_RESOURCES = {")
203
+ if start != -1:
204
+ start = content.find("{", start)
205
+ end = content.find("}", start)
206
+ if start != -1 and end != -1:
207
+ dict_content = content[start+1:end]
208
+ for line in dict_content.split("\n"):
209
+ line = line.strip()
210
+ if line and not line.startswith("#"):
211
+ if '"' in line or "'" in line:
212
+ quote_char = '"' if '"' in line else "'"
213
+ key_start = line.find(quote_char)
214
+ key_end = line.find(quote_char, key_start + 1)
215
+ if key_start != -1 and key_end != -1:
216
+ key = line[key_start+1:key_end]
217
+ if "True" in line:
218
+ beta.append(key)
219
+
220
+ return (pre_alpha, alpha, beta)
221
+
222
+ return ([], [], [])
223
+
224
+
225
+ def apply_focus_filter(cfg):
226
+ # Ensure discovery is complete before applying focus filter
227
+ if len(get_app_resources_ref()) == 0:
228
+ get_app_resources()
229
+
230
+ focus_targets = cfg.get("focus", [])
231
+
232
+ # Default to pre-alpha if no focus targets specified
233
+ if not focus_targets:
234
+ print("🎯 Mode: pre-alpha (use --focus for alpha/beta)")
235
+ focus_targets = ["pre-alpha"]
236
+
237
+ parsed_targets = []
238
+ for target in focus_targets:
239
+ parsed_targets.extend(target.split(","))
240
+ parsed_targets = [t.strip() for t in parsed_targets if t.strip()]
241
+
242
+ # Load focus lists directly from spec.master (since env var is set after module load)
243
+ pre_alpha_list, alpha_list, beta_list = _load_focus_lists()
244
+
245
+ # Temporarily override RELEASE_PHASES with loaded values
246
+ dynamic_phases = {
247
+ "pre-alpha": pre_alpha_list if pre_alpha_list else FOCUS_PRE_ALPHA_EXPORT,
248
+ "alpha": alpha_list if alpha_list else FOCUS_ALPHA_EXPORT,
249
+ "beta": beta_list if beta_list else FOCUS_BETA_EXPORT,
250
+ }
251
+
252
+ # Expand release phase targets (pre-alpha, alpha, beta) to service lists
253
+ expanded = []
254
+ for target in parsed_targets:
255
+ target_lower = target.lower()
256
+ if target_lower in dynamic_phases:
257
+ phase_services = dynamic_phases[target_lower]
258
+ for svc in phase_services:
259
+ expanded.append(svc)
260
+ else:
261
+ expanded.append(target)
262
+ parsed_targets = expanded
263
+
264
+ if not parsed_targets:
265
+ return (False, None, None)
266
+
267
+ print("🎯 ═══════════════════════════════════════════════════════════════")
268
+ print("🎯 UBER-STYLE FOCUS MODE ACTIVATED")
269
+ print("🎯 Target services: " + ", ".join(parsed_targets))
270
+ print("🎯 ═══════════════════════════════════════════════════════════════")
271
+
272
+ skip_frontend = cfg.get("no-frontend", False)
273
+ include_monitoring = cfg.get("include-monitoring", False)
274
+
275
+ needed_list = get_all_needed_services(parsed_targets, skip_frontend)
276
+ needed = {}
277
+ for s in needed_list:
278
+ needed[s] = True
279
+
280
+ for infra in CORE_INFRA_EXPORT:
281
+ needed[infra] = True
282
+ if infra in INFRA_STACK_MAP_EXPORT:
283
+ needed[INFRA_STACK_MAP_EXPORT[infra]] = True
284
+
285
+ if include_monitoring:
286
+ needed["monitoring"] = True
287
+ for svc in OPTIONAL_INFRA_EXPORT.get("monitoring", []):
288
+ needed[svc] = True
289
+
290
+ if os.environ.get("INFISICAL_ENABLED", "true").lower() == "true":
291
+ needed["infisical"] = True
292
+ for svc in OPTIONAL_INFRA_EXPORT.get("infisical", []):
293
+ needed[svc] = True
294
+
295
+ for target in parsed_targets:
296
+ if target in get_resource_aliases_ref():
297
+ needed[target] = True
298
+
299
+ all_needed = needed.keys()
300
+
301
+ logic_toggles = [
302
+ "database-management",
303
+ "golden-image",
304
+ "proxy",
305
+ "verdaccio",
306
+ "infisical",
307
+ "monitoring",
308
+ "elk",
309
+ "debezium",
310
+ # Domains are auto-discovered from service manifests
311
+ # No hardcoded domain names - all from service.json
312
+ "backends-only",
313
+ ]
314
+ # Infrastructure resources that exist as Tilt local_resource or docker_compose
315
+ # These are handled separately and should not be in resource_only_needed
316
+ infra_resource_names = CORE_INFRA_EXPORT + ["infisical-db", "infisical-redis"]
317
+ for opt_infra_list in OPTIONAL_INFRA_EXPORT.values():
318
+ for res in opt_infra_list:
319
+ if res not in infra_resource_names:
320
+ infra_resource_names.append(res)
321
+
322
+ # config.set_enabled_resources accepts only concrete Tilt resources.
323
+ # Logic toggles (e.g. "golden-image", "database-management") are excluded since they're config flags, not resources.
324
+ # Infrastructure resources (postgres, nats, traefik, etc.) are loaded via Infra.load_all()
325
+ # and excluded here since they may not be available in all projects.
326
+ # Only include resources that exist as discovered services.
327
+ #
328
+ # NOTE: resource_aliases (from get_resource_aliases_ref()) only maps top-level
329
+ # STACK/domain names (e.g. "app", "billing") to a path - it does not contain an
330
+ # entry per concrete resource (e.g. "dashboard-api", "checkout-app"). _get_resources_for_domain()
331
+ # already expanded stack names into concrete resource names above (all_needed), so those
332
+ # concrete names must be recognized here too, or they get silently dropped and their
333
+ # services never start. Build that set directly from the discovered service resources.
334
+ resource_aliases = get_resource_aliases_ref()
335
+ known_service_resource_names = {}
336
+ for _svc in get_app_resources_ref():
337
+ for _res in _svc.get("resources", []):
338
+ _res_name = _res.get("name", "")
339
+ if _res_name:
340
+ known_service_resource_names[_res_name] = True
341
+ known_service_resource_names[_res_name + "-yaml"] = True
342
+ resource_only_needed = []
343
+ for r in all_needed:
344
+ if r in logic_toggles:
345
+ continue
346
+ if r not in resource_aliases and r not in known_service_resource_names:
347
+ continue
348
+ resource_only_needed.append(r)
349
+
350
+ print("🎯 Discovered " + str(len(all_needed)) + " entities via dependency graph:")
351
+
352
+ app_resources = [r for r in all_needed if any([x in r for x in ["backend", "frontend", "migrator"]])]
353
+ infra_resources = [r for r in all_needed if r in CORE_INFRA_EXPORT or any([r in v for v in OPTIONAL_INFRA_EXPORT.values()])]
354
+ db_resources = [r for r in all_needed if "provision-db" in r]
355
+
356
+ if app_resources:
357
+ print(" 📱 Apps: " + ", ".join(sorted(app_resources)))
358
+ if db_resources:
359
+ print(" 🗃️ Databases: " + ", ".join(sorted(db_resources)))
360
+ if infra_resources:
361
+ print(" 🏗️ Infrastructure: " + ", ".join(sorted(infra_resources)))
362
+
363
+ print("🎯 ═══════════════════════════════════════════════════════════════")
364
+
365
+ return (True, all_needed, resource_only_needed)
366
+
367
+
368
+ def create_should_enable_wrapper(focus_mode, focus_enabled_all, cfg, defaults):
369
+ def should_enable_wrapper(resource_name):
370
+ if focus_mode and focus_enabled_all:
371
+ # Check if resource_name itself is in the list (for infrastructure)
372
+ if resource_name in focus_enabled_all:
373
+ return True
374
+ # Check if resource_name starts with any domain in focus_enabled_all
375
+ # e.g., "identity-management-backend" starts with "identity"
376
+ for domain in focus_enabled_all:
377
+ if resource_name.startswith(domain + "-"):
378
+ return True
379
+ # Check get_resource_aliases_ref() (if it maps to resource lists)
380
+ if resource_name in get_resource_aliases_ref():
381
+ alias_value = get_resource_aliases_ref()[resource_name]
382
+ if type(alias_value) == "list":
383
+ return any([res in focus_enabled_all for res in alias_value])
384
+ return False
385
+ return Utils.should_enable(resource_name, cfg, defaults)
386
+
387
+ return should_enable_wrapper
388
+
389
+
390
+ Focus = struct(
391
+ get_needed_services = get_all_needed_services,
392
+ apply_focus = apply_focus_filter,
393
+ create_enabler = create_should_enable_wrapper,
394
+ )
395
+
396
+
397
+ # Inlined constant
398
+ DEFAULTS = {}
@@ -0,0 +1,64 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🤖 TILT SDK - AGENTS.MD GENERATOR (free-tier stub)
5
+ # =============================================================================
6
+ # Path: .tilt/providers/generators/agents_md.star
7
+ # =============================================================================
8
+ # The full AI-agent guard rails (the multi-section AGENTS.md explaining the
9
+ # manifest-driven architecture, the do/don't table, and the emergency
10
+ # override procedure) are a paid Flisk feature. When a valid license grants
11
+ # the "agents-md" resource, cli/src/generator/template-engine.ts
12
+ # (vendorTdkExtension) overwrites this file with the licensed version
13
+ # fetched via extension-fetch.ts before Tilt loads it. Same function
14
+ # signature either way, so nothing else in the generator pipeline changes.
15
+ # =============================================================================
16
+
17
+
18
+ # === INLINED CONSTANTS for pure extension loading ===
19
+ OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
20
+ # === END INLINED CONSTANTS ===
21
+
22
+
23
+ load('../../../topologies/tilt/common/utils.star', 'Utils')
24
+
25
+ _STUB_NOTICE = """# ⚠️ AUTOGENERATED FILES - DO NOT MODIFY
26
+
27
+ **This folder (`.autogenerated/`) contains MACHINE-GENERATED files.** Any changes you make here will be overwritten the next time Tilt runs the configuration generators.
28
+
29
+ Full AI-agent guard rails (architecture explanation, do/don't table, emergency override procedure) are a paid Flisk feature. Run `flisk upgrade` to enable the complete generated AGENTS.md for this service.
30
+ """
31
+
32
+
33
+ def generate_agents_md(manifest, write_fn=None):
34
+ """
35
+ Free-tier stub - see module header. Signature matches the licensed
36
+ implementation so callers never need to know which one is active.
37
+ """
38
+ resource_path = manifest.get('_resource_path', '')
39
+ app_name = manifest.get('appName', 'unknown-service')
40
+ app_type = manifest.get('appType', 'backend')
41
+
42
+ header = Utils.get_template_header(
43
+ 'agents_md',
44
+ 'AgentsMd.generate() [unlicensed stub]',
45
+ app_name,
46
+ 'Output: .autogenerated/AGENTS.md',
47
+ )
48
+
49
+ content = header + _STUB_NOTICE
50
+
51
+ if write_fn:
52
+ output_path = resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/AGENTS.md'
53
+ write_fn(output_path, content)
54
+
55
+ return content
56
+
57
+
58
+ # =============================================================================
59
+ # 🎯 PUBLIC API
60
+ # =============================================================================
61
+
62
+ AgentsMd = struct(
63
+ generate = generate_agents_md,
64
+ )
@@ -0,0 +1,147 @@
1
+ # Copyright (c) 2026 Flisk Landscape contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🌐 TILT SDK - API GATEWAY (Referer-Based Context Routing)
5
+ # =============================================================================
6
+ # Path: .tilt/topologies/tilt/generators/api_gateway.star
7
+ # Purpose: Auto-discover backends and generate referer-based routing map
8
+ # =============================================================================
9
+
10
+ load('../../../../discovery/registry.star', 'get_app_resources', 'get_resource_aliases')
11
+
12
+
13
+ def _extract_referer_pattern(base_path, stack):
14
+ """Extract referer pattern from basePath or stack - use actual names."""
15
+ if base_path:
16
+ return base_path.strip('/').lower()
17
+ if stack:
18
+ return stack.lower()
19
+ return None
20
+
21
+
22
+ def _collect_backend_dependencies(frontend_manifest):
23
+ """
24
+ Resolve backend resource names for a frontend manifest's declared dependencies.
25
+ Includes frontend's own backend and backend resources from dependency aliases.
26
+ """
27
+ if frontend_manifest == None:
28
+ return None
29
+
30
+ allowed = {}
31
+
32
+ frontend_backend = frontend_manifest.get('backendName')
33
+ if frontend_backend:
34
+ allowed[frontend_backend] = True
35
+
36
+ manifest_deps = frontend_manifest.get('dependencies')
37
+ if manifest_deps == None:
38
+ manifest_deps = frontend_manifest.get('dependsOn', [])
39
+
40
+ aliases = get_resource_aliases()
41
+ for dep in manifest_deps:
42
+ dep_name = str(dep)
43
+ if dep_name.endswith('-backend'):
44
+ allowed[dep_name] = True
45
+ continue
46
+
47
+ alias_targets = aliases.get(dep_name, [])
48
+ for target in alias_targets:
49
+ if target.endswith('-backend'):
50
+ allowed[target] = True
51
+
52
+ return allowed
53
+
54
+
55
+ def _get_backend_port(backend_name, fallback = 4000):
56
+ for service in get_app_resources():
57
+ for resource in service.get('resources', []):
58
+ if resource.get('name') == backend_name:
59
+ manifest = resource.get('_manifest', {})
60
+ app_type = manifest.get('appType', resource.get('app_type', 'backend'))
61
+ if app_type == 'backend':
62
+ return manifest.get('containerPort', 3000)
63
+ return resource.get('port', fallback)
64
+ return fallback
65
+
66
+
67
+ def get_backend_routing_map(frontend_manifest = None):
68
+ """
69
+ Auto-scan all backends from discovered manifests and build referer-based routing map.
70
+ Returns dict: {referer_pattern: {backend_name, port}}
71
+ """
72
+ routing_map = {}
73
+ default_backend = None
74
+
75
+ allowed_backends = _collect_backend_dependencies(frontend_manifest)
76
+
77
+ for resource_group in get_app_resources():
78
+ stack_name = resource_group.get('name', '')
79
+
80
+ for resource in resource_group.get('resources', []):
81
+ manifest = resource.get('_manifest', {})
82
+ app_type = manifest.get('appType', resource.get('app_type', 'backend'))
83
+
84
+ if app_type != 'backend':
85
+ continue
86
+
87
+ backend_name = resource.get('name', '')
88
+ if allowed_backends != None and backend_name not in allowed_backends:
89
+ continue
90
+ if app_type == 'backend':
91
+ port = manifest.get('containerPort', 3000)
92
+ else:
93
+ port = resource.get('port', 4000)
94
+
95
+ base_path = manifest.get('basePath', '')
96
+ stack = manifest.get('stack', stack_name)
97
+
98
+ pattern = _extract_referer_pattern(base_path, stack)
99
+
100
+ if pattern:
101
+ routing_map[pattern] = {'name': backend_name, 'port': port}
102
+ elif not default_backend:
103
+ default_backend = {'name': backend_name, 'port': port}
104
+
105
+ return routing_map, default_backend
106
+
107
+
108
+ def build_referer_map_block(frontend_manifest = None):
109
+ """
110
+ Build the nginx map block by scanning all manifests.
111
+ Routes are sorted by specificity (longest path first) to ensure proper matching.
112
+ Uses flexible matching to handle both /order/ and /orders paths.
113
+ """
114
+ routing_map, default_backend = get_backend_routing_map(frontend_manifest)
115
+
116
+ sorted_patterns = sorted(routing_map.keys(), key=len, reverse=True)
117
+
118
+ lines = [
119
+ ' # Auto-discovered backend routing map (referer-based context routing)',
120
+ ' map $http_referer $api_backend {'
121
+ ]
122
+
123
+ for pattern in sorted_patterns:
124
+ backend = routing_map[pattern]
125
+ backend_url = 'http://{}:{}'.format(backend['name'], backend['port'])
126
+ lines.append(' ~*{} {};'.format(pattern, backend_url))
127
+
128
+ if default_backend:
129
+ default_url = 'http://{}:{}'.format(default_backend['name'], default_backend['port'])
130
+ lines.append(' default {};'.format(default_url))
131
+ elif frontend_manifest != None and frontend_manifest.get('backendName'):
132
+ backend_name = frontend_manifest.get('backendName')
133
+ backend_port = _get_backend_port(backend_name, 4000)
134
+ lines.append(' default http://{}:{};'.format(backend_name, backend_port))
135
+ else:
136
+ # No hardcoded fallback - backendName must be specified in manifest
137
+ lines.append(' default http://backend-not-configured:4000;')
138
+
139
+ lines.append(' }')
140
+
141
+ return '\n'.join(lines)
142
+
143
+
144
+ ApiGateway = struct(
145
+ get_backend_routing_map = get_backend_routing_map,
146
+ build_referer_map_block = build_referer_map_block,
147
+ )