solokit 0.1.1__py3-none-any.whl
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.
- solokit/__init__.py +10 -0
- solokit/__version__.py +3 -0
- solokit/cli.py +374 -0
- solokit/core/__init__.py +1 -0
- solokit/core/cache.py +102 -0
- solokit/core/command_runner.py +278 -0
- solokit/core/config.py +453 -0
- solokit/core/config_validator.py +204 -0
- solokit/core/constants.py +291 -0
- solokit/core/error_formatter.py +279 -0
- solokit/core/error_handlers.py +346 -0
- solokit/core/exceptions.py +1567 -0
- solokit/core/file_ops.py +309 -0
- solokit/core/logging_config.py +166 -0
- solokit/core/output.py +99 -0
- solokit/core/performance.py +57 -0
- solokit/core/protocols.py +141 -0
- solokit/core/types.py +312 -0
- solokit/deployment/__init__.py +1 -0
- solokit/deployment/executor.py +411 -0
- solokit/git/__init__.py +1 -0
- solokit/git/integration.py +619 -0
- solokit/init/__init__.py +41 -0
- solokit/init/claude_commands_installer.py +87 -0
- solokit/init/dependency_installer.py +313 -0
- solokit/init/docs_structure.py +90 -0
- solokit/init/env_generator.py +160 -0
- solokit/init/environment_validator.py +334 -0
- solokit/init/git_hooks_installer.py +71 -0
- solokit/init/git_setup.py +188 -0
- solokit/init/gitignore_updater.py +195 -0
- solokit/init/initial_commit.py +145 -0
- solokit/init/initial_scans.py +109 -0
- solokit/init/orchestrator.py +246 -0
- solokit/init/readme_generator.py +207 -0
- solokit/init/session_structure.py +239 -0
- solokit/init/template_installer.py +424 -0
- solokit/learning/__init__.py +1 -0
- solokit/learning/archiver.py +115 -0
- solokit/learning/categorizer.py +126 -0
- solokit/learning/curator.py +428 -0
- solokit/learning/extractor.py +352 -0
- solokit/learning/reporter.py +351 -0
- solokit/learning/repository.py +254 -0
- solokit/learning/similarity.py +342 -0
- solokit/learning/validator.py +144 -0
- solokit/project/__init__.py +1 -0
- solokit/project/init.py +1162 -0
- solokit/project/stack.py +436 -0
- solokit/project/sync_plugin.py +438 -0
- solokit/project/tree.py +375 -0
- solokit/quality/__init__.py +1 -0
- solokit/quality/api_validator.py +424 -0
- solokit/quality/checkers/__init__.py +25 -0
- solokit/quality/checkers/base.py +114 -0
- solokit/quality/checkers/context7.py +221 -0
- solokit/quality/checkers/custom.py +162 -0
- solokit/quality/checkers/deployment.py +323 -0
- solokit/quality/checkers/documentation.py +179 -0
- solokit/quality/checkers/formatting.py +161 -0
- solokit/quality/checkers/integration.py +394 -0
- solokit/quality/checkers/linting.py +159 -0
- solokit/quality/checkers/security.py +261 -0
- solokit/quality/checkers/spec_completeness.py +127 -0
- solokit/quality/checkers/tests.py +184 -0
- solokit/quality/env_validator.py +306 -0
- solokit/quality/gates.py +655 -0
- solokit/quality/reporters/__init__.py +10 -0
- solokit/quality/reporters/base.py +25 -0
- solokit/quality/reporters/console.py +98 -0
- solokit/quality/reporters/json_reporter.py +34 -0
- solokit/quality/results.py +98 -0
- solokit/session/__init__.py +1 -0
- solokit/session/briefing/__init__.py +245 -0
- solokit/session/briefing/documentation_loader.py +53 -0
- solokit/session/briefing/formatter.py +476 -0
- solokit/session/briefing/git_context.py +282 -0
- solokit/session/briefing/learning_loader.py +212 -0
- solokit/session/briefing/milestone_builder.py +78 -0
- solokit/session/briefing/orchestrator.py +137 -0
- solokit/session/briefing/stack_detector.py +51 -0
- solokit/session/briefing/tree_generator.py +52 -0
- solokit/session/briefing/work_item_loader.py +209 -0
- solokit/session/briefing.py +353 -0
- solokit/session/complete.py +1188 -0
- solokit/session/status.py +246 -0
- solokit/session/validate.py +452 -0
- solokit/templates/.claude/commands/end.md +109 -0
- solokit/templates/.claude/commands/init.md +159 -0
- solokit/templates/.claude/commands/learn-curate.md +88 -0
- solokit/templates/.claude/commands/learn-search.md +62 -0
- solokit/templates/.claude/commands/learn-show.md +69 -0
- solokit/templates/.claude/commands/learn.md +136 -0
- solokit/templates/.claude/commands/start.md +114 -0
- solokit/templates/.claude/commands/status.md +22 -0
- solokit/templates/.claude/commands/validate.md +27 -0
- solokit/templates/.claude/commands/work-delete.md +119 -0
- solokit/templates/.claude/commands/work-graph.md +139 -0
- solokit/templates/.claude/commands/work-list.md +26 -0
- solokit/templates/.claude/commands/work-new.md +114 -0
- solokit/templates/.claude/commands/work-next.md +25 -0
- solokit/templates/.claude/commands/work-show.md +24 -0
- solokit/templates/.claude/commands/work-update.md +141 -0
- solokit/templates/CHANGELOG.md +17 -0
- solokit/templates/WORK_ITEM_TYPES.md +141 -0
- solokit/templates/__init__.py +1 -0
- solokit/templates/bug_spec.md +217 -0
- solokit/templates/config.schema.json +150 -0
- solokit/templates/dashboard_refine/base/.gitignore +36 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/layout.tsx +22 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/page.tsx +68 -0
- solokit/templates/dashboard_refine/base/app/(dashboard)/users/page.tsx +77 -0
- solokit/templates/dashboard_refine/base/app/globals.css +60 -0
- solokit/templates/dashboard_refine/base/app/layout.tsx +23 -0
- solokit/templates/dashboard_refine/base/app/page.tsx +9 -0
- solokit/templates/dashboard_refine/base/components/client-refine-wrapper.tsx +21 -0
- solokit/templates/dashboard_refine/base/components/layout/header.tsx +44 -0
- solokit/templates/dashboard_refine/base/components/layout/sidebar.tsx +82 -0
- solokit/templates/dashboard_refine/base/components/ui/button.tsx +53 -0
- solokit/templates/dashboard_refine/base/components/ui/card.tsx +78 -0
- solokit/templates/dashboard_refine/base/components/ui/table.tsx +116 -0
- solokit/templates/dashboard_refine/base/components.json +16 -0
- solokit/templates/dashboard_refine/base/lib/refine.tsx +65 -0
- solokit/templates/dashboard_refine/base/lib/utils.ts +13 -0
- solokit/templates/dashboard_refine/base/next.config.ts +10 -0
- solokit/templates/dashboard_refine/base/package.json.template +40 -0
- solokit/templates/dashboard_refine/base/postcss.config.mjs +8 -0
- solokit/templates/dashboard_refine/base/providers/refine-provider.tsx +26 -0
- solokit/templates/dashboard_refine/base/tailwind.config.ts +57 -0
- solokit/templates/dashboard_refine/base/tsconfig.json +27 -0
- solokit/templates/dashboard_refine/docker/Dockerfile +57 -0
- solokit/templates/dashboard_refine/docker/docker-compose.prod.yml +31 -0
- solokit/templates/dashboard_refine/docker/docker-compose.yml +21 -0
- solokit/templates/dashboard_refine/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/dashboard_refine/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/dashboard_refine/tier-1-essential/package.json.tier1.template +57 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/setup.ts +26 -0
- solokit/templates/dashboard_refine/tier-1-essential/tests/unit/example.test.tsx +73 -0
- solokit/templates/dashboard_refine/tier-2-standard/package.json.tier2.template +62 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/eslint.config.mjs +22 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/package.json.tier3.template +79 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/stryker.conf.json +38 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/dashboard.spec.ts +88 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/user-management.spec.ts +102 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/tests/integration/dashboard.test.tsx +90 -0
- solokit/templates/dashboard_refine/tier-3-comprehensive/type-coverage.json +16 -0
- solokit/templates/dashboard_refine/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/dashboard_refine/tier-4-production/k6/dashboard-load-test.js +70 -0
- solokit/templates/dashboard_refine/tier-4-production/next.config.ts +46 -0
- solokit/templates/dashboard_refine/tier-4-production/package.json.tier4.template +89 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/dashboard_refine/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/deployment_spec.md +500 -0
- solokit/templates/feature_spec.md +248 -0
- solokit/templates/fullstack_nextjs/base/.gitignore +36 -0
- solokit/templates/fullstack_nextjs/base/app/api/example/route.ts +65 -0
- solokit/templates/fullstack_nextjs/base/app/globals.css +27 -0
- solokit/templates/fullstack_nextjs/base/app/layout.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/app/page.tsx +32 -0
- solokit/templates/fullstack_nextjs/base/components/example-component.tsx +20 -0
- solokit/templates/fullstack_nextjs/base/lib/prisma.ts +17 -0
- solokit/templates/fullstack_nextjs/base/lib/utils.ts +13 -0
- solokit/templates/fullstack_nextjs/base/lib/validations.ts +20 -0
- solokit/templates/fullstack_nextjs/base/next.config.ts +7 -0
- solokit/templates/fullstack_nextjs/base/package.json.template +32 -0
- solokit/templates/fullstack_nextjs/base/postcss.config.mjs +8 -0
- solokit/templates/fullstack_nextjs/base/prisma/schema.prisma +21 -0
- solokit/templates/fullstack_nextjs/base/tailwind.config.ts +19 -0
- solokit/templates/fullstack_nextjs/base/tsconfig.json +27 -0
- solokit/templates/fullstack_nextjs/docker/Dockerfile +60 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.prod.yml +57 -0
- solokit/templates/fullstack_nextjs/docker/docker-compose.yml +47 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/package.json.tier1.template +48 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/api/example.test.ts +88 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/fullstack_nextjs/tier-1-essential/tests/unit/example.test.tsx +22 -0
- solokit/templates/fullstack_nextjs/tier-2-standard/package.json.tier2.template +52 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/package.json.tier3.template +68 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/stryker.conf.json +33 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/e2e/flow.spec.ts +59 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/integration/api.test.ts +165 -0
- solokit/templates/fullstack_nextjs/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/fullstack_nextjs/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/fullstack_nextjs/tier-4-production/k6/load-test.js +45 -0
- solokit/templates/fullstack_nextjs/tier-4-production/next.config.ts +46 -0
- solokit/templates/fullstack_nextjs/tier-4-production/package.json.tier4.template +77 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/fullstack_nextjs/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/git-hooks/prepare-commit-msg +24 -0
- solokit/templates/integration_test_spec.md +363 -0
- solokit/templates/learnings.json +15 -0
- solokit/templates/ml_ai_fastapi/base/.gitignore +104 -0
- solokit/templates/ml_ai_fastapi/base/alembic/env.py +96 -0
- solokit/templates/ml_ai_fastapi/base/alembic.ini +114 -0
- solokit/templates/ml_ai_fastapi/base/pyproject.toml.template +91 -0
- solokit/templates/ml_ai_fastapi/base/requirements.txt.template +28 -0
- solokit/templates/ml_ai_fastapi/base/src/__init__.py +5 -0
- solokit/templates/ml_ai_fastapi/base/src/api/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/dependencies.py +20 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/example.py +134 -0
- solokit/templates/ml_ai_fastapi/base/src/api/routes/health.py +66 -0
- solokit/templates/ml_ai_fastapi/base/src/core/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/core/config.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/core/database.py +50 -0
- solokit/templates/ml_ai_fastapi/base/src/main.py +64 -0
- solokit/templates/ml_ai_fastapi/base/src/models/__init__.py +7 -0
- solokit/templates/ml_ai_fastapi/base/src/models/example.py +61 -0
- solokit/templates/ml_ai_fastapi/base/src/services/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/base/src/services/example.py +115 -0
- solokit/templates/ml_ai_fastapi/docker/Dockerfile +59 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.prod.yml +112 -0
- solokit/templates/ml_ai_fastapi/docker/docker-compose.yml +77 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyproject.toml.tier1.template +112 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pyrightconfig.json +41 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/pytest.ini +69 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/requirements-dev.txt +17 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/ruff.toml +81 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/conftest.py +72 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/test_main.py +49 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/test_example.py +113 -0
- solokit/templates/ml_ai_fastapi/tier-2-standard/pyproject.toml.tier2.template +130 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/locustfile.py +99 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/mutmut_config.py +53 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/pyproject.toml.tier3.template +150 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/conftest.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/test_api.py +131 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/pyproject.toml.tier4.template +162 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/requirements-prod.txt +25 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/api/routes/metrics.py +19 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/logging.py +74 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/monitoring.py +68 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/core/sentry.py +66 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/__init__.py +3 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/logging.py +79 -0
- solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/tracing.py +60 -0
- solokit/templates/refactor_spec.md +287 -0
- solokit/templates/saas_t3/base/.gitignore +36 -0
- solokit/templates/saas_t3/base/app/api/trpc/[trpc]/route.ts +33 -0
- solokit/templates/saas_t3/base/app/globals.css +27 -0
- solokit/templates/saas_t3/base/app/layout.tsx +23 -0
- solokit/templates/saas_t3/base/app/page.tsx +31 -0
- solokit/templates/saas_t3/base/lib/api.tsx +77 -0
- solokit/templates/saas_t3/base/lib/utils.ts +13 -0
- solokit/templates/saas_t3/base/next.config.ts +7 -0
- solokit/templates/saas_t3/base/package.json.template +38 -0
- solokit/templates/saas_t3/base/postcss.config.mjs +8 -0
- solokit/templates/saas_t3/base/prisma/schema.prisma +20 -0
- solokit/templates/saas_t3/base/server/api/root.ts +19 -0
- solokit/templates/saas_t3/base/server/api/routers/example.ts +28 -0
- solokit/templates/saas_t3/base/server/api/trpc.ts +52 -0
- solokit/templates/saas_t3/base/server/db.ts +17 -0
- solokit/templates/saas_t3/base/tailwind.config.ts +19 -0
- solokit/templates/saas_t3/base/tsconfig.json +27 -0
- solokit/templates/saas_t3/docker/Dockerfile +60 -0
- solokit/templates/saas_t3/docker/docker-compose.prod.yml +59 -0
- solokit/templates/saas_t3/docker/docker-compose.yml +49 -0
- solokit/templates/saas_t3/tier-1-essential/.eslintrc.json +7 -0
- solokit/templates/saas_t3/tier-1-essential/jest.config.ts +17 -0
- solokit/templates/saas_t3/tier-1-essential/jest.setup.ts +1 -0
- solokit/templates/saas_t3/tier-1-essential/package.json.tier1.template +54 -0
- solokit/templates/saas_t3/tier-1-essential/tests/setup.ts +22 -0
- solokit/templates/saas_t3/tier-1-essential/tests/unit/example.test.tsx +24 -0
- solokit/templates/saas_t3/tier-2-standard/package.json.tier2.template +58 -0
- solokit/templates/saas_t3/tier-3-comprehensive/eslint.config.mjs +39 -0
- solokit/templates/saas_t3/tier-3-comprehensive/package.json.tier3.template +74 -0
- solokit/templates/saas_t3/tier-3-comprehensive/playwright.config.ts +66 -0
- solokit/templates/saas_t3/tier-3-comprehensive/stryker.conf.json +34 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/e2e/home.spec.ts +41 -0
- solokit/templates/saas_t3/tier-3-comprehensive/tests/integration/api.test.ts +44 -0
- solokit/templates/saas_t3/tier-3-comprehensive/type-coverage.json +12 -0
- solokit/templates/saas_t3/tier-4-production/instrumentation.ts +9 -0
- solokit/templates/saas_t3/tier-4-production/k6/load-test.js +51 -0
- solokit/templates/saas_t3/tier-4-production/next.config.ts +46 -0
- solokit/templates/saas_t3/tier-4-production/package.json.tier4.template +83 -0
- solokit/templates/saas_t3/tier-4-production/sentry.client.config.ts +26 -0
- solokit/templates/saas_t3/tier-4-production/sentry.edge.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/sentry.server.config.ts +11 -0
- solokit/templates/saas_t3/tier-4-production/vercel.json +37 -0
- solokit/templates/security_spec.md +287 -0
- solokit/templates/stack-versions.yaml +617 -0
- solokit/templates/status_update.json +6 -0
- solokit/templates/template-registry.json +257 -0
- solokit/templates/work_items.json +11 -0
- solokit/testing/__init__.py +1 -0
- solokit/testing/integration_runner.py +550 -0
- solokit/testing/performance.py +637 -0
- solokit/visualization/__init__.py +1 -0
- solokit/visualization/dependency_graph.py +788 -0
- solokit/work_items/__init__.py +1 -0
- solokit/work_items/creator.py +217 -0
- solokit/work_items/delete.py +264 -0
- solokit/work_items/get_dependencies.py +185 -0
- solokit/work_items/get_dependents.py +113 -0
- solokit/work_items/get_metadata.py +121 -0
- solokit/work_items/get_next_recommendations.py +133 -0
- solokit/work_items/manager.py +235 -0
- solokit/work_items/milestones.py +137 -0
- solokit/work_items/query.py +376 -0
- solokit/work_items/repository.py +267 -0
- solokit/work_items/scheduler.py +184 -0
- solokit/work_items/spec_parser.py +838 -0
- solokit/work_items/spec_validator.py +493 -0
- solokit/work_items/updater.py +157 -0
- solokit/work_items/validator.py +205 -0
- solokit-0.1.1.dist-info/METADATA +640 -0
- solokit-0.1.1.dist-info/RECORD +323 -0
- solokit-0.1.1.dist-info/WHEEL +5 -0
- solokit-0.1.1.dist-info/entry_points.txt +2 -0
- solokit-0.1.1.dist-info/licenses/LICENSE +21 -0
- solokit-0.1.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Environment validation for deployments.
|
|
4
|
+
|
|
5
|
+
Validates:
|
|
6
|
+
- Environment readiness (connectivity, resources)
|
|
7
|
+
- Configuration (environment variables, secrets)
|
|
8
|
+
- Dependencies (services, databases, APIs)
|
|
9
|
+
- Service health (endpoints, databases)
|
|
10
|
+
- Monitoring systems
|
|
11
|
+
- Infrastructure (load balancers, DNS)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
import os
|
|
18
|
+
from typing import Any
|
|
19
|
+
|
|
20
|
+
from solokit.core.error_handlers import log_errors
|
|
21
|
+
from solokit.core.exceptions import ErrorCode, ValidationError
|
|
22
|
+
from solokit.core.output import get_output
|
|
23
|
+
|
|
24
|
+
output = get_output()
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class EnvironmentValidator:
|
|
29
|
+
"""Environment validation for deployments."""
|
|
30
|
+
|
|
31
|
+
def __init__(self, environment: str):
|
|
32
|
+
"""Initialize environment validator."""
|
|
33
|
+
self.environment = environment
|
|
34
|
+
self.validation_results: list[Any] = []
|
|
35
|
+
|
|
36
|
+
def validate_connectivity(self) -> tuple[bool, dict[str, Any]]:
|
|
37
|
+
"""
|
|
38
|
+
Validate network connectivity to target environment.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
(passed, results)
|
|
42
|
+
"""
|
|
43
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
44
|
+
|
|
45
|
+
# NOTE: Framework stub - Implement project-specific connectivity checks
|
|
46
|
+
# Suggested checks for production use:
|
|
47
|
+
# - API endpoints (HTTP/HTTPS connectivity)
|
|
48
|
+
# - Database endpoints (TCP connectivity, auth)
|
|
49
|
+
# - Cache endpoints (Redis, Memcached, etc.)
|
|
50
|
+
# Returns True by default to allow framework operation
|
|
51
|
+
|
|
52
|
+
return results["passed"], results
|
|
53
|
+
|
|
54
|
+
@log_errors()
|
|
55
|
+
def validate_configuration(self, required_vars: list[str]) -> dict[str, Any]:
|
|
56
|
+
"""
|
|
57
|
+
Validate required environment variables and secrets.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
required_vars: List of required environment variable names
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
Dict with validation results
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
ValidationError: If any required environment variable is missing or empty
|
|
67
|
+
"""
|
|
68
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
69
|
+
missing_vars = []
|
|
70
|
+
|
|
71
|
+
for var in required_vars:
|
|
72
|
+
value = os.environ.get(var)
|
|
73
|
+
check_passed = value is not None and value != ""
|
|
74
|
+
|
|
75
|
+
results["checks"].append(
|
|
76
|
+
{"name": f"Environment variable: {var}", "passed": check_passed}
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
if not check_passed:
|
|
80
|
+
results["passed"] = False
|
|
81
|
+
missing_vars.append(var)
|
|
82
|
+
|
|
83
|
+
if missing_vars:
|
|
84
|
+
raise ValidationError(
|
|
85
|
+
message=f"Missing or empty required environment variables: {', '.join(missing_vars)}",
|
|
86
|
+
code=ErrorCode.MISSING_REQUIRED_FIELD,
|
|
87
|
+
context={
|
|
88
|
+
"missing_variables": missing_vars,
|
|
89
|
+
"environment": self.environment,
|
|
90
|
+
},
|
|
91
|
+
remediation=f"Set the following environment variables: {', '.join(missing_vars)}",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return results
|
|
95
|
+
|
|
96
|
+
def validate_dependencies(self) -> tuple[bool, dict[str, Any]]:
|
|
97
|
+
"""
|
|
98
|
+
Validate service dependencies are available.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
(passed, results)
|
|
102
|
+
"""
|
|
103
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
104
|
+
|
|
105
|
+
# NOTE: Framework stub - Implement project-specific dependency checks
|
|
106
|
+
# Suggested checks for production use:
|
|
107
|
+
# - Database accessible (connection test)
|
|
108
|
+
# - Cache accessible (ping test)
|
|
109
|
+
# - External APIs accessible (health check endpoints)
|
|
110
|
+
# - Message queues accessible (broker connectivity)
|
|
111
|
+
# Returns True by default to allow framework operation
|
|
112
|
+
|
|
113
|
+
return results["passed"], results
|
|
114
|
+
|
|
115
|
+
def validate_health_checks(self) -> tuple[bool, dict[str, Any]]:
|
|
116
|
+
"""
|
|
117
|
+
Validate health check endpoints.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
(passed, results)
|
|
121
|
+
"""
|
|
122
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
123
|
+
|
|
124
|
+
# NOTE: Framework stub - Implement project-specific health checks
|
|
125
|
+
# Suggested checks for production use:
|
|
126
|
+
# - Application health endpoint (HTTP GET /health)
|
|
127
|
+
# - Database health (query execution test)
|
|
128
|
+
# - Cache health (read/write test)
|
|
129
|
+
# Returns True by default to allow framework operation
|
|
130
|
+
|
|
131
|
+
return results["passed"], results
|
|
132
|
+
|
|
133
|
+
def validate_monitoring(self) -> tuple[bool, dict[str, Any]]:
|
|
134
|
+
"""
|
|
135
|
+
Validate monitoring system operational.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
(passed, results)
|
|
139
|
+
"""
|
|
140
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
141
|
+
|
|
142
|
+
# NOTE: Framework stub - Implement project-specific monitoring checks
|
|
143
|
+
# Suggested checks for production use:
|
|
144
|
+
# - Monitoring agent running (process check)
|
|
145
|
+
# - Dashboards accessible (Grafana, Datadog, etc.)
|
|
146
|
+
# - Alerting configured (PagerDuty, Slack webhooks)
|
|
147
|
+
# Returns True by default to allow framework operation
|
|
148
|
+
|
|
149
|
+
return results["passed"], results
|
|
150
|
+
|
|
151
|
+
def validate_infrastructure(self) -> tuple[bool, dict[str, Any]]:
|
|
152
|
+
"""
|
|
153
|
+
Validate infrastructure components.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
(passed, results)
|
|
157
|
+
"""
|
|
158
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
159
|
+
|
|
160
|
+
# NOTE: Framework stub - Implement project-specific infrastructure checks
|
|
161
|
+
# Suggested checks for production use:
|
|
162
|
+
# - Load balancer configured (health check, routing rules)
|
|
163
|
+
# - DNS records correct (A, CNAME, TXT records)
|
|
164
|
+
# - SSL certificates valid (expiration, chain verification)
|
|
165
|
+
# - CDN configured (CloudFront, Cloudflare, etc.)
|
|
166
|
+
# Returns True by default to allow framework operation
|
|
167
|
+
|
|
168
|
+
return results["passed"], results
|
|
169
|
+
|
|
170
|
+
def validate_capacity(self) -> tuple[bool, dict[str, Any]]:
|
|
171
|
+
"""
|
|
172
|
+
Validate sufficient capacity for deployment.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
(passed, results)
|
|
176
|
+
"""
|
|
177
|
+
results: dict[str, Any] = {"checks": [], "passed": True}
|
|
178
|
+
|
|
179
|
+
# NOTE: Framework stub - Implement project-specific capacity checks
|
|
180
|
+
# Suggested checks for production use:
|
|
181
|
+
# - Disk space available (>20% free recommended)
|
|
182
|
+
# - Memory available (check available vs. total)
|
|
183
|
+
# - CPU capacity (check load average)
|
|
184
|
+
# - Database connections available (check pool usage)
|
|
185
|
+
# Returns True by default to allow framework operation
|
|
186
|
+
|
|
187
|
+
return results["passed"], results
|
|
188
|
+
|
|
189
|
+
def validate_all(
|
|
190
|
+
self, required_env_vars: list[str] | None = None
|
|
191
|
+
) -> tuple[bool, dict[str, Any]]:
|
|
192
|
+
"""
|
|
193
|
+
Run all validation checks.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
required_env_vars: List of required environment variables
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
(passed, results)
|
|
200
|
+
"""
|
|
201
|
+
all_results: dict[str, Any] = {"validations": [], "passed": True}
|
|
202
|
+
|
|
203
|
+
# Connectivity
|
|
204
|
+
passed, results = self.validate_connectivity()
|
|
205
|
+
all_results["validations"].append(
|
|
206
|
+
{"name": "Connectivity", "passed": passed, "details": results}
|
|
207
|
+
)
|
|
208
|
+
if not passed:
|
|
209
|
+
all_results["passed"] = False
|
|
210
|
+
|
|
211
|
+
# Configuration
|
|
212
|
+
if required_env_vars:
|
|
213
|
+
try:
|
|
214
|
+
results = self.validate_configuration(required_env_vars)
|
|
215
|
+
all_results["validations"].append(
|
|
216
|
+
{"name": "Configuration", "passed": True, "details": results}
|
|
217
|
+
)
|
|
218
|
+
except ValidationError as e:
|
|
219
|
+
all_results["validations"].append(
|
|
220
|
+
{
|
|
221
|
+
"name": "Configuration",
|
|
222
|
+
"passed": False,
|
|
223
|
+
"details": {"error": e.message, "context": e.context},
|
|
224
|
+
}
|
|
225
|
+
)
|
|
226
|
+
all_results["passed"] = False
|
|
227
|
+
|
|
228
|
+
# Dependencies
|
|
229
|
+
passed, results = self.validate_dependencies()
|
|
230
|
+
all_results["validations"].append(
|
|
231
|
+
{"name": "Dependencies", "passed": passed, "details": results}
|
|
232
|
+
)
|
|
233
|
+
if not passed:
|
|
234
|
+
all_results["passed"] = False
|
|
235
|
+
|
|
236
|
+
# Health checks
|
|
237
|
+
passed, results = self.validate_health_checks()
|
|
238
|
+
all_results["validations"].append(
|
|
239
|
+
{"name": "Health Checks", "passed": passed, "details": results}
|
|
240
|
+
)
|
|
241
|
+
if not passed:
|
|
242
|
+
all_results["passed"] = False
|
|
243
|
+
|
|
244
|
+
# Monitoring
|
|
245
|
+
passed, results = self.validate_monitoring()
|
|
246
|
+
all_results["validations"].append(
|
|
247
|
+
{"name": "Monitoring", "passed": passed, "details": results}
|
|
248
|
+
)
|
|
249
|
+
if not passed:
|
|
250
|
+
all_results["passed"] = False
|
|
251
|
+
|
|
252
|
+
# Infrastructure
|
|
253
|
+
passed, results = self.validate_infrastructure()
|
|
254
|
+
all_results["validations"].append(
|
|
255
|
+
{"name": "Infrastructure", "passed": passed, "details": results}
|
|
256
|
+
)
|
|
257
|
+
if not passed:
|
|
258
|
+
all_results["passed"] = False
|
|
259
|
+
|
|
260
|
+
# Capacity
|
|
261
|
+
passed, results = self.validate_capacity()
|
|
262
|
+
all_results["validations"].append(
|
|
263
|
+
{"name": "Capacity", "passed": passed, "details": results}
|
|
264
|
+
)
|
|
265
|
+
if not passed:
|
|
266
|
+
all_results["passed"] = False
|
|
267
|
+
|
|
268
|
+
return all_results["passed"], all_results
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def main() -> None:
|
|
272
|
+
"""CLI entry point.
|
|
273
|
+
|
|
274
|
+
Raises:
|
|
275
|
+
SystemExit: Always exits with code 0 on success, 1 on failure
|
|
276
|
+
"""
|
|
277
|
+
import sys
|
|
278
|
+
|
|
279
|
+
if len(sys.argv) < 2:
|
|
280
|
+
logger.error("Missing required argument: environment")
|
|
281
|
+
output.error("Usage: environment_validator.py <environment>")
|
|
282
|
+
sys.exit(1)
|
|
283
|
+
|
|
284
|
+
environment = sys.argv[1]
|
|
285
|
+
validator = EnvironmentValidator(environment)
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
passed, results = validator.validate_all()
|
|
289
|
+
|
|
290
|
+
output.info(f"\nEnvironment Validation: {'✓ PASSED' if passed else '✗ FAILED'}")
|
|
291
|
+
for validation in results["validations"]:
|
|
292
|
+
status = "✓" if validation["passed"] else "✗"
|
|
293
|
+
output.info(f" {status} {validation['name']}")
|
|
294
|
+
|
|
295
|
+
sys.exit(0 if passed else 1)
|
|
296
|
+
except ValidationError as e:
|
|
297
|
+
logger.error(f"Validation failed: {e.message}", extra=e.to_dict())
|
|
298
|
+
output.error("\nEnvironment Validation: ✗ FAILED")
|
|
299
|
+
output.error(f"Error: {e.message}")
|
|
300
|
+
if e.remediation:
|
|
301
|
+
output.error(f"Remediation: {e.remediation}")
|
|
302
|
+
sys.exit(e.exit_code)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
if __name__ == "__main__":
|
|
306
|
+
main()
|