specsmith 0.13.0.dev501__tar.gz → 0.13.0.dev502__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 (294) hide show
  1. {specsmith-0.13.0.dev501/src/specsmith.egg-info → specsmith-0.13.0.dev502}/PKG-INFO +1 -1
  2. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/pyproject.toml +1 -1
  3. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502/src/specsmith.egg-info}/PKG-INFO +1 -1
  4. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_mcp_server.py +52 -105
  5. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/LICENSE +0 -0
  6. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/README.md +0 -0
  7. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/setup.cfg +0 -0
  8. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/__init__.py +0 -0
  9. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/belief.py +0 -0
  10. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/certainty.py +0 -0
  11. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/failure_graph.py +0 -0
  12. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/py.typed +0 -0
  13. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/recovery.py +0 -0
  14. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/session.py +0 -0
  15. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/stress_tester.py +0 -0
  16. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/epistemic/trace.py +0 -0
  17. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/__init__.py +0 -0
  18. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/__main__.py +0 -0
  19. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/__init__.py +0 -0
  20. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/broker.py +0 -0
  21. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/chat_runner.py +0 -0
  22. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/cleanup.py +0 -0
  23. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/context_seed.py +0 -0
  24. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/core.py +0 -0
  25. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/__init__.py +0 -0
  26. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/_status.py +0 -0
  27. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/dag.py +0 -0
  28. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  29. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/events.py +0 -0
  30. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/dispatch/result.py +0 -0
  31. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/endpoints.py +0 -0
  32. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/events.py +0 -0
  33. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/execution_profiles.py +0 -0
  34. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/fallback.py +0 -0
  35. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/hf_leaderboard.py +0 -0
  36. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/hf_sync.py +0 -0
  37. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/indexer.py +0 -0
  38. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/llm_client.py +0 -0
  39. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/mcp.py +0 -0
  40. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/memory.py +0 -0
  41. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/model_intelligence.py +0 -0
  42. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/model_profiles.py +0 -0
  43. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/orchestrator.py +0 -0
  44. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/permissions.py +0 -0
  45. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/profiles.py +0 -0
  46. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/provider_registry.py +0 -0
  47. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/repl.py +0 -0
  48. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/router.py +0 -0
  49. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/rules.py +0 -0
  50. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/runner.py +0 -0
  51. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/safety.py +0 -0
  52. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/spawner.py +0 -0
  53. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/suggester.py +0 -0
  54. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/teams.py +0 -0
  55. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/tools.py +0 -0
  56. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/verifier.py +0 -0
  57. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/agent/voice.py +0 -0
  58. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/architect.py +0 -0
  59. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/auditor.py +0 -0
  60. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/auth.py +0 -0
  61. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/block_export.py +0 -0
  62. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/channel.py +0 -0
  63. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ci_manager.py +0 -0
  64. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/cli.py +0 -0
  65. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/commands/__init__.py +0 -0
  66. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/commands/intelligence.py +0 -0
  67. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/__init__.py +0 -0
  68. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/_compat.py +0 -0
  69. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/checker.py +0 -0
  70. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/evidence.py +0 -0
  71. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/regulations.py +0 -0
  72. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compliance/reporter.py +0 -0
  73. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/compressor.py +0 -0
  74. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/config.py +0 -0
  75. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/console_utils.py +0 -0
  76. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/context_orchestrator.py +0 -0
  77. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/context_window.py +0 -0
  78. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/credit_analyzer.py +0 -0
  79. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/credits.py +0 -0
  80. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/__init__.py +0 -0
  81. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/base.py +0 -0
  82. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/citations.py +0 -0
  83. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/fpd.py +0 -0
  84. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/odp.py +0 -0
  85. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/patentsview.py +0 -0
  86. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/pfw.py +0 -0
  87. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/ppubs.py +0 -0
  88. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/datasources/ptab.py +0 -0
  89. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/differ.py +0 -0
  90. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/doctor.py +0 -0
  91. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/drive.py +0 -0
  92. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/editor.py +0 -0
  93. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/__init__.py +0 -0
  94. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/belief.py +0 -0
  95. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/certainty.py +0 -0
  96. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/failure_graph.py +0 -0
  97. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/recovery.py +0 -0
  98. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/epistemic/stress_tester.py +0 -0
  99. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/esdb/__init__.py +0 -0
  100. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/esdb/bridge.py +0 -0
  101. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/__init__.py +0 -0
  102. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/builtins.py +0 -0
  103. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/eval/runner.py +0 -0
  104. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/executor.py +0 -0
  105. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/exporter.py +0 -0
  106. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_logic.py +0 -0
  107. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_store.py +0 -0
  108. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/governance_yaml.py +0 -0
  109. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/__init__.py +0 -0
  110. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/app.py +0 -0
  111. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/main_window.py +0 -0
  112. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/session_tab.py +0 -0
  113. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/theme.py +0 -0
  114. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/__init__.py +0 -0
  115. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/chat_view.py +0 -0
  116. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/input_bar.py +0 -0
  117. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  118. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/token_meter.py +0 -0
  119. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  120. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/widgets/update_checker.py +0 -0
  121. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/gui/worker.py +0 -0
  122. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/history_search.py +0 -0
  123. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/importer.py +0 -0
  124. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/instinct.py +0 -0
  125. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/__init__.py +0 -0
  126. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/agent_skill.py +0 -0
  127. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/aider.py +0 -0
  128. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/base.py +0 -0
  129. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/claude_code.py +0 -0
  130. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/codity.py +0 -0
  131. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/copilot.py +0 -0
  132. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/cursor.py +0 -0
  133. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/gemini.py +0 -0
  134. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/integrations/windsurf.py +0 -0
  135. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/issue_reporter.py +0 -0
  136. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/languages.py +0 -0
  137. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ledger.py +0 -0
  138. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/mcp_generator.py +0 -0
  139. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/mcp_server.py +0 -0
  140. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/__init__.py +0 -0
  141. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  142. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  143. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  144. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  145. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  146. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/m006_session_governance.py +0 -0
  147. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/migrations/runner.py +0 -0
  148. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/ollama_cmds.py +0 -0
  149. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/patent.py +0 -0
  150. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/paths.py +0 -0
  151. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/phase.py +0 -0
  152. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/plugins.py +0 -0
  153. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/profiles.py +0 -0
  154. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/rate_limits.py +0 -0
  155. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/releaser.py +0 -0
  156. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/requirements.py +0 -0
  157. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/requirements_parser.py +0 -0
  158. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/retrieval.py +0 -0
  159. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/safe_write.py +0 -0
  160. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/scaffolder.py +0 -0
  161. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/serve.py +0 -0
  162. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session.py +0 -0
  163. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session_init.py +0 -0
  164. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/session_store.py +0 -0
  165. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/__init__.py +0 -0
  166. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/ai_agents.py +0 -0
  167. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/cloud.py +0 -0
  168. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/corporate.py +0 -0
  169. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/cross_platform.py +0 -0
  170. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/data_engineering.py +0 -0
  171. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/devops.py +0 -0
  172. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/docs.py +0 -0
  173. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/embedded.py +0 -0
  174. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/governance.py +0 -0
  175. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/hardware.py +0 -0
  176. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/mobile.py +0 -0
  177. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/platform_engineering.py +0 -0
  178. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/productivity.py +0 -0
  179. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/software_engineering.py +0 -0
  180. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/specsmith_skills.py +0 -0
  181. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/ssh.py +0 -0
  182. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills/web_backend.py +0 -0
  183. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/skills_builder.py +0 -0
  184. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/sync.py +0 -0
  185. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/agents.md.j2 +0 -0
  186. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  187. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  188. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  189. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  190. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  191. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  192. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  193. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/community/security.md.j2 +0 -0
  194. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  195. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  196. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  197. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  198. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  199. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/editorconfig.j2 +0 -0
  200. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/gitattributes.j2 +0 -0
  201. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/gitignore.j2 +0 -0
  202. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/go/go.mod.j2 +0 -0
  203. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/go/main.go.j2 +0 -0
  204. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  205. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  206. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  207. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  208. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  209. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  210. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  211. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  212. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  213. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  214. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  215. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/js/package.json.j2 +0 -0
  216. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/ledger.md.j2 +0 -0
  217. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/cli.py.j2 +0 -0
  218. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/init.py.j2 +0 -0
  219. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  220. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/readme.md.j2 +0 -0
  221. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  222. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  223. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  224. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  225. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  226. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  227. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  228. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  229. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  230. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/tool_installer.py +0 -0
  231. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/toolrules.py +0 -0
  232. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/tools.py +0 -0
  233. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/trace.py +0 -0
  234. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/updater.py +0 -0
  235. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/upgrader.py +0 -0
  236. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/validator.py +0 -0
  237. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/__init__.py +0 -0
  238. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/base.py +0 -0
  239. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/bitbucket.py +0 -0
  240. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/github.py +0 -0
  241. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs/gitlab.py +0 -0
  242. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/vcs_commands.py +0 -0
  243. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/wireframes.py +0 -0
  244. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith/workspace.py +0 -0
  245. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/SOURCES.txt +0 -0
  246. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/dependency_links.txt +0 -0
  247. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/entry_points.txt +0 -0
  248. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/requires.txt +0 -0
  249. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/src/specsmith.egg-info/top_level.txt +0 -0
  250. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_CMD_001.py +0 -0
  251. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_profiles.py +0 -0
  252. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_run_feedback.py +0 -0
  253. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_agent_runner_ready.py +0 -0
  254. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_ai_client.py +0 -0
  255. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_ai_intelligence.py +0 -0
  256. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_auditor.py +0 -0
  257. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_channel.py +0 -0
  258. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_diff_decision.py +0 -0
  259. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_runner_openai_compat.py +0 -0
  260. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_chat_stdin_protocol.py +0 -0
  261. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_cli.py +0 -0
  262. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_cli_workflows_history_drive.py +0 -0
  263. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_compliance.py +0 -0
  264. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_compressor.py +0 -0
  265. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_dispatch.py +0 -0
  266. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_e2e_nexus.py +0 -0
  267. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_endpoints_cli.py +0 -0
  268. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_endpoints_store.py +0 -0
  269. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_epistemic.py +0 -0
  270. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_fallback_chain.py +0 -0
  271. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_importer.py +0 -0
  272. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_integrations.py +0 -0
  273. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_integrations_codity.py +0 -0
  274. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_intelligence.py +0 -0
  275. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_issue_reporter.py +0 -0
  276. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_mcp_client.py +0 -0
  277. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_new_modules.py +0 -0
  278. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_nexus.py +0 -0
  279. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_permissions.py +0 -0
  280. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_phase1_4_new.py +0 -0
  281. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_phase34_completion.py +0 -0
  282. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_rate_limits.py +0 -0
  283. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_req_248_262.py +0 -0
  284. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_req_358_359.py +0 -0
  285. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_scaffolder.py +0 -0
  286. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_skill_marketplace.py +0 -0
  287. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_skills_mcp.py +0 -0
  288. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_smoke.py +0 -0
  289. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_suggester.py +0 -0
  290. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_tools.py +0 -0
  291. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_validator.py +0 -0
  292. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_vcs.py +0 -0
  293. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_warp_parity.py +0 -0
  294. {specsmith-0.13.0.dev501 → specsmith-0.13.0.dev502}/tests/test_warp_parity_followup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.13.0.dev501
3
+ Version: 0.13.0.dev502
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
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.13.0.dev501"
7
+ version = "0.13.0.dev502"
8
8
  description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.13.0.dev501
3
+ Version: 0.13.0.dev502
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
6
6
  License-Expression: MIT
@@ -21,6 +21,8 @@ from typing import Any
21
21
 
22
22
  import pytest
23
23
 
24
+ import specsmith.mcp_server as mcp_mod
25
+
24
26
 
25
27
  # ---------------------------------------------------------------------------
26
28
  # Autouse: suppress auto-update noise
@@ -48,9 +50,7 @@ def _make_rpc(method: str, params: dict[str, Any] | None = None, req_id: int = 1
48
50
 
49
51
  def _send_rpc(msg: dict[str, Any]) -> dict[str, Any]:
50
52
  """Feed one JSON-RPC message to _handle_request and return its response."""
51
- from specsmith.mcp_server import _handle_request
52
-
53
- resp = _handle_request(msg)
53
+ resp = mcp_mod._handle_request(msg)
54
54
  assert resp is not None, "Expected a response but got None"
55
55
  return resp
56
56
 
@@ -100,11 +100,9 @@ class TestMcpProtocol:
100
100
  assert tool["inputSchema"]["type"] == "object"
101
101
 
102
102
  def test_notification_returns_none(self) -> None:
103
- from specsmith.mcp_server import _handle_request
104
-
105
103
  # Notifications have no id — no response expected
106
104
  msg = {"jsonrpc": "2.0", "method": "notifications/initialized", "params": {}}
107
- assert _handle_request(msg) is None
105
+ assert mcp_mod._handle_request(msg) is None
108
106
 
109
107
  def test_unknown_method_returns_error(self) -> None:
110
108
  resp = _send_rpc(_make_rpc("no_such_method", {}, req_id=99))
@@ -126,10 +124,10 @@ class TestMcpProtocol:
126
124
  assert resp["result"] == {}
127
125
 
128
126
  def test_parse_error_on_bad_json(self) -> None:
129
- from specsmith.mcp_server import _handle_request
130
-
131
127
  # _handle_request only processes dicts; parse errors are handled in run_server
132
- resp = _handle_request({"jsonrpc": "2.0", "method": "initialize", "id": 10, "params": {}})
128
+ resp = mcp_mod._handle_request(
129
+ {"jsonrpc": "2.0", "method": "initialize", "id": 10, "params": {}}
130
+ )
133
131
  assert resp is not None
134
132
  assert "result" in resp
135
133
 
@@ -141,15 +139,11 @@ class TestMcpProtocol:
141
139
 
142
140
  class TestGovernanceAudit:
143
141
  def test_returns_healthy_key(self, tmp_path: Path) -> None:
144
- from specsmith.mcp_server import _handle_governance_audit
145
-
146
- result = _handle_governance_audit({"project_dir": str(tmp_path)})
142
+ result = mcp_mod._handle_governance_audit({"project_dir": str(tmp_path)})
147
143
  assert "healthy" in result
148
144
 
149
145
  def test_returns_checks_list(self, tmp_path: Path) -> None:
150
- from specsmith.mcp_server import _handle_governance_audit
151
-
152
- result = _handle_governance_audit({"project_dir": str(tmp_path)})
146
+ result = mcp_mod._handle_governance_audit({"project_dir": str(tmp_path)})
153
147
  assert isinstance(result.get("checks"), list)
154
148
 
155
149
  def test_via_tools_call(self, tmp_path: Path) -> None:
@@ -167,16 +161,12 @@ class TestGovernanceAudit:
167
161
 
168
162
  class TestGovernanceCheckpoint:
169
163
  def test_returns_anchor_key(self, tmp_path: Path) -> None:
170
- from specsmith.mcp_server import _handle_governance_checkpoint
171
-
172
- result = _handle_governance_checkpoint({"project_dir": str(tmp_path)})
164
+ result = mcp_mod._handle_governance_checkpoint({"project_dir": str(tmp_path)})
173
165
  assert "anchor" in result
174
166
  assert result["anchor"].startswith("SPECSMITH-ANCHOR-")
175
167
 
176
168
  def test_returns_phase_and_health(self, tmp_path: Path) -> None:
177
- from specsmith.mcp_server import _handle_governance_checkpoint
178
-
179
- result = _handle_governance_checkpoint({"project_dir": str(tmp_path)})
169
+ result = mcp_mod._handle_governance_checkpoint({"project_dir": str(tmp_path)})
180
170
  assert "health" in result
181
171
  assert "phase" in result
182
172
  assert "req_count" in result
@@ -196,15 +186,11 @@ class TestGovernanceCheckpoint:
196
186
 
197
187
  class TestGovernancePreflight:
198
188
  def test_empty_intent_returns_rejected(self, tmp_path: Path) -> None:
199
- from specsmith.mcp_server import _handle_governance_preflight
200
-
201
- result = _handle_governance_preflight({"intent": "", "project_dir": str(tmp_path)})
189
+ result = mcp_mod._handle_governance_preflight({"intent": "", "project_dir": str(tmp_path)})
202
190
  assert result["decision"] == "rejected"
203
191
 
204
192
  def test_returns_decision_key(self, tmp_path: Path) -> None:
205
- from specsmith.mcp_server import _handle_governance_preflight
206
-
207
- result = _handle_governance_preflight(
193
+ result = mcp_mod._handle_governance_preflight(
208
194
  {
209
195
  "intent": "read governance health status",
210
196
  "project_dir": str(tmp_path),
@@ -233,9 +219,7 @@ class TestGovernancePreflight:
233
219
 
234
220
  class TestGovernancePhase:
235
221
  def test_returns_phase_key(self, tmp_path: Path) -> None:
236
- from specsmith.mcp_server import _handle_governance_phase
237
-
238
- result = _handle_governance_phase({"project_dir": str(tmp_path)})
222
+ result = mcp_mod._handle_governance_phase({"project_dir": str(tmp_path)})
239
223
  assert "phase" in result
240
224
 
241
225
  def test_via_tools_call(self, tmp_path: Path) -> None:
@@ -253,9 +237,7 @@ class TestGovernancePhase:
253
237
 
254
238
  class TestGovernanceReqList:
255
239
  def test_missing_requirements_json_returns_error(self, tmp_path: Path) -> None:
256
- from specsmith.mcp_server import _handle_governance_req_list
257
-
258
- result = _handle_governance_req_list({"project_dir": str(tmp_path)})
240
+ result = mcp_mod._handle_governance_req_list({"project_dir": str(tmp_path)})
259
241
  assert "error" in result
260
242
 
261
243
  def test_with_requirements_json(self, tmp_path: Path) -> None:
@@ -270,9 +252,7 @@ class TestGovernanceReqList:
270
252
  json.dumps([{"id": "TEST-001", "covers": "REQ-001"}]), encoding="utf-8"
271
253
  )
272
254
 
273
- from specsmith.mcp_server import _handle_governance_req_list
274
-
275
- result = _handle_governance_req_list({"project_dir": str(tmp_path)})
255
+ result = mcp_mod._handle_governance_req_list({"project_dir": str(tmp_path)})
276
256
  assert result["total"] == 2
277
257
  assert result["covered"] == 1
278
258
  req_ids = [r["id"] for r in result["reqs"]]
@@ -290,9 +270,7 @@ class TestGovernanceReqList:
290
270
  ]
291
271
  (spec_dir / "requirements.json").write_text(json.dumps(reqs), encoding="utf-8")
292
272
 
293
- from specsmith.mcp_server import _handle_governance_req_list
294
-
295
- result = _handle_governance_req_list(
273
+ result = mcp_mod._handle_governance_req_list(
296
274
  {
297
275
  "project_dir": str(tmp_path),
298
276
  "status_filter": "planned",
@@ -318,68 +296,56 @@ class TestRegistryFunctions:
318
296
  def test_read_registry_missing_file_returns_empty( # noqa: E501
319
297
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
320
298
  ) -> None:
321
- import specsmith.mcp_server as _mod
322
-
323
299
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
324
300
  # No file created — should return empty list
325
- result = _mod.read_registry()
301
+ result = mcp_mod.read_registry()
326
302
  assert result == []
327
303
 
328
304
  def test_write_then_read_roundtrip(
329
305
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
330
306
  ) -> None:
331
- import specsmith.mcp_server as _mod
332
-
333
307
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
334
308
  paths = ["/path/to/proj1", "/path/to/proj2"]
335
- _mod.write_registry(paths)
336
- assert _mod.read_registry() == paths
309
+ mcp_mod.write_registry(paths)
310
+ assert mcp_mod.read_registry() == paths
337
311
 
338
312
  def test_register_project_adds_new_entry(
339
313
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
340
314
  ) -> None:
341
- import specsmith.mcp_server as _mod
342
-
343
315
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
344
316
  proj = tmp_path / "myproject"
345
317
  proj.mkdir()
346
- added = _mod.register_project(str(proj))
318
+ added = mcp_mod.register_project(str(proj))
347
319
  assert added is True
348
- assert str(proj) in _mod.read_registry()
320
+ assert str(proj) in mcp_mod.read_registry()
349
321
 
350
322
  def test_register_project_idempotent(
351
323
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
352
324
  ) -> None:
353
- import specsmith.mcp_server as _mod
354
-
355
325
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
356
326
  proj = tmp_path / "myproject"
357
327
  proj.mkdir()
358
- _mod.register_project(str(proj))
359
- added_again = _mod.register_project(str(proj))
328
+ mcp_mod.register_project(str(proj))
329
+ added_again = mcp_mod.register_project(str(proj))
360
330
  assert added_again is False
361
- assert _mod.read_registry().count(str(proj)) == 1
331
+ assert mcp_mod.read_registry().count(str(proj)) == 1
362
332
 
363
333
  def test_unregister_project_removes_entry(
364
334
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
365
335
  ) -> None:
366
- import specsmith.mcp_server as _mod
367
-
368
336
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
369
337
  proj = tmp_path / "myproject"
370
338
  proj.mkdir()
371
- _mod.register_project(str(proj))
372
- removed = _mod.unregister_project(str(proj))
339
+ mcp_mod.register_project(str(proj))
340
+ removed = mcp_mod.unregister_project(str(proj))
373
341
  assert removed is True
374
- assert str(proj) not in _mod.read_registry()
342
+ assert str(proj) not in mcp_mod.read_registry()
375
343
 
376
344
  def test_unregister_project_returns_false_if_not_registered(
377
345
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
378
346
  ) -> None:
379
- import specsmith.mcp_server as _mod
380
-
381
347
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
382
- result = _mod.unregister_project("/nonexistent/path")
348
+ result = mcp_mod.unregister_project("/nonexistent/path")
383
349
  assert result is False
384
350
 
385
351
  def test_registry_based_server_startup(
@@ -388,50 +354,40 @@ class TestRegistryFunctions:
388
354
  """run_server with no args should pick up projects from the registry."""
389
355
  import io
390
356
 
391
- import specsmith.mcp_server as _mod
392
- from specsmith.mcp_server import run_server
393
-
394
357
  monkeypatch.setenv("SPECSMITH_HOME", str(tmp_path))
395
358
  proj_a = tmp_path / "alpha"
396
359
  proj_a.mkdir()
397
360
  proj_b = tmp_path / "beta"
398
361
  proj_b.mkdir()
399
- _mod.register_project(str(proj_a))
400
- _mod.register_project(str(proj_b))
362
+ mcp_mod.register_project(str(proj_a))
363
+ mcp_mod.register_project(str(proj_b))
401
364
 
402
365
  old_stdin = sys.stdin
403
366
  sys.stdin = io.StringIO("")
404
367
  try:
405
- run_server() # no project_dir arg — should use registry
368
+ mcp_mod.run_server() # no project_dir arg — should use registry
406
369
  finally:
407
370
  sys.stdin = old_stdin
408
371
 
409
372
  # First registered project is the default
410
- assert str(proj_a) == _mod._DEFAULT_PROJECT_DIR
411
- assert str(proj_b) in _mod._REGISTERED_PROJECTS
373
+ assert str(proj_a) == mcp_mod._DEFAULT_PROJECT_DIR
374
+ assert str(proj_b) in mcp_mod._REGISTERED_PROJECTS
412
375
 
413
376
 
414
377
  class TestGovernanceProjectList:
415
378
  def test_returns_default_project(self, tmp_path: Path) -> None:
416
- from specsmith.mcp_server import _handle_governance_project_list, run_server
417
-
418
379
  # Prime server state with a known directory
419
- run_server.__func__ if hasattr(run_server, "__func__") else run_server # noqa: B018
420
- import specsmith.mcp_server as _mod
380
+ mcp_mod._DEFAULT_PROJECT_DIR = str(tmp_path)
381
+ mcp_mod._REGISTERED_PROJECTS = [str(tmp_path)]
421
382
 
422
- _mod._DEFAULT_PROJECT_DIR = str(tmp_path)
423
- _mod._REGISTERED_PROJECTS = [str(tmp_path)]
424
-
425
- result = _handle_governance_project_list({})
383
+ result = mcp_mod._handle_governance_project_list({})
426
384
  assert result["default_project"] == str(tmp_path)
427
385
  assert str(tmp_path) in result["projects"]
428
386
  assert result["count"] >= 1
429
387
 
430
388
  def test_via_tools_call(self, tmp_path: Path) -> None:
431
- import specsmith.mcp_server as _mod
432
-
433
- _mod._DEFAULT_PROJECT_DIR = str(tmp_path)
434
- _mod._REGISTERED_PROJECTS = [str(tmp_path)]
389
+ mcp_mod._DEFAULT_PROJECT_DIR = str(tmp_path)
390
+ mcp_mod._REGISTERED_PROJECTS = [str(tmp_path)]
435
391
 
436
392
  resp = _send_rpc(
437
393
  _make_rpc(
@@ -449,9 +405,6 @@ class TestGovernanceProjectList:
449
405
  """run_server registers extra_project_dirs and they appear in project_list."""
450
406
  import io
451
407
 
452
- import specsmith.mcp_server as _mod
453
- from specsmith.mcp_server import run_server
454
-
455
408
  extra = tmp_path / "extra"
456
409
  extra.mkdir()
457
410
 
@@ -459,26 +412,24 @@ class TestGovernanceProjectList:
459
412
  old_stdin = sys.stdin
460
413
  sys.stdin = io.StringIO("")
461
414
  try:
462
- run_server(project_dir=str(tmp_path), extra_project_dirs=[str(extra)])
415
+ mcp_mod.run_server(project_dir=str(tmp_path), extra_project_dirs=[str(extra)])
463
416
  finally:
464
417
  sys.stdin = old_stdin
465
418
 
466
- assert str(tmp_path.resolve()) == _mod._DEFAULT_PROJECT_DIR
467
- assert str(extra.resolve()) in _mod._REGISTERED_PROJECTS
468
- assert _mod._REGISTERED_PROJECTS[0] == str(tmp_path.resolve())
419
+ assert str(tmp_path.resolve()) == mcp_mod._DEFAULT_PROJECT_DIR
420
+ assert str(extra.resolve()) in mcp_mod._REGISTERED_PROJECTS
421
+ assert mcp_mod._REGISTERED_PROJECTS[0] == str(tmp_path.resolve())
469
422
 
470
423
  def test_no_chdir_called(self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
471
424
  """run_server must NOT call os.chdir — paths are resolved absolutely."""
472
425
  import io
473
426
 
474
- from specsmith.mcp_server import run_server
475
-
476
427
  chdir_calls: list[str] = []
477
428
  monkeypatch.setattr("os.chdir", lambda p: chdir_calls.append(str(p)))
478
429
  old_stdin = sys.stdin
479
430
  sys.stdin = io.StringIO("")
480
431
  try:
481
- run_server(project_dir=str(tmp_path))
432
+ mcp_mod.run_server(project_dir=str(tmp_path))
482
433
  finally:
483
434
  sys.stdin = old_stdin
484
435
 
@@ -487,9 +438,7 @@ class TestGovernanceProjectList:
487
438
 
488
439
  class TestGovernanceTraceSeal:
489
440
  def test_missing_description_returns_error(self, tmp_path: Path) -> None:
490
- from specsmith.mcp_server import _handle_governance_trace_seal
491
-
492
- result = _handle_governance_trace_seal(
441
+ result = mcp_mod._handle_governance_trace_seal(
493
442
  {
494
443
  "seal_type": "milestone",
495
444
  "description": "",
@@ -503,9 +452,7 @@ class TestGovernanceTraceSeal:
503
452
  spec_dir = tmp_path / ".specsmith"
504
453
  spec_dir.mkdir()
505
454
 
506
- from specsmith.mcp_server import _handle_governance_trace_seal
507
-
508
- result = _handle_governance_trace_seal(
455
+ result = mcp_mod._handle_governance_trace_seal(
509
456
  {
510
457
  "seal_type": "milestone",
511
458
  "description": "test seal for pytest",
@@ -520,12 +467,10 @@ class TestGovernanceTraceSeal:
520
467
  spec_dir = tmp_path / ".specsmith"
521
468
  spec_dir.mkdir()
522
469
 
523
- from specsmith.mcp_server import _handle_governance_trace_seal
524
-
525
- _handle_governance_trace_seal(
470
+ mcp_mod._handle_governance_trace_seal(
526
471
  {"seal_type": "decision", "description": "first", "project_dir": str(tmp_path)}
527
472
  )
528
- result2 = _handle_governance_trace_seal(
473
+ result2 = mcp_mod._handle_governance_trace_seal(
529
474
  {"seal_type": "milestone", "description": "second", "project_dir": str(tmp_path)}
530
475
  )
531
476
  assert result2["seal_id"] == "SEAL-0002"
@@ -586,8 +531,9 @@ class TestMcpServeCli:
586
531
  timeout=15,
587
532
  env=env,
588
533
  )
589
- except subprocess.TimeoutExpired:
534
+ except subprocess.TimeoutExpired: # pragma: no cover
590
535
  pytest.skip("mcp serve subprocess timed out (slow CI env)")
536
+ return # never reached; satisfies flow analysis
591
537
 
592
538
  assert proc.stdout, f"No output from mcp serve (stderr: {proc.stderr[:500]})"
593
539
  response = json.loads(proc.stdout.strip().splitlines()[0])
@@ -623,8 +569,9 @@ class TestMcpServeCli:
623
569
  timeout=15,
624
570
  env=env,
625
571
  )
626
- except subprocess.TimeoutExpired:
572
+ except subprocess.TimeoutExpired: # pragma: no cover
627
573
  pytest.skip("mcp serve subprocess timed out (slow CI env)")
574
+ return # never reached; satisfies flow analysis
628
575
 
629
576
  lines = [ln for ln in proc.stdout.strip().splitlines() if ln.strip()]
630
577
  assert len(lines) >= 2, f"Expected ≥2 responses, got: {lines}"