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.
Files changed (323) hide show
  1. solokit/__init__.py +10 -0
  2. solokit/__version__.py +3 -0
  3. solokit/cli.py +374 -0
  4. solokit/core/__init__.py +1 -0
  5. solokit/core/cache.py +102 -0
  6. solokit/core/command_runner.py +278 -0
  7. solokit/core/config.py +453 -0
  8. solokit/core/config_validator.py +204 -0
  9. solokit/core/constants.py +291 -0
  10. solokit/core/error_formatter.py +279 -0
  11. solokit/core/error_handlers.py +346 -0
  12. solokit/core/exceptions.py +1567 -0
  13. solokit/core/file_ops.py +309 -0
  14. solokit/core/logging_config.py +166 -0
  15. solokit/core/output.py +99 -0
  16. solokit/core/performance.py +57 -0
  17. solokit/core/protocols.py +141 -0
  18. solokit/core/types.py +312 -0
  19. solokit/deployment/__init__.py +1 -0
  20. solokit/deployment/executor.py +411 -0
  21. solokit/git/__init__.py +1 -0
  22. solokit/git/integration.py +619 -0
  23. solokit/init/__init__.py +41 -0
  24. solokit/init/claude_commands_installer.py +87 -0
  25. solokit/init/dependency_installer.py +313 -0
  26. solokit/init/docs_structure.py +90 -0
  27. solokit/init/env_generator.py +160 -0
  28. solokit/init/environment_validator.py +334 -0
  29. solokit/init/git_hooks_installer.py +71 -0
  30. solokit/init/git_setup.py +188 -0
  31. solokit/init/gitignore_updater.py +195 -0
  32. solokit/init/initial_commit.py +145 -0
  33. solokit/init/initial_scans.py +109 -0
  34. solokit/init/orchestrator.py +246 -0
  35. solokit/init/readme_generator.py +207 -0
  36. solokit/init/session_structure.py +239 -0
  37. solokit/init/template_installer.py +424 -0
  38. solokit/learning/__init__.py +1 -0
  39. solokit/learning/archiver.py +115 -0
  40. solokit/learning/categorizer.py +126 -0
  41. solokit/learning/curator.py +428 -0
  42. solokit/learning/extractor.py +352 -0
  43. solokit/learning/reporter.py +351 -0
  44. solokit/learning/repository.py +254 -0
  45. solokit/learning/similarity.py +342 -0
  46. solokit/learning/validator.py +144 -0
  47. solokit/project/__init__.py +1 -0
  48. solokit/project/init.py +1162 -0
  49. solokit/project/stack.py +436 -0
  50. solokit/project/sync_plugin.py +438 -0
  51. solokit/project/tree.py +375 -0
  52. solokit/quality/__init__.py +1 -0
  53. solokit/quality/api_validator.py +424 -0
  54. solokit/quality/checkers/__init__.py +25 -0
  55. solokit/quality/checkers/base.py +114 -0
  56. solokit/quality/checkers/context7.py +221 -0
  57. solokit/quality/checkers/custom.py +162 -0
  58. solokit/quality/checkers/deployment.py +323 -0
  59. solokit/quality/checkers/documentation.py +179 -0
  60. solokit/quality/checkers/formatting.py +161 -0
  61. solokit/quality/checkers/integration.py +394 -0
  62. solokit/quality/checkers/linting.py +159 -0
  63. solokit/quality/checkers/security.py +261 -0
  64. solokit/quality/checkers/spec_completeness.py +127 -0
  65. solokit/quality/checkers/tests.py +184 -0
  66. solokit/quality/env_validator.py +306 -0
  67. solokit/quality/gates.py +655 -0
  68. solokit/quality/reporters/__init__.py +10 -0
  69. solokit/quality/reporters/base.py +25 -0
  70. solokit/quality/reporters/console.py +98 -0
  71. solokit/quality/reporters/json_reporter.py +34 -0
  72. solokit/quality/results.py +98 -0
  73. solokit/session/__init__.py +1 -0
  74. solokit/session/briefing/__init__.py +245 -0
  75. solokit/session/briefing/documentation_loader.py +53 -0
  76. solokit/session/briefing/formatter.py +476 -0
  77. solokit/session/briefing/git_context.py +282 -0
  78. solokit/session/briefing/learning_loader.py +212 -0
  79. solokit/session/briefing/milestone_builder.py +78 -0
  80. solokit/session/briefing/orchestrator.py +137 -0
  81. solokit/session/briefing/stack_detector.py +51 -0
  82. solokit/session/briefing/tree_generator.py +52 -0
  83. solokit/session/briefing/work_item_loader.py +209 -0
  84. solokit/session/briefing.py +353 -0
  85. solokit/session/complete.py +1188 -0
  86. solokit/session/status.py +246 -0
  87. solokit/session/validate.py +452 -0
  88. solokit/templates/.claude/commands/end.md +109 -0
  89. solokit/templates/.claude/commands/init.md +159 -0
  90. solokit/templates/.claude/commands/learn-curate.md +88 -0
  91. solokit/templates/.claude/commands/learn-search.md +62 -0
  92. solokit/templates/.claude/commands/learn-show.md +69 -0
  93. solokit/templates/.claude/commands/learn.md +136 -0
  94. solokit/templates/.claude/commands/start.md +114 -0
  95. solokit/templates/.claude/commands/status.md +22 -0
  96. solokit/templates/.claude/commands/validate.md +27 -0
  97. solokit/templates/.claude/commands/work-delete.md +119 -0
  98. solokit/templates/.claude/commands/work-graph.md +139 -0
  99. solokit/templates/.claude/commands/work-list.md +26 -0
  100. solokit/templates/.claude/commands/work-new.md +114 -0
  101. solokit/templates/.claude/commands/work-next.md +25 -0
  102. solokit/templates/.claude/commands/work-show.md +24 -0
  103. solokit/templates/.claude/commands/work-update.md +141 -0
  104. solokit/templates/CHANGELOG.md +17 -0
  105. solokit/templates/WORK_ITEM_TYPES.md +141 -0
  106. solokit/templates/__init__.py +1 -0
  107. solokit/templates/bug_spec.md +217 -0
  108. solokit/templates/config.schema.json +150 -0
  109. solokit/templates/dashboard_refine/base/.gitignore +36 -0
  110. solokit/templates/dashboard_refine/base/app/(dashboard)/layout.tsx +22 -0
  111. solokit/templates/dashboard_refine/base/app/(dashboard)/page.tsx +68 -0
  112. solokit/templates/dashboard_refine/base/app/(dashboard)/users/page.tsx +77 -0
  113. solokit/templates/dashboard_refine/base/app/globals.css +60 -0
  114. solokit/templates/dashboard_refine/base/app/layout.tsx +23 -0
  115. solokit/templates/dashboard_refine/base/app/page.tsx +9 -0
  116. solokit/templates/dashboard_refine/base/components/client-refine-wrapper.tsx +21 -0
  117. solokit/templates/dashboard_refine/base/components/layout/header.tsx +44 -0
  118. solokit/templates/dashboard_refine/base/components/layout/sidebar.tsx +82 -0
  119. solokit/templates/dashboard_refine/base/components/ui/button.tsx +53 -0
  120. solokit/templates/dashboard_refine/base/components/ui/card.tsx +78 -0
  121. solokit/templates/dashboard_refine/base/components/ui/table.tsx +116 -0
  122. solokit/templates/dashboard_refine/base/components.json +16 -0
  123. solokit/templates/dashboard_refine/base/lib/refine.tsx +65 -0
  124. solokit/templates/dashboard_refine/base/lib/utils.ts +13 -0
  125. solokit/templates/dashboard_refine/base/next.config.ts +10 -0
  126. solokit/templates/dashboard_refine/base/package.json.template +40 -0
  127. solokit/templates/dashboard_refine/base/postcss.config.mjs +8 -0
  128. solokit/templates/dashboard_refine/base/providers/refine-provider.tsx +26 -0
  129. solokit/templates/dashboard_refine/base/tailwind.config.ts +57 -0
  130. solokit/templates/dashboard_refine/base/tsconfig.json +27 -0
  131. solokit/templates/dashboard_refine/docker/Dockerfile +57 -0
  132. solokit/templates/dashboard_refine/docker/docker-compose.prod.yml +31 -0
  133. solokit/templates/dashboard_refine/docker/docker-compose.yml +21 -0
  134. solokit/templates/dashboard_refine/tier-1-essential/.eslintrc.json +7 -0
  135. solokit/templates/dashboard_refine/tier-1-essential/jest.config.ts +17 -0
  136. solokit/templates/dashboard_refine/tier-1-essential/jest.setup.ts +1 -0
  137. solokit/templates/dashboard_refine/tier-1-essential/package.json.tier1.template +57 -0
  138. solokit/templates/dashboard_refine/tier-1-essential/tests/setup.ts +26 -0
  139. solokit/templates/dashboard_refine/tier-1-essential/tests/unit/example.test.tsx +73 -0
  140. solokit/templates/dashboard_refine/tier-2-standard/package.json.tier2.template +62 -0
  141. solokit/templates/dashboard_refine/tier-3-comprehensive/eslint.config.mjs +22 -0
  142. solokit/templates/dashboard_refine/tier-3-comprehensive/package.json.tier3.template +79 -0
  143. solokit/templates/dashboard_refine/tier-3-comprehensive/playwright.config.ts +66 -0
  144. solokit/templates/dashboard_refine/tier-3-comprehensive/stryker.conf.json +38 -0
  145. solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/dashboard.spec.ts +88 -0
  146. solokit/templates/dashboard_refine/tier-3-comprehensive/tests/e2e/user-management.spec.ts +102 -0
  147. solokit/templates/dashboard_refine/tier-3-comprehensive/tests/integration/dashboard.test.tsx +90 -0
  148. solokit/templates/dashboard_refine/tier-3-comprehensive/type-coverage.json +16 -0
  149. solokit/templates/dashboard_refine/tier-4-production/instrumentation.ts +9 -0
  150. solokit/templates/dashboard_refine/tier-4-production/k6/dashboard-load-test.js +70 -0
  151. solokit/templates/dashboard_refine/tier-4-production/next.config.ts +46 -0
  152. solokit/templates/dashboard_refine/tier-4-production/package.json.tier4.template +89 -0
  153. solokit/templates/dashboard_refine/tier-4-production/sentry.client.config.ts +26 -0
  154. solokit/templates/dashboard_refine/tier-4-production/sentry.edge.config.ts +11 -0
  155. solokit/templates/dashboard_refine/tier-4-production/sentry.server.config.ts +11 -0
  156. solokit/templates/deployment_spec.md +500 -0
  157. solokit/templates/feature_spec.md +248 -0
  158. solokit/templates/fullstack_nextjs/base/.gitignore +36 -0
  159. solokit/templates/fullstack_nextjs/base/app/api/example/route.ts +65 -0
  160. solokit/templates/fullstack_nextjs/base/app/globals.css +27 -0
  161. solokit/templates/fullstack_nextjs/base/app/layout.tsx +20 -0
  162. solokit/templates/fullstack_nextjs/base/app/page.tsx +32 -0
  163. solokit/templates/fullstack_nextjs/base/components/example-component.tsx +20 -0
  164. solokit/templates/fullstack_nextjs/base/lib/prisma.ts +17 -0
  165. solokit/templates/fullstack_nextjs/base/lib/utils.ts +13 -0
  166. solokit/templates/fullstack_nextjs/base/lib/validations.ts +20 -0
  167. solokit/templates/fullstack_nextjs/base/next.config.ts +7 -0
  168. solokit/templates/fullstack_nextjs/base/package.json.template +32 -0
  169. solokit/templates/fullstack_nextjs/base/postcss.config.mjs +8 -0
  170. solokit/templates/fullstack_nextjs/base/prisma/schema.prisma +21 -0
  171. solokit/templates/fullstack_nextjs/base/tailwind.config.ts +19 -0
  172. solokit/templates/fullstack_nextjs/base/tsconfig.json +27 -0
  173. solokit/templates/fullstack_nextjs/docker/Dockerfile +60 -0
  174. solokit/templates/fullstack_nextjs/docker/docker-compose.prod.yml +57 -0
  175. solokit/templates/fullstack_nextjs/docker/docker-compose.yml +47 -0
  176. solokit/templates/fullstack_nextjs/tier-1-essential/.eslintrc.json +7 -0
  177. solokit/templates/fullstack_nextjs/tier-1-essential/jest.config.ts +17 -0
  178. solokit/templates/fullstack_nextjs/tier-1-essential/jest.setup.ts +1 -0
  179. solokit/templates/fullstack_nextjs/tier-1-essential/package.json.tier1.template +48 -0
  180. solokit/templates/fullstack_nextjs/tier-1-essential/tests/api/example.test.ts +88 -0
  181. solokit/templates/fullstack_nextjs/tier-1-essential/tests/setup.ts +22 -0
  182. solokit/templates/fullstack_nextjs/tier-1-essential/tests/unit/example.test.tsx +22 -0
  183. solokit/templates/fullstack_nextjs/tier-2-standard/package.json.tier2.template +52 -0
  184. solokit/templates/fullstack_nextjs/tier-3-comprehensive/eslint.config.mjs +39 -0
  185. solokit/templates/fullstack_nextjs/tier-3-comprehensive/package.json.tier3.template +68 -0
  186. solokit/templates/fullstack_nextjs/tier-3-comprehensive/playwright.config.ts +66 -0
  187. solokit/templates/fullstack_nextjs/tier-3-comprehensive/stryker.conf.json +33 -0
  188. solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/e2e/flow.spec.ts +59 -0
  189. solokit/templates/fullstack_nextjs/tier-3-comprehensive/tests/integration/api.test.ts +165 -0
  190. solokit/templates/fullstack_nextjs/tier-3-comprehensive/type-coverage.json +12 -0
  191. solokit/templates/fullstack_nextjs/tier-4-production/instrumentation.ts +9 -0
  192. solokit/templates/fullstack_nextjs/tier-4-production/k6/load-test.js +45 -0
  193. solokit/templates/fullstack_nextjs/tier-4-production/next.config.ts +46 -0
  194. solokit/templates/fullstack_nextjs/tier-4-production/package.json.tier4.template +77 -0
  195. solokit/templates/fullstack_nextjs/tier-4-production/sentry.client.config.ts +26 -0
  196. solokit/templates/fullstack_nextjs/tier-4-production/sentry.edge.config.ts +11 -0
  197. solokit/templates/fullstack_nextjs/tier-4-production/sentry.server.config.ts +11 -0
  198. solokit/templates/git-hooks/prepare-commit-msg +24 -0
  199. solokit/templates/integration_test_spec.md +363 -0
  200. solokit/templates/learnings.json +15 -0
  201. solokit/templates/ml_ai_fastapi/base/.gitignore +104 -0
  202. solokit/templates/ml_ai_fastapi/base/alembic/env.py +96 -0
  203. solokit/templates/ml_ai_fastapi/base/alembic.ini +114 -0
  204. solokit/templates/ml_ai_fastapi/base/pyproject.toml.template +91 -0
  205. solokit/templates/ml_ai_fastapi/base/requirements.txt.template +28 -0
  206. solokit/templates/ml_ai_fastapi/base/src/__init__.py +5 -0
  207. solokit/templates/ml_ai_fastapi/base/src/api/__init__.py +3 -0
  208. solokit/templates/ml_ai_fastapi/base/src/api/dependencies.py +20 -0
  209. solokit/templates/ml_ai_fastapi/base/src/api/routes/__init__.py +3 -0
  210. solokit/templates/ml_ai_fastapi/base/src/api/routes/example.py +134 -0
  211. solokit/templates/ml_ai_fastapi/base/src/api/routes/health.py +66 -0
  212. solokit/templates/ml_ai_fastapi/base/src/core/__init__.py +3 -0
  213. solokit/templates/ml_ai_fastapi/base/src/core/config.py +64 -0
  214. solokit/templates/ml_ai_fastapi/base/src/core/database.py +50 -0
  215. solokit/templates/ml_ai_fastapi/base/src/main.py +64 -0
  216. solokit/templates/ml_ai_fastapi/base/src/models/__init__.py +7 -0
  217. solokit/templates/ml_ai_fastapi/base/src/models/example.py +61 -0
  218. solokit/templates/ml_ai_fastapi/base/src/services/__init__.py +3 -0
  219. solokit/templates/ml_ai_fastapi/base/src/services/example.py +115 -0
  220. solokit/templates/ml_ai_fastapi/docker/Dockerfile +59 -0
  221. solokit/templates/ml_ai_fastapi/docker/docker-compose.prod.yml +112 -0
  222. solokit/templates/ml_ai_fastapi/docker/docker-compose.yml +77 -0
  223. solokit/templates/ml_ai_fastapi/tier-1-essential/pyproject.toml.tier1.template +112 -0
  224. solokit/templates/ml_ai_fastapi/tier-1-essential/pyrightconfig.json +41 -0
  225. solokit/templates/ml_ai_fastapi/tier-1-essential/pytest.ini +69 -0
  226. solokit/templates/ml_ai_fastapi/tier-1-essential/requirements-dev.txt +17 -0
  227. solokit/templates/ml_ai_fastapi/tier-1-essential/ruff.toml +81 -0
  228. solokit/templates/ml_ai_fastapi/tier-1-essential/tests/__init__.py +3 -0
  229. solokit/templates/ml_ai_fastapi/tier-1-essential/tests/conftest.py +72 -0
  230. solokit/templates/ml_ai_fastapi/tier-1-essential/tests/test_main.py +49 -0
  231. solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/__init__.py +3 -0
  232. solokit/templates/ml_ai_fastapi/tier-1-essential/tests/unit/test_example.py +113 -0
  233. solokit/templates/ml_ai_fastapi/tier-2-standard/pyproject.toml.tier2.template +130 -0
  234. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/locustfile.py +99 -0
  235. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/mutmut_config.py +53 -0
  236. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/pyproject.toml.tier3.template +150 -0
  237. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/__init__.py +3 -0
  238. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/conftest.py +74 -0
  239. solokit/templates/ml_ai_fastapi/tier-3-comprehensive/tests/integration/test_api.py +131 -0
  240. solokit/templates/ml_ai_fastapi/tier-4-production/pyproject.toml.tier4.template +162 -0
  241. solokit/templates/ml_ai_fastapi/tier-4-production/requirements-prod.txt +25 -0
  242. solokit/templates/ml_ai_fastapi/tier-4-production/src/api/routes/metrics.py +19 -0
  243. solokit/templates/ml_ai_fastapi/tier-4-production/src/core/logging.py +74 -0
  244. solokit/templates/ml_ai_fastapi/tier-4-production/src/core/monitoring.py +68 -0
  245. solokit/templates/ml_ai_fastapi/tier-4-production/src/core/sentry.py +66 -0
  246. solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/__init__.py +3 -0
  247. solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/logging.py +79 -0
  248. solokit/templates/ml_ai_fastapi/tier-4-production/src/middleware/tracing.py +60 -0
  249. solokit/templates/refactor_spec.md +287 -0
  250. solokit/templates/saas_t3/base/.gitignore +36 -0
  251. solokit/templates/saas_t3/base/app/api/trpc/[trpc]/route.ts +33 -0
  252. solokit/templates/saas_t3/base/app/globals.css +27 -0
  253. solokit/templates/saas_t3/base/app/layout.tsx +23 -0
  254. solokit/templates/saas_t3/base/app/page.tsx +31 -0
  255. solokit/templates/saas_t3/base/lib/api.tsx +77 -0
  256. solokit/templates/saas_t3/base/lib/utils.ts +13 -0
  257. solokit/templates/saas_t3/base/next.config.ts +7 -0
  258. solokit/templates/saas_t3/base/package.json.template +38 -0
  259. solokit/templates/saas_t3/base/postcss.config.mjs +8 -0
  260. solokit/templates/saas_t3/base/prisma/schema.prisma +20 -0
  261. solokit/templates/saas_t3/base/server/api/root.ts +19 -0
  262. solokit/templates/saas_t3/base/server/api/routers/example.ts +28 -0
  263. solokit/templates/saas_t3/base/server/api/trpc.ts +52 -0
  264. solokit/templates/saas_t3/base/server/db.ts +17 -0
  265. solokit/templates/saas_t3/base/tailwind.config.ts +19 -0
  266. solokit/templates/saas_t3/base/tsconfig.json +27 -0
  267. solokit/templates/saas_t3/docker/Dockerfile +60 -0
  268. solokit/templates/saas_t3/docker/docker-compose.prod.yml +59 -0
  269. solokit/templates/saas_t3/docker/docker-compose.yml +49 -0
  270. solokit/templates/saas_t3/tier-1-essential/.eslintrc.json +7 -0
  271. solokit/templates/saas_t3/tier-1-essential/jest.config.ts +17 -0
  272. solokit/templates/saas_t3/tier-1-essential/jest.setup.ts +1 -0
  273. solokit/templates/saas_t3/tier-1-essential/package.json.tier1.template +54 -0
  274. solokit/templates/saas_t3/tier-1-essential/tests/setup.ts +22 -0
  275. solokit/templates/saas_t3/tier-1-essential/tests/unit/example.test.tsx +24 -0
  276. solokit/templates/saas_t3/tier-2-standard/package.json.tier2.template +58 -0
  277. solokit/templates/saas_t3/tier-3-comprehensive/eslint.config.mjs +39 -0
  278. solokit/templates/saas_t3/tier-3-comprehensive/package.json.tier3.template +74 -0
  279. solokit/templates/saas_t3/tier-3-comprehensive/playwright.config.ts +66 -0
  280. solokit/templates/saas_t3/tier-3-comprehensive/stryker.conf.json +34 -0
  281. solokit/templates/saas_t3/tier-3-comprehensive/tests/e2e/home.spec.ts +41 -0
  282. solokit/templates/saas_t3/tier-3-comprehensive/tests/integration/api.test.ts +44 -0
  283. solokit/templates/saas_t3/tier-3-comprehensive/type-coverage.json +12 -0
  284. solokit/templates/saas_t3/tier-4-production/instrumentation.ts +9 -0
  285. solokit/templates/saas_t3/tier-4-production/k6/load-test.js +51 -0
  286. solokit/templates/saas_t3/tier-4-production/next.config.ts +46 -0
  287. solokit/templates/saas_t3/tier-4-production/package.json.tier4.template +83 -0
  288. solokit/templates/saas_t3/tier-4-production/sentry.client.config.ts +26 -0
  289. solokit/templates/saas_t3/tier-4-production/sentry.edge.config.ts +11 -0
  290. solokit/templates/saas_t3/tier-4-production/sentry.server.config.ts +11 -0
  291. solokit/templates/saas_t3/tier-4-production/vercel.json +37 -0
  292. solokit/templates/security_spec.md +287 -0
  293. solokit/templates/stack-versions.yaml +617 -0
  294. solokit/templates/status_update.json +6 -0
  295. solokit/templates/template-registry.json +257 -0
  296. solokit/templates/work_items.json +11 -0
  297. solokit/testing/__init__.py +1 -0
  298. solokit/testing/integration_runner.py +550 -0
  299. solokit/testing/performance.py +637 -0
  300. solokit/visualization/__init__.py +1 -0
  301. solokit/visualization/dependency_graph.py +788 -0
  302. solokit/work_items/__init__.py +1 -0
  303. solokit/work_items/creator.py +217 -0
  304. solokit/work_items/delete.py +264 -0
  305. solokit/work_items/get_dependencies.py +185 -0
  306. solokit/work_items/get_dependents.py +113 -0
  307. solokit/work_items/get_metadata.py +121 -0
  308. solokit/work_items/get_next_recommendations.py +133 -0
  309. solokit/work_items/manager.py +235 -0
  310. solokit/work_items/milestones.py +137 -0
  311. solokit/work_items/query.py +376 -0
  312. solokit/work_items/repository.py +267 -0
  313. solokit/work_items/scheduler.py +184 -0
  314. solokit/work_items/spec_parser.py +838 -0
  315. solokit/work_items/spec_validator.py +493 -0
  316. solokit/work_items/updater.py +157 -0
  317. solokit/work_items/validator.py +205 -0
  318. solokit-0.1.1.dist-info/METADATA +640 -0
  319. solokit-0.1.1.dist-info/RECORD +323 -0
  320. solokit-0.1.1.dist-info/WHEEL +5 -0
  321. solokit-0.1.1.dist-info/entry_points.txt +2 -0
  322. solokit-0.1.1.dist-info/licenses/LICENSE +21 -0
  323. 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."""