@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,418 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 📋 TILT SDK - MANIFEST LOADING (CEO Review: rename-service-manifest)
5
+ # =============================================================================
6
+ # Path: .tilt/topologies/tilt/discovery/manifest/loading.star
7
+ # Purpose: Load, synthesize, and apply defaults to manifests
8
+ #
9
+ # Manifest loading with synthesis-by-default
10
+ # Priority: service.json → synthesize from path
11
+ # =============================================================================
12
+
13
+ load('../../engine/topologies/tilt/manifest/parser.star', 'generated_string_error')
14
+ load('../../engine/topologies/tilt/manifest/constants.star',
15
+ 'MANIFEST_DEFAULTS',
16
+ 'DEFAULT_SYNCS',
17
+ 'MANIFEST_FILENAME',
18
+ 'BASE_PORT_FRONTEND',
19
+ 'BASE_PORT_BACKEND',
20
+ 'HEALTH_CHECK_PATH')
21
+ load('../../engine/topologies/tilt/common/utils.star', 'Utils')
22
+ load('../../engine/topologies/platform/docker/constants.star', 'PlatformDockerConstants')
23
+
24
+ def _check_prisma_folder(resource_path):
25
+ """
26
+ Check if prisma/ directory exists in resource path (silent).
27
+ Used to auto-detect has_migrator when not in features.
28
+ """
29
+ check_cmd = "test -d '{path}/prisma' && echo 'yes' || echo 'no'".format(path=resource_path)
30
+ result = str(local(check_cmd, quiet=True, echo_off=True)).strip()
31
+ return result == 'yes'
32
+
33
+
34
+ def check_prisma_folder(resource_path):
35
+ return _check_prisma_folder(resource_path)
36
+
37
+
38
+ def get_default_syncs_for_type(app_type, features=None):
39
+ """
40
+ Returns default sync paths based on app type and features.
41
+ """
42
+ if features == None:
43
+ features = []
44
+
45
+ syncs = list(DEFAULT_SYNCS.get(app_type, [] if app_type == 'bring-your-own' else ['src', 'package.json']))
46
+
47
+ # Add prisma to syncs if using prisma feature
48
+ if app_type == 'backend' and 'prisma' in features and 'prisma' not in syncs:
49
+ syncs.append('prisma')
50
+
51
+ return syncs
52
+
53
+
54
+ def _extract_stack_from_path(resource_path, app_name):
55
+ """
56
+ Extract stack from resource path or app name.
57
+
58
+ Convention: services/product/{stack}/{resource-name}
59
+ Fallback: First segment of app_name before hyphen
60
+
61
+ Special handling: profile -> identity
62
+ """
63
+ parts = resource_path.rstrip('/').split('/')
64
+ if len(parts) >= 4 and parts[-4] == 'services' and parts[-3] == 'product':
65
+ stack = parts[-2]
66
+ # Normalize profile to identity
67
+ if stack == 'profile':
68
+ return 'identity'
69
+ return stack
70
+ else:
71
+ return app_name.split('-')[0] if '-' in app_name else app_name
72
+
73
+
74
+ def load_manifest(resource_path, persist_to_disk=False):
75
+ """
76
+ Load manifest with synthesis-by-default.
77
+
78
+ Priority order:
79
+ 1. service.json (manifest file)
80
+ 2. Synthesize from directory structure (synthesis-by-default for standard resources)
81
+
82
+ Args:
83
+ resource_path: Path to resource directory
84
+ persist_to_disk: If True, sync _internalDeps back to the physical manifest file
85
+
86
+ Returns:
87
+ Validated manifest dict with all defaults applied
88
+ """
89
+ manifest = None
90
+ manifest_source = None
91
+ manifest_path = None
92
+
93
+ # Prepend project root to relative paths for correct resolution
94
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
95
+ if project_root and not resource_path.startswith('/'):
96
+ base_path = project_root + '/' + resource_path
97
+ else:
98
+ base_path = resource_path
99
+
100
+ # Try to load manifest file
101
+ manifest_full_path = base_path + '/' + MANIFEST_FILENAME
102
+ content = read_file(manifest_full_path, default='')
103
+
104
+ if content and str(content).strip():
105
+ manifest = decode_json(content)
106
+ # Refuse service.json values that would add keys to generated config (GHSA-phgf-pww4-7jxc)
107
+ unsafe_field_error = generated_string_error(manifest, manifest_full_path) if type(manifest) == "dict" else None
108
+ if unsafe_field_error:
109
+ fail(unsafe_field_error)
110
+ manifest_source = 'service.json'
111
+ manifest_path = manifest_full_path
112
+ else:
113
+ # Synthesize from directory structure if no manifest found
114
+ manifest = synthesize_manifest_from_path(resource_path)
115
+ manifest_source = 'synthesized'
116
+ manifest_path = resource_path # Virtual path
117
+
118
+ # Validate JSON parsed correctly
119
+ if manifest == None and manifest_source != 'synthesized':
120
+ fail("""
121
+ ❌ ═══════════════════════════════════════════════════════════════════
122
+ ❌ INVALID JSON IN MANIFEST FILE
123
+ ❌ ═══════════════════════════════════════════════════════════════════
124
+ 📁 File: {path}
125
+ Source: {source}
126
+
127
+ Common issues:
128
+ • Missing closing quote: "appName": "my-app
129
+ • Trailing comma: "port": 4000,}}
130
+ • Missing comma between properties
131
+ • Single quotes instead of double quotes
132
+
133
+ Fix the JSON syntax and run 'tilt up' again.
134
+ ❌ ═══════════════════════════════════════════════════════════════════
135
+ """.format(path=manifest_path, source=manifest_source))
136
+
137
+ # Track manifest source for debugging
138
+ manifest['_manifestSource'] = manifest_source
139
+ manifest['_manifestPath'] = manifest_path
140
+
141
+ # Apply defaults and compute derived values
142
+ validated = apply_manifest_defaults(manifest, resource_path)
143
+
144
+ return validated
145
+
146
+
147
+ def synthesize_manifest_from_path(resource_path):
148
+ return _synthesize_manifest_from_path(resource_path)
149
+
150
+
151
+ def apply_manifest_defaults(manifest, resource_path):
152
+ return _apply_manifest_defaults(manifest, resource_path)
153
+
154
+
155
+ def _synthesize_manifest_from_path(resource_path):
156
+ """
157
+ Create a manifest based on directory naming conventions.
158
+ Used when manifest.json doesn't exist (backward compatibility).
159
+
160
+ Convention: services/product/{stack}/{stack}-{component}-{type}
161
+ Example: services/product/{stack}/{app-name}-{type}
162
+ -> appName: {app-name}-{type}
163
+ -> appType: {type}
164
+ -> stack: {stack}
165
+ """
166
+ parts = resource_path.rstrip('/').split('/')
167
+ dir_name = parts[-1] if parts else 'unknown-service'
168
+
169
+ # Determine appType from directory name suffix
170
+ app_type = 'backend'
171
+ if dir_name.endswith('-frontend'):
172
+ app_type = 'frontend'
173
+ elif dir_name.endswith('-backend'):
174
+ app_type = 'backend'
175
+ elif dir_name.endswith('-migrator'):
176
+ app_type = 'migrator'
177
+ elif dir_name.endswith('-sdk'):
178
+ app_type = 'sdk'
179
+ elif dir_name.endswith('-infra') or dir_name.endswith('-ui'):
180
+ app_type = 'library'
181
+ elif 'lib-' in dir_name or 'platform-' in dir_name:
182
+ app_type = 'library'
183
+
184
+ return {
185
+ 'appName': dir_name,
186
+ 'appType': app_type,
187
+ '_synthesized': True,
188
+ }
189
+
190
+
191
+ def _apply_manifest_defaults(manifest, resource_path):
192
+ """
193
+ 🎯 SMART DEFAULTS: Expand slim manifest to full config.
194
+
195
+ CEO Review updates (rename-service-manifest):
196
+ - Port is constant per appType (3000 frontend, 4000 backend) — Traefik handles routing
197
+ - Custom dockerfile support via manifest["dockerfile"] field
198
+ - Developer manually provides features (no auto-detection per requirement)
199
+
200
+ Convention over Configuration:
201
+ - features: ["nats", "prisma"] -> usePrisma=True, useNats=True
202
+ - domain: "order" -> databaseName="TDK_order"
203
+ - domain: "order" -> traefik.host="order.backend.{project}.local"
204
+ - domain: "order" -> nats.queueGroup="order_backend_svc"
205
+ """
206
+ result = dict(manifest)
207
+
208
+ # Normalize resource_path to be relative (strip leading / if present)
209
+ # Docker build context requires relative paths
210
+ if resource_path.startswith('/'):
211
+ resource_path = resource_path[1:]
212
+
213
+ # Track overrides for logging (task 4.8: override detection)
214
+ overrides = []
215
+ app_name = result.get('appName', '')
216
+
217
+ # Apply simple defaults
218
+ for key, default_value in MANIFEST_DEFAULTS.items():
219
+ if key not in result or result[key] == None:
220
+ result[key] = default_value
221
+
222
+ # A bring-your-own service may not speak HTTP, so only an explicit healthCheckPath gives it one. compose.star and
223
+ # l4_runtime_layers.star read a missing path as "no HTTP probe"; the default above would otherwise hide that.
224
+ # (ManifestParser.normalize applies the same rule, but `flisk up` does not load manifests through it.)
225
+ if result.get('appType') == 'bring-your-own' and not manifest.get('healthCheckPath'):
226
+ result.pop('healthCheckPath', None)
227
+
228
+ # 🎯 CEO REVIEW: Traefik-native port strategy
229
+ # Port is constant per appType, not dynamically assigned
230
+ # Traefik routes by hostname (e.g., booking.backend.{project}.local), not port
231
+ app_type = result.get('appType', 'backend')
232
+
233
+ # Set constant port per appType, but preserve explicit service.json ports.
234
+ computed_port = None
235
+ if app_type == 'frontend':
236
+ computed_port = BASE_PORT_FRONTEND
237
+ elif app_type == 'backend':
238
+ computed_port = BASE_PORT_BACKEND
239
+ elif app_type == 'migrator':
240
+ computed_port = 7000 # Migrator uses different range
241
+
242
+ if computed_port != None and ('port' not in manifest or manifest.get('port') == None):
243
+ result['port'] = computed_port
244
+
245
+ # 🎯 CEO REVIEW: Custom dockerfile support
246
+ # Validate custom dockerfile exists if specified
247
+ if 'dockerfile' in result:
248
+ custom_dockerfile = result['dockerfile']
249
+ # With a bring-your-own buildContext the dockerfile is relative to that context.
250
+ build_context = result.get('buildContext')
251
+ if build_context and build_context != '.':
252
+ dockerfile_path = resource_path + '/' + build_context + '/' + custom_dockerfile
253
+ else:
254
+ dockerfile_path = resource_path + '/' + custom_dockerfile
255
+ # BUG FIX: Run check from project root since Tilt may run from .tdk/.tdk-out/
256
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
257
+ if project_root:
258
+ dockerfile_exists = local("cd '{root}' && test -f '{path}' && echo 'yes' || echo 'no'".format(root=project_root, path=dockerfile_path), quiet=True, echo_off=True)
259
+ else:
260
+ dockerfile_exists = local("test -f '{path}' && echo 'yes' || echo 'no'".format(path=dockerfile_path), quiet=True, echo_off=True)
261
+ if str(dockerfile_exists).strip() != 'yes':
262
+ fail("""
263
+ ❌ ═══════════════════════════════════════════════════════════════════
264
+ ❌ CUSTOM DOCKERFILE NOT FOUND
265
+ ❌ ═══════════════════════════════════════════════════════════════════
266
+ 📁 Resource: {resource}
267
+ 🐳 Dockerfile: {dockerfile}
268
+
269
+ Manifest specifies custom Dockerfile but it doesn't exist.
270
+ Either:
271
+ • Create {dockerfile} in resource directory
272
+ • Remove "dockerfile" field to use auto-generated Dockerfile
273
+ ❌ ═══════════════════════════════════════════════════════════════════
274
+ """.format(resource=resource_path.split('/')[-1], dockerfile=custom_dockerfile))
275
+
276
+ # 🎯 FEATURE FLAGS -> BOOLEAN CONFIG
277
+ # NOTE: Developer manually provides features per CEO Review requirement
278
+ # No auto-detection from file existence (e.g., prisma/schema.prisma)
279
+ features = result.get('featuresEnabled', [])
280
+ result['usePrisma'] = 'prisma' in features
281
+ result['useNats'] = 'nats' in features
282
+ result['useTraefik'] = (
283
+ 'traefik' in features
284
+ or app_type in ['backend', 'sdk']
285
+ or (app_type == 'bring-your-own' and result.get('exposeViaProxy', True))
286
+ )
287
+
288
+ # Extract stack from path if not set
289
+ if 'stack' not in result:
290
+ result['stack'] = _extract_stack_from_path(resource_path, app_name)
291
+
292
+ stack = result['stack']
293
+
294
+ # 🎯 SMART DATABASE NAME with override detection
295
+ computed_db_name = PlatformDockerConstants.get_db_name(stack)
296
+ if 'databaseName' not in result:
297
+ result['databaseName'] = computed_db_name
298
+ elif result['databaseName'] != computed_db_name:
299
+ overrides.append("databaseName: {} (auto: {})".format(result['databaseName'], computed_db_name))
300
+
301
+ # 🎯 SMART TRAEFIK CONFIG (Convention over Configuration)
302
+ # Apply to backends and SDKs that need Traefik routing
303
+ if result['useTraefik'] and app_type in ['backend', 'sdk', 'bring-your-own']:
304
+ existing_traefik = result.get('traefik', {})
305
+ # Use apiPath from root level if available, otherwise use default pattern
306
+ root_api_path = result.get('apiPath')
307
+ default_path_prefix = root_api_path if root_api_path else '/api/' + stack
308
+
309
+ # A bring-your-own service without healthCheckPath may not serve HTTP, so it gets no default Traefik health path.
310
+ default_health_path = None if app_type == 'bring-your-own' else HEALTH_CHECK_PATH
311
+ computed_traefik = {
312
+ 'host': stack + '.backend.' + PlatformDockerConstants.PROJECT_NAME + '.local',
313
+ 'pathPrefix': default_path_prefix,
314
+ # Follows healthCheckPath so a manifest that only sets that keeps one
315
+ # path for both probes; `traefik.healthCheck` overrides just Traefik's.
316
+ 'healthCheck': result.get('healthCheckPath') or default_health_path,
317
+ }
318
+
319
+ # Check for overrides
320
+ if existing_traefik.get('host') and existing_traefik.get('host') != computed_traefik['host']:
321
+ overrides.append("traefik.host: {} (auto: {})".format(existing_traefik['host'], computed_traefik['host']))
322
+ if existing_traefik.get('pathPrefix') and existing_traefik.get('pathPrefix') != computed_traefik['pathPrefix']:
323
+ overrides.append("traefik.pathPrefix: {} (auto: {})".format(existing_traefik['pathPrefix'], computed_traefik['pathPrefix']))
324
+
325
+ result['traefik'] = {
326
+ 'host': existing_traefik.get('host', computed_traefik['host']),
327
+ 'pathPrefix': existing_traefik.get('pathPrefix', computed_traefik['pathPrefix']),
328
+ 'healthCheck': existing_traefik.get('healthCheck', computed_traefik['healthCheck']),
329
+ }
330
+ if result['traefik']['healthCheck'] == None:
331
+ result['traefik'].pop('healthCheck')
332
+
333
+ # 🎯 SMART NATS CONFIG
334
+ if result['useNats']:
335
+ existing_nats = result.get('nats', {})
336
+ result['nats'] = {
337
+ 'queueGroup': existing_nats.get('queueGroup', stack + '_' + app_type + '_svc'),
338
+ 'subjects': existing_nats.get('subjects', [stack + '.>']),
339
+ }
340
+
341
+ # Compute backend name for frontends with override detection
342
+ if app_type == 'frontend':
343
+ computed_backend = app_name.replace('-frontend', '-backend')
344
+ if 'backendName' not in result:
345
+ result['backendName'] = computed_backend
346
+ elif result['backendName'] != computed_backend:
347
+ overrides.append("backendName: {} (auto: {})".format(result['backendName'], computed_backend))
348
+
349
+ # 🎯 SMART BASEPATH for frontends (convention: /{appName})
350
+ # Was '/' + stack + 's', which appended a second 's' to an already-plural
351
+ # stack ("operations" -> /operationss) and collided whenever one stack had
352
+ # two frontends. The service name is unique and matches the URL `flisk up`
353
+ # prints, so what the CLI advertises is what Traefik actually serves.
354
+ computed_base_path = '/' + app_name
355
+ if 'basePath' not in result:
356
+ result['basePath'] = computed_base_path
357
+ elif result['basePath'] != computed_base_path:
358
+ overrides.append("basePath: {} (auto: {})".format(result['basePath'], computed_base_path))
359
+
360
+ # 🎯 Always set _servicePath for all manifest types
361
+ result['_servicePath'] = resource_path
362
+
363
+ # 🎯 CENTRALIZED: Use Utils.get_internal_deps() for dependency extraction
364
+ internal_deps = Utils.get_internal_deps(resource_path)
365
+ result['_internalDeps'] = sorted(internal_deps)
366
+
367
+ # 🎯 CENTRALIZED: Use Utils.build_deps_mapping() for path resolution
368
+ result['_internalDepsMapping'] = Utils.build_deps_mapping(resource_path, internal_deps)
369
+
370
+ # 🎯 Log overrides if any were detected and verbose mode is enabled
371
+ if overrides and os.environ.get('TILT_LOG_LEVEL') == 'verbose':
372
+ print("📝 Override(s) detected for {}: {}".format(app_name, ', '.join(overrides)))
373
+
374
+ return result
375
+
376
+
377
+ def load_related_manifest(frontend_manifest, backend_suffix='-backend'):
378
+ """
379
+ Load the related backend manifest for a frontend resource.
380
+
381
+ CEO Review update: Supports dual-filename and synthesis-by-default.
382
+
383
+ Args:
384
+ frontend_manifest: The loaded frontend manifest
385
+ backend_suffix: Suffix to replace '-frontend' with
386
+
387
+ Returns:
388
+ Backend manifest dictionary, or None if not found
389
+ """
390
+ if frontend_manifest.get('appType') != 'frontend':
391
+ return None
392
+
393
+ resource_path = frontend_manifest.get('_servicePath', '')
394
+ backend_path = resource_path.replace('-frontend', backend_suffix)
395
+
396
+ # Use load_manifest which handles dual-filename and synthesis
397
+ return load_manifest(backend_path)
398
+
399
+
400
+ def get_manifest_filename(resource_path):
401
+ """
402
+ Determine which manifest filename is being used for a resource.
403
+
404
+ CEO Review addition: Utility for filename detection.
405
+
406
+ Args:
407
+ resource_path: Path to resource directory
408
+
409
+ Returns:
410
+ Filename string or None if neither exists (synthesis will be used)
411
+ """
412
+ # Check for manifest file (service.json)
413
+ manifest_path = resource_path + '/' + MANIFEST_FILENAME
414
+ if local("test -f '{path}' && echo 'yes' || echo 'no'".format(path=manifest_path), quiet=True, echo_off=True) == 'yes':
415
+ return MANIFEST_FILENAME
416
+
417
+ # Manifest not found - synthesis will be used
418
+ return None