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,141 @@
|
|
|
1
|
+
"""Protocol definitions for structural subtyping in Solokit.
|
|
2
|
+
|
|
3
|
+
This module defines protocols (structural types) that allow for
|
|
4
|
+
duck-typing with type safety. Protocols define interfaces that
|
|
5
|
+
classes can satisfy implicitly.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, Protocol
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class JSONSerializable(Protocol):
|
|
14
|
+
"""Protocol for objects that can be serialized to JSON.
|
|
15
|
+
|
|
16
|
+
Any class that implements a to_dict method returning a dictionary
|
|
17
|
+
satisfies this protocol.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> dict[str, Any]:
|
|
21
|
+
"""Convert object to dictionary for JSON serialization.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
Dictionary representation suitable for JSON serialization
|
|
25
|
+
"""
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class Validatable(Protocol):
|
|
30
|
+
"""Protocol for objects that can be validated.
|
|
31
|
+
|
|
32
|
+
Any class that implements a validate method satisfies this protocol.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def validate(self) -> tuple[bool, list[str]]:
|
|
36
|
+
"""Validate the object.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Tuple of (is_valid, list of error messages)
|
|
40
|
+
- is_valid: True if validation passed, False otherwise
|
|
41
|
+
- error messages: List of validation error messages (empty if valid)
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class Configurable(Protocol):
|
|
47
|
+
"""Protocol for objects that can be configured.
|
|
48
|
+
|
|
49
|
+
Any class that implements load_config and save_config methods
|
|
50
|
+
satisfies this protocol.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def load_config(self, config: dict[str, Any]) -> None:
|
|
54
|
+
"""Load configuration from dictionary.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
config: Configuration dictionary
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
def save_config(self) -> dict[str, Any]:
|
|
62
|
+
"""Save configuration to dictionary.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
Configuration as dictionary
|
|
66
|
+
"""
|
|
67
|
+
...
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class Executor(Protocol):
|
|
71
|
+
"""Protocol for objects that can execute operations.
|
|
72
|
+
|
|
73
|
+
Any class that implements an execute method satisfies this protocol.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def execute(self) -> tuple[bool, str]:
|
|
77
|
+
"""Execute the operation.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Tuple of (success, message)
|
|
81
|
+
- success: True if execution succeeded, False otherwise
|
|
82
|
+
- message: Status or error message
|
|
83
|
+
"""
|
|
84
|
+
...
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class SupportsComparison(Protocol):
|
|
88
|
+
"""Protocol for objects that support comparison operations.
|
|
89
|
+
|
|
90
|
+
Any class that implements comparison methods satisfies this protocol.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __lt__(self, other: Any) -> bool:
|
|
94
|
+
"""Less than comparison."""
|
|
95
|
+
...
|
|
96
|
+
|
|
97
|
+
def __le__(self, other: Any) -> bool:
|
|
98
|
+
"""Less than or equal comparison."""
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
def __gt__(self, other: Any) -> bool:
|
|
102
|
+
"""Greater than comparison."""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
def __ge__(self, other: Any) -> bool:
|
|
106
|
+
"""Greater than or equal comparison."""
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class FileReader(Protocol):
|
|
111
|
+
"""Protocol for objects that can read files.
|
|
112
|
+
|
|
113
|
+
Any class that implements a read method satisfies this protocol.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
def read(self, file_path: str) -> str:
|
|
117
|
+
"""Read content from file.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
file_path: Path to file to read
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
File content as string
|
|
124
|
+
"""
|
|
125
|
+
...
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class FileWriter(Protocol):
|
|
129
|
+
"""Protocol for objects that can write files.
|
|
130
|
+
|
|
131
|
+
Any class that implements a write method satisfies this protocol.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def write(self, file_path: str, content: str) -> None:
|
|
135
|
+
"""Write content to file.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
file_path: Path to file to write
|
|
139
|
+
content: Content to write
|
|
140
|
+
"""
|
|
141
|
+
...
|
solokit/core/types.py
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"""Type definitions for Solokit work items.
|
|
2
|
+
|
|
3
|
+
This module provides type-safe enums for work item properties, replacing
|
|
4
|
+
magic strings throughout the codebase. All enums inherit from str for
|
|
5
|
+
JSON serialization compatibility.
|
|
6
|
+
|
|
7
|
+
It also provides TypedDict definitions for structured data and type aliases
|
|
8
|
+
for improved code clarity.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from enum import Enum
|
|
14
|
+
from typing import Any, TypedDict
|
|
15
|
+
|
|
16
|
+
from solokit.core.exceptions import ErrorCode, ValidationError
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WorkItemType(str, Enum):
|
|
20
|
+
"""Work item types.
|
|
21
|
+
|
|
22
|
+
Defines all valid work item types in the Solokit system.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
FEATURE = "feature"
|
|
26
|
+
BUG = "bug"
|
|
27
|
+
REFACTOR = "refactor"
|
|
28
|
+
SECURITY = "security"
|
|
29
|
+
INTEGRATION_TEST = "integration_test"
|
|
30
|
+
DEPLOYMENT = "deployment"
|
|
31
|
+
|
|
32
|
+
def __str__(self) -> str:
|
|
33
|
+
"""Return the string value of the enum."""
|
|
34
|
+
return self.value
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def values(cls) -> list[str]:
|
|
38
|
+
"""Return list of all valid work item type values."""
|
|
39
|
+
return [item.value for item in cls]
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def _missing_(cls, value: object) -> WorkItemType:
|
|
43
|
+
"""Handle invalid work item types with ValidationError."""
|
|
44
|
+
valid_types = ", ".join(cls.values())
|
|
45
|
+
raise ValidationError(
|
|
46
|
+
message=f"Invalid work item type '{value}'. Valid types: {valid_types}",
|
|
47
|
+
code=ErrorCode.INVALID_WORK_ITEM_TYPE,
|
|
48
|
+
context={"work_item_type": value, "valid_types": cls.values()},
|
|
49
|
+
remediation=f"Choose one of the valid work item types: {valid_types}",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class WorkItemStatus(str, Enum):
|
|
54
|
+
"""Work item statuses.
|
|
55
|
+
|
|
56
|
+
Defines all valid work item statuses in the Solokit system.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
NOT_STARTED = "not_started"
|
|
60
|
+
IN_PROGRESS = "in_progress"
|
|
61
|
+
BLOCKED = "blocked"
|
|
62
|
+
COMPLETED = "completed"
|
|
63
|
+
|
|
64
|
+
def __str__(self) -> str:
|
|
65
|
+
"""Return the string value of the enum."""
|
|
66
|
+
return self.value
|
|
67
|
+
|
|
68
|
+
@classmethod
|
|
69
|
+
def values(cls) -> list[str]:
|
|
70
|
+
"""Return list of all valid work item status values."""
|
|
71
|
+
return [item.value for item in cls]
|
|
72
|
+
|
|
73
|
+
@classmethod
|
|
74
|
+
def _missing_(cls, value: object) -> WorkItemStatus:
|
|
75
|
+
"""Handle invalid work item status with ValidationError."""
|
|
76
|
+
valid_statuses = ", ".join(cls.values())
|
|
77
|
+
raise ValidationError(
|
|
78
|
+
message=f"Invalid status '{value}'. Valid statuses: {valid_statuses}",
|
|
79
|
+
code=ErrorCode.INVALID_STATUS,
|
|
80
|
+
context={"status": value, "valid_statuses": cls.values()},
|
|
81
|
+
remediation=f"Choose one of the valid statuses: {valid_statuses}",
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class Priority(str, Enum):
|
|
86
|
+
"""Priority levels.
|
|
87
|
+
|
|
88
|
+
Defines all valid priority levels in the Solokit system.
|
|
89
|
+
Supports comparison operations for ordering.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
CRITICAL = "critical"
|
|
93
|
+
HIGH = "high"
|
|
94
|
+
MEDIUM = "medium"
|
|
95
|
+
LOW = "low"
|
|
96
|
+
|
|
97
|
+
def __str__(self) -> str:
|
|
98
|
+
"""Return the string value of the enum."""
|
|
99
|
+
return self.value
|
|
100
|
+
|
|
101
|
+
def __lt__(self, other: object) -> bool:
|
|
102
|
+
"""Enable priority comparison.
|
|
103
|
+
|
|
104
|
+
Lower numeric order = higher priority:
|
|
105
|
+
CRITICAL (0) < HIGH (1) < MEDIUM (2) < LOW (3)
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
other: Another Priority enum to compare against
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
True if this priority is higher than other
|
|
112
|
+
|
|
113
|
+
Raises:
|
|
114
|
+
TypeError: If other is not a Priority enum
|
|
115
|
+
"""
|
|
116
|
+
if not isinstance(other, Priority):
|
|
117
|
+
raise TypeError(f"Cannot compare Priority with {type(other)}")
|
|
118
|
+
|
|
119
|
+
order = {Priority.CRITICAL: 0, Priority.HIGH: 1, Priority.MEDIUM: 2, Priority.LOW: 3}
|
|
120
|
+
return order[self] < order[other]
|
|
121
|
+
|
|
122
|
+
def __le__(self, other: object) -> bool:
|
|
123
|
+
"""Enable priority less-than-or-equal comparison."""
|
|
124
|
+
if not isinstance(other, Priority):
|
|
125
|
+
raise TypeError(f"Cannot compare Priority with {type(other)}")
|
|
126
|
+
return self == other or self < other
|
|
127
|
+
|
|
128
|
+
def __gt__(self, other: object) -> bool:
|
|
129
|
+
"""Enable priority greater-than comparison."""
|
|
130
|
+
if not isinstance(other, Priority):
|
|
131
|
+
raise TypeError(f"Cannot compare Priority with {type(other)}")
|
|
132
|
+
return not self <= other
|
|
133
|
+
|
|
134
|
+
def __ge__(self, other: object) -> bool:
|
|
135
|
+
"""Enable priority greater-than-or-equal comparison."""
|
|
136
|
+
if not isinstance(other, Priority):
|
|
137
|
+
raise TypeError(f"Cannot compare Priority with {type(other)}")
|
|
138
|
+
return not self < other
|
|
139
|
+
|
|
140
|
+
@classmethod
|
|
141
|
+
def values(cls) -> list[str]:
|
|
142
|
+
"""Return list of all valid priority values."""
|
|
143
|
+
return [item.value for item in cls]
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def _missing_(cls, value: object) -> Priority:
|
|
147
|
+
"""Handle invalid priority with ValidationError."""
|
|
148
|
+
valid_priorities = ", ".join(cls.values())
|
|
149
|
+
raise ValidationError(
|
|
150
|
+
message=f"Invalid priority '{value}'. Valid priorities: {valid_priorities}",
|
|
151
|
+
code=ErrorCode.INVALID_PRIORITY,
|
|
152
|
+
context={"priority": value, "valid_priorities": cls.values()},
|
|
153
|
+
remediation=f"Choose one of the valid priorities: {valid_priorities}",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class GitStatus(str, Enum):
|
|
158
|
+
"""Git workflow statuses for work items.
|
|
159
|
+
|
|
160
|
+
Tracks the git workflow state of work item branches through their lifecycle.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
IN_PROGRESS = "in_progress"
|
|
164
|
+
READY_TO_MERGE = "ready_to_merge"
|
|
165
|
+
READY_FOR_PR = "ready_for_pr"
|
|
166
|
+
PR_CREATED = "pr_created"
|
|
167
|
+
PR_CLOSED = "pr_closed"
|
|
168
|
+
MERGED = "merged"
|
|
169
|
+
DELETED = "deleted"
|
|
170
|
+
|
|
171
|
+
def __str__(self) -> str:
|
|
172
|
+
"""Return the string value of the enum."""
|
|
173
|
+
return self.value
|
|
174
|
+
|
|
175
|
+
@classmethod
|
|
176
|
+
def values(cls) -> list[str]:
|
|
177
|
+
"""Return list of all valid git status values."""
|
|
178
|
+
return [item.value for item in cls]
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
# Type Aliases
|
|
182
|
+
WorkItemID = str
|
|
183
|
+
"""Type alias for work item identifiers."""
|
|
184
|
+
|
|
185
|
+
MilestoneID = str
|
|
186
|
+
"""Type alias for milestone identifiers."""
|
|
187
|
+
|
|
188
|
+
SessionID = int
|
|
189
|
+
"""Type alias for session identifiers."""
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
# TypedDict Definitions
|
|
193
|
+
class WorkItemDict(TypedDict, total=False):
|
|
194
|
+
"""Typed dictionary for work item data structure.
|
|
195
|
+
|
|
196
|
+
Attributes:
|
|
197
|
+
id: Unique work item identifier
|
|
198
|
+
type: Type of work item (feature, bug, etc.)
|
|
199
|
+
title: Human-readable title
|
|
200
|
+
status: Current status (not_started, in_progress, etc.)
|
|
201
|
+
priority: Priority level (critical, high, medium, low)
|
|
202
|
+
description: Detailed description
|
|
203
|
+
dependencies: List of work item IDs this depends on
|
|
204
|
+
milestone: Optional milestone this belongs to
|
|
205
|
+
created_at: ISO format timestamp of creation
|
|
206
|
+
updated_at: ISO format timestamp of last update
|
|
207
|
+
spec_file: Path to specification file
|
|
208
|
+
git_status: Git workflow status
|
|
209
|
+
git_branch: Git branch name
|
|
210
|
+
"""
|
|
211
|
+
|
|
212
|
+
id: WorkItemID
|
|
213
|
+
type: str
|
|
214
|
+
title: str
|
|
215
|
+
status: str
|
|
216
|
+
priority: str
|
|
217
|
+
description: str
|
|
218
|
+
dependencies: list[WorkItemID]
|
|
219
|
+
milestone: str
|
|
220
|
+
created_at: str
|
|
221
|
+
updated_at: str
|
|
222
|
+
spec_file: str
|
|
223
|
+
git_status: str
|
|
224
|
+
git_branch: str
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class WorkItemsData(TypedDict):
|
|
228
|
+
"""Typed dictionary for work_items.json file structure.
|
|
229
|
+
|
|
230
|
+
Attributes:
|
|
231
|
+
work_items: Dictionary mapping work item IDs to work item data
|
|
232
|
+
metadata: Additional metadata about the work items collection
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
work_items: dict[WorkItemID, WorkItemDict]
|
|
236
|
+
metadata: dict[str, Any]
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class LearningDict(TypedDict, total=False):
|
|
240
|
+
"""Typed dictionary for learning entry data structure.
|
|
241
|
+
|
|
242
|
+
Attributes:
|
|
243
|
+
id: Unique learning identifier
|
|
244
|
+
session_id: Session where learning was captured
|
|
245
|
+
work_item_id: Work item associated with learning
|
|
246
|
+
category: Learning category (best_practices, gotcha, etc.)
|
|
247
|
+
content: Learning content/description
|
|
248
|
+
tags: List of tags for categorization
|
|
249
|
+
created_at: ISO format timestamp
|
|
250
|
+
context: Additional context information
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
id: str
|
|
254
|
+
session_id: SessionID
|
|
255
|
+
work_item_id: WorkItemID
|
|
256
|
+
category: str
|
|
257
|
+
content: str
|
|
258
|
+
tags: list[str]
|
|
259
|
+
created_at: str
|
|
260
|
+
context: dict[str, Any]
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
class MilestoneDict(TypedDict, total=False):
|
|
264
|
+
"""Typed dictionary for milestone data structure.
|
|
265
|
+
|
|
266
|
+
Attributes:
|
|
267
|
+
id: Unique milestone identifier
|
|
268
|
+
title: Milestone title
|
|
269
|
+
description: Milestone description
|
|
270
|
+
target_date: Target completion date
|
|
271
|
+
status: Milestone status
|
|
272
|
+
work_items: List of work item IDs in this milestone
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
id: MilestoneID
|
|
276
|
+
title: str
|
|
277
|
+
description: str
|
|
278
|
+
target_date: str
|
|
279
|
+
status: str
|
|
280
|
+
work_items: list[WorkItemID]
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
class ConfigDict(TypedDict, total=False):
|
|
284
|
+
"""Typed dictionary for Solokit configuration structure.
|
|
285
|
+
|
|
286
|
+
Attributes:
|
|
287
|
+
project_name: Name of the project
|
|
288
|
+
version: Configuration version
|
|
289
|
+
quality_gates: Quality gate configuration
|
|
290
|
+
learning: Learning system configuration
|
|
291
|
+
git: Git integration configuration
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
project_name: str
|
|
295
|
+
version: str
|
|
296
|
+
quality_gates: dict[str, Any]
|
|
297
|
+
learning: dict[str, Any]
|
|
298
|
+
git: dict[str, Any]
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class QualityGateResult(TypedDict):
|
|
302
|
+
"""Typed dictionary for quality gate results.
|
|
303
|
+
|
|
304
|
+
Attributes:
|
|
305
|
+
passed: Whether the quality gate passed
|
|
306
|
+
message: Result message
|
|
307
|
+
details: Additional details about the result
|
|
308
|
+
"""
|
|
309
|
+
|
|
310
|
+
passed: bool
|
|
311
|
+
message: str
|
|
312
|
+
details: dict[str, Any]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Deployment execution and management."""
|