@flisk-sh/flisk 0.0.0-stage → 1.3.190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/CHANGELOG.md +492 -0
  2. package/LICENSE +21 -0
  3. package/README.md +479 -2
  4. package/Tiltfile +151 -0
  5. package/cli/bin/flisk.js +42 -0
  6. package/cli/dist/agent-runtimes/custom.js +335 -0
  7. package/cli/dist/agent-runtimes/registry.js +34 -0
  8. package/cli/dist/backend-frameworks/elysia.js +38 -0
  9. package/cli/dist/backend-frameworks/express.js +49 -0
  10. package/cli/dist/backend-frameworks/fastify.js +43 -0
  11. package/cli/dist/backend-frameworks/h3.js +37 -0
  12. package/cli/dist/backend-frameworks/koa.js +47 -0
  13. package/cli/dist/backend-frameworks/mcp.js +86 -0
  14. package/cli/dist/backend-frameworks/nestjs.js +55 -0
  15. package/cli/dist/backend-frameworks/registry.js +134 -0
  16. package/cli/dist/backend-frameworks/types.js +1 -0
  17. package/cli/dist/backend-languages/bun.js +76 -0
  18. package/cli/dist/backend-languages/go.js +125 -0
  19. package/cli/dist/backend-languages/node.js +122 -0
  20. package/cli/dist/backend-languages/python.js +94 -0
  21. package/cli/dist/backend-languages/registry.js +37 -0
  22. package/cli/dist/backend-languages/rust.js +82 -0
  23. package/cli/dist/backend-languages/types.js +1 -0
  24. package/cli/dist/cli.js +29 -0
  25. package/cli/dist/commands/__tests__/project-e2e-helpers.js +49 -0
  26. package/cli/dist/commands/__tests__/ui-loading-screen.test.js +16 -0
  27. package/cli/dist/commands/agent.js +182 -0
  28. package/cli/dist/commands/completion-candidates.js +116 -0
  29. package/cli/dist/commands/completion.js +843 -0
  30. package/cli/dist/commands/config.js +362 -0
  31. package/cli/dist/commands/doctor.js +1504 -0
  32. package/cli/dist/commands/down.js +114 -0
  33. package/cli/dist/commands/eject.js +108 -0
  34. package/cli/dist/commands/help.js +152 -0
  35. package/cli/dist/commands/import.js +164 -0
  36. package/cli/dist/commands/logs.js +119 -0
  37. package/cli/dist/commands/maintainers.js +102 -0
  38. package/cli/dist/commands/mcp.js +28 -0
  39. package/cli/dist/commands/networks.js +306 -0
  40. package/cli/dist/commands/project.js +447 -0
  41. package/cli/dist/commands/projects.js +103 -0
  42. package/cli/dist/commands/registry.js +53 -0
  43. package/cli/dist/commands/resource.js +992 -0
  44. package/cli/dist/commands/resources.js +127 -0
  45. package/cli/dist/commands/restart.js +89 -0
  46. package/cli/dist/commands/runtime.js +75 -0
  47. package/cli/dist/commands/stack.js +171 -0
  48. package/cli/dist/commands/stacks.js +71 -0
  49. package/cli/dist/commands/status.js +211 -0
  50. package/cli/dist/commands/ui.js +725 -0
  51. package/cli/dist/commands/up.js +609 -0
  52. package/cli/dist/commands/upgrade.js +840 -0
  53. package/cli/dist/commands/version.js +10 -0
  54. package/cli/dist/components/Accessible.js +11 -0
  55. package/cli/dist/components/BaseTooltip.js +30 -0
  56. package/cli/dist/components/DetailPanel.js +33 -0
  57. package/cli/dist/components/FileTree.js +51 -0
  58. package/cli/dist/components/ResourceSelectInput.js +42 -0
  59. package/cli/dist/components/ResourceTable.js +35 -0
  60. package/cli/dist/components/ServiceIssues.js +13 -0
  61. package/cli/dist/components/TUIHeader.js +27 -0
  62. package/cli/dist/components/TabBar.js +27 -0
  63. package/cli/dist/components/Tooltip.js +13 -0
  64. package/cli/dist/components/index.js +11 -0
  65. package/cli/dist/components/ui-theme.js +120 -0
  66. package/cli/dist/config/platform-standards.js +182 -0
  67. package/cli/dist/frontend-frameworks/lit.js +64 -0
  68. package/cli/dist/frontend-frameworks/preact.js +62 -0
  69. package/cli/dist/frontend-frameworks/qwik.js +61 -0
  70. package/cli/dist/frontend-frameworks/react.js +69 -0
  71. package/cli/dist/frontend-frameworks/registry.js +83 -0
  72. package/cli/dist/frontend-frameworks/solid.js +62 -0
  73. package/cli/dist/frontend-frameworks/svelte.js +67 -0
  74. package/cli/dist/frontend-frameworks/tanstack-router.js +101 -0
  75. package/cli/dist/frontend-frameworks/types.js +1 -0
  76. package/cli/dist/frontend-frameworks/vanilla.js +59 -0
  77. package/cli/dist/frontend-frameworks/vue.js +72 -0
  78. package/cli/dist/generator/__tests__/golden-helpers.js +43 -0
  79. package/cli/dist/generator/extension-fetch.js +291 -0
  80. package/cli/dist/generator/resource-templates.js +133 -0
  81. package/cli/dist/generator/template-engine.js +801 -0
  82. package/cli/dist/index.js +10 -0
  83. package/cli/dist/mcp/server.js +101 -0
  84. package/cli/dist/mcp/tools.js +351 -0
  85. package/cli/dist/program.js +37 -0
  86. package/cli/dist/types/index.js +38 -0
  87. package/cli/dist/utils/agent-host.js +36 -0
  88. package/cli/dist/utils/atomic-write.js +36 -0
  89. package/cli/dist/utils/bun-floor.js +9 -0
  90. package/cli/dist/utils/bun-requirement.js +10 -0
  91. package/cli/dist/utils/cache.js +63 -0
  92. package/cli/dist/utils/cold-preflight.js +257 -0
  93. package/cli/dist/utils/command-helpers.js +57 -0
  94. package/cli/dist/utils/constants.js +160 -0
  95. package/cli/dist/utils/discovery-context.js +71 -0
  96. package/cli/dist/utils/discovery-paths.js +93 -0
  97. package/cli/dist/utils/docker.js +34 -0
  98. package/cli/dist/utils/doctor-crashloop.js +161 -0
  99. package/cli/dist/utils/doctor-fix.js +391 -0
  100. package/cli/dist/utils/doctor-host.js +66 -0
  101. package/cli/dist/utils/doctor-report.js +78 -0
  102. package/cli/dist/utils/doctor-runtime.js +880 -0
  103. package/cli/dist/utils/doctor-starlark.js +132 -0
  104. package/cli/dist/utils/doctor-wiring.js +698 -0
  105. package/cli/dist/utils/down-cleanup.js +125 -0
  106. package/cli/dist/utils/env-validator.js +266 -0
  107. package/cli/dist/utils/errors.js +175 -0
  108. package/cli/dist/utils/exec-async.js +31 -0
  109. package/cli/dist/utils/file-helpers.js +104 -0
  110. package/cli/dist/utils/formatting.js +165 -0
  111. package/cli/dist/utils/generated-paths.js +51 -0
  112. package/cli/dist/utils/help-command.js +11 -0
  113. package/cli/dist/utils/host-port-config.js +140 -0
  114. package/cli/dist/utils/host-port-plan.js +100 -0
  115. package/cli/dist/utils/json-output.js +29 -0
  116. package/cli/dist/utils/machine-output.js +33 -0
  117. package/cli/dist/utils/paths.js +43 -0
  118. package/cli/dist/utils/platform.js +58 -0
  119. package/cli/dist/utils/port-assignment.js +75 -0
  120. package/cli/dist/utils/port-conflict-fix.js +25 -0
  121. package/cli/dist/utils/port-fallback-notice.js +17 -0
  122. package/cli/dist/utils/port-listener-probe.js +20 -0
  123. package/cli/dist/utils/project-config-defaults.js +17 -0
  124. package/cli/dist/utils/project-features.js +91 -0
  125. package/cli/dist/utils/project-templates.js +32 -0
  126. package/cli/dist/utils/prompt.js +97 -0
  127. package/cli/dist/utils/resource-features.js +184 -0
  128. package/cli/dist/utils/resource-kind.js +9 -0
  129. package/cli/dist/utils/schema-version-gate.js +45 -0
  130. package/cli/dist/utils/search-status.js +12 -0
  131. package/cli/dist/utils/secret-redaction.js +73 -0
  132. package/cli/dist/utils/service-config-checks.js +189 -0
  133. package/cli/dist/utils/service-manifest.js +254 -0
  134. package/cli/dist/utils/service-runtime-state.js +66 -0
  135. package/cli/dist/utils/service-urls.js +112 -0
  136. package/cli/dist/utils/services.js +360 -0
  137. package/cli/dist/utils/shared-infra.js +45 -0
  138. package/cli/dist/utils/shared-platform-postgres.js +232 -0
  139. package/cli/dist/utils/single-flight.js +21 -0
  140. package/cli/dist/utils/smoke.js +401 -0
  141. package/cli/dist/utils/spinner.js +40 -0
  142. package/cli/dist/utils/stack-features.js +15 -0
  143. package/cli/dist/utils/stack-status.js +14 -0
  144. package/cli/dist/utils/startup-report.js +78 -0
  145. package/cli/dist/utils/status-message.js +21 -0
  146. package/cli/dist/utils/status-ports.js +33 -0
  147. package/cli/dist/utils/suggestions.js +63 -0
  148. package/cli/dist/utils/tar.js +46 -0
  149. package/cli/dist/utils/tdk-version.js +51 -0
  150. package/cli/dist/utils/terminal-layout.js +19 -0
  151. package/cli/dist/utils/tilt-events.js +194 -0
  152. package/cli/dist/utils/tilt-logs.js +61 -0
  153. package/cli/dist/utils/tilt-port-owner.js +63 -0
  154. package/cli/dist/utils/tilt-process.js +54 -0
  155. package/cli/dist/utils/tilt-resource-state.js +32 -0
  156. package/cli/dist/utils/tilt-startup.js +49 -0
  157. package/cli/dist/utils/tilt-unreachable-message.js +9 -0
  158. package/cli/dist/utils/tilt.js +104 -0
  159. package/cli/dist/utils/ui-keymap.js +129 -0
  160. package/cli/dist/utils/ui-service-state.js +34 -0
  161. package/cli/dist/utils/up-only.js +28 -0
  162. package/cli/dist/utils/up-readiness.js +118 -0
  163. package/cli/dist/utils/url-actions.js +103 -0
  164. package/cli/dist/utils/validation.js +62 -0
  165. package/cli/dist/utils/which.js +56 -0
  166. package/cli/dist/utils/windows-doctor.js +176 -0
  167. package/cli/dist-bundle/chunk-6EA4DGCY.js +2 -0
  168. package/cli/dist-bundle/chunk-BZ4H7MM4.js +3 -0
  169. package/cli/dist-bundle/chunk-CLCUIDBH.js +510 -0
  170. package/cli/dist-bundle/cli.js +2017 -0
  171. package/cli/dist-bundle/cold-preflight-SY26O2IG.js +2 -0
  172. package/cli/dist-bundle/devtools-ZUHXW33W.js +5 -0
  173. package/cli/dist-bundle/extension-fetch-J4FFH7TJ.js +2 -0
  174. package/cli/package.json +83 -0
  175. package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  176. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  177. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  178. package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  179. package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  180. package/cli/templates/.tiltignore.hbs +72 -0
  181. package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +220 -0
  182. package/cli/templates/TILT_TECH_STACK.star.hbs +149 -0
  183. package/cli/templates/Tiltfile.hbs +381 -0
  184. package/cli/templates/spec.master.hbs +192 -0
  185. package/discovery/AGENTS.md +362 -0
  186. package/discovery/TILT_DISCOVERY.star +429 -0
  187. package/discovery/Tiltfile +58 -0
  188. package/discovery/config.star +265 -0
  189. package/discovery/constants.star +167 -0
  190. package/discovery/deterministic.star +213 -0
  191. package/discovery/discovery_daemon.star +193 -0
  192. package/discovery/discovery_orchestrator.star +492 -0
  193. package/discovery/filtering.star +7 -0
  194. package/discovery/identity-management-backend/service.yaml +26 -0
  195. package/discovery/identity-management-frontend/service.yaml +29 -0
  196. package/discovery/identity-sdk/service.yaml +9 -0
  197. package/discovery/incremental_discovery.star +215 -0
  198. package/discovery/indexing.star +9 -0
  199. package/discovery/json_manifest_scanner.star +57 -0
  200. package/discovery/libraries.star +48 -0
  201. package/discovery/loading.star +25 -0
  202. package/discovery/manifest/constants.star +106 -0
  203. package/discovery/manifest/loading.star +418 -0
  204. package/discovery/manifest/normalize.star +289 -0
  205. package/discovery/manifest/validation.star +110 -0
  206. package/discovery/normalization.star +13 -0
  207. package/discovery/registry.star +562 -0
  208. package/discovery/resource_snapshot.py +384 -0
  209. package/discovery/resource_snapshot.star +145 -0
  210. package/discovery/schemas.star +3 -0
  211. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  212. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  213. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  214. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  215. package/discovery/test_resource_snapshot.py +253 -0
  216. package/discovery/validation.star +80 -0
  217. package/discovery/versioning.star +3 -0
  218. package/engine/AGENTS.md +706 -0
  219. package/engine/README.md +31 -0
  220. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  221. package/engine/Tiltfile +86 -0
  222. package/engine/assets/docker/golden-layers.Dockerfile +204 -0
  223. package/engine/assets/docker/wake-gateway/Dockerfile +28 -0
  224. package/engine/assets/docker/wake-gateway/decide.test.ts +177 -0
  225. package/engine/assets/docker/wake-gateway/decide.ts +135 -0
  226. package/engine/assets/docker/wake-gateway/server.ts +363 -0
  227. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +39 -0
  228. package/engine/assets/scripts/cleanup-tilt-images.sh +122 -0
  229. package/engine/assets/scripts/mac-m1-resource-monitor.sh +123 -0
  230. package/engine/config.star +5 -0
  231. package/engine/entrypoint.star +101 -0
  232. package/engine/lifecycle/orchestrator.star +263 -0
  233. package/engine/paths.star +719 -0
  234. package/engine/schemas/project-schema.json +147 -0
  235. package/engine/schemas/service-schema.json +537 -0
  236. package/engine/scripts/README.md +89 -0
  237. package/engine/scripts/build-and-publish-lib.sh +207 -0
  238. package/engine/scripts/check-lib-publish.sh +87 -0
  239. package/engine/scripts/debug-container.sh +265 -0
  240. package/engine/scripts/generate-manifest.sh +200 -0
  241. package/engine/spec.master +702 -0
  242. package/engine/spec.master.example +341 -0
  243. package/engine/topologies/README.md +33 -0
  244. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  245. package/engine/topologies/platform/docker/auth/auth.star +207 -0
  246. package/engine/topologies/platform/docker/build/frontend_build_plan.star +65 -0
  247. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  248. package/engine/topologies/platform/docker/build/golden_image_build.star +144 -0
  249. package/engine/topologies/platform/docker/build/golden_image_constants.star +100 -0
  250. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +263 -0
  251. package/engine/topologies/platform/docker/compose/compose.star +637 -0
  252. package/engine/topologies/platform/docker/compose/compose_helpers.star +54 -0
  253. package/engine/topologies/platform/docker/compose/traefik_standalone.star +171 -0
  254. package/engine/topologies/platform/docker/config/bunignore.star +144 -0
  255. package/engine/topologies/platform/docker/config/dockerignore.star +152 -0
  256. package/engine/topologies/platform/docker/config/healthcheck.star +58 -0
  257. package/engine/topologies/platform/docker/constants.star +211 -0
  258. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +56 -0
  259. package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +264 -0
  260. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +76 -0
  261. package/engine/topologies/platform/docker/index.star +40 -0
  262. package/engine/topologies/platform/docker/layers/bun_helpers.star +25 -0
  263. package/engine/topologies/platform/docker/layers/infisical/index.star +42 -0
  264. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +264 -0
  265. package/engine/topologies/platform/docker/layers/l1_base_layers.star +89 -0
  266. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +147 -0
  267. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +229 -0
  268. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +282 -0
  269. package/engine/topologies/platform/docker/layers/prisma/constants.star +138 -0
  270. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +98 -0
  271. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +131 -0
  272. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +100 -0
  273. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +128 -0
  274. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +205 -0
  275. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +121 -0
  276. package/engine/topologies/platform/docker/networking/api_path_constants.star +206 -0
  277. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +31 -0
  278. package/engine/topologies/platform/docker/networking/traefik.star +266 -0
  279. package/engine/topologies/platform/docker/networking/traefik_constants.star +148 -0
  280. package/engine/topologies/platform/docker/networking/traefik_helpers.star +162 -0
  281. package/engine/topologies/platform/docker/networking/traefik_static_routes.star +165 -0
  282. package/engine/topologies/platform/docker/secrets/env_secrets.star +74 -0
  283. package/engine/topologies/platform/docker/secrets/infisical.star +109 -0
  284. package/engine/topologies/platform/net/AGENTS.md +64 -0
  285. package/engine/topologies/platform/net/proxy.star +6 -0
  286. package/engine/topologies/platform/registries/local.star +6 -0
  287. package/engine/topologies/platform/registries/verdaccio_loader.star +20 -0
  288. package/engine/topologies/platform/security/AGENTS.md +49 -0
  289. package/engine/topologies/platform/security/secrets.star +241 -0
  290. package/engine/topologies/platform/state/AGENTS.md +64 -0
  291. package/engine/topologies/platform/state/relational.star +6 -0
  292. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  293. package/engine/topologies/tilt/common/utils.star +409 -0
  294. package/engine/topologies/tilt/common/utils_debug.star +71 -0
  295. package/engine/topologies/tilt/common/utils_deterministic.star +170 -0
  296. package/engine/topologies/tilt/common/utils_docker_networks.star +54 -0
  297. package/engine/topologies/tilt/common/utils_env.star +92 -0
  298. package/engine/topologies/tilt/common/utils_output.star +99 -0
  299. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  300. package/engine/topologies/tilt/config/defaults.star +5 -0
  301. package/engine/topologies/tilt/config/feature_flags.star +12 -0
  302. package/engine/topologies/tilt/config/global.star +57 -0
  303. package/engine/topologies/tilt/config/profiles.star +398 -0
  304. package/engine/topologies/tilt/generators/agents_md.star +64 -0
  305. package/engine/topologies/tilt/generators/api_gateway.star +147 -0
  306. package/engine/topologies/tilt/generators/index.star +126 -0
  307. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  308. package/engine/topologies/tilt/generators/infisical/examples.star +314 -0
  309. package/engine/topologies/tilt/generators/infisical/index.star +59 -0
  310. package/engine/topologies/tilt/generators/infisical/machine_identity.star +422 -0
  311. package/engine/topologies/tilt/generators/infisical/organization.star +536 -0
  312. package/engine/topologies/tilt/generators/infisical/path_manager.star +478 -0
  313. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +422 -0
  314. package/engine/topologies/tilt/generators/nginx_conf.star +145 -0
  315. package/engine/topologies/tilt/generators/npmrc.star +132 -0
  316. package/engine/topologies/tilt/generators/tsconfig.star +25 -0
  317. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +73 -0
  318. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +137 -0
  319. package/engine/topologies/tilt/generators/typescript/common.star +9 -0
  320. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +78 -0
  321. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +140 -0
  322. package/engine/topologies/tilt/generators/typescript/include.star +25 -0
  323. package/engine/topologies/tilt/generators/typescript/playwright_config.star +42 -0
  324. package/engine/topologies/tilt/generators/typescript/prisma_config.star +51 -0
  325. package/engine/topologies/tilt/generators/validators.star +868 -0
  326. package/engine/topologies/tilt/generators/vite/backend.star +80 -0
  327. package/engine/topologies/tilt/generators/vite/frameworks/lit.star +92 -0
  328. package/engine/topologies/tilt/generators/vite/frameworks/preact.star +94 -0
  329. package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +94 -0
  330. package/engine/topologies/tilt/generators/vite/frameworks/react.star +128 -0
  331. package/engine/topologies/tilt/generators/vite/frameworks/solid.star +94 -0
  332. package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +94 -0
  333. package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +92 -0
  334. package/engine/topologies/tilt/generators/vite/frameworks/vue.star +94 -0
  335. package/engine/topologies/tilt/generators/vite/frontend.star +153 -0
  336. package/engine/topologies/tilt/generators/vite/generators.star +45 -0
  337. package/engine/topologies/tilt/generators/vite/helpers.star +256 -0
  338. package/engine/topologies/tilt/generators/vite/library.star +67 -0
  339. package/engine/topologies/tilt/generators/vite/sdk.star +75 -0
  340. package/engine/topologies/tilt/generators/vite/templates.star +460 -0
  341. package/engine/topologies/tilt/generators/vite_config.star +24 -0
  342. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  343. package/engine/topologies/tilt/manifest/README.md +679 -0
  344. package/engine/topologies/tilt/manifest/__init__.star +220 -0
  345. package/engine/topologies/tilt/manifest/constants.star +262 -0
  346. package/engine/topologies/tilt/manifest/errors.star +268 -0
  347. package/engine/topologies/tilt/manifest/integration.star +348 -0
  348. package/engine/topologies/tilt/manifest/json_to_yaml.py +61 -0
  349. package/engine/topologies/tilt/manifest/loader.star +239 -0
  350. package/engine/topologies/tilt/manifest/mapper.star +229 -0
  351. package/engine/topologies/tilt/manifest/parser.star +490 -0
  352. package/engine/topologies/tilt/manifest/schema.star +502 -0
  353. package/engine/topologies/tilt/manifest/tests/test_integration.star +278 -0
  354. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +475 -0
  355. package/engine/topologies/tilt/manifest/tests/test_manifest.star +319 -0
  356. package/engine/topologies/tilt/manifest/tests/test_validator.star +472 -0
  357. package/engine/topologies/tilt/manifest/validator.star +744 -0
  358. package/engine/topologies/tilt/manifest/yaml_to_json.py +20 -0
  359. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  360. package/engine/topologies/tilt/resources/build_concurrency.star +56 -0
  361. package/engine/topologies/tilt/resources/conditions.star +5 -0
  362. package/engine/topologies/tilt/resources/databases.star +246 -0
  363. package/engine/topologies/tilt/resources/declaration.star +5 -0
  364. package/engine/topologies/tilt/resources/deps.star +5 -0
  365. package/engine/topologies/tilt/resources/infra-loader.star +504 -0
  366. package/engine/topologies/tilt/resources/libs.star +32 -0
  367. package/engine/topologies/tilt/resources/libs_discovery.star +104 -0
  368. package/engine/topologies/tilt/resources/libs_paths.star +81 -0
  369. package/engine/topologies/tilt/resources/libs_resource_definition.star +153 -0
  370. package/engine/topologies/tilt/resources/libs_setup.star +166 -0
  371. package/engine/topologies/tilt/resources/libs_tsconfig.star +39 -0
  372. package/engine/topologies/tilt/resources/orchestrator/apply.star +79 -0
  373. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +864 -0
  374. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +90 -0
  375. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +150 -0
  376. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +38 -0
  377. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +46 -0
  378. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +193 -0
  379. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  380. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +23 -0
  381. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +136 -0
  382. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +219 -0
  383. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +172 -0
  384. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +577 -0
  385. package/engine/topologies/tilt/resources/orchestrator/helpers.star +35 -0
  386. package/engine/topologies/tilt/resources/orchestrator.star +56 -0
  387. package/engine/topologies/tilt/resources/ordering.star +5 -0
  388. package/engine/topologies/tilt/resources/shared-platform-postgres.star +30 -0
  389. package/engine/topologies/tilt/resources/triggers.star +5 -0
  390. package/engine/topologies/tilt/resources/watchers.star +304 -0
  391. package/engine/where-things-live.star +719 -0
  392. package/examples/tdk-example/LICENSE +21 -0
  393. package/examples/tdk-example/README.md +23 -0
  394. package/examples/tdk-example/TILT_SERVICE_DEFAULTS.star +42 -0
  395. package/examples/tdk-example/TILT_TECH_STACK.star +67 -0
  396. package/examples/tdk-example/Tiltfile +25 -0
  397. package/examples/tdk-example/services/platform/messaging/docker-compose.yml +26 -0
  398. package/examples/tdk-example/services/shop/orders-api/package.json +20 -0
  399. package/examples/tdk-example/services/shop/orders-api/service.json +14 -0
  400. package/examples/tdk-example/services/shop/orders-api/src/index.ts +81 -0
  401. package/examples/tdk-example/services/shop/orders-app/index.html +12 -0
  402. package/examples/tdk-example/services/shop/orders-app/package.json +23 -0
  403. package/examples/tdk-example/services/shop/orders-app/public/.gitkeep +0 -0
  404. package/examples/tdk-example/services/shop/orders-app/service.json +9 -0
  405. package/examples/tdk-example/services/shop/orders-app/src/main.tsx +9 -0
  406. package/examples/tdk-example/services/shop/orders-app/src/orders.tsx +67 -0
  407. package/examples/tdk-example/services/shop/orders-app/src/style.css +15 -0
  408. package/examples/tdk-example/services/shop/orders-worker/package.json +18 -0
  409. package/examples/tdk-example/services/shop/orders-worker/service.json +13 -0
  410. package/examples/tdk-example/services/shop/orders-worker/src/index.ts +33 -0
  411. package/ext/Tiltfile +66 -0
  412. package/ext/ide-components/README.md +221 -0
  413. package/ext/ide-components/code_viewer/server.py +208 -0
  414. package/ext/ide-components/config_inspector/server.py +1052 -0
  415. package/ext/ide-components/file_browser/server.py +287 -0
  416. package/ext/ide-components/shared/config_service.py +471 -0
  417. package/ext/ide-components/shared/file_utils.py +300 -0
  418. package/ext/ide-components/shared/http_utils.py +234 -0
  419. package/ext/ide-components/shared/static/styles.css +1334 -0
  420. package/ext/ide-components/shared/syntax_highlighter.py +142 -0
  421. package/ext/ide-components/shared/template_engine.py +125 -0
  422. package/ext/ide-components/shared/templates/base.html +121 -0
  423. package/ext/ide-components/shared/test_config_service.py +328 -0
  424. package/ext/ide-components/shared/tilt_integration.py +160 -0
  425. package/ext/ui-enhancements/cron-status-server.sh +51 -0
  426. package/ext/ui-enhancements/cron-status-tracker.sh +148 -0
  427. package/ext/ui-enhancements/extension.yaml +36 -0
  428. package/ext/ui-enhancements/tiltfile.py +101 -0
  429. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  430. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  431. package/ext/ui-enhancements/ui/icons.css +125 -0
  432. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  433. package/package.json +94 -4
  434. package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  435. package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  436. package/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  437. package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  438. package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  439. package/specs/specs/TILT_SERVICE_DEFAULTS.star +207 -0
  440. package/specs/specs/TILT_TECH_STACK.star +161 -0
@@ -0,0 +1,72 @@
1
+ export const vueFrontendProvider = {
2
+ id: "vue",
3
+ label: "Vue + Vite",
4
+ dependencies: {
5
+ vue: "^3.5.0",
6
+ },
7
+ devDependencies: {
8
+ "@vitejs/plugin-vue": "^5.2.4",
9
+ },
10
+ compilerOptions: {},
11
+ createFiles(name) {
12
+ return [
13
+ {
14
+ filename: "index.html",
15
+ content: `<!DOCTYPE html>
16
+ <html lang="en">
17
+ <head>
18
+ <meta charset="UTF-8" />
19
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
20
+ <title>${name}</title>
21
+ </head>
22
+ <body>
23
+ <div id="app"></div>
24
+ <script type="module" src="/src/main.ts"></script>
25
+ </body>
26
+ </html>
27
+ `,
28
+ description: "Generating HTML template",
29
+ emoji: "💻",
30
+ },
31
+ {
32
+ filename: "src/main.ts",
33
+ content: `import { createApp } from 'vue';
34
+ import App from './App.vue';
35
+
36
+ createApp(App).mount('#app');
37
+ `,
38
+ description: "Generating Vue entry",
39
+ emoji: "💻",
40
+ },
41
+ {
42
+ filename: "src/App.vue",
43
+ content: `<script setup lang="ts">
44
+ const message = 'Frontend resource created with Flisk';
45
+ </script>
46
+
47
+ <template>
48
+ <main style="padding: 2rem; font-family: system-ui">
49
+ <h1>${name}</h1>
50
+ <p>{{ message }}</p>
51
+ </main>
52
+ </template>
53
+ `,
54
+ description: "Generating Vue app",
55
+ emoji: "💻",
56
+ },
57
+ {
58
+ filename: "src/vite-env.d.ts",
59
+ content: `/// <reference types="vite/client" />
60
+
61
+ declare module '*.vue' {
62
+ import type { Component } from 'vue';
63
+ const component: Component;
64
+ export default component;
65
+ }
66
+ `,
67
+ description: "Generating Vue module types",
68
+ emoji: "⚙️",
69
+ },
70
+ ];
71
+ },
72
+ };
@@ -0,0 +1,43 @@
1
+ // Copyright (c) 2026 Flisk Landscape contributors
2
+ // SPDX-License-Identifier: MIT
3
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ const normalize = (text) => text.replace(/\r\n/g, "\n");
6
+ export const UPDATE_COMMAND = "UPDATE_GOLDEN=1 bun run test -- golden-generated-output";
7
+ /**
8
+ * Compares generated files with the committed golden copies in `goldenDir`. Returns one problem per file that
9
+ * changed, is missing a golden, or has a golden nothing generates any more. With `update` it rewrites the goldens
10
+ * instead and returns nothing, which is how an intentional change is accepted.
11
+ */
12
+ export function compareWithGolden(actual, goldenDir, update = false) {
13
+ if (update) {
14
+ for (const [name, content] of Object.entries(actual)) {
15
+ const target = join(goldenDir, name);
16
+ mkdirSync(dirname(target), { recursive: true });
17
+ writeFileSync(target, normalize(content));
18
+ }
19
+ for (const stale of staleGoldens(actual, goldenDir)) {
20
+ rmSync(join(goldenDir, stale), { force: true });
21
+ }
22
+ return [];
23
+ }
24
+ const problems = [];
25
+ for (const [name, content] of Object.entries(actual)) {
26
+ const path = join(goldenDir, name);
27
+ if (!existsSync(path)) {
28
+ problems.push(`${name}: no golden file yet`);
29
+ }
30
+ else if (normalize(readFileSync(path, "utf-8")) !== normalize(content)) {
31
+ problems.push(`${name}: generated output differs from its golden file`);
32
+ }
33
+ }
34
+ for (const stale of staleGoldens(actual, goldenDir)) {
35
+ problems.push(`${stale}: golden file that nothing generates any more`);
36
+ }
37
+ return problems;
38
+ }
39
+ function staleGoldens(actual, goldenDir) {
40
+ if (!existsSync(goldenDir))
41
+ return [];
42
+ return readdirSync(goldenDir).filter((name) => !(name in actual));
43
+ }
@@ -0,0 +1,291 @@
1
+ // Copyright (c) 2026 Flisk Landscape contributors
2
+ // SPDX-License-Identifier: MIT
3
+ // Fetches the paid-tier "premium" resource bundle (playwright, c4-diagram,
4
+ // logging, agents-md, sablier, verdaccio, and a few other extras - see
5
+ // tdk-cli-extensions/premium/) from the gated distribution worker, when a
6
+ // license key is configured. The free engine never needs this for its own
7
+ // resources - docker-compose, npm, bun, etc. are already public in this
8
+ // repo, no key required.
9
+ //
10
+ // DDD (domain-driven-design scaffolding) is the one paid feature that is
11
+ // NOT a file overlay: it's gated separately by hasDddLicense() below, via
12
+ // the shared hasLiveResourceLicense() helper, since its code stays in this
13
+ // public repo and is turned on/off by a runtime check rather than swapped
14
+ // in - see that helper's own comment for why it can't just be added to
15
+ // KNOWN_RESOURCES. hasVerdaccioLicense()/hasSablierLicense() also use that
16
+ // same helper, but only to print a "this needs a license" warning in
17
+ // template-engine.ts - Verdaccio and Sablier's real gate is the file
18
+ // overlay above (their public files are disabled stubs, not gated code).
19
+ //
20
+ // The worker (tdk-extension-dist) is the real access-control boundary: it
21
+ // checks the key against BUNDLES_REPO/keys/*.json - existence, activation/
22
+ // expiry dates, granted resources, and a per-key project limit - before
23
+ // serving anything. This client just asks and, if granted, unpacks the
24
+ // result over the vendored stub files so the generator pipeline picks up
25
+ // the real implementations transparently. See
26
+ // tdk-extension-dist/src/index.ts for the server-side enforcement and
27
+ // tdk-extension-dist/src/project-limit.ts for the project-limit logic.
28
+ import { randomUUID } from "node:crypto";
29
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
30
+ import { homedir } from "node:os";
31
+ import { join } from "node:path";
32
+ import { extractTarball } from "../utils/tar.js";
33
+ const DEFAULT_ENDPOINT = "https://tdk-extension-dist.oranguman.workers.dev/v1/premium/bundle.tar.gz";
34
+ // Tried in order until one is granted - the worker unlocks the whole
35
+ // bundle on the first resource name a key is found to grant, since
36
+ // premium.tar.gz ships all paid resources together. Keep in sync with
37
+ // what issue-key.yml/update-key.yml accept as `resources` entries.
38
+ const KNOWN_RESOURCES = [
39
+ "playwright",
40
+ "c4-diagram",
41
+ "logging",
42
+ "agents-md",
43
+ "sablier",
44
+ "verdaccio",
45
+ ];
46
+ // Re-check the license periodically rather than trusting a local cache
47
+ // forever - an expired or revoked key shouldn't keep unlocking premium
48
+ // content indefinitely just because it worked once.
49
+ const CACHE_TTL_MS = 12 * 60 * 60 * 1000;
50
+ // Maps each file's path inside premium.tar.gz to where it belongs in the
51
+ // vendored engine output, so the generator pipeline finds it in the same
52
+ // place the free stub (or, for the never-wired items, nothing at all)
53
+ // used to be.
54
+ const PREMIUM_PATH_MAP = {
55
+ "typescript/playwright_config.star": "engine/topologies/tilt/generators/typescript/playwright_config.star",
56
+ "generators/agents_md.star": "engine/topologies/tilt/generators/agents_md.star",
57
+ "c4_diagram.star": "engine/topologies/tilt/generators/c4_diagram.star",
58
+ "observability/logging.star": "engine/topologies/platform/observability/logging.star",
59
+ "generators/database_provisioner.star": "engine/topologies/tilt/generators/database_provisioner.star",
60
+ "generators/dependency_manifest.star": "engine/topologies/tilt/generators/dependency_manifest.star",
61
+ "generators/fixed_frontend_tsconfig.star": "engine/topologies/tilt/generators/typescript/fixed_frontend_tsconfig.star",
62
+ "synthetic_monitor.star": "engine/resources/synthetic_monitor.star",
63
+ "synthetic-monitor-topology.star": "engine/topologies/platform/services/synthetic-monitor.star",
64
+ "database-management-service.yaml": "platform/services/platform/database-management/service.yaml",
65
+ "networking/sablier_container_cycle.star": "engine/topologies/platform/docker/networking/sablier_container_cycle.star",
66
+ "registries/verdaccio_loader.star": "engine/topologies/platform/registries/verdaccio_loader.star",
67
+ };
68
+ function getLicenseKey() {
69
+ return process.env.TDK_LICENSE_KEY?.trim() || null;
70
+ }
71
+ function getEndpoint() {
72
+ return process.env.TDK_PREMIUM_ENDPOINT?.trim() || DEFAULT_ENDPOINT;
73
+ }
74
+ // A stable per-project id for the worker's project-limit tracking - not a
75
+ // device or user id. Generated once and persisted alongside the rest of
76
+ // the project's .tdk/ state.
77
+ function getOrCreateProjectId(projectRoot) {
78
+ const idPath = join(projectRoot, ".tdk", ".project-id");
79
+ if (existsSync(idPath)) {
80
+ return readFileSync(idPath, "utf-8").trim();
81
+ }
82
+ const id = randomUUID();
83
+ mkdirSync(join(projectRoot, ".tdk"), { recursive: true });
84
+ writeFileSync(idPath, `${id}\n`);
85
+ return id;
86
+ }
87
+ function cacheTarballPath(key) {
88
+ // Cache is per-key (not shared across different keys on the same
89
+ // machine) so switching license keys doesn't serve a stale bundle
90
+ // fetched under a different plan.
91
+ const safeName = key.replace(/[^a-zA-Z0-9_-]/g, "_");
92
+ return join(homedir(), ".tdk", "cache", `premium-${safeName}`, "premium.tar.gz");
93
+ }
94
+ function isCacheFresh(path) {
95
+ if (!existsSync(path))
96
+ return false;
97
+ return Date.now() - statSync(path).mtimeMs < CACHE_TTL_MS;
98
+ }
99
+ // Sends the key as `Authorization: Bearer`, never in the URL, where request
100
+ // logs and proxies record it. A worker deployed before it read the header
101
+ // answers 401 "missing key" (a current one only returns 401 when it gets no
102
+ // key at all), so retry that once with the old `?key=` - premium keeps
103
+ // working until the worker is updated. Drop the retry once it is.
104
+ async function fetchPremium(key, resource, projectId) {
105
+ const url = `${getEndpoint()}?resource=${encodeURIComponent(resource)}` +
106
+ `&projectId=${encodeURIComponent(projectId)}`;
107
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${key}` } });
108
+ if (res.status !== 401)
109
+ return res;
110
+ await res.arrayBuffer().catch(() => undefined);
111
+ return fetch(`${url}&key=${encodeURIComponent(key)}`);
112
+ }
113
+ async function fetchPremiumBundle(key, projectId) {
114
+ const attempts = [];
115
+ for (const resource of KNOWN_RESOURCES) {
116
+ let res;
117
+ try {
118
+ res = await fetchPremium(key, resource, projectId);
119
+ }
120
+ catch (err) {
121
+ console.warn(`⚠️ Premium fetch failed (network error): ${err.message}`);
122
+ return null;
123
+ }
124
+ if (res.ok) {
125
+ const bundle = Buffer.from(await res.arrayBuffer());
126
+ console.info(`🔎 Premium entitlement probe: granted resource=${resource} (HTTP ${res.status}); prior denials=${attempts.join(", ") || "none"}`);
127
+ console.info(`🔎 Premium bundle download: ${bundle.byteLength} bytes`);
128
+ return bundle;
129
+ }
130
+ if (res.status === 401 || res.status === 403) {
131
+ // Not granted for this specific resource name - try the next one
132
+ // before concluding the key has nothing to offer.
133
+ attempts.push(`${resource}=${res.status}`);
134
+ continue;
135
+ }
136
+ // Anything else (404 missing bundle release, 502 upstream failure,
137
+ // etc.) won't be fixed by trying a different resource name.
138
+ console.warn(`⚠️ Premium fetch failed: ${resource} returned HTTP ${res.status}; prior entitlement probes: ${attempts.join(", ") || "none"}`);
139
+ return null;
140
+ }
141
+ console.warn(`⚠️ Premium entitlement probes denied: ${attempts.join(", ")}`);
142
+ return null;
143
+ }
144
+ /**
145
+ * Fetches (with a local, time-limited cache) the premium bundle for the
146
+ * configured license key and overlays its files onto the already-vendored
147
+ * free engine at destDir. Best-effort: returns false (never throws) if
148
+ * there's no key configured, the key doesn't grant anything, or the fetch
149
+ * fails - the caller should keep going with the free engine either way.
150
+ */
151
+ export async function applyPremiumOverlay(projectRoot, destDir) {
152
+ const key = getLicenseKey();
153
+ if (!key)
154
+ return false;
155
+ const tarballPath = cacheTarballPath(key);
156
+ if (!isCacheFresh(tarballPath)) {
157
+ console.info("🔎 Premium bundle cache: miss; requesting bundle from distribution service");
158
+ const projectId = getOrCreateProjectId(projectRoot);
159
+ const bundle = await fetchPremiumBundle(key, projectId);
160
+ if (!bundle) {
161
+ console.warn("⚠️ No premium resources unlocked for this key - using free tier only.");
162
+ return false;
163
+ }
164
+ mkdirSync(join(tarballPath, ".."), { recursive: true });
165
+ writeFileSync(tarballPath, bundle);
166
+ }
167
+ else {
168
+ console.info("🔎 Premium bundle cache: hit (cached bundle reused)");
169
+ }
170
+ try {
171
+ const extractDir = join(tarballPath, "..", "extracted");
172
+ mkdirSync(extractDir, { recursive: true });
173
+ extractTarball(readFileSync(tarballPath), extractDir);
174
+ let applied = 0;
175
+ const missing = [];
176
+ for (const [src, dest] of Object.entries(PREMIUM_PATH_MAP)) {
177
+ const from = join(extractDir, src);
178
+ if (!existsSync(from)) {
179
+ missing.push(src);
180
+ continue;
181
+ }
182
+ const to = join(destDir, dest);
183
+ mkdirSync(join(to, ".."), { recursive: true });
184
+ writeFileSync(to, readFileSync(from));
185
+ applied++;
186
+ }
187
+ const sablierPath = join(extractDir, "networking/sablier_container_cycle.star");
188
+ console.info(`🔎 Premium bundle contents: mapped=${applied}/${Object.keys(PREMIUM_PATH_MAP).length}; sablier_overlay=${existsSync(sablierPath) ? "present" : "MISSING"}`);
189
+ if (missing.length > 0) {
190
+ console.info(`🔎 Premium bundle missing mapped files: ${missing.join(", ")}`);
191
+ }
192
+ if (!existsSync(sablierPath) && process.env.TDK_PREMIUM_DIAGNOSTICS === "1") {
193
+ const sablierGranted = await hasSablierLicense(projectRoot);
194
+ console.info(`🔎 Sablier entitlement check: ${sablierGranted ? "granted" : "not confirmed"}; compare with sablier_overlay above to distinguish license access from bundle contents`);
195
+ }
196
+ if (applied > 0) {
197
+ console.log(`✓ Premium resources unlocked (${applied} file${applied === 1 ? "" : "s"})`);
198
+ return true;
199
+ }
200
+ return false;
201
+ }
202
+ catch (err) {
203
+ console.warn(`⚠️ Failed to apply premium overlay: ${err.message}`);
204
+ return false;
205
+ }
206
+ }
207
+ function liveResourceAccessCachePath(key, resource) {
208
+ const safeName = key.replace(/[^a-zA-Z0-9_-]/g, "_");
209
+ return join(homedir(), ".tdk", "cache", `premium-${safeName}`, `${resource}-access.json`);
210
+ }
211
+ /**
212
+ * Checks whether the configured license key grants a given "live" premium
213
+ * resource. Originally added for resources with nothing to swap on disk
214
+ * (ddd is still exactly that: gated code baked into the free engine, no
215
+ * file overlay). verdaccio and sablier also use this - not because they
216
+ * lack a PREMIUM_PATH_MAP entry (they have one now), but because their
217
+ * public files are already disabled stubs regardless of license, so this
218
+ * check only ever drives a "you need a license for this" warning in
219
+ * template-engine.ts, never an actual enable/disable decision. Can't reuse
220
+ * KNOWN_RESOURCES/fetchPremiumBundle for that warning either: that loop
221
+ * stops at the FIRST resource the key grants and would report false for a
222
+ * key that grants this resource but not, say, playwright (or vice versa).
223
+ *
224
+ * Best-effort: returns false (never throws) if there's no key, the fetch
225
+ * fails, or the worker denies the resource - the caller decides what "not
226
+ * licensed" means. Caches the grant/deny outcome (not the bundle itself,
227
+ * which we never need here) for CACHE_TTL_MS so repeated checks don't
228
+ * re-download the full premium.tar.gz just to read a status code.
229
+ */
230
+ async function hasLiveResourceLicense(projectRoot, resource) {
231
+ const key = getLicenseKey();
232
+ if (!key)
233
+ return false;
234
+ const cachePath = liveResourceAccessCachePath(key, resource);
235
+ if (isCacheFresh(cachePath)) {
236
+ try {
237
+ const cached = JSON.parse(readFileSync(cachePath, "utf-8"));
238
+ console.info(`🔎 ${resource} entitlement probe: cache=${cached.granted === true ? "granted" : "denied"}`);
239
+ return cached.granted === true;
240
+ }
241
+ catch {
242
+ // Corrupt/unreadable cache - fall through and re-check live.
243
+ }
244
+ }
245
+ const projectId = getOrCreateProjectId(projectRoot);
246
+ let granted = false;
247
+ try {
248
+ const res = await fetchPremium(key, resource, projectId);
249
+ granted = res.ok;
250
+ console.info(`🔎 ${resource} entitlement probe: HTTP ${res.status} (${granted ? "granted" : "denied"})`);
251
+ // Drain the body (a full premium.tar.gz on success) so we don't leave
252
+ // it dangling - we only need the status, not the content.
253
+ if (res.body) {
254
+ await res.arrayBuffer().catch(() => undefined);
255
+ }
256
+ }
257
+ catch (err) {
258
+ console.warn(`⚠️ ${resource} license check failed (network error): ${err.message}`);
259
+ return false;
260
+ }
261
+ try {
262
+ mkdirSync(join(cachePath, ".."), { recursive: true });
263
+ writeFileSync(cachePath, JSON.stringify({ granted, checked: new Date().toISOString() }));
264
+ }
265
+ catch {
266
+ // Best-effort cache; a write failure just means we re-check next time.
267
+ }
268
+ return granted;
269
+ }
270
+ /** Checks whether the configured license key grants the "verdaccio" resource. */
271
+ export async function hasVerdaccioLicense(projectRoot) {
272
+ return hasLiveResourceLicense(projectRoot, "verdaccio");
273
+ }
274
+ /**
275
+ * Checks whether the configured license key grants the "ddd" resource
276
+ * (domain-driven-design folder structure + path aliases for backend
277
+ * resources - see generate_backend_path_aliases() in
278
+ * engine/topologies/tilt/generators/vite/helpers.star).
279
+ */
280
+ export async function hasDddLicense(projectRoot) {
281
+ return hasLiveResourceLicense(projectRoot, "ddd");
282
+ }
283
+ /**
284
+ * Checks whether the configured license key grants the "sablier" resource
285
+ * (on-demand start/stop for idle resources via a `sablier: {enable: true}`
286
+ * manifest block - see sablier_container_cycle.star in
287
+ * engine/topologies/platform/docker/networking/).
288
+ */
289
+ export async function hasSablierLicense(projectRoot) {
290
+ return hasLiveResourceLicense(projectRoot, "sablier");
291
+ }
@@ -0,0 +1,133 @@
1
+ // Copyright (c) 2026 Flisk Landscape contributors
2
+ // SPDX-License-Identifier: MIT
3
+ /**
4
+ * The plain `Dockerfile` written next to service.json. `flisk up` does not build it: for generated
5
+ * resources the engine builds `.autogenerated/Dockerfile.app.autogenerated`. It is a starting point
6
+ * for building the service image outside Flisk, so its port follows the service's `port`.
7
+ */
8
+ export function getDockerfileTemplate(port, healthCheckPath) {
9
+ // `oven/bun` has no curl, so the probe uses bun itself.
10
+ const healthcheck = healthCheckPath
11
+ ? `# Health check
12
+ HEALTHCHECK --interval=10s --timeout=5s --retries=3 \\
13
+ CMD bun -e "fetch('http://localhost:${port}${healthCheckPath}').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1))"
14
+
15
+ `
16
+ : "";
17
+ return `# Scaffolded by \`flisk resource\`. \`flisk up\` does NOT build this file: it builds
18
+ # .autogenerated/Dockerfile.app.autogenerated (golden layers, project root as context).
19
+ # Use this one as a starting point for building the image outside Flisk, and keep its
20
+ # port in step with "port" in service.json.
21
+ FROM oven/bun:1.2
22
+
23
+ WORKDIR /app
24
+
25
+ # Copy package files (bun.lock is optional: a Flisk workspace keeps it at the project root)
26
+ COPY package.json bun.lock* ./
27
+
28
+ # Install dependencies
29
+ RUN bun install
30
+
31
+ # Copy source
32
+ COPY . .
33
+
34
+ # Build if needed
35
+ RUN bun run build
36
+
37
+ ${healthcheck}ENV PORT=${port}
38
+ EXPOSE ${port}
39
+
40
+ CMD ["bun", "run", "start"]
41
+ `;
42
+ }
43
+ export function getShutdownHandlerTemplate(signal) {
44
+ return `process.on('${signal}', () => {
45
+ console.log('[Worker] ${signal} received, shutting down gracefully...');
46
+ process.exit(0);
47
+ });`;
48
+ }
49
+ export function getWorkerIndexTemplate(name) {
50
+ return `console.log('🚀 ${name} worker started');
51
+
52
+ interface Job {
53
+ id: string;
54
+ type: string;
55
+ payload: Record<string, unknown>;
56
+ priority?: number;
57
+ timestamp?: string;
58
+ }
59
+
60
+ const CONFIG = {
61
+ pollIntervalMs: parseInt(process.env.WORKER_POLL_INTERVAL || '5000'),
62
+ maxRetries: parseInt(process.env.WORKER_MAX_RETRIES || '3'),
63
+ batchSize: parseInt(process.env.WORKER_BATCH_SIZE || '10'),
64
+ };
65
+
66
+ async function processJob(job: Job): Promise<void> {
67
+ console.log('[Worker] Processing job:', job.id, 'type:', job.type);
68
+
69
+ // Add job processing logic here using job.payload
70
+
71
+ await new Promise(resolve => setTimeout(resolve, 1000));
72
+ console.log('[Worker] Job completed:', job.id);
73
+ }
74
+
75
+ let demoJobSent = false;
76
+
77
+ async function fetchJobs(): Promise<Job[]> {
78
+ // Connect to your queue (Redis, RabbitMQ, etc.) and fetch jobs.
79
+ // Until you do, hand out one demo job on the first poll so the loop runs end to end; remove this with the queue.
80
+ if (demoJobSent) return [];
81
+ demoJobSent = true;
82
+ return [{ id: 'demo-1', type: 'demo', payload: {} }];
83
+ }
84
+
85
+ async function main() {
86
+ console.log('[Worker] Configuration:', CONFIG);
87
+
88
+ while (true) {
89
+ try {
90
+ const jobs = await fetchJobs();
91
+
92
+ if (jobs.length === 0) {
93
+ await new Promise(resolve => setTimeout(resolve, CONFIG.pollIntervalMs));
94
+ continue;
95
+ }
96
+
97
+ console.log(\`[Worker] Fetched \${jobs.length} jobs\`);
98
+
99
+ for (const job of jobs) {
100
+ try {
101
+ await processJob(job);
102
+ } catch (error: unknown) {
103
+ console.error('[Worker] Job failed:', error);
104
+ }
105
+ }
106
+ } catch (error: unknown) {
107
+ console.error('[Worker] Error in main loop:', error);
108
+ // Wait before retrying to avoid tight error loops
109
+ await new Promise(resolve => setTimeout(resolve, CONFIG.pollIntervalMs));
110
+ }
111
+ }
112
+ }
113
+
114
+ ${getShutdownHandlerTemplate("SIGTERM")}
115
+
116
+ ${getShutdownHandlerTemplate("SIGINT")}
117
+
118
+ main().catch((err) => {
119
+ console.error('[Worker] Fatal error:', err);
120
+ process.exit(1);
121
+ });
122
+ `;
123
+ }
124
+ export function getTestTemplate(name) {
125
+ return `import { describe, it, expect } from 'vitest';
126
+
127
+ describe('${name}', () => {
128
+ it('should pass a basic test', () => {
129
+ expect(true).toBe(true);
130
+ });
131
+ });
132
+ `;
133
+ }