@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,420 @@
1
+ # =============================================================================
2
+ # 🔐 INFISICAL SECRETS GENERATOR
3
+ # =============================================================================
4
+ # Generates secret injection configuration for services
5
+ # Replaces: Shell-based infisical-entrypoint.sh injection
6
+ # =============================================================================
7
+ #
8
+ # This module generates:
9
+ # - Environment variable mappings for secret paths
10
+ # - Docker Compose secret injection configuration
11
+ # - Kubernetes secret references (future)
12
+ # - Local development .env templates
13
+ #
14
+ # Usage:
15
+ # load("./infisical/secrets_generator.star", "SecretsGenerator")
16
+ # config = SecretsGenerator.generate_for_service("my-service", "/services/my-service")
17
+ # =============================================================================
18
+
19
+ def _get_timestamp():
20
+ """Get current timestamp string"""
21
+ return str(local("date +%Y-%m-%dT%H:%M:%S", quiet=True)).strip()
22
+
23
+ # =============================================================================
24
+ # Secret Path Configuration
25
+ # =============================================================================
26
+
27
+ DEFAULT_SECRET_KEYS = [
28
+ "DATABASE_URL",
29
+ "JWT_SECRET",
30
+ "RESOURCE_API_KEY",
31
+ "REDIS_URL",
32
+ "NATS_URL",
33
+ "STRIPE_SECRET_KEY",
34
+ "STRIPE_WEBHOOK_SECRET",
35
+ "API_GATEWAY_TOKEN",
36
+ ]
37
+
38
+ # Required secrets for each service type
39
+ RESOURCE_TYPE_SECRETS = {
40
+ "backend": [
41
+ "DATABASE_URL",
42
+ "JWT_SECRET",
43
+ "RESOURCE_API_KEY",
44
+ ],
45
+ "frontend": [
46
+ "API_GATEWAY_TOKEN",
47
+ ],
48
+ "api-gateway": [
49
+ "JWT_SECRET",
50
+ "RESOURCE_API_KEY",
51
+ ],
52
+ "payment": [
53
+ "DATABASE_URL",
54
+ "JWT_SECRET",
55
+ "RESOURCE_API_KEY",
56
+ "STRIPE_SECRET_KEY",
57
+ "STRIPE_WEBHOOK_SECRET",
58
+ ],
59
+ "notification": [
60
+ "DATABASE_URL",
61
+ "JWT_SECRET",
62
+ "RESOURCE_API_KEY",
63
+ "SMTP_PASSWORD",
64
+ "SENDGRID_API_KEY",
65
+ ],
66
+ }
67
+
68
+ # =============================================================================
69
+ # Secret Injection Patterns
70
+ # =============================================================================
71
+
72
+ def _generate_docker_compose_env(resource_name, secret_path, additional_vars=None):
73
+ """
74
+ Generate Docker Compose environment section for secret injection.
75
+
76
+ Args:
77
+ resource_name: Name of the service
78
+ secret_path: Infisical path (e.g., /services/my-service)
79
+ additional_vars: Additional environment variables dict
80
+
81
+ Returns:
82
+ Dictionary for docker-compose environment section
83
+ """
84
+ env = {
85
+ # Core Infisical configuration
86
+ "RESOURCE_NAME": resource_name,
87
+ "INFISICAL_SECRET_PATH": secret_path,
88
+
89
+ # Token injection (from host env or Infisical)
90
+ "INFISICAL_TOKEN": "${INFISICAL_TOKEN:-}",
91
+ "INFISICAL_CLIENT_ID": "${INFISICAL_CLIENT_ID:-}",
92
+ "INFISICAL_CLIENT_SECRET": "${INFISICAL_CLIENT_SECRET:-}",
93
+
94
+ # API configuration
95
+ "INFISICAL_API_URL": "${INFISICAL_API_URL:-http://infisical:8080}",
96
+ "INFISICAL_PROJECT_ID": "${INFISICAL_PROJECT_ID:-}",
97
+ "INFISICAL_ENVIRONMENT": "${INFISICAL_ENVIRONMENT:-dev}",
98
+
99
+ # Fallback policy: this generator only feeds local Tilt/docker-compose dev
100
+ # environments (see topologies/platform/docker/compose/compose.star). There's
101
+ # rarely a real Infisical server running locally, so default to allowing the
102
+ # entrypoint to fall back to the plain env vars already in the compose file
103
+ # instead of failing to start. Production/CI paths (Kubernetes secrets, etc.)
104
+ # are generated separately and are unaffected by this default.
105
+ "INFISICAL_ALLOW_FALLBACK": "${INFISICAL_ALLOW_FALLBACK:-true}",
106
+ }
107
+
108
+ if additional_vars:
109
+ env.update(additional_vars)
110
+
111
+ return env
112
+
113
+ def _generate_entrypoint_env(resource_name, secret_path, command):
114
+ """
115
+ Generate environment for entrypoint.sh-based secret injection.
116
+
117
+ This is the zero-code pattern - entrypoint handles all secret fetching.
118
+
119
+ Args:
120
+ resource_name: Name of the service
121
+ secret_path: Infisical path
122
+ command: Command to run after secret injection
123
+
124
+ Returns:
125
+ Dict with entrypoint configuration
126
+ """
127
+ return {
128
+ "RESOURCE_NAME": resource_name,
129
+ "INFISICAL_SECRET_PATH": secret_path,
130
+ "INFISICAL_TOKEN": "${INFISICAL_TOKEN:-}",
131
+ "INFISICAL_CLIENT_ID": "${INFISICAL_CLIENT_ID:-}",
132
+ "INFISICAL_CLIENT_SECRET": "${INFISICAL_CLIENT_SECRET:-}",
133
+ "INFISICAL_API_URL": "${INFISICAL_API_URL:-http://infisical:8080}",
134
+ "INFISICAL_PROJECT_ID": "${INFISICAL_PROJECT_ID:-}",
135
+ "INFISICAL_ENVIRONMENT": "${INFISICAL_ENVIRONMENT:-dev}",
136
+ "ENTRYPOINT_COMMAND": command,
137
+ "INFISICAL_ALLOW_FALLBACK": "false",
138
+ }
139
+
140
+ def _generate_kubernetes_secret_ref(resource_name, secret_path):
141
+ """
142
+ Generate Kubernetes secret reference configuration.
143
+
144
+ Args:
145
+ resource_name: Name of the service
146
+ secret_path: Infisical path
147
+
148
+ Returns:
149
+ Dict with Kubernetes secret configuration
150
+ """
151
+ return {
152
+ "apiVersion": "v1",
153
+ "kind": "Secret",
154
+ "metadata": {
155
+ "name": "{}-secrets".format(resource_name),
156
+ "annotations": {
157
+ "infisical.path": secret_path,
158
+ "infisical.operator.kubernetes.io/auto-reload": "true",
159
+ },
160
+ },
161
+ "type": "Opaque",
162
+ }
163
+
164
+ # =============================================================================
165
+ # Local Development Configuration
166
+ # =============================================================================
167
+
168
+ def _generate_local_env_template(resource_name, secret_path, resource_type="backend"):
169
+ """
170
+ Generate .env file template for local development.
171
+
172
+ Args:
173
+ resource_name: Name of the service
174
+ secret_path: Infisical path
175
+ resource_type: Type of service for determining required secrets
176
+
177
+ Returns:
178
+ String content for .env file
179
+ """
180
+ required_secrets = RESOURCE_TYPE_SECRETS.get(resource_type, RESOURCE_TYPE_SECRETS["backend"])
181
+ timestamp = _get_timestamp()
182
+
183
+ lines = [
184
+ "# Infisical Local Development Configuration",
185
+ "# Service: {}".format(resource_name),
186
+ "# Path: {}".format(secret_path),
187
+ "# Generated: {}".format(timestamp),
188
+ "#",
189
+ "# ⚠️ SECURITY WARNING: Do not commit this file to Git!",
190
+ "# This file should be in .gitignore",
191
+ "",
192
+ "# Infisical Connection",
193
+ "INFISICAL_API_URL=http://localhost:8089",
194
+ "INFISICAL_ENVIRONMENT=dev",
195
+ "INFISICAL_SECRET_PATH={}".format(secret_path),
196
+ "RESOURCE_NAME={}".format(resource_name),
197
+ "",
198
+ "# Authentication (Machine Identity)",
199
+ "# Get these from Infisical Dashboard > Identities > machine1",
200
+ "INFISICAL_CLIENT_ID=your-client-id-here",
201
+ "INFISICAL_CLIENT_SECRET=your-client-secret-here",
202
+ "INFISICAL_PROJECT_ID=your-project-id-here",
203
+ "",
204
+ "# Required Secrets (to be fetched from Infisical):",
205
+ ]
206
+
207
+ for secret in required_secrets:
208
+ lines.append("# {}=__will_be_fetched_from_infisical__".format(secret))
209
+
210
+ lines.extend([
211
+ "",
212
+ "# Tilt Integration (optional)",
213
+ "# These are injected by Tilt during local development",
214
+ "TILT_ENV=local",
215
+ "TILT_HOST=localhost",
216
+ ])
217
+
218
+ return "\n".join(lines)
219
+
220
+ # =============================================================================
221
+ # Validation
222
+ # =============================================================================
223
+
224
+ def _validate_secret_path(secret_path):
225
+ """
226
+ Validate Infisical secret path format.
227
+
228
+ Args:
229
+ secret_path: Path to validate
230
+
231
+ Returns:
232
+ Tuple (is_valid, error_message)
233
+ """
234
+ if not secret_path:
235
+ return False, "Secret path cannot be empty"
236
+
237
+ if not secret_path.startswith("/"):
238
+ return False, "Secret path must start with /"
239
+
240
+ # Valid characters: alphanumeric, hyphen, underscore, forward slash
241
+ valid_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/"
242
+ invalid = []
243
+ for i in range(len(secret_path)):
244
+ c = secret_path[i]
245
+ if c not in valid_chars:
246
+ invalid.append(c)
247
+ if len(invalid) > 0:
248
+ return False, "Invalid characters in path: {}".format(invalid)
249
+
250
+ # Path depth limit (Infisical limitation)
251
+ parts = []
252
+ for x in secret_path.split("/"):
253
+ if x:
254
+ parts.append(x)
255
+ depth = len(parts)
256
+ if depth > 20:
257
+ return False, "Path depth exceeds maximum (20)"
258
+
259
+ return True, ""
260
+
261
+ def _validate_resource_name(resource_name):
262
+ """
263
+ Validate service name format.
264
+
265
+ Args:
266
+ resource_name: Name to validate
267
+
268
+ Returns:
269
+ Tuple (is_valid, error_message)
270
+ """
271
+ if not resource_name:
272
+ return False, "Service name cannot be empty"
273
+
274
+ # Valid characters: alphanumeric, hyphen, underscore
275
+ valid_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
276
+ invalid = []
277
+ for i in range(len(resource_name)):
278
+ c = resource_name[i]
279
+ if c not in valid_chars:
280
+ invalid.append(c)
281
+ if len(invalid) > 0:
282
+ return False, "Invalid characters in service name: {}".format(invalid)
283
+
284
+ if len(resource_name) > 64:
285
+ return False, "Service name too long (max 64 characters)"
286
+
287
+ return True, ""
288
+
289
+ # =============================================================================
290
+ # Main Generator Functions
291
+ # =============================================================================
292
+
293
+ def generate_for_service(resource_name, secret_path, resource_type="backend", command=None, additional_vars=None):
294
+ """
295
+ Generate complete secret injection configuration for a service.
296
+
297
+ This is the main entry point for secret generation.
298
+
299
+ Args:
300
+ resource_name: Name of the service (e.g., "user-management-backend")
301
+ secret_path: Infisical path (e.g., "/services/user")
302
+ resource_type: Type of service (backend, frontend, api-gateway, payment, notification)
303
+ command: Command to run after secret injection (for entrypoint pattern)
304
+ additional_vars: Additional environment variables
305
+
306
+ Returns:
307
+ Dict with all secret configurations:
308
+ {
309
+ "resource_name": str,
310
+ "secret_path": str,
311
+ "resource_type": str,
312
+ "validation": {"valid": bool, "errors": [str]},
313
+ "docker_compose": {"environment": dict},
314
+ "entrypoint": {"environment": dict},
315
+ "kubernetes": {"secret_ref": dict},
316
+ "local_template": str,
317
+ "required_secrets": [str],
318
+ }
319
+ """
320
+ # Validate inputs
321
+ path_valid, path_error = _validate_secret_path(secret_path)
322
+ name_valid, name_error = _validate_resource_name(resource_name)
323
+
324
+ errors = []
325
+ if not path_valid:
326
+ errors.append(path_error)
327
+ if not name_valid:
328
+ errors.append(name_error)
329
+
330
+ validation = {
331
+ "valid": path_valid and name_valid,
332
+ "errors": errors,
333
+ }
334
+
335
+ # Generate configurations
336
+ docker_compose_env = _generate_docker_compose_env(resource_name, secret_path, additional_vars)
337
+
338
+ entrypoint_env = None
339
+ if command:
340
+ entrypoint_env = _generate_entrypoint_env(resource_name, secret_path, command)
341
+
342
+ k8s_secret = _generate_kubernetes_secret_ref(resource_name, secret_path)
343
+ local_template = _generate_local_env_template(resource_name, secret_path, resource_type)
344
+ required_secrets = RESOURCE_TYPE_SECRETS.get(resource_type, RESOURCE_TYPE_SECRETS["backend"])
345
+
346
+ return {
347
+ "resource_name": resource_name,
348
+ "secret_path": secret_path,
349
+ "resource_type": resource_type,
350
+ "validation": validation,
351
+ "docker_compose": {
352
+ "environment": docker_compose_env,
353
+ },
354
+ "entrypoint": {
355
+ "environment": entrypoint_env,
356
+ } if entrypoint_env else None,
357
+ "kubernetes": {
358
+ "secret_ref": k8s_secret,
359
+ },
360
+ "local_template": local_template,
361
+ "required_secrets": required_secrets,
362
+ }
363
+
364
+ def generate_for_services_batch(services_config):
365
+ """
366
+ Generate secret configurations for multiple services.
367
+
368
+ Args:
369
+ services_config: List of dicts with keys:
370
+ - name: Service name
371
+ - path: Infisical path
372
+ - type: Service type (optional, default "backend")
373
+ - command: Entrypoint command (optional)
374
+ - additional_vars: Additional env vars (optional)
375
+
376
+ Returns:
377
+ Dict mapping service names to their configurations
378
+ """
379
+ results = {}
380
+
381
+ for config in services_config:
382
+ name = config.get("name")
383
+ path = config.get("path")
384
+ svc_type = config.get("type", "backend")
385
+ command = config.get("command")
386
+ additional = config.get("additional_vars")
387
+
388
+ if not name or not path:
389
+ results[name or "unknown"] = {
390
+ "validation": {"valid": False, "errors": ["Missing name or path"]},
391
+ }
392
+ continue
393
+
394
+ results[name] = generate_for_service(name, path, svc_type, command, additional)
395
+
396
+ return results
397
+
398
+ # =============================================================================
399
+ # Public API
400
+ # =============================================================================
401
+
402
+ SecretsGenerator = struct(
403
+ # Main generator functions
404
+ generate_for_service=generate_for_service,
405
+ generate_for_services_batch=generate_for_services_batch,
406
+
407
+ # Validation
408
+ validate_secret_path=_validate_secret_path,
409
+ validate_resource_name=_validate_resource_name,
410
+
411
+ # Configuration constants
412
+ DEFAULT_SECRET_KEYS=DEFAULT_SECRET_KEYS,
413
+ RESOURCE_TYPE_SECRETS=RESOURCE_TYPE_SECRETS,
414
+
415
+ # Individual generators (for advanced use)
416
+ generate_docker_compose_env=_generate_docker_compose_env,
417
+ generate_entrypoint_env=_generate_entrypoint_env,
418
+ generate_kubernetes_secret_ref=_generate_kubernetes_secret_ref,
419
+ generate_local_env_template=_generate_local_env_template,
420
+ )
@@ -0,0 +1,143 @@
1
+ # =============================================================================
2
+ # 🌐 TILT SDK - NGINX PROVIDER
3
+ # =============================================================================
4
+ # Path: .tilt/providers/nginx.star
5
+ # Purpose: Generate nginx configs for frontend services
6
+ # =============================================================================
7
+
8
+
9
+ # === INLINED CONSTANTS for pure extension loading ===
10
+ BASE_PORT_FRONTEND = 3000
11
+ OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
12
+ # === END INLINED CONSTANTS ===
13
+
14
+
15
+ load('../../../topologies/tilt/common/utils.star', 'Utils')
16
+ load('../../../topologies/tilt/manifest/constants.star', 'GENERATED_CONFIG_FILENAMES')
17
+
18
+ # NOTE: api_gateway.star loaded by caller to avoid circular imports
19
+
20
+
21
+ def api_proxy_location(backend_name, port=BASE_PORT_FRONTEND, base_path='', stack=''):
22
+ """Return nginx location /api block that proxy_passes to the given backend (Vite-proxy style in prod)."""
23
+ return """
24
+ location /api {{
25
+ proxy_pass http://{backend}:{port};
26
+ proxy_http_version 1.1;
27
+ proxy_set_header Host $host;
28
+ proxy_set_header X-Real-IP $remote_addr;
29
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
30
+ proxy_set_header X-Forwarded-Proto $scheme;
31
+ }}""".format(backend=backend_name, port=port)
32
+
33
+
34
+ def generate_frontend_nginx(manifest, write_fn=None, referer_map_block=''):
35
+ """
36
+ Generate nginx config for frontend services.
37
+
38
+ Args:
39
+ manifest: Service manifest dict
40
+ write_fn: Function to write files
41
+ referer_map_block: Generated referer map block (from ApiGateway)
42
+
43
+ Output:
44
+ {resource_path}/.autogenerated/nginx.autogenerated.conf
45
+ """
46
+ if manifest.get('appType') != 'frontend':
47
+ return ''
48
+
49
+ resource_path = manifest.get('_resource_path', '')
50
+ app_name = manifest.get('appName', 'unknown-frontend')
51
+ backend_name = manifest.get('backendName', 'backend')
52
+ header = Utils.get_template_header(
53
+ 'nginx',
54
+ 'Nginx.frontend()',
55
+ app_name,
56
+ 'Output: .autogenerated/' + GENERATED_CONFIG_FILENAMES['nginx'],
57
+ )
58
+
59
+ base_path = manifest.get('basePath', '')
60
+ stack = manifest.get('stack', '')
61
+ port = manifest.get('port', BASE_PORT_FRONTEND)
62
+ # NOTE: referer_map_block now passed as parameter to avoid circular import
63
+
64
+ conf = """{header}
65
+ # Docker DNS resolver
66
+ resolver 127.0.0.11 valid=30s ipv6=off;
67
+
68
+ {referer_map_block}
69
+
70
+ server {{
71
+ listen 80;
72
+ server_name _;
73
+ root /usr/share/nginx/html;
74
+ index index.html;
75
+
76
+ gzip on;
77
+ gzip_vary on;
78
+ gzip_min_length 1024;
79
+ gzip_proxied any;
80
+ gzip_comp_level 6;
81
+ gzip_types
82
+ text/plain
83
+ text/css
84
+ text/xml
85
+ text/javascript
86
+ application/json
87
+ application/javascript
88
+ application/xml+rss
89
+ application/atom+xml
90
+ image/svg+xml;
91
+
92
+ location / {{
93
+ try_files $uri $uri/ /index.html;
94
+ add_header Cache-Control "no-cache, no-store, must-revalidate" always;
95
+ add_header Pragma "no-cache" always;
96
+ add_header Expires "0" always;
97
+ }}
98
+
99
+ location ~* \\.(js|css)$ {{
100
+ expires 2m;
101
+ add_header Cache-Control "public, max-age=120, must-revalidate";
102
+ add_header Last-Modified $date_gmt;
103
+ add_header ETag off;
104
+ if_modified_since off;
105
+ }}
106
+
107
+ location ~* \\.(png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {{
108
+ expires 1y;
109
+ add_header Cache-Control "public, immutable";
110
+ }}
111
+
112
+ add_header X-Frame-Options "SAMEORIGIN" always;
113
+ add_header X-Content-Type-Options "nosniff" always;
114
+ add_header X-XSS-Protection "1; mode=block" always;
115
+ add_header Referrer-Policy "strict-origin-when-cross-origin" always;
116
+
117
+ location /api {{
118
+ proxy_pass $api_backend;
119
+ proxy_http_version 1.1;
120
+ proxy_set_header Host $host;
121
+ proxy_set_header X-Real-IP $remote_addr;
122
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
123
+ proxy_set_header X-Forwarded-Proto $scheme;
124
+ proxy_set_header X-Referer $http_referer;
125
+ }}
126
+
127
+ location /health {{
128
+ access_log off;
129
+ return 200 "healthy\\n";
130
+ add_header Content-Type text/plain;
131
+ }}
132
+ }}""".format(header=header, referer_map_block=referer_map_block)
133
+
134
+ if write_fn:
135
+ write_fn(resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/' + GENERATED_CONFIG_FILENAMES['nginx'], conf)
136
+
137
+ return conf
138
+
139
+
140
+ Nginx = struct(
141
+ api_proxy_location = api_proxy_location,
142
+ frontend = generate_frontend_nginx,
143
+ )
@@ -0,0 +1,111 @@
1
+ # =============================================================================
2
+ # 📦 TILT SDK - NPM/BUN CONFIG PROVIDER
3
+ # =============================================================================
4
+ # Path: .tilt/providers/npmrc.star
5
+ # Purpose: Generate .npmrc and bunfig.toml for Verdaccio registry
6
+ # =============================================================================
7
+ #
8
+ # Generates configuration files for:
9
+ # - .npmrc / .npmrc.docker.autogenerated - NPM registry configuration
10
+ # - bunfig.toml / bunfig.docker.autogenerated.toml - Bun package manager configuration
11
+ #
12
+ # These files ensure services can install @{npm_scope}/* packages from
13
+ # the local Verdaccio registry during development.
14
+ # =============================================================================
15
+
16
+ load("../../../topologies/tilt/common/utils.star", "Utils")
17
+
18
+ # Output folder constant (consistent with other generators)
19
+ OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
20
+
21
+ # Load npm scope from project.json (or use project name as default)
22
+ # Use TDK_PROJECT_ROOT env var set by Tilt, fallback to current directory
23
+ def _load_npm_scope():
24
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
25
+ project_json_path = '.tdk/project.json'
26
+ if project_root:
27
+ project_json_path = project_root + '/' + project_json_path
28
+
29
+ if os.path.exists(project_json_path):
30
+ _project_json = read_json(project_json_path)
31
+ return _project_json.get('project', {}).get('name', 'tdk-project')
32
+ return 'tdk-project'
33
+
34
+ _NPM_SCOPE = _load_npm_scope()
35
+ load("../../../topologies/tilt/manifest/constants.star", "PACKAGE_CONFIG_FILENAMES")
36
+
37
+ # =============================================================================
38
+ # 📝 NPMRC GENERATORS
39
+ # =============================================================================
40
+
41
+ def generate_npmrc(resource_path, registry_url, is_docker, write_fn):
42
+ """
43
+ Generate .npmrc for NPM registry configuration.
44
+
45
+ Args:
46
+ resource_path: Path to service directory
47
+ registry_url: Verdaccio registry URL
48
+ is_docker: If True, generates .npmrc.docker.autogenerated, else .npmrc
49
+ write_fn: File writer function
50
+ """
51
+ registry_host = registry_url.replace("http://", "").replace("https://", "").rstrip("/")
52
+
53
+ target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
54
+ generated_filename = PACKAGE_CONFIG_FILENAMES['npmrc_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['npmrc']
55
+ header = Utils.get_template_header("npmrc", target_dir + "/" + generated_filename)
56
+ content = """{header}
57
+ registry=https://registry.npmjs.org/
58
+ @{npm_scope}:registry={registry_url}/
59
+ @tdk-landscape:registry={registry_url}/
60
+ @identity:registry={registry_url}/
61
+ //{registry_host}/:username=admin
62
+ //{registry_host}/:_password=YWRtaW4=
63
+ //{registry_host}/:email=admin@example.com
64
+ //{registry_host}/:always-auth=true""".format(header=header, registry_url=registry_url, registry_host=registry_host, npm_scope=_NPM_SCOPE)
65
+
66
+ filename = generated_filename
67
+ write_fn(target_dir + '/' + filename, content)
68
+
69
+
70
+ # =============================================================================
71
+ # 📝 BUNFIG GENERATORS
72
+ # =============================================================================
73
+
74
+ def generate_bunfig(resource_path, registry_url, is_docker, write_fn):
75
+ """
76
+ Generate bunfig.toml for Bun package manager configuration.
77
+
78
+ Args:
79
+ resource_path: Path to service directory
80
+ registry_url: Verdaccio registry URL
81
+ is_docker: If True, generates bunfig.docker.autogenerated.toml, else bunfig.toml
82
+ write_fn: File writer function
83
+ """
84
+ target_dir = resource_path + "/" + OUTPUT.AUTOGENERATED_FOLDER
85
+ generated_filename = PACKAGE_CONFIG_FILENAMES['bunfig_docker_autogenerated'] if is_docker else PACKAGE_CONFIG_FILENAMES['bunfig']
86
+ header = Utils.get_template_header("bunfig", target_dir + "/" + generated_filename)
87
+ content = """{header}
88
+ [install]
89
+ linker = "isolated"
90
+ linkWorkspacePackages = true
91
+ registry = "https://registry.npmjs.org"
92
+
93
+ [install.scopes]
94
+ "@{npm_scope}" = {{ url = "{registry_url}/" }}
95
+ "@tdk-landscape" = {{ url = "{registry_url}/" }}
96
+ "@identity" = {{ url = "{registry_url}/" }}
97
+
98
+ """.format(header=header, registry_url=registry_url, npm_scope=_NPM_SCOPE)
99
+
100
+ filename = generated_filename
101
+ write_fn(target_dir + '/' + filename, content)
102
+
103
+
104
+ # =============================================================================
105
+ # 🎯 PUBLIC API - Struct-based Exports
106
+ # =============================================================================
107
+
108
+ PackageConfig = struct(
109
+ npmrc = generate_npmrc,
110
+ bunfig = generate_bunfig,
111
+ )
@@ -0,0 +1,23 @@
1
+ # =============================================================================
2
+ # Entry point for modular TSConfig provider
3
+ # =============================================================================
4
+
5
+ load("./typescript/backend_tsconfig.star", "generate_backend_tsconfig")
6
+ load("./typescript/frontend_tsconfig.star", "generate_frontend_tsconfig")
7
+ load("./typescript/prisma_config.star", "generate_prisma_config")
8
+ load("./typescript/frontend_library_tsconfig.star", "generate_frontend_library_tsconfig")
9
+ load("./typescript/backend_library_tsconfig.star", "generate_backend_library_tsconfig")
10
+ load("./typescript/playwright_config.star", "generate_playwright_config")
11
+
12
+ # =============================================================================
13
+ # TSConfig Struct - Public API
14
+ # =============================================================================
15
+
16
+ TSConfig = struct(
17
+ backend = generate_backend_tsconfig,
18
+ frontend = generate_frontend_tsconfig,
19
+ library_backend = generate_backend_library_tsconfig,
20
+ library_frontend = generate_frontend_library_tsconfig,
21
+ prisma = generate_prisma_config,
22
+ playwright = generate_playwright_config,
23
+ )