@tdk-landscape/tdk-cli-core 1.3.14 → 1.3.22

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 (277) hide show
  1. package/README.md +3 -3
  2. package/Tiltfile +144 -0
  3. package/discovery/AGENTS.md +362 -0
  4. package/discovery/TILT_DISCOVERY.star +424 -0
  5. package/discovery/Tiltfile +58 -0
  6. package/discovery/config.star +258 -0
  7. package/discovery/constants.star +127 -0
  8. package/discovery/deterministic.star +211 -0
  9. package/discovery/discovery_daemon.star +191 -0
  10. package/discovery/discovery_orchestrator.star +460 -0
  11. package/discovery/filtering.star +5 -0
  12. package/discovery/identity-management-backend/service.yaml +26 -0
  13. package/discovery/identity-management-frontend/service.yaml +29 -0
  14. package/discovery/identity-sdk/service.yaml +9 -0
  15. package/discovery/incremental_discovery.star +213 -0
  16. package/discovery/indexing.star +7 -0
  17. package/discovery/json_manifest_scanner.star +51 -0
  18. package/discovery/libraries.star +46 -0
  19. package/discovery/loading.star +23 -0
  20. package/discovery/manifest/constants.star +104 -0
  21. package/discovery/manifest/loading.star +386 -0
  22. package/discovery/manifest/normalize.star +281 -0
  23. package/discovery/manifest/validation.star +108 -0
  24. package/discovery/normalization.star +11 -0
  25. package/discovery/registry.star +544 -0
  26. package/discovery/resource_snapshot.py +382 -0
  27. package/discovery/resource_snapshot.star +143 -0
  28. package/discovery/schemas.star +1 -0
  29. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  30. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  31. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  32. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  33. package/discovery/test_resource_snapshot.py +251 -0
  34. package/discovery/validation.star +78 -0
  35. package/discovery/versioning.star +1 -0
  36. package/dist/commands/config.d.ts.map +1 -1
  37. package/dist/commands/config.js +11 -0
  38. package/dist/commands/config.js.map +1 -1
  39. package/dist/commands/doctor.d.ts.map +1 -1
  40. package/dist/commands/doctor.js +1 -2
  41. package/dist/commands/doctor.js.map +1 -1
  42. package/dist/commands/project.d.ts.map +1 -1
  43. package/dist/commands/project.js +36 -41
  44. package/dist/commands/project.js.map +1 -1
  45. package/dist/commands/resource.d.ts.map +1 -1
  46. package/dist/commands/resource.js +51 -55
  47. package/dist/commands/resource.js.map +1 -1
  48. package/dist/commands/stack.d.ts.map +1 -1
  49. package/dist/commands/stack.js +22 -24
  50. package/dist/commands/stack.js.map +1 -1
  51. package/dist/commands/ui.d.ts.map +1 -1
  52. package/dist/commands/ui.js +1 -2
  53. package/dist/commands/ui.js.map +1 -1
  54. package/dist/commands/up.d.ts.map +1 -1
  55. package/dist/commands/up.js +1 -2
  56. package/dist/commands/up.js.map +1 -1
  57. package/dist/commands/upgrade.d.ts +8 -0
  58. package/dist/commands/upgrade.d.ts.map +1 -1
  59. package/dist/commands/upgrade.js +62 -21
  60. package/dist/commands/upgrade.js.map +1 -1
  61. package/dist/generator/extension-fetch.d.ts +19 -0
  62. package/dist/generator/extension-fetch.d.ts.map +1 -1
  63. package/dist/generator/extension-fetch.js +71 -5
  64. package/dist/generator/extension-fetch.js.map +1 -1
  65. package/dist/generator/template-engine.d.ts +1 -0
  66. package/dist/generator/template-engine.d.ts.map +1 -1
  67. package/dist/generator/template-engine.js +50 -6
  68. package/dist/generator/template-engine.js.map +1 -1
  69. package/dist/utils/command-helpers.d.ts.map +1 -1
  70. package/dist/utils/command-helpers.js +7 -9
  71. package/dist/utils/command-helpers.js.map +1 -1
  72. package/dist/utils/constants.d.ts +1 -0
  73. package/dist/utils/constants.d.ts.map +1 -1
  74. package/dist/utils/constants.js +1 -0
  75. package/dist/utils/constants.js.map +1 -1
  76. package/dist/utils/errors.d.ts +2 -0
  77. package/dist/utils/errors.d.ts.map +1 -1
  78. package/dist/utils/errors.js +6 -1
  79. package/dist/utils/errors.js.map +1 -1
  80. package/dist/utils/paths.js +1 -1
  81. package/dist/utils/paths.js.map +1 -1
  82. package/dist/utils/project-features.d.ts.map +1 -1
  83. package/dist/utils/project-features.js +1 -1
  84. package/dist/utils/project-features.js.map +1 -1
  85. package/dist/utils/resource-features.d.ts.map +1 -1
  86. package/dist/utils/resource-features.js +2 -2
  87. package/dist/utils/resource-features.js.map +1 -1
  88. package/dist/utils/tar.js +4 -4
  89. package/dist/utils/tar.js.map +1 -1
  90. package/dist/utils/validation.d.ts +7 -0
  91. package/dist/utils/validation.d.ts.map +1 -1
  92. package/dist/utils/validation.js +9 -0
  93. package/dist/utils/validation.js.map +1 -1
  94. package/engine/AGENTS.md +705 -0
  95. package/engine/README.md +29 -0
  96. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  97. package/engine/Tiltfile +80 -0
  98. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  99. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  100. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  101. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  102. package/engine/config.star +3 -0
  103. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  104. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  105. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  106. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  107. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  108. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  109. package/engine/docs/README.md +284 -0
  110. package/engine/entrypoint.star +97 -0
  111. package/engine/lifecycle/orchestrator.star +260 -0
  112. package/engine/paths.star +717 -0
  113. package/engine/schemas/manifest-schema.json +301 -0
  114. package/engine/schemas/service-schema.json +301 -0
  115. package/engine/scripts/README.md +89 -0
  116. package/engine/scripts/build-and-publish-lib.sh +205 -0
  117. package/engine/scripts/check-lib-publish.sh +85 -0
  118. package/engine/scripts/debug-container.sh +258 -0
  119. package/engine/scripts/generate-manifest.sh +197 -0
  120. package/engine/spec.master +702 -0
  121. package/engine/spec.master.example +341 -0
  122. package/engine/topologies/README.md +34 -0
  123. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  124. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  125. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  126. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  127. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  128. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  129. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  130. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  131. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  132. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  133. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  134. package/engine/topologies/platform/docker/constants.star +170 -0
  135. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  136. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  137. package/engine/topologies/platform/docker/index.star +27 -0
  138. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  139. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  140. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  141. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  142. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  143. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  144. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  145. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  146. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  147. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  148. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  149. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  150. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  151. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  152. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  153. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  154. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  155. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  156. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  157. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  158. package/engine/topologies/platform/net/proxy.star +4 -0
  159. package/engine/topologies/platform/registries/local.star +4 -0
  160. package/engine/topologies/platform/security/secrets.star +239 -0
  161. package/engine/topologies/platform/state/relational.star +4 -0
  162. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  163. package/engine/topologies/tilt/common/utils.star +364 -0
  164. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  165. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  166. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  167. package/engine/topologies/tilt/common/utils_env.star +43 -0
  168. package/engine/topologies/tilt/common/utils_output.star +97 -0
  169. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  170. package/engine/topologies/tilt/config/defaults.star +3 -0
  171. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  172. package/engine/topologies/tilt/config/global.star +55 -0
  173. package/engine/topologies/tilt/config/profiles.star +382 -0
  174. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  175. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  176. package/engine/topologies/tilt/generators/index.star +124 -0
  177. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  178. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  179. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  180. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  181. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  182. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  183. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  184. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  185. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  186. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  187. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  188. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  189. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  190. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  191. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  192. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  193. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  194. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  195. package/engine/topologies/tilt/generators/validators.star +853 -0
  196. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  197. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  198. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  199. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  200. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  201. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  202. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  203. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  204. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  205. package/engine/topologies/tilt/manifest/README.md +693 -0
  206. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  207. package/engine/topologies/tilt/manifest/constants.star +252 -0
  208. package/engine/topologies/tilt/manifest/errors.star +266 -0
  209. package/engine/topologies/tilt/manifest/integration.star +339 -0
  210. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  211. package/engine/topologies/tilt/manifest/loader.star +214 -0
  212. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  213. package/engine/topologies/tilt/manifest/parser.star +400 -0
  214. package/engine/topologies/tilt/manifest/schema.star +462 -0
  215. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  216. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  217. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  218. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  219. package/engine/topologies/tilt/manifest/validator.star +717 -0
  220. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  221. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  222. package/engine/topologies/tilt/resources/conditions.star +3 -0
  223. package/engine/topologies/tilt/resources/databases.star +244 -0
  224. package/engine/topologies/tilt/resources/declaration.star +3 -0
  225. package/engine/topologies/tilt/resources/deps.star +3 -0
  226. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  227. package/engine/topologies/tilt/resources/libs.star +30 -0
  228. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  229. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  230. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  231. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  232. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  236. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  237. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  238. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  239. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  243. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  244. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  245. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  246. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  247. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  248. package/engine/topologies/tilt/resources/ordering.star +3 -0
  249. package/engine/topologies/tilt/resources/triggers.star +3 -0
  250. package/engine/topologies/tilt/resources/watchers.star +299 -0
  251. package/engine/where-things-live.star +717 -0
  252. package/ext/Tiltfile +66 -0
  253. package/ext/ide-components/README.md +219 -0
  254. package/ext/ide-components/code_executor/server.py +268 -0
  255. package/ext/ide-components/code_viewer/server.py +206 -0
  256. package/ext/ide-components/config_inspector/server.py +1050 -0
  257. package/ext/ide-components/file_browser/server.py +285 -0
  258. package/ext/ide-components/shared/config_service.py +469 -0
  259. package/ext/ide-components/shared/file_utils.py +298 -0
  260. package/ext/ide-components/shared/http_utils.py +232 -0
  261. package/ext/ide-components/shared/static/styles.css +1334 -0
  262. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  263. package/ext/ide-components/shared/template_engine.py +123 -0
  264. package/ext/ide-components/shared/templates/base.html +121 -0
  265. package/ext/ide-components/shared/test_config_service.py +326 -0
  266. package/ext/ide-components/shared/tilt_integration.py +158 -0
  267. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  268. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  269. package/ext/ui-enhancements/extension.yaml +36 -0
  270. package/ext/ui-enhancements/tiltfile.py +99 -0
  271. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  272. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  273. package/ext/ui-enhancements/ui/icons.css +125 -0
  274. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  275. package/package.json +13 -9
  276. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  277. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,40 @@
1
+ # =============================================================================
2
+ # 🔐 INFISICAL DOCKER LAYERS - Master Index
3
+ # =============================================================================
4
+ # Centralizes all Infisical-related Docker layer functionality
5
+ # =============================================================================
6
+ #
7
+ # This module provides:
8
+ # - Dockerfile generation for Infisical integration
9
+ # - Secret injection at runtime (L4 layers)
10
+ # - CLI setup at build time (L3 layers)
11
+ # - Prisma migrator secret resolution
12
+ #
13
+ # Usage:
14
+ # load("./infisical/index.star", "InfisicalLayers")
15
+ #
16
+ # # Runtime setup
17
+ # dockerfile_snippet = InfisicalLayers.Docker.runtime_setup("my-service")
18
+ #
19
+ # # Builder setup
20
+ # builder_snippet = InfisicalLayers.Docker.builder_setup(use_infisical=True)
21
+ #
22
+ # # Environment for docker-compose
23
+ # env = InfisicalLayers.Docker.generate_compose_env("my-service")
24
+ # =============================================================================
25
+
26
+ # Load all Infisical Docker submodules
27
+ load("./infisical_docker.star", "InfisicalDocker")
28
+
29
+ # =============================================================================
30
+ # Exports
31
+ # =============================================================================
32
+
33
+ InfisicalLayers = struct(
34
+ # Main Docker integration
35
+ Docker=InfisicalDocker,
36
+
37
+ # Constants
38
+ ENTRYPOINT_PATH=InfisicalDocker.ENTRYPOINT_PATH,
39
+ ENTRYPOINT_SOURCE=InfisicalDocker.ENTRYPOINT_SOURCE,
40
+ )
@@ -0,0 +1,262 @@
1
+ # =============================================================================
2
+ # 🔐 INFISICAL DOCKER INTEGRATION
3
+ # =============================================================================
4
+ # Replaces: Hardcoded infisical-entrypoint.sh references in Dockerfile generation
5
+ # Uses: Starlark generators for secret configuration
6
+ # =============================================================================
7
+ #
8
+ # This module provides:
9
+ # - Dockerfile generation for Infisical secret injection
10
+ # - Environment variable configuration using Starlark generators
11
+ # - Entrypoint setup with proper secret paths
12
+ #
13
+ # Usage:
14
+ # load("./infisical_docker.star", "InfisicalDocker")
15
+ # dockerfile_snippet = InfisicalDocker.runtime_setup("my-service", "/services/my-service")
16
+ # =============================================================================
17
+
18
+ # Load the generators
19
+ load("../../../../tilt/generators/infisical/secrets_generator.star", _Secrets="SecretsGenerator")
20
+ load("../../../../tilt/generators/infisical/path_manager.star", _Paths="PathManager")
21
+
22
+ # =============================================================================
23
+ # Constants
24
+ # =============================================================================
25
+
26
+ ENTRYPOINT_PATH = "/entrypoint.sh"
27
+ ENTRYPOINT_SOURCE = "shared-platform-engineering/docker-templates/infisical-entrypoint.sh"
28
+
29
+ # =============================================================================
30
+ # Runtime Secret Injection (L4 Runtime Layers)
31
+ # =============================================================================
32
+
33
+ def _runtime_setup(resource_name, secret_path=None, resource_type="backend", command="bun run start", use_entrypoint=True):
34
+ """
35
+ Generate Dockerfile snippet for Infisical runtime setup.
36
+
37
+ Args:
38
+ resource_name: Name of the service
39
+ secret_path: Infisical path (default: auto-generated from resource_name)
40
+ resource_type: Type of service (backend, frontend, worker, etc.)
41
+ command: Command to run after secret injection
42
+ use_entrypoint: Whether to use entrypoint.sh (default: True)
43
+
44
+ Returns:
45
+ String with Dockerfile commands for runtime setup
46
+ """
47
+ # Auto-generate secret path if not provided
48
+ if not secret_path:
49
+ path_plan = _Paths.plan_resource_path(resource_name, resource_type)
50
+ secret_path = path_plan["full_path"]
51
+
52
+ # Generate configuration using the Starlark generator
53
+ config = _Secrets.generate_for_service(
54
+ resource_name=resource_name,
55
+ secret_path=secret_path,
56
+ resource_type=resource_type,
57
+ command=command,
58
+ )
59
+
60
+ # Extract environment variables from the config
61
+ env_vars = config["docker_compose"]["environment"]
62
+
63
+ parts = []
64
+
65
+ if use_entrypoint:
66
+ # Copy entrypoint script
67
+ parts.append("COPY --chmod=0755 {} {}\n".format(ENTRYPOINT_SOURCE, ENTRYPOINT_PATH))
68
+
69
+ # Set environment variables
70
+ for key, value in env_vars.items():
71
+ # Handle env var references properly
72
+ if value.startswith("${") and value.endswith("}"):
73
+ parts.append("ENV {}={}\n".format(key, value))
74
+ else:
75
+ parts.append("ENV {}=\"{}\"\n".format(key, value))
76
+
77
+ # Set RESOURCE_NAME explicitly
78
+ parts.append("ENV RESOURCE_NAME={}\n".format(resource_name))
79
+
80
+ # Set entrypoint
81
+ parts.append("ENTRYPOINT [\"{}\"]\n".format(ENTRYPOINT_PATH))
82
+
83
+ # Set command
84
+ cmd_parts = command.split()
85
+ cmd_json = ", ".join(["\"{}\"".format(p) for p in cmd_parts])
86
+ parts.append("CMD [{}]\n".format(cmd_json))
87
+ else:
88
+ # Without entrypoint, just set env vars and use direct command
89
+ for key, value in env_vars.items():
90
+ parts.append("ENV {}={}\n".format(key, value))
91
+ parts.append("CMD [\"{}\"]\n".format(command))
92
+
93
+ return "".join(parts)
94
+
95
+ def _runtime_setup_simple(resource_name, use_entrypoint=True):
96
+ """
97
+ Simple runtime setup using known service configuration.
98
+
99
+ Args:
100
+ resource_name: Name of the service
101
+ use_entrypoint: Whether to use entrypoint.sh
102
+
103
+ Returns:
104
+ String with Dockerfile commands
105
+ """
106
+ # Try to get known path
107
+ secret_path = _Paths.get_known_resource_path(resource_name)
108
+
109
+ if not secret_path:
110
+ # Plan a new path
111
+ path_plan = _Paths.plan_resource_path(resource_name)
112
+ secret_path = path_plan["full_path"]
113
+
114
+ return _runtime_setup(
115
+ resource_name=resource_name,
116
+ secret_path=secret_path,
117
+ use_entrypoint=use_entrypoint,
118
+ )
119
+
120
+ # =============================================================================
121
+ # Builder Secret Injection (L3 Builder Layers)
122
+ # =============================================================================
123
+
124
+ def _builder_setup(use_infisical=True, use_golden=True):
125
+ """
126
+ Generate Dockerfile snippet for builder Infisical CLI setup.
127
+
128
+ Args:
129
+ use_infisical: Whether to include Infisical CLI setup
130
+ use_golden: Whether using golden image (skips CLI install)
131
+
132
+ Returns:
133
+ String with Dockerfile commands for builder setup
134
+ """
135
+ if not use_infisical or use_golden:
136
+ return ""
137
+
138
+ # Only install Infisical CLI if not skipped AND not using golden image
139
+ return (
140
+ "# Conditionally install Infisical CLI only if not skipped\n"
141
+ + "RUN if [ \"$SKIP_INFISICAL_SETUP\" != \"1\" ]; then \\\n"
142
+ + " echo \"\u26a0\ufe0f Installing Infisical CLI...\" && \\\n"
143
+ + " apk add --no-cache bash curl netcat-openbsd && \\\n"
144
+ + " curl -sL https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.alpine.sh | bash && \\\n"
145
+ + " apk add --no-cache infisical; \\\n"
146
+ + " else \\\n"
147
+ + " echo \"\u2705 Skipping Infisical CLI installation (SKIP_INFISICAL_SETUP=1)\"; \\\n"
148
+ + " fi\n"
149
+ + "COPY --chmod=0755 {} {}\n".format(ENTRYPOINT_SOURCE, ENTRYPOINT_PATH)
150
+ )
151
+
152
+ # =============================================================================
153
+ # Environment Variable Generation (for docker-compose)
154
+ # =============================================================================
155
+
156
+ def _generate_compose_env(resource_name, secret_path=None, resource_type="backend", additional_vars=None):
157
+ """
158
+ Generate environment variables for docker-compose.
159
+
160
+ Args:
161
+ resource_name: Name of the service
162
+ secret_path: Infisical path
163
+ resource_type: Type of service
164
+ additional_vars: Additional environment variables
165
+
166
+ Returns:
167
+ Dict of environment variables for docker-compose
168
+ """
169
+ if not secret_path:
170
+ secret_path = _Paths.get_known_resource_path(resource_name)
171
+ if not secret_path:
172
+ path_plan = _Paths.plan_resource_path(resource_name, resource_type)
173
+ secret_path = path_plan["full_path"]
174
+
175
+ config = _Secrets.generate_for_service(
176
+ resource_name=resource_name,
177
+ secret_path=secret_path,
178
+ resource_type=resource_type,
179
+ )
180
+
181
+ env = config["docker_compose"]["environment"]
182
+
183
+ if additional_vars:
184
+ env.update(additional_vars)
185
+
186
+ return env
187
+
188
+ # =============================================================================
189
+ # Secret Path Resolution (for Prisma/migrators)
190
+ # =============================================================================
191
+
192
+ def _resolve_secret_path(resource_name, default_subpath="/database"):
193
+ """
194
+ Resolve the secret path for database operations.
195
+
196
+ Args:
197
+ resource_name: Name of the service
198
+ default_subpath: Default subpath for database secrets
199
+
200
+ Returns:
201
+ String with the full secret path
202
+ """
203
+ base_path = _Paths.get_known_resource_path(resource_name)
204
+
205
+ if not base_path:
206
+ path_plan = _Paths.plan_resource_path(resource_name)
207
+ base_path = path_plan["full_path"]
208
+
209
+ return "{}{}".format(base_path, default_subpath)
210
+
211
+ def _generate_migrator_env(resource_name, db_name=None):
212
+ """
213
+ Generate environment variables for database migrator.
214
+
215
+ Args:
216
+ resource_name: Name of the service
217
+ db_name: Database name (optional)
218
+
219
+ Returns:
220
+ Dict of environment variables
221
+ """
222
+ secret_path = _resolve_secret_path(resource_name)
223
+
224
+ env = {
225
+ "RESOURCE_NAME": resource_name,
226
+ "INFISICAL_SECRET_PATH": secret_path,
227
+ "INFISICAL_TOKEN": "${INFISICAL_TOKEN:-}",
228
+ "INFISICAL_CLIENT_ID": "${INFISICAL_CLIENT_ID:-}",
229
+ "INFISICAL_CLIENT_SECRET": "${INFISICAL_CLIENT_SECRET:-}",
230
+ "INFISICAL_API_URL": "${INFISICAL_API_URL:-http://infisical:8080}",
231
+ "INFISICAL_PROJECT_ID": "${INFISICAL_PROJECT_ID:-}",
232
+ "INFISICAL_ENVIRONMENT": "${INFISICAL_ENVIRONMENT:-dev}",
233
+ }
234
+
235
+ if db_name:
236
+ env["DATABASE_NAME"] = db_name
237
+
238
+ return env
239
+
240
+ # =============================================================================
241
+ # Main Public API
242
+ # =============================================================================
243
+
244
+ InfisicalDocker = struct(
245
+ # Runtime setup (L4 layers)
246
+ runtime_setup=_runtime_setup,
247
+ runtime_setup_simple=_runtime_setup_simple,
248
+
249
+ # Builder setup (L3 layers)
250
+ builder_setup=_builder_setup,
251
+
252
+ # Environment generation
253
+ generate_compose_env=_generate_compose_env,
254
+ generate_migrator_env=_generate_migrator_env,
255
+
256
+ # Path resolution
257
+ resolve_secret_path=_resolve_secret_path,
258
+
259
+ # Constants
260
+ ENTRYPOINT_PATH=ENTRYPOINT_PATH,
261
+ ENTRYPOINT_SOURCE=ENTRYPOINT_SOURCE,
262
+ )
@@ -0,0 +1,87 @@
1
+ """
2
+ L1 Base Layers - OS and Runtime Environment Foundation
3
+
4
+ Provides the foundational layers for all Dockerfiles:
5
+ - l1_os_base: Alpine Linux base with essential tools
6
+ - l1_runtime_env: Runtime environment variables
7
+ """
8
+
9
+ BUN_BASE = "oven/bun:1.3.11-alpine"
10
+ ALPINE_BASE = "alpine:3.18"
11
+ load('../../../../../discovery/config.star', 'GLOBAL_CONFIG')
12
+
13
+ # Load project name for dynamic golden image naming
14
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
15
+ def _load_golden_prefix():
16
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
17
+ project_json_path = '.tdk/project.json'
18
+ if project_root:
19
+ project_json_path = project_root + '/' + project_json_path
20
+
21
+ if os.path.exists(project_json_path):
22
+ _project_json = read_json(project_json_path)
23
+ return _project_json.get('project', {}).get('name', 'tdk-project')
24
+ return 'tdk-project'
25
+
26
+ _GOLDEN_PREFIX = _load_golden_prefix()
27
+
28
+ GOLDEN_L1_IMAGE = GLOBAL_CONFIG['docker'].get('golden_l1_image', _GOLDEN_PREFIX + '-l1:latest')
29
+
30
+
31
+ def L1_generate_os_base(base_image = None, maintainer = None, use_golden = True):
32
+ """
33
+ Generate the OS base layer with Alpine Linux and essential tools.
34
+
35
+ Args:
36
+ base_image: Base image to use (default: {prefix}-l1:latest if use_golden=True, else Alpine 3.18)
37
+ maintainer: Maintainer label (default: project name from project.json)
38
+ use_golden: Whether to use the golden L1 image (default: True)
39
+
40
+ Returns:
41
+ Dockerfile content string for the l1_os_base stage
42
+ """
43
+ if base_image == None:
44
+ base_image = GOLDEN_L1_IMAGE if use_golden else ALPINE_BASE
45
+
46
+ # Set default maintainer from project name
47
+ if maintainer == None:
48
+ maintainer = _GOLDEN_PREFIX
49
+
50
+ # If using golden L1 image, skip dependency installation (already in base)
51
+ if base_image == GOLDEN_L1_IMAGE or _GOLDEN_PREFIX + "-l1" in base_image:
52
+ return (
53
+ "# ---- L1: os_base (Golden L1: " + base_image + ") ----\n"
54
+ + "FROM " + base_image + " AS l1_os_base\n"
55
+ + "# OS dependencies pre-installed in golden L1 image\n"
56
+ + "WORKDIR /app\n"
57
+ )
58
+
59
+ # Standard base with dependency installation
60
+ return (
61
+ "# ---- L1: os_base (" + base_image + ") ----\n"
62
+ + "FROM " + base_image + " AS l1_os_base\n"
63
+ + "LABEL maintainer=\"" + maintainer + "\"\n"
64
+ + "RUN apk add --no-cache ca-certificates tzdata curl file bash openssl \\\n"
65
+ + " && addgroup -S app && adduser -S app -G app\n"
66
+ + "WORKDIR /app\n"
67
+ )
68
+
69
+
70
+ def L1_generate_runtime_env(envs = None):
71
+ """
72
+ Generate the runtime environment variables layer.
73
+
74
+ Args:
75
+ envs: Dictionary of environment variables (default: production settings)
76
+
77
+ Returns:
78
+ Dockerfile content string for the l1_runtime_env stage
79
+ """
80
+ if envs == None:
81
+ envs = {"NODE_ENV": "production", "BUN_INSTALL_CACHE_DIR": "/cache/bun"}
82
+ parts = ["# ---- L1: runtime_env ----\n", "# Shared runtime environment\n"]
83
+ for k in envs:
84
+ parts.append("ENV " + k + "=" + envs[k] + "\n")
85
+ return "".join(parts)
86
+
87
+ GLOBAL_CONFIG = {}
@@ -0,0 +1,125 @@
1
+ # === INLINED CONSTANTS for pure extension loading ===
2
+ RUNTIME = "bun"
3
+ # === END INLINED CONSTANTS ===
4
+
5
+
6
+ """
7
+ L2 Dependency Layers - Package Manifest and Dependency Resolution
8
+
9
+ Handles the dependency layers for efficient Docker caching:
10
+ - l2_dependency_manifest: Copy and install package manifests
11
+ - l2_dependency_resolver: Cache resolved dependencies
12
+ """
13
+
14
+ load('./l1_base_layers.star', 'BUN_BASE')
15
+ load('../../../../../discovery/config.star', 'GLOBAL_CONFIG')
16
+ load('../../../tilt/common/utils_debug.star', 'DEBUG_MODE')
17
+ load('../../../tilt/manifest/constants.star', 'AUTOGENERATED_CONFIG_PATHS', 'GENERATED_CONFIG_FILENAMES')
18
+
19
+
20
+ # Load project name for dynamic golden image naming
21
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
22
+ def _load_golden_prefix():
23
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
24
+ project_json_path = '.tdk/project.json'
25
+ if project_root:
26
+ project_json_path = project_root + '/' + project_json_path
27
+
28
+ if os.path.exists(project_json_path):
29
+ _project_json = read_json(project_json_path)
30
+ return _project_json.get('project', {}).get('name', 'tdk-project')
31
+ return 'tdk-project'
32
+
33
+ _GOLDEN_PREFIX = _load_golden_prefix()
34
+
35
+ GOLDEN_L2_IMAGE = GLOBAL_CONFIG['docker'].get('golden_l2_image', _GOLDEN_PREFIX + '-l2:latest')
36
+
37
+
38
+ def normalize_res_path(res_path):
39
+ """Normalize resource path for Docker COPY commands.
40
+
41
+ Docker COPY requires paths relative to the build context.
42
+ If res_path starts with '/', remove it to make it relative.
43
+
44
+ Args:
45
+ res_path: Resource path (may be absolute or relative)
46
+
47
+ Returns:
48
+ Normalized relative path for Docker COPY
49
+ """
50
+ if res_path.startswith('/'):
51
+ return res_path[1:] # Remove leading slash
52
+ return res_path
53
+
54
+
55
+ def L2_generate_dependency_manifest(res_path, manager = RUNTIME, use_golden = True):
56
+ """
57
+ Generate the dependency manifest layer that copies package files.
58
+ This layer is cached independently for faster builds.
59
+
60
+ Args:
61
+ res_path: Resource path (service directory)
62
+ manager: Package manager to use (default: RUNTIME from master config)
63
+ use_golden: Whether to use golden L2 image (default: True)
64
+
65
+ Returns:
66
+ Dockerfile content string for the l2_deps_manifest stage
67
+ """
68
+ # Normalize res_path for Docker COPY (must be relative to build context)
69
+ res_path_rel = normalize_res_path(res_path)
70
+
71
+ lockfile = "bun.lock*"
72
+
73
+ # Prefer golden L2 image when enabled and defined; fall back to plain Bun image.
74
+ base_image = GOLDEN_L2_IMAGE if (use_golden and GOLDEN_L2_IMAGE) else BUN_BASE
75
+ use_golden_for_manifest = base_image == GOLDEN_L2_IMAGE
76
+ debug_tools_install = "" if use_golden_for_manifest else "# Install debugging tools for troubleshooting\nRUN echo '🔧 Installing debug tools...' && apk add --no-cache curl netcat-openbsd jq bind-tools vim && echo '✅ Debug tools installed'\n"
77
+
78
+ diagnostics_block = """
79
+ # Comprehensive pre-flight diagnostics (debug mode)
80
+ RUN echo '🔍 DEPENDENCY INSTALLATION DIAGNOSTICS (debug)' && \\
81
+ echo "Bun version: $(bun --version)" && \\
82
+ echo "Lock files:" && ls -lh bun.lock* 2>/dev/null && \\
83
+ echo "Cache dir:" && ls -lh /cache/bun 2>/dev/null || true
84
+ """
85
+ if not DEBUG_MODE:
86
+ diagnostics_block = "# Diagnostics suppressed (set TILT_DEBUG=true for verbose output)\n"
87
+
88
+ install_deps_verbose = "INSTALL_DEPS_VERBOSE=1 " if DEBUG_MODE else ""
89
+
90
+ return (
91
+ "# ---- L2: dependency_manifest ----\n"
92
+ + "FROM " + base_image + " AS l2_deps_manifest\n"
93
+ + "WORKDIR /app\n"
94
+ + "\n"
95
+ + "# Cache-busting mechanism - change this value to force dependency reinstall\n"
96
+ + "ARG CACHE_BUSTER=2026-06-25-v1\n"
97
+ + "RUN echo \"Cache buster: ${CACHE_BUSTER}\"\n"
98
+ + "\n"
99
+ + debug_tools_install
100
+ + "\n"
101
+ + "# Copy workspace root for monorepo resolution\n"
102
+ + "COPY package.json ./package.json\n"
103
+ + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['npmrc_docker'] + " /app/.npmrc\n"
104
+ + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['bunfig_docker'] + " /app/.bunfig.toml\n"
105
+ + "\n"
106
+ + "# Copy service manifest files for deterministic dependency layer\n"
107
+ + "WORKDIR /app/" + res_path + "\n"
108
+ + "COPY " + res_path_rel + "/package.json ./package.json\n"
109
+ + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['npmrc_docker'] + " .npmrc\n"
110
+ + "COPY " + lockfile + " ./\n"
111
+ + "COPY " + res_path_rel + "/" + AUTOGENERATED_CONFIG_PATHS['bunfig_docker'] + " .bunfig.toml\n"
112
+ + "\n"
113
+ + diagnostics_block
114
+ + "# Install dependencies (quiet by default; set TILT_DEBUG=true for verbose diagnostics)\n"
115
+ + "COPY shared-platform-engineering/docker-templates/install-deps.sh /usr/local/bin/install-deps.sh\n"
116
+ # NOTE: sharing=shared allows parallel builds (20+ services) without lock contention.
117
+ # Bun's cache uses content-addressable storage with atomic writes, so concurrent access is safe.
118
+ + "RUN --mount=type=cache,target=/cache/bun,sharing=shared chmod +x /usr/local/bin/install-deps.sh && start_ts=$(date +%s) && "
119
+ + install_deps_verbose
120
+ + "/usr/local/bin/install-deps.sh && end_ts=$(date +%s) && echo \"install-deps duration: $((end_ts-start_ts))s\"\n"
121
+ )
122
+
123
+ DEBUG = {}
124
+
125
+ GLOBAL_CONFIG = {}