@tdk-landscape/tdk-cli-core 1.3.45 → 1.3.49
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/.github/workflows/release-binaries.yml +54 -0
- package/.pre-commit-config.yaml +57 -0
- package/Makefile +92 -0
- package/bun.lock +538 -0
- package/cli/AGENTS.md +390 -0
- package/cli/DESIGN.md +735 -0
- package/cli/biome.json +44 -0
- package/cli/dependency-graph.svg +1135 -0
- package/cli/knip.json +6 -0
- package/cli/package.json +77 -0
- package/cli/pnpm-lock.yaml +2305 -0
- package/cli/pnpm-workspace.yaml +2 -0
- package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +23 -0
- package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +464 -0
- package/cli/shared-platform-engineering/docker-templates/install-deps.sh +152 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +12 -0
- package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +56 -0
- package/{dist/cli.js → cli/src/cli.ts} +21 -13
- package/cli/src/commands/__tests__/always-enabled-infra.test.ts +115 -0
- package/cli/src/commands/__tests__/config.test.ts +146 -0
- package/cli/src/commands/__tests__/doctor.test.ts +557 -0
- package/cli/src/commands/__tests__/error-handling.test.ts +78 -0
- package/cli/src/commands/__tests__/phases-model.test.ts +163 -0
- package/cli/src/commands/__tests__/project-resource-features-e2e.test.ts +207 -0
- package/cli/src/commands/__tests__/project.test.ts +68 -0
- package/cli/src/commands/__tests__/resource.test.ts +226 -0
- package/cli/src/commands/__tests__/saas-starter-integration.test.ts +196 -0
- package/cli/src/commands/__tests__/stack-features-e2e.test.ts +129 -0
- package/cli/src/commands/__tests__/upgrade.test.ts +101 -0
- package/{dist/commands/completion.js → cli/src/commands/completion.ts} +78 -72
- package/cli/src/commands/config.ts +299 -0
- package/cli/src/commands/doctor.ts +790 -0
- package/cli/src/commands/down.ts +37 -0
- package/cli/src/commands/help.ts +150 -0
- package/cli/src/commands/networks-design.md +80 -0
- package/cli/src/commands/networks.ts +332 -0
- package/cli/src/commands/project.ts +439 -0
- package/cli/src/commands/projects.ts +82 -0
- package/cli/src/commands/resource.ts +652 -0
- package/cli/src/commands/resources.ts +95 -0
- package/cli/src/commands/stack.ts +128 -0
- package/cli/src/commands/stacks.ts +52 -0
- package/cli/src/commands/status.ts +88 -0
- package/cli/src/commands/ui.tsx +843 -0
- package/cli/src/commands/up.ts +150 -0
- package/cli/src/commands/upgrade.ts +570 -0
- package/{dist/commands/version.js → cli/src/commands/version.ts} +5 -5
- package/cli/src/components/Accessible.tsx +21 -0
- package/cli/src/components/BaseTooltip.tsx +66 -0
- package/cli/src/components/DetailPanel.tsx +146 -0
- package/cli/src/components/FileTree.tsx +89 -0
- package/cli/src/components/ResourceSelectInput.tsx +30 -0
- package/cli/src/components/ResourceTable.tsx +78 -0
- package/cli/src/components/TabBar.tsx +53 -0
- package/cli/src/components/Tooltip.tsx +11 -0
- package/{dist/components/index.js → cli/src/components/index.ts} +0 -1
- package/cli/src/config/platform-standards.test.ts +11 -0
- package/cli/src/config/platform-standards.ts +196 -0
- package/cli/src/generator/__tests__/extension-fetch.test.ts +220 -0
- package/cli/src/generator/__tests__/template-engine.test.ts +70 -0
- package/cli/src/generator/extension-fetch.ts +279 -0
- package/cli/src/generator/template-engine.ts +754 -0
- package/cli/src/index.ts +86 -0
- package/cli/src/templates.d.ts +4 -0
- package/cli/src/types/index.ts +351 -0
- package/cli/src/utils/__tests__/cache.test.ts +98 -0
- package/cli/src/utils/__tests__/formatting.test.ts +170 -0
- package/cli/src/utils/__tests__/paths.test.ts +180 -0
- package/cli/src/utils/__tests__/port-assignment.test.ts +121 -0
- package/cli/src/utils/__tests__/service-urls.test.ts +174 -0
- package/cli/src/utils/__tests__/services.test.ts +531 -0
- package/cli/src/utils/__tests__/tilt.test.ts +143 -0
- package/cli/src/utils/__tests__/validation.test.ts +148 -0
- package/cli/src/utils/cache.ts +76 -0
- package/cli/src/utils/command-helpers.ts +54 -0
- package/cli/src/utils/constants.ts +126 -0
- package/cli/src/utils/discovery-context.ts +49 -0
- package/cli/src/utils/docker.ts +20 -0
- package/cli/src/utils/doctor-runtime.ts +604 -0
- package/cli/src/utils/env-validator.ts +139 -0
- package/cli/src/utils/errors.ts +168 -0
- package/cli/src/utils/file-helpers.ts +62 -0
- package/cli/src/utils/formatting.ts +215 -0
- package/cli/src/utils/paths.ts +53 -0
- package/cli/src/utils/port-assignment.ts +106 -0
- package/cli/src/utils/project-features.ts +118 -0
- package/cli/src/utils/project-templates.ts +28 -0
- package/cli/src/utils/prompt.ts +123 -0
- package/cli/src/utils/resource-features.ts +209 -0
- package/cli/src/utils/service-urls.ts +124 -0
- package/cli/src/utils/services.ts +363 -0
- package/cli/src/utils/stack-features.ts +30 -0
- package/cli/src/utils/tar.ts +24 -0
- package/cli/src/utils/tilt.ts +113 -0
- package/cli/src/utils/validation.ts +67 -0
- package/{templates → cli/templates}/Tiltfile.hbs +1 -1
- package/cli/tsconfig.json +25 -0
- package/cli/tsconfig.typecheck.json +8 -0
- package/docs/FEATURES.md +279 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +3 -3
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +1 -1
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +0 -3
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +1 -1
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +1 -1
- package/engine/topologies/platform/docker/secrets/infisical.star +19 -47
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +1 -1
- package/install.sh +242 -0
- package/knip.json +10 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/.openspec.yaml +2 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/design.md +102 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/proposal.md +31 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-notifications/spec.md +48 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-orchestration/spec.md +63 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/specs/vscode-tdk-troubleshooting/spec.md +56 -0
- package/openspec/changes/add-vscode-tdk-troubleshooter-plugin/tasks.md +61 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/.openspec.yaml +2 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/design.md +114 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/proposal.md +32 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/manifest-field-migration/spec.md +20 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/resource-terminology-standard/spec.md +20 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/specs/stack-terminology-standard/spec.md +20 -0
- package/openspec/changes/archive/2026-04-28-rename-domain-to-stack-service-to-resource/tasks.md +194 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/.openspec.yaml +2 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/design.md +111 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/proposal.md +33 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/function-naming-alignment/spec.md +12 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/optional-parameter-patterns/spec.md +18 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-documentation/spec.md +16 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-naming-consistency/spec.md +12 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/specs/parameter-ordering-standard/spec.md +12 -0
- package/openspec/changes/archive/2026-04-28-star-files-parameter-fixes/tasks.md +194 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/.openspec.yaml +2 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/codebase-audit-report.md +62 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/design.md +84 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/proposal.md +31 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/codebase-audit/spec.md +27 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/dead-code-cleanup/spec.md +27 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/test-gap-fill/spec.md +23 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/specs/todo-resolution/spec.md +27 -0
- package/openspec/changes/archive/2026-04-29-scan-repo-gaps-fix/tasks.md +39 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/.openspec.yaml +5 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/design.md +94 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/proposal.md +46 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/ai-slop-cleanup/CLEANUP_REPORT_8.md +174 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/ai-slop-cleanup/CRITICAL_ASSESSMENT_8.md +160 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/circular-deps/CRITICAL_ASSESSMENT_4.md +381 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/dead-code/CRITICAL_ASSESSMENT_3.md +316 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/deduplication/CRITICAL_ASSESSMENT_1.md +290 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/deduplication/IMPLEMENTATION_SUMMARY_1.md +233 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/defensive-cleanup/CRITICAL_ASSESSMENT_6.md +835 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/legacy-cleanup/CRITICAL_ASSESSMENT_7.md +254 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/legacy-cleanup/IMPLEMENTATION_SUMMARY_7.md +187 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/strong-typing/CRITICAL_ASSESSMENT_5.md +269 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/type-consolidation/CRITICAL_ASSESSMENT_2.md +312 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/specs/type-consolidation/IMPLEMENTATION_SUMMARY.md +170 -0
- package/openspec/changes/archive/2026-05-04-comprehensive-cleanup-final/tasks.md +137 -0
- package/openspec/changes/archive/2026-06-25-landscape-consolidation/.openspec.yaml +2 -0
- package/openspec/changes/archive/2026-06-25-landscape-consolidation/design.md +80 -0
- package/openspec/changes/archive/2026-06-25-landscape-consolidation/proposal.md +40 -0
- package/openspec/changes/archive/2026-06-25-landscape-consolidation/spec.md +52 -0
- package/openspec/changes/archive/2026-06-25-landscape-consolidation/tasks.md +51 -0
- package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/.openspec.yaml +2 -0
- package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/design.md +43 -0
- package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/proposal.md +29 -0
- package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/specs/self-contained-generated-projects/spec.md +67 -0
- package/openspec/changes/archive/2026-09-17-fix-generated-stack-boot/tasks.md +27 -0
- package/openspec/specs/manifest-field-migration/spec.md +24 -0
- package/openspec/specs/resource-terminology-standard/spec.md +24 -0
- package/openspec/specs/self-contained-generated-projects/spec.md +67 -0
- package/openspec/specs/stack-terminology-standard/spec.md +24 -0
- package/package.json +27 -64
- package/platform/services/platform/proxy/service.yaml +14 -0
- package/scripts/audit-codebase.sh +213 -0
- package/scripts/install-git-hooks.sh +14 -0
- package/scripts/release-binaries.sh +94 -0
- package/scripts/setup-pre-commit.sh +33 -0
- package/scripts/stage-npm-engine.sh +36 -0
- package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +23 -0
- package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +464 -0
- package/shared-platform-engineering/docker-templates/install-deps.sh +152 -0
- package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +12 -0
- package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +56 -0
- package/tests/tilt-engine/__init__.py +5 -0
- package/tests/tilt-engine/conftest.py +182 -0
- package/tests/tilt-engine/fixtures/appointment-frontend-service.json +11 -0
- package/tests/tilt-engine/fixtures/identity-backend-service.json +12 -0
- package/tests/tilt-engine/fixtures/invalid-service.json +4 -0
- package/tests/tilt-engine/test_agents_md_generator.py +341 -0
- package/tests/tilt-engine/test_agents_md_integration.py +378 -0
- package/tests/tilt-engine/test_cache_operations.py +181 -0
- package/tests/tilt-engine/test_cache_persistence.py +142 -0
- package/tests/tilt-engine/test_code_executor.py +152 -0
- package/tests/tilt-engine/test_code_viewer.py +127 -0
- package/tests/tilt-engine/test_compose_port_anchors.py +310 -0
- package/tests/tilt-engine/test_config_inspector.py +162 -0
- package/tests/tilt-engine/test_daemon_focus_mode.py +89 -0
- package/tests/tilt-engine/test_daemon_polling.py +122 -0
- package/tests/tilt-engine/test_daemon_registration.py +115 -0
- package/tests/tilt-engine/test_daemon_validation.py +107 -0
- package/tests/tilt-engine/test_docker_generator_bugs.py +493 -0
- package/tests/tilt-engine/test_docker_prune.py +119 -0
- package/tests/tilt-engine/test_dockerignore_path_bug.py +82 -0
- package/tests/tilt-engine/test_file_browser.py +193 -0
- package/tests/tilt-engine/test_frontend_basepath_manifest.py +27 -0
- package/tests/tilt-engine/test_health_dependencies.py +130 -0
- package/tests/tilt-engine/test_health_endpoints.py +118 -0
- package/tests/tilt-engine/test_health_tilt_ui.py +85 -0
- package/tests/tilt-engine/test_safety_aliases.py +84 -0
- package/tests/tilt-engine/test_snapshot_diff.py +136 -0
- package/tests/tilt-engine/test_snapshot_persistence.py +163 -0
- package/tests/tilt-engine/test_snapshot_scanning.py +123 -0
- package/tests/tilt-engine/test_standalone_project_boot.py +61 -0
- package/tests/tilt-engine/test_standalone_traefik.py +108 -0
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/completion.d.ts +0 -3
- package/dist/commands/completion.d.ts.map +0 -1
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js +0 -231
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -7
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -597
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/down.d.ts +0 -3
- package/dist/commands/down.d.ts.map +0 -1
- package/dist/commands/down.js +0 -32
- package/dist/commands/down.js.map +0 -1
- package/dist/commands/help.d.ts +0 -2
- package/dist/commands/help.d.ts.map +0 -1
- package/dist/commands/help.js +0 -130
- package/dist/commands/help.js.map +0 -1
- package/dist/commands/networks.d.ts +0 -3
- package/dist/commands/networks.d.ts.map +0 -1
- package/dist/commands/networks.js +0 -260
- package/dist/commands/networks.js.map +0 -1
- package/dist/commands/project.d.ts +0 -3
- package/dist/commands/project.d.ts.map +0 -1
- package/dist/commands/project.js +0 -373
- package/dist/commands/project.js.map +0 -1
- package/dist/commands/projects.d.ts +0 -3
- package/dist/commands/projects.d.ts.map +0 -1
- package/dist/commands/projects.js +0 -71
- package/dist/commands/projects.js.map +0 -1
- package/dist/commands/resource.d.ts +0 -69
- package/dist/commands/resource.d.ts.map +0 -1
- package/dist/commands/resource.js +0 -579
- package/dist/commands/resource.js.map +0 -1
- package/dist/commands/resources.d.ts +0 -3
- package/dist/commands/resources.d.ts.map +0 -1
- package/dist/commands/resources.js +0 -73
- package/dist/commands/resources.js.map +0 -1
- package/dist/commands/stack.d.ts +0 -3
- package/dist/commands/stack.d.ts.map +0 -1
- package/dist/commands/stack.js +0 -97
- package/dist/commands/stack.js.map +0 -1
- package/dist/commands/stacks.d.ts +0 -3
- package/dist/commands/stacks.d.ts.map +0 -1
- package/dist/commands/stacks.js +0 -43
- package/dist/commands/stacks.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -71
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/ui.d.ts +0 -3
- package/dist/commands/ui.d.ts.map +0 -1
- package/dist/commands/ui.js +0 -445
- package/dist/commands/ui.js.map +0 -1
- package/dist/commands/up.d.ts +0 -3
- package/dist/commands/up.d.ts.map +0 -1
- package/dist/commands/up.js +0 -110
- package/dist/commands/up.js.map +0 -1
- package/dist/commands/upgrade.d.ts +0 -11
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js +0 -496
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/version.d.ts +0 -3
- package/dist/commands/version.d.ts.map +0 -1
- package/dist/commands/version.js.map +0 -1
- package/dist/components/Accessible.d.ts +0 -8
- package/dist/components/Accessible.d.ts.map +0 -1
- package/dist/components/Accessible.js +0 -10
- package/dist/components/Accessible.js.map +0 -1
- package/dist/components/BaseTooltip.d.ts +0 -4
- package/dist/components/BaseTooltip.d.ts.map +0 -1
- package/dist/components/BaseTooltip.js +0 -28
- package/dist/components/BaseTooltip.js.map +0 -1
- package/dist/components/DetailPanel.d.ts +0 -4
- package/dist/components/DetailPanel.d.ts.map +0 -1
- package/dist/components/DetailPanel.js +0 -18
- package/dist/components/DetailPanel.js.map +0 -1
- package/dist/components/FileTree.d.ts +0 -4
- package/dist/components/FileTree.d.ts.map +0 -1
- package/dist/components/FileTree.js +0 -47
- package/dist/components/FileTree.js.map +0 -1
- package/dist/components/ResourceSelectInput.d.ts +0 -4
- package/dist/components/ResourceSelectInput.d.ts.map +0 -1
- package/dist/components/ResourceSelectInput.js +0 -7
- package/dist/components/ResourceSelectInput.js.map +0 -1
- package/dist/components/ResourceTable.d.ts +0 -4
- package/dist/components/ResourceTable.d.ts.map +0 -1
- package/dist/components/ResourceTable.js +0 -18
- package/dist/components/ResourceTable.js.map +0 -1
- package/dist/components/TabBar.d.ts +0 -4
- package/dist/components/TabBar.d.ts.map +0 -1
- package/dist/components/TabBar.js +0 -17
- package/dist/components/TabBar.js.map +0 -1
- package/dist/components/Tooltip.d.ts +0 -12
- package/dist/components/Tooltip.d.ts.map +0 -1
- package/dist/components/Tooltip.js +0 -12
- package/dist/components/Tooltip.js.map +0 -1
- package/dist/components/index.d.ts +0 -8
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/config/platform-standards.d.ts +0 -159
- package/dist/config/platform-standards.d.ts.map +0 -1
- package/dist/config/platform-standards.js +0 -181
- package/dist/config/platform-standards.js.map +0 -1
- package/dist/generator/extension-fetch.d.ts +0 -25
- package/dist/generator/extension-fetch.d.ts.map +0 -1
- package/dist/generator/extension-fetch.js +0 -252
- package/dist/generator/extension-fetch.js.map +0 -1
- package/dist/generator/template-engine.d.ts +0 -61
- package/dist/generator/template-engine.d.ts.map +0 -1
- package/dist/generator/template-engine.js +0 -557
- package/dist/generator/template-engine.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -255
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -17
- package/dist/types/index.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -19
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -64
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/command-helpers.d.ts +0 -17
- package/dist/utils/command-helpers.d.ts.map +0 -1
- package/dist/utils/command-helpers.js +0 -41
- package/dist/utils/command-helpers.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -52
- package/dist/utils/constants.d.ts.map +0 -1
- package/dist/utils/constants.js +0 -112
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/discovery-context.d.ts +0 -4
- package/dist/utils/discovery-context.d.ts.map +0 -1
- package/dist/utils/discovery-context.js +0 -39
- package/dist/utils/discovery-context.js.map +0 -1
- package/dist/utils/docker.d.ts +0 -4
- package/dist/utils/docker.d.ts.map +0 -1
- package/dist/utils/docker.js +0 -19
- package/dist/utils/docker.js.map +0 -1
- package/dist/utils/doctor-runtime.d.ts +0 -66
- package/dist/utils/doctor-runtime.d.ts.map +0 -1
- package/dist/utils/doctor-runtime.js +0 -469
- package/dist/utils/doctor-runtime.js.map +0 -1
- package/dist/utils/env-validator.d.ts +0 -15
- package/dist/utils/env-validator.d.ts.map +0 -1
- package/dist/utils/env-validator.js +0 -109
- package/dist/utils/env-validator.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -31
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -140
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/file-helpers.d.ts +0 -14
- package/dist/utils/file-helpers.d.ts.map +0 -1
- package/dist/utils/file-helpers.js +0 -45
- package/dist/utils/file-helpers.js.map +0 -1
- package/dist/utils/formatting.d.ts +0 -30
- package/dist/utils/formatting.d.ts.map +0 -1
- package/dist/utils/formatting.js +0 -164
- package/dist/utils/formatting.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -3
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -41
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/port-assignment.d.ts +0 -6
- package/dist/utils/port-assignment.d.ts.map +0 -1
- package/dist/utils/port-assignment.js +0 -81
- package/dist/utils/port-assignment.js.map +0 -1
- package/dist/utils/project-features.d.ts +0 -23
- package/dist/utils/project-features.d.ts.map +0 -1
- package/dist/utils/project-features.js +0 -98
- package/dist/utils/project-features.js.map +0 -1
- package/dist/utils/project-templates.d.ts +0 -7
- package/dist/utils/project-templates.d.ts.map +0 -1
- package/dist/utils/project-templates.js +0 -24
- package/dist/utils/project-templates.js.map +0 -1
- package/dist/utils/prompt.d.ts +0 -28
- package/dist/utils/prompt.d.ts.map +0 -1
- package/dist/utils/prompt.js +0 -79
- package/dist/utils/prompt.js.map +0 -1
- package/dist/utils/resource-features.d.ts +0 -29
- package/dist/utils/resource-features.d.ts.map +0 -1
- package/dist/utils/resource-features.js +0 -171
- package/dist/utils/resource-features.js.map +0 -1
- package/dist/utils/service-urls.d.ts +0 -30
- package/dist/utils/service-urls.d.ts.map +0 -1
- package/dist/utils/service-urls.js +0 -93
- package/dist/utils/service-urls.js.map +0 -1
- package/dist/utils/services.d.ts +0 -18
- package/dist/utils/services.d.ts.map +0 -1
- package/dist/utils/services.js +0 -291
- package/dist/utils/services.js.map +0 -1
- package/dist/utils/stack-features.d.ts +0 -22
- package/dist/utils/stack-features.d.ts.map +0 -1
- package/dist/utils/stack-features.js +0 -13
- package/dist/utils/stack-features.js.map +0 -1
- package/dist/utils/tar.d.ts +0 -7
- package/dist/utils/tar.d.ts.map +0 -1
- package/dist/utils/tar.js +0 -21
- package/dist/utils/tar.js.map +0 -1
- package/dist/utils/tilt.d.ts +0 -19
- package/dist/utils/tilt.d.ts.map +0 -1
- package/dist/utils/tilt.js +0 -78
- package/dist/utils/tilt.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -16
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -58
- package/dist/utils/validation.js.map +0 -1
- /package/{README.md → cli/README.md} +0 -0
- /package/{bin → cli/bin}/tdk.js +0 -0
- /package/{templates → cli/templates}/.tiltignore.hbs +0 -0
- /package/{templates → cli/templates}/TILT_RESOURCE_DEFAULTS.star.hbs +0 -0
- /package/{templates → cli/templates}/TILT_TECH_STACK.star.hbs +0 -0
- /package/{templates → cli/templates}/spec.master.hbs +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { VALID_RESOURCE_TYPES } from "../constants.js";
|
|
3
|
+
import {
|
|
4
|
+
createKebabCaseValidator,
|
|
5
|
+
isValidPort,
|
|
6
|
+
sanitizeForShell,
|
|
7
|
+
validateOptionalInfraService,
|
|
8
|
+
validateResourceName,
|
|
9
|
+
} from "../validation.js";
|
|
10
|
+
|
|
11
|
+
describe("validateResourceName", () => {
|
|
12
|
+
it("should validate correct kebab-case names", () => {
|
|
13
|
+
expect(validateResourceName("my-service")).toEqual({ valid: true });
|
|
14
|
+
expect(validateResourceName("service123")).toEqual({ valid: true });
|
|
15
|
+
expect(validateResourceName("api-gateway")).toEqual({ valid: true });
|
|
16
|
+
expect(validateResourceName("a")).toEqual({ valid: true });
|
|
17
|
+
expect(validateResourceName("test-123-abc")).toEqual({ valid: true });
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should reject empty names", () => {
|
|
21
|
+
const result = validateResourceName("");
|
|
22
|
+
expect(result.valid).toBe(false);
|
|
23
|
+
expect(result.error).toContain("required");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("should reject whitespace-only names", () => {
|
|
27
|
+
const result = validateResourceName(" ");
|
|
28
|
+
expect(result.valid).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should reject camelCase", () => {
|
|
32
|
+
expect(validateResourceName("myService").valid).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should reject underscores", () => {
|
|
36
|
+
expect(validateResourceName("my_service").valid).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should reject uppercase letters", () => {
|
|
40
|
+
expect(validateResourceName("My-Service").valid).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should reject spaces", () => {
|
|
44
|
+
expect(validateResourceName("my service").valid).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should reject dots", () => {
|
|
48
|
+
expect(validateResourceName("my.service").valid).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe("createKebabCaseValidator", () => {
|
|
53
|
+
it("should return true for valid resource names", () => {
|
|
54
|
+
const validator = createKebabCaseValidator("resource");
|
|
55
|
+
expect(validator("my-resource")).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should return error for empty resource name", () => {
|
|
59
|
+
const validator = createKebabCaseValidator("resource");
|
|
60
|
+
expect(validator("")).toBe("Resource name is required");
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should return error for invalid resource name", () => {
|
|
64
|
+
const validator = createKebabCaseValidator("resource");
|
|
65
|
+
expect(validator("MyResource")).toBe("Use lowercase letters, numbers, and hyphens only");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("should return error for empty stack name", () => {
|
|
69
|
+
const validator = createKebabCaseValidator("stack");
|
|
70
|
+
expect(validator("")).toBe("Stack name is required");
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should return error for invalid stack name", () => {
|
|
74
|
+
const validator = createKebabCaseValidator("stack");
|
|
75
|
+
expect(validator("MyStack")).toBe("Use kebab-case (lowercase, numbers, hyphens only)");
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe("validateOptionalInfraService", () => {
|
|
80
|
+
it("should accept valid infra services", () => {
|
|
81
|
+
expect(validateOptionalInfraService("monitoring").valid).toBe(true);
|
|
82
|
+
expect(validateOptionalInfraService("elk").valid).toBe(true);
|
|
83
|
+
expect(validateOptionalInfraService("debezium").valid).toBe(true);
|
|
84
|
+
expect(validateOptionalInfraService("golden_image").valid).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("should reject invalid infra services", () => {
|
|
88
|
+
const result = validateOptionalInfraService("redis");
|
|
89
|
+
expect(result.valid).toBe(false);
|
|
90
|
+
expect(result.error).toContain("Invalid service");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should reject empty string", () => {
|
|
94
|
+
expect(validateOptionalInfraService("").valid).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("isValidPort", () => {
|
|
99
|
+
it("should accept valid ports", () => {
|
|
100
|
+
expect(isValidPort(1)).toBe(true);
|
|
101
|
+
expect(isValidPort(1024)).toBe(true);
|
|
102
|
+
expect(isValidPort(3000)).toBe(true);
|
|
103
|
+
expect(isValidPort(8080)).toBe(true);
|
|
104
|
+
expect(isValidPort(65535)).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("should reject port 0", () => {
|
|
108
|
+
expect(isValidPort(0)).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("should reject negative ports", () => {
|
|
112
|
+
expect(isValidPort(-1)).toBe(false);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("should reject ports > 65535", () => {
|
|
116
|
+
expect(isValidPort(65536)).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("should reject NaN", () => {
|
|
120
|
+
expect(isValidPort(NaN)).toBe(false);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("should reject non-integer ports", () => {
|
|
124
|
+
expect(isValidPort(80.5)).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe("sanitizeForShell", () => {
|
|
129
|
+
it("should replace special characters", () => {
|
|
130
|
+
expect(sanitizeForShell("hello$world")).toBe("hello_world");
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("should keep alphanumeric and hyphens", () => {
|
|
134
|
+
expect(sanitizeForShell("my-service-123")).toBe("my-service-123");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("should limit output to 100 chars", () => {
|
|
138
|
+
const long = "a".repeat(200);
|
|
139
|
+
expect(sanitizeForShell(long).length).toBe(100);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe("VALID_RESOURCE_TYPES", () => {
|
|
144
|
+
it("should include all expected types", () => {
|
|
145
|
+
const expected = ["backend", "frontend", "library", "sdk", "worker", "migrator"];
|
|
146
|
+
expect(VALID_RESOURCE_TYPES.sort()).toEqual(expected.sort());
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CacheEntry, CacheOptions } from "../types/index.js";
|
|
2
|
+
|
|
3
|
+
export class Cache<T> {
|
|
4
|
+
private data: Map<string, CacheEntry<T>>;
|
|
5
|
+
private options: CacheOptions;
|
|
6
|
+
|
|
7
|
+
constructor(options: CacheOptions) {
|
|
8
|
+
this.data = new Map();
|
|
9
|
+
this.options = options;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
has(key: string): boolean {
|
|
13
|
+
const entry = this.data.get(key);
|
|
14
|
+
if (!entry) return false;
|
|
15
|
+
|
|
16
|
+
const isExpired = Date.now() - entry.timestamp > this.options.ttlMs;
|
|
17
|
+
if (isExpired) {
|
|
18
|
+
this.data.delete(key);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
get(key: string): T | undefined {
|
|
26
|
+
if (!this.has(key)) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return this.data.get(key)?.value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
set(key: string, value: T): void {
|
|
33
|
+
this.data.set(key, {
|
|
34
|
+
value,
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
delete(key: string): void {
|
|
40
|
+
this.data.delete(key);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
clear(): void {
|
|
44
|
+
this.data.clear();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
keys(): string[] {
|
|
48
|
+
const validKeys: string[] = [];
|
|
49
|
+
for (const key of this.data.keys()) {
|
|
50
|
+
if (this.has(key)) {
|
|
51
|
+
validKeys.push(key);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return validKeys;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
size(): number {
|
|
58
|
+
return this.keys().length;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function createCacheValidator(ttlMs: number) {
|
|
63
|
+
let lastUpdated = 0;
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
isValid(): boolean {
|
|
67
|
+
return Date.now() - lastUpdated < ttlMs;
|
|
68
|
+
},
|
|
69
|
+
markUpdated(): void {
|
|
70
|
+
lastUpdated = Date.now();
|
|
71
|
+
},
|
|
72
|
+
reset(): void {
|
|
73
|
+
lastUpdated = 0;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ValidationResult } from "../types/index.js";
|
|
2
|
+
import { showErrorAndExit } from "./errors.js";
|
|
3
|
+
import { showCancelled } from "./formatting.js";
|
|
4
|
+
import { promptConfirm } from "./prompt.js";
|
|
5
|
+
|
|
6
|
+
export async function confirmAction(message: string, defaultValue = true): Promise<boolean> {
|
|
7
|
+
const confirm = await promptConfirm({ message, initial: defaultValue });
|
|
8
|
+
|
|
9
|
+
if (!confirm) {
|
|
10
|
+
showCancelled();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return confirm;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function assertValid(
|
|
17
|
+
validation: ValidationResult,
|
|
18
|
+
exitCode: number = 1,
|
|
19
|
+
): asserts validation is { valid: true } {
|
|
20
|
+
if (!validation.valid) {
|
|
21
|
+
showErrorAndExit(validation.error ?? "Validation failed", exitCode);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function handleDryRun(
|
|
26
|
+
options: { dryRun?: boolean },
|
|
27
|
+
description: string,
|
|
28
|
+
command: string,
|
|
29
|
+
): boolean {
|
|
30
|
+
if (options.dryRun) {
|
|
31
|
+
console.log(`Dry run - ${description}`);
|
|
32
|
+
console.log(`Would run: ${command}`);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Prompt for confirmation with cancellation handling.
|
|
40
|
+
* Displays a confirmation prompt and exits/cancels if user declines.
|
|
41
|
+
* @param message - The confirmation message to display
|
|
42
|
+
* @param onCancel - Optional callback when user cancels (defaults to returning false)
|
|
43
|
+
* @returns Promise<boolean> - true if confirmed, false if cancelled (with callback)
|
|
44
|
+
*/
|
|
45
|
+
export async function confirmOrCancel(message: string, onCancel?: () => void): Promise<boolean> {
|
|
46
|
+
const confirmed = await confirmAction(message, true);
|
|
47
|
+
if (!confirmed) {
|
|
48
|
+
if (onCancel) {
|
|
49
|
+
onCancel();
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { ResourceType } from "../types/index.js";
|
|
2
|
+
|
|
3
|
+
export const MASTER_CONFIG_FILES = [
|
|
4
|
+
"TILT_TECH_STACK.star",
|
|
5
|
+
"TILT_RESOURCE_DEFAULTS.star",
|
|
6
|
+
"spec.master",
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
9
|
+
export const VALID_RESOURCE_TYPES: ResourceType[] = [
|
|
10
|
+
"backend",
|
|
11
|
+
"frontend",
|
|
12
|
+
"library",
|
|
13
|
+
"sdk",
|
|
14
|
+
"worker",
|
|
15
|
+
"migrator",
|
|
16
|
+
] as const;
|
|
17
|
+
|
|
18
|
+
// Frontend/library/sdk services are served statically or consumed as
|
|
19
|
+
// packages, so they never need a "start" script - only backend/worker/
|
|
20
|
+
// migrator processes are run in production via `<runtime> run start`.
|
|
21
|
+
export const REQUIRED_PACKAGE_SCRIPTS: Record<ResourceType, readonly string[]> = {
|
|
22
|
+
backend: ["dev", "build", "start"],
|
|
23
|
+
worker: ["dev", "build", "start"],
|
|
24
|
+
migrator: ["dev", "build", "start"],
|
|
25
|
+
frontend: ["dev", "build"],
|
|
26
|
+
library: ["dev", "build"],
|
|
27
|
+
sdk: ["dev", "build"],
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
export const OPTIONAL_INFRA_SERVICES = [
|
|
31
|
+
"monitoring",
|
|
32
|
+
"elk",
|
|
33
|
+
"debezium",
|
|
34
|
+
"golden_image",
|
|
35
|
+
"verdaccio",
|
|
36
|
+
] as const;
|
|
37
|
+
|
|
38
|
+
export const PORT_RANGES = {
|
|
39
|
+
frontend: { base: 3000, min: 3000, max: 3999, range: "3000-3999" as const },
|
|
40
|
+
backend: { base: 4000, min: 4000, max: 4999, range: "4000-4999" as const },
|
|
41
|
+
worker: { base: 6000, min: 6000, max: 6999, range: "6000-6999" as const },
|
|
42
|
+
health: { base: 5000, min: 5000, max: 5999, range: "5000-5999" as const },
|
|
43
|
+
migrator: { base: 7000, min: 7000, max: 7999, range: "7000-7999" as const },
|
|
44
|
+
} as const;
|
|
45
|
+
|
|
46
|
+
export const STANDARD_PORTS = {
|
|
47
|
+
tiltUi: 10350,
|
|
48
|
+
traefik: 8080,
|
|
49
|
+
} as const;
|
|
50
|
+
|
|
51
|
+
export const QUICKSTART_DOCS_URL = "https://tdk-landscape.github.io/tdk-website/docs/quickstart/";
|
|
52
|
+
|
|
53
|
+
export const BASE_DOMAIN_DEFAULT = "beauty-crm.localhost";
|
|
54
|
+
export const APP_SUBDOMAIN_PREFIX = "app";
|
|
55
|
+
export const API_SUBDOMAIN_PREFIX = "api";
|
|
56
|
+
|
|
57
|
+
export function getBaseDomain(): string {
|
|
58
|
+
const override = process.env.TDK_SERVICE_BASE_URL ?? process.env.TDK_PUBLIC_HOST;
|
|
59
|
+
if (override) {
|
|
60
|
+
try {
|
|
61
|
+
const u = new URL(override.includes("://") ? override : `http://${override}`);
|
|
62
|
+
return u.hostname;
|
|
63
|
+
} catch {
|
|
64
|
+
return override.replace(/^https?:\/\//, "").split("/")[0];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return BASE_DOMAIN_DEFAULT;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function frontendBaseUrl(protocol = "http"): string {
|
|
71
|
+
return `${protocol}://${APP_SUBDOMAIN_PREFIX}.${getBaseDomain()}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function apiBaseUrl(protocol = "http"): string {
|
|
75
|
+
return `${protocol}://${API_SUBDOMAIN_PREFIX}.${getBaseDomain()}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export const SKIP_DIRECTORIES = [
|
|
79
|
+
"node_modules",
|
|
80
|
+
".git",
|
|
81
|
+
".tilt",
|
|
82
|
+
".tilt-engine",
|
|
83
|
+
"dist",
|
|
84
|
+
"build",
|
|
85
|
+
".prisma",
|
|
86
|
+
".turbo",
|
|
87
|
+
"coverage",
|
|
88
|
+
"tmp",
|
|
89
|
+
"temp",
|
|
90
|
+
"__tests__",
|
|
91
|
+
"test",
|
|
92
|
+
"tests",
|
|
93
|
+
".github",
|
|
94
|
+
".vscode",
|
|
95
|
+
"docs",
|
|
96
|
+
] as const;
|
|
97
|
+
|
|
98
|
+
export const AUTOGENERATED_FILE_PATTERNS = [
|
|
99
|
+
"Dockerfile",
|
|
100
|
+
"docker-compose.yml",
|
|
101
|
+
"docker-compose.yaml",
|
|
102
|
+
"Tiltfile",
|
|
103
|
+
"vite.config.ts",
|
|
104
|
+
"tsconfig.json",
|
|
105
|
+
"tsconfig.build.json",
|
|
106
|
+
] as const;
|
|
107
|
+
|
|
108
|
+
// Stack emojis - generic, no hardcoded service names
|
|
109
|
+
// Users can add their own stack emojis via project config
|
|
110
|
+
const STACK_EMOJIS: Record<string, string> = {
|
|
111
|
+
infra: "🏗️",
|
|
112
|
+
core: "🔧",
|
|
113
|
+
api: "⚡",
|
|
114
|
+
app: "🎨",
|
|
115
|
+
orchestrator: "⚙️",
|
|
116
|
+
} as const;
|
|
117
|
+
|
|
118
|
+
export function getStackEmoji(stackName: string): string {
|
|
119
|
+
const lowerName = stackName.toLowerCase();
|
|
120
|
+
for (const [key, emoji] of Object.entries(STACK_EMOJIS)) {
|
|
121
|
+
if (lowerName.includes(key)) {
|
|
122
|
+
return emoji;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return "📦";
|
|
126
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { DiscoveredResource, DiscoveryContext } from "../types/index.js";
|
|
2
|
+
import { createCacheValidator } from "./cache.js";
|
|
3
|
+
import { discoverResources, discoverStacks, getAllStacks } from "./services.js";
|
|
4
|
+
|
|
5
|
+
let cachedContext: DiscoveryContext | null = null;
|
|
6
|
+
const cacheValidator = createCacheValidator(1000);
|
|
7
|
+
|
|
8
|
+
export function clearDiscoveryCache(): void {
|
|
9
|
+
cachedContext = null;
|
|
10
|
+
cacheValidator.reset();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function isCacheValid(): boolean {
|
|
14
|
+
return cachedContext !== null && cacheValidator.isValid();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function createDiscoveryContext(forceRefresh = false): DiscoveryContext {
|
|
18
|
+
if (!forceRefresh && isCacheValid() && cachedContext) {
|
|
19
|
+
return cachedContext;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const resources = discoverResources();
|
|
23
|
+
const stacks = discoverStacks();
|
|
24
|
+
const stackNames = getAllStacks(resources);
|
|
25
|
+
|
|
26
|
+
const unassignedResources = resources.filter((r) => !r.stack);
|
|
27
|
+
|
|
28
|
+
const resourcesByStack = new Map<string, DiscoveredResource[]>();
|
|
29
|
+
for (const resource of resources) {
|
|
30
|
+
if (resource.stack) {
|
|
31
|
+
const stackResources = resourcesByStack.get(resource.stack) || [];
|
|
32
|
+
stackResources.push(resource);
|
|
33
|
+
resourcesByStack.set(resource.stack, stackResources);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const context: DiscoveryContext = {
|
|
38
|
+
resources,
|
|
39
|
+
stacks,
|
|
40
|
+
stackNames,
|
|
41
|
+
unassignedResources,
|
|
42
|
+
resourcesByStack,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
cachedContext = context;
|
|
46
|
+
cacheValidator.markUpdated();
|
|
47
|
+
|
|
48
|
+
return context;
|
|
49
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
|
|
3
|
+
// A wedged daemon makes `docker ps` block forever instead of failing.
|
|
4
|
+
const RUNTIME_CHECK_TIMEOUT_MS = 10_000;
|
|
5
|
+
|
|
6
|
+
export type ContainerRuntimeStatus = "running" | "unresponsive" | "missing";
|
|
7
|
+
|
|
8
|
+
/** Whether Docker, Colima, or Podman is reachable, hung, or absent. */
|
|
9
|
+
export function getContainerRuntimeStatus(): ContainerRuntimeStatus {
|
|
10
|
+
let sawTimeout = false;
|
|
11
|
+
for (const command of ["docker ps", "colima status", "podman ps"]) {
|
|
12
|
+
try {
|
|
13
|
+
execSync(command, { stdio: "ignore", timeout: RUNTIME_CHECK_TIMEOUT_MS });
|
|
14
|
+
return "running";
|
|
15
|
+
} catch (err) {
|
|
16
|
+
if ((err as NodeJS.ErrnoException).code === "ETIMEDOUT") sawTimeout = true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return sawTimeout ? "unresponsive" : "missing";
|
|
20
|
+
}
|