@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,409 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🔧 TILT SDK - CORE UTILITIES MODULE
5
+ # =============================================================================
6
+ # Path: .tilt/topologies/tilt/common/utils.star
7
+ # Purpose: Foundational helper functions, constants, and shared API surface.
8
+ # =============================================================================
9
+
10
+ load('./utils_env.star',
11
+ 'load_dotenv',
12
+ 'should_enable',
13
+ )
14
+ load('./utils_debug.star',
15
+ 'DEBUG_MODE',
16
+ 'debug_log',
17
+ 'inspect',
18
+ 'breadcrumb',
19
+ 'fail_with_context',
20
+ )
21
+ load('./utils_docker_networks.star',
22
+ _fix_docker_networks = 'fix_docker_networks',
23
+ _cleanup_docker_networks = 'cleanup_docker_networks',
24
+ )
25
+ load('./utils_output.star',
26
+ 'print_resource_summary',
27
+ 'get_template_header',
28
+ )
29
+ load('../../platform/docker/constants.star', 'PlatformDockerConstants')
30
+
31
+ # =============================================================================
32
+ # 📦 INTERNAL DEPENDENCY CONSTANTS
33
+ # =============================================================================
34
+
35
+ INTERNAL_SCOPE = PlatformDockerConstants.NPM_SCOPE
36
+
37
+ LIBRARY_ROOTS = {
38
+ 'platform': 'shared-platform-engineering',
39
+ 'product': 'shared-product-engineering',
40
+ 'ddd': 'shared-ddd-layers',
41
+ }
42
+
43
+ DDD_LAYERS = ['domain', 'application', 'infrastructure', 'presentation']
44
+
45
+ # =============================================================================
46
+ # 📦 MIGRATED PACKAGES CONFIGURATION
47
+ # =============================================================================
48
+ # Map of package names that have been moved from their conventional locations
49
+ # to new paths. This allows the resolver to find packages at non-standard paths.
50
+ # Format: "package-name": ("path-relative-to-repo-root", "library-type")
51
+ # =============================================================================
52
+
53
+ MIGRATED_PACKAGES = {
54
+ # Introvertic packages reorganized into unified folder
55
+ "introvertic-core": ("shared-product-engineering/introvertic/core", "product"),
56
+ "introvertic-ui": ("shared-product-engineering/introvertic/ui", "product"),
57
+ "introvertic-docs": ("shared-product-engineering/introvertic/ui/docs", "product"),
58
+ }
59
+
60
+ # Import from canonical location to avoid duplication
61
+ load("../manifest/constants.star", "MANIFEST_FILENAME")
62
+
63
+ # List of all shared platform networks
64
+ # All networks use PROJECT_NAME format (e.g., tdk_project_*)
65
+ PLATFORM_NETWORKS = [
66
+ PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC,
67
+ PlatformDockerConstants.PROJECT_NAME + "_traefik-private",
68
+ PlatformDockerConstants.NETWORK_BACKEND,
69
+ PlatformDockerConstants.NETWORK_DATABASE,
70
+ PlatformDockerConstants.NETWORK_INFISICAL,
71
+ PlatformDockerConstants.VERDACCIO_NETWORK,
72
+ PlatformDockerConstants.NETWORK_PROXY,
73
+ ]
74
+
75
+ # =============================================================================
76
+ # 🔍 CENTRALIZED DEPENDENCY EXTRACTION (Single Source of Truth)
77
+ # =============================================================================
78
+
79
+ def get_internal_deps(resource_path):
80
+ """
81
+ Extract all @flisk/* dependencies from a service's package.json.
82
+ """
83
+ pkg_json_path = resource_path + '/package.json'
84
+ pkg_content = read_file(pkg_json_path, default='')
85
+
86
+ if not pkg_content or not str(pkg_content).strip():
87
+ return []
88
+
89
+ pkg = decode_json(pkg_content)
90
+ if not pkg:
91
+ return []
92
+
93
+ internal_deps = []
94
+
95
+ # Scan all dependency types in one pass
96
+ for dep_type in ['dependencies', 'devDependencies', 'peerDependencies']:
97
+ deps = pkg.get(dep_type, {})
98
+ for dep_name in deps.keys():
99
+ if dep_name.startswith(INTERNAL_SCOPE) and dep_name not in internal_deps:
100
+ internal_deps.append(dep_name)
101
+
102
+ return internal_deps
103
+
104
+
105
+ def resolve_lib_path(package_name):
106
+ """
107
+ Resolve @flisk/* package name to workspace path using naming conventions.
108
+
109
+ Checks MIGRATED_PACKAGES first for packages that have been moved from their
110
+ conventional locations, then falls back to standard naming conventions.
111
+ """
112
+ if not package_name.startswith(INTERNAL_SCOPE):
113
+ return (None, None)
114
+
115
+ lib_name = package_name[len(INTERNAL_SCOPE):]
116
+
117
+ # Check migrated packages first (packages moved from conventional locations)
118
+ if lib_name in MIGRATED_PACKAGES:
119
+ return MIGRATED_PACKAGES[lib_name]
120
+
121
+ # Standard naming convention resolution
122
+ if lib_name in DDD_LAYERS:
123
+ return (LIBRARY_ROOTS['ddd'] + '/' + lib_name, 'ddd')
124
+
125
+ if lib_name.startswith('platform-'):
126
+ return (LIBRARY_ROOTS['platform'] + '/' + lib_name, 'platform')
127
+
128
+ if lib_name.startswith('product-'):
129
+ return (LIBRARY_ROOTS['product'] + '/' + lib_name, 'product')
130
+
131
+ return (LIBRARY_ROOTS['platform'] + '/' + lib_name, 'platform')
132
+
133
+
134
+ def build_deps_mapping(resource_path, internal_deps=None):
135
+ """Build a mapping of package_name -> library path for internal dependencies."""
136
+ if internal_deps == None:
137
+ internal_deps = get_internal_deps(resource_path)
138
+
139
+ mapping = {}
140
+ for dep_name in internal_deps:
141
+ lib_info = resolve_lib_path(dep_name)
142
+ lib_path = lib_info[0]
143
+
144
+ if lib_path:
145
+ mapping[dep_name] = lib_path
146
+
147
+ return mapping
148
+
149
+
150
+ # =============================================================================
151
+ # 🔍 VALIDATION FUNCTIONS
152
+ # =============================================================================
153
+
154
+ def validate_lib_naming(resource_path):
155
+ """
156
+ Validate that package names in package.json match folder naming conventions.
157
+ """
158
+ errors = []
159
+ internal_deps = get_internal_deps(resource_path)
160
+
161
+ for dep_name in internal_deps:
162
+ lib_info = resolve_lib_path(dep_name)
163
+ expected_path = lib_info[0]
164
+
165
+ if not expected_path:
166
+ continue
167
+
168
+ pkg_json = expected_path + '/package.json'
169
+ content = read_file(pkg_json, default='')
170
+
171
+ if not content or not str(content).strip():
172
+ errors.append({
173
+ 'package': dep_name,
174
+ 'expected_path': expected_path,
175
+ 'error': 'Library folder not found at expected location',
176
+ })
177
+ continue
178
+
179
+ pkg = decode_json(content)
180
+ if pkg:
181
+ actual_name = pkg.get('name', '')
182
+ if actual_name != dep_name:
183
+ errors.append({
184
+ 'package': dep_name,
185
+ 'expected_path': expected_path,
186
+ 'actual_name': actual_name,
187
+ 'error': 'Package name mismatch: expected "' + dep_name + '" but found "' + actual_name + '"',
188
+ })
189
+
190
+ return errors
191
+
192
+
193
+ def detect_circular_deps(resource_paths, max_depth=10):
194
+ """
195
+ Detect circular dependencies between libraries.
196
+ """
197
+ circular = []
198
+ visited_chains = {}
199
+
200
+ def check_chain(pkg_name, chain, depth):
201
+ if depth > max_depth:
202
+ return
203
+
204
+ if pkg_name in chain:
205
+ cycle_start = chain.index(pkg_name)
206
+ cycle = chain[cycle_start:] + [pkg_name]
207
+ cycle_str = ' -> '.join(cycle)
208
+ if cycle_str not in visited_chains:
209
+ visited_chains[cycle_str] = True
210
+ circular.append(cycle)
211
+ return
212
+
213
+ lib_info = resolve_lib_path(pkg_name)
214
+ lib_path = lib_info[0]
215
+
216
+ if not lib_path:
217
+ return
218
+
219
+ lib_deps = get_internal_deps(lib_path)
220
+ for dep in lib_deps:
221
+ check_chain(dep, chain + [pkg_name], depth + 1)
222
+
223
+ for resource_path in resource_paths:
224
+ deps = get_internal_deps(resource_path)
225
+ for dep in deps:
226
+ check_chain(dep, [], 0)
227
+
228
+ return circular
229
+
230
+
231
+ def encode_json(obj, _depth=0):
232
+ """
233
+ Simple JSON encoder for Starlark.
234
+ Supports: dict, list, string, int, bool, None
235
+ """
236
+ # Prevent stack overflow from circular references or deeply nested data
237
+ if _depth > 50:
238
+ return '"<max-depth-exceeded>"'
239
+
240
+ if obj == None:
241
+ return 'null'
242
+ t = type(obj)
243
+ if t == 'string':
244
+ return '"' + obj.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r').replace('\t', '\\t') + '"'
245
+ if t == 'int':
246
+ return str(obj)
247
+ if t == 'bool':
248
+ return 'true' if obj else 'false'
249
+ if t == 'list':
250
+ return '[' + ', '.join([encode_json(i, _depth + 1) for i in obj]) + ']'
251
+ if t == 'dict':
252
+ parts = []
253
+ sorted_keys = sorted(obj.keys())
254
+ for k in sorted_keys:
255
+ parts.append(encode_json(k, _depth + 1) + ': ' + encode_json(obj[k], _depth + 1))
256
+ return '{' + ', '.join(parts) + '}'
257
+ return '"' + str(obj) + '"'
258
+
259
+
260
+ # =============================================================================
261
+ # 📁 FILE I/O UTILITIES
262
+ # =============================================================================
263
+
264
+ def _is_allowed_generated_path(file_path, project_root):
265
+ path = file_path.replace('\\', '/').strip()
266
+ root = project_root.replace('\\', '/').rstrip('/')
267
+ if root and path.startswith(root + '/'):
268
+ path = path[len(root) + 1:]
269
+ if path.startswith('./'):
270
+ path = path[2:]
271
+ parts = path.split('/')
272
+ if '..' in parts or path.startswith('/'):
273
+ return False
274
+ if '.autogenerated' in parts:
275
+ return True
276
+ if path.startswith('.tdk/.tdk-out/'):
277
+ return True
278
+ if path == 'services/platform/database-management/docker-compose.yml':
279
+ return True
280
+ if path.startswith('product_autogenerated_resource_manifests/') or path.startswith('product_autogenerated_services_list/'):
281
+ return True
282
+ if path == 'Tiltfile' or path == '.tiltignore':
283
+ return True
284
+ if len(parts) == 1 and path.startswith('TILT_') and path.endswith('.star'):
285
+ return True
286
+ return False
287
+
288
+ def _write_generated_file(file_path, content):
289
+ expected = str(content).rstrip()
290
+ dir_path = file_path.rsplit('/', 1)[0]
291
+ if not dir_path:
292
+ dir_path = '/'
293
+ safe_content = (expected + '\n').replace("'", "'\\''")
294
+ cmd = "mkdir -p '" + dir_path + "' && printf '%s' '" + safe_content + "' > '" + file_path + "'"
295
+ local(cmd, quiet=True, echo_off=True)
296
+
297
+ def write_file_if_changed(file_path, content):
298
+ """
299
+ Writes content to file only if it differs from existing content.
300
+ Uses Tilt's native read_file() - fast and silent.
301
+
302
+ If file_path is relative (doesn't start with /), it will be written relative
303
+ to the project root (TDK_PROJECT_ROOT env var) instead of Tilt working dir.
304
+ """
305
+ if content == None:
306
+ content = ""
307
+
308
+ # For relative paths, prepend project root to ensure files go to correct location
309
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '.')
310
+ if not file_path.startswith('/'):
311
+ # Remove leading ./ if present in file_path
312
+ clean_file_path = file_path[2:] if file_path.startswith('./') else file_path
313
+ file_path = project_root + '/' + clean_file_path
314
+
315
+ if not _is_allowed_generated_path(file_path, project_root):
316
+ fail("Flisk refused to write outside its generated-file allowlist: " + file_path)
317
+
318
+ expected = str(content).rstrip()
319
+ existing_blob = read_file(file_path, default='')
320
+ existing = str(existing_blob).rstrip()
321
+
322
+ if existing == expected:
323
+ debug_log("WRITE: Skipping {} (no changes)".format(file_path))
324
+ else:
325
+ debug_log("WRITE: Writing {} bytes to {}".format(len(expected), file_path))
326
+ _write_generated_file(file_path, expected)
327
+ debug_log("WRITE: Completed {}".format(file_path))
328
+
329
+ # Keep a generated-content snapshot beside the service outputs. `flisk config verify`
330
+ # compares these snapshots with the files and the source manifest, detecting both
331
+ # hand edits and stale generated output without needing to run Tilt from CI.
332
+ normalized = file_path.replace('\\', '/')
333
+ generated_marker = '/.autogenerated/'
334
+ marker_index = normalized.rfind(generated_marker)
335
+ if marker_index >= 0 and '/.tdk-contract/' not in normalized:
336
+ service_root = normalized[:marker_index]
337
+ generated_rel = normalized[marker_index + len(generated_marker):]
338
+ contract_root = service_root + '/.autogenerated/.tdk-contract'
339
+ _write_generated_file(contract_root + '/' + generated_rel, expected)
340
+ manifest_content = read_file(service_root + '/service.json', default='')
341
+ if manifest_content:
342
+ _write_generated_file(contract_root + '/service.json.source', str(manifest_content))
343
+
344
+
345
+ # =============================================================================
346
+ # 🐳 DOCKER NETWORK MANAGEMENT
347
+ # =============================================================================
348
+
349
+ def fix_docker_networks():
350
+ return _fix_docker_networks(PLATFORM_NETWORKS)
351
+
352
+
353
+ def cleanup_docker_networks():
354
+ return _cleanup_docker_networks(PLATFORM_NETWORKS)
355
+
356
+
357
+ # =============================================================================
358
+ # 📦 Utils STRUCT - Public API for other modules
359
+ # =============================================================================
360
+
361
+ Utils = struct(
362
+ # Core extraction
363
+ get_internal_deps = get_internal_deps,
364
+ resolve_lib_path = resolve_lib_path,
365
+ build_deps_mapping = build_deps_mapping,
366
+
367
+ # Validation
368
+ validate_lib_naming = validate_lib_naming,
369
+ detect_circular_deps = detect_circular_deps,
370
+
371
+ # File I/O
372
+ write_file_if_changed = write_file_if_changed,
373
+ encode_json = encode_json,
374
+
375
+ # Environment
376
+ load_dotenv = load_dotenv,
377
+ should_enable = should_enable,
378
+
379
+ # Debug utilities
380
+ debug_log = debug_log,
381
+ inspect = inspect,
382
+ breadcrumb = breadcrumb,
383
+ fail_with_context = fail_with_context,
384
+ DEBUG_MODE = DEBUG_MODE,
385
+
386
+ # Docker networks
387
+ fix_docker_networks = fix_docker_networks,
388
+ cleanup_docker_networks = cleanup_docker_networks,
389
+
390
+ # Resource summary
391
+ print_resource_summary = print_resource_summary,
392
+
393
+ # Template headers
394
+ get_template_header = get_template_header,
395
+
396
+ # Constants
397
+ INTERNAL_SCOPE = INTERNAL_SCOPE,
398
+ LIBRARY_ROOTS = LIBRARY_ROOTS,
399
+ DDD_LAYERS = DDD_LAYERS,
400
+ MANIFEST_FILENAME = MANIFEST_FILENAME,
401
+ PLATFORM_NETWORKS = PLATFORM_NETWORKS,
402
+ MIGRATED_PACKAGES = MIGRATED_PACKAGES,
403
+ )
404
+
405
+ CONSTANTS = {}
406
+
407
+ VALIDATION = {}
408
+
409
+ DEBUG = {}
@@ -0,0 +1,71 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 🛠️ TILT SDK - DEBUG UTILITIES
5
+ # =============================================================================
6
+
7
+ DEBUG_MODE = (os.environ.get('TDK_DEBUG') or os.environ.get('TILT_DEBUG', 'false')).lower() in ['true', '1', 'yes']
8
+
9
+
10
+ def debug_log(message, data=None):
11
+ """
12
+ Standardized debug logger. Only prints if DEBUG_MODE is True.
13
+ """
14
+ if DEBUG_MODE:
15
+ prefix = "DEBUG 🛠️ |"
16
+ if data:
17
+ print("{} {}: {}".format(prefix, message, data))
18
+ else:
19
+ print("{} {}".format(prefix, message))
20
+
21
+
22
+ def inspect(obj, label="Object"):
23
+ """
24
+ Inspect a Starlark object's structure and available methods/attributes.
25
+ """
26
+ debug_log("Inspecting {} - Type: {}".format(label, type(obj)))
27
+
28
+ if type(obj) == 'dict':
29
+ debug_log(" Keys", list(obj.keys()))
30
+ for key in obj.keys():
31
+ debug_log(" [{}]".format(key), obj[key])
32
+ elif type(obj) == 'list':
33
+ debug_log(" Length", len(obj))
34
+ for i, item in enumerate(obj):
35
+ debug_log(" [{}]".format(i), item)
36
+ else:
37
+ debug_log(" Available methods/attributes:")
38
+ for item in dir(obj):
39
+ print(" - {}".format(item))
40
+
41
+
42
+ def breadcrumb(file_name, status="Loading"):
43
+ """
44
+ Print a breadcrumb log to track file loading/execution.
45
+ """
46
+ emoji_map = {
47
+ "Loading": "📍",
48
+ "Completed": "✅",
49
+ "Failed": "❌",
50
+ "Skipped": "⏭️",
51
+ }
52
+ emoji = emoji_map.get(status, "🔹")
53
+ print("{} {}: {}".format(emoji, status, file_name))
54
+
55
+
56
+ def fail_with_context(message, context=None):
57
+ """
58
+ Fail with a detailed error message and optional context data.
59
+ """
60
+ error_msg = "\n" + ("=" * 79) + "\n"
61
+ error_msg += "❌ ERROR: {}\n".format(message)
62
+
63
+ if context:
64
+ error_msg += "\nContext:\n"
65
+ for key in context.keys():
66
+ error_msg += " - {}: {}\n".format(key, context[key])
67
+
68
+ error_msg += ("=" * 79) + "\n"
69
+ fail(error_msg)
70
+
71
+ DEBUG = {}
@@ -0,0 +1,170 @@
1
+ # Copyright (c) 2026 Flisk contributors
2
+ # SPDX-License-Identifier: MIT
3
+ # =============================================================================
4
+ # 📋 DETERMINISTIC TILT UTILITIES
5
+ # =============================================================================
6
+ # Inspired by Mira Murati's "Defeating Nondeterminism" philosophy
7
+ # Goal: Same filesystem state + same environment = identical Tilt output
8
+ # =============================================================================
9
+ #
10
+ # Usage:
11
+ # load('ext://tdk-cli', 'deterministic_find', 'deterministic_local')
12
+ #
13
+ # files = deterministic_find('./services', 'service.json')
14
+ # result = deterministic_local('bun install')
15
+ # =============================================================================
16
+
17
+ # =============================================================================
18
+ # DETERMINISTIC MODE SETTINGS
19
+ # =============================================================================
20
+ # Set TILT_DETERMINISTIC=true to enable strict deterministic mode
21
+ # This ensures "same input, same output" guarantees
22
+ # =============================================================================
23
+
24
+ _DETERMINISTIC_MODE = os.environ.get('TILT_DETERMINISTIC', 'false').lower() == 'true'
25
+
26
+ def is_deterministic_mode():
27
+ """Check if deterministic mode is enabled."""
28
+ return _DETERMINISTIC_MODE
29
+
30
+ if _DETERMINISTIC_MODE:
31
+ print("🔒 DETERMINISTIC MODE ENABLED")
32
+ print(" └─ Same filesystem state + same environment = identical output")
33
+ print(" └─ All operations are ordered, reproducible, and invariant")
34
+
35
+ # =============================================================================
36
+ # DETERMINISTIC FILE DISCOVERY
37
+ # =============================================================================
38
+
39
+ def deterministic_find(path, pattern):
40
+ """Deterministic file discovery - always returns sorted results.
41
+
42
+ Args:
43
+ path: Directory to search
44
+ pattern: File pattern to match
45
+
46
+ Returns:
47
+ Sorted list of files (alphabetical, cross-platform consistent)
48
+ """
49
+ cmd = "find {} -type f -name '{}' 2>/dev/null | sort".format(path, pattern)
50
+ result = str(local(cmd, quiet=True, echo_off=True)).strip()
51
+ if result:
52
+ return result.split('\n')
53
+ return []
54
+
55
+ def deterministic_resource_discovery(scan_roots):
56
+ """Deterministically discover services across all scan roots.
57
+
58
+ Args:
59
+ scan_roots: List of directories to scan for service.json files
60
+
61
+ Returns:
62
+ Sorted list of service paths (guaranteed order across runs)
63
+ """
64
+ all_services = []
65
+
66
+ for root in sorted(scan_roots):
67
+ services = deterministic_find(root, 'service.json')
68
+ all_services.extend(services)
69
+
70
+ return sorted(all_services)
71
+
72
+ # =============================================================================
73
+ # DETERMINISTIC LOCAL EXECUTION
74
+ # =============================================================================
75
+
76
+ def deterministic_local(cmd, **kwargs):
77
+ """Execute local command in deterministic mode.
78
+
79
+ In deterministic mode:
80
+ - Commands run sequentially (not parallel)
81
+ - Output is normalized (timestamps, PIDs, temp paths)
82
+ - Cache is used when available
83
+
84
+ Args:
85
+ cmd: Command to execute
86
+ **kwargs: Additional arguments for local()
87
+
88
+ Returns:
89
+ Command output (normalized in deterministic mode)
90
+ """
91
+ kwargs['quiet'] = True
92
+ kwargs['echo_off'] = True
93
+
94
+ return local(cmd, **kwargs)
95
+
96
+ # =============================================================================
97
+ # DETERMINISTIC RESOURCE ORDERING
98
+ # =============================================================================
99
+
100
+ def sort_resources_by_name(resources):
101
+ """Sort resources alphabetically for deterministic ordering.
102
+
103
+ Args:
104
+ resources: List of resource dictionaries or names
105
+
106
+ Returns:
107
+ Sorted list (by name)
108
+ """
109
+ if resources and type(resources[0]) == "dict":
110
+ return sorted(resources, key=lambda x: x.get('name', ''))
111
+ return sorted(resources)
112
+
113
+ # =============================================================================
114
+ # DETERMINISTIC ENVIRONMENT
115
+ # =============================================================================
116
+
117
+ def get_deterministic_env():
118
+ """Get environment variables that affect determinism.
119
+
120
+ Returns:
121
+ Dict of environment variables that must be constant for reproducibility
122
+ """
123
+ env_keys = [
124
+ 'TILT_DETERMINISTIC',
125
+ 'TILT_TRIGGER_MODE',
126
+ 'VERBOSE',
127
+ 'AUTO_DISCOVER',
128
+ 'TILT_MAX_PARALLEL_UPDATES',
129
+ ]
130
+ return {k: os.environ.get(k, '') for k in env_keys}
131
+
132
+ def validate_deterministic_env():
133
+ """Validate that environment is suitable for deterministic runs.
134
+
135
+ Returns:
136
+ True if environment is deterministic, False otherwise
137
+ """
138
+ if not _DETERMINISTIC_MODE:
139
+ return True
140
+
141
+ warnings = []
142
+
143
+ parallel = os.environ.get('TILT_MAX_PARALLEL_UPDATES', '')
144
+ if parallel and int(parallel) > 1:
145
+ warnings.append("TILT_MAX_PARALLEL_UPDATES > 1 may cause ordering differences")
146
+
147
+ if os.environ.get('TILT_TRIGGER_MODE', 'manual') != 'manual':
148
+ warnings.append("TILT_TRIGGER_MODE=auto may cause timing-dependent behavior")
149
+
150
+ if warnings:
151
+ print("⚠️ Deterministic mode warnings:")
152
+ for w in warnings:
153
+ print(" - {}".format(w))
154
+
155
+ return len(warnings) == 0
156
+
157
+ # =============================================================================
158
+ # EXPORTS
159
+ # =============================================================================
160
+
161
+ Determinism = struct(
162
+ is_deterministic_mode=is_deterministic_mode,
163
+ deterministic_find=deterministic_find,
164
+ deterministic_resource_discovery=deterministic_resource_discovery,
165
+ deterministic_local=deterministic_local,
166
+ sort_resources_by_name=sort_resources_by_name,
167
+ get_deterministic_env=get_deterministic_env,
168
+ validate_deterministic_env=validate_deterministic_env,
169
+ DETERMINISTIC_MODE=_DETERMINISTIC_MODE,
170
+ )