@tdk-landscape/tdk-cli-core 1.3.15 → 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 (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,214 @@
1
+ # =============================================================================
2
+ # 📋 MANIFEST MODULE - MINIMAL LOADER
3
+ # =============================================================================
4
+ # Loads JSON manifests (developer-defined) - source of truth
5
+ # YAML is generated for Tilt resource tracking only, not for data parsing
6
+ # =============================================================================
7
+
8
+ # === INLINED CONSTANTS for pure extension loading ===
9
+ BASE_PORT_FRONTEND = 3000
10
+ BASE_PORT_BACKEND = 4000
11
+
12
+ # Inlined for pure extension loading
13
+ def get_synthesis_config():
14
+ return {}
15
+
16
+ HEALTH_CHECK_PATH = "/health"
17
+ DEFAULTS = {}
18
+
19
+ # === END INLINED CONSTANTS ===
20
+
21
+
22
+ load("./constants.star",
23
+ "MANIFEST_FILENAME",
24
+ "MANIFEST_DEFAULTS",
25
+ "VALID_APP_TYPES",
26
+ "DEFAULT_SYNCS",
27
+ )
28
+
29
+
30
+
31
+ def load_from_file(path):
32
+ """Load a manifest file.
33
+
34
+ JSON files are the source of truth (developer-defined).
35
+ YAML files are generated from JSON for Tilt resource tracking only.
36
+ """
37
+ # Prepend project root to relative paths for correct resolution
38
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
39
+ if project_root and not path.startswith('/'):
40
+ full_path = project_root + '/' + path
41
+ else:
42
+ full_path = path
43
+
44
+ content_raw = read_file(full_path, default="")
45
+ content = str(content_raw) # Convert blob to string
46
+ if not content:
47
+ return struct(manifest=None, error="File not found: " + path)
48
+
49
+ manifest = None
50
+
51
+ # JSON files: parse directly (source of truth)
52
+ if path.endswith('.json'):
53
+ manifest = decode_json(content)
54
+ if manifest == None:
55
+ return struct(manifest=None, error="Failed to parse JSON: " + path)
56
+ elif path.endswith('.yaml') or path.endswith('.yml'):
57
+ # YAML files should not be parsed for data - they are for Tilt resource tracking only
58
+ # Return error to indicate JSON should be used instead
59
+ return struct(manifest=None, error="YAML files are for Tilt resource tracking only. Use JSON for data: " + path.replace('.yaml', '.json').replace('.yml', '.json'))
60
+ else:
61
+ # Try JSON parsing
62
+ manifest = decode_json(content)
63
+
64
+ if manifest == None:
65
+ return struct(manifest=None, error="Invalid manifest: " + path)
66
+
67
+ return struct(manifest=manifest, error=None)
68
+
69
+ def _synthesize_manifest(resource_path, stack, app_type):
70
+ """
71
+ Synthesize a manifest from directory structure.
72
+
73
+ Used when no manifest file exists. Extracts configuration from:
74
+ - Stack: extracted from path (services/product/{stack}/...)
75
+ - App type: extracted from resource name suffix (-backend, -frontend, etc.)
76
+
77
+ Ports are computed from master config per appType - Traefik handles routing.
78
+ """
79
+ # Get resource name from path
80
+ path_parts = resource_path.split("/")
81
+ resource_name = path_parts[-1] if path_parts else "unknown"
82
+
83
+ # Get synthesis config from master config
84
+ synthesis_config = get_synthesis_config()
85
+
86
+ # Determine port based on app type from synthesis defaults
87
+ port_defaults = synthesis_config.get("synthesis_port_defaults", {})
88
+ port = port_defaults.get(app_type, BASE_PORT_BACKEND) # default to backend port
89
+
90
+ # Build synthesized manifest
91
+ manifest = {
92
+ "appName": resource_name,
93
+ "appType": app_type,
94
+ "stack": stack,
95
+ "port": port,
96
+ "_synthesized": True, # Mark as synthesized
97
+ "_synthesized_from": resource_path,
98
+ }
99
+
100
+ # Add backendName for frontends using master config pattern
101
+ if app_type == "frontend":
102
+ backend_pattern = synthesis_config.get("backend_name_pattern", "{stack}-management-backend")
103
+ manifest["backendName"] = backend_pattern.format(stack=stack)
104
+
105
+ return manifest
106
+
107
+ def _get_manifest_filename(resource_path):
108
+ """
109
+ Determine if manifest exists for resource path.
110
+
111
+ Returns: filename if exists, None otherwise (triggers synthesis)
112
+ """
113
+ # Prepend project root to relative paths for correct resolution
114
+ project_root = os.environ.get('TDK_PROJECT_ROOT', '')
115
+ if project_root and not resource_path.startswith('/'):
116
+ base_path = project_root + '/' + resource_path
117
+ else:
118
+ base_path = resource_path
119
+
120
+ # Check for manifest file
121
+ manifest_path = base_path + "/" + MANIFEST_FILENAME
122
+ content = read_file(manifest_path, default="")
123
+ if content:
124
+ return MANIFEST_FILENAME
125
+
126
+ # No manifest file - will trigger synthesis
127
+ return None
128
+
129
+ def load_from_path(resource_path):
130
+ """
131
+ Load manifest from resource directory with synthesis fallback.
132
+
133
+ Priority:
134
+ 1. Load service.json if it exists
135
+ 2. Synthesize from directory structure if no manifest exists
136
+
137
+ Args:
138
+ resource_path: Path to resource directory
139
+
140
+ Returns:
141
+ struct with manifest and error fields
142
+ """
143
+ # Determine if manifest exists
144
+ manifest_filename = _get_manifest_filename(resource_path)
145
+
146
+ if manifest_filename:
147
+ # Load existing manifest
148
+ json_path = resource_path + "/" + manifest_filename
149
+ result = load_from_file(json_path)
150
+
151
+ if result.error:
152
+ return result
153
+
154
+ return result
155
+ else:
156
+ # No manifest file - synthesize from directory structure
157
+ # Extract stack from path (services/product/{stack}/...)
158
+ path_parts = resource_path.split("/")
159
+ stack = "unknown"
160
+ for i, part in enumerate(path_parts):
161
+ if part == "product" and i + 1 < len(path_parts):
162
+ stack = path_parts[i + 1]
163
+ break
164
+ elif part == "platform" and i + 1 < len(path_parts):
165
+ stack = "platform"
166
+ break
167
+
168
+ # Extract app type from resource name
169
+ resource_name = path_parts[-1] if path_parts else "unknown"
170
+ app_type = "backend" # default
171
+ if resource_name.endswith("-frontend"):
172
+ app_type = "frontend"
173
+ elif resource_name.endswith("-sdk"):
174
+ app_type = "sdk"
175
+ elif resource_name.endswith("-migrator"):
176
+ app_type = "migrator"
177
+ elif resource_name.endswith("-worker"):
178
+ app_type = "worker"
179
+ elif resource_name.endswith("-library"):
180
+ app_type = "library"
181
+
182
+ # Synthesize manifest
183
+ manifest = _synthesize_manifest(resource_path, stack, app_type)
184
+
185
+ print("📝 Synthesized manifest for: " + resource_name)
186
+ print(" Stack: " + stack + ", Type: " + app_type + ", Port: " + str(manifest["port"]))
187
+
188
+ return struct(manifest=manifest, error=None)
189
+
190
+ def get_manifest_filename():
191
+ """
192
+ Get the manifest filename.
193
+
194
+ Returns:
195
+ String: "service.json"
196
+ """
197
+ return MANIFEST_FILENAME
198
+
199
+ def get_manifest_search_order():
200
+ """
201
+ Get the priority order for manifest discovery.
202
+
203
+ Returns:
204
+ List of filenames in search order (currently only service.json)
205
+ """
206
+ return [MANIFEST_FILENAME]
207
+
208
+ # Enhanced loader with synthesis support
209
+ ManifestLoader = struct(
210
+ load_from_file=load_from_file,
211
+ load_from_path=load_from_path,
212
+ get_filename=get_manifest_filename,
213
+ get_search_order=get_manifest_search_order,
214
+ )
@@ -0,0 +1,227 @@
1
+ # =============================================================================
2
+ # 📋 MANIFEST MODULE - FIELD MAPPER
3
+ # =============================================================================
4
+ # Path: .tilt/topologies/tilt/manifest/mapper.star
5
+ # Purpose: Decouple internal field names from manifest field names
6
+ #
7
+ # This is the MAGIC LAYER - change field names in manifests without changing code!
8
+ #
9
+ # Example:
10
+ # Internal code uses: manifest['port']
11
+ # YAML manifest has: spec.portNewNameOfAttr: 4002
12
+ # Mapper converts: portNewNameOfAttr → port
13
+ # =============================================================================
14
+
15
+ # ============================================================================
16
+ # FIELD NAME MAPPINGS
17
+ # ============================================================================
18
+ # KEY: Internal field name (what code expects)
19
+ # VALUE: List of possible manifest field names (tries first match)
20
+ # ============================================================================
21
+
22
+ FIELD_MAPPINGS = {
23
+ # Core application fields
24
+ 'appName': ['appName'],
25
+ 'appType': ['appType'],
26
+ 'stack': ['stack', 'stack', 'metadata.stack', 'metadata.domain', 'namespace', 'app.stack', 'app.domain'],
27
+ 'port': ['port', 'portNewNameOfAttr', 'spec.port', 'metadata.port', 'servicePort', 'app.port'],
28
+
29
+ # Runtime fields
30
+ 'runtime': ['runtime', 'engine', 'spec.runtime', 'app.runtime'],
31
+ 'replicas': ['replicas', 'instances', 'count', 'spec.replicas', 'metadata.replicas'],
32
+
33
+ # Feature flags
34
+ 'features': ['features', 'capabilities', 'spec.features', 'enabledFeatures', 'app.features'],
35
+
36
+ # Dependencies
37
+ 'dependsOn': [
38
+ 'dependsOn',
39
+ 'dependencies.internal',
40
+ 'spec.dependencies.internal',
41
+ 'requires'
42
+ ],
43
+ 'externalDependencies': [
44
+ 'externalDependencies',
45
+ 'dependencies.external',
46
+ 'spec.dependencies.external'
47
+ ],
48
+
49
+ # Environment
50
+ 'envVars': ['envVars', 'env', 'environment', 'spec.envVars', 'environmentVariables', 'app.env'],
51
+
52
+ # Database
53
+ 'databaseName': ['databaseName', 'database.name', 'dbName', 'spec.database.name', 'db'],
54
+
55
+ # Traefik/Gateway
56
+ 'traefik': ['traefik', 'gateway', 'ingress', 'spec.traefik', 'routing'],
57
+
58
+ # Docker/Build
59
+ 'dockerfile': ['dockerfile', 'docker.file', 'build.dockerfile', 'spec.build.dockerfile'],
60
+ 'buildContext': ['buildContext', 'docker.context', 'build.context', 'spec.build.context'],
61
+
62
+ # Frontend specific
63
+ 'backendName': ['backendName', 'backend', 'spec.backendName', 'proxyTo', 'app.backend'],
64
+ 'basePath': ['basePath', 'base', 'path', 'spec.basePath', 'app.basePath'],
65
+ }
66
+
67
+ # ============================================================================
68
+ # FIELD MAPPER FUNCTIONS
69
+ # ============================================================================
70
+
71
+ def get_field(manifest, internal_name, default=None):
72
+ """
73
+ Get a field value from manifest using internal field name.
74
+ Automatically handles field name mapping!
75
+
76
+ Args:
77
+ manifest: Dict (from JSON or normalized YAML)
78
+ internal_name: Internal field name (e.g., 'port', 'appName')
79
+ default: Default value if field not found
80
+
81
+ Returns:
82
+ Field value or default
83
+
84
+ Example:
85
+ # Manifest has: {portNewNameOfAttr: 4002}
86
+ # Code calls: get_field(manifest, 'port', 4000)
87
+ # Returns: 4002
88
+ """
89
+ # Get list of possible field names for this internal field
90
+ possible_names = FIELD_MAPPINGS.get(internal_name, [internal_name])
91
+
92
+ # Try each possible name
93
+ for field_name in possible_names:
94
+ value = _get_nested_field(manifest, field_name)
95
+ if value != None:
96
+ return value
97
+
98
+ return default
99
+
100
+
101
+ def _get_nested_field(manifest, field_path):
102
+ """
103
+ Get a potentially nested field value.
104
+
105
+ Supports:
106
+ - Simple field: 'port'
107
+ - Nested field: 'metadata.stack'
108
+ - Deep nested: 'spec.dependencies.internal'
109
+ """
110
+ if '.' not in field_path:
111
+ # Simple field
112
+ return manifest.get(field_path)
113
+
114
+ # Nested field - traverse path
115
+ parts = field_path.split('.')
116
+ current = manifest
117
+
118
+ for part in parts:
119
+ if type(current) == "dict" and part in current:
120
+ current = current[part]
121
+ else:
122
+ return None
123
+
124
+ return current
125
+
126
+
127
+ def set_field(manifest, internal_name, value):
128
+ """
129
+ Set a field value using internal field name.
130
+ Creates the field at the primary mapping location.
131
+
132
+ Args:
133
+ manifest: Dict to modify
134
+ internal_name: Internal field name
135
+ value: Value to set
136
+
137
+ Returns:
138
+ Modified manifest
139
+ """
140
+ possible_names = FIELD_MAPPINGS.get(internal_name, [internal_name])
141
+ primary_name = possible_names[0] # Use first mapping as primary
142
+
143
+ manifest[primary_name] = value
144
+ return manifest
145
+
146
+
147
+ def get_all_fields(manifest):
148
+ """
149
+ Extract all mapped fields from manifest.
150
+ Returns normalized dict with internal field names.
151
+
152
+ This is the MAGIC FUNCTION - pass it any manifest format
153
+ (JSON, YAML, old format, new format) and get consistent output!
154
+ """
155
+ result = {}
156
+
157
+ for internal_name in FIELD_MAPPINGS:
158
+ value = get_field(manifest, internal_name)
159
+ if value != None:
160
+ result[internal_name] = value
161
+
162
+ return result
163
+
164
+
165
+ def map_manifest(manifest, target_format='internal'):
166
+ """
167
+ Map manifest from any format to target format.
168
+
169
+ Args:
170
+ manifest: Input manifest (JSON, YAML, old, new)
171
+ target_format: 'internal' (standardized) or 'yaml' (hierarchical)
172
+
173
+ Returns:
174
+ Mapped manifest in target format
175
+ """
176
+ if target_format == 'internal':
177
+ # Map to internal standard format
178
+ return get_all_fields(manifest)
179
+
180
+ elif target_format == 'yaml':
181
+ # Map to YAML hierarchical format
182
+ internal = get_all_fields(manifest)
183
+ return _to_yaml_format(internal)
184
+
185
+ return manifest
186
+
187
+
188
+ def _to_yaml_format(internal_manifest):
189
+ """Convert internal format to YAML hierarchical format."""
190
+ return {
191
+ 'apiVersion': 'tilt.TDK Landscape.io/v1',
192
+ 'kind': 'ResourceManifest',
193
+ 'metadata': {
194
+ 'name': internal_manifest.get('appName', ''),
195
+ 'stack': internal_manifest.get('stack', ''),
196
+ },
197
+ 'spec': {
198
+ 'appType': internal_manifest.get('appType', 'backend'),
199
+ 'port': internal_manifest.get('port', 4000),
200
+ 'runtime': internal_manifest.get('runtime', 'bun'),
201
+ 'replicas': internal_manifest.get('replicas', 1),
202
+ 'features': internal_manifest.get('features', []),
203
+ 'envVars': internal_manifest.get('envVars', {}),
204
+ 'dependencies': {
205
+ 'internal': internal_manifest.get('dependsOn', []),
206
+ 'external': internal_manifest.get('externalDependencies', []),
207
+ },
208
+ 'database': {
209
+ 'name': internal_manifest.get('databaseName', ''),
210
+ } if internal_manifest.get('databaseName') else None,
211
+ 'gateway': internal_manifest.get('traefik', {}),
212
+ }
213
+ }
214
+
215
+
216
+ # ============================================================================
217
+ # PUBLIC API
218
+ # ============================================================================
219
+
220
+ ManifestMapper = struct(
221
+ get=get_field,
222
+ set=set_field,
223
+ get_all=get_all_fields,
224
+ map=map_manifest,
225
+ # Expose mappings for debugging
226
+ mappings=FIELD_MAPPINGS,
227
+ )