specsmith 0.17.0.dev649__tar.gz → 0.17.1.dev657__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 (336) hide show
  1. {specsmith-0.17.0.dev649/src/specsmith.egg-info → specsmith-0.17.1.dev657}/PKG-INFO +1 -1
  2. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/pyproject.toml +1 -1
  3. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/__init__.py +1 -1
  4. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/cli.py +18 -12
  5. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/config.py +1 -1
  6. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/governance_logic.py +19 -15
  7. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657/src/specsmith.egg-info}/PKG-INFO +1 -1
  8. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_cli.py +4 -2
  9. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/LICENSE +0 -0
  10. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/README.md +0 -0
  11. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/setup.cfg +0 -0
  12. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/__init__.py +0 -0
  13. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/belief.py +0 -0
  14. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/certainty.py +0 -0
  15. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/failure_graph.py +0 -0
  16. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/py.typed +0 -0
  17. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/recovery.py +0 -0
  18. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/session.py +0 -0
  19. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/stress_tester.py +0 -0
  20. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/epistemic/trace.py +0 -0
  21. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/__main__.py +0 -0
  22. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/__init__.py +0 -0
  23. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/broker.py +0 -0
  24. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/chat_runner.py +0 -0
  25. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/cleanup.py +0 -0
  26. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/context_seed.py +0 -0
  27. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/core.py +0 -0
  28. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/__init__.py +0 -0
  29. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/_status.py +0 -0
  30. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/dag.py +0 -0
  31. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  32. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/events.py +0 -0
  33. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/dispatch/result.py +0 -0
  34. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/endpoints.py +0 -0
  35. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/events.py +0 -0
  36. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/execution_profiles.py +0 -0
  37. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/fallback.py +0 -0
  38. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/hf_leaderboard.py +0 -0
  39. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/hf_sync.py +0 -0
  40. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/indexer.py +0 -0
  41. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/llm_client.py +0 -0
  42. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/mcp.py +0 -0
  43. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/memory.py +0 -0
  44. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/model_intelligence.py +0 -0
  45. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/model_profiles.py +0 -0
  46. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/model_router.py +0 -0
  47. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/orchestrator.py +0 -0
  48. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/permissions.py +0 -0
  49. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/profiles.py +0 -0
  50. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/provider_registry.py +0 -0
  51. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/repl.py +0 -0
  52. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/router.py +0 -0
  53. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/rules.py +0 -0
  54. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/runner.py +0 -0
  55. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/safety.py +0 -0
  56. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/spawner.py +0 -0
  57. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/suggester.py +0 -0
  58. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/teams.py +0 -0
  59. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/tools.py +0 -0
  60. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/verifier.py +0 -0
  61. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/agent/voice.py +0 -0
  62. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/approvals.py +0 -0
  63. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/architect.py +0 -0
  64. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/auditor.py +0 -0
  65. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/auth.py +0 -0
  66. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/block_export.py +0 -0
  67. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/channel.py +0 -0
  68. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/ci_manager.py +0 -0
  69. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/commands/__init__.py +0 -0
  70. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/commands/intelligence.py +0 -0
  71. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/commands/issues_policy.py +0 -0
  72. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/commands/reporting.py +0 -0
  73. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/__init__.py +0 -0
  74. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/_compat.py +0 -0
  75. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/checker.py +0 -0
  76. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/evidence.py +0 -0
  77. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/regulations.py +0 -0
  78. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compliance/reporter.py +0 -0
  79. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/compressor.py +0 -0
  80. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/console_utils.py +0 -0
  81. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/context_orchestrator.py +0 -0
  82. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/context_window.py +0 -0
  83. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/credit_analyzer.py +0 -0
  84. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/credits.py +0 -0
  85. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/dashboard.py +0 -0
  86. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/__init__.py +0 -0
  87. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/base.py +0 -0
  88. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/citations.py +0 -0
  89. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/fpd.py +0 -0
  90. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/odp.py +0 -0
  91. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/patentsview.py +0 -0
  92. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/pfw.py +0 -0
  93. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/ppubs.py +0 -0
  94. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/datasources/ptab.py +0 -0
  95. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/differ.py +0 -0
  96. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/doctor.py +0 -0
  97. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/drive.py +0 -0
  98. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/editor.py +0 -0
  99. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/__init__.py +0 -0
  100. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/belief.py +0 -0
  101. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/certainty.py +0 -0
  102. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/failure_graph.py +0 -0
  103. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/recovery.py +0 -0
  104. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/epistemic/stress_tester.py +0 -0
  105. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/esdb/__init__.py +0 -0
  106. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/esdb/_license.py +0 -0
  107. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/esdb/bridge.py +0 -0
  108. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/esdb/sqlite_store.py +0 -0
  109. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/eval/__init__.py +0 -0
  110. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/eval/builtins.py +0 -0
  111. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/eval/runner.py +0 -0
  112. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/executor.py +0 -0
  113. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/exporter.py +0 -0
  114. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/governance_store.py +0 -0
  115. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/governance_yaml.py +0 -0
  116. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/governed_pr.py +0 -0
  117. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/__init__.py +0 -0
  118. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/app.py +0 -0
  119. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/main_window.py +0 -0
  120. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/session_tab.py +0 -0
  121. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/theme.py +0 -0
  122. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/__init__.py +0 -0
  123. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/chat_view.py +0 -0
  124. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/input_bar.py +0 -0
  125. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  126. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/token_meter.py +0 -0
  127. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  128. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/widgets/update_checker.py +0 -0
  129. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/gui/worker.py +0 -0
  130. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/history_search.py +0 -0
  131. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/importer.py +0 -0
  132. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/instinct.py +0 -0
  133. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/__init__.py +0 -0
  134. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/agent_skill.py +0 -0
  135. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/aider.py +0 -0
  136. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/base.py +0 -0
  137. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/claude_code.py +0 -0
  138. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/codity.py +0 -0
  139. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/copilot.py +0 -0
  140. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/cursor.py +0 -0
  141. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/gemini.py +0 -0
  142. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/integrations/windsurf.py +0 -0
  143. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/issue_reporter.py +0 -0
  144. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/languages.py +0 -0
  145. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/ledger.py +0 -0
  146. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/local_model.py +0 -0
  147. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/mcp_generator.py +0 -0
  148. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/mcp_server.py +0 -0
  149. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/__init__.py +0 -0
  150. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  151. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  152. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  153. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  154. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  155. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m006_session_governance.py +0 -0
  156. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  157. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/migrations/runner.py +0 -0
  158. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/ollama_cmds.py +0 -0
  159. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/patent.py +0 -0
  160. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/paths.py +0 -0
  161. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/phase.py +0 -0
  162. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/plugins.py +0 -0
  163. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/policy.py +0 -0
  164. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/profiles.py +0 -0
  165. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/project_metrics.py +0 -0
  166. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/quality_report.py +0 -0
  167. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/rate_limits.py +0 -0
  168. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/recover.py +0 -0
  169. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/releaser.py +0 -0
  170. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/requirements.py +0 -0
  171. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/requirements_parser.py +0 -0
  172. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/retrieval.py +0 -0
  173. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/risk.py +0 -0
  174. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/safe_write.py +0 -0
  175. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/scaffolder.py +0 -0
  176. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/serve.py +0 -0
  177. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/session.py +0 -0
  178. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/session_init.py +0 -0
  179. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/session_store.py +0 -0
  180. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/__init__.py +0 -0
  181. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/ai_agents.py +0 -0
  182. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/cloud.py +0 -0
  183. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/corporate.py +0 -0
  184. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/cross_platform.py +0 -0
  185. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/data_engineering.py +0 -0
  186. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/devops.py +0 -0
  187. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/docs.py +0 -0
  188. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/embedded.py +0 -0
  189. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/governance.py +0 -0
  190. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/hardware.py +0 -0
  191. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/mobile.py +0 -0
  192. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/platform_engineering.py +0 -0
  193. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/productivity.py +0 -0
  194. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/software_engineering.py +0 -0
  195. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/specsmith_skills.py +0 -0
  196. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/ssh.py +0 -0
  197. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills/web_backend.py +0 -0
  198. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/skills_builder.py +0 -0
  199. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/sync.py +0 -0
  200. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/agents.md.j2 +0 -0
  201. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  202. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  203. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  204. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  205. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  206. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  207. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  208. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/community/security.md.j2 +0 -0
  209. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  210. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  211. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  212. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  213. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  214. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/editorconfig.j2 +0 -0
  215. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/gitattributes.j2 +0 -0
  216. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/gitignore.j2 +0 -0
  217. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/go/go.mod.j2 +0 -0
  218. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/go/main.go.j2 +0 -0
  219. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  220. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  221. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  222. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  223. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  224. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  225. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  226. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  227. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  228. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  229. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  230. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/js/package.json.j2 +0 -0
  231. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/ledger.md.j2 +0 -0
  232. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/python/cli.py.j2 +0 -0
  233. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/python/init.py.j2 +0 -0
  234. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  235. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/readme.md.j2 +0 -0
  236. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  237. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  238. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  239. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  240. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  241. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  242. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  243. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  244. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  245. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/tool_installer.py +0 -0
  246. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/toolrules.py +0 -0
  247. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/tools.py +0 -0
  248. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/trace.py +0 -0
  249. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/transcripts.py +0 -0
  250. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/updater.py +0 -0
  251. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/upgrader.py +0 -0
  252. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/validator.py +0 -0
  253. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs/__init__.py +0 -0
  254. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs/base.py +0 -0
  255. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs/bitbucket.py +0 -0
  256. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs/github.py +0 -0
  257. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs/gitlab.py +0 -0
  258. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/vcs_commands.py +0 -0
  259. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/wi_store.py +0 -0
  260. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/wireframes.py +0 -0
  261. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith/workspace.py +0 -0
  262. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith.egg-info/SOURCES.txt +0 -0
  263. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith.egg-info/dependency_links.txt +0 -0
  264. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith.egg-info/entry_points.txt +0 -0
  265. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith.egg-info/requires.txt +0 -0
  266. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/src/specsmith.egg-info/top_level.txt +0 -0
  267. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_CMD_001.py +0 -0
  268. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_agent_profiles.py +0 -0
  269. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_agent_run_feedback.py +0 -0
  270. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_agent_runner_ready.py +0 -0
  271. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_ai_client.py +0 -0
  272. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_ai_intelligence.py +0 -0
  273. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_architect_interview.py +0 -0
  274. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_architect_v2.py +0 -0
  275. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_architecture.py +0 -0
  276. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_auditor.py +0 -0
  277. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_channel.py +0 -0
  278. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_chat_diff_decision.py +0 -0
  279. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_chat_runner_openai_compat.py +0 -0
  280. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_chat_stdin_protocol.py +0 -0
  281. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_cleanup_cmd.py +0 -0
  282. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_cli_regressions.py +0 -0
  283. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_cli_workflows_history_drive.py +0 -0
  284. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_compliance.py +0 -0
  285. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_compliance_governance.py +0 -0
  286. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_compressor.py +0 -0
  287. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_dispatch.py +0 -0
  288. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_e2e_nexus.py +0 -0
  289. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_endpoints_cli.py +0 -0
  290. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_endpoints_store.py +0 -0
  291. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_epistemic.py +0 -0
  292. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_esdb_backend_switch.py +0 -0
  293. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_esdb_enforcement.py +0 -0
  294. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_esdb_license.py +0 -0
  295. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_esdb_sqlite.py +0 -0
  296. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_esdb_verify_chain_cli.py +0 -0
  297. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_fallback_chain.py +0 -0
  298. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_golden_path.py +0 -0
  299. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_importer.py +0 -0
  300. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_init_modes.py +0 -0
  301. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_integrations.py +0 -0
  302. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_integrations_codity.py +0 -0
  303. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_intelligence.py +0 -0
  304. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_issue_policy_features.py +0 -0
  305. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_issue_reporter.py +0 -0
  306. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_issues_263_264.py +0 -0
  307. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_local_model.py +0 -0
  308. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_markdown_deprecation.py +0 -0
  309. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_mcp_client.py +0 -0
  310. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_mcp_server.py +0 -0
  311. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_migration_direction.py +0 -0
  312. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_model_router.py +0 -0
  313. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_new_modules.py +0 -0
  314. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_nexus.py +0 -0
  315. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_permissions.py +0 -0
  316. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_phase1_4_new.py +0 -0
  317. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_phase34_completion.py +0 -0
  318. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_project_metrics.py +0 -0
  319. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_quality_report.py +0 -0
  320. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_rate_limits.py +0 -0
  321. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_reporting_commands.py +0 -0
  322. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_req_248_262.py +0 -0
  323. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_req_358_359.py +0 -0
  324. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_scaffolder.py +0 -0
  325. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_schema_migrations.py +0 -0
  326. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_skill_marketplace.py +0 -0
  327. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_skills_mcp.py +0 -0
  328. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_smoke.py +0 -0
  329. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_suggester.py +0 -0
  330. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_tools.py +0 -0
  331. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_typing_guardrails.py +0 -0
  332. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_validator.py +0 -0
  333. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_vcs.py +0 -0
  334. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_warp_parity.py +0 -0
  335. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_warp_parity_followup.py +0 -0
  336. {specsmith-0.17.0.dev649 → specsmith-0.17.1.dev657}/tests/test_wi_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.17.0.dev649
3
+ Version: 0.17.1.dev657
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.17.0.dev649"
7
+ version = "0.17.1.dev657"
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.17.0" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.17.1" # fallback: keep in sync with pyproject.toml
@@ -1845,9 +1845,12 @@ def doctor(project_dir: str, onboarding: bool, as_json: bool) -> None:
1845
1845
  import subprocess
1846
1846
  import sys
1847
1847
 
1848
- # Single import style (no from-import) avoids CodeQL py/import-and-import-from.
1849
- import specsmith.esdb as _esdb_mod_dr
1850
1848
  from specsmith.auditor import run_audit
1849
+
1850
+ # Use from-import to stay consistent with the rest of the file (#208).
1851
+ # Re-read ESDB_BACKEND via sys.modules after open_default_store() updates
1852
+ # the module-level global in-place so the locally-imported name is fresh.
1853
+ from specsmith.esdb import open_default_store as _open_esdb_dr # noqa: PLC0415
1851
1854
  from specsmith.phase import read_phase
1852
1855
 
1853
1856
  def _tool_version(cmd: str) -> tuple[bool, str]:
@@ -1897,7 +1900,7 @@ def doctor(project_dir: str, onboarding: bool, as_json: bool) -> None:
1897
1900
  chain_ok = False
1898
1901
  record_count = 0
1899
1902
  try:
1900
- with _esdb_mod_dr.open_default_store(root, warn=False) as store: # type: ignore[attr-defined]
1903
+ with _open_esdb_dr(root, warn=False) as store: # type: ignore[attr-defined]
1901
1904
  esdb_open = True
1902
1905
  record_count = int(store.record_count())
1903
1906
  chain_ok = store.chain_valid() is not False
@@ -1907,7 +1910,7 @@ def doctor(project_dir: str, onboarding: bool, as_json: bool) -> None:
1907
1910
  # Re-read the module-level ESDB_BACKEND — open_default_store() updates
1908
1911
  # the global in-place so we read it via the module object, not a
1909
1912
  # locally-imported name that would be stale. (#263)
1910
- _add("esdb backend", True, f"{_esdb_mod_dr.ESDB_BACKEND} open")
1913
+ _add("esdb backend", True, f"{sys.modules['specsmith.esdb'].ESDB_BACKEND} open")
1911
1914
  _add(
1912
1915
  "esdb chain",
1913
1916
  chain_ok,
@@ -11264,8 +11267,11 @@ def esdb_status_cmd(project_dir: str, as_json: bool) -> None:
11264
11267
  import json as _json
11265
11268
  import sys
11266
11269
 
11267
- import specsmith.esdb as _esdb_mod # used after open to read updated ESDB_BACKEND (#263)
11268
- from specsmith.esdb._license import check_license, resolve_license_path
11270
+ # Use from-import + sys.modules to avoid py/import-and-import-from (#207).
11271
+ # open_default_store() updates the module-level ESDB_BACKEND global in-place;
11272
+ # we re-read it via sys.modules after the open so the name is always current.
11273
+ from specsmith.esdb import open_default_store as _esdb_open_status # noqa: PLC0415
11274
+ from specsmith.esdb._license import check_license, resolve_license_path # noqa: PLC0415
11269
11275
  from specsmith.sync import auto_migrate_if_needed
11270
11276
 
11271
11277
  root = Path(project_dir).resolve()
@@ -11276,10 +11282,10 @@ def esdb_status_cmd(project_dir: str, as_json: bool) -> None:
11276
11282
  lic_status = check_license(warn=False) if lic_path else None
11277
11283
 
11278
11284
  # Open the appropriate store (no warning — we’ll report it ourselves)
11279
- store = _esdb_mod.open_default_store(root, warn=False)
11280
- # Re-read ESDB_BACKEND from the module — open_default_store() updates the
11281
- # module-level global; the locally-imported name would be stale. (#263)
11282
- active_backend = _esdb_mod.ESDB_BACKEND
11285
+ store = _esdb_open_status(root, warn=False)
11286
+ # Re-read ESDB_BACKEND from the module via sys.modules — open_default_store()
11287
+ # updates the module-level global in-place; a locally-imported name is stale.
11288
+ active_backend = sys.modules["specsmith.esdb"].ESDB_BACKEND
11283
11289
 
11284
11290
  backend_label: str
11285
11291
  chain_ok: bool = True
@@ -11311,7 +11317,7 @@ def esdb_status_cmd(project_dir: str, as_json: bool) -> None:
11311
11317
  backend_label = f"{active_backend} (error: {exc})"
11312
11318
 
11313
11319
  license_info: dict[str, object]
11314
- if not _esdb_mod.CHRONO_AVAILABLE:
11320
+ if not sys.modules["specsmith.esdb"].CHRONO_AVAILABLE:
11315
11321
  license_info = {"chronomemory_installed": False, "active": False}
11316
11322
  elif lic_status is None:
11317
11323
  license_info = {
@@ -11383,7 +11389,7 @@ def esdb_status_cmd(project_dir: str, as_json: bool) -> None:
11383
11389
  if store_error:
11384
11390
  console.print(f" [red]\u2717[/red] Store error: {store_error}")
11385
11391
  # License line
11386
- if not _esdb_mod.CHRONO_AVAILABLE:
11392
+ if not sys.modules["specsmith.esdb"].CHRONO_AVAILABLE:
11387
11393
  console.print(
11388
11394
  " [dim]chronomemory not installed \u2014 run "
11389
11395
  "'pip install specsmith[esdb]' for ChronoStore[/dim]"
@@ -141,7 +141,7 @@ class ProjectConfig(BaseModel):
141
141
  ),
142
142
  )
143
143
  language: str = Field(default="python", description="Primary language/runtime")
144
- spec_version: str = Field(default="0.16.5", description="Spec version to scaffold from")
144
+ spec_version: str = Field(default="0.17.1", description="Spec version to scaffold from")
145
145
  description: str = Field(default="", description="Short project description")
146
146
 
147
147
  # Options
@@ -71,26 +71,30 @@ def run_preflight(
71
71
  from specsmith import __version__
72
72
  from specsmith.agent.broker import Intent, classify_intent, infer_scope
73
73
 
74
- # _safe_resolve validates null bytes / traversal and returns
75
- # Path(os.path.realpath(...)). USE the return value so CodeQL's
76
- # interprocedural analysis tracks the realpath sanitiser through
77
- # _safe_resolve and sees every derived Path as clean — the same
78
- # pattern run_verify uses with `root = _safe_resolve(project_dir)`.
79
- _root: Path = _safe_resolve(project_dir)
80
- _root_str: str = str(_root)
74
+ # Inline validation + sanitisation so CodeQL's taint analysis can follow
75
+ # the os.path.realpath sanitiser without crossing a user-defined function
76
+ # boundary (interprocedural tracking is unreliable for py/path-injection).
77
+ _raw = str(project_dir)
78
+ if "\x00" in _raw:
79
+ raise ValueError(f"Path contains null byte: {_raw!r}")
80
+ for _p in Path(_raw).parts:
81
+ if _p in ("..", "..."):
82
+ raise ValueError(f"Path traversal rejected: {_raw!r}")
83
+ # os.path.realpath is a CodeQL-recognised py/path-injection sanitiser.
84
+ # Assign once at root level; all derived paths inherit the sanitisation.
85
+ _safe_root = os.path.realpath(_raw)
86
+ _root = Path(_safe_root)
87
+ _root_str = _safe_root # alias used by helpers later in this function
81
88
  intent = classify_intent(utterance)
82
89
  # Requirements are now sourced from .specsmith/requirements.json (YAML-first mode).
83
90
  # docs/REQUIREMENTS.md is deprecated (REQ-373) but still used as a fallback
84
91
  # for keyword matching in infer_scope() when it exists. Explicit REQ-NNN IDs
85
92
  # in the utterance are always resolved from requirements.json regardless.
86
- # Use os.path.realpath directly (not through _safe_resolve) so CodeQL's
87
- # interprocedural taint analysis can confirm the sanitiser inline without
88
- # having to track through a user-defined wrapper function.
89
- _req_md = Path(os.path.realpath(os.path.join(_root_str, "docs", "REQUIREMENTS.md")))
93
+ _req_md = Path(os.path.join(_safe_root, "docs", "REQUIREMENTS.md"))
90
94
  if not _req_md.is_file():
91
- _req_md = Path(os.path.realpath(os.path.join(_root_str, "REQUIREMENTS.md"))) # legacy
95
+ _req_md = Path(os.path.join(_safe_root, "REQUIREMENTS.md")) # legacy
92
96
  # infer_scope handles a non-existent path gracefully (returns empty scope)
93
- _repo_idx = Path(os.path.realpath(os.path.join(_root_str, ".repo-index", "files.json")))
97
+ _repo_idx = Path(os.path.join(_safe_root, ".repo-index", "files.json"))
94
98
  scope = infer_scope(
95
99
  utterance,
96
100
  _req_md,
@@ -111,7 +115,7 @@ def run_preflight(
111
115
  # Read requirements machine-state using os.path.join on the clean _root_str
112
116
  # so CodeQL traces the full sanitisation chain without re-tainting via Path.
113
117
  rq_records: list[Any] = []
114
- rq_path = _safe_resolve(os.path.join(_root_str, ".specsmith", "requirements.json"))
118
+ rq_path = Path(os.path.join(_safe_root, ".specsmith", "requirements.json"))
115
119
  if rq_path.is_file():
116
120
  try:
117
121
  _rq = _json.loads(rq_path.read_text(encoding="utf-8"))
@@ -128,7 +132,7 @@ def run_preflight(
128
132
  # Read test-case machine-state (same rationale as above).
129
133
  test_case_ids: list[str] = []
130
134
  tc_records: list[Any] = []
131
- tc_path = _safe_resolve(os.path.join(_root_str, ".specsmith", "testcases.json"))
135
+ tc_path = Path(os.path.join(_safe_root, ".specsmith", "testcases.json"))
132
136
  if tc_path.is_file():
133
137
  try:
134
138
  _tc = _json.loads(tc_path.read_text(encoding="utf-8"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.17.0.dev649
3
+ Version: 0.17.1.dev657
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
@@ -112,6 +112,8 @@ class TestCLIUpgrade:
112
112
  assert "Already at spec version" in result.output
113
113
 
114
114
  def test_upgrade_to_new_version(self, tmp_path: Path) -> None:
115
+ from specsmith import __version__
116
+
115
117
  target = _scaffold_governed(tmp_path)
116
118
  # Backdate spec_version so there is an actual upgrade to perform.
117
119
  # Without this the scaffold is already at __version__ and the
@@ -124,14 +126,14 @@ class TestCLIUpgrade:
124
126
  yaml.dump(data, fh, default_flow_style=False)
125
127
  runner = CliRunner()
126
128
  result = runner.invoke(
127
- main, ["upgrade", "--project-dir", str(target), "--spec-version", "0.16.5"]
129
+ main, ["upgrade", "--project-dir", str(target), "--spec-version", __version__]
128
130
  )
129
131
  assert result.exit_code == 0
130
132
  assert "Upgraded" in result.output
131
133
  # Verify scaffold.yml spec_version was updated to the target version
132
134
  with open(target / "scaffold.yml") as fh:
133
135
  data = yaml.safe_load(fh)
134
- assert data["spec_version"] == "0.16.5"
136
+ assert data["spec_version"] == __version__
135
137
 
136
138
 
137
139
  class TestCLICreditsLimits: