@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.26

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 (274) hide show
  1. package/Tiltfile +144 -0
  2. package/discovery/AGENTS.md +362 -0
  3. package/discovery/TILT_DISCOVERY.star +424 -0
  4. package/discovery/Tiltfile +58 -0
  5. package/discovery/config.star +258 -0
  6. package/discovery/constants.star +127 -0
  7. package/discovery/deterministic.star +211 -0
  8. package/discovery/discovery_daemon.star +191 -0
  9. package/discovery/discovery_orchestrator.star +460 -0
  10. package/discovery/filtering.star +5 -0
  11. package/discovery/identity-management-backend/service.yaml +26 -0
  12. package/discovery/identity-management-frontend/service.yaml +29 -0
  13. package/discovery/identity-sdk/service.yaml +9 -0
  14. package/discovery/incremental_discovery.star +213 -0
  15. package/discovery/indexing.star +7 -0
  16. package/discovery/json_manifest_scanner.star +51 -0
  17. package/discovery/libraries.star +46 -0
  18. package/discovery/loading.star +23 -0
  19. package/discovery/manifest/constants.star +104 -0
  20. package/discovery/manifest/loading.star +386 -0
  21. package/discovery/manifest/normalize.star +281 -0
  22. package/discovery/manifest/validation.star +108 -0
  23. package/discovery/normalization.star +11 -0
  24. package/discovery/registry.star +544 -0
  25. package/discovery/resource_snapshot.py +382 -0
  26. package/discovery/resource_snapshot.star +143 -0
  27. package/discovery/schemas.star +1 -0
  28. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  29. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  30. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  31. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  32. package/discovery/test_resource_snapshot.py +251 -0
  33. package/discovery/validation.star +78 -0
  34. package/discovery/versioning.star +1 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +11 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +1 -2
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/project.d.ts.map +1 -1
  42. package/dist/commands/project.js +36 -41
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/resource.d.ts.map +1 -1
  45. package/dist/commands/resource.js +51 -55
  46. package/dist/commands/resource.js.map +1 -1
  47. package/dist/commands/stack.d.ts.map +1 -1
  48. package/dist/commands/stack.js +22 -24
  49. package/dist/commands/stack.js.map +1 -1
  50. package/dist/commands/ui.d.ts.map +1 -1
  51. package/dist/commands/ui.js +1 -2
  52. package/dist/commands/ui.js.map +1 -1
  53. package/dist/commands/up.d.ts.map +1 -1
  54. package/dist/commands/up.js +1 -2
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/commands/upgrade.d.ts +8 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -1
  58. package/dist/commands/upgrade.js +59 -18
  59. package/dist/commands/upgrade.js.map +1 -1
  60. package/dist/generator/extension-fetch.d.ts +19 -0
  61. package/dist/generator/extension-fetch.d.ts.map +1 -1
  62. package/dist/generator/extension-fetch.js +71 -5
  63. package/dist/generator/extension-fetch.js.map +1 -1
  64. package/dist/generator/template-engine.d.ts +1 -0
  65. package/dist/generator/template-engine.d.ts.map +1 -1
  66. package/dist/generator/template-engine.js +50 -6
  67. package/dist/generator/template-engine.js.map +1 -1
  68. package/dist/utils/command-helpers.d.ts.map +1 -1
  69. package/dist/utils/command-helpers.js +7 -9
  70. package/dist/utils/command-helpers.js.map +1 -1
  71. package/dist/utils/constants.d.ts +1 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +1 -0
  74. package/dist/utils/constants.js.map +1 -1
  75. package/dist/utils/errors.d.ts +2 -0
  76. package/dist/utils/errors.d.ts.map +1 -1
  77. package/dist/utils/errors.js +6 -1
  78. package/dist/utils/errors.js.map +1 -1
  79. package/dist/utils/project-features.d.ts.map +1 -1
  80. package/dist/utils/project-features.js +1 -1
  81. package/dist/utils/project-features.js.map +1 -1
  82. package/dist/utils/resource-features.d.ts.map +1 -1
  83. package/dist/utils/resource-features.js +2 -2
  84. package/dist/utils/resource-features.js.map +1 -1
  85. package/dist/utils/tar.js +4 -4
  86. package/dist/utils/tar.js.map +1 -1
  87. package/dist/utils/validation.d.ts +7 -0
  88. package/dist/utils/validation.d.ts.map +1 -1
  89. package/dist/utils/validation.js +9 -0
  90. package/dist/utils/validation.js.map +1 -1
  91. package/engine/AGENTS.md +705 -0
  92. package/engine/README.md +29 -0
  93. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  94. package/engine/Tiltfile +80 -0
  95. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  96. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  97. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  98. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  99. package/engine/config.star +3 -0
  100. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  101. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  102. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  103. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  104. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  105. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  106. package/engine/docs/README.md +284 -0
  107. package/engine/entrypoint.star +97 -0
  108. package/engine/lifecycle/orchestrator.star +260 -0
  109. package/engine/paths.star +717 -0
  110. package/engine/schemas/manifest-schema.json +301 -0
  111. package/engine/schemas/service-schema.json +301 -0
  112. package/engine/scripts/README.md +89 -0
  113. package/engine/scripts/build-and-publish-lib.sh +205 -0
  114. package/engine/scripts/check-lib-publish.sh +85 -0
  115. package/engine/scripts/debug-container.sh +258 -0
  116. package/engine/scripts/generate-manifest.sh +197 -0
  117. package/engine/spec.master +702 -0
  118. package/engine/spec.master.example +341 -0
  119. package/engine/topologies/README.md +34 -0
  120. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  121. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  122. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  123. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  124. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  125. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  126. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  127. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  128. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  129. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  130. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  131. package/engine/topologies/platform/docker/constants.star +170 -0
  132. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  133. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  134. package/engine/topologies/platform/docker/index.star +27 -0
  135. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  136. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  137. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  138. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  139. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  140. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  141. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  142. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  143. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  144. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  145. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  146. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  147. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  148. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  149. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  150. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  151. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  152. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  153. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  154. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  155. package/engine/topologies/platform/net/proxy.star +4 -0
  156. package/engine/topologies/platform/registries/local.star +4 -0
  157. package/engine/topologies/platform/security/secrets.star +239 -0
  158. package/engine/topologies/platform/state/relational.star +4 -0
  159. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  160. package/engine/topologies/tilt/common/utils.star +364 -0
  161. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  162. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  163. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  164. package/engine/topologies/tilt/common/utils_env.star +43 -0
  165. package/engine/topologies/tilt/common/utils_output.star +97 -0
  166. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  167. package/engine/topologies/tilt/config/defaults.star +3 -0
  168. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  169. package/engine/topologies/tilt/config/global.star +55 -0
  170. package/engine/topologies/tilt/config/profiles.star +382 -0
  171. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  172. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  173. package/engine/topologies/tilt/generators/index.star +124 -0
  174. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  175. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  176. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  177. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  178. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  179. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  180. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  181. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  182. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  183. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  184. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  185. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  186. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  187. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  188. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  189. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  190. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  191. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  192. package/engine/topologies/tilt/generators/validators.star +853 -0
  193. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  194. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  195. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  196. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  197. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  198. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  199. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  200. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  201. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  202. package/engine/topologies/tilt/manifest/README.md +693 -0
  203. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  204. package/engine/topologies/tilt/manifest/constants.star +252 -0
  205. package/engine/topologies/tilt/manifest/errors.star +266 -0
  206. package/engine/topologies/tilt/manifest/integration.star +339 -0
  207. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  208. package/engine/topologies/tilt/manifest/loader.star +214 -0
  209. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  210. package/engine/topologies/tilt/manifest/parser.star +400 -0
  211. package/engine/topologies/tilt/manifest/schema.star +462 -0
  212. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  213. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  214. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  215. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  216. package/engine/topologies/tilt/manifest/validator.star +717 -0
  217. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  218. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  219. package/engine/topologies/tilt/resources/conditions.star +3 -0
  220. package/engine/topologies/tilt/resources/databases.star +244 -0
  221. package/engine/topologies/tilt/resources/declaration.star +3 -0
  222. package/engine/topologies/tilt/resources/deps.star +3 -0
  223. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  224. package/engine/topologies/tilt/resources/libs.star +30 -0
  225. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  226. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  227. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  228. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  229. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  230. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  231. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  232. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  236. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  237. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  238. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  239. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  243. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  244. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  245. package/engine/topologies/tilt/resources/ordering.star +3 -0
  246. package/engine/topologies/tilt/resources/triggers.star +3 -0
  247. package/engine/topologies/tilt/resources/watchers.star +299 -0
  248. package/engine/where-things-live.star +717 -0
  249. package/ext/Tiltfile +66 -0
  250. package/ext/ide-components/README.md +219 -0
  251. package/ext/ide-components/code_executor/server.py +268 -0
  252. package/ext/ide-components/code_viewer/server.py +206 -0
  253. package/ext/ide-components/config_inspector/server.py +1050 -0
  254. package/ext/ide-components/file_browser/server.py +285 -0
  255. package/ext/ide-components/shared/config_service.py +469 -0
  256. package/ext/ide-components/shared/file_utils.py +298 -0
  257. package/ext/ide-components/shared/http_utils.py +232 -0
  258. package/ext/ide-components/shared/static/styles.css +1334 -0
  259. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  260. package/ext/ide-components/shared/template_engine.py +123 -0
  261. package/ext/ide-components/shared/templates/base.html +121 -0
  262. package/ext/ide-components/shared/test_config_service.py +326 -0
  263. package/ext/ide-components/shared/tilt_integration.py +158 -0
  264. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  265. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  266. package/ext/ui-enhancements/extension.yaml +36 -0
  267. package/ext/ui-enhancements/tiltfile.py +99 -0
  268. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  269. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  270. package/ext/ui-enhancements/ui/icons.css +125 -0
  271. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  272. package/package.json +13 -9
  273. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  274. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,437 @@
1
+ # =============================================================================
2
+ # 🏗️ TILT SDK - INFRASTRUCTURE LOADER
3
+ # =============================================================================
4
+ # Path: .tilt/provisioner/infra-loader.star
5
+ # Purpose: Load and configure infrastructure services
6
+ # =============================================================================
7
+ #
8
+ # This module centralizes infrastructure loading:
9
+ # - Database (PostgreSQL, Redis)
10
+ # - Messaging (NATS, Kafka)
11
+ # - Secrets (Infisical)
12
+ # - Registry (Verdaccio)
13
+ # - Proxy (Traefik)
14
+ # - Monitoring (SigNoz, ELK)
15
+ # - CDC (Debezium)
16
+ #
17
+ # Usage:
18
+ # Infra.load_all(should_enable_fn)
19
+ # =============================================================================
20
+
21
+ load("../../platform/docker/constants.star", "PlatformDockerConstants")
22
+ load("../../platform/docker/compose/traefik_standalone.star", "generate_standalone_traefik_compose")
23
+
24
+ # =============================================================================
25
+ # 🗃️ DATABASE MANAGEMENT
26
+ # =============================================================================
27
+
28
+ def _file_exists(path):
29
+ """Check if a file exists."""
30
+ result = str(local("test -f '{path}' && echo 'yes' || echo 'no'".format(path=path), quiet=True, echo_off=True)).strip()
31
+ return result == 'yes'
32
+
33
+
34
+ def _docker_compose(compose_paths, env_file):
35
+ """docker_compose() wrapper: Tilt's builtin rejects env_file=None outright
36
+ (it type-checks the kwarg as path|string, not Optional), so the keyword must be
37
+ omitted entirely rather than passed as None when no .env file exists."""
38
+ if env_file:
39
+ docker_compose(compose_paths, env_file=env_file)
40
+ else:
41
+ docker_compose(compose_paths)
42
+
43
+
44
+ def _generate_database_management_compose():
45
+ """Generate the stack-feature compose for local PostgreSQL."""
46
+ name = PlatformDockerConstants.PROJECT_NAME
47
+ database_network = PlatformDockerConstants.NETWORK_DATABASE
48
+ return """###############################################################################
49
+ # SYSTEM-GENERATED - DO NOT EDIT
50
+ # Stack feature: database-management
51
+ # Source: .tdk/project.json stacks.*.services includes "database-management"
52
+ ###############################################################################
53
+
54
+ services:
55
+ postgres:
56
+ image: postgres:16-alpine
57
+ container_name: {name}_postgres
58
+ restart: unless-stopped
59
+ environment:
60
+ POSTGRES_USER: {name}
61
+ POSTGRES_PASSWORD: ${{DB_PASSWORD}}
62
+ POSTGRES_DB: postgres
63
+ ports:
64
+ - "5432:5432"
65
+ volumes:
66
+ - {name}_postgres_data:/var/lib/postgresql/data
67
+ networks:
68
+ - database
69
+ healthcheck:
70
+ test: ["CMD-SHELL", "pg_isready -U {name} -d postgres"]
71
+ interval: 5s
72
+ timeout: 5s
73
+ retries: 20
74
+
75
+ networks:
76
+ database:
77
+ name: {database_network}
78
+ external: true
79
+
80
+ volumes:
81
+ {name}_postgres_data:
82
+ """.format(name=name, database_network=database_network)
83
+
84
+
85
+ def _ensure_database_management_compose(root_prefix, write_fn):
86
+ """Ensure the database-management stack feature has its compose file."""
87
+ compose_rel = "services/platform/database-management/docker-compose.yml"
88
+ compose_file = root_prefix + compose_rel if root_prefix else compose_rel
89
+ if _file_exists(compose_file):
90
+ return compose_file
91
+ if write_fn:
92
+ write_fn(compose_rel, _generate_database_management_compose())
93
+ return compose_file
94
+
95
+ def _load_database_management(should_enable, root_prefix="", env_file=None, write_fn=None):
96
+ """Load database and messaging infrastructure."""
97
+ if not should_enable('database-management'):
98
+ print("DEBUG INFRA: database-management not enabled")
99
+ return
100
+
101
+ print("🗃️ Loading database management services...")
102
+
103
+ # Load postgres from the database-management stack feature compose.
104
+ postgres_compose = _ensure_database_management_compose(root_prefix, write_fn)
105
+ if _file_exists(postgres_compose):
106
+ print("DEBUG INFRA: Loading postgres compose from {}".format(postgres_compose))
107
+ _docker_compose(postgres_compose, env_file)
108
+ dc_resource('postgres', labels=['infra.tools'], resource_deps=['init-networks'], auto_init=True)
109
+ else:
110
+ print("DEBUG INFRA: Skipping postgres (compose file not found)")
111
+
112
+ # Load messaging if compose file exists
113
+ messaging_compose = root_prefix + 'services/platform/messaging/docker-compose.yml'
114
+ if _file_exists(messaging_compose):
115
+ print("DEBUG INFRA: Loading messaging compose from {}".format(messaging_compose))
116
+ _docker_compose(messaging_compose, env_file)
117
+ dc_resource('redis', labels=['infra.messaging'], auto_init=False)
118
+ dc_resource('nats', labels=['infra.messaging'], auto_init=True)
119
+ else:
120
+ print("DEBUG INFRA: Skipping messaging (compose file not found)")
121
+
122
+ # Only create kafka resources if debezium is enabled AND messaging exists
123
+ cdc_enabled = should_enable('debezium')
124
+ if cdc_enabled and _file_exists(messaging_compose):
125
+ dc_resource('kafka', labels=['cdc'], resource_deps=['zookeeper'], auto_init=True)
126
+ dc_resource('zookeeper', labels=['cdc'], auto_init=True)
127
+
128
+
129
+ # =============================================================================
130
+ # 📦 VERDACCIO (NPM Registry)
131
+ # =============================================================================
132
+
133
+ def _load_verdaccio(should_enable, root_prefix="", env_file=None):
134
+ """Load Verdaccio private npm registry."""
135
+ if not should_enable(PlatformDockerConstants.VERDACCIO_RESOURCE_NAME):
136
+ print("DEBUG INFRA: Verdaccio not enabled")
137
+ return
138
+
139
+ # Use absolute path for docker-compose to ensure correct working directory
140
+ if root_prefix:
141
+ compose_file = root_prefix + 'docker-compose.verdaccio.yml'
142
+ else:
143
+ # Use project root from environment or relative path
144
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '.')
145
+ compose_file = project_root + '/docker-compose.verdaccio.yml'
146
+ if not _file_exists(compose_file):
147
+ print("DEBUG INFRA: Skipping Verdaccio (compose file not found)")
148
+ return
149
+ print("DEBUG INFRA: Loading Verdaccio from {} with env_file={}".format(compose_file, env_file))
150
+ _docker_compose(compose_file, env_file)
151
+ print("DEBUG INFRA: Calling dc_resource for verdaccio")
152
+ dc_resource(PlatformDockerConstants.VERDACCIO_RESOURCE_NAME, labels=['infra.tools', 'registry'], resource_deps=['init-networks'], auto_init=True)
153
+ print("DEBUG INFRA: dc_resource for verdaccio completed")
154
+ local_resource(PlatformDockerConstants.VERDACCIO_CONNECT_NETWORK_RESOURCE,
155
+ cmd='docker network connect ' + PlatformDockerConstants.NETWORK_BACKEND + ' ' + PlatformDockerConstants.VERDACCIO_CONTAINER_NAME + ' 2>/dev/null || true',
156
+ labels=['infra.tools', 'registry'],
157
+ resource_deps=[PlatformDockerConstants.VERDACCIO_RESOURCE_NAME, 'init-networks'],
158
+ auto_init=True
159
+ )
160
+
161
+
162
+ # =============================================================================
163
+ # 🔐 INFISICAL (Secrets Management)
164
+ # =============================================================================
165
+
166
+ def _load_infisical(should_enable, root_prefix="", env_file=None):
167
+ """Load Infisical secrets management."""
168
+ if not should_enable('infisical'):
169
+ return
170
+
171
+ compose_file = root_prefix + 'docker-compose.infisical.yml'
172
+ if not _file_exists(compose_file):
173
+ print("DEBUG INFRA: Skipping Infisical (compose file not found)")
174
+ return
175
+
176
+ print("🔐 Loading Infisical...")
177
+ _docker_compose(compose_file, env_file)
178
+ dc_resource('infisical-db', labels=['infra.tools', 'secrets'], resource_deps=['init-networks'], auto_init=True)
179
+ dc_resource('infisical-redis', labels=['infra.tools', 'secrets'], resource_deps=['init-networks'], auto_init=True)
180
+ dc_resource('infisical', labels=['infra.tools', 'secrets'], resource_deps=['init-networks', 'infisical-db', 'infisical-redis'], auto_init=True)
181
+
182
+
183
+ # =============================================================================
184
+ # 🌐 PROXY (Traefik)
185
+ # =============================================================================
186
+
187
+ def _load_standalone_traefik(root_prefix, env_file, write_fn):
188
+ """Generate and load a self-contained Traefik compose for standalone projects."""
189
+ compose_rel = ".tdk/.tdk-out/docker-compose.traefik.yml"
190
+ content = generate_standalone_traefik_compose()
191
+ if write_fn:
192
+ write_fn(compose_rel, content)
193
+ compose_file = root_prefix + compose_rel if root_prefix else compose_rel
194
+ print("🌐 Loading standalone Traefik from {}".format(compose_file))
195
+ _docker_compose(compose_file, env_file)
196
+ dc_resource(
197
+ "traefik",
198
+ labels=["infra.tools"],
199
+ resource_deps=["init-networks"],
200
+ auto_init=True,
201
+ )
202
+
203
+
204
+ def _load_proxy(should_enable, root_prefix="", env_file=None, write_fn=None):
205
+ """Load Traefik reverse proxy with proper health check sequencing."""
206
+ if not should_enable('proxy'):
207
+ print("DEBUG INFRA: proxy not enabled")
208
+ return
209
+
210
+ compose_files = [
211
+ root_prefix + 'shared-product-engineering/introvertic/infra/docker-compose.traefik.yml',
212
+ root_prefix + 'services/platform/proxy/docker-compose.core.yml',
213
+ root_prefix + 'services/platform/proxy/docker-compose.utilities.yml',
214
+ root_prefix + 'services/platform/proxy/docker-compose.redirects.yml',
215
+ root_prefix + 'services/platform/proxy/docker-compose.docs.yml',
216
+ ]
217
+ missing = [path for path in compose_files if not _file_exists(path)]
218
+ if missing:
219
+ print("DEBUG INFRA: Platform proxy compose missing ({}), using standalone Traefik".format(missing[0]))
220
+ _load_standalone_traefik(root_prefix, env_file, write_fn)
221
+ return
222
+
223
+ print("🌐 Loading proxy services from Introvertic Infra...")
224
+ print(" → Primary: shared-product-engineering/introvertic/infra/docker-compose.traefik.yml")
225
+ print(" → Override flags: TRAEFIK_LOG_LEVEL, TRAEFIK_ENABLE_DASHBOARD, etc.")
226
+ print(" → Traefik will wait for postgres and nats to be healthy")
227
+ print(" → Services configured with 60s startup grace period")
228
+
229
+ # Use introvertic/infra traefik configuration (primary)
230
+ # Keep legacy core.yml for network definitions during migration
231
+ _docker_compose(compose_files, env_file)
232
+
233
+ # Traefik depends on core infrastructure being healthy (not just started) to prevent 504s
234
+ dc_resource('traefik',
235
+ labels=['infra.tools'],
236
+ resource_deps=['init-networks', 'postgres', 'nats'],
237
+ auto_init=True)
238
+ dc_resource('dashy',
239
+ labels=['infra.tools'],
240
+ resource_deps=['traefik'],
241
+ auto_init=False)
242
+ dc_resource('main-redirect',
243
+ labels=['infra.tools'],
244
+ resource_deps=['traefik'],
245
+ auto_init=False)
246
+ dc_resource('traefik-pages',
247
+ labels=['infra.tools'],
248
+ resource_deps=['traefik'],
249
+ auto_init=False)
250
+ dc_resource('tilt-proxy',
251
+ labels=['infra.tools'],
252
+ resource_deps=['traefik'],
253
+ auto_init=False)
254
+
255
+
256
+ # =============================================================================
257
+ # 📊 MONITORING (SigNoz, SkyWalking)
258
+ # =============================================================================
259
+
260
+ def _load_monitoring(should_enable, root_prefix="", env_file=None):
261
+ """Load monitoring and observability stack."""
262
+ if not should_enable('monitoring'):
263
+ return
264
+
265
+ print("📊 Loading monitoring services...")
266
+ _docker_compose(root_prefix + 'services/platform/monitoring/docker-compose.yml', env_file)
267
+ for svc in ['signoz-frontend', 'signoz-otel-collector', 'signoz-query-service']:
268
+ dc_resource(svc, labels=['observability.apm'], auto_init=True)
269
+ dc_resource('clickhouse', labels=['observability.storage'], auto_init=True)
270
+ dc_resource('elasticsearch', labels=['observability.storage'], auto_init=True)
271
+ dc_resource('skywalking-oap', labels=['observability.apm'], resource_deps=['elasticsearch'], auto_init=True)
272
+ dc_resource('skywalking-ui', labels=['observability.apm'], resource_deps=['skywalking-oap'], auto_init=True)
273
+
274
+
275
+ # =============================================================================
276
+ # 🔄 DEBEZIUM (CDC)
277
+ # =============================================================================
278
+
279
+ def _load_debezium(should_enable, root_prefix="", env_file=None):
280
+ """Load Debezium Change Data Capture."""
281
+ if not should_enable('debezium'):
282
+ return
283
+
284
+ print("🔄 Loading Enhanced Debezium...")
285
+ _docker_compose(root_prefix + 'services/platform/cdc/docker-compose.enhanced.yml', env_file)
286
+ dc_resource('nats-http-bridge', labels=['cdc'], resource_deps=['nats'], auto_init=True)
287
+ dc_resource('debezium-connect', labels=['cdc'], resource_deps=['kafka', 'postgres', 'nats-http-bridge'], auto_init=True)
288
+ dc_resource('enhanced-connector-setup', labels=['cdc'], resource_deps=['debezium-connect', 'postgres', 'nats-http-bridge'], auto_init=False)
289
+
290
+
291
+ # =============================================================================
292
+ # 📊 ELK STACK
293
+ # =============================================================================
294
+
295
+ def _load_elk(should_enable, root_prefix="", env_file=None):
296
+ """Load ELK logging stack."""
297
+ if not should_enable('elk'):
298
+ return
299
+
300
+ print("📊 Loading ELK stack...")
301
+ _docker_compose(root_prefix + 'docker/elk-compose.yml', env_file)
302
+ dc_resource('elasticsearch', labels=['observability.elk'], auto_init=True)
303
+ dc_resource('logstash', labels=['observability.elk', 'processor', 'logs'], resource_deps=['elasticsearch'], auto_init=True)
304
+ dc_resource('kibana', labels=['observability.elk', 'frontend', 'dashboard'], resource_deps=['elasticsearch'], auto_init=True)
305
+
306
+
307
+ # =============================================================================
308
+ # 🌐 NETWORK INITIALIZATION
309
+ # =============================================================================
310
+
311
+ def _init_networks(fix_docker_networks_fn):
312
+ """Initialize Docker networks."""
313
+ local_resource('init-networks',
314
+ cmd=fix_docker_networks_fn(),
315
+ labels=['infra.setup'],
316
+ auto_init=True,
317
+ resource_deps=[]
318
+ )
319
+
320
+
321
+ # =============================================================================
322
+ # 🏗️ GOLDEN IMAGE (Base Docker Image)
323
+ # =============================================================================
324
+
325
+ def _load_golden_image(should_enable, docker_provider, project_root='.'):
326
+ """Build the golden base image for faster service builds.
327
+
328
+ project_root must be passed through here the same way every other
329
+ infra loader below receives it (as root_prefix) - local_resource cmds
330
+ run relative to the Tiltfile's own directory (.tdk/.tdk-out/), not
331
+ the project root, so an unprefixed project-root-relative path like
332
+ GOLDEN_DOCKERFILE resolves to the wrong file otherwise.
333
+ """
334
+ if not should_enable('golden-image'):
335
+ return None
336
+
337
+ print("🏗️ Building golden base image...")
338
+ return docker_provider.golden_image.build(project_root=project_root)
339
+
340
+
341
+ def _generate_golden_dockerfile(should_enable, docker_provider, write_fn):
342
+ """Generate the golden-layers.Dockerfile if it doesn't exist.
343
+
344
+ Args:
345
+ should_enable: Function that takes service name and returns bool
346
+ docker_provider: Docker provider struct with golden_image
347
+ write_fn: File writing function for output
348
+ """
349
+ if not should_enable('golden-image'):
350
+ return
351
+
352
+ dockerfile_path = '.tdk/.tdk-out/golden-layers.Dockerfile'
353
+ content = docker_provider.golden_image.generate_dockerfile()
354
+ write_fn(dockerfile_path, content)
355
+
356
+
357
+ # =============================================================================
358
+ # 🎯 MAIN LOADER
359
+ # =============================================================================
360
+
361
+ def load_all_infrastructure(should_enable, fix_docker_networks_fn=None, docker_provider=None, write_fn=None, project_root=None, env_file=None):
362
+ """
363
+ Load all infrastructure services based on configuration.
364
+
365
+ Args:
366
+ should_enable: Function that takes service name and returns bool
367
+ fix_docker_networks_fn: Function to fix Docker networks (optional)
368
+ docker_provider: Docker provider struct (optional, for golden image)
369
+ write_fn: File writing function (optional, for golden image)
370
+ project_root: Path to project root from TDK working directory (optional, e.g., "../../")
371
+ env_file: Path to .env file for docker-compose (optional, defaults to project_root + '.env')
372
+ """
373
+ # Initialize networks first
374
+ if fix_docker_networks_fn:
375
+ print("DEBUG INFRA: Initializing networks...")
376
+ _init_networks(fix_docker_networks_fn)
377
+ print("DEBUG INFRA: Networks initialized")
378
+ else:
379
+ print("DEBUG INFRA: SKIPPING network initialization (no fix_docker_networks_fn)")
380
+
381
+ # These stacks both define an `elasticsearch` resource (and host port 9200).
382
+ # Running both at once causes compose/resource collisions and unstable startup.
383
+ if should_enable('monitoring') and should_enable('elk'):
384
+ fail("Incompatible flags: 'monitoring' and 'elk' cannot both be enabled at the same time. Disable one of them.")
385
+
386
+ # Build golden image before other infrastructure (if enabled)
387
+ golden_image_resource = None
388
+ if docker_provider and write_fn:
389
+ _generate_golden_dockerfile(should_enable, docker_provider, write_fn)
390
+ golden_image_resource = _load_golden_image(should_enable, docker_provider, project_root=project_root or '.')
391
+
392
+ # Get project root prefix for paths (e.g., "../../" from .tdk/.tdk-out/)
393
+ # Ensure root_prefix ends with / for proper path concatenation
394
+ root_prefix = project_root if project_root else ""
395
+ if root_prefix and not root_prefix.endswith('/'):
396
+ root_prefix = root_prefix + '/'
397
+
398
+ # Load environment file for docker-compose variables
399
+ # Use provided env_file or construct default from root_prefix.
400
+ # `docker compose ... --env-file <path>` hard-fails if that path doesn't exist, and
401
+ # .env is gitignored (with no .env.example shipped) across every TDK example repo, so
402
+ # a fresh clone must fall back to no --env-file flag rather than a dangling path.
403
+ if env_file == None:
404
+ candidate_env_file = root_prefix + '.env' if root_prefix else '.env'
405
+ env_file = candidate_env_file if _file_exists(candidate_env_file) else None
406
+
407
+ # Load infrastructure in order
408
+ _load_database_management(should_enable, root_prefix, env_file, write_fn)
409
+ _load_verdaccio(should_enable, root_prefix, env_file)
410
+ _load_infisical(should_enable, root_prefix, env_file)
411
+ _load_proxy(should_enable, root_prefix, env_file, write_fn)
412
+ _load_monitoring(should_enable, root_prefix, env_file)
413
+ _load_debezium(should_enable, root_prefix, env_file)
414
+ _load_elk(should_enable, root_prefix, env_file)
415
+
416
+ return golden_image_resource
417
+
418
+
419
+ # =============================================================================
420
+ # 📦 INFRA STRUCT (Public API)
421
+ # =============================================================================
422
+
423
+ Infra = struct(
424
+ # Main loader
425
+ load_all = load_all_infrastructure,
426
+ init_networks = _init_networks,
427
+
428
+ # Individual loaders (for granular control)
429
+ load_database = _load_database_management,
430
+ load_verdaccio = _load_verdaccio,
431
+ load_infisical = _load_infisical,
432
+ load_proxy = _load_proxy,
433
+ load_monitoring = _load_monitoring,
434
+ load_debezium = _load_debezium,
435
+ load_elk = _load_elk,
436
+ load_golden_image = _load_golden_image,
437
+ )
@@ -0,0 +1,30 @@
1
+ # =============================================================================
2
+ # 📚 TILT SDK - LIBRARIES LIFECYCLE MODULE
3
+ # =============================================================================
4
+ # Purpose: Public API facade for library management modules.
5
+ # =============================================================================
6
+
7
+ load('./libs_paths.star', 'LibsPaths')
8
+ load('./libs_discovery.star', 'LibsDiscovery')
9
+ load('./libs_resource_definition.star', 'LibsResourceDefinition')
10
+ load('./libs_setup.star', 'LibsSetup')
11
+ load('./libs_tsconfig.star', 'LibsTSConfig')
12
+
13
+
14
+ Libs = struct(
15
+ # Path resolution
16
+ get_path = LibsPaths.get_path,
17
+
18
+ # Dependency discovery
19
+ discover_resource_libs = LibsDiscovery.discover_resource_libs,
20
+ discover_deps_from_json = LibsDiscovery.discover_deps_from_json,
21
+ get_resource_paths = LibsPaths.get_resource_paths,
22
+ get_deps_mapping = LibsPaths.get_deps_mapping,
23
+
24
+ # Resource definition
25
+ define_resource = LibsResourceDefinition.define_resource,
26
+ setup_all = LibsSetup.setup_all,
27
+
28
+ # TSConfig factory
29
+ make_smart_tsconfig = LibsTSConfig.make_smart_tsconfig,
30
+ )
@@ -0,0 +1,102 @@
1
+ # =============================================================================
2
+ # 🔍 TILT SDK - LIBRARY DEPENDENCY DISCOVERY
3
+ # =============================================================================
4
+
5
+ load('./libs_paths.star', 'LibsPaths')
6
+
7
+ _get_lib_path_from_package_name = LibsPaths.get_path
8
+ _read_package_json_deps = LibsPaths.read_package_json_deps
9
+
10
+
11
+ def discover_resource_libraries(ctx, resource_paths, max_depth=10):
12
+ """
13
+ Recursively discovers all internal library dependencies for given service paths.
14
+
15
+ Returns:
16
+ Dict of {package_name: {'name': str, 'path': str, 'label': str, 'tilt_resource': str}}
17
+ """
18
+ needed_libs = {}
19
+ visited = {}
20
+
21
+ queue = []
22
+ for resource_path in resource_paths:
23
+ pkg_path = resource_path + '/package.json'
24
+ queue.append((pkg_path, 0))
25
+
26
+ iteration = 0
27
+ max_iterations = 1000
28
+
29
+ while len(queue) > 0 and iteration < max_iterations:
30
+ iteration = iteration + 1
31
+
32
+ current = queue[0]
33
+ queue = queue[1:]
34
+
35
+ pkg_path = current[0]
36
+ depth = current[1]
37
+
38
+ if pkg_path in visited:
39
+ continue
40
+ visited[pkg_path] = True
41
+
42
+ if depth > max_depth:
43
+ continue
44
+
45
+ internal_deps = _read_package_json_deps(ctx, pkg_path)
46
+
47
+ for dep_name in internal_deps:
48
+ if dep_name in needed_libs:
49
+ continue
50
+
51
+ lib_info = _get_lib_path_from_package_name(ctx, dep_name)
52
+ lib_path = lib_info[0]
53
+ lib_label = lib_info[1]
54
+ tilt_resource = lib_info[2]
55
+
56
+ if lib_path == None:
57
+ continue
58
+
59
+ lib_name = lib_path.split('/')[-1]
60
+ lib_internal_deps = _read_package_json_deps(ctx, lib_path + '/package.json')
61
+
62
+ needed_libs[dep_name] = {
63
+ 'name': lib_name,
64
+ 'path': lib_path,
65
+ 'label': lib_label,
66
+ 'package_name': dep_name,
67
+ 'tilt_resource': tilt_resource,
68
+ 'internal_deps': lib_internal_deps,
69
+ }
70
+
71
+ lib_pkg_path = lib_path + '/package.json'
72
+ if lib_pkg_path not in visited:
73
+ queue.append((lib_pkg_path, depth + 1))
74
+
75
+ return needed_libs
76
+
77
+
78
+ def discover_dependencies_from_json(ctx, resource_path):
79
+ """
80
+ Discovers library dependencies for a SINGLE service from its package.json.
81
+
82
+ Returns:
83
+ List of Tilt resource names: ['lib-platform-...', ...]
84
+ """
85
+ pkg_path = resource_path + '/package.json'
86
+ internal_deps = _read_package_json_deps(ctx, pkg_path)
87
+
88
+ tilt_resources = []
89
+ for dep_name in internal_deps:
90
+ lib_info = _get_lib_path_from_package_name(ctx, dep_name)
91
+ tilt_resource = lib_info[2]
92
+
93
+ if tilt_resource != None and tilt_resource not in tilt_resources:
94
+ tilt_resources.append(tilt_resource)
95
+
96
+ return tilt_resources
97
+
98
+
99
+ LibsDiscovery = struct(
100
+ discover_resource_libs = discover_resource_libraries,
101
+ discover_deps_from_json = discover_dependencies_from_json,
102
+ )
@@ -0,0 +1,79 @@
1
+ # =============================================================================
2
+ # 📚 TILT SDK - LIBRARY PATHS & DEP MAPPINGS
3
+ # =============================================================================
4
+
5
+ load('../../../topologies/tilt/common/utils.star', 'Utils')
6
+
7
+
8
+ def get_lib_path_from_package_name(ctx, package_name):
9
+ """
10
+ Converts @tdk/platform-logger -> shared-platform-engineering/platform-logger
11
+
12
+ Returns:
13
+ Tuple of (path, label, tilt_resource_name) or (None, None, None) if not a library
14
+ """
15
+ lib_info = Utils.resolve_lib_path(package_name)
16
+ lib_path = lib_info[0]
17
+ lib_type = lib_info[1]
18
+
19
+ if not lib_path:
20
+ return (None, None, None)
21
+
22
+ lib_name = package_name[len(Utils.INTERNAL_SCOPE):]
23
+ tilt_resource = 'lib-' + lib_name
24
+
25
+ label_map = {
26
+ 'platform': 'lib.platform',
27
+ 'product': 'lib.product',
28
+ 'ddd': 'lib.ddd',
29
+ }
30
+ label = label_map.get(lib_type, 'lib.platform')
31
+
32
+ return (lib_path, label, tilt_resource)
33
+
34
+
35
+ def read_package_json_deps(ctx, package_json_path):
36
+ """Reads a package.json and returns all internal dependencies."""
37
+ resource_path = package_json_path.rsplit('/package.json', 1)[0]
38
+ return Utils.get_internal_deps(resource_path)
39
+
40
+
41
+ def get_resource_paths_for_focus(ctx, focus_enabled_all):
42
+ """Returns list of service paths based on focus mode targets."""
43
+ if focus_enabled_all == None:
44
+ return []
45
+
46
+ resource_path_map = ctx.get('resource_path_map', {})
47
+ resource_paths = []
48
+
49
+ for resource in focus_enabled_all:
50
+ if resource in resource_path_map:
51
+ path = resource_path_map[resource]
52
+ if path not in resource_paths:
53
+ resource_paths.append(path)
54
+
55
+ return resource_paths
56
+
57
+
58
+ def get_internal_deps_mapping(ctx, resource_path):
59
+ """Returns a mapping of package_name -> source_path for internal dependencies."""
60
+ pkg_path = resource_path + '/package.json'
61
+ internal_deps = read_package_json_deps(ctx, pkg_path)
62
+
63
+ mapping = {}
64
+ for dep_name in internal_deps:
65
+ lib_info = get_lib_path_from_package_name(ctx, dep_name)
66
+ lib_path = lib_info[0]
67
+
68
+ if lib_path != None:
69
+ mapping[dep_name] = lib_path
70
+
71
+ return mapping
72
+
73
+
74
+ LibsPaths = struct(
75
+ get_path = get_lib_path_from_package_name,
76
+ read_package_json_deps = read_package_json_deps,
77
+ get_resource_paths = get_resource_paths_for_focus,
78
+ get_deps_mapping = get_internal_deps_mapping,
79
+ )