@flisk-sh/flisk 1.3.207 → 1.4.1

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 (382) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +40 -37
  3. package/cli/dist/agent-runtimes/custom.js +3 -3
  4. package/cli/dist/agent-runtimes/registry.js +3 -3
  5. package/cli/dist/backend-frameworks/registry.js +8 -8
  6. package/cli/dist/backend-languages/python.js +4 -1
  7. package/cli/dist/backend-languages/registry.js +3 -3
  8. package/cli/dist/cli.js +4 -3
  9. package/cli/dist/commands/agent.js +8 -8
  10. package/cli/dist/commands/completion.js +26 -26
  11. package/cli/dist/commands/config.js +8 -8
  12. package/cli/dist/commands/doctor.js +80 -18
  13. package/cli/dist/commands/down.js +1 -1
  14. package/cli/dist/commands/eject.js +10 -10
  15. package/cli/dist/commands/help.js +2 -2
  16. package/cli/dist/commands/import.js +2 -2
  17. package/cli/dist/commands/logs.js +2 -2
  18. package/cli/dist/commands/mcp.js +2 -2
  19. package/cli/dist/commands/networks.js +2 -2
  20. package/cli/dist/commands/open.js +0 -1
  21. package/cli/dist/commands/project.js +19 -19
  22. package/cli/dist/commands/projects.js +1 -1
  23. package/cli/dist/commands/resource.js +21 -21
  24. package/cli/dist/commands/resources.js +2 -2
  25. package/cli/dist/commands/restart.js +7 -4
  26. package/cli/dist/commands/runtime.js +19 -4
  27. package/cli/dist/commands/stack.js +8 -8
  28. package/cli/dist/commands/up.js +23 -23
  29. package/cli/dist/commands/upgrade.js +44 -40
  30. package/cli/dist/frontend-frameworks/registry.js +3 -3
  31. package/cli/dist/generator/extension-fetch.js +12 -9
  32. package/cli/dist/generator/template-engine.js +72 -56
  33. package/cli/dist/mcp/tools.js +2 -2
  34. package/cli/dist/utils/agent-host.js +1 -1
  35. package/cli/dist/utils/cli-command.js +1 -1
  36. package/cli/dist/utils/cold-preflight.js +2 -2
  37. package/cli/dist/utils/constants.js +3 -3
  38. package/cli/dist/utils/discovery-paths.js +2 -2
  39. package/cli/dist/utils/doctor-fix.js +10 -10
  40. package/cli/dist/utils/doctor-report.js +3 -3
  41. package/cli/dist/utils/doctor-runtime.js +4 -3
  42. package/cli/dist/utils/doctor-starlark.js +3 -3
  43. package/cli/dist/utils/doctor-wiring.js +4 -4
  44. package/cli/dist/utils/down-cleanup.js +2 -2
  45. package/cli/dist/utils/env-compat-init.js +8 -0
  46. package/cli/dist/utils/env-compat.js +27 -0
  47. package/cli/dist/utils/env-selection.js +9 -9
  48. package/cli/dist/utils/errors.js +13 -13
  49. package/cli/dist/utils/file-helpers.js +5 -5
  50. package/cli/dist/utils/{tdk-version.js → flisk-version.js} +8 -8
  51. package/cli/dist/utils/generated-paths.js +6 -6
  52. package/cli/dist/utils/host-port-config.js +10 -10
  53. package/cli/dist/utils/host-port-plan.js +3 -3
  54. package/cli/dist/utils/machine-output.js +2 -2
  55. package/cli/dist/utils/native-windows.js +1 -1
  56. package/cli/dist/utils/paths.js +3 -3
  57. package/cli/dist/utils/platform.js +9 -9
  58. package/cli/dist/utils/port-conflict-fix.js +3 -3
  59. package/cli/dist/utils/port-fallback-notice.js +3 -3
  60. package/cli/dist/utils/project-config-defaults.js +1 -1
  61. package/cli/dist/utils/project-features.js +2 -2
  62. package/cli/dist/utils/resource-features.js +3 -3
  63. package/cli/dist/utils/runtime-layout.js +65 -0
  64. package/cli/dist/utils/schema-version-gate.js +3 -2
  65. package/cli/dist/utils/service-urls.js +3 -3
  66. package/cli/dist/utils/services.js +2 -2
  67. package/cli/dist/utils/shared-infra.js +2 -2
  68. package/cli/dist/utils/shared-platform-postgres.js +6 -6
  69. package/cli/dist/utils/tar.js +1 -1
  70. package/cli/dist/utils/tilt.js +1 -1
  71. package/cli/dist/utils/up-readiness.js +1 -1
  72. package/cli/dist/utils/windows-doctor.js +3 -3
  73. package/cli/dist-bundle/{chunk-YZRPX76N.js → chunk-3J6XI3NX.js} +1 -1
  74. package/cli/dist-bundle/chunk-7HR5PVOD.js +54 -0
  75. package/cli/dist-bundle/{chunk-FAHNFTWN.js → chunk-7IXBBU27.js} +2 -2
  76. package/cli/dist-bundle/chunk-BB5BZ37Y.js +10 -0
  77. package/cli/dist-bundle/{chunk-SLKTM6ZO.js → chunk-DUNCELUK.js} +14 -14
  78. package/cli/dist-bundle/chunk-K6SOCO6V.js +3 -0
  79. package/cli/dist-bundle/{chunk-D2DIEX5E.js → chunk-KJOCVAMQ.js} +2 -2
  80. package/cli/dist-bundle/{chunk-6EA4DGCY.js → chunk-KJZUBHLO.js} +1 -1
  81. package/cli/dist-bundle/chunk-L6U555CJ.js +61 -0
  82. package/cli/dist-bundle/chunk-M2R464RM.js +7 -0
  83. package/cli/dist-bundle/{chunk-GOEBYLFN.js → chunk-MINZ25AC.js} +1 -1
  84. package/cli/dist-bundle/chunk-RX6O3PG4.js +2 -0
  85. package/cli/dist-bundle/chunk-SRN64OPO.js +35 -0
  86. package/cli/dist-bundle/chunk-TZNXL3IO.js +2 -0
  87. package/cli/dist-bundle/{chunk-5LRMAY67.js → chunk-UJXR6MZ2.js} +13 -13
  88. package/cli/dist-bundle/{chunk-AGXA5DOQ.js → chunk-VRESY4NR.js} +3 -3
  89. package/cli/dist-bundle/{chunk-53M5D4KE.js → chunk-XD3BBFZB.js} +1 -1
  90. package/cli/dist-bundle/{chunk-GIMHTZNR.js → chunk-YL56J2WX.js} +1 -1
  91. package/cli/dist-bundle/cli.js +254 -254
  92. package/cli/dist-bundle/cold-preflight-BBDDHWRV.js +2 -0
  93. package/cli/dist-bundle/colima-GBURKN54.js +2 -0
  94. package/cli/dist-bundle/{demo-stage-ANHJKDZC.js → demo-stage-HIHO4VV3.js} +2 -2
  95. package/cli/dist-bundle/{devtools-MGITLOWZ.js → devtools-ZD6XIOLD.js} +2 -2
  96. package/cli/dist-bundle/extension-fetch-VEFSCG4B.js +2 -0
  97. package/cli/dist-bundle/native-windows-BWVEYVPO.js +2 -0
  98. package/cli/dist-bundle/{one-command-P6XVAXWV.js → one-command-VNKQAMFJ.js} +2 -2
  99. package/cli/dist-bundle/open-W3QX35R6.js +2 -0
  100. package/cli/dist-bundle/project-FW5LL2KM.js +2 -0
  101. package/cli/dist-bundle/project-templates-EYSQG2EO.js +2 -0
  102. package/cli/dist-bundle/{services-CBXN4SXC.js → services-RGTQ2LXC.js} +2 -2
  103. package/cli/dist-bundle/{stack-progress-6GO2TCRH.js → stack-progress-NIFM5T2K.js} +2 -2
  104. package/cli/dist-bundle/tilt-port-owner-6DO7OJRR.js +2 -0
  105. package/cli/dist-bundle/url-actions-HXJLBTX6.js +2 -0
  106. package/cli/package.json +5 -5
  107. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +2 -2
  108. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +2 -2
  109. package/cli/templates/.tiltignore.hbs +2 -2
  110. package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +1 -1
  111. package/cli/templates/TILT_TECH_STACK.star.hbs +1 -1
  112. package/cli/templates/Tiltfile.hbs +21 -21
  113. package/cli/templates/spec.master.hbs +4 -4
  114. package/examples/tdk-example/LICENSE +1 -1
  115. package/examples/tdk-example/Tiltfile +10 -10
  116. package/examples/tdk-example/services/platform/messaging/docker-compose.yml +7 -7
  117. package/examples/tdk-example/services/shop/orders-api/service.json +1 -1
  118. package/examples/tdk-example/services/shop/orders-api/src/index.ts +1 -1
  119. package/examples/tdk-example/services/shop/orders-app/index.html +1 -1
  120. package/examples/tdk-example/services/shop/orders-worker/service.json +1 -1
  121. package/examples/tdk-example/services/shop/orders-worker/src/index.ts +1 -1
  122. package/package.json +39 -12
  123. package/{Tiltfile → runtime/Tiltfile} +9 -5
  124. package/{discovery → runtime/discovery}/AGENTS.md +1 -1
  125. package/{discovery → runtime/discovery}/TILT_DISCOVERY.star +5 -5
  126. package/{discovery → runtime/discovery}/Tiltfile +5 -5
  127. package/{discovery → runtime/discovery}/config.star +5 -5
  128. package/{discovery → runtime/discovery}/constants.star +14 -14
  129. package/{discovery → runtime/discovery}/deterministic.star +1 -1
  130. package/{discovery → runtime/discovery}/discovery_daemon.star +2 -2
  131. package/{discovery → runtime/discovery}/discovery_orchestrator.star +17 -17
  132. package/{discovery → runtime/discovery}/identity-management-backend/service.yaml +2 -2
  133. package/{discovery → runtime/discovery}/incremental_discovery.star +1 -1
  134. package/{discovery → runtime/discovery}/json_manifest_scanner.star +2 -2
  135. package/{discovery → runtime/discovery}/libraries.star +1 -1
  136. package/{discovery → runtime/discovery}/manifest/constants.star +1 -1
  137. package/{discovery → runtime/discovery}/manifest/loading.star +7 -7
  138. package/{discovery → runtime/discovery}/manifest/normalize.star +12 -15
  139. package/{discovery → runtime/discovery}/registry.star +11 -11
  140. package/{discovery → runtime/discovery}/resource_snapshot.py +2 -2
  141. package/{discovery → runtime/discovery}/resource_snapshot.star +6 -6
  142. package/{discovery → runtime/discovery}/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +2 -2
  143. package/{engine → runtime/engine}/AGENTS.md +6 -6
  144. package/{engine → runtime/engine}/README.md +2 -2
  145. package/{engine → runtime/engine}/Tiltfile +5 -5
  146. package/{engine → runtime/engine}/assets/docker/golden-layers.Dockerfile +17 -17
  147. package/{engine → runtime/engine}/assets/docker/wake-gateway/Dockerfile +7 -0
  148. package/{engine → runtime/engine}/entrypoint.star +1 -1
  149. package/{engine → runtime/engine}/paths.star +5 -5
  150. package/{engine → runtime/engine}/schemas/project-schema.json +2 -2
  151. package/{engine → runtime/engine}/schemas/service-schema.json +5 -5
  152. package/{engine → runtime/engine}/scripts/debug-container.sh +3 -3
  153. package/{engine → runtime/engine}/spec.master +3 -3
  154. package/{engine → runtime/engine}/topologies/README.md +3 -3
  155. package/{engine → runtime/engine}/topologies/platform/docker/build/golden_image_build.star +5 -5
  156. package/{engine → runtime/engine}/topologies/platform/docker/build/golden_image_constants.star +7 -7
  157. package/{engine → runtime/engine}/topologies/platform/docker/build/golden_image_dockerfile.star +8 -8
  158. package/{engine → runtime/engine}/topologies/platform/docker/compose/compose.star +12 -12
  159. package/{engine → runtime/engine}/topologies/platform/docker/compose/traefik_standalone.star +21 -6
  160. package/{engine → runtime/engine}/topologies/platform/docker/config/healthcheck.star +7 -7
  161. package/{engine → runtime/engine}/topologies/platform/docker/constants.star +7 -7
  162. package/{engine → runtime/engine}/topologies/platform/docker/dockerfile/language_dockerfile.star +3 -3
  163. package/{engine → runtime/engine}/topologies/platform/docker/layers/l1_base_layers.star +5 -5
  164. package/{engine → runtime/engine}/topologies/platform/docker/layers/l2_dependency_layers.star +14 -14
  165. package/{engine → runtime/engine}/topologies/platform/docker/layers/l3_builder_layers.star +5 -5
  166. package/{engine → runtime/engine}/topologies/platform/docker/layers/l4_runtime_layers.star +8 -8
  167. package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/constants.star +5 -5
  168. package/{engine → runtime/engine}/topologies/platform/docker/networking/api_path_constants.star +5 -5
  169. package/{engine → runtime/engine}/topologies/platform/docker/networking/sablier_container_cycle.star +1 -1
  170. package/{engine → runtime/engine}/topologies/platform/docker/networking/traefik_static_routes.star +1 -1
  171. package/{engine → runtime/engine}/topologies/platform/docker/secrets/env_secrets.star +2 -2
  172. package/{engine → runtime/engine}/topologies/platform/docker/secrets/infisical.star +4 -4
  173. package/{engine → runtime/engine}/topologies/platform/registries/verdaccio_loader.star +1 -1
  174. package/{engine → runtime/engine}/topologies/platform/security/secrets.star +1 -1
  175. package/{engine → runtime/engine}/topologies/tilt/common/utils.star +9 -10
  176. package/{engine → runtime/engine}/topologies/tilt/common/utils_debug.star +1 -1
  177. package/{engine → runtime/engine}/topologies/tilt/common/utils_deterministic.star +2 -2
  178. package/{engine → runtime/engine}/topologies/tilt/common/utils_env.star +5 -5
  179. package/{engine → runtime/engine}/topologies/tilt/config/profiles.star +4 -4
  180. package/{engine → runtime/engine}/topologies/tilt/generators/agents_md.star +1 -1
  181. package/{engine → runtime/engine}/topologies/tilt/generators/infisical/README.md +1 -1
  182. package/{engine → runtime/engine}/topologies/tilt/generators/infisical/organization.star +6 -6
  183. package/{engine → runtime/engine}/topologies/tilt/generators/npmrc.star +5 -5
  184. package/{engine → runtime/engine}/topologies/tilt/generators/typescript/backend_tsconfig.star +1 -1
  185. package/{engine → runtime/engine}/topologies/tilt/generators/typescript/playwright_config.star +1 -1
  186. package/{engine → runtime/engine}/topologies/tilt/generators/vite/helpers.star +7 -7
  187. package/{engine → runtime/engine}/topologies/tilt/generators/vite/templates.star +5 -5
  188. package/{engine → runtime/engine}/topologies/tilt/manifest/json_to_yaml.py +2 -2
  189. package/{engine → runtime/engine}/topologies/tilt/manifest/loader.star +2 -2
  190. package/{engine → runtime/engine}/topologies/tilt/manifest/schema.star +1 -1
  191. package/{engine → runtime/engine}/topologies/tilt/manifest/yaml_to_json.py +1 -1
  192. package/{engine → runtime/engine}/topologies/tilt/resources/build_concurrency.star +3 -3
  193. package/{engine → runtime/engine}/topologies/tilt/resources/databases.star +7 -6
  194. package/{engine → runtime/engine}/topologies/tilt/resources/infra-loader.star +12 -12
  195. package/{engine → runtime/engine}/topologies/tilt/resources/libs_paths.star +1 -1
  196. package/{engine → runtime/engine}/topologies/tilt/resources/libs_resource_definition.star +2 -2
  197. package/{engine → runtime/engine}/topologies/tilt/resources/libs_setup.star +1 -1
  198. package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +36 -28
  199. package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +1 -1
  200. package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/frontend.star +5 -5
  201. package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +4 -4
  202. package/{engine → runtime/engine}/topologies/tilt/resources/watchers.star +20 -20
  203. package/{engine → runtime/engine}/where-things-live.star +5 -5
  204. package/{ext → runtime/ext}/Tiltfile +5 -5
  205. package/{ext → runtime/ext}/ide-components/code_viewer/server.py +1 -1
  206. package/{ext → runtime/ext}/ide-components/config_inspector/server.py +2 -2
  207. package/{ext → runtime/ext}/ide-components/file_browser/server.py +1 -1
  208. package/{ext → runtime/ext}/ide-components/shared/config_service.py +2 -2
  209. package/{ext → runtime/ext}/ide-components/shared/file_utils.py +2 -2
  210. package/{ext → runtime/ext}/ide-components/shared/http_utils.py +1 -1
  211. package/{ext → runtime/ext}/ide-components/shared/syntax_highlighter.py +1 -1
  212. package/{ext → runtime/ext}/ide-components/shared/template_engine.py +1 -1
  213. package/{ext → runtime/ext}/ide-components/shared/templates/base.html +1 -1
  214. package/{ext → runtime/ext}/ide-components/shared/tilt_integration.py +1 -1
  215. package/{ext → runtime/ext}/ui-enhancements/tiltfile.py +1 -1
  216. package/runtime/platform/services/platform/proxy/service.yaml +14 -0
  217. package/{shared-platform-engineering → runtime/shared-platform-engineering}/docker-templates/infisical-entrypoint.sh +2 -2
  218. package/{shared-platform-engineering → runtime/shared-platform-engineering}/docker-templates/install-deps.sh +2 -2
  219. package/cli/dist/commands/__tests__/project-e2e-helpers.js +0 -49
  220. package/cli/dist/commands/__tests__/ui-loading-screen.test.js +0 -16
  221. package/cli/dist/generator/__tests__/golden-helpers.js +0 -43
  222. package/cli/dist-bundle/chunk-42IVF3YT.js +0 -3
  223. package/cli/dist-bundle/chunk-AT5MFZ3D.js +0 -10
  224. package/cli/dist-bundle/chunk-BHWJU6HY.js +0 -2
  225. package/cli/dist-bundle/chunk-DWR3LLHS.js +0 -2
  226. package/cli/dist-bundle/chunk-GB6DJJ5N.js +0 -57
  227. package/cli/dist-bundle/chunk-ODYL6LET.js +0 -52
  228. package/cli/dist-bundle/chunk-YTXQPTCN.js +0 -35
  229. package/cli/dist-bundle/chunk-Z2C55UFP.js +0 -7
  230. package/cli/dist-bundle/cold-preflight-7PFKXNK7.js +0 -2
  231. package/cli/dist-bundle/colima-SVZX2UML.js +0 -2
  232. package/cli/dist-bundle/extension-fetch-6XNTDF44.js +0 -2
  233. package/cli/dist-bundle/native-windows-X5XVLFJS.js +0 -2
  234. package/cli/dist-bundle/open-VJZ7W4JR.js +0 -2
  235. package/cli/dist-bundle/project-QSH7LOWI.js +0 -2
  236. package/cli/dist-bundle/project-templates-JDRE7AVL.js +0 -2
  237. package/cli/dist-bundle/tilt-port-owner-SMN5SAQJ.js +0 -2
  238. package/cli/dist-bundle/url-actions-D6ROTHZG.js +0 -2
  239. package/discovery/test_resource_snapshot.py +0 -253
  240. package/engine/assets/docker/wake-gateway/decide.test.ts +0 -177
  241. package/engine/topologies/tilt/manifest/tests/test_integration.star +0 -278
  242. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +0 -475
  243. package/engine/topologies/tilt/manifest/tests/test_manifest.star +0 -319
  244. package/engine/topologies/tilt/manifest/tests/test_validator.star +0 -472
  245. package/ext/ide-components/shared/test_config_service.py +0 -328
  246. /package/cli/bin/{tdk.js → flisk.js} +0 -0
  247. /package/{discovery → runtime/discovery}/filtering.star +0 -0
  248. /package/{discovery → runtime/discovery}/identity-management-frontend/service.yaml +0 -0
  249. /package/{discovery → runtime/discovery}/identity-sdk/service.yaml +0 -0
  250. /package/{discovery → runtime/discovery}/indexing.star +0 -0
  251. /package/{discovery → runtime/discovery}/loading.star +0 -0
  252. /package/{discovery → runtime/discovery}/manifest/validation.star +0 -0
  253. /package/{discovery → runtime/discovery}/normalization.star +0 -0
  254. /package/{discovery → runtime/discovery}/schemas.star +0 -0
  255. /package/{discovery → runtime/discovery}/services/platform/cdc/debezium/nats-connector/service.yaml +0 -0
  256. /package/{discovery → runtime/discovery}/services/platform/cdc/nats-http-bridge/service.yaml +0 -0
  257. /package/{discovery → runtime/discovery}/services/platform/synthetic-monitor/service.yaml +0 -0
  258. /package/{discovery → runtime/discovery}/validation.star +0 -0
  259. /package/{discovery → runtime/discovery}/versioning.star +0 -0
  260. /package/{engine → runtime/engine}/REFACTORING_MANIFEST_SYSTEM.md +0 -0
  261. /package/{engine → runtime/engine}/assets/docker/wake-gateway/decide.ts +0 -0
  262. /package/{engine → runtime/engine}/assets/docker/wake-gateway/server.ts +0 -0
  263. /package/{engine → runtime/engine}/assets/scripts/cleanup-completed-migrator-images.sh +0 -0
  264. /package/{engine → runtime/engine}/assets/scripts/cleanup-tilt-images.sh +0 -0
  265. /package/{engine → runtime/engine}/assets/scripts/mac-m1-resource-monitor.sh +0 -0
  266. /package/{engine → runtime/engine}/config.star +0 -0
  267. /package/{engine → runtime/engine}/lifecycle/orchestrator.star +0 -0
  268. /package/{engine → runtime/engine}/scripts/README.md +0 -0
  269. /package/{engine → runtime/engine}/scripts/build-and-publish-lib.sh +0 -0
  270. /package/{engine → runtime/engine}/scripts/check-lib-publish.sh +0 -0
  271. /package/{engine → runtime/engine}/scripts/generate-manifest.sh +0 -0
  272. /package/{engine → runtime/engine}/spec.master.example +0 -0
  273. /package/{engine → runtime/engine}/topologies/platform/docker/AGENTS.md +0 -0
  274. /package/{engine → runtime/engine}/topologies/platform/docker/auth/auth.star +0 -0
  275. /package/{engine → runtime/engine}/topologies/platform/docker/build/frontend_build_plan.star +0 -0
  276. /package/{engine → runtime/engine}/topologies/platform/docker/build/golden_image.star +0 -0
  277. /package/{engine → runtime/engine}/topologies/platform/docker/compose/compose_helpers.star +0 -0
  278. /package/{engine → runtime/engine}/topologies/platform/docker/compose/unsafe_value.star +0 -0
  279. /package/{engine → runtime/engine}/topologies/platform/docker/config/bunignore.star +0 -0
  280. /package/{engine → runtime/engine}/topologies/platform/docker/config/dockerignore.star +0 -0
  281. /package/{engine → runtime/engine}/topologies/platform/docker/dockerfile/dockerfile.star +0 -0
  282. /package/{engine → runtime/engine}/topologies/platform/docker/generators/golden_docker_generator_v2.star +0 -0
  283. /package/{engine → runtime/engine}/topologies/platform/docker/index.star +0 -0
  284. /package/{engine → runtime/engine}/topologies/platform/docker/layers/bun_helpers.star +0 -0
  285. /package/{engine → runtime/engine}/topologies/platform/docker/layers/infisical/index.star +0 -0
  286. /package/{engine → runtime/engine}/topologies/platform/docker/layers/infisical/infisical_docker.star +0 -0
  287. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/db_readiness.star +0 -0
  288. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/filesystem_setup.star +0 -0
  289. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/migrate_script.star +0 -0
  290. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/prisma_build.star +0 -0
  291. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/prisma_runtime.star +0 -0
  292. /package/{engine → runtime/engine}/topologies/platform/docker/layers/prisma/secret_resolution.star +0 -0
  293. /package/{engine → runtime/engine}/topologies/platform/docker/networking/traefik.star +0 -0
  294. /package/{engine → runtime/engine}/topologies/platform/docker/networking/traefik_constants.star +0 -0
  295. /package/{engine → runtime/engine}/topologies/platform/docker/networking/traefik_helpers.star +0 -0
  296. /package/{engine → runtime/engine}/topologies/platform/net/AGENTS.md +0 -0
  297. /package/{engine → runtime/engine}/topologies/platform/net/proxy.star +0 -0
  298. /package/{engine → runtime/engine}/topologies/platform/registries/local.star +0 -0
  299. /package/{engine → runtime/engine}/topologies/platform/security/AGENTS.md +0 -0
  300. /package/{engine → runtime/engine}/topologies/platform/state/AGENTS.md +0 -0
  301. /package/{engine → runtime/engine}/topologies/platform/state/relational.star +0 -0
  302. /package/{engine → runtime/engine}/topologies/tilt/common/AGENTS.md +0 -0
  303. /package/{engine → runtime/engine}/topologies/tilt/common/utils_docker_networks.star +0 -0
  304. /package/{engine → runtime/engine}/topologies/tilt/common/utils_output.star +0 -0
  305. /package/{engine → runtime/engine}/topologies/tilt/config/AGENTS.md +0 -0
  306. /package/{engine → runtime/engine}/topologies/tilt/config/defaults.star +0 -0
  307. /package/{engine → runtime/engine}/topologies/tilt/config/feature_flags.star +0 -0
  308. /package/{engine → runtime/engine}/topologies/tilt/config/global.star +0 -0
  309. /package/{engine → runtime/engine}/topologies/tilt/generators/api_gateway.star +0 -0
  310. /package/{engine → runtime/engine}/topologies/tilt/generators/index.star +0 -0
  311. /package/{engine → runtime/engine}/topologies/tilt/generators/infisical/examples.star +0 -0
  312. /package/{engine → runtime/engine}/topologies/tilt/generators/infisical/index.star +0 -0
  313. /package/{engine → runtime/engine}/topologies/tilt/generators/infisical/machine_identity.star +0 -0
  314. /package/{engine → runtime/engine}/topologies/tilt/generators/infisical/path_manager.star +0 -0
  315. /package/{engine → runtime/engine}/topologies/tilt/generators/infisical/secrets_generator.star +0 -0
  316. /package/{engine → runtime/engine}/topologies/tilt/generators/nginx_conf.star +0 -0
  317. /package/{engine → runtime/engine}/topologies/tilt/generators/tsconfig.star +0 -0
  318. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/backend_library_tsconfig.star +0 -0
  319. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/common.star +0 -0
  320. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +0 -0
  321. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/frontend_tsconfig.star +0 -0
  322. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/include.star +0 -0
  323. /package/{engine → runtime/engine}/topologies/tilt/generators/typescript/prisma_config.star +0 -0
  324. /package/{engine → runtime/engine}/topologies/tilt/generators/validators.star +0 -0
  325. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/backend.star +0 -0
  326. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/lit.star +0 -0
  327. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/preact.star +0 -0
  328. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/qwik.star +0 -0
  329. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/react.star +0 -0
  330. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/solid.star +0 -0
  331. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/svelte.star +0 -0
  332. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/vanilla.star +0 -0
  333. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frameworks/vue.star +0 -0
  334. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/frontend.star +0 -0
  335. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/generators.star +0 -0
  336. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/library.star +0 -0
  337. /package/{engine → runtime/engine}/topologies/tilt/generators/vite/sdk.star +0 -0
  338. /package/{engine → runtime/engine}/topologies/tilt/generators/vite_config.star +0 -0
  339. /package/{engine → runtime/engine}/topologies/tilt/manifest/AGENTS.md +0 -0
  340. /package/{engine → runtime/engine}/topologies/tilt/manifest/README.md +0 -0
  341. /package/{engine → runtime/engine}/topologies/tilt/manifest/__init__.star +0 -0
  342. /package/{engine → runtime/engine}/topologies/tilt/manifest/constants.star +0 -0
  343. /package/{engine → runtime/engine}/topologies/tilt/manifest/errors.star +0 -0
  344. /package/{engine → runtime/engine}/topologies/tilt/manifest/integration.star +0 -0
  345. /package/{engine → runtime/engine}/topologies/tilt/manifest/mapper.star +0 -0
  346. /package/{engine → runtime/engine}/topologies/tilt/manifest/parser.star +0 -0
  347. /package/{engine → runtime/engine}/topologies/tilt/manifest/validator.star +0 -0
  348. /package/{engine → runtime/engine}/topologies/tilt/resources/AGENTS.md +0 -0
  349. /package/{engine → runtime/engine}/topologies/tilt/resources/conditions.star +0 -0
  350. /package/{engine → runtime/engine}/topologies/tilt/resources/declaration.star +0 -0
  351. /package/{engine → runtime/engine}/topologies/tilt/resources/deps.star +0 -0
  352. /package/{engine → runtime/engine}/topologies/tilt/resources/libs.star +0 -0
  353. /package/{engine → runtime/engine}/topologies/tilt/resources/libs_discovery.star +0 -0
  354. /package/{engine → runtime/engine}/topologies/tilt/resources/libs_tsconfig.star +0 -0
  355. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply.star +0 -0
  356. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +0 -0
  357. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply_resource_validation.star +0 -0
  358. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +0 -0
  359. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/builders/typescript.star +0 -0
  360. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +0 -0
  361. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +0 -0
  362. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +0 -0
  363. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/generators/env.star +0 -0
  364. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator/helpers.star +0 -0
  365. /package/{engine → runtime/engine}/topologies/tilt/resources/orchestrator.star +0 -0
  366. /package/{engine → runtime/engine}/topologies/tilt/resources/ordering.star +0 -0
  367. /package/{engine → runtime/engine}/topologies/tilt/resources/shared-platform-postgres.star +0 -0
  368. /package/{engine → runtime/engine}/topologies/tilt/resources/triggers.star +0 -0
  369. /package/{ext → runtime/ext}/ide-components/README.md +0 -0
  370. /package/{ext → runtime/ext}/ide-components/shared/static/styles.css +0 -0
  371. /package/{ext → runtime/ext}/ui-enhancements/cron-status-server.sh +0 -0
  372. /package/{ext → runtime/ext}/ui-enhancements/cron-status-tracker.sh +0 -0
  373. /package/{ext → runtime/ext}/ui-enhancements/extension.yaml +0 -0
  374. /package/{ext → runtime/ext}/ui-enhancements/ui/cron-jobs-tab.css +0 -0
  375. /package/{ext → runtime/ext}/ui-enhancements/ui/help-panel.css +0 -0
  376. /package/{ext → runtime/ext}/ui-enhancements/ui/icons.css +0 -0
  377. /package/{ext → runtime/ext}/ui-enhancements/ui/tooltips.css +0 -0
  378. /package/{shared-platform-engineering → runtime/shared-platform-engineering}/docker-templates/bun-hoisted-symlink-fix.sh +0 -0
  379. /package/{shared-platform-engineering → runtime/shared-platform-engineering}/docker-templates/prisma-bun-client-link-fix.sh +0 -0
  380. /package/{shared-platform-engineering → runtime/shared-platform-engineering}/docker-templates/prisma-normalize-client.sh +0 -0
  381. /package/{specs → runtime/specs}/specs/TILT_SERVICE_DEFAULTS.star +0 -0
  382. /package/{specs → runtime/specs}/specs/TILT_TECH_STACK.star +0 -0
@@ -0,0 +1,65 @@
1
+ // Copyright (c) 2026 Flisk Landscape contributors
2
+ // SPDX-License-Identifier: MIT
3
+ import { existsSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ // Directories that make up the Flisk Tilt extension, next to the root Tiltfile.
6
+ export const EXTENSION_DIRS = ["engine", "discovery", "specs", "ext"];
7
+ // Optional wrapper folder for a future layout that nests the extension directories.
8
+ const NESTED_RUNTIME_DIR = "runtime";
9
+ // Resolve one extension directory, preferring the nested layout and falling back to the
10
+ // current flat one, so callers keep working whichever layout a checkout or bundle uses.
11
+ export function resolveExtensionDir(sourceRoot, name) {
12
+ const nested = join(sourceRoot, NESTED_RUNTIME_DIR, name);
13
+ return existsSync(nested) ? nested : join(sourceRoot, name);
14
+ }
15
+ // The extension entry point sits at runtime/Tiltfile in a source checkout and at the bundle
16
+ // root in a packaged or vendored layout.
17
+ export function resolveTiltfile(sourceRoot) {
18
+ const nested = join(sourceRoot, NESTED_RUNTIME_DIR, "Tiltfile");
19
+ return existsSync(nested) ? nested : join(sourceRoot, "Tiltfile");
20
+ }
21
+ const SHARED_PLATFORM_DIR = "shared-platform-engineering";
22
+ // The Docker helper scripts `flisk project` copies into every project. Like the extension directories they
23
+ // sit under runtime/ in a source checkout and at the bundle root in a packaged layout.
24
+ export function resolveSharedPlatformDir(sourceRoot) {
25
+ const nested = join(sourceRoot, NESTED_RUNTIME_DIR, SHARED_PLATFORM_DIR);
26
+ return existsSync(nested) ? nested : join(sourceRoot, SHARED_PLATFORM_DIR);
27
+ }
28
+ // Checks that the Tiltfile and every extension directory come from one layout. The resolvers above pick each
29
+ // entry on its own, so a stale or half-migrated tree would otherwise combine nested and flat entries.
30
+ export function inspectExtensionLayout(sourceRoot) {
31
+ const entries = ["Tiltfile", ...EXTENSION_DIRS];
32
+ const nested = entries.filter((name) => existsSync(join(sourceRoot, NESTED_RUNTIME_DIR, name)));
33
+ const flat = entries.filter((name) => existsSync(join(sourceRoot, name)));
34
+ if (nested.length === 0 && flat.length === 0) {
35
+ return { ok: false, kind: "incomplete", missing: [...entries], mixed: [] };
36
+ }
37
+ if (nested.length === entries.length)
38
+ return { ok: true, kind: "nested", missing: [], mixed: [] };
39
+ if (nested.length === 0) {
40
+ const missing = entries.filter((name) => !flat.includes(name));
41
+ return missing.length === 0
42
+ ? { ok: true, kind: "flat", missing, mixed: [] }
43
+ : { ok: false, kind: "incomplete", missing, mixed: [] };
44
+ }
45
+ // Some entries are nested: the tree is meant to be nested, so a flat-only entry is a leftover.
46
+ const missing = entries.filter((name) => !nested.includes(name));
47
+ const mixed = missing.filter((name) => flat.includes(name));
48
+ return { ok: false, kind: mixed.length > 0 ? "mixed" : "incomplete", missing, mixed };
49
+ }
50
+ // One line naming what is wrong, for warnings and `flisk runtime --check-assets`.
51
+ export function describeLayoutProblems(sourceRoot, report = inspectExtensionLayout(sourceRoot)) {
52
+ if (report.ok)
53
+ return `${sourceRoot}: ${report.kind} layout`;
54
+ const parts = [];
55
+ if (report.kind === "mixed") {
56
+ parts.push(`mixes the nested ${NESTED_RUNTIME_DIR}/ layout with flat entries (${report.mixed.join(", ")} only at the root)`);
57
+ }
58
+ const absent = report.missing.filter((name) => !report.mixed.includes(name));
59
+ if (absent.length > 0)
60
+ parts.push(`is missing ${absent.join(", ")}`);
61
+ return `${sourceRoot} ${parts.join(" and ")}`;
62
+ }
63
+ export function hasExtensionLayout(sourceRoot) {
64
+ return inspectExtensionLayout(sourceRoot).ok;
65
+ }
@@ -1,6 +1,6 @@
1
1
  // Copyright (c) 2026 Flisk Landscape contributors
2
2
  // SPDX-License-Identifier: MIT
3
- import { relative } from "node:path";
3
+ import { relative, sep } from "node:path";
4
4
  import chalk from "chalk";
5
5
  import { formatCount } from "./formatting.js";
6
6
  import { SERVICE_MANIFEST_SCHEMA_VERSION } from "./service-manifest.js";
@@ -28,7 +28,8 @@ export function enforceSchemaVersionGate(projectRoot, options = {}, exit = proce
28
28
  const version = resource.config?.schemaVersion;
29
29
  if (version === undefined || version === SERVICE_MANIFEST_SCHEMA_VERSION)
30
30
  return [];
31
- const file = relative(projectRoot, resource.configPath) || resource.configPath;
31
+ const rel = relative(projectRoot, resource.configPath) || resource.configPath;
32
+ const file = rel.split(sep).join("/");
32
33
  return [
33
34
  `${file} schemaVersion ${JSON.stringify(version)}: this flisk supports ${SERVICE_MANIFEST_SCHEMA_VERSION}`,
34
35
  ];
@@ -12,7 +12,7 @@ export function getProjectName() {
12
12
  export function getProjectNameFor(root) {
13
13
  if (root) {
14
14
  try {
15
- const content = readFileSync(join(root, ".tdk", PROJECT_JSON), "utf-8");
15
+ const content = readFileSync(join(root, ".flisk", PROJECT_JSON), "utf-8");
16
16
  const parsed = JSON.parse(content);
17
17
  if (parsed?.project?.name) {
18
18
  return parsed.project.name;
@@ -20,11 +20,11 @@ export function getProjectNameFor(root) {
20
20
  }
21
21
  catch { }
22
22
  }
23
- return "tdk-project";
23
+ return "flisk-project";
24
24
  }
25
25
  export function resolveSubdomainBases(ingressPort, projectRoot) {
26
26
  const projectName = getProjectNameFor(projectRoot ?? findProjectRoot());
27
- const raw = process.env.TDK_SERVICE_BASE_URL ??
27
+ const raw = process.env.FLISK_SERVICE_BASE_URL ??
28
28
  `http://${projectName}.localhost${ingressPort ? `:${ingressPort}` : ""}`;
29
29
  try {
30
30
  const u = new URL(raw.includes("://") ? raw : `http://${raw}`);
@@ -168,9 +168,9 @@ export function discoverResourcesStrict(discovered) {
168
168
  }
169
169
  /**
170
170
  * Unique, sorted `stack` values across discovered service.json files under `projectRoot`.
171
- * Tilt's discovery groups services by this same field (see tdk-cli-extensions
171
+ * Tilt's discovery groups services by this same field (see flisk-cli-extensions
172
172
  * discovery_orchestrator.star), so these are the names that must appear in a
173
- * stack's `services` list in .tdk/project.json for that group to be enabled.
173
+ * stack's `services` list in .flisk/project.json for that group to be enabled.
174
174
  */
175
175
  export function discoverStackNames(projectRoot, resources) {
176
176
  const resourcesToScan = resources ?? discoverResourcesFromRoot(projectRoot);
@@ -33,10 +33,10 @@ export function groupSharedPostgres(projectName, stacks) {
33
33
  return null;
34
34
  return { name: "postgres", databases };
35
35
  }
36
- /** `project.name` from `.tdk/project.json`, or null when the project file is missing or unreadable. */
36
+ /** `project.name` from `.flisk/project.json`, or null when the project file is missing or unreadable. */
37
37
  export function readProjectName(projectRoot) {
38
38
  try {
39
- const parsed = JSON.parse(readFileSync(join(projectRoot, ".tdk", PROJECT_JSON), "utf-8"));
39
+ const parsed = JSON.parse(readFileSync(join(projectRoot, ".flisk", PROJECT_JSON), "utf-8"));
40
40
  return typeof parsed?.project?.name === "string" ? parsed.project.name : null;
41
41
  }
42
42
  catch {
@@ -26,7 +26,7 @@ export function isSharedPlatformPostgresDependency(name) {
26
26
  }
27
27
  function readProjectJson(projectRoot) {
28
28
  try {
29
- return JSON.parse(readFileSync(join(projectRoot, ".tdk", PROJECT_JSON), "utf-8"));
29
+ return JSON.parse(readFileSync(join(projectRoot, ".flisk", PROJECT_JSON), "utf-8"));
30
30
  }
31
31
  catch {
32
32
  return undefined;
@@ -67,14 +67,14 @@ function parseStarlarkStringList(source, name) {
67
67
  }
68
68
  }
69
69
  function tiltfileAlwaysEnabledInfra(projectRoot) {
70
- const path = join(projectRoot, ".tdk", ".tdk-out", "Tiltfile");
70
+ const path = join(projectRoot, ".flisk", ".flisk-out", "Tiltfile");
71
71
  const text = readTextIfExists(path);
72
72
  if (!text)
73
73
  return undefined;
74
74
  return parseStarlarkStringList(text, "ALWAYS_ENABLED_INFRA");
75
75
  }
76
76
  function specMasterHasDatabaseManagement(projectRoot) {
77
- const path = join(projectRoot, ".tdk", ".tdk-out", "spec.master");
77
+ const path = join(projectRoot, ".flisk", ".flisk-out", "spec.master");
78
78
  const text = readTextIfExists(path);
79
79
  if (text === undefined)
80
80
  return undefined;
@@ -82,11 +82,11 @@ function specMasterHasDatabaseManagement(projectRoot) {
82
82
  return /"database-management"\s*:\s*True/.test(text);
83
83
  }
84
84
  function generatedDefaultFocusEnablesDatabaseManagement(projectRoot) {
85
- const output = join(projectRoot, ".tdk", ".tdk-out");
85
+ const output = join(projectRoot, ".flisk", ".flisk-out");
86
86
  const tiltfile = readTextIfExists(join(output, "Tiltfile"));
87
87
  const spec = readTextIfExists(join(output, "spec.master"));
88
- const config = readTextIfExists(join(output, "tdk-cli-ext", "discovery", "config.star"));
89
- const profiles = readTextIfExists(join(output, "tdk-cli-ext", "engine", "topologies", "tilt", "config", "profiles.star"));
88
+ const config = readTextIfExists(join(output, "flisk-cli-ext", "discovery", "config.star"));
89
+ const profiles = readTextIfExists(join(output, "flisk-cli-ext", "engine", "topologies", "tilt", "config", "profiles.star"));
90
90
  if (!tiltfile || !spec || !config || !profiles)
91
91
  return false;
92
92
  const preAlpha = spec.match(/PRE_ALPHA_RESOURCES\s*=\s*\{([^}]*)\}/)?.[1];
@@ -10,7 +10,7 @@ import { join } from "node:path";
10
10
  * implementation - available by default on macOS and Linux.
11
11
  */
12
12
  export function extractTarball(data, destDir) {
13
- const tempDir = mkdtempSync(join(tmpdir(), "tdk-ext-"));
13
+ const tempDir = mkdtempSync(join(tmpdir(), "flisk-ext-"));
14
14
  const tmpFile = join(tempDir, "bundle.tar.gz");
15
15
  writeFileSync(tmpFile, data);
16
16
  mkdirSync(destDir, { recursive: true });
@@ -54,7 +54,7 @@ export function getTiltfilePath() {
54
54
  if (!projectRoot) {
55
55
  throw errorFactories.notInProject();
56
56
  }
57
- return join(projectRoot, ".tdk", ".tdk-out", "Tiltfile");
57
+ return join(projectRoot, ".flisk", ".flisk-out", "Tiltfile");
58
58
  }
59
59
  function addTiltfilePath(args) {
60
60
  const tiltfilePath = getTiltfilePath();
@@ -91,7 +91,7 @@ export function evaluateTiltReadiness(jsonText, deferred, expected) {
91
91
  * with an errored resource, or at the deadline. Sablier-deferred resources are excluded: they stay idle by design.
92
92
  */
93
93
  export async function waitForTiltResourcesReady(port, options = {}) {
94
- const timeoutMs = options.timeoutMs ?? Number(process.env.TDK_UP_READY_TIMEOUT_MS ?? 900_000);
94
+ const timeoutMs = options.timeoutMs ?? Number(process.env.FLISK_UP_READY_TIMEOUT_MS ?? 900_000);
95
95
  const intervalMs = options.intervalMs ?? 2_000;
96
96
  const fetchJson = options.fetchJson ?? tiltGetUiResources;
97
97
  const deferred = options.deferred ?? getDeferredResourceNames();
@@ -6,7 +6,7 @@ import { parsePublishedPortHolders, probeHostPort } from "./doctor-runtime.js";
6
6
  import { findProjectRoot } from "./paths.js";
7
7
  import { getProjectName } from "./service-urls.js";
8
8
  import { findOnPath } from "./which.js";
9
- const WINDOWS_DNS_FAILURE = "Windows did not resolve *.tdk.localhost to 127.0.0.1. Browser URLs with hostnames will fail until you fix hosts or use the 127.0.0.1 URLs printed by flisk networks.";
9
+ const WINDOWS_DNS_FAILURE = "Windows did not resolve *.flisk.localhost to 127.0.0.1. Browser URLs with hostnames will fail until you fix hosts or use the 127.0.0.1 URLs printed by flisk networks.";
10
10
  function loopbackAddresses(addresses) {
11
11
  return (addresses.length > 0 &&
12
12
  addresses.every((address) => address === "127.0.0.1" || address === "::1"));
@@ -138,7 +138,7 @@ export async function checkWindowsHostConfiguration() {
138
138
  }
139
139
  }
140
140
  let dnsOk = true;
141
- for (const host of ["tdk.localhost", "example.tdk.localhost"]) {
141
+ for (const host of ["flisk.localhost", "example.flisk.localhost"]) {
142
142
  try {
143
143
  const records = await lookup(host, { all: true, verbatim: true });
144
144
  if (!loopbackAddresses(records.map((record) => record.address)))
@@ -149,7 +149,7 @@ export async function checkWindowsHostConfiguration() {
149
149
  }
150
150
  }
151
151
  if (!dnsOk) {
152
- warnings.push(`${WINDOWS_DNS_FAILURE}\nAdd these lines to C:\\Windows\\System32\\drivers\\etc\\hosts (Administrator Notepad):\n127.0.0.1 tdk.localhost\n127.0.0.1 example.tdk.localhost`);
152
+ warnings.push(`${WINDOWS_DNS_FAILURE}\nAdd these lines to C:\\Windows\\System32\\drivers\\etc\\hosts (Administrator Notepad):\n127.0.0.1 flisk.localhost\n127.0.0.1 example.flisk.localhost`);
153
153
  }
154
154
  try {
155
155
  const autocrlf = execFileSync("git", ["config", "core.autocrlf"], {
@@ -1,2 +1,2 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
2
  import{execFileSync as a,spawnSync as c}from"node:child_process";import{existsSync as s}from"node:fs";import{join as l}from"node:path";var u=()=>({env:process.env,dockerAnswers:()=>{try{return a("docker",["info","--format","{{.ServerVersion}}"],{encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}),!0}catch{return!1}},run:(t,e)=>{let n=c(t,e,{encoding:"utf-8",timeout:2e4,stdio:["ignore","pipe","pipe"]});return`${n.stdout??""}${n.stderr??""}`},exists:s,home:process.env.HOME??""});function m(t=u()){let e=t.env.DOCKER_HOST??"";if(e.includes(".colima"))return!0;let n=l(t.home,".colima","default","docker.sock");return t.exists(n)&&e.includes("docker.sock")===!1&&e!==""}function p(t=u()){if(!m(t))return{isColima:!1,running:!0};let e="";try{e=t.run("colima",["status"])}catch(n){let i=String(n?.stderr??n);return/rosetta|native arch/i.test(i)?{isColima:!0,running:!1,problem:"Lima is installed as an x86_64 build, so it cannot start the Colima VM on this Mac",fix:"Install a native Lima (brew reinstall lima, or use a native limactl on PATH) and run `colima start`"}:t.dockerAnswers()?{isColima:!0,running:!0,problem:"The Colima VM is running, but the colima CLI on this PATH cannot see it",fix:"Use a native limactl (a Rosetta x86_64 limactl cannot talk to the VM): brew reinstall lima, or put a native limactl first on PATH"}:/not running/i.test(i)?{isColima:!0,running:!1,problem:"The Colima VM is not running",fix:"Run `colima start`"}:{isColima:!0,running:!1,problem:"The state of the Colima VM could not be read",fix:"Run `colima status` to see what it says"}}return/is running/i.test(e)?{isColima:!0,running:!0,arch:/arch:\s*(\S+)/.exec(e)?.[1]}:t.dockerAnswers()?{isColima:!0,running:!0,problem:"The Colima VM is running, but the colima CLI on this PATH cannot see it",fix:"Use a native limactl (a Rosetta x86_64 limactl cannot talk to the VM): brew reinstall lima, or put a native limactl first on PATH"}:{isColima:!0,running:!1,problem:"The Colima VM is not running",fix:"Run `colima start`"}}function g(t,e){if(t.isColima){if(t.problem&&/x86_64|rosetta|native arch|cannot see it/i.test(t.problem))return"native-lima";if(!t.running)return"start";if(!e)return"restart"}}function C(t=process.env){let e=t.HOME??"",n=["/opt/homebrew/bin",e?`${e}/.local/bin`:"",e?`${e}/bin`:""].filter(Boolean);for(let i of n){let r=l(i,"limactl");try{if(!s(r))continue;let o="";try{o=a("file",["-bL",r],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]})}catch{return i}if(/arm64|aarch64/i.test(o))return i}catch{}}}export{m as a,p as b,g as c,C as d};
@@ -0,0 +1,54 @@
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{c as se,e as ie}from"./chunk-K6SOCO6V.js";import{a as oe}from"./chunk-TZNXL3IO.js";import{T as te,U as ne,ca as K,ga as re,u as G}from"./chunk-VRESY4NR.js";import{b as Q,f as w,g as k,i as Z,j as I,k as C,l as U,m as ee,n as F,s as u,t as M}from"./chunk-BB5BZ37Y.js";import{a as O}from"./chunk-KJZUBHLO.js";import{appendFileSync as Te,existsSync as H,mkdirSync as _e,readFileSync as be,writeFileSync as ae}from"node:fs";import{dirname as ve,resolve as x}from"node:path";function _t(t,e,n){for(let[r,s]of e.entries())console.log(Q.blue(`${s.emoji} ${s.description}...`)),s.type==="json"?xe(t,s.filename,s.content):Ie(t,s.filename,String(s.content)),n&&n(s,r,e.length)}function we(t,e,n=2){let r=`${JSON.stringify(e,null,n)}
3
+ `;ae(t,r,"utf-8")}function xe(t,e,n,r=2){let s=x(t,e);we(s,n,r)}function q(t,e){ae(t,e,"utf-8")}function Ie(t,e,n){let r=x(t,e);q(r,n)}function bt(t){H(t)||_e(t,{recursive:!0})}var Fe=[".env",".flisk/.flisk-out/",".flisk/.project-id",".flisk/smoke/","node_modules/"];function Re(t){let e=x(t,".gitignore"),n=H(e)?be(e,"utf-8"):"",r=new Set(n.split(`
4
+ `).map(d=>d.trim().replace(/\/$/,""))),s=Fe.filter(d=>!r.has(d.replace(/\/$/,"")));if(s.length===0)return[];let l=n&&!n.endsWith(`
5
+ `)?`
6
+ `:"";return Te(e,`${l}${n?`
7
+ # Flisk (generated files and secrets)
8
+ `:`# Flisk (generated files and secrets)
9
+ `}${s.join(`
10
+ `)}
11
+ `),s}function Ae(t){let e=x(t);for(;;){if(H(x(e,".git")))return!0;let n=ve(e);if(n===e)return!1;e=n}}function vt(t){if(Ae(t))try{Re(t);return}catch(e){let n=e instanceof Error?e.message:String(e);return`Could not add .flisk/smoke/ to ${x(t,".gitignore")}: ${n}. Git may track the smoke response records.`}}import*as a from"node:fs";import*as i from"node:path";import{fileURLToPath as Ye}from"node:url";import b from"handlebars";var $e="1.0.0",De={runtime:"bun",bundler:"vite",language:"typescript",framework:"hono",database:"postgresql",orm:"prisma",messaging:"nats",linting:"biome",testing:"vitest"},Pe={frontend:{base:u.frontend.base,range:u.frontend.range,start:u.frontend.min,end:u.frontend.max},backend:{base:u.backend.base,range:u.backend.range,start:u.backend.min,end:u.backend.max},health:{base:u.health.base,range:u.health.range,start:u.health.min,end:u.health.max},worker:{base:u.worker.base,range:u.worker.range,start:u.worker.min,end:u.worker.max},migrator:{base:u.migrator.base,range:u.migrator.range,start:u.migrator.min,end:u.migrator.max},tiltUi:M.tiltUi,traefik:M.traefik},je={path:"/health",live:"/health/live",ready:"/health/ready",timeout:30,interval:5},Le={frontend:"-frontend",backend:"-backend",worker:"-worker",migrator:"-migrator",library:"-lib",sdk:"-sdk",validSeparators:["-","_"],maxLength:63,minLength:3},Ne={entrypoint:"web",network:"traefik-public",defaultHost:"localhost",appHost:"app.localhost",apiHost:"api.localhost",appSubdomainPrefix:"app",apiSubdomainPrefix:"api",defaultPort:8080,tlsEnabled:!1,entrypoints:["web"],middlewares:[],tls:{enabled:!1},healthcheckPath:"/health",healthcheckInterval:"10s",healthcheckTimeout:"5s",frontendPriorityBase:100},Oe=["node_modules","dist","build",".git",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests"],Ce={frontend:{suffix:"-frontend",portRange:"3000-3999"},backend:{suffix:"-backend",portRange:"4000-4999"},library:{suffix:"-library",portRange:null},sdk:{suffix:"-sdk",portRange:"3000-9999"},migrator:{suffix:"-migrator",portRange:"7000-7999"},worker:{suffix:"-worker",portRange:"6000-6999"}},Ue={prisma:"Database ORM with migrations",nats:"Event streaming via NATS",redis:"Caching layer",infisical:"Secrets management",vitest:"Testing framework",traefik:"HTTP routing",websocket:"Real-time connections",graphql:"GraphQL support",grpc:"gRPC support",viteNode:"Vite Node runtime",maintenance:"Maintenance mode"},Me={services:"services/product",sharedPlatform:"shared-platform-engineering",sharedProduct:"shared-product-engineering",sharedDdd:"shared-ddd-layers"},Ge={scanIntervalSeconds:5,maxManifestsPerRoot:50,servicePatterns:["services/product/*","services/platform/*"]},Ke={dockerfile:"Dockerfile",context:"."},He={backend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}},frontend:{command:"bun",args:["run","dev"],env:{NODE_ENV:"development"}}},S={version:$e,tech:De,ports:Pe,health:je,naming:Le,traefik:Ne,filewatchIgnores:Oe,serviceTypes:Ce,features:Ue,paths:Me,discovery:Ge,docker:Ke,runtime:He};import{existsSync as qe,lstatSync as Ve}from"node:fs";import{isAbsolute as le,normalize as D,relative as We,sep as ce}from"node:path";var $t=[`${I}/**`,".flisk/.flisk-out/**","Tiltfile","TILT_*.star",k,`${F} (create only)`,"shared-platform-engineering/docker-templates/**","services/platform/database-management/docker-compose.yml","product_autogenerated_resource_manifests/**","product_autogenerated_services_list/**"];function Je(t){let e=D(t).split(ce).join("/");return le(t)||e===".."||e.startsWith("../")?!1:e.split("/").includes(I)||e.startsWith(".flisk/.flisk-out/")||e==="shared-platform-engineering/docker-templates"||e.startsWith("shared-platform-engineering/docker-templates/")||e.startsWith("product_autogenerated_resource_manifests/")||e.startsWith("product_autogenerated_services_list/")?!0:e==="Tiltfile"||/^TILT_[^/]+\.star$/.test(e)||e===k||e===F||e==="services/platform/database-management/docker-compose.yml"}function _(t,e){let n=le(e)?D(e):D(`${t}/${e}`),r=We(t,n).split(ce).join("/");if(!Je(r))throw new Error(`Refusing to write outside Flisk's generated-file allowlist: ${r}`);let s=t;for(let l of r.split("/"))if(s=D(`${s}/${l}`),qe(s)&&Ve(s).isSymbolicLink())throw new Error(`Refusing to write through a symbolic link in generated path: ${r}`);return n}import{existsSync as R}from"node:fs";import{join as E}from"node:path";var V=["engine","discovery","specs","ext"],A="runtime";function pe(t,e){let n=E(t,A,e);return R(n)?n:E(t,e)}function de(t){let e=E(t,A,"Tiltfile");return R(e)?e:E(t,"Tiltfile")}var fe="shared-platform-engineering";function W(t){let e=E(t,A,fe);return R(e)?e:E(t,fe)}function P(t){let e=["Tiltfile",...V],n=e.filter(o=>R(E(t,A,o))),r=e.filter(o=>R(E(t,o)));if(n.length===0&&r.length===0)return{ok:!1,kind:"incomplete",missing:[...e],mixed:[]};if(n.length===e.length)return{ok:!0,kind:"nested",missing:[],mixed:[]};if(n.length===0){let o=e.filter(d=>!r.includes(d));return o.length===0?{ok:!0,kind:"flat",missing:o,mixed:[]}:{ok:!1,kind:"incomplete",missing:o,mixed:[]}}let s=e.filter(o=>!n.includes(o)),l=s.filter(o=>r.includes(o));return{ok:!1,kind:l.length>0?"mixed":"incomplete",missing:s,mixed:l}}function J(t,e=P(t)){if(e.ok)return`${t}: ${e.kind} layout`;let n=[];e.kind==="mixed"&&n.push(`mixes the nested ${A}/ layout with flat entries (${e.mixed.join(", ")} only at the root)`);let r=e.missing.filter(s=>!e.mixed.includes(s));return r.length>0&&n.push(`is missing ${r.join(", ")}`),`${t} ${n.join(" and ")}`}function j(t){return P(t).ok}var Be={[w]:{name:w,description:"Generate and load the stack-level PostgreSQL docker-compose file",generatedFiles:["services/platform/database-management/docker-compose.yml"]}};function ue(t,e){return Be[e]?["pre_alpha","alpha","beta"].some(n=>t[n]?.enabledStacks?.includes(e)):!1}var Xe=Ye(new URL("../dist/generator/template-engine.js",import.meta.url).href),B=i.dirname(Xe);function $(t){let e=[i.join(B,"..","..","templates"),i.join(B,"..","templates"),i.join(B,"..","..","..","templates"),i.join(process.cwd(),"node_modules","@flisk-sh","flisk","templates"),i.join(i.dirname(process.execPath),"flisk-cli","cli","templates")],n=[];for(let r of e){let s=i.join(r,t);n.push(s);try{return a.readFileSync(s,"utf-8")}catch{}}throw new Error(`Failed to load template ${t} from any of these paths: ${n.join(", ")}`)}var Y=null;function ze(){return Y||(Y={[k]:$(".tiltignore.hbs"),[U]:$("TILT_RESOURCE_DEFAULTS.star.hbs"),[C]:$("TILT_TECH_STACK.star.hbs"),Tiltfile:$("Tiltfile.hbs"),"spec.master":$("spec.master.hbs")}),Y}var Qe={proxy:"Traefik reverse proxy",verdaccio:"Private npm registry","database-management":"PostgreSQL database"},Ze={monitoring:"Signoz, SkyWalking (RAM intensive)",elk:"Elasticsearch/Logstash/Kibana",debezium:"CDC with Kafka/Zookeeper",golden_image:"Golden image rebuild (one-time)",verdaccio:"Premium local npm registry"},ge=["TILT_TECH_STACK.star","TILT_RESOURCE_DEFAULTS.star","spec.master","Tiltfile",".tiltignore"],L=class{templatesDir;constructor(e){let n=O("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||i.dirname(new URL(new URL("../dist/generator/template-engine.js",import.meta.url).href).pathname);this.templatesDir=e||i.join(n,"..","..","templates"),this.registerHelpers()}quoteStarlarkString(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}formatStarlarkValue(e){return e==null?"None":typeof e=="string"?this.quoteStarlarkString(e):typeof e=="boolean"?e?"True":"False":typeof e=="number"?String(e):Array.isArray(e)?`[${e.map(r=>this.formatStarlarkValue(r)).join(", ")}]`:typeof e=="object"?`{${Object.entries(e).map(([r,s])=>`${this.quoteStarlarkString(r)}: ${this.formatStarlarkValue(s)}`).join(", ")}}`:String(e)}registerHelpers(){b.registerHelper("starlark",e=>new b.SafeString(this.formatStarlarkValue(e))),b.registerHelper("starlarkArray",e=>{if(!Array.isArray(e))return new b.SafeString("[]");let n=e.map(r=>this.formatStarlarkValue(r));return new b.SafeString(`[${n.join(", ")}]`)}),b.registerHelper("json",e=>JSON.stringify(e))}buildContext(e){return{version:S.version,tech:S.tech,ports:S.ports,health:S.health,naming:S.naming,traefik:S.traefik,filewatchIgnores:[...S.filewatchIgnores],serviceTypes:S.serviceTypes,paths:S.paths,discovery:{scanIntervalSeconds:S.discovery.scanIntervalSeconds,maxManifestsPerRoot:S.discovery.maxManifestsPerRoot,paths:e.discovery.paths},docker:S.docker,runtime:S.runtime,project:e.project,phases:et(e.phases),alwaysEnabledInfra:e.always_enabled_infra??[...oe],optionalInfra:e.optional_infra,serviceDescriptions:Qe,infraDescriptions:Ze}}loadTemplate(e){let n=i.join(this.templatesDir,`${e}.hbs`),r=a.existsSync(n)?a.readFileSync(n,"utf-8"):ze()[e];if(!r)throw new Error(`Template not found: ${n}`);return b.compile(r)}generateTechStack(e){return this.loadTemplate(C)(e)}generateServiceDefaults(e){return this.loadTemplate(U)(e)}generateSpecMaster(e){return this.loadTemplate("spec.master")(e)}generateTiltfile(e){return this.loadTemplate("Tiltfile")(e)}generateTiltIgnore(e){return this.loadTemplate(".tiltignore")(e)}generateAll(e){let n=this.buildContext(e);return{"TILT_TECH_STACK.star":this.generateTechStack(n),"TILT_RESOURCE_DEFAULTS.star":this.generateServiceDefaults(n),"spec.master":this.generateSpecMaster(n),Tiltfile:this.generateTiltfile(n),".tiltignore":this.generateTiltIgnore(n)}}};function et(t){let e={...t};for(let n of Object.keys(e))e[n]={...e[n],enabledStacks:Array.from(new Set(e[n].enabledStacks))};return e}function tt(t){return t.replace(/-/g,"_")}function nt(t){let e=tt(t.project.name||"flisk_project");return`###############################################################################
12
+ # SYSTEM-GENERATED - DO NOT EDIT
13
+ # Stack feature: database-management
14
+ # Source: .flisk/project.json phases.*.enabledStacks includes "database-management"
15
+ # Regenerate with: flisk config regenerate
16
+ ###############################################################################
17
+
18
+ services:
19
+ postgres:
20
+ image: postgres:16-alpine
21
+ container_name: ${e}_postgres
22
+ restart: unless-stopped
23
+ environment:
24
+ POSTGRES_USER: ${e}
25
+ POSTGRES_PASSWORD: \${DB_PASSWORD}
26
+ POSTGRES_DB: postgres
27
+ ports:
28
+ - "\${FLISK_BIND_ADDRESS:-127.0.0.1}:\${FLISK_POSTGRES_PORT:-15432}:5432"
29
+ volumes:
30
+ - ${e}_postgres_data:/var/lib/postgresql/data
31
+ networks:
32
+ - database
33
+ healthcheck:
34
+ test: ["CMD-SHELL", "pg_isready -U ${e} -d postgres"]
35
+ interval: 5s
36
+ timeout: 5s
37
+ retries: 20
38
+
39
+ networks:
40
+ database:
41
+ name: ${e}_database
42
+ external: true
43
+
44
+ volumes:
45
+ ${e}_postgres_data:
46
+ `}function me(t,e){if(!t||typeof t!="object")return!1;let n=t;for(let r of["pre_alpha","alpha","beta","out_of_scope"]){let s=n[r];if(!s||typeof s!="object"||!Array.isArray(s[e]))return!1}return!0}function rt(t){if(!t||typeof t!="object")return null;let e=t;if(typeof e.version!="string"||!e.project||typeof e.project!="object")return null;let n=e.project;if(typeof n.name!="string"||typeof n.version!="string")return null;let r=null;if(me(e.phases,"enabledStacks"))r=e.phases;else if(me(e.stacks,"services")){let o=e.stacks;r={pre_alpha:{name:o.pre_alpha.name,description:o.pre_alpha.description,enabledStacks:o.pre_alpha.services},alpha:{name:o.alpha.name,description:o.alpha.description,enabledStacks:o.alpha.services},beta:{name:o.beta.name,description:o.beta.description,enabledStacks:o.beta.services},out_of_scope:{name:o.out_of_scope.name,description:o.out_of_scope.description,enabledStacks:o.out_of_scope.services}}}if(!r||!e.optional_infra||typeof e.optional_infra!="object")return null;let s=e.optional_infra;if(typeof s.monitoring!="boolean"||typeof s.elk!="boolean"||typeof s.debezium!="boolean"||typeof s.golden_image!="boolean"||typeof s.verdaccio!="boolean"||!e.discovery||typeof e.discovery!="object")return null;let l=e.discovery;return Array.isArray(l.paths)?{version:e.version,project:e.project,phases:r,always_enabled_infra:e.always_enabled_infra,optional_infra:e.optional_infra,discovery:e.discovery,overrides:e.overrides}:null}var X=class extends Error{};function Se(t){let e=i.join(t,".flisk",ee),n;try{n=a.readFileSync(e,"utf-8")}catch(l){if(l?.code==="ENOENT")throw new X(`Project config not found: ${e}. Run 'flisk project --yes' first.`);let o=l instanceof Error?l.message:String(l);throw new Error(`Could not read project.json at ${e}: ${o}`)}let r;try{r=JSON.parse(n)}catch(l){let o=l instanceof Error?l.message:String(l);throw new Error(`Could not parse project.json at ${e}: ${o}`)}let s=rt(r);if(!s)throw new Error("Invalid project.json: missing or invalid required fields. Expected: version (string), project (object with name/version), phases (object with pre_alpha/alpha/beta/out_of_scope enabledStacks), optional_infra (object with boolean flags), discovery (object with paths array)");return s}async function st(t){let e=re(t).filter(r=>r.config?.sablier?.enable===!0);e.length===0||await ie(t)||console.warn(`\u26A0\uFE0F Sablier (on-demand scaling) is a Premium feature - no valid license key found. ${e.length} resource${e.length===1?" has":"s have"} a \`sablier\` block, but it will have no effect without a license. Set FLISK_LICENSE_KEY to a key that grants it, or remove the \`sablier\` block from the affected service.json file(s) to silence this warning.`)}function it(t,e){let n=_(t,F);if(a.existsSync(n))return!1;let r={name:e.project.name||i.basename(t),version:e.project.version||"1.0.0",private:!0,type:"module",workspaces:e.discovery.paths};return q(n,`${JSON.stringify(r,null,2)}
47
+ `),!0}async function zt(t,e={}){let n=Se(t),r=K(t).flatMap(p=>te(p,i.relative(t,p).split(i.sep).join("/")));if(r.length>0)throw new Error(`Refusing to generate config from unsafe service.json values:
48
+ ${r.map(p=>` ${p}`).join(`
49
+ `)}`);await st(t),it(t,n)&&!e.quiet&&console.log("\u2713 Generated: package.json (workspace root)");let s=Object.values(n.phases).some(p=>p.enabledStacks.includes("verdaccio"));(n.optional_infra.verdaccio||s)&&(await se(t)||console.warn("\u26A0\uFE0F Verdaccio is a Premium feature - no valid license key found. It's enabled in this project's config, but will have no effect without a license. Set FLISK_LICENSE_KEY to a key that grants it, or run `flisk config disable-infra verdaccio` to silence this warning."));let l=i.join(t,".flisk",".flisk-out");a.existsSync(l)||a.mkdirSync(l,{recursive:!0});let d=new L().generateAll(n);for(let p of ge){let m=d[p],v=_(t,i.join(".flisk",".flisk-out",p));G(v,m),e.quiet||console.log(`\u2713 Generated: .flisk/.flisk-out/${p}`)}if(ue(n.phases,w)){let p=_(t,i.join("services","platform",w,Z)),m=i.dirname(p);a.mkdirSync(m,{recursive:!0}),G(p,nt(n)),e.quiet||console.log("\u2713 Generated: services/platform/database-management/docker-compose.yml")}let f=i.join(l,k),c=_(t,k);if(a.existsSync(f)){if(!a.existsSync(c))a.copyFileSync(f,c),e.quiet||console.log("\u2713 Copied: .tiltignore \u2192 project root");else if(e.discardHandEdits){let p=a.readFileSync(c,"utf-8");p.includes(Ee)&&p!==a.readFileSync(f,"utf-8")&&(a.copyFileSync(f,c),e.quiet||console.log("\u2713 Restored: .tiltignore \u2192 project root (hand edits discarded)"))}}let h=dt(t);if(!e.quiet)for(let p of h)console.log(`\u2713 Copied: ${p} \u2192 project root`);await ut(t,{quiet:e.quiet}),e.quiet||(console.log(""),console.log("\u{1F4A1} To start Tilt: flisk up"))}var ot=/\.(?:test|spec)\.[cm]?[jt]sx?$/;function ke(t){return ot.test(t)}function ye(t){if(a.existsSync(t))for(let e of a.readdirSync(t,{withFileTypes:!0})){let n=i.join(t,e.name);e.isDirectory()?ye(n):ke(n)&&a.rmSync(n,{force:!0})}}var at=V,lt=[["shared-platform-engineering","docker-templates"]],ct=["install-deps.sh","bun-hoisted-symlink-fix.sh","prisma-bun-client-link-fix.sh","prisma-normalize-client.sh"];function ft(){let t=O("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let e=0;e<6;e++){if(j(t))return t;let n=i.dirname(t);if(n===t)break;t=n}return null}function he(t){return a.existsSync(i.join(W(t),"docker-templates"))}function pt(){let t=O("node:url").fileURLToPath(new URL("../dist/generator",import.meta.url))||process.cwd();for(let r=0;r<8;r++){if(he(t))return t;let s=i.dirname(t);if(s===t)break;t=s}let e=i.dirname(process.execPath);return[i.join(e,"flisk-cli"),i.join(process.cwd(),"node_modules","@flisk-sh","flisk")].find(he)??null}function dt(t){let e=pt(),n=[];if(!e)return console.warn("\u26A0\uFE0F Flisk runtime assets not found - generated Dockerfiles may fail. Reinstall or upgrade Flisk, then re-run `flisk project`."),n;for(let r of lt){let s=i.join(W(e),...r.slice(1)),l=_(t,i.join(...r));a.existsSync(s)&&(a.mkdirSync(i.dirname(l),{recursive:!0}),a.cpSync(s,l,{recursive:!0}),n.push(r.join("/")))}for(let r of ct){let s=i.join(t,"shared-platform-engineering","docker-templates",r);a.existsSync(s)||console.warn(`\u26A0\uFE0F Missing runtime asset after copy: ${s}`)}return n}async function ut(t,e={}){let n=_(t,i.join(".flisk",".flisk-out","flisk-cli-ext")),r=[];process.env.FLISK_EXTENSION_SOURCE&&r.push(process.env.FLISK_EXTENSION_SOURCE);let s=ft();s&&r.push(s);let l=i.dirname(process.execPath);r.push(i.join(l,"flisk-cli")),r.push(i.join(t,"..","flisk-cli"));let o=process.env.FLISK_EXTENSION_SOURCE;o&&a.existsSync(o)&&!j(o)&&console.warn(`\u26A0\uFE0F FLISK_EXTENSION_SOURCE is not a usable Flisk extension and is ignored:
50
+ ${J(o)}`);let d="";for(let f of r)if(f&&j(f)){d=f;break}if(!d){let f=r.filter(c=>c&&a.existsSync(c)).map(c=>({candidate:c,report:P(c)})).filter(({report:c})=>c.kind==="mixed"||c.missing.length<5);console.warn("\u26A0\uFE0F Flisk extension not found - set FLISK_EXTENSION_SOURCE to its checkout path and re-run `flisk project` (or `flisk config regenerate`) to vendor it before `flisk up`."+f.map(({candidate:c,report:h})=>`
51
+ ${J(c,h)}`).join(""));return}a.existsSync(n)||a.mkdirSync(n,{recursive:!0}),a.copyFileSync(de(d),i.join(n,"Tiltfile"));for(let f of at)ye(i.join(n,f)),a.cpSync(pe(d,f),i.join(n,f),{recursive:!0,filter:c=>!ke(c)});e.quiet||console.log("\u2713 Vendored Flisk extension \u2192 .flisk/.flisk-out/flisk-cli-ext/");try{let{applyPremiumOverlay:f}=await import("./extension-fetch-VEFSCG4B.js");await f(t,n)}catch(f){console.warn(`\u26A0\uFE0F Premium overlay skipped: ${f.message}`)}}var Ee="SYSTEM-GENERATED BY Flisk CLI";function Qt(t,e){let n=[],r=[],s=[],l=[],o=(g,T,y)=>{T!==y&&(n.push(`${T===void 0?"Missing file":"Out of sync"}: ${g} (run 'flisk config regenerate')`),s.push({file:g,diff:mt(g,T??"",y)}))},d=Se(t),c=new L().generateAll(d),h=i.join(t,".flisk",".flisk-out");for(let g of ge){let T=c[g],y=i.join(h,g);o(`.flisk/.flisk-out/${g}`,a.existsSync(y)?a.readFileSync(y,"utf-8"):void 0,T)}let p=i.join(t,k),m=a.existsSync(p)?a.readFileSync(p,"utf-8"):void 0;m!==void 0&&!m.includes(Ee)?r.push(".tiltignore: not generated by Flisk, left as is"):o(k,m,c[k]);let v=e?.manifestPaths??K(t);for(let g of v){let T=i.relative(t,g).split(i.sep).join("/");if(!e?.skipManifestValidation){let z=ne(g,T);n.push(...z.errors),r.push(...z.warnings)}let y=ht(t,g);n.push(...y.errors),l.push(...y.handEdited)}return{valid:n.length===0,errors:n,warnings:r,diffs:s,handEdited:l}}function mt(t,e,n){let r=e.replace(/\n$/,"").split(`
52
+ `),s=n.replace(/\n$/,"").split(`
53
+ `),l=[`--- a/${t}`,`+++ b/${t}`,`@@ -1,${r.length} +1,${s.length} @@`];for(let o of r)l.push(`-${o}`);for(let o of s)l.push(`+${o}`);return l.join(`
54
+ `)}function ht(t,e){let n=i.dirname(e),r=i.join(n,I);if(!a.existsSync(r))return{errors:[],handEdited:[]};let s=[],l=(h,p="")=>{for(let m of a.readdirSync(h,{withFileTypes:!0})){if(p===""&&m.name===".flisk-contract")continue;let v=i.join(p,m.name),g=i.join(h,m.name);m.isDirectory()?l(g,v):m.isFile()&&s.push({fullPath:g,relativeFile:v})}};if(l(r),s.length===0)return{errors:[],handEdited:[]};let o=i.join(r,".flisk-contract"),d=i.join(o,"service.json.source"),f=[],c=[];a.existsSync(d)?a.readFileSync(d,"utf-8")!==a.readFileSync(e,"utf-8")&&f.push(i.relative(t,e)+": service.json changed since generated outputs were written (run flisk up)"):f.push(i.relative(t,d)+": generated-file contract snapshot is missing (run flisk up to regenerate)");for(let h of s){if(h.relativeFile==="service.yaml")continue;let p=i.join(o,h.relativeFile),m=i.relative(t,h.fullPath);a.existsSync(p)?a.readFileSync(h.fullPath,"utf-8")!==a.readFileSync(p,"utf-8")&&(c.push(m.split(i.sep).join("/")),f.push(`${m}: generated file differs from its Flisk snapshot (run flisk up to regenerate)`)):f.push(`${m}: generated-file snapshot is missing (run flisk up to regenerate)`)}return{errors:f,handEdited:c}}import{stdin as gt,stdout as St}from"node:process";import{createInterface as kt}from"node:readline/promises";async function N(t){let e=kt({input:gt,output:St});try{return await new Promise((n,r)=>{e.once("close",()=>r(new Error("No input available to answer the prompt. Run this in a terminal."))),e.question(t).then(s=>n(s.trim()),r)})}finally{e.close()}}async function nn(t){let e=t.initial?` (${t.initial})`:"";for(;;){let r=await N(`${t.message}${e} `)||t.initial||"",s=t.validate?.(r)??!0;if(s===!0)return r;console.log(s)}}async function rn(t){let e=t.initial??!0,n=e?"Y/n":"y/N";for(;;){let r=(await N(`${t.message} (${n}) `)).toLowerCase();if(!r)return e;if(["y","yes"].includes(r))return!0;if(["n","no"].includes(r))return!1;console.log("Please answer yes or no.")}}async function sn(t){for(console.log(t.message),t.choices.forEach((e,n)=>{console.log(` ${n+1}. ${e.title}`)});;){let e=await N("Choose one: "),n=Number.parseInt(e,10)-1,r=t.choices[n];if(r)return r.value;console.log(`Enter a number from 1 to ${t.choices.length}.`)}}async function on(t){let e=t.choices.map((r,s)=>r.selected?s+1:null).filter(r=>r!==null),n=e.length>0?` [${e.join(",")}]`:"";for(console.log(t.message),t.choices.forEach((r,s)=>{let l=r.selected?"*":" ";console.log(` ${l} ${s+1}. ${r.title}`)});;){let r=await N(`Choose one or more numbers, comma-separated${n}: `),s=e;if(r){let d=r.split(",").map(c=>c.trim()),f=d.find(c=>{if(!/^\d+$/.test(c))return!0;let h=Number.parseInt(c,10);return!t.choices[h-1]});if(f!==void 0){console.log(`"${f}" is not a valid choice (1-${t.choices.length})`);continue}s=d.map(c=>Number.parseInt(c,10))}let l=Array.from(new Set(s)).map(d=>t.choices[d-1]).filter(d=>!!d).map(d=>d.value),o=t.validate?.(l)??!0;if(o===!0)return l;console.log(o)}}export{_t as a,we as b,bt as c,Re as d,vt as e,V as f,pe as g,de as h,W as i,P as j,J as k,$ as l,L as m,X as n,Se as o,zt as p,pt as q,dt as r,Qt as s,nn as t,rn as u,sn as v,on as w};
@@ -1,2 +1,2 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{r as c}from"./chunk-5LRMAY67.js";import{execFileSync as u}from"node:child_process";import{realpathSync as l}from"node:fs";import{resolve as p}from"node:path";var m=(o,t)=>u(o,t,{encoding:"utf-8",stdio:"pipe",timeout:5e3,windowsHide:!0});function a(o,t=process.platform,e=m){if(t==="win32")return null;try{let s=e("lsof",["-nP",`-iTCP:${o}`,"-sTCP:LISTEN","-t"]).split(/\r?\n/).map(r=>r.trim()).filter(Boolean);for(let r of s){let n=e("ps",["-p",r,"-o","command="]).trim(),[i]=c(`${r} ${n}`);if(i)return i}}catch{}return null}function f(o){try{return l(o)}catch{return p(o)}}function d(o,t){return o!==null&&f(o.root)!==f(t)}async function P(o,t,e,s=a){let r={running:[],foreign:[]};for(let n of o){if(!await e(n))continue;let i=s(n);i&&d(i,t)?r.foreign.push({port:n,root:i.root}):r.running.push(n)}return r}export{a,d as b,P as c};
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{r as c}from"./chunk-UJXR6MZ2.js";import{execFileSync as u}from"node:child_process";import{realpathSync as l}from"node:fs";import{resolve as p}from"node:path";var m=(o,t)=>u(o,t,{encoding:"utf-8",stdio:"pipe",timeout:5e3,windowsHide:!0});function a(o,t=process.platform,e=m){if(t==="win32")return null;try{let s=e("lsof",["-nP",`-iTCP:${o}`,"-sTCP:LISTEN","-t"]).split(/\r?\n/).map(r=>r.trim()).filter(Boolean);for(let r of s){let n=e("ps",["-p",r,"-o","command="]).trim(),[i]=c(`${r} ${n}`);if(i)return i}}catch{}return null}function f(o){try{return l(o)}catch{return p(o)}}function d(o,t){return o!==null&&f(o.root)!==f(t)}async function P(o,t,e,s=a){let r={running:[],foreign:[]};for(let n of o){if(!await e(n))continue;let i=s(n);i&&d(i,t)?r.foreign.push({port:n,root:i.root}):r.running.push(n)}return r}export{a,d as b,P as c};
@@ -0,0 +1,10 @@
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ function G(e,t,r){let o=e.indexOf(t);if(o===-1)return e;let n=t.length,s=0,i="";do i+=e.slice(s,o)+t+r,s=o+n,o=e.indexOf(t,s);while(o!==-1);return i+=e.slice(s),i}function V(e,t,r,o){let n=0,s="";do{let i=e[o-1]==="\r";s+=e.slice(n,i?o-1:o)+t+(i?`\r
3
+ `:`
4
+ `)+r,n=o+1,o=e.indexOf(`
5
+ `,n)}while(o!==-1);return s+=e.slice(n),s}var Y=(e=0)=>t=>`\x1B[${t+e}m`,S=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,I=(e=0)=>(t,r,o)=>`\x1B[${38+e};2;${t};${r};${o}m`,he=e=>`\x1B[58;5;${e<90?e-30:e-90+8}m`,l={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],underlineDouble:["4:2",24],underlineCurly:["4:3",24],underlineDotted:["4:4",24],underlineDashed:["4:5",24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]},underlineColor:{underlineBlack:["58;5;0",59],underlineRed:["58;5;1",59],underlineGreen:["58;5;2",59],underlineYellow:["58;5;3",59],underlineBlue:["58;5;4",59],underlineMagenta:["58;5;5",59],underlineCyan:["58;5;6",59],underlineWhite:["58;5;7",59],underlineBlackBright:["58;5;8",59],underlineGray:["58;5;8",59],underlineGrey:["58;5;8",59],underlineRedBright:["58;5;9",59],underlineGreenBright:["58;5;10",59],underlineYellowBright:["58;5;11",59],underlineBlueBright:["58;5;12",59],underlineMagentaBright:["58;5;13",59],underlineCyanBright:["58;5;14",59],underlineWhiteBright:["58;5;15",59]}},K=Object.keys(l.modifier),_=Object.keys(l.color),N=Object.keys(l.bgColor),ge=Object.keys(l.underlineColor),H=[..._,...N];function be(){let e=new Map;for(let[t,r]of Object.entries(l)){for(let[o,n]of Object.entries(r))l[o]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},r[o]=l[o],e.set(Number.parseInt(n[0],10),n[1]);Object.defineProperty(l,t,{value:r,enumerable:!1})}return Object.defineProperty(l,"codes",{value:e,enumerable:!1}),l.color.close="\x1B[39m",l.bgColor.close="\x1B[49m",l.underlineColor.close="\x1B[59m",l.color.ansi=Y(),l.color.ansi256=S(),l.color.ansi16m=I(),l.bgColor.ansi=Y(10),l.bgColor.ansi256=S(10),l.bgColor.ansi16m=I(10),l.underlineColor.ansi=he,l.underlineColor.ansi256=S(20),l.underlineColor.ansi16m=I(20),Object.defineProperties(l,{rgbToAnsi256:{value(t,r,o){return t===r&&r===o?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)},enumerable:!1},hexToRgb:{value(t){let r=/[\da-f]{6}|[\da-f]{3}/i.exec(t.toString(16));if(!r)return[0,0,0];let[o]=r;o.length===3&&(o=[...o].map(s=>s+s).join(""));let n=Number.parseInt(o,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:t=>l.rgbToAnsi256(...l.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let r,o,n;if(t>=232)r=((t-232)*10+8)/255,o=r,n=r;else{t-=16;let a=t%36;r=Math.floor(t/36)/5,o=Math.floor(a/6)/5,n=a%6/5}let s=Math.max(r,o,n)*2;if(s===0)return 30;let i=30+(Math.round(n)<<2|Math.round(o)<<1|Math.round(r));return s===2&&(i+=60),i},enumerable:!1},rgbToAnsi:{value:(t,r,o)=>l.ansi256ToAnsi(l.rgbToAnsi256(t,r,o)),enumerable:!1},hexToAnsi:{value:t=>l.ansi256ToAnsi(l.hexToAnsi256(t)),enumerable:!1}}),l}var xe=be(),m=xe;import j from"node:process";import Ee from"node:os";import W from"node:tty";function d(e,t=globalThis.Deno?globalThis.Deno.args:j.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",o=t.indexOf(r+e),n=t.indexOf("--");return o!==-1&&(n===-1||o<n)}var{env:c}=j,R;d("no-color")||d("no-colors")||d("color=false")||d("color=never")?R=0:(d("color")||d("colors")||d("color=true")||d("color=always"))&&(R=1);function z(){return/^\d+$/.test(c.FORCE_COLOR)}function Te(){if("FORCE_COLOR"in c){if(c.FORCE_COLOR==="false")return 0;if(c.FORCE_COLOR==="true"||c.FORCE_COLOR.length===0)return 1;if(z())return Math.min(Number.parseInt(c.FORCE_COLOR,10),3)}}function Ce(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Re(e,{streamIsTTY:t,sniffFlags:r=!0}={}){let o=Te();o!==void 0&&(R=o);let n=r?R:o;if(n===0)return 0;if(r){if(d("color=16m")||d("color=full")||d("color=truecolor"))return 3;if(d("color=256"))return 2}if(n!==void 0&&z())return n;if("TF_BUILD"in c&&"AGENT_NAME"in c)return 1;if(e&&!t&&n===void 0)return 0;let s=n||0;if(c.TERM==="dumb")return s;if(j.platform==="win32"){let i=Ee.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in c)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(i=>i in c)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(i=>i in c)||c.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in c)return/^(?:9\.0*[1-9]\d*\.|\d{2,}\.)/.test(c.TEAMCITY_VERSION)?1:0;if(c.COLORTERM==="truecolor"||c.TERM==="xterm-kitty"||c.TERM==="xterm-ghostty"||c.TERM==="wezterm")return 3;if("TERM_PROGRAM"in c){let i=Number.parseInt((c.TERM_PROGRAM_VERSION||"").split(".",1)[0],10);switch(c.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(?:color)?$/i.test(c.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(c.TERM)||"COLORTERM"in c?1:s}function J(e,t={}){let r=Re(e,{streamIsTTY:e&&e.isTTY,...t});return Ce(r)}var ke={stdout:J({isTTY:W.isatty(1)}),stderr:J({isTTY:W.isatty(2)})},X=ke;var{stdout:q,stderr:Q}=X,b=Symbol("GENERATOR"),x=Symbol("STYLER"),y=Symbol("IS_EMPTY"),k=Symbol("LEVEL"),E=Object.create(null),Z=e=>{if(!Number.isSafeInteger(e)||e<0||e>3)throw new Error("The `level` should be an integer from 0 to 3")},ye={enumerable:!0,get(){return this[k]},set(e){Z(e),this[k]=e}},Oe=(e,t={})=>{t.level!==void 0&&Z(t.level);let r=q?q.level:0;e[k]=t.level===void 0?r:t.level};var ve=e=>{let t=(...r)=>r.join(" ");return Oe(t,e),Object.setPrototypeOf(t,T.prototype),t};function T(e){return ve(e)}Object.setPrototypeOf(T.prototype,Function.prototype);for(let[e,t]of Object.entries(m))E[e]={get(){let r=M(this,ee(t.open,t.close,this[x]),this[y]);return Object.defineProperty(this,e,{value:r}),r}};E.visible={get(){let e=M(this,this[x],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var Ae=(e,t)=>{let r=m[t];if(e==="rgb"){let n=(i,a,u)=>r.ansi(m.rgbToAnsi(i,a,u));return[n,n,(i,a,u)=>r.ansi256(m.rgbToAnsi256(i,a,u)),r.ansi16m]}if(e==="hex"){let n=i=>r.ansi(m.hexToAnsi(i));return[n,n,i=>r.ansi256(m.hexToAnsi256(i)),i=>r.ansi16m(...m.hexToRgb(i))]}let o=n=>r.ansi(m.ansi256ToAnsi(n));return[o,o,r.ansi256,r.ansi256]},we=["rgb","hex","ansi256"];for(let e of we){let t=e[0].toUpperCase()+e.slice(1);for(let[r,o]of[[e,"color"],["bg"+t,"bgColor"],["underline"+t,"underlineColor"]]){let{close:n}=m[o],s=Ae(e,o);E[r]={get(){let i=function(a,u,f){let me=s[this.level](a,u,f);return M(this,ee(me,n,this[x]),this[y])};return Object.defineProperty(this,r,{value:i}),i}}}}var Se=Object.defineProperties(()=>{},{...E,level:{enumerable:!0,get(){return this[b].level},set(e){this[b].level=e}}}),ee=(e,t,r)=>{let o,n;return r===void 0?(o=e,n=t):(o=r.openAll+e,n=t+r.closeAll),{open:e,close:t,openAll:o,closeAll:n,parent:r}},M=(e,t,r)=>{let o=(...n)=>n.length===1?F(o,""+n[0]):n.length===2?F(o,`${n[0]??""} ${n[1]??""}`):F(o,n.join(" "));return Object.setPrototypeOf(o,Se),o[b]=e[b]??e,o[x]=t,o[y]=r,o},F=(e,t)=>{if(e[b][k]<=0||!t)return e[y]?"":t;let r=e[x];if(r===void 0)return t;let{openAll:o,closeAll:n}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=G(t,r.close,r.open),r=r.parent;let s=t.indexOf(`
6
+ `);return s!==-1&&(t=V(t,n,o,s)),o+t+n};Object.defineProperties(T.prototype,{...E,level:ye});var Ie=T(),ut=T({level:Q?Q.level:0});var h=Ie;var te={name:"flisk-cli-internal",private:!0,version:"1.4.1",description:"Flisk CLI \u2014 start services on your machine.",keywords:["flisk","tilt","cli","local-dev","microservices"],homepage:"https://github.com/flisk-sh/flisk#readme",bugs:{url:"https://github.com/flisk-sh/flisk/issues"},repository:{type:"git",url:"git+https://github.com/flisk-sh/flisk.git",directory:"cli"},license:"MIT",author:"Flisk Team",type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",bin:{flisk:"bin/flisk.js"},files:["dist","dist-bundle","bin","templates","README.md","Tiltfile","engine","discovery","specs","ext","!ext/ide-components/code_executor","shared-platform-engineering/docker-templates"],scripts:{build:"tsc && node scripts/bundle.mjs","build:watch":"tsc --watch","check:dist":"npm run build && ../scripts/check-cli-dist.sh",lint:"biome check . ../tests/generated ../tests/runtime-layout","lint:fix":"biome check . ../tests/generated ../tests/runtime-layout --write",typecheck:"tsc --project tsconfig.typecheck.json",clean:"rm -rf dist",dev:"bun run build:watch",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage --coverage.reportOnFailure --coverage.reporter=text --coverage.reporter=html --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportsDirectory=coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",prepack:"../scripts/stage-npm-engine.sh && npm run build"},dependencies:{commander:"^15.0.0",handlebars:"^4.7.8"},devDependencies:{"@biomejs/biome":"^2.5.13","@types/node":"^26.6.5","@types/react":"^19.3.0","@vitest/coverage-v8":"5.0.5",ajv:"^8.17.1",chalk:"^6.0.1",esbuild:"^0.28.2",ink:"^8.0.0",knip:"^6.38.0",react:"^19.3.0","react-devtools-core":"^8.0.0",typescript:"^7.0.2",vite:"^8.3.3",vitest:"5.0.5"},engines:{node:">=22.12.0"}};var mt="Container Runtime",P="bring-your-own";var ht="database-management",gt=".tiltignore",bt="service.json",Ne="docker-compose.yml",xt=".autogenerated",je="TILT_TECH_STACK.star",Fe="TILT_RESOURCE_DEFAULTS.star",re="project.json",Et="package.json",Tt=[je,Fe,"spec.master"],Ct=["backend","frontend","library","sdk","worker","migrator","mcp","agent",P],Rt={backend:["dev","build","start"],worker:["dev","build","start"],migrator:["dev","build","start"],mcp:["dev","build","start"],agent:["dev","build","start"],frontend:["dev","build"],library:["dev","build"],sdk:["dev","build"],[P]:[]};var kt=["monitoring","elk","debezium","golden_image","verdaccio"],yt={frontend:{base:3e3,min:3e3,max:3999,range:"3000-3999"},backend:{base:4e3,min:4e3,max:4999,range:"4000-4999"},mcp:{base:4e3,min:4e3,max:5999,range:"4000-5999"},agent:{base:4e3,min:4e3,max:5999,range:"4000-5999"},[P]:{base:4e3,min:4e3,max:5999,range:"4000-5999"},worker:{base:6e3,min:6e3,max:6999,range:"6000-6999"},health:{base:5e3,min:5e3,max:5999,range:"5000-5999"},migrator:{base:7e3,min:7e3,max:7999,range:"7000-7999"}},Ot={tiltUi:10350,traefik:8080},B="https://flisk.sh/docs/quickstart/";var vt=["node_modules",".git",".tilt",".tilt-engine","dist","build",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests",".github",".vscode","docs"],At=["Dockerfile",Ne,"docker-compose.yaml","Tiltfile","vite.config.ts","tsconfig.json","tsconfig.build.json"],Me={infra:"\u{1F3D7}\uFE0F",core:"\u{1F527}",api:"\u26A1",app:"\u{1F3A8}",orchestrator:"\u2699\uFE0F"};function wt(e){let t=e.toLowerCase();for(let[r,o]of Object.entries(Me))if(t.includes(r))return o;return"\u{1F4E6}"}import{existsSync as Pe}from"node:fs";import{dirname as Be,join as De,resolve as oe}from"node:path";import{cwd as Le}from"node:process";function v(e=Le()){let t=oe(e),r=oe("/");for(;t!==r;){if(Pe(De(t,".flisk",re)))return t;let o=Be(t);if(o===t)break;t=o}return null}var O=null;function $e(){if(O)return O;let e=te;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid package.json: expected object");let t=e;return O={name:String(t.name??"@flisk-sh/flisk"),version:String(t.version??"0.0.0"),fullPackage:t},O}function Mt(){return $e().version}import{existsSync as ne}from"node:fs";import{delimiter as se,extname as ie,join as le}from"node:path";import{delimiter as Dt,extname as Ue}from"node:path";function C(){return process.platform==="win32"}function Ge(e){return e==="linux"?"linux":e==="darwin"?"darwin":e==="win32"?"windows":null}function Ve(e){return e==="x64"?"amd64":e==="arm64"?"arm64":null}function Ye(e,t){let r=Ge(e),o=Ve(t);if(!r||!o||r==="windows"&&o!=="amd64")return null;let n=`tdk-${r}-${o}`;return r==="windows"?`${n}.exe`:n}function Lt(){return Ye(process.platform,process.arch)}function $t(){return C()?"flisk.exe":"flisk"}function D(e,t=C()){return t?Ue(e)?[e]:[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e]}function A(e){let t=process.env.PATH??process.env.Path??"",r=C(),o=D(e,r);if(r&&!ie(e))for(let n of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let s=n.toLowerCase();s&&!o.includes(`${e}${s}`)&&o.push(`${e}${s}`)}for(let n of t.split(se))if(n)for(let s of o){let i=le(n,s);if(ne(i))return i}return null}function Kt(e){let t=process.env.PATH??process.env.Path??"",r=C(),o=D(e,r);if(r&&!ie(e))for(let i of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let a=i.toLowerCase();a&&!o.includes(`${e}${a}`)&&o.push(`${e}${a}`)}let n=[],s=new Set;for(let i of t.split(se))if(i)for(let a of o){let u=le(i,a);if(!ne(u))continue;let f=r?u.toLowerCase():u;s.has(f)||(s.add(f),n.push(u))}return n}import{execFileSync as Ke,execSync as He}from"node:child_process";var ce=1e4;function ae(){let e=!1;if(process.platform==="win32")try{return Ke(A("docker")??"docker",["ps"],{stdio:"ignore",timeout:ce,windowsHide:!0}),"running"}catch(t){return t.code==="ETIMEDOUT"?"unresponsive":"missing"}for(let t of["docker ps","colima status","podman ps"])try{return He(t,{stdio:"ignore",timeout:ce}),"running"}catch(r){r.code==="ETIMEDOUT"&&(e=!0)}return e?"unresponsive":"missing"}function w(e,t){return e[t]??0}function We(e,t){let r=Array.from({length:t.length+1},(o,n)=>n);for(let o=1;o<=e.length;o++){let n=[o];for(let s=1;s<=t.length;s++){let i=e[o-1]===t[s-1]?0:1;n[s]=Math.min(w(n,s-1)+1,w(r,s)+1,w(r,s-1)+i)}r=n}return w(r,t.length)}function Je(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length-1;r++)if(e[r]!==t[r]&&e[r]===t[r+1]&&e[r+1]===t[r]&&e.slice(0,r)===t.slice(0,r)&&e.slice(r+2)===t.slice(r+2))return!0;return!1}function ue(e,t){if(e.length<2||t.length===0||t.includes(e))return;let r=e.toLowerCase(),o,n=Number.POSITIVE_INFINITY;for(let s of t){if(s.length===0)continue;let i=s.toLowerCase(),a=Je(r,i)?1:We(r,i),u=Math.max(1,Math.min(2,Math.floor(Math.max(r.length,i.length)/3)));a>u||(a<n||a===n&&(o===void 0||s<o))&&(o=s,n=a)}return o}import{spawn as ze}from"node:child_process";import{join as Xe}from"node:path";function qe(e,t=[],r={}){return new Promise((o,n)=>{let s=[e,...t];r.verbose&&console.log(`Executing: tilt ${s.join(" ")}`);let i=ze(A("tilt")??"tilt",s,{stdio:r.inheritStdio?"inherit":"pipe",shell:!1,windowsHide:process.platform==="win32",timeout:r.timeoutMs}),a="",u="";r.inheritStdio||(i.stdout?.on("data",f=>{a+=f.toString()}),i.stderr?.on("data",f=>{u+=f.toString()})),i.on("close",f=>{o({exitCode:f??1,stdout:a,stderr:u})}),i.on("error",f=>{n(new Error(`Failed to spawn tilt: ${f.message}`))})})}async function fe(){try{return(await qe("version",[],{inheritStdio:!1,timeoutMs:1e4})).exitCode===0}catch{return!1}}function Qe(){let e=v();if(!e)throw g.notInProject();return Xe(e,".flisk",".flisk-out","Tiltfile")}function de(e){let t=Qe();e.push("-f",t)}function rr(e,t={}){let r=[];return de(r),t.focusTargets&&t.focusTargets.length>0&&r.push("--",`--focus=${t.focusTargets.join(",")}`),r.push(...e),t.verbose&&!t.quiet&&r.push("--verbose"),t.watch&&r.push("--watch"),r}function or(e={}){let t=[];return de(t),e.focusTargets&&e.focusTargets.length>0&&t.push("--",`--focus=${e.focusTargets.join(",")}`),t}function pe(e){return e instanceof Error?e.message:String(e)}function fr(e,t){if(process.env.FLISK_VERBOSE){let r=t!==void 0?`: ${pe(t)}`:"";console.warn(h.gray(`${e}${r}`))}}var p=class extends Error{suggestions;exitCode;constructor(t,r=[],o=1){super(t),this.name="FliskError",this.suggestions=r,this.exitCode=o}display(){U(this.message,void 0,this.suggestions)}exit(){this.display(),process.exit(this.exitCode)}},$=class extends Error{code;constructor(t=1){super(`process.exit(${t})`),this.name="ProcessExitError",this.code=t}};function L(e,t,r=!1){let o=new Set;for(let n of e){let s=ue(n,t);s&&o.add(r?`Did you mean "${s}" for "${n}"?`:`Did you mean "${s}"?`)}return[...o]}var g={tiltNotInstalled:()=>new p("Tilt CLI is not installed",["Install Tilt: `brew install tilt` (macOS)","Or download from: https://docs.tilt.dev/install.html","Verify with: `tilt version`",`Setup guide: ${B}`]),dockerNotAvailable:()=>new p("Docker (or a compatible container runtime) is not running",["Start Docker Desktop, then verify with: `docker ps`","Or start Colima: `colima start`","Or start the Docker service on Linux: `sudo systemctl start docker`",`Setup guide: ${B}`]),dockerNotResponding:()=>new p("Docker is running but not responding (`docker ps` hung for 10s)",["Quit and reopen Docker Desktop, or run `colima restart`","Then verify with: `docker ps`"]),stackNotFound:(e,t=[])=>new p(`Stack "${e}" not found`,[...L([e],t),"Run `flisk stacks` to see available stacks","Run `flisk stack` to assign resources to a stack"]),resourceNotFound:(e,t=[])=>new p(`Resource "${e}" not found`,[...L([e],t),"Run `flisk resources` to list all resources","Check the resource name spelling"]),unknownServices:(e,t)=>{let r=L(e,t,e.length>1);return new p(`Unknown service ${e.join(", ")}. Valid names: ${t.join(", ")}`,r,2)},directoryExists:e=>new p(`Directory already exists: ${e}`,["Use `--path` to specify a different location","Remove the existing directory if no longer needed"]),invalidPath:e=>new p(`Invalid path: ${e}`,["Path must be within the project directory",'Path cannot contain special characters like <>:"|?*']),notInProject:()=>new p("Could not find project root (no .flisk/project.json found)",["Run this from within a Flisk project","Run `flisk project --yes` to initialize a new project"])};function dr(){let e=v();return e||g.notInProject().exit()}function Ze(e){e instanceof p&&e.exit(),U(pe(e)),process.exit(1)}async function et(e,t){try{return await e()}catch(r){if(r instanceof $)throw r;return t?.verbose&&r instanceof Error&&r.stack&&console.error(h.gray(r.stack)),Ze(r)}}async function pr(e,t){let r=[],o=ae();return o==="unresponsive"?r.push(g.dockerNotResponding()):o==="missing"&&r.push(g.dockerNotAvailable()),await fe()||r.push(g.tiltNotInstalled()),r.length>0&&(console.error(h.red(`
7
+ Flisk can't start - missing prerequisites:
8
+ `)),r.forEach((n,s)=>{s>0&&console.error(""),n.display()}),console.error(h.gray("\nRun `flisk doctor` for a full environment check.")),process.exit(1)),et(e,t)}function mr(e,t=1,r){U(e,void 0,r),process.exit(t)}function U(e,t,r){if(console.error(h.red(`\u274C ${e}`)),t&&console.error(h.gray(` ${t}`)),r&&r.length>0){console.error(h.yellow(`
9
+ \u{1F4A1} Suggestions:`));for(let o of r)console.error(h.cyan(` \u2192 ${o}`))}}function hr(e,t){console.error(h.red(`
10
+ tilt ${e} failed with exit code ${t}`)),process.exit(t)}export{_ as a,h as b,te as c,mt as d,P as e,ht as f,gt as g,bt as h,Ne as i,xt as j,je as k,Fe as l,re as m,Et as n,Tt as o,Ct as p,Rt as q,kt as r,yt as s,Ot as t,vt as u,At as v,wt as w,v as x,Mt as y,C as z,Lt as A,$t as B,A as C,Kt as D,qe as E,fe as F,Qe as G,rr as H,or as I,pe as J,fr as K,p as L,$ as M,g as N,dr as O,et as P,pr as Q,mr as R,U as S,hr as T};
@@ -1,24 +1,24 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{E as x,a as h,ga as D,ha as L,t as _}from"./chunk-AGXA5DOQ.js";import{C as F,j as I,m as w,n as A,t as j,x as T}from"./chunk-AT5MFZ3D.js";import{execFileSync as B}from"node:child_process";import{existsSync as de,mkdirSync as le,readFileSync as K,realpathSync as fe,writeFileSync as pe}from"node:fs";import{join as S,resolve as he,sep as me}from"node:path";import{createServer as ie}from"node:net";import{connect as oe}from"node:net";function U(e,t=500){return new Promise(r=>{let s=oe({port:e,host:"127.0.0.1"}),n=o=>{s.destroy(),r(o)};s.setTimeout(t,()=>n(!1)),s.once("connect",()=>n(!0)),s.once("error",()=>n(!1))})}var ae={ingressHttp:{start:8080,end:8180},ingressHttps:{start:8443,end:8543},postgres:{start:15432,end:15532}},v={ingressHttp:"TDK_HTTP_PORT",ingressHttps:"TDK_HTTPS_PORT",postgres:"TDK_POSTGRES_PORT"},H={ingressHttp:80,ingressHttps:443,postgres:5432},E={ingressHttp:H.ingressHttp,ingressHttps:H.ingressHttps};function ce(e,t){return e==="EACCES"&&t==="darwin"}async function O(e){return await U(e)?!1:new Promise(t=>{let r=ie();r.once("error",s=>{t(ce(s.code,process.platform))}),r.listen(e,"127.0.0.1",()=>r.close(()=>t(!0)))})}function ue(e,t){let r=Number(t);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`${e} must be an integer between 1 and 65535 (received ${JSON.stringify(t)})`);return r}async function R(e={}){let t=e.env??process.env,r=e.isAvailable??O,s={ingressHttp:!1,ingressHttps:!1,postgres:!1},n={ingressHttp:"",ingressHttps:"",postgres:""},o={explicit:s},a=new Set;for(let c of["ingressHttp","ingressHttps","postgres"]){let u=t[v[c]],i=u!==void 0&&u.trim()!=="",d=e.ranges?.[c]??ae[c],l=E[c],f=i?[ue(v[c],u)]:[...l===void 0?[]:[l],...Array.from({length:d.end-d.start+1},(g,k)=>d.start+k)],m;for(let g of f)if(!a.has(g)){if(await r(g)){m=g;break}if(i)throw new Error(`${v[c]}=${g} is already in use. Choose a free host port and retry.`)}if(m===void 0)throw new Error(`No available host port in ${d.start}-${d.end} for ${c}. Set ${v[c]} to a free port and retry.`);a.add(m),o[c]=m,s[c]=i,n[c]=i?"explicit override":m===l?"requested port is free":`selected from fallback range ${d.start}-${d.end}`}return{...o,requested:{...H},reason:n}}function Ve(e){return`Host ports: HTTP ${e.ingressHttp}, HTTPS ${e.ingressHttps}, Postgres ${e.postgres}`}var G=S(".tdk",".tdk-out","host-ports.json");function ge(e,t,r){return e.split(`
3
- `).some(s=>{let[n="",o=""]=s.split("|"),a=n.toLowerCase(),c=t.toLowerCase();return(a.startsWith(`${c}_`)||a.startsWith(`${c}-`))&&o.includes(`:${r}->`)})}function V(e){let t=S(e,G);if(!de(t))return null;try{let r=JSON.parse(K(t,"utf-8"));if(!r||typeof r!="object")return null;let s=r;return!Number.isInteger(s.ingressHttp)||!Number.isInteger(s.ingressHttps)||!Number.isInteger(s.postgres)||!s.requested||!s.explicit||!s.reason?null:s}catch{return null}}function Ye(e,t){let r=S(e,G);le(S(e,".tdk",".tdk-out"),{recursive:!0}),pe(r,`${JSON.stringify(t,null,2)}
4
- `,{encoding:"utf-8",mode:384})}function Qe(e){process.env.TDK_HTTP_PORT=String(e.ingressHttp),process.env.TDK_HTTPS_PORT=String(e.ingressHttps),process.env.TDK_POSTGRES_PORT=String(e.postgres)}var ke="com.docker.compose.project.working_dir";function Pe(e,t,r){let s=new Set([he(t)]);try{s.add(fe(t))}catch{}return e.split(`
5
- `).some(n=>{let[,o="",a=""]=n.split("|");return!a||!o.includes(`:${r}->`)?!1:[...s].some(c=>a===c||a.startsWith(`${c}${me}`))})}function Xe(e,t,r=()=>B("docker",["ps","--format",`{{.Names}}|{{.Ports}}|{{.Label "${ke}"}}`],{encoding:"utf-8",timeout:5e3})){let s=V(e);if(!s||s.ingressHttp===t)return t;try{if(Pe(r(),e,s.ingressHttp))return s.ingressHttp}catch{}return t}async function et(e,t={}){let r=V(e),s=["TDK_HTTP_PORT","TDK_HTTPS_PORT","TDK_POSTGRES_PORT"].some(i=>process.env[i]);if(t.inspectDocker===!1&&r&&!s)return r;let n="";try{let i=JSON.parse(K(S(e,".tdk",w),"utf-8"));n=String(i?.project?.name??"tdk-project").replace(/-/g,"_").toLowerCase()}catch{n="tdk_project"}let o="";if(t.inspectDocker!==!1)try{o=B("docker",["ps","--format","{{.Names}}|{{.Ports}}"],{encoding:"utf-8",timeout:5e3})}catch{}let a=i=>ge(o,n,i),c=t.isPortFree??O,u=async i=>await c(i)||a(i);if(r&&!s){for(let i of[r.ingressHttp,r.ingressHttps,r.postgres])if(!await u(i))return R({isAvailable:u});for(let[i,d]of Object.entries(E)){let l=r[i];if(d!==void 0&&l!==d&&await u(d))return R({isAvailable:u})}return r}return R({isAvailable:u})}import{execFileSync as Q,execSync as $}from"node:child_process";import{existsSync as C,readdirSync as Te,readFileSync as N}from"node:fs";import{createServer as Se}from"node:net";import{join as P}from"node:path";function W(e,t){return e==="pending"||e==="in_progress"||e==="none"||t==="pending"||t==="none"}var J="container is running, but its health check is failing";function M(e){let t=e?.runtimeStatus??"";if(t!=="ok")return t;let r=e?.composeResourceInfo?.healthStatus;return r==="unhealthy"?"error":r==="starting"?"pending":t}var b=1e4,z=3e3,be="http://localhost:4873";function X(e){return`'${e.replace(/'/g,"'\\''")}'`}function y(e,t,r,s,n){return process.platform==="win32"?Q(F(t)??t,r,{...n,windowsHide:!0}):e(s,n)}var ye=[80,443];function $e(e){return e.replace(/-/g,"_")}function we(e,t){let r=new Set(t),s=[];for(let n of e.split(`
6
- `)){let o=n.trim();if(!o)continue;let a=o.indexOf(" "),c=a>=0?o.slice(0,a):o,u=a>=0?o.slice(a+1):"",i=[];for(let d of r)u.split(/[\s,]+/).some(f=>f.startsWith(`${d}->`)||f.includes(`:${d}->`))&&i.push(d);i.length>0&&s.push({name:c,ports:u,publishedPorts:i})}return s}function ee(e,t){let r=e.toLowerCase(),s=t.toLowerCase();return r===`${s}_traefik`||r.startsWith(`${s}_traefik`)}function ve(e,t){return e.filter(r=>!ee(r.name,t))}function Re(e){try{let t=e??L();return new Set(t.filter(r=>r.config?.sablier?.enable&&r.config?.sablier?.deferStart).map(r=>r.name))}catch{return new Set}}function _e(e,t=new Set){let s=JSON.parse(e).items??[],n=[],o=0,a=0,c=0;for(let u of s){let i=u.metadata?.name??"unknown",d=u.status?.updateStatus??"",l=M(u.status),f=l==="error"&&u.status?.runtimeStatus==="ok",g=(u.status?.buildHistory?.[0]?.error??"").trim()||(f?J:"");if(d==="error"||l==="error"){n.push({name:i,updateStatus:d,runtimeStatus:l,error:g.replace(/\s+/g," ").slice(0,800)});continue}if(d==="ok"&&(l==="ok"||l==="not_applicable")){c+=1;continue}i!=="(Tiltfile)"&&W(d,l)&&(t.has(i)?a+=1:o+=1)}return{failures:n,pendingCount:o,deferredCount:a,okCount:c,total:s.length}}var xe=/failed to resolve source metadata for docker\.io\/library\/([A-Za-z0-9._-]+-l[1-4](?:-[a-z]+)*)(?::[^\s:]+)?:/i;function te(e){let t=e.replace(/\s+/g," ").trim(),r=t.match(/Bind for [^ ]+:(\d+) failed: port is already allocated/i);if(r)return`host port ${r[1]} is already allocated`;if(/port is already allocated/i.test(t))return"a required host port is already allocated";let s=[...t.matchAll(/ConnectionRefused downloading package manifest (@[A-Za-z0-9._/-]+)/gi)].map(c=>c[1]);if(s.length>0){let c=[...new Set(s)],u=c.slice(0,4).join(", "),i=c.length>4?` (+${c.length-4} more)`:"";return`private registry ConnectionRefused for ${u}${i} \u2014 Verdaccio (:4873) is down or unreachable from the build`}let n=t.match(xe);if(n)return`base image ${n[1]} was missing when this build started (the golden layers weren't built yet, or golden-layers-build failed) - Tilt does not retry a failed build by itself`;if(/install-deps\.sh/i.test(t)||/bun install(?: --production)?/i.test(t)||/npm (?:ci|install)/i.test(t))return"dependency install failed during ImageBuild \u2014 usually Verdaccio (:4873) unreachable or missing @scoped packages (ConnectionRefused downloading package manifest)";let o=t.match(/No such image:\s*([^\s]+)/i)?.[1]??t.match(/pull access denied for ([^,:\s]+)/i)?.[1]??void 0,a=t.match(/\bup\s+-d\s+--no-build\s+([A-Za-z0-9._-]+)/i)?.[1];if(o||a||/docker compose .*\bup\s+-d\s+--no-build\b/i.test(t)){let c=o??`${a??"service"}:dev`,u=a?` for ${a}`:"";return`compose run failed because image is missing (${c})${u} \u2014 wait for the ImageBuild resource to finish, then re-trigger the *-run-only resource`}return/bun run build/i.test(t)?"ImageBuild failed during `bun run build` (compile/typecheck) \u2014 open the resource logs in Tilt for the TypeScript/build error":(/ImageBuild:/i.test(t)||/^Command "/i.test(t),t.slice(0,220))}function q(e){return/ConnectionRefused downloading package manifest|Verdaccio|private registry|dependency install failed during ImageBuild|install-deps\.sh|bun install/i.test(e)}function He(e=T()??process.cwd()){let t=P(e,".tdk",w);if(!C(t))return!1;try{let r=JSON.parse(N(t,"utf-8"));return r.optional_infra?.verdaccio===!0||Object.values(r.phases??{}).some(s=>(s.enabledStacks??[]).includes("verdaccio"))}catch{return!1}}function re(e){for(let t of[P(e,".npmrc"),P(e,A)])if(C(t))try{let r=N(t,"utf-8");if(/:4873\b/.test(r)||/verdaccio/i.test(r))return!0}catch{}return!1}function Ee(e=T()??process.cwd()){return He(e)||re(e)}function mt(e=$,t=T()??process.cwd(),r=process.env.VERDACCIO_URL??process.env.NPM_REGISTRY_URL??be,s=!0){if(!s&&!re(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Verdaccio is enabled in the project config but needs a Premium license, so Flisk will not start it - skipped"};if(!Ee(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Private npm registry (Verdaccio) not enabled for this project - skipped"};let n=!1;try{let c=y(e,"docker",["ps","--format","{{.Names}}"],"docker ps --format '{{.Names}}'",{stdio:"pipe",encoding:"utf-8",timeout:b});n=/verdaccio/i.test(c)}catch{}let o=!1,a="";try{let c=process.platform==="win32"?Q("curl.exe",["-fsS","-o","NUL","-w","%{http_code}","--max-time","2",r],{stdio:"pipe",encoding:"utf-8",timeout:z+1e3,windowsHide:!0}).trim():e(`curl -fsS -o /dev/null -w '%{http_code}' --max-time 2 ${X(r)}`,{stdio:"pipe",encoding:"utf-8",timeout:z+1e3}).trim();o=/^[23]\d\d$/.test(c),a=`HTTP ${c}`}catch(c){a=c instanceof Error?c.message.slice(0,120):"request failed"}return o?{name:"Private npm registry",didPass:!0,message:`Private npm registry reachable at ${r}${n?" (verdaccio container running)":""}`}:n?{name:"Private npm registry",didPass:!1,message:`Verdaccio container is running but ${r} is not responding (${a}). ImageBuilds that install @scoped packages will fail with ConnectionRefused downloading package manifest.`,fix:"Check `docker logs` for the verdaccio container, confirm port 4873 is published, then re-run `flisk doctor`."}:{name:"Private npm registry",didPass:!1,message:`Private npm registry (Verdaccio) is not reachable at ${r}. Docker ImageBuilds will fail with ConnectionRefused downloading package manifests for @flisk-sh/* and project-scoped packages.`,fix:"Start the registry with `bun run verdaccio:start` (or `docker compose -f docker-compose.verdaccio.yml up -d`), publish packages with `bun run publish:all` / `scripts/build/publish-to-verdaccio.sh`, then `tilt trigger` failed resources or re-run `flisk up`."}}function gt(e=$,t=x(),r=ye){let s=$e(t),n="";try{n=y(e,"docker",["ps","--format","{{.Names}}\\t{{.Ports}}"],"docker ps --format '{{.Names}}\\t{{.Ports}}'",{stdio:"pipe",encoding:"utf-8",timeout:b})}catch{return{name:"Ingress Ports",didPass:!0,isSkipped:!0,message:"Docker not available - skipped ingress port check"}}let o=we(n,r),a=ve(o,s);if(a.length===0){let u=o.filter(i=>ee(i.name,s));return u.length>0?{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${r.join("/")} held by this project's Traefik (${u.map(i=>i.name).join(", ")})`}:{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${r.join("/")} are free for Traefik`}}return{name:"Ingress Ports",didPass:!1,message:`Traefik cannot bind ingress ports because another container already owns them:
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{E as x,a as h,ga as j,ha as D,t as _}from"./chunk-VRESY4NR.js";import{C as L,j as N,m as w,n as A,t as F,x as T}from"./chunk-BB5BZ37Y.js";import{execFileSync as B}from"node:child_process";import{existsSync as de,mkdirSync as le,readFileSync as K,realpathSync as fe,writeFileSync as pe}from"node:fs";import{join as b,resolve as he,sep as me}from"node:path";import{createServer as ie}from"node:net";import{connect as oe}from"node:net";function U(e,t=500){return new Promise(r=>{let s=oe({port:e,host:"127.0.0.1"}),n=o=>{s.destroy(),r(o)};s.setTimeout(t,()=>n(!1)),s.once("connect",()=>n(!0)),s.once("error",()=>n(!1))})}var ae={ingressHttp:{start:8080,end:8180},ingressHttps:{start:8443,end:8543},postgres:{start:15432,end:15532}},v={ingressHttp:"FLISK_HTTP_PORT",ingressHttps:"FLISK_HTTPS_PORT",postgres:"FLISK_POSTGRES_PORT"},H={ingressHttp:80,ingressHttps:443,postgres:5432},E={ingressHttp:H.ingressHttp,ingressHttps:H.ingressHttps};function ce(e,t){return e==="EACCES"&&t==="darwin"}async function O(e){return await U(e)?!1:new Promise(t=>{let r=ie();r.once("error",s=>{t(ce(s.code,process.platform))}),r.listen(e,"127.0.0.1",()=>r.close(()=>t(!0)))})}function ue(e,t){let r=Number(t);if(!Number.isInteger(r)||r<1||r>65535)throw new Error(`${e} must be an integer between 1 and 65535 (received ${JSON.stringify(t)})`);return r}async function R(e={}){let t=e.env??process.env,r=e.isAvailable??O,s={ingressHttp:!1,ingressHttps:!1,postgres:!1},n={ingressHttp:"",ingressHttps:"",postgres:""},o={explicit:s},a=new Set;for(let c of["ingressHttp","ingressHttps","postgres"]){let u=t[v[c]],i=u!==void 0&&u.trim()!=="",d=e.ranges?.[c]??ae[c],l=E[c],f=i?[ue(v[c],u)]:[...l===void 0?[]:[l],...Array.from({length:d.end-d.start+1},(g,k)=>d.start+k)],m;for(let g of f)if(!a.has(g)){if(await r(g)){m=g;break}if(i)throw new Error(`${v[c]}=${g} is already in use. Choose a free host port and retry.`)}if(m===void 0)throw new Error(`No available host port in ${d.start}-${d.end} for ${c}. Set ${v[c]} to a free port and retry.`);a.add(m),o[c]=m,s[c]=i,n[c]=i?"explicit override":m===l?"requested port is free":`selected from fallback range ${d.start}-${d.end}`}return{...o,requested:{...H},reason:n}}function Ve(e){return`Host ports: HTTP ${e.ingressHttp}, HTTPS ${e.ingressHttps}, Postgres ${e.postgres}`}var G=b(".flisk",".flisk-out","host-ports.json");function ge(e,t,r){return e.split(`
3
+ `).some(s=>{let[n="",o=""]=s.split("|"),a=n.toLowerCase(),c=t.toLowerCase();return(a.startsWith(`${c}_`)||a.startsWith(`${c}-`))&&o.includes(`:${r}->`)})}function V(e){let t=b(e,G);if(!de(t))return null;try{let r=JSON.parse(K(t,"utf-8"));if(!r||typeof r!="object")return null;let s=r;return!Number.isInteger(s.ingressHttp)||!Number.isInteger(s.ingressHttps)||!Number.isInteger(s.postgres)||!s.requested||!s.explicit||!s.reason?null:s}catch{return null}}function Ye(e,t){let r=b(e,G);le(b(e,".flisk",".flisk-out"),{recursive:!0}),pe(r,`${JSON.stringify(t,null,2)}
4
+ `,{encoding:"utf-8",mode:384})}function Qe(e){process.env.FLISK_HTTP_PORT=String(e.ingressHttp),process.env.FLISK_HTTPS_PORT=String(e.ingressHttps),process.env.FLISK_POSTGRES_PORT=String(e.postgres)}var ke="com.docker.compose.project.working_dir";function Pe(e,t,r){let s=new Set([he(t)]);try{s.add(fe(t))}catch{}return e.split(`
5
+ `).some(n=>{let[,o="",a=""]=n.split("|");return!a||!o.includes(`:${r}->`)?!1:[...s].some(c=>a===c||a.startsWith(`${c}${me}`))})}function Xe(e,t,r=()=>B("docker",["ps","--format",`{{.Names}}|{{.Ports}}|{{.Label "${ke}"}}`],{encoding:"utf-8",timeout:5e3})){let s=V(e);if(!s||s.ingressHttp===t)return t;try{if(Pe(r(),e,s.ingressHttp))return s.ingressHttp}catch{}return t}async function et(e,t={}){let r=V(e),s=["FLISK_HTTP_PORT","FLISK_HTTPS_PORT","FLISK_POSTGRES_PORT"].some(i=>process.env[i]);if(t.inspectDocker===!1&&r&&!s)return r;let n="";try{let i=JSON.parse(K(b(e,".flisk",w),"utf-8"));n=String(i?.project?.name??"flisk-project").replace(/-/g,"_").toLowerCase()}catch{n="flisk_project"}let o="";if(t.inspectDocker!==!1)try{o=B("docker",["ps","--format","{{.Names}}|{{.Ports}}"],{encoding:"utf-8",timeout:5e3})}catch{}let a=i=>ge(o,n,i),c=t.isPortFree??O,u=async i=>await c(i)||a(i);if(r&&!s){for(let i of[r.ingressHttp,r.ingressHttps,r.postgres])if(!await u(i))return R({isAvailable:u});for(let[i,d]of Object.entries(E)){let l=r[i];if(d!==void 0&&l!==d&&await u(d))return R({isAvailable:u})}return r}return R({isAvailable:u})}import{execFileSync as Q,execSync as S}from"node:child_process";import{existsSync as I,readdirSync as Se,readFileSync as C}from"node:fs";import{createServer as Te}from"node:net";import{join as P}from"node:path";function W(e,t){return e==="pending"||e==="in_progress"||e==="none"||t==="pending"||t==="none"}var J="container is running, but its health check is failing";function M(e){let t=e?.runtimeStatus??"";if(t!=="ok")return t;let r=e?.composeResourceInfo?.healthStatus;return r==="unhealthy"?"error":r==="starting"?"pending":t}var y=1e4,z=3e3,be="http://localhost:4873";function X(e){return`'${e.replace(/'/g,"'\\''")}'`}function $(e,t,r,s,n){return process.platform==="win32"&&e===S?Q(L(t)??t,r,{...n,windowsHide:!0}):e(s,n)}var ye=[80,443];function $e(e){return e.replace(/-/g,"_")}function we(e,t){let r=new Set(t),s=[];for(let n of e.split(`
6
+ `)){let o=n.trim();if(!o)continue;let a=o.indexOf(" "),c=a>=0?o.slice(0,a):o,u=a>=0?o.slice(a+1):"",i=[];for(let d of r)u.split(/[\s,]+/).some(f=>f.startsWith(`${d}->`)||f.includes(`:${d}->`))&&i.push(d);i.length>0&&s.push({name:c,ports:u,publishedPorts:i})}return s}function ee(e,t){let r=e.toLowerCase(),s=t.toLowerCase();return r===`${s}_traefik`||r.startsWith(`${s}_traefik`)}function ve(e,t){return e.filter(r=>!ee(r.name,t))}function Re(e){try{let t=e??D();return new Set(t.filter(r=>r.config?.sablier?.enable&&r.config?.sablier?.deferStart).map(r=>r.name))}catch{return new Set}}function _e(e,t=new Set){let s=JSON.parse(e).items??[],n=[],o=0,a=0,c=0;for(let u of s){let i=u.metadata?.name??"unknown",d=u.status?.updateStatus??"",l=M(u.status),f=l==="error"&&u.status?.runtimeStatus==="ok",g=(u.status?.buildHistory?.[0]?.error??"").trim()||(f?J:"");if(d==="error"||l==="error"){n.push({name:i,updateStatus:d,runtimeStatus:l,error:g.replace(/\s+/g," ").slice(0,800)});continue}if(d==="ok"&&(l==="ok"||l==="not_applicable")){c+=1;continue}i!=="(Tiltfile)"&&W(d,l)&&(t.has(i)?a+=1:o+=1)}return{failures:n,pendingCount:o,deferredCount:a,okCount:c,total:s.length}}var xe=/failed to resolve source metadata for docker\.io\/library\/([A-Za-z0-9._-]+-l[1-4](?:-[a-z]+)*)(?::[^\s:]+)?:/i;function te(e){let t=e.replace(/\s+/g," ").trim(),r=t.match(/Bind for [^ ]+:(\d+) failed: port is already allocated/i);if(r)return`host port ${r[1]} is already allocated`;if(/port is already allocated/i.test(t))return"a required host port is already allocated";let s=[...t.matchAll(/ConnectionRefused downloading package manifest (@[A-Za-z0-9._/-]+)/gi)].map(c=>c[1]);if(s.length>0){let c=[...new Set(s)],u=c.slice(0,4).join(", "),i=c.length>4?` (+${c.length-4} more)`:"";return`private registry ConnectionRefused for ${u}${i} \u2014 Verdaccio (:4873) is down or unreachable from the build`}let n=t.match(xe);if(n)return`base image ${n[1]} was missing when this build started (the golden layers weren't built yet, or golden-layers-build failed) - Tilt does not retry a failed build by itself`;if(/install-deps\.sh/i.test(t)||/bun install(?: --production)?/i.test(t)||/npm (?:ci|install)/i.test(t))return"dependency install failed during ImageBuild \u2014 usually Verdaccio (:4873) unreachable or missing @scoped packages (ConnectionRefused downloading package manifest)";let o=t.match(/No such image:\s*([^\s]+)/i)?.[1]??t.match(/pull access denied for ([^,:\s]+)/i)?.[1]??void 0,a=t.match(/\bup\s+-d\s+--no-build\s+([A-Za-z0-9._-]+)/i)?.[1];if(o||a||/docker compose .*\bup\s+-d\s+--no-build\b/i.test(t)){let c=o??`${a??"service"}:dev`,u=a?` for ${a}`:"";return`compose run failed because image is missing (${c})${u} \u2014 wait for the ImageBuild resource to finish, then re-trigger the *-run-only resource`}return/bun run build/i.test(t)?"ImageBuild failed during `bun run build` (compile/typecheck) \u2014 open the resource logs in Tilt for the TypeScript/build error":(/ImageBuild:/i.test(t)||/^Command "/i.test(t),t.slice(0,220))}function q(e){return/ConnectionRefused downloading package manifest|Verdaccio|private registry|dependency install failed during ImageBuild|install-deps\.sh|bun install/i.test(e)}function He(e=T()??process.cwd()){let t=P(e,".flisk",w);if(!I(t))return!1;try{let r=JSON.parse(C(t,"utf-8"));return r.optional_infra?.verdaccio===!0||Object.values(r.phases??{}).some(s=>(s.enabledStacks??[]).includes("verdaccio"))}catch{return!1}}function re(e){for(let t of[P(e,".npmrc"),P(e,A)])if(I(t))try{let r=C(t,"utf-8");if(/:4873\b/.test(r)||/verdaccio/i.test(r))return!0}catch{}return!1}function Ee(e=T()??process.cwd()){return He(e)||re(e)}function mt(e=S,t=T()??process.cwd(),r=process.env.VERDACCIO_URL??process.env.NPM_REGISTRY_URL??be,s=!0){if(!s&&!re(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Verdaccio is enabled in the project config but needs a Premium license, so Flisk will not start it - skipped"};if(!Ee(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Private npm registry (Verdaccio) not enabled for this project - skipped"};let n=!1;try{let c=$(e,"docker",["ps","--format","{{.Names}}"],"docker ps --format '{{.Names}}'",{stdio:"pipe",encoding:"utf-8",timeout:y});n=/verdaccio/i.test(c)}catch{}let o=!1,a="";try{let c=process.platform==="win32"?Q("curl.exe",["-fsS","-o","NUL","-w","%{http_code}","--max-time","2",r],{stdio:"pipe",encoding:"utf-8",timeout:z+1e3,windowsHide:!0}).trim():e(`curl -fsS -o /dev/null -w '%{http_code}' --max-time 2 ${X(r)}`,{stdio:"pipe",encoding:"utf-8",timeout:z+1e3}).trim();o=/^[23]\d\d$/.test(c),a=`HTTP ${c}`}catch(c){a=c instanceof Error?c.message.slice(0,120):"request failed"}return o?{name:"Private npm registry",didPass:!0,message:`Private npm registry reachable at ${r}${n?" (verdaccio container running)":""}`}:n?{name:"Private npm registry",didPass:!1,message:`Verdaccio container is running but ${r} is not responding (${a}). ImageBuilds that install @scoped packages will fail with ConnectionRefused downloading package manifest.`,fix:"Check `docker logs` for the verdaccio container, confirm port 4873 is published, then re-run `flisk doctor`."}:{name:"Private npm registry",didPass:!1,message:`Private npm registry (Verdaccio) is not reachable at ${r}. Docker ImageBuilds will fail with ConnectionRefused downloading package manifests for @flisk-sh/* and project-scoped packages.`,fix:"Start the registry with `bun run verdaccio:start` (or `docker compose -f docker-compose.verdaccio.yml up -d`), publish packages with `bun run publish:all` / `scripts/build/publish-to-verdaccio.sh`, then `tilt trigger` failed resources or re-run `flisk up`."}}function gt(e=S,t=x(),r=ye){let s=$e(t),n="";try{n=$(e,"docker",["ps","--format","{{.Names}}\\t{{.Ports}}"],"docker ps --format '{{.Names}}\\t{{.Ports}}'",{stdio:"pipe",encoding:"utf-8",timeout:y})}catch{return{name:"Ingress Ports",didPass:!0,isSkipped:!0,message:"Docker not available - skipped ingress port check"}}let o=we(n,r),a=ve(o,s);if(a.length===0){let u=o.filter(i=>ee(i.name,s));return u.length>0?{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${r.join("/")} held by this project's Traefik (${u.map(i=>i.name).join(", ")})`}:{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${r.join("/")} are free for Traefik`}}return{name:"Ingress Ports",didPass:!1,message:`Traefik cannot bind ingress ports because another container already owns them:
7
7
  ${a.map(u=>{let i=u.publishedPorts.join(", ");return`${u.name} (host ports ${i})`}).join(`
8
- `)}`,fix:`Stop the foreign container(s), e.g. \`docker stop ${a[0]?.name}\`, or shut down the other Flisk/Tilt project using that Traefik. Then re-run \`flisk up\`.`}}function Z(e,t){return new Promise(r=>{let s=Se();s.once("error",n=>r(n.code==="EADDRINUSE"?"in-use":"unknown")),s.once("listening",()=>s.close(()=>r("free"))),s.listen(e,t)})}async function kt(e){for(let t=0;t<2;t++){let r=await Z(e,"0.0.0.0");if(r==="unknown")return r;if(r==="free"){let s=await Z(e,"127.0.0.1");if(s==="free"||s==="unknown")return s}t===0&&await new Promise(s=>setTimeout(s,50))}return"in-use"}function Oe(e){let{status:t}=e;return t===void 0?e.error??"no response":t===404?"HTTP 404: Traefik is answering but has no route for this URL (container not started yet, or not running)":t===502||t===503||t===504?`HTTP ${t}: Traefik found the route but the container isn't answering (still starting, or unhealthy)`:`HTTP ${t}`}function Pt(e){let t=e.filter(o=>o.status!==void 0),r=e.filter(o=>!o.ok);if(t.length===0)return{name:"Service Health",didPass:!0,isSkipped:!0,message:`No services responded - skipped ping of ${h(e.length,"service")} (stack may be down, or Traefik never bound :80)`,fix:"If `flisk up` is already running, check Traefik/port 80 in the Tilt UI. Otherwise start with: flisk up"};if(r.length===0)return{name:"Service Health",didPass:!0,message:`All ${h(e.length,"service")} responding on /health`};let s=r.map(o=>`${o.name} (${Oe(o)})
8
+ `)}`,fix:`Stop the foreign container(s), e.g. \`docker stop ${a[0]?.name}\`, or shut down the other Flisk/Tilt project using that Traefik. Then re-run \`flisk up\`.`}}function Z(e,t){return new Promise(r=>{let s=Te();s.once("error",n=>r(n.code==="EADDRINUSE"?"in-use":"unknown")),s.once("listening",()=>s.close(()=>r("free"))),s.listen(e,t)})}async function kt(e){for(let t=0;t<2;t++){let r=await Z(e,"0.0.0.0");if(r==="unknown")return r;if(r==="free"){let s=await Z(e,"127.0.0.1");if(s==="free"||s==="unknown")return s}t===0&&await new Promise(s=>setTimeout(s,50))}return"in-use"}function Oe(e){let{status:t}=e;return t===void 0?e.error??"no response":t===404?"HTTP 404: Traefik is answering but has no route for this URL (container not started yet, or not running)":t===502||t===503||t===504?`HTTP ${t}: Traefik found the route but the container isn't answering (still starting, or unhealthy)`:`HTTP ${t}`}function Pt(e){let t=e.filter(o=>o.status!==void 0),r=e.filter(o=>!o.ok);if(t.length===0)return{name:"Service Health",didPass:!0,isSkipped:!0,message:`No services responded - skipped ping of ${h(e.length,"service")} (stack may be down, or Traefik never bound :80)`,fix:"If `flisk up` is already running, check Traefik/port 80 in the Tilt UI. Otherwise start with: flisk up"};if(r.length===0)return{name:"Service Health",didPass:!0,message:`All ${h(e.length,"service")} responding on /health`};let s=r.map(o=>`${o.name} (${Oe(o)})
9
9
  ${o.url}`).join(`
10
10
  `),n=r.some(o=>o.status===404);return{name:"Service Health",didPass:!1,message:`${h(r.length,"service")} not healthy (${e.length-r.length}/${e.length} healthy):
11
- ${s}`,fix:n?"If `flisk up` just started, images may still be building: re-run `flisk doctor` in a minute. Otherwise check `docker ps` and the resource in the Tilt UI, and compare `flisk networks` with the URL above.":"Check container state and routing: docker ps, then flisk networks to compare the advertised URLs against Traefik's routers"}}function Tt(e){if(e.length===0)return{name:"Service Smoke",didPass:!0,isSkipped:!0,message:"No read-only smoke checks declared"};let t=e.filter(s=>!s.ok);if(t.length===0)return{name:"Service Smoke",didPass:!0,message:`All ${h(e.length,"service")} pass their smoke checks`};let r=t.map(s=>s.failure??`${s.name}: failed`).join(`
11
+ ${s}`,fix:n?"If `flisk up` just started, images may still be building: re-run `flisk doctor` in a minute. Otherwise check `docker ps` and the resource in the Tilt UI, and compare `flisk networks` with the URL above.":"Check container state and routing: docker ps, then flisk networks to compare the advertised URLs against Traefik's routers"}}function St(e){if(e.length===0)return{name:"Service Smoke",didPass:!0,isSkipped:!0,message:"No read-only smoke checks declared"};let t=e.filter(s=>!s.ok);if(t.length===0)return{name:"Service Smoke",didPass:!0,message:`All ${h(e.length,"service")} pass their smoke checks`};let r=t.map(s=>s.failure??`${s.name}: failed`).join(`
12
12
  `);return{name:"Service Smoke",didPass:!1,message:`${h(t.length,"service")} failing a smoke check (${e.length-t.length}/${e.length} passing):
13
- ${r}`,fix:'Add the route the smoke step expects, or correct its "path" in the service.json "smoke" block. Then re-run flisk doctor.'}}function St(e){let t=e.filter(n=>n.status!==void 0);if(t.length===0)return{name:"Advertised Endpoints",didPass:!0,isSkipped:!0,message:"No services responded - skipped advertised endpoint check"};let r=t.filter(n=>n.status===404);if(r.length===0)return{name:"Advertised Endpoints",didPass:!0,message:`${h(t.length,"advertised endpoint")} reachable`};let s=r.map(n=>`${n.name} (404)
13
+ ${r}`,fix:'Add the route the smoke step expects, or correct its "path" in the service.json "smoke" block. Then re-run flisk doctor.'}}function Tt(e){let t=e.filter(n=>n.status!==void 0);if(t.length===0)return{name:"Advertised Endpoints",didPass:!0,isSkipped:!0,message:"No services responded - skipped advertised endpoint check"};let r=t.filter(n=>n.status===404);if(r.length===0)return{name:"Advertised Endpoints",didPass:!0,message:`${h(t.length,"advertised endpoint")} reachable`};let s=r.map(n=>`${n.name} (404)
14
14
  ${n.url}`).join(`
15
15
  `);return{name:"Advertised Endpoints",didPass:!0,isWarning:!0,message:`${h(r.length,"advertised link")} ${r.length===1?"returns":"return"} 404 (the service may be healthy, but nothing answers at this exact path):
16
- ${s}`,fix:'Nothing handles this exact path, so opening the link shows a 404 even when /health is fine. If this API has no root route, you can leave it. Otherwise add a GET route for it (for example one that returns the service name), or declare a read-only "smoke" step on a real route in service.json. The URL flisk networks and the Flisk App print stays the same until the CLI changes how it reports it.'}}function bt(e=$){let t="";try{t=y(e,"tilt",["get","uiresources","-o","json"],"tilt get uiresources -o json",{stdio:"pipe",encoding:"utf-8",timeout:b})}catch{return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"Tilt is not running - skipped resource status check",fix:"Start them with: flisk up"}}let r;try{r=_e(t,Re())}catch{return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"Could not parse Tilt resource status - skipped"}}if(r.total===0)return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"No Tilt UIResources found"};if(r.failures.length===0){let p=r.deferredCount>0?`, ${r.deferredCount} deferred`:"";return{name:"Tilt Resources",didPass:!0,message:`Tilt resources healthy (${r.okCount} ok, ${r.pendingCount} pending${p})`}}let s=Ne(r.failures),o=s.slice(0,20),a=s.length-o.length,c=o.map(p=>({failure:p,why:Ae(p,e)})),u=c.map(({failure:p,why:ne})=>`${p.name}: ${ne}`).join(`
16
+ ${s}`,fix:'Nothing handles this exact path, so opening the link shows a 404 even when /health is fine. If this API has no root route, you can leave it. Otherwise add a GET route for it (for example one that returns the service name), or declare a read-only "smoke" step on a real route in service.json. The URL flisk networks and the Flisk App print stays the same until the CLI changes how it reports it.'}}function bt(e=S){let t="";try{t=$(e,"tilt",["get","uiresources","-o","json"],"tilt get uiresources -o json",{stdio:"pipe",encoding:"utf-8",timeout:y})}catch{return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"Tilt is not running - skipped resource status check",fix:"Start them with: flisk up"}}let r;try{r=_e(t,Re())}catch{return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"Could not parse Tilt resource status - skipped"}}if(r.total===0)return{name:"Tilt Resources",didPass:!0,isSkipped:!0,message:"No Tilt UIResources found"};if(r.failures.length===0){let p=r.deferredCount>0?`, ${r.deferredCount} deferred`:"";return{name:"Tilt Resources",didPass:!0,message:`Tilt resources healthy (${r.okCount} ok, ${r.pendingCount} pending${p})`}}let s=Ce(r.failures),o=s.slice(0,20),a=s.length-o.length,c=o.map(p=>({failure:p,why:Ae(p,e)})),u=c.map(({failure:p,why:ne})=>`${p.name}: ${ne}`).join(`
17
17
  `),i=a>0?`
18
18
  \u2026and ${h(a,"more failed resource")}`:"",d=r.pendingCount>0?`
19
19
  ${h(r.pendingCount,"resource")} still pending/not started \u2014 often blocked by the failures above.`:"",l=r.deferredCount>0?`
20
- ${h(r.deferredCount,"resource")} intentionally deferred (sablier.deferStart) \u2014 not started until first request, unrelated to the failures above.`:"",f=s.some(p=>/port is already allocated/i.test(p.error)),m=s.some(p=>q(p.error)||q(te(p.error))),g=c.some(({why:p})=>/Kafka broker unreachable|kafka:9092/i.test(p)),k="Open the Tilt UI URL printed by flisk up (default port "+j.tiltUi+" when TILT_PORT is unset), inspect the red resources, fix the listed errors, then `tilt trigger <resource>` or re-run `flisk up`.";return f?k="Free the conflicting host port (usually 80/443): `docker ps --filter publish=80` then `docker stop <other-traefik>`. Re-trigger Traefik in the Tilt UI or run `flisk up` again.":m?k="Start Verdaccio (`bun run verdaccio:start`), ensure packages are published (`bun run publish:all` or `bash scripts/build/publish-to-verdaccio.sh`), confirm `curl http://localhost:4873` works, then `tilt trigger` the failed resources.":g&&(k="Kafka is not running (optional infra). Start it, point the bridge at a real broker, or disable Kafka-dependent resources until Kafka is enabled."),{name:"Tilt Resources",didPass:!1,message:`Tilt reports ${h(r.failures.length,"failed resource")}:
21
- ${u}${i}${d}${l}`,fix:k}}var Ce=/^(traefik|postgres|nats|infisical|verdaccio|proxy)([.-]|$)/i;function Y(e){return Ce.test(e)}function Ne(e){return[...e].sort((t,r)=>{let s=Y(t.name)?0:1,n=Y(r.name)?0:1;return s!==n?s-n:t.name.localeCompare(r.name)})}function Ie(e,t=$,r=x()){try{let s=y(t,"docker",["ps","-a","--format","{{.Names}}"],"docker ps -a --format '{{.Names}}'",{stdio:"pipe",encoding:"utf-8",timeout:b}).split(`
22
- `).map(i=>i.trim()).filter(Boolean),n=`-autogenerated-${e}-1`,o=s.find(i=>i===e)??s.find(i=>i.startsWith(`${r}-`)&&i.endsWith(n))??s.find(i=>i.endsWith(n))??s.find(i=>i.includes(e));if(!o)return null;let a=y(t,"docker",["logs","--tail","120",o],`docker logs --tail 120 ${X(o)} 2>&1`,{stdio:"pipe",encoding:"utf-8",timeout:b});if(/getaddrinfo ENOTFOUND/i.test(a)&&/kafka:9092/i.test(a))return"runtime crash: Kafka broker unreachable (getaddrinfo ENOTFOUND kafka:9092)";if(/ECONNREFUSED/i.test(a)&&/kafka/i.test(a))return"runtime crash: Kafka connection refused";let c=a.match(/ConnectionRefused downloading package manifest (@[A-Za-z0-9._/-]+)/i);if(c?.[1])return`runtime/build log: private registry ConnectionRefused for ${c[1]}`;if(/ZodError/i.test(a)){let i=[...a.matchAll(/"path"\s*:\s*\[\s*"([^"]+)"\s*\]/g)].map(l=>l[1]),d=[...new Set(i)].slice(0,6);return d.length>0?`runtime crash: ZodError missing required config/env: ${d.join(", ")}`:"runtime crash: ZodError during config/env validation"}let u=a.match(/error:\s+Failed to [^:\n]+[^\n]{0,120}/i)?.[0]??a.match(/Failed to (?:start|initialize) [^\n]{0,120}/i)?.[0]??a.match(/^\s*error:\s+[^\n]{0,160}/im)?.[0];if(u)return`runtime crash: ${u.replace(/\s+/g," ").trim().slice(0,180)}`}catch{return null}return null}function Ae(e,t=$){return e.error?te(e.error):e.runtimeStatus==="error"?Ie(e.name,t)??"runtime error (container crashed or unhealthy \u2014 check Tilt/docker logs)":e.updateStatus||e.runtimeStatus||"unknown error"}var je=/\.(ts|tsx|mts|js|mjs|cjs)$/,Fe=new Set(["node_modules","dist",I,"tests","__tests__"]);function se(e){let t=[];for(let r of Te(e,{withFileTypes:!0}))r.isDirectory()?Fe.has(r.name)||t.push(...se(P(e,r.name))):je.test(r.name)&&!/\.(test|spec)\./.test(r.name)&&t.push(P(e,r.name));return t}function De(e){let t=e?.healthCheckPath||"/health";return{container:t,traefik:e?.traefik?.healthCheck||t}}function Le(e){let t=[];for(let r of e){if(!_(r.config?.appType))continue;let s=P(r.path,"src");if(!C(s))continue;let n=se(s);if(n.length===0)continue;let o=n.map(i=>N(i,"utf-8")),{container:a,traefik:c}=De(r.config),u=a===c?[{path:a,usedBy:"container and Traefik healthchecks"}]:[{path:a,usedBy:"container healthcheck"},{path:c,usedBy:"Traefik healthcheck"}];for(let{path:i,usedBy:d}of u){let l=["'",'"',"`"].map(f=>`${f}${i}${f}`);o.some(f=>l.some(m=>f.includes(m)))||t.push({name:r.name,healthPath:i,usedBy:d})}}return t}function yt(e=T()??process.cwd()){let t=[];try{t=D(e)}catch{return{name:"Health Routes",didPass:!0,isSkipped:!0,message:"Could not read services - skipped health route check"}}let r=t.filter(o=>_(o.config?.appType));if(r.length===0)return{name:"Health Routes",didPass:!0,isSkipped:!0,message:"No backend services to check"};let s=Le(r);return s.length===0?{name:"Health Routes",didPass:!0,message:`All ${h(r.length,"backend")} define their health route`}:{name:"Health Routes",didPass:!1,message:`Backends without a health route (the container never turns healthy, so Traefik returns 404):
20
+ ${h(r.deferredCount,"resource")} intentionally deferred (sablier.deferStart) \u2014 not started until first request, unrelated to the failures above.`:"",f=s.some(p=>/port is already allocated/i.test(p.error)),m=s.some(p=>q(p.error)||q(te(p.error))),g=c.some(({why:p})=>/Kafka broker unreachable|kafka:9092/i.test(p)),k="Open the Tilt UI URL printed by flisk up (default port "+F.tiltUi+" when TILT_PORT is unset), inspect the red resources, fix the listed errors, then `tilt trigger <resource>` or re-run `flisk up`.";return f?k="Free the conflicting host port (usually 80/443): `docker ps --filter publish=80` then `docker stop <other-traefik>`. Re-trigger Traefik in the Tilt UI or run `flisk up` again.":m?k="Start Verdaccio (`bun run verdaccio:start`), ensure packages are published (`bun run publish:all` or `bash scripts/build/publish-to-verdaccio.sh`), confirm `curl http://localhost:4873` works, then `tilt trigger` the failed resources.":g&&(k="Kafka is not running (optional infra). Start it, point the bridge at a real broker, or disable Kafka-dependent resources until Kafka is enabled."),{name:"Tilt Resources",didPass:!1,message:`Tilt reports ${h(r.failures.length,"failed resource")}:
21
+ ${u}${i}${d}${l}`,fix:k}}var Ie=/^(traefik|postgres|nats|infisical|verdaccio|proxy)([.-]|$)/i;function Y(e){return Ie.test(e)}function Ce(e){return[...e].sort((t,r)=>{let s=Y(t.name)?0:1,n=Y(r.name)?0:1;return s!==n?s-n:t.name.localeCompare(r.name)})}function Ne(e,t=S,r=x()){try{let s=$(t,"docker",["ps","-a","--format","{{.Names}}"],"docker ps -a --format '{{.Names}}'",{stdio:"pipe",encoding:"utf-8",timeout:y}).split(`
22
+ `).map(i=>i.trim()).filter(Boolean),n=`-autogenerated-${e}-1`,o=s.find(i=>i===e)??s.find(i=>i.startsWith(`${r}-`)&&i.endsWith(n))??s.find(i=>i.endsWith(n))??s.find(i=>i.includes(e));if(!o)return null;let a=$(t,"docker",["logs","--tail","120",o],`docker logs --tail 120 ${X(o)} 2>&1`,{stdio:"pipe",encoding:"utf-8",timeout:y});if(/getaddrinfo ENOTFOUND/i.test(a)&&/kafka:9092/i.test(a))return"runtime crash: Kafka broker unreachable (getaddrinfo ENOTFOUND kafka:9092)";if(/ECONNREFUSED/i.test(a)&&/kafka/i.test(a))return"runtime crash: Kafka connection refused";let c=a.match(/ConnectionRefused downloading package manifest (@[A-Za-z0-9._/-]+)/i);if(c?.[1])return`runtime/build log: private registry ConnectionRefused for ${c[1]}`;if(/ZodError/i.test(a)){let i=[...a.matchAll(/"path"\s*:\s*\[\s*"([^"]+)"\s*\]/g)].map(l=>l[1]),d=[...new Set(i)].slice(0,6);return d.length>0?`runtime crash: ZodError missing required config/env: ${d.join(", ")}`:"runtime crash: ZodError during config/env validation"}let u=a.match(/error:\s+Failed to [^:\n]+[^\n]{0,120}/i)?.[0]??a.match(/Failed to (?:start|initialize) [^\n]{0,120}/i)?.[0]??a.match(/^\s*error:\s+[^\n]{0,160}/im)?.[0];if(u)return`runtime crash: ${u.replace(/\s+/g," ").trim().slice(0,180)}`}catch{return null}return null}function Ae(e,t=S){return e.error?te(e.error):e.runtimeStatus==="error"?Ne(e.name,t)??"runtime error (container crashed or unhealthy \u2014 check Tilt/docker logs)":e.updateStatus||e.runtimeStatus||"unknown error"}var Fe=/\.(ts|tsx|mts|js|mjs|cjs)$/,Le=new Set(["node_modules","dist",N,"tests","__tests__"]);function se(e){let t=[];for(let r of Se(e,{withFileTypes:!0}))r.isDirectory()?Le.has(r.name)||t.push(...se(P(e,r.name))):Fe.test(r.name)&&!/\.(test|spec)\./.test(r.name)&&t.push(P(e,r.name));return t}function je(e){let t=e?.healthCheckPath||"/health";return{container:t,traefik:e?.traefik?.healthCheck||t}}function De(e){let t=[];for(let r of e){if(!_(r.config?.appType))continue;let s=P(r.path,"src");if(!I(s))continue;let n=se(s);if(n.length===0)continue;let o=n.map(i=>C(i,"utf-8")),{container:a,traefik:c}=je(r.config),u=a===c?[{path:a,usedBy:"container and Traefik healthchecks"}]:[{path:a,usedBy:"container healthcheck"},{path:c,usedBy:"Traefik healthcheck"}];for(let{path:i,usedBy:d}of u){let l=["'",'"',"`"].map(f=>`${f}${i}${f}`);o.some(f=>l.some(m=>f.includes(m)))||t.push({name:r.name,healthPath:i,usedBy:d})}}return t}function yt(e=T()??process.cwd()){let t=[];try{t=j(e)}catch{return{name:"Health Routes",didPass:!0,isSkipped:!0,message:"Could not read services - skipped health route check"}}let r=t.filter(o=>_(o.config?.appType));if(r.length===0)return{name:"Health Routes",didPass:!0,isSkipped:!0,message:"No backend services to check"};let s=De(r);return s.length===0?{name:"Health Routes",didPass:!0,message:`All ${h(r.length,"backend")} define their health route`}:{name:"Health Routes",didPass:!1,message:`Backends without a health route (the container never turns healthy, so Traefik returns 404):
23
23
  ${s.map(o=>`${o.name}: no "${o.healthPath}" route in src/ (probed by the ${o.usedBy})`).join(`
24
- `)}`,fix:`Add the route, e.g. for Hono: app.get("${s[0]?.healthPath}", (c) => c.json({ status: "ok" })). To use a different path, set "healthCheckPath" (container healthcheck) or "traefik.healthCheck" (Traefik) in its service.json.`}}export{R as a,Ve as b,V as c,Ye as d,Qe as e,Xe as f,et as g,W as h,M as i,$e as j,we as k,Re as l,_e as m,te as n,He as o,mt as p,gt as q,kt as r,Pt as s,Tt as t,St as u,bt as v,yt as w};
24
+ `)}`,fix:`Add the route, e.g. for Hono: app.get("${s[0]?.healthPath}", (c) => c.json({ status: "ok" })). To use a different path, set "healthCheckPath" (container healthcheck) or "traefik.healthCheck" (Traefik) in its service.json.`}}export{R as a,Ve as b,V as c,Ye as d,Qe as e,Xe as f,et as g,W as h,M as i,$e as j,we as k,Re as l,_e as m,te as n,He as o,mt as p,gt as q,kt as r,Pt as s,St as t,Tt as u,bt as v,yt as w};
@@ -0,0 +1,3 @@
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{randomUUID as F}from"node:crypto";import{existsSync as p,mkdirSync as g,readFileSync as y,statSync as M,writeFileSync as h}from"node:fs";import{homedir as P}from"node:os";import{join as a}from"node:path";import{spawnSync as _}from"node:child_process";import{existsSync as N,mkdirSync as w,mkdtempSync as C,readdirSync as $,renameSync as L,rmSync as v,statSync as j,writeFileSync as O}from"node:fs";import{tmpdir as D}from"node:os";import{join as c}from"node:path";function S(e,n){let r=C(c(D(),"flisk-ext-")),o=c(r,"bundle.tar.gz");O(o,e),w(n,{recursive:!0});let t=process.platform==="win32"?"tar.exe":"tar",i=_(t,["xzf",o,"-C",n,"--strip-components=1"],{stdio:"pipe",windowsHide:!0});if(i.status!==0){let s=c(r,"fallback");w(s,{recursive:!0});let f=_(t,["xzf",o,"-C",s],{stdio:"pipe",windowsHide:!0});if(f.status!==0)throw v(r,{recursive:!0,force:!0}),new Error(`tar extraction failed: ${f.stderr?.toString()||i.stderr?.toString()||"unknown error"}`);let l=$(s),[u]=l,m=l.length===1&&u!==void 0&&N(c(s,u))&&j(c(s,u)).isDirectory()?c(s,u):s;for(let d of $(m))L(c(m,d),c(n,d))}v(r,{recursive:!0,force:!0})}var U="https://tdk-extension-dist.oranguman.workers.dev/v1/premium/bundle.tar.gz",A=["playwright","c4-diagram","logging","agents-md","sablier","verdaccio"],z=720*60*1e3,k={"typescript/playwright_config.star":"engine/topologies/tilt/generators/typescript/playwright_config.star","generators/agents_md.star":"engine/topologies/tilt/generators/agents_md.star","c4_diagram.star":"engine/topologies/tilt/generators/c4_diagram.star","observability/logging.star":"engine/topologies/platform/observability/logging.star","generators/database_provisioner.star":"engine/topologies/tilt/generators/database_provisioner.star","generators/dependency_manifest.star":"engine/topologies/tilt/generators/dependency_manifest.star","generators/fixed_frontend_tsconfig.star":"engine/topologies/tilt/generators/typescript/fixed_frontend_tsconfig.star","synthetic_monitor.star":"engine/resources/synthetic_monitor.star","synthetic-monitor-topology.star":"engine/topologies/platform/services/synthetic-monitor.star","database-management-service.yaml":"platform/services/platform/database-management/service.yaml","networking/sablier_container_cycle.star":"engine/topologies/platform/docker/networking/sablier_container_cycle.star","registries/verdaccio_loader.star":"engine/topologies/platform/registries/verdaccio_loader.star"};function I(){return process.env.FLISK_LICENSE_KEY?.trim()||null}function R(){return process.env.FLISK_PREMIUM_ENDPOINT?.trim()||U}function x(e){let n=a(e,".flisk",".project-id");if(p(n))return y(n,"utf-8").trim();let r=F();return g(a(e,".flisk"),{recursive:!0}),h(n,`${r}
3
+ `),r}function B(e){let n=e.replace(/[^a-zA-Z0-9_-]/g,"_");return a(P(),".flisk","cache",`premium-${n}`,"premium.tar.gz")}function T(e){return p(e)?Date.now()-M(e).mtimeMs<z:!1}async function E(e,n,r){let o=`${R()}?resource=${encodeURIComponent(n)}&projectId=${encodeURIComponent(r)}`,t=await fetch(o,{headers:{Authorization:`Bearer ${e}`}});return t.status!==401?t:(await t.arrayBuffer().catch(()=>{}),fetch(`${o}&key=${encodeURIComponent(e)}`))}async function H(e,n){let r=[];for(let o of A){let t;try{t=await E(e,o,n)}catch(i){return console.warn(`\u26A0\uFE0F Premium fetch failed (network error): ${i.message}`),null}if(t.ok){let i=Buffer.from(await t.arrayBuffer());return console.info(`\u{1F50E} Premium entitlement probe: granted resource=${o} (HTTP ${t.status}); prior denials=${r.join(", ")||"none"}`),console.info(`\u{1F50E} Premium bundle download: ${i.byteLength} bytes`),i}if(t.status===401||t.status===403){r.push(`${o}=${t.status}`);continue}return console.warn(`\u26A0\uFE0F Premium fetch failed: ${o} returned HTTP ${t.status}; prior entitlement probes: ${r.join(", ")||"none"}`),null}return console.warn(`\u26A0\uFE0F Premium entitlement probes denied: ${r.join(", ")}`),null}async function re(e,n){let r=I();if(!r)return!1;let o=B(r);if(T(o))console.info("\u{1F50E} Premium bundle cache: hit (cached bundle reused)");else{console.info("\u{1F50E} Premium bundle cache: miss; requesting bundle from distribution service");let t=x(e),i=await H(r,t);if(!i)return console.warn("\u26A0\uFE0F No premium resources unlocked for this key - using free tier only."),!1;g(a(o,".."),{recursive:!0}),h(o,i)}try{let t=a(o,"..","extracted");g(t,{recursive:!0}),S(y(o),t);let i=0,s=[];for(let[l,u]of Object.entries(k)){let m=a(t,l);if(!p(m)){s.push(l);continue}let d=a(n,u);g(a(d,".."),{recursive:!0}),h(d,y(m)),i++}let f=a(t,"networking/sablier_container_cycle.star");if(console.info(`\u{1F50E} Premium bundle contents: mapped=${i}/${Object.keys(k).length}; sablier_overlay=${p(f)?"present":"MISSING"}`),s.length>0&&console.info(`\u{1F50E} Premium bundle missing mapped files: ${s.join(", ")}`),!p(f)&&process.env.FLISK_PREMIUM_DIAGNOSTICS==="1"){let l=await G(e);console.info(`\u{1F50E} Sablier entitlement check: ${l?"granted":"not confirmed"}; compare with sablier_overlay above to distinguish license access from bundle contents`)}return i>0?(console.log(`\u2713 Premium resources unlocked (${i} file${i===1?"":"s"})`),!0):!1}catch(t){return console.warn(`\u26A0\uFE0F Failed to apply premium overlay: ${t.message}`),!1}}function K(e,n){let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return a(P(),".flisk","cache",`premium-${r}`,`${n}-access.json`)}async function b(e,n){let r=I();if(!r)return!1;let o=K(r,n);if(T(o))try{let s=JSON.parse(y(o,"utf-8"));return console.info(`\u{1F50E} ${n} entitlement probe: cache=${s.granted===!0?"granted":"denied"}`),s.granted===!0}catch{}let t=x(e),i=!1;try{let s=await E(r,n,t);i=s.ok,console.info(`\u{1F50E} ${n} entitlement probe: HTTP ${s.status} (${i?"granted":"denied"})`),s.body&&await s.arrayBuffer().catch(()=>{})}catch(s){return console.warn(`\u26A0\uFE0F ${n} license check failed (network error): ${s.message}`),!1}try{g(a(o,".."),{recursive:!0}),h(o,JSON.stringify({granted:i,checked:new Date().toISOString()}))}catch{}return i}async function ne(e){return b(e,"verdaccio")}async function oe(e){return b(e,"ddd")}async function G(e){return b(e,"sablier")}export{S as a,re as b,ne as c,oe as d,G as e};