specsmith 0.21.0.dev777__tar.gz → 0.22.0__tar.gz

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 (393) hide show
  1. {specsmith-0.21.0.dev777/src/specsmith.egg-info → specsmith-0.22.0}/PKG-INFO +48 -13
  2. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/README.md +47 -12
  3. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/pyproject.toml +1 -1
  4. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/__init__.py +1 -1
  5. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/advanced_code_analysis.py +1 -1
  6. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/cleanup.py +2 -2
  7. specsmith-0.22.0/src/specsmith/chat_handoff.py +107 -0
  8. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/cli.py +147 -7
  9. specsmith-0.22.0/src/specsmith/commands/zoo_code.py +776 -0
  10. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/config.py +7 -4
  11. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/context_orchestrator.py +5 -4
  12. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/importer.py +3 -1
  13. specsmith-0.22.0/src/specsmith/improvement_tracker.py +186 -0
  14. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/warp.py +1 -1
  15. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/local_model.py +22 -4
  16. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/__init__.py +4 -0
  17. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m006_session_governance.py +1 -1
  18. specsmith-0.22.0/src/specsmith/migrations/m011_windows_skill_shell.py +64 -0
  19. specsmith-0.22.0/src/specsmith/migrations/m012_normalize_skill_shell.py +56 -0
  20. specsmith-0.22.0/src/specsmith/model_optimizer.py +182 -0
  21. specsmith-0.22.0/src/specsmith/model_registry.py +970 -0
  22. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/quality_report.py +5 -2
  23. specsmith-0.22.0/src/specsmith/release_guard.py +36 -0
  24. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/session_store.py +82 -0
  25. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/__init__.py +55 -59
  26. specsmith-0.22.0/src/specsmith/skills/governance.py +523 -0
  27. specsmith-0.22.0/src/specsmith/skills/specsmith_core_commands.py +355 -0
  28. specsmith-0.22.0/src/specsmith/skills/specsmith_operations.py +67 -0
  29. specsmith-0.22.0/src/specsmith/skills/specsmith_skills.py +110 -0
  30. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/sync.py +34 -11
  31. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/agents.md.j2 +1 -1
  32. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/contributing.md.j2 +16 -1
  33. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/gitignore.j2 +5 -1
  34. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/updater.py +24 -2
  35. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs_commands.py +33 -14
  36. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/wi_store.py +9 -2
  37. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/workspace.py +1 -1
  38. {specsmith-0.21.0.dev777 → specsmith-0.22.0/src/specsmith.egg-info}/PKG-INFO +48 -13
  39. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith.egg-info/SOURCES.txt +21 -1
  40. specsmith-0.22.0/tests/test_branch_workflow.py +88 -0
  41. specsmith-0.22.0/tests/test_chat_handoff.py +80 -0
  42. specsmith-0.22.0/tests/test_docs_artifacts.py +19 -0
  43. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_enforcement.py +101 -2
  44. specsmith-0.22.0/tests/test_improvement_tracker.py +242 -0
  45. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_local_model.py +19 -7
  46. specsmith-0.22.0/tests/test_migrations_skill_shell.py +58 -0
  47. specsmith-0.22.0/tests/test_model_registry.py +260 -0
  48. specsmith-0.22.0/tests/test_release_guard.py +41 -0
  49. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_scaffolder.py +3 -1
  50. specsmith-0.22.0/tests/test_session_events.py +53 -0
  51. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_typing_guardrails.py +1 -1
  52. specsmith-0.22.0/tests/test_updater.py +16 -0
  53. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_warp_parity_followup.py +25 -1
  54. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_wi_lifecycle.py +14 -0
  55. specsmith-0.22.0/tests/test_windows_launcher.py +40 -0
  56. specsmith-0.21.0.dev777/src/specsmith/skills/governance.py +0 -1370
  57. specsmith-0.21.0.dev777/src/specsmith/skills/specsmith_skills.py +0 -29
  58. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/LICENSE +0 -0
  59. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/setup.cfg +0 -0
  60. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/__init__.py +0 -0
  61. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/belief.py +0 -0
  62. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/certainty.py +0 -0
  63. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/failure_graph.py +0 -0
  64. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/py.typed +0 -0
  65. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/recovery.py +0 -0
  66. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/session.py +0 -0
  67. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/stress_tester.py +0 -0
  68. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/epistemic/trace.py +0 -0
  69. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/__main__.py +0 -0
  70. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/__init__.py +0 -0
  71. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/broker.py +0 -0
  72. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/chat_runner.py +0 -0
  73. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/context_seed.py +0 -0
  74. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/core.py +0 -0
  75. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/__init__.py +0 -0
  76. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/_status.py +0 -0
  77. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/dag.py +0 -0
  78. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  79. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/events.py +0 -0
  80. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/dispatch/result.py +0 -0
  81. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/endpoints.py +0 -0
  82. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/events.py +0 -0
  83. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/execution_profiles.py +0 -0
  84. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/fallback.py +0 -0
  85. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/hf_leaderboard.py +0 -0
  86. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/hf_sync.py +0 -0
  87. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/indexer.py +0 -0
  88. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/llm_client.py +0 -0
  89. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/mcp.py +0 -0
  90. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/memory.py +0 -0
  91. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/model_intelligence.py +0 -0
  92. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/model_profiles.py +0 -0
  93. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/model_router.py +0 -0
  94. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/orchestrator.py +0 -0
  95. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/permissions.py +0 -0
  96. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/profiles.py +0 -0
  97. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/provider_registry.py +0 -0
  98. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/repl.py +0 -0
  99. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/router.py +0 -0
  100. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/rules.py +0 -0
  101. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/runner.py +0 -0
  102. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/safety.py +0 -0
  103. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/spawner.py +0 -0
  104. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/suggester.py +0 -0
  105. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/teams.py +0 -0
  106. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/terminal_env.py +0 -0
  107. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/token_pricing.py +0 -0
  108. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/tools.py +0 -0
  109. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/verifier.py +0 -0
  110. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/agent/voice.py +0 -0
  111. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/approvals.py +0 -0
  112. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/architect.py +0 -0
  113. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/auditor.py +0 -0
  114. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/auth.py +0 -0
  115. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/block_export.py +0 -0
  116. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/channel.py +0 -0
  117. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/ci_manager.py +0 -0
  118. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/code_analysis.py +0 -0
  119. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/commands/__init__.py +0 -0
  120. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/commands/intelligence.py +0 -0
  121. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/commands/issues_policy.py +0 -0
  122. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/commands/reporting.py +0 -0
  123. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/__init__.py +0 -0
  124. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/_compat.py +0 -0
  125. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/checker.py +0 -0
  126. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/evidence.py +0 -0
  127. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/regulations.py +0 -0
  128. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compliance/reporter.py +0 -0
  129. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/compressor.py +0 -0
  130. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/console_utils.py +0 -0
  131. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/context_window.py +0 -0
  132. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/credit_analyzer.py +0 -0
  133. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/credits.py +0 -0
  134. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/dashboard.py +0 -0
  135. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/__init__.py +0 -0
  136. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/base.py +0 -0
  137. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/citations.py +0 -0
  138. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/fpd.py +0 -0
  139. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/odp.py +0 -0
  140. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/patentsview.py +0 -0
  141. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/pfw.py +0 -0
  142. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/ppubs.py +0 -0
  143. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/datasources/ptab.py +0 -0
  144. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/differ.py +0 -0
  145. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/doctor.py +0 -0
  146. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/drive.py +0 -0
  147. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/editor.py +0 -0
  148. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/efficiency.py +0 -0
  149. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/__init__.py +0 -0
  150. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/belief.py +0 -0
  151. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/certainty.py +0 -0
  152. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/failure_graph.py +0 -0
  153. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/recovery.py +0 -0
  154. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/epistemic/stress_tester.py +0 -0
  155. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb/__init__.py +0 -0
  156. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb/_license.py +0 -0
  157. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb/bridge.py +0 -0
  158. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb/sqlite_store.py +0 -0
  159. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb_sweep.py +0 -0
  160. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/esdb_writer.py +0 -0
  161. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/eval/__init__.py +0 -0
  162. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/eval/builtins.py +0 -0
  163. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/eval/runner.py +0 -0
  164. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/executor.py +0 -0
  165. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/exporter.py +0 -0
  166. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/governance_logic.py +0 -0
  167. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/governance_store.py +0 -0
  168. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/governance_yaml.py +0 -0
  169. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/governed_pr.py +0 -0
  170. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/__init__.py +0 -0
  171. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/app.py +0 -0
  172. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/main_window.py +0 -0
  173. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/session_tab.py +0 -0
  174. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/theme.py +0 -0
  175. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/__init__.py +0 -0
  176. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/chat_view.py +0 -0
  177. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/input_bar.py +0 -0
  178. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  179. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/token_meter.py +0 -0
  180. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  181. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/widgets/update_checker.py +0 -0
  182. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/gui/worker.py +0 -0
  183. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/history_search.py +0 -0
  184. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/instinct.py +0 -0
  185. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/__init__.py +0 -0
  186. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/agent_skill.py +0 -0
  187. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/aider.py +0 -0
  188. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/base.py +0 -0
  189. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/claude_code.py +0 -0
  190. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/codity.py +0 -0
  191. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/copilot.py +0 -0
  192. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/cursor.py +0 -0
  193. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/gemini.py +0 -0
  194. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/integrations/windsurf.py +0 -0
  195. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/issue_reporter.py +0 -0
  196. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/languages.py +0 -0
  197. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/ledger.py +0 -0
  198. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/mcp_generator.py +0 -0
  199. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/mcp_server.py +0 -0
  200. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  201. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  202. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  203. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  204. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  205. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  206. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
  207. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m009_esdb_first.py +0 -0
  208. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
  209. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/migrations/runner.py +0 -0
  210. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/ollama_cmds.py +0 -0
  211. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/patent.py +0 -0
  212. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/paths.py +0 -0
  213. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/phase.py +0 -0
  214. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/plugins.py +0 -0
  215. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/policy.py +0 -0
  216. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/profiles.py +0 -0
  217. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/project_metrics.py +0 -0
  218. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/rate_limits.py +0 -0
  219. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/recover.py +0 -0
  220. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/releaser.py +0 -0
  221. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/requirements.py +0 -0
  222. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/requirements_parser.py +0 -0
  223. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/retrieval.py +0 -0
  224. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/risk.py +0 -0
  225. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/safe_write.py +0 -0
  226. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/scaffolder.py +0 -0
  227. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/serve.py +0 -0
  228. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/session.py +0 -0
  229. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/session_init.py +0 -0
  230. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/ai_agents.py +0 -0
  231. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/cloud.py +0 -0
  232. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/corporate.py +0 -0
  233. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/cross_platform.py +0 -0
  234. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/data_engineering.py +0 -0
  235. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/devops.py +0 -0
  236. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/docs.py +0 -0
  237. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/embedded.py +0 -0
  238. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/hardware.py +0 -0
  239. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/mobile.py +0 -0
  240. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/platform_engineering.py +0 -0
  241. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/productivity.py +0 -0
  242. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/software_engineering.py +0 -0
  243. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/ssh.py +0 -0
  244. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills/web_backend.py +0 -0
  245. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/skills_builder.py +0 -0
  246. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  247. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  248. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  249. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  250. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  251. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  252. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/community/security.md.j2 +0 -0
  253. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  254. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  255. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  256. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  257. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  258. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/editorconfig.j2 +0 -0
  259. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/gitattributes.j2 +0 -0
  260. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/go/go.mod.j2 +0 -0
  261. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/go/main.go.j2 +0 -0
  262. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  263. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  264. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  265. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  266. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  267. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  268. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  269. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  270. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  271. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  272. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  273. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/js/package.json.j2 +0 -0
  274. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/ledger.md.j2 +0 -0
  275. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/python/cli.py.j2 +0 -0
  276. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/python/init.py.j2 +0 -0
  277. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  278. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/readme.md.j2 +0 -0
  279. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  280. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  281. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  282. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  283. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  284. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  285. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  286. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  287. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  288. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/tool_installer.py +0 -0
  289. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/toolrules.py +0 -0
  290. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/tools.py +0 -0
  291. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/trace.py +0 -0
  292. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/transcripts.py +0 -0
  293. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/upgrader.py +0 -0
  294. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/validator.py +0 -0
  295. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs/__init__.py +0 -0
  296. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs/base.py +0 -0
  297. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs/bitbucket.py +0 -0
  298. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs/github.py +0 -0
  299. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/vcs/gitlab.py +0 -0
  300. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith/wireframes.py +0 -0
  301. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith.egg-info/dependency_links.txt +0 -0
  302. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith.egg-info/entry_points.txt +0 -0
  303. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith.egg-info/requires.txt +0 -0
  304. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/src/specsmith.egg-info/top_level.txt +0 -0
  305. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_CMD_001.py +0 -0
  306. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_agent_profiles.py +0 -0
  307. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_agent_run_feedback.py +0 -0
  308. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_agent_runner_ready.py +0 -0
  309. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_ai_client.py +0 -0
  310. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_ai_intelligence.py +0 -0
  311. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_architect_interview.py +0 -0
  312. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_architect_v2.py +0 -0
  313. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_architecture.py +0 -0
  314. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_audit_governance.py +0 -0
  315. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_auditor.py +0 -0
  316. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_benchmark_harness.py +0 -0
  317. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_broker_scope.py +0 -0
  318. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_channel.py +0 -0
  319. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_chat_diff_decision.py +0 -0
  320. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_chat_runner_openai_compat.py +0 -0
  321. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_chat_stdin_protocol.py +0 -0
  322. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_cleanup_cmd.py +0 -0
  323. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_cli.py +0 -0
  324. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_cli_regressions.py +0 -0
  325. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_cli_workflows_history_drive.py +0 -0
  326. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_compliance.py +0 -0
  327. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_compliance_governance.py +0 -0
  328. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_compressor.py +0 -0
  329. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_deprecation_registry.py +0 -0
  330. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_dispatch.py +0 -0
  331. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_dual_write.py +0 -0
  332. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_e2e_nexus.py +0 -0
  333. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_efficiency.py +0 -0
  334. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_endpoints_cli.py +0 -0
  335. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_endpoints_store.py +0 -0
  336. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_epistemic.py +0 -0
  337. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_backend_switch.py +0 -0
  338. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_integration.py +0 -0
  339. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_license.py +0 -0
  340. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_sqlite.py +0 -0
  341. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_status_integrity.py +0 -0
  342. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_status_output.py +0 -0
  343. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_sweep.py +0 -0
  344. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_verify_chain_cli.py +0 -0
  345. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_esdb_writer.py +0 -0
  346. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_fallback_chain.py +0 -0
  347. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_golden_path.py +0 -0
  348. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_importer.py +0 -0
  349. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_init_modes.py +0 -0
  350. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_integrations.py +0 -0
  351. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_integrations_codity.py +0 -0
  352. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_integrations_warp.py +0 -0
  353. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_intelligence.py +0 -0
  354. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_issue_policy_features.py +0 -0
  355. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_issue_reporter.py +0 -0
  356. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_issues_263_264.py +0 -0
  357. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_markdown_deprecation.py +0 -0
  358. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_mcp_client.py +0 -0
  359. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_mcp_server.py +0 -0
  360. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_metrics_flush.py +0 -0
  361. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_migration_direction.py +0 -0
  362. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_model_router.py +0 -0
  363. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_new_modules.py +0 -0
  364. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_nexus.py +0 -0
  365. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_parallel_agents.py +0 -0
  366. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_permissions.py +0 -0
  367. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_phase1_4_new.py +0 -0
  368. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_phase34_completion.py +0 -0
  369. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_project_metrics.py +0 -0
  370. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_quality_report.py +0 -0
  371. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_rate_limits.py +0 -0
  372. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_releaser.py +0 -0
  373. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_repl.py +0 -0
  374. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_repl_extended.py +0 -0
  375. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_reporting_commands.py +0 -0
  376. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_req_248_262.py +0 -0
  377. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_req_358_359.py +0 -0
  378. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_resume_command.py +0 -0
  379. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_schema_migrations.py +0 -0
  380. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_skill_marketplace.py +0 -0
  381. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_skills_mcp.py +0 -0
  382. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_smoke.py +0 -0
  383. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_sqlite_parity.py +0 -0
  384. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_suggester.py +0 -0
  385. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_sync_reconcile.py +0 -0
  386. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_terminal_env.py +0 -0
  387. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_token_cost.py +0 -0
  388. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_tools.py +0 -0
  389. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_trace_vault_esdb.py +0 -0
  390. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_validator.py +0 -0
  391. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_vcs.py +0 -0
  392. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_warp_parity.py +0 -0
  393. {specsmith-0.21.0.dev777 → specsmith-0.22.0}/tests/test_wi_lifecycle_extended.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.21.0.dev777
3
+ Version: 0.22.0
4
4
  Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
5
5
  Author: Layer1Labs Silicon, Inc.
6
6
  License-Expression: MIT
@@ -102,6 +102,8 @@ AI Agents / IDE Clients
102
102
  ## When to use / when not to use
103
103
 
104
104
  - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
105
+ - Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
106
+ - Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
105
107
  - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
106
108
 
107
109
  ## Comparison summary
@@ -124,8 +126,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
124
126
 
125
127
  **Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
126
128
 
129
+ ## Current Stats
130
+
131
+ - **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
132
+ - **127 canonical skills** available across all domains
133
+ - **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
134
+ - **Development mode** with improvement tracking and session analysis
135
+
136
+ See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
137
+
138
+ ### Development Mode Features
139
+
140
+ When enabled in project configuration, development mode provides:
141
+
142
+ - **Enhanced logging** for all agent interactions and decision-making processes
143
+ - **Session analysis** that tracks what worked, what didn't, and improvement suggestions
144
+ - **Cost-per-correct-solution metrics** to measure efficiency
145
+ - **Automated improvement tracking** to identify patterns and areas for optimization
146
+ - **Session reports** that can be generated for review and analysis
147
+
148
+ To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
149
+
127
150
  See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
128
151
 
152
+ **v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
153
+ other agents, while a mergeable JSONL session-event log keeps collaboration state
154
+ reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
155
+ stable-release validation before PyPI publishing.
156
+
129
157
  **v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
130
158
 
131
159
  **v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
@@ -148,6 +176,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
148
176
  specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
149
177
  specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
150
178
  specsmith export # generate full compliance report
179
+ specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
151
180
 
152
181
  # Update channels
153
182
  specsmith channel set stable # pin to stable releases
@@ -215,17 +244,6 @@ specsmith phase list # list all phases
215
244
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
216
245
  of file/command criteria, recommended commands, and a readiness percentage.
217
246
 
218
- ## 1.0 release criteria status
219
-
220
- | Criterion | Status | Source |
221
- |---|---|---|
222
- | Stable CLI core contract documented | In progress | `docs/stability.md` |
223
- | Stable generated file schemas documented | In progress | `docs/stability.md` |
224
- | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
225
- | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
226
- | Security threat model documented | In progress | `docs/security-threat-model.md` |
227
- | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
228
- | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
229
247
 
230
248
  ---
231
249
 
@@ -353,6 +371,14 @@ specsmith phase # current phase + readiness %
353
371
  specsmith audit # full governance health check
354
372
  ```
355
373
 
374
+ > **Session Bootstrap**: For a more streamlined session start, you can also use:
375
+ > ```bash
376
+ > specsmith load # run migrate, audit, sync, and checkpoint in sequence
377
+ > ```
378
+ > This command combines the essential bootstrap steps for a clean session start.
379
+ >
380
+ > **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
381
+
356
382
  > **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
357
383
  > Every utterance is preflighted automatically. Use `/why` to see the governance trace.
358
384
  > For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
@@ -1130,6 +1156,16 @@ specsmith skill install specsmith-audit
1130
1156
 
1131
1157
  Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
1132
1158
 
1159
+ ### Skill Policy
1160
+
1161
+ If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
1162
+
1163
+ If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
1164
+
1165
+ If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
1166
+
1167
+ Do not hand-edit `.agents/skills/` as a canonical source.
1168
+
1133
1169
  ### Skill domains
1134
1170
 
1135
1171
  | Domain | Count | Coverage |
@@ -1388,7 +1424,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
1388
1424
  - [PyPI](https://pypi.org/project/specsmith/)
1389
1425
  - [Documentation](https://specsmith.readthedocs.io)
1390
1426
  - [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
1391
- - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
1392
1427
  - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
1393
1428
  - [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
1394
1429
  - [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
@@ -24,6 +24,8 @@ AI Agents / IDE Clients
24
24
  ## When to use / when not to use
25
25
 
26
26
  - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
27
+ - Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
28
+ - Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
27
29
  - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
28
30
 
29
31
  ## Comparison summary
@@ -46,8 +48,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
46
48
 
47
49
  **Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
48
50
 
51
+ ## Current Stats
52
+
53
+ - **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
54
+ - **127 canonical skills** available across all domains
55
+ - **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
56
+ - **Development mode** with improvement tracking and session analysis
57
+
58
+ See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
59
+
60
+ ### Development Mode Features
61
+
62
+ When enabled in project configuration, development mode provides:
63
+
64
+ - **Enhanced logging** for all agent interactions and decision-making processes
65
+ - **Session analysis** that tracks what worked, what didn't, and improvement suggestions
66
+ - **Cost-per-correct-solution metrics** to measure efficiency
67
+ - **Automated improvement tracking** to identify patterns and areas for optimization
68
+ - **Session reports** that can be generated for review and analysis
69
+
70
+ To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
71
+
49
72
  See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
50
73
 
74
+ **v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
75
+ other agents, while a mergeable JSONL session-event log keeps collaboration state
76
+ reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
77
+ stable-release validation before PyPI publishing.
78
+
51
79
  **v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
52
80
 
53
81
  **v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
@@ -70,6 +98,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
70
98
  specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
71
99
  specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
72
100
  specsmith export # generate full compliance report
101
+ specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
73
102
 
74
103
  # Update channels
75
104
  specsmith channel set stable # pin to stable releases
@@ -137,17 +166,6 @@ specsmith phase list # list all phases
137
166
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
138
167
  of file/command criteria, recommended commands, and a readiness percentage.
139
168
 
140
- ## 1.0 release criteria status
141
-
142
- | Criterion | Status | Source |
143
- |---|---|---|
144
- | Stable CLI core contract documented | In progress | `docs/stability.md` |
145
- | Stable generated file schemas documented | In progress | `docs/stability.md` |
146
- | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
147
- | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
148
- | Security threat model documented | In progress | `docs/security-threat-model.md` |
149
- | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
150
- | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
151
169
 
152
170
  ---
153
171
 
@@ -275,6 +293,14 @@ specsmith phase # current phase + readiness %
275
293
  specsmith audit # full governance health check
276
294
  ```
277
295
 
296
+ > **Session Bootstrap**: For a more streamlined session start, you can also use:
297
+ > ```bash
298
+ > specsmith load # run migrate, audit, sync, and checkpoint in sequence
299
+ > ```
300
+ > This command combines the essential bootstrap steps for a clean session start.
301
+ >
302
+ > **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
303
+
278
304
  > **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
279
305
  > Every utterance is preflighted automatically. Use `/why` to see the governance trace.
280
306
  > For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
@@ -1052,6 +1078,16 @@ specsmith skill install specsmith-audit
1052
1078
 
1053
1079
  Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
1054
1080
 
1081
+ ### Skill Policy
1082
+
1083
+ If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
1084
+
1085
+ If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
1086
+
1087
+ If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
1088
+
1089
+ Do not hand-edit `.agents/skills/` as a canonical source.
1090
+
1055
1091
  ### Skill domains
1056
1092
 
1057
1093
  | Domain | Count | Coverage |
@@ -1310,7 +1346,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
1310
1346
  - [PyPI](https://pypi.org/project/specsmith/)
1311
1347
  - [Documentation](https://specsmith.readthedocs.io)
1312
1348
  - [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
1313
- - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
1314
1349
  - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
1315
1350
  - [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
1316
1351
  - [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.21.0.dev777"
7
+ version = "0.22.0"
8
8
  description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
8
8
  try:
9
9
  __version__: str = _pkg_version("specsmith")
10
10
  except PackageNotFoundError: # running from source without install
11
- __version__ = "0.20.1" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.22.0" # fallback: keep in sync with pyproject.toml
@@ -174,7 +174,7 @@ class AdvancedCodeAnalyzer:
174
174
  ),
175
175
  )
176
176
  )
177
- except Exception:
177
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget analysis; log is written above
178
178
  pass
179
179
 
180
180
  return reports
@@ -249,7 +249,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
249
249
  reqs_yaml_dir = root / "docs" / "requirements"
250
250
  reqs_yaml_dir.mkdir(parents=True, exist_ok=True)
251
251
  consolidated.append("Consolidated requirements to YAML structure")
252
- except Exception:
252
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
253
253
  pass
254
254
 
255
255
  if tests_dir.exists() and tests_dir.is_dir():
@@ -258,7 +258,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
258
258
  tests_yaml_dir = root / "docs" / "tests"
259
259
  tests_yaml_dir.mkdir(parents=True, exist_ok=True)
260
260
  consolidated.append("Consolidated tests to YAML structure")
261
- except Exception:
261
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
262
262
  pass
263
263
 
264
264
  return consolidated
@@ -0,0 +1,107 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
3
+ """Evidence-preserving chat compaction and portable agent handoffs (REQ-446)."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import hashlib
8
+ import json
9
+ from datetime import datetime, timezone
10
+ from typing import Any
11
+
12
+ SCHEMA_VERSION = 1
13
+ _MAX_EXCERPT = 280
14
+
15
+
16
+ def build_handoff(
17
+ history: list[dict[str, Any]],
18
+ *,
19
+ work_item_ids: list[str] | None = None,
20
+ ) -> dict[str, Any]:
21
+ """Build an extractive, provenance-preserving envelope from chat turns.
22
+
23
+ This deliberately does not ask an LLM to invent a prose summary. Each
24
+ compacted claim remains a bounded excerpt linked to a deterministic turn ID,
25
+ allowing another agent to inspect the original history before relying on it.
26
+ """
27
+ turns: list[dict[str, str]] = []
28
+ for index, turn in enumerate(history):
29
+ role = turn.get("role")
30
+ content = turn.get("content")
31
+ if not isinstance(role, str) or not isinstance(content, str) or not content.strip():
32
+ continue
33
+ canonical = json.dumps(
34
+ {"role": role, "content": content}, sort_keys=True, ensure_ascii=False
35
+ )
36
+ source_id = f"turn:{hashlib.sha256(canonical.encode('utf-8')).hexdigest()[:16]}"
37
+ turns.append(
38
+ {
39
+ "source_id": source_id,
40
+ "role": role,
41
+ "excerpt": content.strip()[:_MAX_EXCERPT],
42
+ "position": str(index),
43
+ },
44
+ )
45
+
46
+ payload = {
47
+ "schema_version": SCHEMA_VERSION,
48
+ "kind": "epistemic_chat_handoff",
49
+ "created_at": datetime.now(timezone.utc).isoformat(),
50
+ "confidence": 1.0,
51
+ "uncertainty": "Extractive envelope; excerpts are not inferred claims.",
52
+ "work_item_ids": sorted(set(work_item_ids or [])),
53
+ "turns": turns,
54
+ }
55
+ fingerprint = json.dumps(payload, sort_keys=True, ensure_ascii=False)
56
+ digest = hashlib.sha256(fingerprint.encode("utf-8")).hexdigest()[:16].upper()
57
+ payload["id"] = f"HANDOFF-{digest}"
58
+ validate_handoff(payload)
59
+ return payload
60
+
61
+
62
+ def validate_handoff(payload: dict[str, Any]) -> None:
63
+ """Reject malformed or unsupported handoff claims before persistence/import."""
64
+ if (
65
+ payload.get("schema_version") != SCHEMA_VERSION
66
+ or payload.get("kind") != "epistemic_chat_handoff"
67
+ ):
68
+ raise ValueError("unsupported handoff schema")
69
+ if not isinstance(payload.get("id"), str) or not payload["id"].startswith("HANDOFF-"):
70
+ raise ValueError("handoff must have a stable ID")
71
+ if payload.get("confidence") != 1.0:
72
+ raise ValueError("extractive handoffs must retain confidence 1.0")
73
+ for turn in payload.get("turns", []):
74
+ if not isinstance(turn, dict) or not isinstance(turn.get("source_id"), str):
75
+ raise ValueError("handoff turn is missing provenance")
76
+ if not isinstance(turn.get("excerpt"), str) or len(turn["excerpt"]) > _MAX_EXCERPT:
77
+ raise ValueError("handoff excerpt is invalid")
78
+
79
+
80
+ def render_handoff_context(payload: dict[str, Any]) -> str:
81
+ """Render a bounded context entry that tells agents how to verify it."""
82
+ validate_handoff(payload)
83
+ excerpts = "\n".join(
84
+ f"- [{turn['source_id']}] {turn['role']}: {turn['excerpt']}" for turn in payload["turns"]
85
+ )
86
+ return (
87
+ f"[Epistemic handoff {payload['id']} | {len(payload['turns'])} extractive turns | "
88
+ "verify source IDs before treating excerpts as decisions]\n"
89
+ f"{excerpts}"
90
+ )
91
+
92
+
93
+ def store_handoff(root: Any, payload: dict[str, Any]) -> None:
94
+ """Persist a validated handoff in the active ESDB backend."""
95
+ validate_handoff(payload)
96
+ from specsmith.esdb import SqliteRecord, open_default_store
97
+
98
+ with open_default_store(root) as store:
99
+ store.upsert(
100
+ SqliteRecord(
101
+ id=payload["id"],
102
+ kind="chat_handoff",
103
+ label="Epistemic chat handoff",
104
+ confidence=1.0,
105
+ data=payload,
106
+ ),
107
+ )
@@ -5,6 +5,7 @@
5
5
  from __future__ import annotations
6
6
 
7
7
  import contextlib
8
+ import sys
8
9
  from pathlib import Path
9
10
  from typing import Any
10
11
 
@@ -13,6 +14,7 @@ import yaml
13
14
 
14
15
  from specsmith import __version__
15
16
  from specsmith.commands.issues_policy import register_issue_policy_commands
17
+ from specsmith.commands.zoo_code import zoo_code_group
16
18
  from specsmith.config import Platform, ProjectConfig, ProjectType
17
19
  from specsmith.console_utils import make_console
18
20
  from specsmith.requirements_parser import define_test_cases, parse_architecture_requirements
@@ -188,13 +190,17 @@ def _maybe_prompt_project_update() -> None:
188
190
 
189
191
  if installed < project:
190
192
  # Backward migration (downgrade) — hard error, REQ-370.
193
+ from specsmith.updater import version_mismatch_remediation
194
+
195
+ remedy = version_mismatch_remediation(project_ver)
191
196
  click.echo(
192
197
  f"\nERROR: specsmith downgrade detected.\n"
193
198
  f" Project spec_version : {project_ver}\n"
194
199
  f" Installed specsmith : {__version__} (older)\n"
195
200
  "\n"
196
201
  " Backward migration is not supported.\n"
197
- " Upgrade specsmith first: pipx upgrade specsmith\n"
202
+ f" Install the required version: {remedy}\n"
203
+ " Stable projects can instead use: pipx upgrade specsmith\n"
198
204
  " Then re-run this command.",
199
205
  err=True,
200
206
  )
@@ -594,8 +600,19 @@ def _load_config_with_inheritance(config_path: str) -> dict[str, object]:
594
600
  VCS_PLATFORM_CHOICES = {"1": "github", "2": "gitlab", "3": "bitbucket", "4": ""}
595
601
  VCS_PLATFORM_LABELS = {"1": "GitHub", "2": "GitLab", "3": "Bitbucket", "4": "None"}
596
602
 
597
- BRANCH_STRATEGY_CHOICES = {"1": "gitflow", "2": "trunk-based", "3": "github-flow"}
598
- BRANCH_STRATEGY_LABELS = {"1": "Gitflow", "2": "Trunk-based", "3": "GitHub Flow"}
603
+ BRANCH_STRATEGY_CHOICES = {
604
+ "1": "single-branch",
605
+ "2": "gitflow",
606
+ "3": "trunk-based",
607
+ "4": "github-flow",
608
+ }
609
+ BRANCH_STRATEGY_LABELS = {
610
+ "1": "Single branch (direct governed work on main)",
611
+ "2": "Gitflow",
612
+ "3": "Trunk-based",
613
+ "4": "GitHub Flow",
614
+ }
615
+ _BRANCH_WORKFLOWS = tuple(BRANCH_STRATEGY_CHOICES.values())
599
616
 
600
617
 
601
618
  def _interactive_config(no_git: bool) -> ProjectConfig:
@@ -630,7 +647,7 @@ def _interactive_config(no_git: bool) -> ProjectConfig:
630
647
  for k, v in BRANCH_STRATEGY_LABELS.items():
631
648
  console.print(f" {k}. {v}")
632
649
  branch_choice = click.prompt("Select strategy", default="1")
633
- branching_strategy = BRANCH_STRATEGY_CHOICES.get(branch_choice, "gitflow")
650
+ branching_strategy = BRANCH_STRATEGY_CHOICES.get(branch_choice, "single-branch")
634
651
 
635
652
  return ProjectConfig(
636
653
  name=name,
@@ -1880,6 +1897,17 @@ def doctor(project_dir: str, onboarding: bool, as_json: bool) -> None:
1880
1897
  ok, detail = _tool_version(tool)
1881
1898
  _add(tool, ok, detail)
1882
1899
 
1900
+ if _is_windows_platform():
1901
+ from specsmith.updater import find_windows_launchers
1902
+
1903
+ launchers = find_windows_launchers(__import__("os").environ.get("PATH", ""))
1904
+ _add(
1905
+ "specsmith launchers",
1906
+ len(launchers) <= 1,
1907
+ str(launchers[0]) if len(launchers) == 1 else f"{len(launchers)} found; use pipx only",
1908
+ warn=len(launchers) > 1,
1909
+ )
1910
+
1883
1911
  overall = "pass" if all(c["status"] != "fail" for c in checks) else "fail"
1884
1912
 
1885
1913
  if as_json:
@@ -1898,6 +1926,11 @@ def doctor(project_dir: str, onboarding: bool, as_json: bool) -> None:
1898
1926
  console.print("One or more checks failed.")
1899
1927
 
1900
1928
 
1929
+ def _is_windows_platform() -> bool:
1930
+ """Return whether the CLI is running on Windows."""
1931
+ return sys.platform == "win32"
1932
+
1933
+
1901
1934
  @main.command()
1902
1935
  @click.option(
1903
1936
  "--project-dir",
@@ -3633,12 +3666,12 @@ def branch_create(name: str, project_dir: str) -> None:
3633
3666
  """Create a branch following the branching strategy."""
3634
3667
  root = Path(project_dir).resolve()
3635
3668
  scaffold_path = root / "scaffold.yml"
3636
- strategy = "gitflow"
3669
+ strategy = "single-branch"
3637
3670
  main_branch = "main"
3638
3671
  if scaffold_path.exists():
3639
3672
  with open(scaffold_path) as f:
3640
3673
  raw = yaml.safe_load(f) or {}
3641
- strategy = raw.get("branching_strategy", "gitflow")
3674
+ strategy = raw.get("branching_strategy", "single-branch")
3642
3675
  main_branch = raw.get("default_branch", "main")
3643
3676
 
3644
3677
  from specsmith.vcs_commands import create_branch
@@ -3647,7 +3680,34 @@ def branch_create(name: str, project_dir: str) -> None:
3647
3680
  if result.success:
3648
3681
  console.print(f"[green]\u2713[/green] {result.message}")
3649
3682
  else:
3650
- console.print(f"[red]\u2717[/red] {result.message}")
3683
+ raise click.ClickException(result.message)
3684
+
3685
+
3686
+ @branch_group.command(name="workflow")
3687
+ @click.argument("strategy", required=False, type=click.Choice(_BRANCH_WORKFLOWS))
3688
+ @click.option("--project-dir", type=click.Path(exists=True), default=".")
3689
+ def branch_workflow(strategy: str | None, project_dir: str) -> None:
3690
+ """Show or explicitly select the governed branching workflow."""
3691
+ root = Path(project_dir).resolve()
3692
+ scaffold_path = root / "scaffold.yml"
3693
+ if not scaffold_path.exists():
3694
+ raise click.ClickException(
3695
+ "No scaffold.yml found; run specsmith init before selecting a workflow."
3696
+ )
3697
+
3698
+ with scaffold_path.open(encoding="utf-8") as handle:
3699
+ raw = yaml.safe_load(handle) or {}
3700
+ current = str(raw.get("branching_strategy", "single-branch"))
3701
+ if strategy is None:
3702
+ console.print(f"Branch workflow: {current}")
3703
+ return
3704
+
3705
+ raw["branching_strategy"] = strategy
3706
+ scaffold_path.write_text(
3707
+ yaml.safe_dump(raw, default_flow_style=False, sort_keys=False),
3708
+ encoding="utf-8",
3709
+ )
3710
+ console.print(f"[green]\u2713[/green] Branch workflow set to {strategy}")
3651
3711
 
3652
3712
 
3653
3713
  @branch_group.command(name="list")
@@ -3788,6 +3848,13 @@ def channel_set_cmd(channel: str) -> None:
3788
3848
  immediately for all subsequent ``specsmith self-update`` / ``update`` calls.
3789
3849
  """
3790
3850
  from specsmith.channel import set_persisted_channel
3851
+ from specsmith.updater import is_prerelease_version, version_mismatch_remediation
3852
+
3853
+ if channel == "stable" and is_prerelease_version(__version__):
3854
+ raise click.UsageError(
3855
+ "Cannot select stable while a prerelease is installed. "
3856
+ f"Install a stable build first: {version_mismatch_remediation('0.22.0')}"
3857
+ )
3791
3858
 
3792
3859
  set_persisted_channel(channel)
3793
3860
  channel_color = "cyan" if channel == "dev" else "green"
@@ -14292,6 +14359,7 @@ def local_model_setup_cmd() -> None:
14292
14359
 
14293
14360
 
14294
14361
  main.add_command(local_model_group)
14362
+ main.add_command(zoo_code_group)
14295
14363
 
14296
14364
 
14297
14365
  @main.command(name="ai-analyze")
@@ -14444,5 +14512,77 @@ def ai_analyze_cmd(project_dir: str, as_json: bool) -> None:
14444
14512
  raise SystemExit(1) from e
14445
14513
 
14446
14514
 
14515
+ # Development mode and improvement tracking commands
14516
+ @main.group(name="dev", invoke_without_command=True)
14517
+ def dev_group() -> None:
14518
+ """Development mode and improvement tracking commands."""
14519
+ pass
14520
+
14521
+
14522
+ @dev_group.command(name="session-report")
14523
+ @click.option(
14524
+ "--session-id",
14525
+ type=str,
14526
+ default=None,
14527
+ help="Session ID to report on (default: latest session).",
14528
+ )
14529
+ @click.option(
14530
+ "--project-dir",
14531
+ type=click.Path(exists=True),
14532
+ default=".",
14533
+ help="Project root directory.",
14534
+ )
14535
+ @click.option(
14536
+ "--json",
14537
+ "as_json",
14538
+ is_flag=True,
14539
+ default=False,
14540
+ help="Emit results as JSON.",
14541
+ )
14542
+ def dev_session_report_cmd(session_id: str | None, project_dir: str, as_json: bool) -> None:
14543
+ """Generate a session report with improvement analysis."""
14544
+ from pathlib import Path
14545
+
14546
+ from specsmith.improvement_tracker import ImprovementTracker
14547
+
14548
+ root = Path(project_dir).resolve()
14549
+ tracker = ImprovementTracker(root)
14550
+
14551
+ if as_json:
14552
+ # Return JSON output
14553
+ import json as _json
14554
+
14555
+ if session_id:
14556
+ analysis = tracker.get_session_analysis(session_id)
14557
+ if analysis:
14558
+ click.echo(_json.dumps(analysis.model_dump(), indent=2))
14559
+ else:
14560
+ click.echo(_json.dumps({"error": "Session not found"}, indent=2))
14561
+ else:
14562
+ # Get latest session
14563
+ # For simplicity, we'll just list recent sessions
14564
+ improvements = tracker.get_recent_improvements(10)
14565
+ result = {"recent_improvements": [imp.model_dump() for imp in improvements]}
14566
+ click.echo(_json.dumps(result, indent=2))
14567
+ else:
14568
+ # Return human-readable output
14569
+ if session_id:
14570
+ analysis = tracker.get_session_analysis(session_id)
14571
+ if analysis:
14572
+ report = tracker.generate_session_report(session_id)
14573
+ click.echo(report)
14574
+ else:
14575
+ click.echo(f"Session {session_id} not found.")
14576
+ else:
14577
+ # Show recent improvements
14578
+ improvements = tracker.get_recent_improvements(10)
14579
+ if improvements:
14580
+ click.echo("Recent Improvements:")
14581
+ for imp in improvements:
14582
+ click.echo(f" - {imp.description} ({imp.severity})")
14583
+ else:
14584
+ click.echo("No recent improvements recorded.")
14585
+
14586
+
14447
14587
  if __name__ == "__main__":
14448
14588
  main()