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,205 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Work Item Validator - Validation logic for work items.
|
|
4
|
+
|
|
5
|
+
Handles spec validation for integration_test and deployment work items.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from solokit.core.error_handlers import log_errors
|
|
11
|
+
from solokit.core.exceptions import (
|
|
12
|
+
ErrorCode,
|
|
13
|
+
FileOperationError,
|
|
14
|
+
SpecValidationError,
|
|
15
|
+
ValidationError,
|
|
16
|
+
)
|
|
17
|
+
from solokit.core.logging_config import get_logger
|
|
18
|
+
from solokit.work_items import spec_parser
|
|
19
|
+
|
|
20
|
+
logger = get_logger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class WorkItemValidator:
|
|
24
|
+
"""Validates work item specifications and constraints"""
|
|
25
|
+
|
|
26
|
+
@log_errors()
|
|
27
|
+
def validate_integration_test(self, work_item: dict) -> None:
|
|
28
|
+
"""Validate integration test work item by parsing spec file
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
work_item: Work item dictionary to validate
|
|
32
|
+
|
|
33
|
+
Raises:
|
|
34
|
+
FileOperationError: If spec file not found
|
|
35
|
+
ValidationError: If spec validation fails (with validation errors in context)
|
|
36
|
+
"""
|
|
37
|
+
errors = []
|
|
38
|
+
work_id: str = str(work_item.get("id", ""))
|
|
39
|
+
|
|
40
|
+
# Parse spec file - pass full work_item dict to support custom spec filenames
|
|
41
|
+
try:
|
|
42
|
+
parsed_spec = spec_parser.parse_spec_file(work_item)
|
|
43
|
+
except FileNotFoundError:
|
|
44
|
+
spec_file = work_item.get("spec_file", f".session/specs/{work_id}.md")
|
|
45
|
+
raise FileOperationError(
|
|
46
|
+
operation="read",
|
|
47
|
+
file_path=spec_file,
|
|
48
|
+
details="Spec file not found",
|
|
49
|
+
)
|
|
50
|
+
except ValueError as e:
|
|
51
|
+
raise ValidationError(
|
|
52
|
+
message=f"Invalid spec file: {str(e)}",
|
|
53
|
+
code=ErrorCode.SPEC_VALIDATION_FAILED,
|
|
54
|
+
context={"work_item_id": work_id},
|
|
55
|
+
remediation=f"Fix spec file validation errors for {work_id}",
|
|
56
|
+
cause=e,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Validate required sections exist and are not empty
|
|
60
|
+
required_sections = {
|
|
61
|
+
"scope": "Scope",
|
|
62
|
+
"test_scenarios": "Test Scenarios",
|
|
63
|
+
"performance_benchmarks": "Performance Benchmarks",
|
|
64
|
+
"environment_requirements": "Environment Requirements",
|
|
65
|
+
"acceptance_criteria": "Acceptance Criteria",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
for field_name, section_name in required_sections.items():
|
|
69
|
+
value = parsed_spec.get(field_name)
|
|
70
|
+
if value is None or (isinstance(value, str) and not value.strip()):
|
|
71
|
+
errors.append(f"Missing required section: {section_name}")
|
|
72
|
+
elif isinstance(value, list) and len(value) == 0:
|
|
73
|
+
errors.append(f"Section '{section_name}' is empty")
|
|
74
|
+
|
|
75
|
+
# Validate test scenarios - must have at least 1 scenario
|
|
76
|
+
test_scenarios = parsed_spec.get("test_scenarios", [])
|
|
77
|
+
if len(test_scenarios) == 0:
|
|
78
|
+
errors.append("At least one test scenario required")
|
|
79
|
+
else:
|
|
80
|
+
# Check that each scenario has content
|
|
81
|
+
for i, scenario in enumerate(test_scenarios):
|
|
82
|
+
if not scenario.get("content") or not scenario.get("content").strip():
|
|
83
|
+
scenario_name = scenario.get("name", f"Scenario {i + 1}")
|
|
84
|
+
errors.append(f"{scenario_name}: Missing scenario content")
|
|
85
|
+
|
|
86
|
+
# Validate acceptance criteria - should have at least 3 items (per spec validation rules)
|
|
87
|
+
acceptance_criteria = parsed_spec.get("acceptance_criteria", [])
|
|
88
|
+
if len(acceptance_criteria) < 3:
|
|
89
|
+
errors.append(
|
|
90
|
+
f"Acceptance criteria should have at least 3 items (found {len(acceptance_criteria)})"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
# Check for work item dependencies
|
|
94
|
+
dependencies = work_item.get("dependencies", [])
|
|
95
|
+
if not dependencies:
|
|
96
|
+
errors.append("Integration tests must have dependencies (component implementations)")
|
|
97
|
+
|
|
98
|
+
# If errors found, raise ValidationError with all errors in context
|
|
99
|
+
if errors:
|
|
100
|
+
raise SpecValidationError(
|
|
101
|
+
work_item_id=work_id,
|
|
102
|
+
errors=errors,
|
|
103
|
+
remediation=f"Fix validation errors in {work_id} spec file",
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
@log_errors()
|
|
107
|
+
def validate_deployment(self, work_item: dict) -> None:
|
|
108
|
+
"""Validate deployment work item by parsing spec file
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
work_item: Work item dictionary to validate
|
|
112
|
+
|
|
113
|
+
Raises:
|
|
114
|
+
FileOperationError: If spec file not found
|
|
115
|
+
ValidationError: If spec validation fails (with validation errors in context)
|
|
116
|
+
"""
|
|
117
|
+
errors = []
|
|
118
|
+
work_id: str = str(work_item.get("id", ""))
|
|
119
|
+
|
|
120
|
+
# Parse spec file - pass full work_item dict to support custom spec filenames
|
|
121
|
+
try:
|
|
122
|
+
parsed_spec = spec_parser.parse_spec_file(work_item)
|
|
123
|
+
except FileNotFoundError:
|
|
124
|
+
spec_file = work_item.get("spec_file", f".session/specs/{work_id}.md")
|
|
125
|
+
raise FileOperationError(
|
|
126
|
+
operation="read",
|
|
127
|
+
file_path=spec_file,
|
|
128
|
+
details="Spec file not found",
|
|
129
|
+
)
|
|
130
|
+
except ValueError as e:
|
|
131
|
+
raise ValidationError(
|
|
132
|
+
message=f"Invalid spec file: {str(e)}",
|
|
133
|
+
code=ErrorCode.SPEC_VALIDATION_FAILED,
|
|
134
|
+
context={"work_item_id": work_id},
|
|
135
|
+
remediation=f"Fix spec file validation errors for {work_id}",
|
|
136
|
+
cause=e,
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
# Validate required sections exist and are not empty
|
|
140
|
+
required_sections = {
|
|
141
|
+
"deployment_scope": "Deployment Scope",
|
|
142
|
+
"deployment_procedure": "Deployment Procedure",
|
|
143
|
+
"environment_configuration": "Environment Configuration",
|
|
144
|
+
"rollback_procedure": "Rollback Procedure",
|
|
145
|
+
"smoke_tests": "Smoke Tests",
|
|
146
|
+
"acceptance_criteria": "Acceptance Criteria",
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
for field_name, section_name in required_sections.items():
|
|
150
|
+
value = parsed_spec.get(field_name)
|
|
151
|
+
if value is None:
|
|
152
|
+
errors.append(f"Missing required section: {section_name}")
|
|
153
|
+
elif isinstance(value, str) and not value.strip():
|
|
154
|
+
errors.append(f"Section '{section_name}' is empty")
|
|
155
|
+
elif isinstance(value, list) and len(value) == 0:
|
|
156
|
+
errors.append(f"Section '{section_name}' is empty")
|
|
157
|
+
elif isinstance(value, dict) and not any(value.values()):
|
|
158
|
+
errors.append(f"Section '{section_name}' is empty")
|
|
159
|
+
|
|
160
|
+
# Validate deployment procedure subsections
|
|
161
|
+
deployment_proc = parsed_spec.get("deployment_procedure")
|
|
162
|
+
if deployment_proc:
|
|
163
|
+
if (
|
|
164
|
+
not deployment_proc.get("pre_deployment")
|
|
165
|
+
or not deployment_proc.get("pre_deployment").strip()
|
|
166
|
+
):
|
|
167
|
+
errors.append("Missing pre-deployment checklist/steps")
|
|
168
|
+
if (
|
|
169
|
+
not deployment_proc.get("deployment_steps")
|
|
170
|
+
or not deployment_proc.get("deployment_steps").strip()
|
|
171
|
+
):
|
|
172
|
+
errors.append("Missing deployment steps")
|
|
173
|
+
if (
|
|
174
|
+
not deployment_proc.get("post_deployment")
|
|
175
|
+
or not deployment_proc.get("post_deployment").strip()
|
|
176
|
+
):
|
|
177
|
+
errors.append("Missing post-deployment steps")
|
|
178
|
+
|
|
179
|
+
# Validate rollback procedure subsections
|
|
180
|
+
rollback_proc = parsed_spec.get("rollback_procedure")
|
|
181
|
+
if rollback_proc:
|
|
182
|
+
if not rollback_proc.get("triggers") or not rollback_proc.get("triggers").strip():
|
|
183
|
+
errors.append("Missing rollback triggers")
|
|
184
|
+
if not rollback_proc.get("steps") or not rollback_proc.get("steps").strip():
|
|
185
|
+
errors.append("Missing rollback steps")
|
|
186
|
+
|
|
187
|
+
# Validate smoke tests - must have at least 1 test
|
|
188
|
+
smoke_tests = parsed_spec.get("smoke_tests", [])
|
|
189
|
+
if len(smoke_tests) == 0:
|
|
190
|
+
errors.append("At least one smoke test required")
|
|
191
|
+
|
|
192
|
+
# Validate acceptance criteria - should have at least 3 items
|
|
193
|
+
acceptance_criteria = parsed_spec.get("acceptance_criteria", [])
|
|
194
|
+
if len(acceptance_criteria) < 3:
|
|
195
|
+
errors.append(
|
|
196
|
+
f"Acceptance criteria should have at least 3 items (found {len(acceptance_criteria)})"
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# If errors found, raise ValidationError with all errors in context
|
|
200
|
+
if errors:
|
|
201
|
+
raise SpecValidationError(
|
|
202
|
+
work_item_id=work_id,
|
|
203
|
+
errors=errors,
|
|
204
|
+
remediation=f"Fix validation errors in {work_id} spec file",
|
|
205
|
+
)
|