specsmith 0.18.0.dev690__tar.gz → 0.18.0.dev692__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 (360) hide show
  1. {specsmith-0.18.0.dev690/src/specsmith.egg-info → specsmith-0.18.0.dev692}/PKG-INFO +1 -1
  2. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/pyproject.toml +1 -1
  3. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb/__init__.py +9 -2
  4. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb/sqlite_store.py +20 -5
  5. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/governance_logic.py +24 -5
  6. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/releaser.py +44 -9
  7. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692/src/specsmith.egg-info}/PKG-INFO +1 -1
  8. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith.egg-info/SOURCES.txt +1 -0
  9. specsmith-0.18.0.dev692/tests/test_releaser.py +91 -0
  10. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/LICENSE +0 -0
  11. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/README.md +0 -0
  12. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/setup.cfg +0 -0
  13. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/__init__.py +0 -0
  14. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/belief.py +0 -0
  15. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/certainty.py +0 -0
  16. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/failure_graph.py +0 -0
  17. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/py.typed +0 -0
  18. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/recovery.py +0 -0
  19. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/session.py +0 -0
  20. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/stress_tester.py +0 -0
  21. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/epistemic/trace.py +0 -0
  22. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/__init__.py +0 -0
  23. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/__main__.py +0 -0
  24. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/__init__.py +0 -0
  25. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/broker.py +0 -0
  26. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/chat_runner.py +0 -0
  27. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/cleanup.py +0 -0
  28. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/context_seed.py +0 -0
  29. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/core.py +0 -0
  30. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/__init__.py +0 -0
  31. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/_status.py +0 -0
  32. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/dag.py +0 -0
  33. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  34. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/events.py +0 -0
  35. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/dispatch/result.py +0 -0
  36. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/endpoints.py +0 -0
  37. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/events.py +0 -0
  38. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/execution_profiles.py +0 -0
  39. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/fallback.py +0 -0
  40. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/hf_leaderboard.py +0 -0
  41. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/hf_sync.py +0 -0
  42. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/indexer.py +0 -0
  43. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/llm_client.py +0 -0
  44. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/mcp.py +0 -0
  45. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/memory.py +0 -0
  46. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/model_intelligence.py +0 -0
  47. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/model_profiles.py +0 -0
  48. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/model_router.py +0 -0
  49. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/orchestrator.py +0 -0
  50. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/permissions.py +0 -0
  51. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/profiles.py +0 -0
  52. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/provider_registry.py +0 -0
  53. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/repl.py +0 -0
  54. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/router.py +0 -0
  55. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/rules.py +0 -0
  56. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/runner.py +0 -0
  57. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/safety.py +0 -0
  58. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/spawner.py +0 -0
  59. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/suggester.py +0 -0
  60. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/teams.py +0 -0
  61. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/token_pricing.py +0 -0
  62. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/tools.py +0 -0
  63. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/verifier.py +0 -0
  64. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/agent/voice.py +0 -0
  65. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/approvals.py +0 -0
  66. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/architect.py +0 -0
  67. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/auditor.py +0 -0
  68. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/auth.py +0 -0
  69. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/block_export.py +0 -0
  70. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/channel.py +0 -0
  71. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/ci_manager.py +0 -0
  72. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/cli.py +0 -0
  73. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/commands/__init__.py +0 -0
  74. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/commands/intelligence.py +0 -0
  75. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/commands/issues_policy.py +0 -0
  76. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/commands/reporting.py +0 -0
  77. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/__init__.py +0 -0
  78. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/_compat.py +0 -0
  79. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/checker.py +0 -0
  80. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/evidence.py +0 -0
  81. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/regulations.py +0 -0
  82. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compliance/reporter.py +0 -0
  83. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/compressor.py +0 -0
  84. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/config.py +0 -0
  85. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/console_utils.py +0 -0
  86. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/context_orchestrator.py +0 -0
  87. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/context_window.py +0 -0
  88. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/credit_analyzer.py +0 -0
  89. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/credits.py +0 -0
  90. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/dashboard.py +0 -0
  91. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/__init__.py +0 -0
  92. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/base.py +0 -0
  93. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/citations.py +0 -0
  94. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/fpd.py +0 -0
  95. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/odp.py +0 -0
  96. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/patentsview.py +0 -0
  97. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/pfw.py +0 -0
  98. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/ppubs.py +0 -0
  99. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/datasources/ptab.py +0 -0
  100. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/differ.py +0 -0
  101. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/doctor.py +0 -0
  102. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/drive.py +0 -0
  103. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/editor.py +0 -0
  104. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/efficiency.py +0 -0
  105. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/__init__.py +0 -0
  106. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/belief.py +0 -0
  107. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/certainty.py +0 -0
  108. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/failure_graph.py +0 -0
  109. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/recovery.py +0 -0
  110. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/epistemic/stress_tester.py +0 -0
  111. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb/_license.py +0 -0
  112. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb/bridge.py +0 -0
  113. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb_sweep.py +0 -0
  114. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/esdb_writer.py +0 -0
  115. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/eval/__init__.py +0 -0
  116. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/eval/builtins.py +0 -0
  117. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/eval/runner.py +0 -0
  118. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/executor.py +0 -0
  119. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/exporter.py +0 -0
  120. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/governance_store.py +0 -0
  121. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/governance_yaml.py +0 -0
  122. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/governed_pr.py +0 -0
  123. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/__init__.py +0 -0
  124. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/app.py +0 -0
  125. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/main_window.py +0 -0
  126. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/session_tab.py +0 -0
  127. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/theme.py +0 -0
  128. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/__init__.py +0 -0
  129. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/chat_view.py +0 -0
  130. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/input_bar.py +0 -0
  131. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  132. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/token_meter.py +0 -0
  133. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  134. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/widgets/update_checker.py +0 -0
  135. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/gui/worker.py +0 -0
  136. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/history_search.py +0 -0
  137. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/importer.py +0 -0
  138. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/instinct.py +0 -0
  139. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/__init__.py +0 -0
  140. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/agent_skill.py +0 -0
  141. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/aider.py +0 -0
  142. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/base.py +0 -0
  143. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/claude_code.py +0 -0
  144. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/codity.py +0 -0
  145. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/copilot.py +0 -0
  146. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/cursor.py +0 -0
  147. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/gemini.py +0 -0
  148. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/integrations/windsurf.py +0 -0
  149. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/issue_reporter.py +0 -0
  150. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/languages.py +0 -0
  151. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/ledger.py +0 -0
  152. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/local_model.py +0 -0
  153. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/mcp_generator.py +0 -0
  154. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/mcp_server.py +0 -0
  155. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/__init__.py +0 -0
  156. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  157. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  158. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  159. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  160. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  161. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m006_session_governance.py +0 -0
  162. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  163. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
  164. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m009_esdb_first.py +0 -0
  165. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
  166. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/migrations/runner.py +0 -0
  167. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/ollama_cmds.py +0 -0
  168. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/patent.py +0 -0
  169. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/paths.py +0 -0
  170. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/phase.py +0 -0
  171. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/plugins.py +0 -0
  172. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/policy.py +0 -0
  173. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/profiles.py +0 -0
  174. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/project_metrics.py +0 -0
  175. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/quality_report.py +0 -0
  176. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/rate_limits.py +0 -0
  177. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/recover.py +0 -0
  178. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/requirements.py +0 -0
  179. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/requirements_parser.py +0 -0
  180. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/retrieval.py +0 -0
  181. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/risk.py +0 -0
  182. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/safe_write.py +0 -0
  183. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/scaffolder.py +0 -0
  184. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/serve.py +0 -0
  185. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/session.py +0 -0
  186. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/session_init.py +0 -0
  187. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/session_store.py +0 -0
  188. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/__init__.py +0 -0
  189. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/ai_agents.py +0 -0
  190. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/cloud.py +0 -0
  191. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/corporate.py +0 -0
  192. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/cross_platform.py +0 -0
  193. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/data_engineering.py +0 -0
  194. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/devops.py +0 -0
  195. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/docs.py +0 -0
  196. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/embedded.py +0 -0
  197. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/governance.py +0 -0
  198. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/hardware.py +0 -0
  199. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/mobile.py +0 -0
  200. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/platform_engineering.py +0 -0
  201. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/productivity.py +0 -0
  202. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/software_engineering.py +0 -0
  203. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/specsmith_skills.py +0 -0
  204. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/ssh.py +0 -0
  205. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills/web_backend.py +0 -0
  206. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/skills_builder.py +0 -0
  207. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/sync.py +0 -0
  208. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/agents.md.j2 +0 -0
  209. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  210. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  211. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  212. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  213. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  214. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  215. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  216. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/community/security.md.j2 +0 -0
  217. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  218. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  219. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  220. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  221. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  222. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/editorconfig.j2 +0 -0
  223. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/gitattributes.j2 +0 -0
  224. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/gitignore.j2 +0 -0
  225. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/go/go.mod.j2 +0 -0
  226. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/go/main.go.j2 +0 -0
  227. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  228. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  229. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  230. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  231. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  232. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  233. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  234. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  235. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  236. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  237. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  238. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/js/package.json.j2 +0 -0
  239. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/ledger.md.j2 +0 -0
  240. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/python/cli.py.j2 +0 -0
  241. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/python/init.py.j2 +0 -0
  242. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  243. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/readme.md.j2 +0 -0
  244. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  245. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  246. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  247. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  248. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  249. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  250. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  251. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  252. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  253. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/tool_installer.py +0 -0
  254. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/toolrules.py +0 -0
  255. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/tools.py +0 -0
  256. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/trace.py +0 -0
  257. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/transcripts.py +0 -0
  258. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/updater.py +0 -0
  259. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/upgrader.py +0 -0
  260. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/validator.py +0 -0
  261. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs/__init__.py +0 -0
  262. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs/base.py +0 -0
  263. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs/bitbucket.py +0 -0
  264. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs/github.py +0 -0
  265. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs/gitlab.py +0 -0
  266. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/vcs_commands.py +0 -0
  267. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/wi_store.py +0 -0
  268. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/wireframes.py +0 -0
  269. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith/workspace.py +0 -0
  270. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith.egg-info/dependency_links.txt +0 -0
  271. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith.egg-info/entry_points.txt +0 -0
  272. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith.egg-info/requires.txt +0 -0
  273. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/src/specsmith.egg-info/top_level.txt +0 -0
  274. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_CMD_001.py +0 -0
  275. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_agent_profiles.py +0 -0
  276. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_agent_run_feedback.py +0 -0
  277. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_agent_runner_ready.py +0 -0
  278. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_ai_client.py +0 -0
  279. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_ai_intelligence.py +0 -0
  280. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_architect_interview.py +0 -0
  281. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_architect_v2.py +0 -0
  282. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_architecture.py +0 -0
  283. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_auditor.py +0 -0
  284. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_benchmark_harness.py +0 -0
  285. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_channel.py +0 -0
  286. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_chat_diff_decision.py +0 -0
  287. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_chat_runner_openai_compat.py +0 -0
  288. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_chat_stdin_protocol.py +0 -0
  289. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_cleanup_cmd.py +0 -0
  290. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_cli.py +0 -0
  291. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_cli_regressions.py +0 -0
  292. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_cli_workflows_history_drive.py +0 -0
  293. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_compliance.py +0 -0
  294. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_compliance_governance.py +0 -0
  295. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_compressor.py +0 -0
  296. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_deprecation_registry.py +0 -0
  297. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_dispatch.py +0 -0
  298. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_dual_write.py +0 -0
  299. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_e2e_nexus.py +0 -0
  300. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_efficiency.py +0 -0
  301. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_endpoints_cli.py +0 -0
  302. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_endpoints_store.py +0 -0
  303. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_epistemic.py +0 -0
  304. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_backend_switch.py +0 -0
  305. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_enforcement.py +0 -0
  306. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_integration.py +0 -0
  307. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_license.py +0 -0
  308. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_sqlite.py +0 -0
  309. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_status_integrity.py +0 -0
  310. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_status_output.py +0 -0
  311. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_sweep.py +0 -0
  312. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_verify_chain_cli.py +0 -0
  313. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_esdb_writer.py +0 -0
  314. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_fallback_chain.py +0 -0
  315. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_golden_path.py +0 -0
  316. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_importer.py +0 -0
  317. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_init_modes.py +0 -0
  318. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_integrations.py +0 -0
  319. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_integrations_codity.py +0 -0
  320. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_intelligence.py +0 -0
  321. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_issue_policy_features.py +0 -0
  322. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_issue_reporter.py +0 -0
  323. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_issues_263_264.py +0 -0
  324. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_local_model.py +0 -0
  325. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_markdown_deprecation.py +0 -0
  326. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_mcp_client.py +0 -0
  327. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_mcp_server.py +0 -0
  328. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_migration_direction.py +0 -0
  329. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_model_router.py +0 -0
  330. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_new_modules.py +0 -0
  331. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_nexus.py +0 -0
  332. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_parallel_agents.py +0 -0
  333. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_permissions.py +0 -0
  334. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_phase1_4_new.py +0 -0
  335. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_phase34_completion.py +0 -0
  336. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_project_metrics.py +0 -0
  337. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_quality_report.py +0 -0
  338. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_rate_limits.py +0 -0
  339. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_repl.py +0 -0
  340. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_repl_extended.py +0 -0
  341. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_reporting_commands.py +0 -0
  342. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_req_248_262.py +0 -0
  343. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_req_358_359.py +0 -0
  344. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_resume_command.py +0 -0
  345. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_scaffolder.py +0 -0
  346. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_schema_migrations.py +0 -0
  347. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_skill_marketplace.py +0 -0
  348. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_skills_mcp.py +0 -0
  349. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_smoke.py +0 -0
  350. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_sqlite_parity.py +0 -0
  351. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_suggester.py +0 -0
  352. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_token_cost.py +0 -0
  353. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_tools.py +0 -0
  354. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_trace_vault_esdb.py +0 -0
  355. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_typing_guardrails.py +0 -0
  356. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_validator.py +0 -0
  357. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_vcs.py +0 -0
  358. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_warp_parity.py +0 -0
  359. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_warp_parity_followup.py +0 -0
  360. {specsmith-0.18.0.dev690 → specsmith-0.18.0.dev692}/tests/test_wi_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.18.0.dev690
3
+ Version: 0.18.0.dev692
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.18.0.dev690"
7
+ version = "0.18.0.dev692"
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"
@@ -136,7 +136,10 @@ def open_default_store(
136
136
 
137
137
  from pathlib import Path
138
138
 
139
- root = Path(str(project_root)).resolve()
139
+ # CodeQL py/path-injection: use os.path.realpath (recognised normaliser);
140
+ # the filesystem-path containment checks live in SqliteStore.__init__ and
141
+ # _maybe_promote_sqlite_to_chrono where the actual sinks are.
142
+ root = Path(_os.path.realpath(str(project_root)))
140
143
 
141
144
  # Priority 1: explicit override
142
145
  if _os.environ.get("SPECSMITH_ESDB_BACKEND", "").strip().lower() == "sqlite":
@@ -172,7 +175,11 @@ def _maybe_promote_sqlite_to_chrono(root: "object", chrono: "object") -> None:
172
175
  from pathlib import Path as _Path
173
176
 
174
177
  try:
175
- sqlite_path = _Path(str(root)) / ".specsmith" / "esdb.sqlite3"
178
+ _r = os.path.realpath(str(root))
179
+ _sp = os.path.realpath(os.path.join(_r, ".specsmith", "esdb.sqlite3"))
180
+ if _sp != _r and not _sp.startswith(_r + os.sep):
181
+ return
182
+ sqlite_path = _Path(_sp)
176
183
  if not sqlite_path.exists():
177
184
  return
178
185
 
@@ -150,8 +150,15 @@ class SqliteStore:
150
150
  """
151
151
 
152
152
  def __init__(self, project_root: str | Path) -> None:
153
- self.root = Path(project_root).resolve()
154
- self._db_path = self.root / ".specsmith" / _DB_FILENAME
153
+ # CodeQL py/path-injection: normalize with os.path.realpath AND assert the
154
+ # DB path stays within the project root (containment), then store the
155
+ # sanitised values so the open() sinks (mkdir/connect) receive clean paths.
156
+ _root = os.path.realpath(str(project_root))
157
+ _db = os.path.realpath(os.path.join(_root, ".specsmith", _DB_FILENAME))
158
+ if _db != _root and not _db.startswith(_root + os.sep):
159
+ raise ValueError(f"Database path escapes project root: {_db!r}")
160
+ self.root = Path(_root)
161
+ self._db_path = Path(_db)
155
162
  self._conn: sqlite3.Connection | None = None
156
163
  self._open: bool = False
157
164
 
@@ -415,10 +422,15 @@ class SqliteStore:
415
422
  Returns a dict with counts: ``{"requirements": N, "testcases": M, "skipped": K}``.
416
423
  Already-present records (by ID) are updated in-place.
417
424
  """
418
- state_dir = Path(specsmith_dir)
425
+ # CodeQL py/path-injection: normalize + containment-check each JSON path
426
+ # before the .exists()/.read_text() sinks below.
427
+ _state = os.path.realpath(str(specsmith_dir))
419
428
  counts: dict[str, int] = {"requirements": 0, "testcases": 0, "skipped": 0}
420
429
 
421
- req_path = state_dir / "requirements.json"
430
+ _req = os.path.realpath(os.path.join(_state, "requirements.json"))
431
+ if _req != _state and not _req.startswith(_state + os.sep):
432
+ raise ValueError(f"Path escapes state directory: {_req!r}")
433
+ req_path = Path(_req)
422
434
  if req_path.exists():
423
435
  try:
424
436
  reqs = json.loads(req_path.read_text(encoding="utf-8"))
@@ -439,7 +451,10 @@ class SqliteStore:
439
451
  except (OSError, ValueError):
440
452
  counts["skipped"] += 1 # file unreadable or invalid JSON
441
453
 
442
- test_path = state_dir / "testcases.json"
454
+ _test = os.path.realpath(os.path.join(_state, "testcases.json"))
455
+ if _test != _state and not _test.startswith(_state + os.sep):
456
+ raise ValueError(f"Path escapes state directory: {_test!r}")
457
+ test_path = Path(_test)
443
458
  if test_path.exists():
444
459
  try:
445
460
  tests = json.loads(test_path.read_text(encoding="utf-8"))
@@ -98,10 +98,23 @@ def run_preflight(
98
98
  # traces the py/path-injection sanitiser inline; selecting between two
99
99
  # already-sanitised Paths does not re-taint. infer_scope handles a
100
100
  # non-existent path gracefully (returns an empty scope).
101
- _req_md_docs = Path(os.path.realpath(os.path.join(_safe_root, "docs", "REQUIREMENTS.md")))
102
- _req_md_root = Path(os.path.realpath(os.path.join(_safe_root, "REQUIREMENTS.md")))
101
+ # CodeQL py/path-injection requires normalize (realpath) AND containment
102
+ # (startswith root), not normalization alone. Build each candidate as a
103
+ # realpath string, assert it stays within _safe_root, then wrap in Path so
104
+ # the sanitised value flows into infer_scope() and the .is_file() sinks.
105
+ _docs_str = os.path.realpath(os.path.join(_safe_root, "docs", "REQUIREMENTS.md"))
106
+ if _docs_str != _safe_root and not _docs_str.startswith(_safe_root + os.sep):
107
+ raise ValueError(f"Path escapes project root: {_docs_str!r}")
108
+ _root_md_str = os.path.realpath(os.path.join(_safe_root, "REQUIREMENTS.md"))
109
+ if _root_md_str != _safe_root and not _root_md_str.startswith(_safe_root + os.sep):
110
+ raise ValueError(f"Path escapes project root: {_root_md_str!r}")
111
+ _repo_idx_str = os.path.realpath(os.path.join(_safe_root, ".repo-index", "files.json"))
112
+ if _repo_idx_str != _safe_root and not _repo_idx_str.startswith(_safe_root + os.sep):
113
+ raise ValueError(f"Path escapes project root: {_repo_idx_str!r}")
114
+ _req_md_docs = Path(_docs_str)
115
+ _req_md_root = Path(_root_md_str)
103
116
  _req_md = _req_md_docs if _req_md_docs.is_file() else _req_md_root
104
- _repo_idx = Path(os.path.realpath(os.path.join(_safe_root, ".repo-index", "files.json")))
117
+ _repo_idx = Path(_repo_idx_str)
105
118
  scope = infer_scope(
106
119
  utterance,
107
120
  _req_md,
@@ -122,7 +135,10 @@ def run_preflight(
122
135
  # Read requirements machine-state using os.path.join on the clean _root_str
123
136
  # so CodeQL traces the full sanitisation chain without re-tainting via Path.
124
137
  rq_records: list[Any] = []
125
- rq_path = Path(os.path.realpath(os.path.join(_safe_root, ".specsmith", "requirements.json")))
138
+ rq_str = os.path.realpath(os.path.join(_safe_root, ".specsmith", "requirements.json"))
139
+ if rq_str != _safe_root and not rq_str.startswith(_safe_root + os.sep):
140
+ raise ValueError(f"Path escapes project root: {rq_str!r}")
141
+ rq_path = Path(rq_str)
126
142
  if rq_path.is_file():
127
143
  try:
128
144
  _rq = _json.loads(rq_path.read_text(encoding="utf-8"))
@@ -139,7 +155,10 @@ def run_preflight(
139
155
  # Read test-case machine-state (same rationale as above).
140
156
  test_case_ids: list[str] = []
141
157
  tc_records: list[Any] = []
142
- tc_path = Path(os.path.realpath(os.path.join(_safe_root, ".specsmith", "testcases.json")))
158
+ tc_str = os.path.realpath(os.path.join(_safe_root, ".specsmith", "testcases.json"))
159
+ if tc_str != _safe_root and not tc_str.startswith(_safe_root + os.sep):
160
+ raise ValueError(f"Path escapes project root: {tc_str!r}")
161
+ tc_path = Path(tc_str)
143
162
  if tc_path.is_file():
144
163
  try:
145
164
  _tc = _json.loads(tc_path.read_text(encoding="utf-8"))
@@ -71,22 +71,57 @@ def bump_version(root: Path, new_version: str) -> list[str]:
71
71
  return updated
72
72
 
73
73
 
74
+ # Context tokens that mark a *legitimate* "--pre specsmith" reference rather
75
+ # than a stale stable-install instruction. The dev/pre-release channel is a
76
+ # supported feature (see channel.py and docs/site/releasing.md), so docs that
77
+ # describe it -- and explicit prohibitions ("NEVER run pip install --pre
78
+ # specsmith") -- must not be flagged. Only a reference that recommends
79
+ # installing the *stable* package with the pre-release flag is stale.
80
+ _PRE_OK_CONTEXT: tuple[str, ...] = ("dev", "pre-release", "prerelease", "never", "badge")
81
+
82
+
83
+ def _has_stale_pre_flag(content: str) -> bool:
84
+ """Return True if *content* has a stale ``--pre specsmith`` install hint.
85
+
86
+ The scan is line-aware and tracks the nearest Markdown heading so a
87
+ legitimate ``--pre specsmith`` reference inside a dev/pre-release section or
88
+ a prohibition line is ignored. An occurrence is only treated as stale when
89
+ neither its line nor the enclosing section carries a :data:`_PRE_OK_CONTEXT`
90
+ token.
91
+ """
92
+ current_heading = ""
93
+ for line in content.splitlines():
94
+ stripped = line.lstrip()
95
+ if stripped.startswith("#"):
96
+ current_heading = stripped
97
+ if "--pre specsmith" not in line:
98
+ continue
99
+ context = f"{line} {current_heading}".lower()
100
+ if any(token in context for token in _PRE_OK_CONTEXT):
101
+ continue
102
+ return True
103
+ return False
104
+
105
+
74
106
  def scan_stale_refs(root: Path, current_version: str) -> list[str]:
75
- """Scan docs for stale version references."""
107
+ """Scan docs for stale version references.
108
+
109
+ The ``--pre specsmith`` check is context-aware (see
110
+ :func:`_has_stale_pre_flag`) so the supported dev/pre-release channel docs
111
+ and prohibitions do not produce false positives; only stale *stable*-install
112
+ hints are reported.
113
+ """
76
114
  issues: list[str] = []
77
115
  scan_dirs = [root / "docs" / "site", root]
78
- scan_patterns = [
79
- (r"--pre specsmith", "stale --pre flag"),
80
- (r"0\.1\.0a\d+", "alpha version reference"),
81
- ]
82
116
 
83
117
  for scan_dir in scan_dirs:
84
118
  for md_file in scan_dir.glob("*.md"):
85
119
  content = md_file.read_text(encoding="utf-8")
86
- for pattern, desc in scan_patterns:
87
- if re.search(pattern, content):
88
- rel = md_file.relative_to(root)
89
- issues.append(f"{rel}: {desc}")
120
+ rel = md_file.relative_to(root)
121
+ if _has_stale_pre_flag(content):
122
+ issues.append(f"{rel}: stale --pre flag")
123
+ if re.search(r"0\.1\.0a\d+", content):
124
+ issues.append(f"{rel}: alpha version reference")
90
125
 
91
126
  # Check classifier
92
127
  pyproject = root / "pyproject.toml"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.18.0.dev690
3
+ Version: 0.18.0.dev692
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
@@ -333,6 +333,7 @@ tests/test_phase34_completion.py
333
333
  tests/test_project_metrics.py
334
334
  tests/test_quality_report.py
335
335
  tests/test_rate_limits.py
336
+ tests/test_releaser.py
336
337
  tests/test_repl.py
337
338
  tests/test_repl_extended.py
338
339
  tests/test_reporting_commands.py
@@ -0,0 +1,91 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
3
+ """Tests for the release-tooling stale-reference scanner (REQ-050).
4
+
5
+ These cover the context-aware ``--pre specsmith`` check so the supported
6
+ dev/pre-release channel docs and explicit prohibitions are not reported as
7
+ stale, while genuine stable-install hints still are.
8
+ """
9
+
10
+ from pathlib import Path
11
+
12
+ from specsmith.releaser import _has_stale_pre_flag, scan_stale_refs
13
+
14
+
15
+ def _write(path: Path, text: str) -> None:
16
+ path.parent.mkdir(parents=True, exist_ok=True)
17
+ path.write_text(text, encoding="utf-8")
18
+
19
+
20
+ def test_dev_channel_pre_reference_not_flagged(tmp_path: Path) -> None:
21
+ """A dev-docs note mapping dev docs to the pre-release install is legitimate."""
22
+ _write(
23
+ tmp_path / "docs" / "site" / "index.md",
24
+ "# Docs\n\n**Dev (latest):** matches `pip install --pre specsmith`\n",
25
+ )
26
+ assert scan_stale_refs(tmp_path, "0.18.0") == []
27
+
28
+
29
+ def test_dev_release_section_pre_reference_not_flagged(tmp_path: Path) -> None:
30
+ """An install hint under a 'Dev Releases' heading is legitimate dev-channel docs."""
31
+ _write(
32
+ tmp_path / "docs" / "site" / "releasing.md",
33
+ "## Dev Releases (develop branch)\n\nInstall: `pip install --pre specsmith`\n",
34
+ )
35
+ assert scan_stale_refs(tmp_path, "0.18.0") == []
36
+
37
+
38
+ def test_prohibition_pre_reference_not_flagged(tmp_path: Path) -> None:
39
+ """A prohibition must not be read as a stale install hint."""
40
+ _write(
41
+ tmp_path / "AGENTS.md",
42
+ "## Install policy\n\n- NEVER run `pip install --pre specsmith` in any environment.\n",
43
+ )
44
+ assert scan_stale_refs(tmp_path, "0.18.0") == []
45
+
46
+
47
+ def test_stale_stable_install_hint_is_flagged(tmp_path: Path) -> None:
48
+ """Recommending --pre for a normal install under a neutral heading is stale."""
49
+ _write(
50
+ tmp_path / "docs" / "site" / "getting-started.md",
51
+ "## Quick Start\n\nInstall specsmith: `pip install --pre specsmith`\n",
52
+ )
53
+ rel = Path("docs") / "site" / "getting-started.md"
54
+ assert scan_stale_refs(tmp_path, "0.18.0") == [f"{rel}: stale --pre flag"]
55
+
56
+
57
+ def test_alpha_version_reference_flagged(tmp_path: Path) -> None:
58
+ """The narrow 0.1.0aN alpha pattern is still reported."""
59
+ _write(tmp_path / "README.md", "# x\n\nsee 0.1.0a3 builds\n")
60
+ assert scan_stale_refs(tmp_path, "0.18.0") == ["README.md: alpha version reference"]
61
+
62
+
63
+ def test_alpha_classifier_flagged(tmp_path: Path) -> None:
64
+ """A '3 - Alpha' classifier in pyproject.toml is still reported."""
65
+ (tmp_path / "pyproject.toml").write_text(
66
+ '[project]\nclassifiers = ["Development Status :: 3 - Alpha"]\n',
67
+ encoding="utf-8",
68
+ )
69
+ assert "pyproject.toml: classifier still says Alpha" in scan_stale_refs(tmp_path, "0.18.0")
70
+
71
+
72
+ def test_clean_docs_no_issues(tmp_path: Path) -> None:
73
+ """Stable install instructions and a non-alpha classifier produce no issues."""
74
+ _write(tmp_path / "docs" / "site" / "index.md", "# Docs\n\n`pip install specsmith`\n")
75
+ (tmp_path / "pyproject.toml").write_text(
76
+ '[project]\nclassifiers = ["Development Status :: 5 - Production/Stable"]\n',
77
+ encoding="utf-8",
78
+ )
79
+ assert scan_stale_refs(tmp_path, "0.18.0") == []
80
+
81
+
82
+ def test_has_stale_pre_flag_unit() -> None:
83
+ """Direct checks of the line+heading-aware helper."""
84
+ # Neutral install hint with no qualifying context -> stale.
85
+ assert _has_stale_pre_flag("Install: `pip install --pre specsmith`") is True
86
+ # Heading context marks the section as dev -> legitimate.
87
+ assert _has_stale_pre_flag("## Dev Releases\nrun `pip install --pre specsmith`") is False
88
+ # Prohibition -> legitimate.
89
+ assert _has_stale_pre_flag("NEVER `pip install --pre specsmith`") is False
90
+ # No pre-release flag at all.
91
+ assert _has_stale_pre_flag("`pip install specsmith`") is False