@flisk-sh/flisk 0.0.0-stage → 1.3.189
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/CHANGELOG.md +492 -0
- package/LICENSE +21 -0
- package/README.md +479 -2
- package/Tiltfile +151 -0
- package/cli/bin/flisk.js +42 -0
- package/cli/dist/agent-runtimes/custom.js +335 -0
- package/cli/dist/agent-runtimes/registry.js +34 -0
- package/cli/dist/backend-frameworks/elysia.js +38 -0
- package/cli/dist/backend-frameworks/express.js +49 -0
- package/cli/dist/backend-frameworks/fastify.js +43 -0
- package/cli/dist/backend-frameworks/h3.js +37 -0
- package/cli/dist/backend-frameworks/koa.js +47 -0
- package/cli/dist/backend-frameworks/mcp.js +86 -0
- package/cli/dist/backend-frameworks/nestjs.js +55 -0
- package/cli/dist/backend-frameworks/registry.js +134 -0
- package/cli/dist/backend-frameworks/types.js +1 -0
- package/cli/dist/backend-languages/bun.js +76 -0
- package/cli/dist/backend-languages/go.js +125 -0
- package/cli/dist/backend-languages/node.js +122 -0
- package/cli/dist/backend-languages/python.js +94 -0
- package/cli/dist/backend-languages/registry.js +37 -0
- package/cli/dist/backend-languages/rust.js +82 -0
- package/cli/dist/backend-languages/types.js +1 -0
- package/cli/dist/cli.js +29 -0
- package/cli/dist/commands/__tests__/project-e2e-helpers.js +49 -0
- package/cli/dist/commands/__tests__/ui-loading-screen.test.js +16 -0
- package/cli/dist/commands/agent.js +182 -0
- package/cli/dist/commands/completion-candidates.js +116 -0
- package/cli/dist/commands/completion.js +843 -0
- package/cli/dist/commands/config.js +362 -0
- package/cli/dist/commands/doctor.js +1504 -0
- package/cli/dist/commands/down.js +114 -0
- package/cli/dist/commands/eject.js +108 -0
- package/cli/dist/commands/help.js +152 -0
- package/cli/dist/commands/import.js +164 -0
- package/cli/dist/commands/logs.js +119 -0
- package/cli/dist/commands/maintainers.js +102 -0
- package/cli/dist/commands/mcp.js +28 -0
- package/cli/dist/commands/networks.js +306 -0
- package/cli/dist/commands/project.js +447 -0
- package/cli/dist/commands/projects.js +103 -0
- package/cli/dist/commands/registry.js +53 -0
- package/cli/dist/commands/resource.js +992 -0
- package/cli/dist/commands/resources.js +127 -0
- package/cli/dist/commands/restart.js +89 -0
- package/cli/dist/commands/runtime.js +75 -0
- package/cli/dist/commands/stack.js +171 -0
- package/cli/dist/commands/stacks.js +71 -0
- package/cli/dist/commands/status.js +211 -0
- package/cli/dist/commands/ui.js +725 -0
- package/cli/dist/commands/up.js +609 -0
- package/cli/dist/commands/upgrade.js +840 -0
- package/cli/dist/commands/version.js +10 -0
- package/cli/dist/components/Accessible.js +11 -0
- package/cli/dist/components/BaseTooltip.js +30 -0
- package/cli/dist/components/DetailPanel.js +33 -0
- package/cli/dist/components/FileTree.js +51 -0
- package/cli/dist/components/ResourceSelectInput.js +42 -0
- package/cli/dist/components/ResourceTable.js +35 -0
- package/cli/dist/components/ServiceIssues.js +13 -0
- package/cli/dist/components/TUIHeader.js +27 -0
- package/cli/dist/components/TabBar.js +27 -0
- package/cli/dist/components/Tooltip.js +13 -0
- package/cli/dist/components/index.js +11 -0
- package/cli/dist/components/ui-theme.js +120 -0
- package/cli/dist/config/platform-standards.js +182 -0
- package/cli/dist/frontend-frameworks/lit.js +64 -0
- package/cli/dist/frontend-frameworks/preact.js +62 -0
- package/cli/dist/frontend-frameworks/qwik.js +61 -0
- package/cli/dist/frontend-frameworks/react.js +69 -0
- package/cli/dist/frontend-frameworks/registry.js +83 -0
- package/cli/dist/frontend-frameworks/solid.js +62 -0
- package/cli/dist/frontend-frameworks/svelte.js +67 -0
- package/cli/dist/frontend-frameworks/tanstack-router.js +101 -0
- package/cli/dist/frontend-frameworks/types.js +1 -0
- package/cli/dist/frontend-frameworks/vanilla.js +59 -0
- package/cli/dist/frontend-frameworks/vue.js +72 -0
- package/cli/dist/generator/__tests__/golden-helpers.js +43 -0
- package/cli/dist/generator/extension-fetch.js +291 -0
- package/cli/dist/generator/resource-templates.js +133 -0
- package/cli/dist/generator/template-engine.js +801 -0
- package/cli/dist/index.js +10 -0
- package/cli/dist/mcp/server.js +101 -0
- package/cli/dist/mcp/tools.js +351 -0
- package/cli/dist/program.js +37 -0
- package/cli/dist/types/index.js +38 -0
- package/cli/dist/utils/agent-host.js +36 -0
- package/cli/dist/utils/atomic-write.js +36 -0
- package/cli/dist/utils/bun-floor.js +9 -0
- package/cli/dist/utils/bun-requirement.js +10 -0
- package/cli/dist/utils/cache.js +63 -0
- package/cli/dist/utils/cold-preflight.js +257 -0
- package/cli/dist/utils/command-helpers.js +57 -0
- package/cli/dist/utils/constants.js +160 -0
- package/cli/dist/utils/discovery-context.js +71 -0
- package/cli/dist/utils/discovery-paths.js +93 -0
- package/cli/dist/utils/docker.js +34 -0
- package/cli/dist/utils/doctor-crashloop.js +161 -0
- package/cli/dist/utils/doctor-fix.js +391 -0
- package/cli/dist/utils/doctor-host.js +66 -0
- package/cli/dist/utils/doctor-report.js +78 -0
- package/cli/dist/utils/doctor-runtime.js +880 -0
- package/cli/dist/utils/doctor-starlark.js +132 -0
- package/cli/dist/utils/doctor-wiring.js +698 -0
- package/cli/dist/utils/down-cleanup.js +125 -0
- package/cli/dist/utils/env-validator.js +266 -0
- package/cli/dist/utils/errors.js +175 -0
- package/cli/dist/utils/exec-async.js +31 -0
- package/cli/dist/utils/file-helpers.js +104 -0
- package/cli/dist/utils/formatting.js +165 -0
- package/cli/dist/utils/generated-paths.js +51 -0
- package/cli/dist/utils/help-command.js +11 -0
- package/cli/dist/utils/host-port-config.js +140 -0
- package/cli/dist/utils/host-port-plan.js +100 -0
- package/cli/dist/utils/json-output.js +29 -0
- package/cli/dist/utils/machine-output.js +33 -0
- package/cli/dist/utils/paths.js +43 -0
- package/cli/dist/utils/platform.js +58 -0
- package/cli/dist/utils/port-assignment.js +75 -0
- package/cli/dist/utils/port-conflict-fix.js +25 -0
- package/cli/dist/utils/port-fallback-notice.js +17 -0
- package/cli/dist/utils/port-listener-probe.js +20 -0
- package/cli/dist/utils/project-config-defaults.js +17 -0
- package/cli/dist/utils/project-features.js +91 -0
- package/cli/dist/utils/project-templates.js +32 -0
- package/cli/dist/utils/prompt.js +97 -0
- package/cli/dist/utils/resource-features.js +184 -0
- package/cli/dist/utils/resource-kind.js +9 -0
- package/cli/dist/utils/schema-version-gate.js +45 -0
- package/cli/dist/utils/search-status.js +12 -0
- package/cli/dist/utils/secret-redaction.js +73 -0
- package/cli/dist/utils/service-config-checks.js +189 -0
- package/cli/dist/utils/service-manifest.js +254 -0
- package/cli/dist/utils/service-runtime-state.js +66 -0
- package/cli/dist/utils/service-urls.js +112 -0
- package/cli/dist/utils/services.js +360 -0
- package/cli/dist/utils/shared-infra.js +45 -0
- package/cli/dist/utils/shared-platform-postgres.js +232 -0
- package/cli/dist/utils/single-flight.js +21 -0
- package/cli/dist/utils/smoke.js +401 -0
- package/cli/dist/utils/spinner.js +40 -0
- package/cli/dist/utils/stack-features.js +15 -0
- package/cli/dist/utils/stack-status.js +14 -0
- package/cli/dist/utils/startup-report.js +78 -0
- package/cli/dist/utils/status-message.js +21 -0
- package/cli/dist/utils/status-ports.js +33 -0
- package/cli/dist/utils/suggestions.js +63 -0
- package/cli/dist/utils/tar.js +46 -0
- package/cli/dist/utils/tdk-version.js +51 -0
- package/cli/dist/utils/terminal-layout.js +19 -0
- package/cli/dist/utils/tilt-events.js +194 -0
- package/cli/dist/utils/tilt-logs.js +61 -0
- package/cli/dist/utils/tilt-port-owner.js +63 -0
- package/cli/dist/utils/tilt-process.js +54 -0
- package/cli/dist/utils/tilt-resource-state.js +32 -0
- package/cli/dist/utils/tilt-startup.js +49 -0
- package/cli/dist/utils/tilt-unreachable-message.js +9 -0
- package/cli/dist/utils/tilt.js +104 -0
- package/cli/dist/utils/ui-keymap.js +129 -0
- package/cli/dist/utils/ui-service-state.js +34 -0
- package/cli/dist/utils/up-only.js +28 -0
- package/cli/dist/utils/up-readiness.js +118 -0
- package/cli/dist/utils/url-actions.js +103 -0
- package/cli/dist/utils/validation.js +62 -0
- package/cli/dist/utils/which.js +56 -0
- package/cli/dist/utils/windows-doctor.js +176 -0
- package/cli/dist-bundle/chunk-6EA4DGCY.js +2 -0
- package/cli/dist-bundle/chunk-BZ4H7MM4.js +3 -0
- package/cli/dist-bundle/chunk-QWYXYAX6.js +510 -0
- package/cli/dist-bundle/cli.js +2017 -0
- package/cli/dist-bundle/cold-preflight-MM46GFQA.js +2 -0
- package/cli/dist-bundle/devtools-ZUHXW33W.js +5 -0
- package/cli/dist-bundle/extension-fetch-J4FFH7TJ.js +2 -0
- package/cli/package.json +83 -0
- package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
- package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
- package/cli/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
- package/cli/templates/.tiltignore.hbs +72 -0
- package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +220 -0
- package/cli/templates/TILT_TECH_STACK.star.hbs +149 -0
- package/cli/templates/Tiltfile.hbs +381 -0
- package/cli/templates/spec.master.hbs +192 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +429 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +265 -0
- package/discovery/constants.star +167 -0
- package/discovery/deterministic.star +213 -0
- package/discovery/discovery_daemon.star +193 -0
- package/discovery/discovery_orchestrator.star +492 -0
- package/discovery/filtering.star +7 -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 +215 -0
- package/discovery/indexing.star +9 -0
- package/discovery/json_manifest_scanner.star +57 -0
- package/discovery/libraries.star +48 -0
- package/discovery/loading.star +25 -0
- package/discovery/manifest/constants.star +106 -0
- package/discovery/manifest/loading.star +418 -0
- package/discovery/manifest/normalize.star +289 -0
- package/discovery/manifest/validation.star +110 -0
- package/discovery/normalization.star +13 -0
- package/discovery/registry.star +562 -0
- package/discovery/resource_snapshot.py +384 -0
- package/discovery/resource_snapshot.star +145 -0
- package/discovery/schemas.star +3 -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 +253 -0
- package/discovery/validation.star +80 -0
- package/discovery/versioning.star +3 -0
- package/engine/AGENTS.md +706 -0
- package/engine/README.md +31 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +86 -0
- package/engine/assets/docker/golden-layers.Dockerfile +204 -0
- package/engine/assets/docker/wake-gateway/Dockerfile +28 -0
- package/engine/assets/docker/wake-gateway/decide.test.ts +177 -0
- package/engine/assets/docker/wake-gateway/decide.ts +135 -0
- package/engine/assets/docker/wake-gateway/server.ts +363 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +39 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +122 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +123 -0
- package/engine/config.star +5 -0
- package/engine/entrypoint.star +101 -0
- package/engine/lifecycle/orchestrator.star +263 -0
- package/engine/paths.star +719 -0
- package/engine/schemas/project-schema.json +147 -0
- package/engine/schemas/service-schema.json +537 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +207 -0
- package/engine/scripts/check-lib-publish.sh +87 -0
- package/engine/scripts/debug-container.sh +265 -0
- package/engine/scripts/generate-manifest.sh +200 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +33 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +207 -0
- package/engine/topologies/platform/docker/build/frontend_build_plan.star +65 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +144 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +100 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +263 -0
- package/engine/topologies/platform/docker/compose/compose.star +637 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +54 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +171 -0
- package/engine/topologies/platform/docker/config/bunignore.star +144 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +152 -0
- package/engine/topologies/platform/docker/config/healthcheck.star +58 -0
- package/engine/topologies/platform/docker/constants.star +211 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +56 -0
- package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +264 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +76 -0
- package/engine/topologies/platform/docker/index.star +40 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +25 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +42 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +264 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +89 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +147 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +229 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +282 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +138 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +131 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +100 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +128 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +205 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +121 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +206 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +31 -0
- package/engine/topologies/platform/docker/networking/traefik.star +266 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +148 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +162 -0
- package/engine/topologies/platform/docker/networking/traefik_static_routes.star +165 -0
- package/engine/topologies/platform/docker/secrets/env_secrets.star +74 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +109 -0
- package/engine/topologies/platform/net/AGENTS.md +64 -0
- package/engine/topologies/platform/net/proxy.star +6 -0
- package/engine/topologies/platform/registries/local.star +6 -0
- package/engine/topologies/platform/registries/verdaccio_loader.star +20 -0
- package/engine/topologies/platform/security/AGENTS.md +49 -0
- package/engine/topologies/platform/security/secrets.star +241 -0
- package/engine/topologies/platform/state/AGENTS.md +64 -0
- package/engine/topologies/platform/state/relational.star +6 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +409 -0
- package/engine/topologies/tilt/common/utils_debug.star +71 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +170 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +54 -0
- package/engine/topologies/tilt/common/utils_env.star +92 -0
- package/engine/topologies/tilt/common/utils_output.star +99 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +5 -0
- package/engine/topologies/tilt/config/feature_flags.star +12 -0
- package/engine/topologies/tilt/config/global.star +57 -0
- package/engine/topologies/tilt/config/profiles.star +398 -0
- package/engine/topologies/tilt/generators/agents_md.star +64 -0
- package/engine/topologies/tilt/generators/api_gateway.star +147 -0
- package/engine/topologies/tilt/generators/index.star +126 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +314 -0
- package/engine/topologies/tilt/generators/infisical/index.star +59 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +422 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +536 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +478 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +422 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +145 -0
- package/engine/topologies/tilt/generators/npmrc.star +132 -0
- package/engine/topologies/tilt/generators/tsconfig.star +25 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +73 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +137 -0
- package/engine/topologies/tilt/generators/typescript/common.star +9 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +78 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +140 -0
- package/engine/topologies/tilt/generators/typescript/include.star +25 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +42 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +51 -0
- package/engine/topologies/tilt/generators/validators.star +868 -0
- package/engine/topologies/tilt/generators/vite/backend.star +80 -0
- package/engine/topologies/tilt/generators/vite/frameworks/lit.star +92 -0
- package/engine/topologies/tilt/generators/vite/frameworks/preact.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/react.star +128 -0
- package/engine/topologies/tilt/generators/vite/frameworks/solid.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +94 -0
- package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +92 -0
- package/engine/topologies/tilt/generators/vite/frameworks/vue.star +94 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +153 -0
- package/engine/topologies/tilt/generators/vite/generators.star +45 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +256 -0
- package/engine/topologies/tilt/generators/vite/library.star +67 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +75 -0
- package/engine/topologies/tilt/generators/vite/templates.star +460 -0
- package/engine/topologies/tilt/generators/vite_config.star +24 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +679 -0
- package/engine/topologies/tilt/manifest/__init__.star +220 -0
- package/engine/topologies/tilt/manifest/constants.star +262 -0
- package/engine/topologies/tilt/manifest/errors.star +268 -0
- package/engine/topologies/tilt/manifest/integration.star +348 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +61 -0
- package/engine/topologies/tilt/manifest/loader.star +239 -0
- package/engine/topologies/tilt/manifest/mapper.star +229 -0
- package/engine/topologies/tilt/manifest/parser.star +490 -0
- package/engine/topologies/tilt/manifest/schema.star +502 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +278 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +475 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +319 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +472 -0
- package/engine/topologies/tilt/manifest/validator.star +744 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +20 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/build_concurrency.star +56 -0
- package/engine/topologies/tilt/resources/conditions.star +5 -0
- package/engine/topologies/tilt/resources/databases.star +246 -0
- package/engine/topologies/tilt/resources/declaration.star +5 -0
- package/engine/topologies/tilt/resources/deps.star +5 -0
- package/engine/topologies/tilt/resources/infra-loader.star +504 -0
- package/engine/topologies/tilt/resources/libs.star +32 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +104 -0
- package/engine/topologies/tilt/resources/libs_paths.star +81 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +153 -0
- package/engine/topologies/tilt/resources/libs_setup.star +166 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +39 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +79 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +864 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +90 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +150 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +38 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +46 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +193 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +23 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +136 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +219 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +172 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +577 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +35 -0
- package/engine/topologies/tilt/resources/orchestrator.star +56 -0
- package/engine/topologies/tilt/resources/ordering.star +5 -0
- package/engine/topologies/tilt/resources/shared-platform-postgres.star +30 -0
- package/engine/topologies/tilt/resources/triggers.star +5 -0
- package/engine/topologies/tilt/resources/watchers.star +304 -0
- package/engine/where-things-live.star +719 -0
- package/examples/tdk-example/LICENSE +21 -0
- package/examples/tdk-example/README.md +23 -0
- package/examples/tdk-example/TILT_SERVICE_DEFAULTS.star +42 -0
- package/examples/tdk-example/TILT_TECH_STACK.star +67 -0
- package/examples/tdk-example/Tiltfile +25 -0
- package/examples/tdk-example/services/platform/messaging/docker-compose.yml +26 -0
- package/examples/tdk-example/services/shop/orders-api/package.json +20 -0
- package/examples/tdk-example/services/shop/orders-api/service.json +14 -0
- package/examples/tdk-example/services/shop/orders-api/src/index.ts +81 -0
- package/examples/tdk-example/services/shop/orders-app/index.html +12 -0
- package/examples/tdk-example/services/shop/orders-app/package.json +23 -0
- package/examples/tdk-example/services/shop/orders-app/public/.gitkeep +0 -0
- package/examples/tdk-example/services/shop/orders-app/service.json +9 -0
- package/examples/tdk-example/services/shop/orders-app/src/main.tsx +9 -0
- package/examples/tdk-example/services/shop/orders-app/src/orders.tsx +67 -0
- package/examples/tdk-example/services/shop/orders-app/src/style.css +15 -0
- package/examples/tdk-example/services/shop/orders-worker/package.json +18 -0
- package/examples/tdk-example/services/shop/orders-worker/service.json +13 -0
- package/examples/tdk-example/services/shop/orders-worker/src/index.ts +33 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +221 -0
- package/ext/ide-components/code_viewer/server.py +208 -0
- package/ext/ide-components/config_inspector/server.py +1052 -0
- package/ext/ide-components/file_browser/server.py +287 -0
- package/ext/ide-components/shared/config_service.py +471 -0
- package/ext/ide-components/shared/file_utils.py +300 -0
- package/ext/ide-components/shared/http_utils.py +234 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +142 -0
- package/ext/ide-components/shared/template_engine.py +125 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +328 -0
- package/ext/ide-components/shared/tilt_integration.py +160 -0
- package/ext/ui-enhancements/cron-status-server.sh +51 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +148 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +101 -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 +94 -4
- package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
- package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
- package/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
- package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
- package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +207 -0
- package/specs/specs/TILT_TECH_STACK.star +161 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# 🎯 TOPOLOGIES - FOCUS PROFILES
|
|
5
|
+
# =============================================================================
|
|
6
|
+
|
|
7
|
+
load("../../../topologies/tilt/common/utils.star", "Utils")
|
|
8
|
+
load(
|
|
9
|
+
"../../../../discovery/registry.star",
|
|
10
|
+
"APP_RESOURCES",
|
|
11
|
+
"CORE_INFRA_EXPORT",
|
|
12
|
+
"INFRA_STACK_MAP_EXPORT",
|
|
13
|
+
"OPTIONAL_INFRA_EXPORT",
|
|
14
|
+
"DEFAULTS_EXPORT",
|
|
15
|
+
"FOCUS_PRE_ALPHA_EXPORT",
|
|
16
|
+
"FOCUS_ALPHA_EXPORT",
|
|
17
|
+
"FOCUS_BETA_EXPORT",
|
|
18
|
+
"get_app_resources",
|
|
19
|
+
"get_app_resources_ref",
|
|
20
|
+
"get_resource_aliases_ref",
|
|
21
|
+
"get_resource_dependencies_ref",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# =============================================================================
|
|
25
|
+
# 🎯 RELEASE PHASE MAPPINGS
|
|
26
|
+
# =============================================================================
|
|
27
|
+
# Map release phase names to service lists from spec.master
|
|
28
|
+
|
|
29
|
+
RELEASE_PHASES = {
|
|
30
|
+
"pre-alpha": FOCUS_PRE_ALPHA_EXPORT,
|
|
31
|
+
"alpha": FOCUS_ALPHA_EXPORT,
|
|
32
|
+
"beta": FOCUS_BETA_EXPORT,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
def expand_release_targets(targets):
|
|
36
|
+
"""Expand release phase targets (pre-alpha, alpha, beta) to service lists."""
|
|
37
|
+
expanded = []
|
|
38
|
+
for target in targets:
|
|
39
|
+
target_lower = target.lower()
|
|
40
|
+
if target_lower in RELEASE_PHASES:
|
|
41
|
+
phase_services = RELEASE_PHASES[target_lower]
|
|
42
|
+
for svc in phase_services:
|
|
43
|
+
expanded.append(svc)
|
|
44
|
+
else:
|
|
45
|
+
expanded.append(target)
|
|
46
|
+
return expanded
|
|
47
|
+
|
|
48
|
+
def _get_resources_for_domain(domain_name):
|
|
49
|
+
"""Get resource names (backend, frontend) for a domain from APP_RESOURCES.
|
|
50
|
+
|
|
51
|
+
Returns both the actual service resources and YAML tracking resources.
|
|
52
|
+
Library resources (appType == 'library') only return YAML resources.
|
|
53
|
+
|
|
54
|
+
Matches by stack name (domain) which is the canonical service identifier.
|
|
55
|
+
"""
|
|
56
|
+
resources = []
|
|
57
|
+
for service in get_app_resources_ref():
|
|
58
|
+
# Match by stack name (domain) - this is the canonical identifier in spec.master
|
|
59
|
+
service_stack = service.get("stack", "")
|
|
60
|
+
service_name = service.get("name", "")
|
|
61
|
+
if service_stack == domain_name or service_name == domain_name:
|
|
62
|
+
for res in service.get("resources", []):
|
|
63
|
+
res_name = res.get("name", "")
|
|
64
|
+
if res_name:
|
|
65
|
+
# Check if this is a library resource - libraries don't have runtime resources
|
|
66
|
+
manifest = res.get("_manifest", {})
|
|
67
|
+
if manifest.get("appType") == "library":
|
|
68
|
+
# For libraries, only add YAML tracking resource
|
|
69
|
+
resources.append(res_name + "-yaml")
|
|
70
|
+
else:
|
|
71
|
+
# For actual services (backend, frontend), add both:
|
|
72
|
+
# 1. The actual service resource (for docker_build/docker_compose)
|
|
73
|
+
resources.append(res_name)
|
|
74
|
+
# 2. The YAML tracking resource
|
|
75
|
+
resources.append(res_name + "-yaml")
|
|
76
|
+
return resources
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def get_all_needed_services(targets, skip_frontend = False):
|
|
80
|
+
needed = {}
|
|
81
|
+
visited = {}
|
|
82
|
+
|
|
83
|
+
def _resolve_alias(resource_name):
|
|
84
|
+
if resource_name in get_resource_aliases_ref():
|
|
85
|
+
alias_value = get_resource_aliases_ref()[resource_name]
|
|
86
|
+
# get_resource_aliases_ref() maps names to paths (strings), not to resource lists
|
|
87
|
+
# Only return alias_value if it's a list (of resource names)
|
|
88
|
+
if type(alias_value) == "list":
|
|
89
|
+
return alias_value
|
|
90
|
+
return [resource_name]
|
|
91
|
+
|
|
92
|
+
def _filter_frontends(resources, include_frontends):
|
|
93
|
+
if include_frontends:
|
|
94
|
+
return resources
|
|
95
|
+
return [resource for resource in resources if "frontend" not in resource]
|
|
96
|
+
|
|
97
|
+
def resolve_target(resource_name):
|
|
98
|
+
# Explicit focus targets keep their frontends unless --no-frontend is set.
|
|
99
|
+
return _filter_frontends(_resolve_alias(resource_name), not skip_frontend)
|
|
100
|
+
|
|
101
|
+
def resolve_dependency(resource_name):
|
|
102
|
+
# Transitive domain dependencies should not pull dependency UIs.
|
|
103
|
+
return _filter_frontends(_resolve_alias(resource_name), False)
|
|
104
|
+
|
|
105
|
+
def discover(service):
|
|
106
|
+
if service in visited:
|
|
107
|
+
return
|
|
108
|
+
visited[service] = True
|
|
109
|
+
|
|
110
|
+
if skip_frontend and "frontend" in service:
|
|
111
|
+
return
|
|
112
|
+
|
|
113
|
+
needed[service] = True
|
|
114
|
+
|
|
115
|
+
deps = get_resource_dependencies_ref().get(service, [])
|
|
116
|
+
for dep in deps:
|
|
117
|
+
for resolved in resolve_dependency(dep):
|
|
118
|
+
discover(resolved)
|
|
119
|
+
|
|
120
|
+
for target in targets:
|
|
121
|
+
for resolved in resolve_target(target):
|
|
122
|
+
discover(resolved)
|
|
123
|
+
|
|
124
|
+
# Expand any domain names in needed to their actual resources
|
|
125
|
+
# e.g., "identity" -> ["identity-management-backend", "identity-management-frontend", ...]
|
|
126
|
+
expanded_needed = {}
|
|
127
|
+
for service in needed:
|
|
128
|
+
resources = _get_resources_for_domain(service)
|
|
129
|
+
if resources:
|
|
130
|
+
for res in resources:
|
|
131
|
+
expanded_needed[res] = True
|
|
132
|
+
else:
|
|
133
|
+
expanded_needed[service] = True
|
|
134
|
+
|
|
135
|
+
return expanded_needed.keys()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _load_focus_lists():
|
|
139
|
+
"""Load focus lists from project spec.master directly."""
|
|
140
|
+
project_root = os.environ.get('TDK_PROJECT_ROOT', '')
|
|
141
|
+
if not project_root:
|
|
142
|
+
return ([], [], [])
|
|
143
|
+
|
|
144
|
+
# Load from spec.master
|
|
145
|
+
spec_paths = [
|
|
146
|
+
project_root + "/.tdk/.tdk-out/spec.master",
|
|
147
|
+
project_root + "/spec.master",
|
|
148
|
+
]
|
|
149
|
+
|
|
150
|
+
for spec_path in spec_paths:
|
|
151
|
+
check_cmd = "test -f '{}' && echo 'yes' || echo 'no'".format(spec_path)
|
|
152
|
+
exists = str(local(check_cmd, quiet=True, echo_off=True)).strip() == 'yes'
|
|
153
|
+
if exists:
|
|
154
|
+
# Parse PRE_ALPHA_RESOURCES from spec.master
|
|
155
|
+
pre_alpha = []
|
|
156
|
+
alpha = []
|
|
157
|
+
beta = []
|
|
158
|
+
|
|
159
|
+
content = str(local("cat '" + spec_path + "' 2>/dev/null || true", quiet=True, echo_off=True))
|
|
160
|
+
|
|
161
|
+
# Simple parsing for PRE_ALPHA_RESOURCES = {"key": True, ...}
|
|
162
|
+
if "PRE_ALPHA_RESOURCES" in content:
|
|
163
|
+
start = content.find("PRE_ALPHA_RESOURCES = {")
|
|
164
|
+
if start != -1:
|
|
165
|
+
start = content.find("{", start)
|
|
166
|
+
end = content.find("}", start)
|
|
167
|
+
if start != -1 and end != -1:
|
|
168
|
+
dict_content = content[start+1:end]
|
|
169
|
+
for line in dict_content.split("\n"):
|
|
170
|
+
line = line.strip()
|
|
171
|
+
if line and not line.startswith("#"):
|
|
172
|
+
# Extract key from "key": True format
|
|
173
|
+
if '"' in line or "'" in line:
|
|
174
|
+
quote_char = '"' if '"' in line else "'"
|
|
175
|
+
key_start = line.find(quote_char)
|
|
176
|
+
key_end = line.find(quote_char, key_start + 1)
|
|
177
|
+
if key_start != -1 and key_end != -1:
|
|
178
|
+
key = line[key_start+1:key_end]
|
|
179
|
+
if "True" in line:
|
|
180
|
+
pre_alpha.append(key)
|
|
181
|
+
|
|
182
|
+
if "ALPHA_RESOURCES" in content:
|
|
183
|
+
start = content.find("ALPHA_RESOURCES = {")
|
|
184
|
+
if start != -1:
|
|
185
|
+
start = content.find("{", start)
|
|
186
|
+
end = content.find("}", start)
|
|
187
|
+
if start != -1 and end != -1:
|
|
188
|
+
dict_content = content[start+1:end]
|
|
189
|
+
for line in dict_content.split("\n"):
|
|
190
|
+
line = line.strip()
|
|
191
|
+
if line and not line.startswith("#"):
|
|
192
|
+
if '"' in line or "'" in line:
|
|
193
|
+
quote_char = '"' if '"' in line else "'"
|
|
194
|
+
key_start = line.find(quote_char)
|
|
195
|
+
key_end = line.find(quote_char, key_start + 1)
|
|
196
|
+
if key_start != -1 and key_end != -1:
|
|
197
|
+
key = line[key_start+1:key_end]
|
|
198
|
+
if "True" in line:
|
|
199
|
+
alpha.append(key)
|
|
200
|
+
|
|
201
|
+
if "BETA_RESOURCES" in content:
|
|
202
|
+
start = content.find("BETA_RESOURCES = {")
|
|
203
|
+
if start != -1:
|
|
204
|
+
start = content.find("{", start)
|
|
205
|
+
end = content.find("}", start)
|
|
206
|
+
if start != -1 and end != -1:
|
|
207
|
+
dict_content = content[start+1:end]
|
|
208
|
+
for line in dict_content.split("\n"):
|
|
209
|
+
line = line.strip()
|
|
210
|
+
if line and not line.startswith("#"):
|
|
211
|
+
if '"' in line or "'" in line:
|
|
212
|
+
quote_char = '"' if '"' in line else "'"
|
|
213
|
+
key_start = line.find(quote_char)
|
|
214
|
+
key_end = line.find(quote_char, key_start + 1)
|
|
215
|
+
if key_start != -1 and key_end != -1:
|
|
216
|
+
key = line[key_start+1:key_end]
|
|
217
|
+
if "True" in line:
|
|
218
|
+
beta.append(key)
|
|
219
|
+
|
|
220
|
+
return (pre_alpha, alpha, beta)
|
|
221
|
+
|
|
222
|
+
return ([], [], [])
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def apply_focus_filter(cfg):
|
|
226
|
+
# Ensure discovery is complete before applying focus filter
|
|
227
|
+
if len(get_app_resources_ref()) == 0:
|
|
228
|
+
get_app_resources()
|
|
229
|
+
|
|
230
|
+
focus_targets = cfg.get("focus", [])
|
|
231
|
+
|
|
232
|
+
# Default to pre-alpha if no focus targets specified
|
|
233
|
+
if not focus_targets:
|
|
234
|
+
print("🎯 Mode: pre-alpha (use --focus for alpha/beta)")
|
|
235
|
+
focus_targets = ["pre-alpha"]
|
|
236
|
+
|
|
237
|
+
parsed_targets = []
|
|
238
|
+
for target in focus_targets:
|
|
239
|
+
parsed_targets.extend(target.split(","))
|
|
240
|
+
parsed_targets = [t.strip() for t in parsed_targets if t.strip()]
|
|
241
|
+
|
|
242
|
+
# Load focus lists directly from spec.master (since env var is set after module load)
|
|
243
|
+
pre_alpha_list, alpha_list, beta_list = _load_focus_lists()
|
|
244
|
+
|
|
245
|
+
# Temporarily override RELEASE_PHASES with loaded values
|
|
246
|
+
dynamic_phases = {
|
|
247
|
+
"pre-alpha": pre_alpha_list if pre_alpha_list else FOCUS_PRE_ALPHA_EXPORT,
|
|
248
|
+
"alpha": alpha_list if alpha_list else FOCUS_ALPHA_EXPORT,
|
|
249
|
+
"beta": beta_list if beta_list else FOCUS_BETA_EXPORT,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
# Expand release phase targets (pre-alpha, alpha, beta) to service lists
|
|
253
|
+
expanded = []
|
|
254
|
+
for target in parsed_targets:
|
|
255
|
+
target_lower = target.lower()
|
|
256
|
+
if target_lower in dynamic_phases:
|
|
257
|
+
phase_services = dynamic_phases[target_lower]
|
|
258
|
+
for svc in phase_services:
|
|
259
|
+
expanded.append(svc)
|
|
260
|
+
else:
|
|
261
|
+
expanded.append(target)
|
|
262
|
+
parsed_targets = expanded
|
|
263
|
+
|
|
264
|
+
if not parsed_targets:
|
|
265
|
+
return (False, None, None)
|
|
266
|
+
|
|
267
|
+
print("🎯 ═══════════════════════════════════════════════════════════════")
|
|
268
|
+
print("🎯 UBER-STYLE FOCUS MODE ACTIVATED")
|
|
269
|
+
print("🎯 Target services: " + ", ".join(parsed_targets))
|
|
270
|
+
print("🎯 ═══════════════════════════════════════════════════════════════")
|
|
271
|
+
|
|
272
|
+
skip_frontend = cfg.get("no-frontend", False)
|
|
273
|
+
include_monitoring = cfg.get("include-monitoring", False)
|
|
274
|
+
|
|
275
|
+
needed_list = get_all_needed_services(parsed_targets, skip_frontend)
|
|
276
|
+
needed = {}
|
|
277
|
+
for s in needed_list:
|
|
278
|
+
needed[s] = True
|
|
279
|
+
|
|
280
|
+
for infra in CORE_INFRA_EXPORT:
|
|
281
|
+
needed[infra] = True
|
|
282
|
+
if infra in INFRA_STACK_MAP_EXPORT:
|
|
283
|
+
needed[INFRA_STACK_MAP_EXPORT[infra]] = True
|
|
284
|
+
|
|
285
|
+
if include_monitoring:
|
|
286
|
+
needed["monitoring"] = True
|
|
287
|
+
for svc in OPTIONAL_INFRA_EXPORT.get("monitoring", []):
|
|
288
|
+
needed[svc] = True
|
|
289
|
+
|
|
290
|
+
if os.environ.get("INFISICAL_ENABLED", "true").lower() == "true":
|
|
291
|
+
needed["infisical"] = True
|
|
292
|
+
for svc in OPTIONAL_INFRA_EXPORT.get("infisical", []):
|
|
293
|
+
needed[svc] = True
|
|
294
|
+
|
|
295
|
+
for target in parsed_targets:
|
|
296
|
+
if target in get_resource_aliases_ref():
|
|
297
|
+
needed[target] = True
|
|
298
|
+
|
|
299
|
+
all_needed = needed.keys()
|
|
300
|
+
|
|
301
|
+
logic_toggles = [
|
|
302
|
+
"database-management",
|
|
303
|
+
"golden-image",
|
|
304
|
+
"proxy",
|
|
305
|
+
"verdaccio",
|
|
306
|
+
"infisical",
|
|
307
|
+
"monitoring",
|
|
308
|
+
"elk",
|
|
309
|
+
"debezium",
|
|
310
|
+
# Domains are auto-discovered from service manifests
|
|
311
|
+
# No hardcoded domain names - all from service.json
|
|
312
|
+
"backends-only",
|
|
313
|
+
]
|
|
314
|
+
# Infrastructure resources that exist as Tilt local_resource or docker_compose
|
|
315
|
+
# These are handled separately and should not be in resource_only_needed
|
|
316
|
+
infra_resource_names = CORE_INFRA_EXPORT + ["infisical-db", "infisical-redis"]
|
|
317
|
+
for opt_infra_list in OPTIONAL_INFRA_EXPORT.values():
|
|
318
|
+
for res in opt_infra_list:
|
|
319
|
+
if res not in infra_resource_names:
|
|
320
|
+
infra_resource_names.append(res)
|
|
321
|
+
|
|
322
|
+
# config.set_enabled_resources accepts only concrete Tilt resources.
|
|
323
|
+
# Logic toggles (e.g. "golden-image", "database-management") are excluded since they're config flags, not resources.
|
|
324
|
+
# Infrastructure resources (postgres, nats, traefik, etc.) are loaded via Infra.load_all()
|
|
325
|
+
# and excluded here since they may not be available in all projects.
|
|
326
|
+
# Only include resources that exist as discovered services.
|
|
327
|
+
#
|
|
328
|
+
# NOTE: resource_aliases (from get_resource_aliases_ref()) only maps top-level
|
|
329
|
+
# STACK/domain names (e.g. "app", "billing") to a path - it does not contain an
|
|
330
|
+
# entry per concrete resource (e.g. "dashboard-api", "checkout-app"). _get_resources_for_domain()
|
|
331
|
+
# already expanded stack names into concrete resource names above (all_needed), so those
|
|
332
|
+
# concrete names must be recognized here too, or they get silently dropped and their
|
|
333
|
+
# services never start. Build that set directly from the discovered service resources.
|
|
334
|
+
resource_aliases = get_resource_aliases_ref()
|
|
335
|
+
known_service_resource_names = {}
|
|
336
|
+
for _svc in get_app_resources_ref():
|
|
337
|
+
for _res in _svc.get("resources", []):
|
|
338
|
+
_res_name = _res.get("name", "")
|
|
339
|
+
if _res_name:
|
|
340
|
+
known_service_resource_names[_res_name] = True
|
|
341
|
+
known_service_resource_names[_res_name + "-yaml"] = True
|
|
342
|
+
resource_only_needed = []
|
|
343
|
+
for r in all_needed:
|
|
344
|
+
if r in logic_toggles:
|
|
345
|
+
continue
|
|
346
|
+
if r not in resource_aliases and r not in known_service_resource_names:
|
|
347
|
+
continue
|
|
348
|
+
resource_only_needed.append(r)
|
|
349
|
+
|
|
350
|
+
print("🎯 Discovered " + str(len(all_needed)) + " entities via dependency graph:")
|
|
351
|
+
|
|
352
|
+
app_resources = [r for r in all_needed if any([x in r for x in ["backend", "frontend", "migrator"]])]
|
|
353
|
+
infra_resources = [r for r in all_needed if r in CORE_INFRA_EXPORT or any([r in v for v in OPTIONAL_INFRA_EXPORT.values()])]
|
|
354
|
+
db_resources = [r for r in all_needed if "provision-db" in r]
|
|
355
|
+
|
|
356
|
+
if app_resources:
|
|
357
|
+
print(" 📱 Apps: " + ", ".join(sorted(app_resources)))
|
|
358
|
+
if db_resources:
|
|
359
|
+
print(" 🗃️ Databases: " + ", ".join(sorted(db_resources)))
|
|
360
|
+
if infra_resources:
|
|
361
|
+
print(" 🏗️ Infrastructure: " + ", ".join(sorted(infra_resources)))
|
|
362
|
+
|
|
363
|
+
print("🎯 ═══════════════════════════════════════════════════════════════")
|
|
364
|
+
|
|
365
|
+
return (True, all_needed, resource_only_needed)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def create_should_enable_wrapper(focus_mode, focus_enabled_all, cfg, defaults):
|
|
369
|
+
def should_enable_wrapper(resource_name):
|
|
370
|
+
if focus_mode and focus_enabled_all:
|
|
371
|
+
# Check if resource_name itself is in the list (for infrastructure)
|
|
372
|
+
if resource_name in focus_enabled_all:
|
|
373
|
+
return True
|
|
374
|
+
# Check if resource_name starts with any domain in focus_enabled_all
|
|
375
|
+
# e.g., "identity-management-backend" starts with "identity"
|
|
376
|
+
for domain in focus_enabled_all:
|
|
377
|
+
if resource_name.startswith(domain + "-"):
|
|
378
|
+
return True
|
|
379
|
+
# Check get_resource_aliases_ref() (if it maps to resource lists)
|
|
380
|
+
if resource_name in get_resource_aliases_ref():
|
|
381
|
+
alias_value = get_resource_aliases_ref()[resource_name]
|
|
382
|
+
if type(alias_value) == "list":
|
|
383
|
+
return any([res in focus_enabled_all for res in alias_value])
|
|
384
|
+
return False
|
|
385
|
+
return Utils.should_enable(resource_name, cfg, defaults)
|
|
386
|
+
|
|
387
|
+
return should_enable_wrapper
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
Focus = struct(
|
|
391
|
+
get_needed_services = get_all_needed_services,
|
|
392
|
+
apply_focus = apply_focus_filter,
|
|
393
|
+
create_enabler = create_should_enable_wrapper,
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
# Inlined constant
|
|
398
|
+
DEFAULTS = {}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# 🤖 TILT SDK - AGENTS.MD GENERATOR (free-tier stub)
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# Path: .tilt/providers/generators/agents_md.star
|
|
7
|
+
# =============================================================================
|
|
8
|
+
# The full AI-agent guard rails (the multi-section AGENTS.md explaining the
|
|
9
|
+
# manifest-driven architecture, the do/don't table, and the emergency
|
|
10
|
+
# override procedure) are a paid Flisk feature. When a valid license grants
|
|
11
|
+
# the "agents-md" resource, cli/src/generator/template-engine.ts
|
|
12
|
+
# (vendorTdkExtension) overwrites this file with the licensed version
|
|
13
|
+
# fetched via extension-fetch.ts before Tilt loads it. Same function
|
|
14
|
+
# signature either way, so nothing else in the generator pipeline changes.
|
|
15
|
+
# =============================================================================
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# === INLINED CONSTANTS for pure extension loading ===
|
|
19
|
+
OUTPUT = struct(AUTOGENERATED_FOLDER = ".autogenerated")
|
|
20
|
+
# === END INLINED CONSTANTS ===
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
load('../../../topologies/tilt/common/utils.star', 'Utils')
|
|
24
|
+
|
|
25
|
+
_STUB_NOTICE = """# ⚠️ AUTOGENERATED FILES - DO NOT MODIFY
|
|
26
|
+
|
|
27
|
+
**This folder (`.autogenerated/`) contains MACHINE-GENERATED files.** Any changes you make here will be overwritten the next time Tilt runs the configuration generators.
|
|
28
|
+
|
|
29
|
+
Full AI-agent guard rails (architecture explanation, do/don't table, emergency override procedure) are a paid Flisk feature. Run `flisk upgrade` to enable the complete generated AGENTS.md for this service.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def generate_agents_md(manifest, write_fn=None):
|
|
34
|
+
"""
|
|
35
|
+
Free-tier stub - see module header. Signature matches the licensed
|
|
36
|
+
implementation so callers never need to know which one is active.
|
|
37
|
+
"""
|
|
38
|
+
resource_path = manifest.get('_resource_path', '')
|
|
39
|
+
app_name = manifest.get('appName', 'unknown-service')
|
|
40
|
+
app_type = manifest.get('appType', 'backend')
|
|
41
|
+
|
|
42
|
+
header = Utils.get_template_header(
|
|
43
|
+
'agents_md',
|
|
44
|
+
'AgentsMd.generate() [unlicensed stub]',
|
|
45
|
+
app_name,
|
|
46
|
+
'Output: .autogenerated/AGENTS.md',
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
content = header + _STUB_NOTICE
|
|
50
|
+
|
|
51
|
+
if write_fn:
|
|
52
|
+
output_path = resource_path + '/' + OUTPUT.AUTOGENERATED_FOLDER + '/AGENTS.md'
|
|
53
|
+
write_fn(output_path, content)
|
|
54
|
+
|
|
55
|
+
return content
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# =============================================================================
|
|
59
|
+
# 🎯 PUBLIC API
|
|
60
|
+
# =============================================================================
|
|
61
|
+
|
|
62
|
+
AgentsMd = struct(
|
|
63
|
+
generate = generate_agents_md,
|
|
64
|
+
)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# 🌐 TILT SDK - API GATEWAY (Referer-Based Context Routing)
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# Path: .tilt/topologies/tilt/generators/api_gateway.star
|
|
7
|
+
# Purpose: Auto-discover backends and generate referer-based routing map
|
|
8
|
+
# =============================================================================
|
|
9
|
+
|
|
10
|
+
load('../../../../discovery/registry.star', 'get_app_resources', 'get_resource_aliases')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _extract_referer_pattern(base_path, stack):
|
|
14
|
+
"""Extract referer pattern from basePath or stack - use actual names."""
|
|
15
|
+
if base_path:
|
|
16
|
+
return base_path.strip('/').lower()
|
|
17
|
+
if stack:
|
|
18
|
+
return stack.lower()
|
|
19
|
+
return None
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _collect_backend_dependencies(frontend_manifest):
|
|
23
|
+
"""
|
|
24
|
+
Resolve backend resource names for a frontend manifest's declared dependencies.
|
|
25
|
+
Includes frontend's own backend and backend resources from dependency aliases.
|
|
26
|
+
"""
|
|
27
|
+
if frontend_manifest == None:
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
allowed = {}
|
|
31
|
+
|
|
32
|
+
frontend_backend = frontend_manifest.get('backendName')
|
|
33
|
+
if frontend_backend:
|
|
34
|
+
allowed[frontend_backend] = True
|
|
35
|
+
|
|
36
|
+
manifest_deps = frontend_manifest.get('dependencies')
|
|
37
|
+
if manifest_deps == None:
|
|
38
|
+
manifest_deps = frontend_manifest.get('dependsOn', [])
|
|
39
|
+
|
|
40
|
+
aliases = get_resource_aliases()
|
|
41
|
+
for dep in manifest_deps:
|
|
42
|
+
dep_name = str(dep)
|
|
43
|
+
if dep_name.endswith('-backend'):
|
|
44
|
+
allowed[dep_name] = True
|
|
45
|
+
continue
|
|
46
|
+
|
|
47
|
+
alias_targets = aliases.get(dep_name, [])
|
|
48
|
+
for target in alias_targets:
|
|
49
|
+
if target.endswith('-backend'):
|
|
50
|
+
allowed[target] = True
|
|
51
|
+
|
|
52
|
+
return allowed
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _get_backend_port(backend_name, fallback = 4000):
|
|
56
|
+
for service in get_app_resources():
|
|
57
|
+
for resource in service.get('resources', []):
|
|
58
|
+
if resource.get('name') == backend_name:
|
|
59
|
+
manifest = resource.get('_manifest', {})
|
|
60
|
+
app_type = manifest.get('appType', resource.get('app_type', 'backend'))
|
|
61
|
+
if app_type == 'backend':
|
|
62
|
+
return manifest.get('containerPort', 3000)
|
|
63
|
+
return resource.get('port', fallback)
|
|
64
|
+
return fallback
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def get_backend_routing_map(frontend_manifest = None):
|
|
68
|
+
"""
|
|
69
|
+
Auto-scan all backends from discovered manifests and build referer-based routing map.
|
|
70
|
+
Returns dict: {referer_pattern: {backend_name, port}}
|
|
71
|
+
"""
|
|
72
|
+
routing_map = {}
|
|
73
|
+
default_backend = None
|
|
74
|
+
|
|
75
|
+
allowed_backends = _collect_backend_dependencies(frontend_manifest)
|
|
76
|
+
|
|
77
|
+
for resource_group in get_app_resources():
|
|
78
|
+
stack_name = resource_group.get('name', '')
|
|
79
|
+
|
|
80
|
+
for resource in resource_group.get('resources', []):
|
|
81
|
+
manifest = resource.get('_manifest', {})
|
|
82
|
+
app_type = manifest.get('appType', resource.get('app_type', 'backend'))
|
|
83
|
+
|
|
84
|
+
if app_type != 'backend':
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
backend_name = resource.get('name', '')
|
|
88
|
+
if allowed_backends != None and backend_name not in allowed_backends:
|
|
89
|
+
continue
|
|
90
|
+
if app_type == 'backend':
|
|
91
|
+
port = manifest.get('containerPort', 3000)
|
|
92
|
+
else:
|
|
93
|
+
port = resource.get('port', 4000)
|
|
94
|
+
|
|
95
|
+
base_path = manifest.get('basePath', '')
|
|
96
|
+
stack = manifest.get('stack', stack_name)
|
|
97
|
+
|
|
98
|
+
pattern = _extract_referer_pattern(base_path, stack)
|
|
99
|
+
|
|
100
|
+
if pattern:
|
|
101
|
+
routing_map[pattern] = {'name': backend_name, 'port': port}
|
|
102
|
+
elif not default_backend:
|
|
103
|
+
default_backend = {'name': backend_name, 'port': port}
|
|
104
|
+
|
|
105
|
+
return routing_map, default_backend
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def build_referer_map_block(frontend_manifest = None):
|
|
109
|
+
"""
|
|
110
|
+
Build the nginx map block by scanning all manifests.
|
|
111
|
+
Routes are sorted by specificity (longest path first) to ensure proper matching.
|
|
112
|
+
Uses flexible matching to handle both /order/ and /orders paths.
|
|
113
|
+
"""
|
|
114
|
+
routing_map, default_backend = get_backend_routing_map(frontend_manifest)
|
|
115
|
+
|
|
116
|
+
sorted_patterns = sorted(routing_map.keys(), key=len, reverse=True)
|
|
117
|
+
|
|
118
|
+
lines = [
|
|
119
|
+
' # Auto-discovered backend routing map (referer-based context routing)',
|
|
120
|
+
' map $http_referer $api_backend {'
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
for pattern in sorted_patterns:
|
|
124
|
+
backend = routing_map[pattern]
|
|
125
|
+
backend_url = 'http://{}:{}'.format(backend['name'], backend['port'])
|
|
126
|
+
lines.append(' ~*{} {};'.format(pattern, backend_url))
|
|
127
|
+
|
|
128
|
+
if default_backend:
|
|
129
|
+
default_url = 'http://{}:{}'.format(default_backend['name'], default_backend['port'])
|
|
130
|
+
lines.append(' default {};'.format(default_url))
|
|
131
|
+
elif frontend_manifest != None and frontend_manifest.get('backendName'):
|
|
132
|
+
backend_name = frontend_manifest.get('backendName')
|
|
133
|
+
backend_port = _get_backend_port(backend_name, 4000)
|
|
134
|
+
lines.append(' default http://{}:{};'.format(backend_name, backend_port))
|
|
135
|
+
else:
|
|
136
|
+
# No hardcoded fallback - backendName must be specified in manifest
|
|
137
|
+
lines.append(' default http://backend-not-configured:4000;')
|
|
138
|
+
|
|
139
|
+
lines.append(' }')
|
|
140
|
+
|
|
141
|
+
return '\n'.join(lines)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
ApiGateway = struct(
|
|
145
|
+
get_backend_routing_map = get_backend_routing_map,
|
|
146
|
+
build_referer_map_block = build_referer_map_block,
|
|
147
|
+
)
|