@tdk-landscape/tdk-cli-core 1.3.14 → 1.3.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/Tiltfile +144 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +424 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +258 -0
- package/discovery/constants.star +127 -0
- package/discovery/deterministic.star +211 -0
- package/discovery/discovery_daemon.star +191 -0
- package/discovery/discovery_orchestrator.star +460 -0
- package/discovery/filtering.star +5 -0
- package/discovery/identity-management-backend/service.yaml +26 -0
- package/discovery/identity-management-frontend/service.yaml +29 -0
- package/discovery/identity-sdk/service.yaml +9 -0
- package/discovery/incremental_discovery.star +213 -0
- package/discovery/indexing.star +7 -0
- package/discovery/json_manifest_scanner.star +51 -0
- package/discovery/libraries.star +46 -0
- package/discovery/loading.star +23 -0
- package/discovery/manifest/constants.star +104 -0
- package/discovery/manifest/loading.star +386 -0
- package/discovery/manifest/normalize.star +281 -0
- package/discovery/manifest/validation.star +108 -0
- package/discovery/normalization.star +11 -0
- package/discovery/registry.star +544 -0
- package/discovery/resource_snapshot.py +382 -0
- package/discovery/resource_snapshot.star +143 -0
- package/discovery/schemas.star +1 -0
- package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
- package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
- package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
- package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
- package/discovery/test_resource_snapshot.py +251 -0
- package/discovery/validation.star +78 -0
- package/discovery/versioning.star +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +36 -41
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +51 -55
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +22 -24
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +1 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +62 -21
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +19 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +71 -5
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts +1 -0
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +50 -6
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -9
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/paths.js +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/project-features.d.ts.map +1 -1
- package/dist/utils/project-features.js +1 -1
- package/dist/utils/project-features.js.map +1 -1
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +2 -2
- package/dist/utils/resource-features.js.map +1 -1
- package/dist/utils/tar.js +4 -4
- package/dist/utils/tar.js.map +1 -1
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +9 -0
- package/dist/utils/validation.js.map +1 -1
- package/engine/AGENTS.md +705 -0
- package/engine/README.md +29 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +80 -0
- package/engine/assets/docker/golden-layers.Dockerfile +221 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
- package/engine/config.star +3 -0
- package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
- package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
- package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
- package/engine/docs/C4-ARCHITECTURE.md +17 -0
- package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
- package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
- package/engine/docs/README.md +284 -0
- package/engine/entrypoint.star +97 -0
- package/engine/lifecycle/orchestrator.star +260 -0
- package/engine/paths.star +717 -0
- package/engine/schemas/manifest-schema.json +301 -0
- package/engine/schemas/service-schema.json +301 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +205 -0
- package/engine/scripts/check-lib-publish.sh +85 -0
- package/engine/scripts/debug-container.sh +258 -0
- package/engine/scripts/generate-manifest.sh +197 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +34 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +167 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
- package/engine/topologies/platform/docker/compose/compose.star +636 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
- package/engine/topologies/platform/docker/config/bunignore.star +142 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
- package/engine/topologies/platform/docker/constants.star +170 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
- package/engine/topologies/platform/docker/index.star +27 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
- package/engine/topologies/platform/docker/networking/traefik.star +232 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
- package/engine/topologies/platform/net/proxy.star +4 -0
- package/engine/topologies/platform/registries/local.star +4 -0
- package/engine/topologies/platform/security/secrets.star +239 -0
- package/engine/topologies/platform/state/relational.star +4 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +364 -0
- package/engine/topologies/tilt/common/utils_debug.star +69 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
- package/engine/topologies/tilt/common/utils_env.star +43 -0
- package/engine/topologies/tilt/common/utils_output.star +97 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +3 -0
- package/engine/topologies/tilt/config/feature_flags.star +10 -0
- package/engine/topologies/tilt/config/global.star +55 -0
- package/engine/topologies/tilt/config/profiles.star +382 -0
- package/engine/topologies/tilt/generators/agents_md.star +62 -0
- package/engine/topologies/tilt/generators/api_gateway.star +145 -0
- package/engine/topologies/tilt/generators/index.star +124 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
- package/engine/topologies/tilt/generators/infisical/index.star +57 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
- package/engine/topologies/tilt/generators/npmrc.star +111 -0
- package/engine/topologies/tilt/generators/tsconfig.star +23 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
- package/engine/topologies/tilt/generators/typescript/common.star +7 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
- package/engine/topologies/tilt/generators/typescript/include.star +23 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
- package/engine/topologies/tilt/generators/validators.star +853 -0
- package/engine/topologies/tilt/generators/vite/backend.star +78 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
- package/engine/topologies/tilt/generators/vite/generators.star +43 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
- package/engine/topologies/tilt/generators/vite/library.star +65 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
- package/engine/topologies/tilt/generators/vite/templates.star +737 -0
- package/engine/topologies/tilt/generators/vite_config.star +22 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +693 -0
- package/engine/topologies/tilt/manifest/__init__.star +218 -0
- package/engine/topologies/tilt/manifest/constants.star +252 -0
- package/engine/topologies/tilt/manifest/errors.star +266 -0
- package/engine/topologies/tilt/manifest/integration.star +339 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
- package/engine/topologies/tilt/manifest/loader.star +214 -0
- package/engine/topologies/tilt/manifest/mapper.star +227 -0
- package/engine/topologies/tilt/manifest/parser.star +400 -0
- package/engine/topologies/tilt/manifest/schema.star +462 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
- package/engine/topologies/tilt/manifest/validator.star +717 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/conditions.star +3 -0
- package/engine/topologies/tilt/resources/databases.star +244 -0
- package/engine/topologies/tilt/resources/declaration.star +3 -0
- package/engine/topologies/tilt/resources/deps.star +3 -0
- package/engine/topologies/tilt/resources/infra-loader.star +437 -0
- package/engine/topologies/tilt/resources/libs.star +30 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
- package/engine/topologies/tilt/resources/libs_paths.star +79 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
- package/engine/topologies/tilt/resources/libs_setup.star +164 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
- package/engine/topologies/tilt/resources/orchestrator.star +54 -0
- package/engine/topologies/tilt/resources/ordering.star +3 -0
- package/engine/topologies/tilt/resources/triggers.star +3 -0
- package/engine/topologies/tilt/resources/watchers.star +299 -0
- package/engine/where-things-live.star +717 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +219 -0
- package/ext/ide-components/code_executor/server.py +268 -0
- package/ext/ide-components/code_viewer/server.py +206 -0
- package/ext/ide-components/config_inspector/server.py +1050 -0
- package/ext/ide-components/file_browser/server.py +285 -0
- package/ext/ide-components/shared/config_service.py +469 -0
- package/ext/ide-components/shared/file_utils.py +298 -0
- package/ext/ide-components/shared/http_utils.py +232 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +140 -0
- package/ext/ide-components/shared/template_engine.py +123 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +326 -0
- package/ext/ide-components/shared/tilt_integration.py +158 -0
- package/ext/ui-enhancements/cron-status-server.sh +49 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +99 -0
- package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
- package/ext/ui-enhancements/ui/help-panel.css +279 -0
- package/ext/ui-enhancements/ui/icons.css +125 -0
- package/ext/ui-enhancements/ui/tooltips.css +114 -0
- package/package.json +13 -9
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
- 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
|
+
)
|