specsmith 0.18.0.dev698__tar.gz → 0.18.0.dev709__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.dev698/src/specsmith.egg-info → specsmith-0.18.0.dev709}/PKG-INFO +1 -1
  2. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/pyproject.toml +1 -1
  3. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/sync.py +148 -42
  4. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/gitignore.j2 +14 -17
  5. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709/src/specsmith.egg-info}/PKG-INFO +1 -1
  6. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_enforcement.py +48 -2
  7. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/LICENSE +0 -0
  8. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/README.md +0 -0
  9. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/setup.cfg +0 -0
  10. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/__init__.py +0 -0
  11. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/belief.py +0 -0
  12. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/certainty.py +0 -0
  13. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/failure_graph.py +0 -0
  14. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/py.typed +0 -0
  15. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/recovery.py +0 -0
  16. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/session.py +0 -0
  17. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/stress_tester.py +0 -0
  18. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/epistemic/trace.py +0 -0
  19. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/__init__.py +0 -0
  20. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/__main__.py +0 -0
  21. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/__init__.py +0 -0
  22. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/broker.py +0 -0
  23. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/chat_runner.py +0 -0
  24. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/cleanup.py +0 -0
  25. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/context_seed.py +0 -0
  26. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/core.py +0 -0
  27. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/__init__.py +0 -0
  28. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/_status.py +0 -0
  29. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/dag.py +0 -0
  30. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  31. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/events.py +0 -0
  32. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/dispatch/result.py +0 -0
  33. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/endpoints.py +0 -0
  34. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/events.py +0 -0
  35. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/execution_profiles.py +0 -0
  36. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/fallback.py +0 -0
  37. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/hf_leaderboard.py +0 -0
  38. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/hf_sync.py +0 -0
  39. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/indexer.py +0 -0
  40. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/llm_client.py +0 -0
  41. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/mcp.py +0 -0
  42. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/memory.py +0 -0
  43. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_intelligence.py +0 -0
  44. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_profiles.py +0 -0
  45. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/model_router.py +0 -0
  46. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/orchestrator.py +0 -0
  47. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/permissions.py +0 -0
  48. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/profiles.py +0 -0
  49. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/provider_registry.py +0 -0
  50. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/repl.py +0 -0
  51. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/router.py +0 -0
  52. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/rules.py +0 -0
  53. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/runner.py +0 -0
  54. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/safety.py +0 -0
  55. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/spawner.py +0 -0
  56. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/suggester.py +0 -0
  57. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/teams.py +0 -0
  58. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/token_pricing.py +0 -0
  59. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/tools.py +0 -0
  60. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/verifier.py +0 -0
  61. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/agent/voice.py +0 -0
  62. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/approvals.py +0 -0
  63. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/architect.py +0 -0
  64. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/auditor.py +0 -0
  65. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/auth.py +0 -0
  66. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/block_export.py +0 -0
  67. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/channel.py +0 -0
  68. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ci_manager.py +0 -0
  69. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/cli.py +0 -0
  70. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/__init__.py +0 -0
  71. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/intelligence.py +0 -0
  72. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/issues_policy.py +0 -0
  73. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/commands/reporting.py +0 -0
  74. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/__init__.py +0 -0
  75. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/_compat.py +0 -0
  76. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/checker.py +0 -0
  77. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/evidence.py +0 -0
  78. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/regulations.py +0 -0
  79. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compliance/reporter.py +0 -0
  80. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/compressor.py +0 -0
  81. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/config.py +0 -0
  82. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/console_utils.py +0 -0
  83. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/context_orchestrator.py +0 -0
  84. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/context_window.py +0 -0
  85. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/credit_analyzer.py +0 -0
  86. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/credits.py +0 -0
  87. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/dashboard.py +0 -0
  88. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/__init__.py +0 -0
  89. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/base.py +0 -0
  90. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/citations.py +0 -0
  91. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/fpd.py +0 -0
  92. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/odp.py +0 -0
  93. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/patentsview.py +0 -0
  94. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/pfw.py +0 -0
  95. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/ppubs.py +0 -0
  96. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/datasources/ptab.py +0 -0
  97. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/differ.py +0 -0
  98. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/doctor.py +0 -0
  99. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/drive.py +0 -0
  100. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/editor.py +0 -0
  101. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/efficiency.py +0 -0
  102. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/__init__.py +0 -0
  103. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/belief.py +0 -0
  104. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/certainty.py +0 -0
  105. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/failure_graph.py +0 -0
  106. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/recovery.py +0 -0
  107. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/epistemic/stress_tester.py +0 -0
  108. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/__init__.py +0 -0
  109. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/_license.py +0 -0
  110. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/bridge.py +0 -0
  111. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb/sqlite_store.py +0 -0
  112. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb_sweep.py +0 -0
  113. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/esdb_writer.py +0 -0
  114. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/__init__.py +0 -0
  115. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/builtins.py +0 -0
  116. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/eval/runner.py +0 -0
  117. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/executor.py +0 -0
  118. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/exporter.py +0 -0
  119. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_logic.py +0 -0
  120. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_store.py +0 -0
  121. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governance_yaml.py +0 -0
  122. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/governed_pr.py +0 -0
  123. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/__init__.py +0 -0
  124. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/app.py +0 -0
  125. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/main_window.py +0 -0
  126. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/session_tab.py +0 -0
  127. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/theme.py +0 -0
  128. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/__init__.py +0 -0
  129. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/chat_view.py +0 -0
  130. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/input_bar.py +0 -0
  131. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  132. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/token_meter.py +0 -0
  133. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  134. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/widgets/update_checker.py +0 -0
  135. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/gui/worker.py +0 -0
  136. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/history_search.py +0 -0
  137. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/importer.py +0 -0
  138. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/instinct.py +0 -0
  139. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/__init__.py +0 -0
  140. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/agent_skill.py +0 -0
  141. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/aider.py +0 -0
  142. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/base.py +0 -0
  143. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/claude_code.py +0 -0
  144. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/codity.py +0 -0
  145. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/copilot.py +0 -0
  146. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/cursor.py +0 -0
  147. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/gemini.py +0 -0
  148. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/integrations/windsurf.py +0 -0
  149. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/issue_reporter.py +0 -0
  150. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/languages.py +0 -0
  151. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ledger.py +0 -0
  152. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/local_model.py +0 -0
  153. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/mcp_generator.py +0 -0
  154. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/mcp_server.py +0 -0
  155. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/__init__.py +0 -0
  156. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  157. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  158. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  159. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  160. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  161. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m006_session_governance.py +0 -0
  162. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  163. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
  164. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m009_esdb_first.py +0 -0
  165. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
  166. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/migrations/runner.py +0 -0
  167. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/ollama_cmds.py +0 -0
  168. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/patent.py +0 -0
  169. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/paths.py +0 -0
  170. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/phase.py +0 -0
  171. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/plugins.py +0 -0
  172. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/policy.py +0 -0
  173. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/profiles.py +0 -0
  174. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/project_metrics.py +0 -0
  175. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/quality_report.py +0 -0
  176. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/rate_limits.py +0 -0
  177. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/recover.py +0 -0
  178. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/releaser.py +0 -0
  179. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/requirements.py +0 -0
  180. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/requirements_parser.py +0 -0
  181. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/retrieval.py +0 -0
  182. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/risk.py +0 -0
  183. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/safe_write.py +0 -0
  184. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/scaffolder.py +0 -0
  185. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/serve.py +0 -0
  186. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session.py +0 -0
  187. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session_init.py +0 -0
  188. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/session_store.py +0 -0
  189. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/__init__.py +0 -0
  190. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/ai_agents.py +0 -0
  191. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/cloud.py +0 -0
  192. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/corporate.py +0 -0
  193. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/cross_platform.py +0 -0
  194. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/data_engineering.py +0 -0
  195. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/devops.py +0 -0
  196. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/docs.py +0 -0
  197. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/embedded.py +0 -0
  198. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/governance.py +0 -0
  199. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/hardware.py +0 -0
  200. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/mobile.py +0 -0
  201. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/platform_engineering.py +0 -0
  202. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/productivity.py +0 -0
  203. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/software_engineering.py +0 -0
  204. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/specsmith_skills.py +0 -0
  205. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/ssh.py +0 -0
  206. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills/web_backend.py +0 -0
  207. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/skills_builder.py +0 -0
  208. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/agents.md.j2 +0 -0
  209. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  210. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  211. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  212. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  213. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  214. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  215. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  216. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/community/security.md.j2 +0 -0
  217. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  218. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  219. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  220. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  221. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  222. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/editorconfig.j2 +0 -0
  223. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/gitattributes.j2 +0 -0
  224. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/go/go.mod.j2 +0 -0
  225. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/go/main.go.j2 +0 -0
  226. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  227. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  228. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  229. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  230. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  231. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  232. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  233. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  234. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  235. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  236. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  237. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/js/package.json.j2 +0 -0
  238. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/ledger.md.j2 +0 -0
  239. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/cli.py.j2 +0 -0
  240. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/init.py.j2 +0 -0
  241. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  242. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/readme.md.j2 +0 -0
  243. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  244. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  245. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  246. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  247. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  248. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  249. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  250. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  251. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  252. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/tool_installer.py +0 -0
  253. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/toolrules.py +0 -0
  254. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/tools.py +0 -0
  255. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/trace.py +0 -0
  256. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/transcripts.py +0 -0
  257. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/updater.py +0 -0
  258. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/upgrader.py +0 -0
  259. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/validator.py +0 -0
  260. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/__init__.py +0 -0
  261. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/base.py +0 -0
  262. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/bitbucket.py +0 -0
  263. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/github.py +0 -0
  264. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs/gitlab.py +0 -0
  265. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/vcs_commands.py +0 -0
  266. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/wi_store.py +0 -0
  267. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/wireframes.py +0 -0
  268. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith/workspace.py +0 -0
  269. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/SOURCES.txt +0 -0
  270. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/dependency_links.txt +0 -0
  271. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/entry_points.txt +0 -0
  272. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/requires.txt +0 -0
  273. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/src/specsmith.egg-info/top_level.txt +0 -0
  274. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_CMD_001.py +0 -0
  275. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_profiles.py +0 -0
  276. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_run_feedback.py +0 -0
  277. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_agent_runner_ready.py +0 -0
  278. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_ai_client.py +0 -0
  279. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_ai_intelligence.py +0 -0
  280. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architect_interview.py +0 -0
  281. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architect_v2.py +0 -0
  282. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_architecture.py +0 -0
  283. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_auditor.py +0 -0
  284. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_benchmark_harness.py +0 -0
  285. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_channel.py +0 -0
  286. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_diff_decision.py +0 -0
  287. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_runner_openai_compat.py +0 -0
  288. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_chat_stdin_protocol.py +0 -0
  289. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cleanup_cmd.py +0 -0
  290. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli.py +0 -0
  291. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli_regressions.py +0 -0
  292. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_cli_workflows_history_drive.py +0 -0
  293. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compliance.py +0 -0
  294. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compliance_governance.py +0 -0
  295. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_compressor.py +0 -0
  296. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_deprecation_registry.py +0 -0
  297. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_dispatch.py +0 -0
  298. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_dual_write.py +0 -0
  299. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_e2e_nexus.py +0 -0
  300. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_efficiency.py +0 -0
  301. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_endpoints_cli.py +0 -0
  302. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_endpoints_store.py +0 -0
  303. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_epistemic.py +0 -0
  304. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_backend_switch.py +0 -0
  305. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_integration.py +0 -0
  306. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_license.py +0 -0
  307. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_sqlite.py +0 -0
  308. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_status_integrity.py +0 -0
  309. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_status_output.py +0 -0
  310. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_sweep.py +0 -0
  311. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_verify_chain_cli.py +0 -0
  312. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_esdb_writer.py +0 -0
  313. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_fallback_chain.py +0 -0
  314. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_golden_path.py +0 -0
  315. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_importer.py +0 -0
  316. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_init_modes.py +0 -0
  317. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_integrations.py +0 -0
  318. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_integrations_codity.py +0 -0
  319. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_intelligence.py +0 -0
  320. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issue_policy_features.py +0 -0
  321. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issue_reporter.py +0 -0
  322. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_issues_263_264.py +0 -0
  323. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_local_model.py +0 -0
  324. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_markdown_deprecation.py +0 -0
  325. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_mcp_client.py +0 -0
  326. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_mcp_server.py +0 -0
  327. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_migration_direction.py +0 -0
  328. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_model_router.py +0 -0
  329. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_new_modules.py +0 -0
  330. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_nexus.py +0 -0
  331. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_parallel_agents.py +0 -0
  332. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_permissions.py +0 -0
  333. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_phase1_4_new.py +0 -0
  334. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_phase34_completion.py +0 -0
  335. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_project_metrics.py +0 -0
  336. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_quality_report.py +0 -0
  337. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_rate_limits.py +0 -0
  338. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_releaser.py +0 -0
  339. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_repl.py +0 -0
  340. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_repl_extended.py +0 -0
  341. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_reporting_commands.py +0 -0
  342. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_req_248_262.py +0 -0
  343. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_req_358_359.py +0 -0
  344. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_resume_command.py +0 -0
  345. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_scaffolder.py +0 -0
  346. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_schema_migrations.py +0 -0
  347. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_skill_marketplace.py +0 -0
  348. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_skills_mcp.py +0 -0
  349. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_smoke.py +0 -0
  350. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_sqlite_parity.py +0 -0
  351. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_suggester.py +0 -0
  352. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_token_cost.py +0 -0
  353. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_tools.py +0 -0
  354. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_trace_vault_esdb.py +0 -0
  355. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_typing_guardrails.py +0 -0
  356. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_validator.py +0 -0
  357. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_vcs.py +0 -0
  358. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_warp_parity.py +0 -0
  359. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/tests/test_warp_parity_followup.py +0 -0
  360. {specsmith-0.18.0.dev698 → specsmith-0.18.0.dev709}/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.dev698
3
+ Version: 0.18.0.dev709
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.dev698"
7
+ version = "0.18.0.dev709"
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"
@@ -220,79 +220,185 @@ _ESDB_GITIGNORE_FORBIDDEN = frozenset(
220
220
  }
221
221
  )
222
222
 
223
- # DEPRECATED(REQ-421): several entries below (workitems.json, ledger.jsonl,
224
- # trace.jsonl, esdb_migration_manifest.json, sessions/) are legacy flat files kept
225
- # ignored until their teardown REQs land. The policy keeps canonical ESDB state
226
- # (esdb.sqlite3, .chronomemory/*) tracked. See docs/DEPRECATIONS.md.
227
- _ESDB_GITIGNORE_REQUIRED = (
228
- "!.specsmith/config.yml",
229
- "!.specsmith/requirements.json",
230
- "!.specsmith/testcases.json",
231
- "!.specsmith/esdb.sqlite3",
232
- "!.chronomemory/events.wal",
233
- "!.chronomemory/snapshot.json",
234
- ".chronomemory/backup/",
223
+ # Paths that MUST be tracked in git — never emit a bare ignore rule for these.
224
+ # These are governance source-of-truth artifacts that define project state.
225
+ #
226
+ # Decision rationale:
227
+ # config.yml — project identity and settings
228
+ # requirements/testcases — governance canon (YAML-first or JSON cache)
229
+ # esdb.sqlite3 — ESDB SQLite backend (canonical record store)
230
+ # esdb_migration_manifest — which migrations have run; tracked for
231
+ # reproducibility so fresh clones don't re-run
232
+ # events.wal/snapshot — ChronoMemory canonical state (commercial tier)
233
+ _GIT_TRACKED_POLICY: tuple[str, ...] = (
234
+ ".specsmith/config.yml",
235
+ ".specsmith/requirements.json",
236
+ ".specsmith/testcases.json",
237
+ ".specsmith/esdb.sqlite3",
238
+ ".specsmith/esdb_migration_manifest.json",
239
+ ".chronomemory/events.wal",
240
+ ".chronomemory/snapshot.json",
241
+ )
242
+
243
+ # Paths that MUST NOT be tracked in git — runtime/ephemeral artifacts.
244
+ # If any of these appear in `git ls-files`, the normalizer will run
245
+ # `git rm --cached` to reconcile tracking state with ignore policy so the
246
+ # ignore rule is immediately effective rather than a dormant no-op.
247
+ #
248
+ # Decision rationale:
249
+ # workitems.json — runtime WI allocation; re-minted by preflight
250
+ # ledger-chain.txt — ephemeral hash-chain cache; DEPRECATED (REQ-420)
251
+ # trace.jsonl — trace log; DEPRECATED by ESDB seal_records (REQ-420)
252
+ # credit-budget.json — session runtime budget; regenerated on start
253
+ # credits.json — runtime credit ledger
254
+ # model-rate-limits — runtime rate-limit state
255
+ # backups/ — timestamped SQLite snapshots; regeneratable via save
256
+ # session_metrics — per-session telemetry; not governance source-of-truth
257
+ # runs/chat/perf/... — transient runtime directories
258
+ # ledger.jsonl — deprecated flat-file ledger (superseded by LEDGER.md)
259
+ # chronomemory/backup — timestamped ChronoMemory backup copies
260
+ _GIT_IGNORED_POLICY: tuple[str, ...] = (
235
261
  ".specsmith/workitems.json",
236
- ".specsmith/runs/",
237
- ".specsmith/chat/",
238
- ".specsmith/perf/",
239
- ".specsmith/recovery/",
240
- ".specsmith/ledger.jsonl",
241
262
  ".specsmith/ledger-chain.txt",
242
263
  ".specsmith/trace.jsonl",
243
264
  ".specsmith/credit-budget.json",
244
265
  ".specsmith/credits.json",
245
266
  ".specsmith/model-rate-limits.json",
267
+ ".specsmith/session_metrics.jsonl",
268
+ ".specsmith/backups/",
269
+ ".specsmith/runs/",
270
+ ".specsmith/chat/",
271
+ ".specsmith/perf/",
272
+ ".specsmith/recovery/",
246
273
  ".specsmith/pids/",
247
274
  ".specsmith/logs/",
248
275
  ".specsmith/sessions/",
249
276
  ".specsmith/agent-reports/",
250
277
  ".specsmith/dispatch/",
251
- ".specsmith/esdb_migration_manifest.json",
278
+ ".specsmith/ledger.jsonl",
279
+ ".chronomemory/backup/",
252
280
  )
253
281
 
282
+ # Sentinel comment line that marks the auto-normalized block.
283
+ _POLICY_SENTINEL = "# specsmith ESDB policy (auto-normalized)"
284
+
285
+
286
+ def _untrack_diverged_paths(root: Path, *, dry_run: bool = False) -> list[str]:
287
+ """Find deny-listed paths that are currently tracked in git and untrack them.
288
+
289
+ For each path in _GIT_IGNORED_POLICY that appears in `git ls-files`, runs
290
+ `git rm --cached <path>` (unless dry_run) so the .gitignore deny rule
291
+ becomes effective instead of a dormant no-op.
292
+
293
+ Returns the list of paths that were (or would be) untracked.
294
+ """
295
+ import contextlib # noqa: PLC0415 # lazy: only needed when git is present
296
+ import subprocess # noqa: PLC0415 # lazy: only needed when git is present
297
+
298
+ diverged: list[str] = []
299
+ for pattern in _GIT_IGNORED_POLICY:
300
+ bare = pattern.rstrip("/")
301
+ try:
302
+ result = subprocess.run(
303
+ ["git", "ls-files", "--", bare],
304
+ cwd=str(root),
305
+ capture_output=True,
306
+ text=True,
307
+ timeout=10,
308
+ )
309
+ tracked = [f for f in result.stdout.splitlines() if f]
310
+ except Exception: # noqa: BLE001 # intentional: git unavailable, skip
311
+ continue
312
+ for tracked_path in tracked:
313
+ diverged.append(tracked_path)
314
+ if not dry_run:
315
+ with contextlib.suppress(Exception): # best-effort: skip if git unavailable
316
+ subprocess.run(
317
+ ["git", "rm", "--cached", "--quiet", "--", tracked_path],
318
+ cwd=str(root),
319
+ check=True,
320
+ capture_output=True,
321
+ timeout=10,
322
+ )
323
+ return diverged
324
+
254
325
 
255
326
  def normalize_esdb_gitignore_policy(root: Path, *, dry_run: bool = False) -> bool:
256
- """Normalize ESDB gitignore policy for legacy projects.
327
+ """Normalize ESDB gitignore policy (REQ-428).
328
+
329
+ Enforces a single, consistent tracking decision for every governance path:
257
330
 
258
- Ensures broad ignores that hide canonical ESDB state are removed and that
259
- explicit policy lines are present so SQLite/Chrono canonical artifacts are
260
- always tracked while runtime files stay ignored.
331
+ - Paths in _GIT_TRACKED_POLICY receive ``!``-prefixed allow rules and are
332
+ never given a bare deny rule. The two sets are validated to be disjoint.
333
+ - Paths in _GIT_IGNORED_POLICY receive bare deny rules. Any such path
334
+ currently tracked in git is untracked via ``git rm --cached`` so the deny
335
+ rule is immediately effective rather than a dormant, misleading no-op.
336
+ - Broad directory ignores (``.specsmith/``, ``.chronomemory/``) are removed
337
+ because they would inadvertently hide the canonical ESDB state files.
338
+
339
+ Returns True if any change was made (gitignore written or files untracked).
261
340
  """
341
+ # Disjoint-set invariant: a path cannot appear in both allow and deny lists.
342
+ _tracked_bare = set(_GIT_TRACKED_POLICY)
343
+ _overlap = _tracked_bare & set(_GIT_IGNORED_POLICY)
344
+ if _overlap: # pragma: no cover — programming error
345
+ raise AssertionError(f"BUG: paths in both allow and deny policy: {_overlap}")
346
+
347
+ # --- Read and strip forbidden broad ignores + stale auto-normalized block -
262
348
  gitignore_path = root / ".gitignore"
263
- if gitignore_path.exists():
264
- original_lines = gitignore_path.read_text(encoding="utf-8").splitlines()
265
- else:
266
- original_lines = []
349
+ original_lines = (
350
+ gitignore_path.read_text(encoding="utf-8").splitlines() if gitignore_path.exists() else []
351
+ )
267
352
 
268
353
  normalized_lines: list[str] = []
269
354
  removed_forbidden = False
355
+ in_auto_block = False
270
356
  for line in original_lines:
271
- if line.strip() in _ESDB_GITIGNORE_FORBIDDEN:
357
+ stripped = line.strip()
358
+ if stripped in _ESDB_GITIGNORE_FORBIDDEN:
272
359
  removed_forbidden = True
273
360
  continue
361
+ if stripped == _POLICY_SENTINEL:
362
+ in_auto_block = True # drop the old sentinel and everything after it
363
+ continue
364
+ if in_auto_block:
365
+ # Keep lines that are unrelated to the specsmith policy block
366
+ if not (
367
+ stripped.startswith("!.specsmith/")
368
+ or stripped.startswith(".specsmith/")
369
+ or stripped.startswith("!.chronomemory/")
370
+ or stripped.startswith(".chronomemory/")
371
+ or stripped.startswith("# ")
372
+ ):
373
+ in_auto_block = False
374
+ normalized_lines.append(line)
375
+ continue
274
376
  normalized_lines.append(line)
275
377
 
276
- existing = {line.strip() for line in normalized_lines if line.strip()}
277
- missing = [entry for entry in _ESDB_GITIGNORE_REQUIRED if entry not in existing]
278
- changed = removed_forbidden or bool(missing)
279
-
280
- if not changed:
281
- return False
282
-
283
- if normalized_lines and normalized_lines[-1].strip():
284
- normalized_lines.append("")
285
- if missing:
286
- normalized_lines.append("# specsmith ESDB policy (auto-normalized)")
287
- normalized_lines.extend(missing)
288
-
289
- if not dry_run:
378
+ # --- Determine which policy lines are missing from the retained content ---
379
+ existing = {ln.strip() for ln in normalized_lines if ln.strip()}
380
+ allow_lines = [f"!{p}" for p in _GIT_TRACKED_POLICY]
381
+ deny_lines = list(_GIT_IGNORED_POLICY)
382
+ missing_allows = [ln for ln in allow_lines if ln not in existing]
383
+ missing_denies = [ln for ln in deny_lines if ln not in existing]
384
+ gitignore_changed = removed_forbidden or bool(missing_allows) or bool(missing_denies)
385
+
386
+ if not dry_run and gitignore_changed:
387
+ if normalized_lines and normalized_lines[-1].strip():
388
+ normalized_lines.append("")
389
+ normalized_lines.append(_POLICY_SENTINEL)
390
+ normalized_lines.append("# Tracked (governance source-of-truth):")
391
+ normalized_lines.extend(missing_allows)
392
+ normalized_lines.append("# Ephemeral runtime paths (never commit):")
393
+ normalized_lines.extend(missing_denies)
290
394
  rendered = "\n".join(normalized_lines)
291
395
  if rendered and not rendered.endswith("\n"):
292
396
  rendered += "\n"
293
397
  gitignore_path.write_text(rendered, encoding="utf-8")
294
398
 
295
- return True
399
+ # --- Reconcile git index: untrack any deny-listed paths still tracked ----
400
+ untracked = _untrack_diverged_paths(root, dry_run=dry_run)
401
+ return gitignore_changed or bool(untracked)
296
402
 
297
403
 
298
404
  # ---------------------------------------------------------------------------
@@ -37,41 +37,38 @@ htmlcov/
37
37
  .work/
38
38
  *.log
39
39
 
40
- # specsmith governance data policy
41
- # Keep committed:
42
- # - .specsmith/config.yml
43
- # - .specsmith/requirements.json
44
- # - .specsmith/testcases.json
45
- # - .specsmith/esdb.sqlite3
46
- # - .chronomemory/events.wal
47
- # - .chronomemory/snapshot.json
48
- # Always track these even if broader ignore rules are added later:
40
+ # specsmith governance data policy (auto-enforced by specsmith sync)
41
+ #
42
+ # Tracked (governance source-of-truth) — always committed:
49
43
  !.specsmith/config.yml
50
44
  !.specsmith/requirements.json
51
45
  !.specsmith/testcases.json
52
46
  !.specsmith/esdb.sqlite3
47
+ !.specsmith/esdb_migration_manifest.json
53
48
  !.chronomemory/events.wal
54
49
  !.chronomemory/snapshot.json
55
50
  #
56
- # Ignore runtime-only / regeneratable artifacts:
57
- .chronomemory/backup/
51
+ # Ephemeral runtime paths never committed:
52
+ # (specsmith sync will run `git rm --cached` for any of these already tracked)
58
53
  .specsmith/workitems.json
59
- .specsmith/runs/
60
- .specsmith/chat/
61
- .specsmith/perf/
62
- .specsmith/recovery/
63
- .specsmith/ledger.jsonl
64
54
  .specsmith/ledger-chain.txt
65
55
  .specsmith/trace.jsonl
66
56
  .specsmith/credit-budget.json
67
57
  .specsmith/credits.json
68
58
  .specsmith/model-rate-limits.json
59
+ .specsmith/session_metrics.jsonl
60
+ .specsmith/backups/
61
+ .specsmith/runs/
62
+ .specsmith/chat/
63
+ .specsmith/perf/
64
+ .specsmith/recovery/
69
65
  .specsmith/pids/
70
66
  .specsmith/logs/
71
67
  .specsmith/sessions/
72
68
  .specsmith/agent-reports/
73
69
  .specsmith/dispatch/
74
- .specsmith/esdb_migration_manifest.json
70
+ .specsmith/ledger.jsonl
71
+ .chronomemory/backup/
75
72
  {% if project.type in ('cli-rust', 'library-rust') %}
76
73
 
77
74
  # Rust
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.18.0.dev698
3
+ Version: 0.18.0.dev709
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
@@ -48,13 +48,59 @@ def test_run_sync_normalizes_legacy_esdb_gitignore(tmp_path: Path) -> None:
48
48
  for line in (tmp_path / ".gitignore").read_text(encoding="utf-8").splitlines()
49
49
  if line.strip()
50
50
  }
51
+ # Broad ignores must be gone
51
52
  assert ".specsmith/" not in lines
52
53
  assert ".chronomemory/" not in lines
53
- assert ".chronomemory/backup/" in lines
54
- assert ".specsmith/workitems.json" in lines
54
+ # Allow-list (tracked source-of-truth) must be present
55
55
  assert "!.specsmith/esdb.sqlite3" in lines
56
+ assert "!.specsmith/esdb_migration_manifest.json" in lines
56
57
  assert "!.chronomemory/events.wal" in lines
57
58
  assert "!.chronomemory/snapshot.json" in lines
59
+ # Deny-list (ephemeral runtime) must be present
60
+ assert ".chronomemory/backup/" in lines
61
+ assert ".specsmith/workitems.json" in lines
62
+ assert ".specsmith/ledger-chain.txt" in lines
63
+ assert ".specsmith/trace.jsonl" in lines
64
+ assert ".specsmith/backups/" in lines
65
+ assert ".specsmith/session_metrics.jsonl" in lines
66
+ # esdb_migration_manifest must NOT appear as a bare deny rule
67
+ assert ".specsmith/esdb_migration_manifest.json" not in lines
68
+
69
+
70
+ def test_normalizer_policy_sets_are_disjoint() -> None:
71
+ """_GIT_TRACKED_POLICY and _GIT_IGNORED_POLICY must never overlap."""
72
+ from specsmith.sync import _GIT_IGNORED_POLICY, _GIT_TRACKED_POLICY
73
+
74
+ tracked = set(_GIT_TRACKED_POLICY)
75
+ ignored = set(_GIT_IGNORED_POLICY)
76
+ overlap = tracked & ignored
77
+ assert not overlap, f"Paths in both allow and deny policy: {overlap}"
78
+
79
+
80
+ def test_normalizer_idempotent(tmp_path: Path) -> None:
81
+ """Running normalize twice must not change the file on the second pass."""
82
+ from specsmith.sync import normalize_esdb_gitignore_policy
83
+
84
+ normalize_esdb_gitignore_policy(tmp_path)
85
+ content_after_first = (tmp_path / ".gitignore").read_text(encoding="utf-8")
86
+ normalize_esdb_gitignore_policy(tmp_path)
87
+ content_after_second = (tmp_path / ".gitignore").read_text(encoding="utf-8")
88
+ assert content_after_first == content_after_second
89
+
90
+
91
+ def test_normalizer_untrack_dry_run_returns_diverged(tmp_path: Path) -> None:
92
+ """dry_run=True reports diverged paths without modifying git index."""
93
+ from unittest.mock import MagicMock, patch
94
+
95
+ from specsmith.sync import _untrack_diverged_paths
96
+
97
+ # Simulate git ls-files returning a tracked workitems.json
98
+ fake_result = MagicMock()
99
+ fake_result.stdout = ".specsmith/workitems.json\n"
100
+ with patch("subprocess.run", return_value=fake_result):
101
+ diverged = _untrack_diverged_paths(tmp_path, dry_run=True)
102
+
103
+ assert ".specsmith/workitems.json" in diverged
58
104
 
59
105
 
60
106
  def test_save_uses_sqlite_store_backup(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: