specsmith 0.11.6.dev456__tar.gz → 0.11.7.dev461__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 (285) hide show
  1. {specsmith-0.11.6.dev456/src/specsmith.egg-info → specsmith-0.11.7.dev461}/PKG-INFO +1 -1
  2. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/pyproject.toml +1 -1
  3. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/__init__.py +1 -1
  4. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/cli.py +71 -8
  5. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/config.py +1 -1
  6. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/updater.py +34 -12
  7. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461/src/specsmith.egg-info}/PKG-INFO +1 -1
  8. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_cli.py +9 -0
  9. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/LICENSE +0 -0
  10. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/README.md +0 -0
  11. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/setup.cfg +0 -0
  12. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/__init__.py +0 -0
  13. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/belief.py +0 -0
  14. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/certainty.py +0 -0
  15. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/failure_graph.py +0 -0
  16. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/py.typed +0 -0
  17. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/recovery.py +0 -0
  18. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/session.py +0 -0
  19. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/stress_tester.py +0 -0
  20. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/epistemic/trace.py +0 -0
  21. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/__main__.py +0 -0
  22. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/__init__.py +0 -0
  23. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/broker.py +0 -0
  24. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/chat_runner.py +0 -0
  25. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/cleanup.py +0 -0
  26. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/context_seed.py +0 -0
  27. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/core.py +0 -0
  28. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/__init__.py +0 -0
  29. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/_status.py +0 -0
  30. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/dag.py +0 -0
  31. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  32. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/events.py +0 -0
  33. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/dispatch/result.py +0 -0
  34. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/endpoints.py +0 -0
  35. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/events.py +0 -0
  36. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/execution_profiles.py +0 -0
  37. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/fallback.py +0 -0
  38. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/hf_leaderboard.py +0 -0
  39. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/hf_sync.py +0 -0
  40. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/indexer.py +0 -0
  41. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/llm_client.py +0 -0
  42. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/mcp.py +0 -0
  43. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/memory.py +0 -0
  44. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/model_intelligence.py +0 -0
  45. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/model_profiles.py +0 -0
  46. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/orchestrator.py +0 -0
  47. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/permissions.py +0 -0
  48. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/profiles.py +0 -0
  49. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/provider_registry.py +0 -0
  50. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/repl.py +0 -0
  51. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/router.py +0 -0
  52. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/rules.py +0 -0
  53. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/runner.py +0 -0
  54. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/safety.py +0 -0
  55. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/spawner.py +0 -0
  56. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/suggester.py +0 -0
  57. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/teams.py +0 -0
  58. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/tools.py +0 -0
  59. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/verifier.py +0 -0
  60. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/agent/voice.py +0 -0
  61. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/architect.py +0 -0
  62. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/auditor.py +0 -0
  63. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/auth.py +0 -0
  64. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/block_export.py +0 -0
  65. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/channel.py +0 -0
  66. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/ci_manager.py +0 -0
  67. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/commands/__init__.py +0 -0
  68. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/commands/intelligence.py +0 -0
  69. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/__init__.py +0 -0
  70. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/_compat.py +0 -0
  71. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/checker.py +0 -0
  72. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/evidence.py +0 -0
  73. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/regulations.py +0 -0
  74. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compliance/reporter.py +0 -0
  75. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/compressor.py +0 -0
  76. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/console_utils.py +0 -0
  77. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/context_orchestrator.py +0 -0
  78. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/context_window.py +0 -0
  79. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/credit_analyzer.py +0 -0
  80. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/credits.py +0 -0
  81. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/__init__.py +0 -0
  82. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/base.py +0 -0
  83. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/citations.py +0 -0
  84. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/fpd.py +0 -0
  85. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/odp.py +0 -0
  86. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/patentsview.py +0 -0
  87. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/pfw.py +0 -0
  88. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/ppubs.py +0 -0
  89. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/datasources/ptab.py +0 -0
  90. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/differ.py +0 -0
  91. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/doctor.py +0 -0
  92. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/drive.py +0 -0
  93. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/editor.py +0 -0
  94. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/__init__.py +0 -0
  95. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/belief.py +0 -0
  96. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/certainty.py +0 -0
  97. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/failure_graph.py +0 -0
  98. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/recovery.py +0 -0
  99. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/epistemic/stress_tester.py +0 -0
  100. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/esdb/__init__.py +0 -0
  101. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/esdb/bridge.py +0 -0
  102. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/eval/__init__.py +0 -0
  103. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/eval/builtins.py +0 -0
  104. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/eval/runner.py +0 -0
  105. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/executor.py +0 -0
  106. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/exporter.py +0 -0
  107. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/governance_logic.py +0 -0
  108. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/governance_store.py +0 -0
  109. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/governance_yaml.py +0 -0
  110. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/__init__.py +0 -0
  111. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/app.py +0 -0
  112. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/main_window.py +0 -0
  113. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/session_tab.py +0 -0
  114. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/theme.py +0 -0
  115. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/__init__.py +0 -0
  116. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/chat_view.py +0 -0
  117. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/input_bar.py +0 -0
  118. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  119. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/token_meter.py +0 -0
  120. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  121. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/widgets/update_checker.py +0 -0
  122. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/gui/worker.py +0 -0
  123. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/history_search.py +0 -0
  124. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/importer.py +0 -0
  125. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/instinct.py +0 -0
  126. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/__init__.py +0 -0
  127. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/agent_skill.py +0 -0
  128. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/aider.py +0 -0
  129. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/base.py +0 -0
  130. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/claude_code.py +0 -0
  131. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/codity.py +0 -0
  132. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/copilot.py +0 -0
  133. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/cursor.py +0 -0
  134. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/gemini.py +0 -0
  135. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/integrations/windsurf.py +0 -0
  136. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/issue_reporter.py +0 -0
  137. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/languages.py +0 -0
  138. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/ledger.py +0 -0
  139. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/mcp_generator.py +0 -0
  140. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/__init__.py +0 -0
  141. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  142. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  143. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  144. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  145. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  146. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/m006_session_governance.py +0 -0
  147. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/migrations/runner.py +0 -0
  148. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/ollama_cmds.py +0 -0
  149. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/patent.py +0 -0
  150. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/paths.py +0 -0
  151. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/phase.py +0 -0
  152. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/plugins.py +0 -0
  153. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/profiles.py +0 -0
  154. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/rate_limits.py +0 -0
  155. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/releaser.py +0 -0
  156. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/requirements.py +0 -0
  157. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/requirements_parser.py +0 -0
  158. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/retrieval.py +0 -0
  159. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/safe_write.py +0 -0
  160. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/scaffolder.py +0 -0
  161. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/serve.py +0 -0
  162. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/session.py +0 -0
  163. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/session_init.py +0 -0
  164. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/session_store.py +0 -0
  165. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/__init__.py +0 -0
  166. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/cloud.py +0 -0
  167. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/corporate.py +0 -0
  168. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/cross_platform.py +0 -0
  169. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/devops.py +0 -0
  170. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/docs.py +0 -0
  171. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/embedded.py +0 -0
  172. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/governance.py +0 -0
  173. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/hardware.py +0 -0
  174. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/mobile.py +0 -0
  175. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/productivity.py +0 -0
  176. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills/ssh.py +0 -0
  177. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/skills_builder.py +0 -0
  178. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/sync.py +0 -0
  179. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/agents.md.j2 +0 -0
  180. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  181. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  182. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  183. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  184. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  185. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  186. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  187. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/community/security.md.j2 +0 -0
  188. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  189. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  190. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  191. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  192. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  193. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/editorconfig.j2 +0 -0
  194. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/gitattributes.j2 +0 -0
  195. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/gitignore.j2 +0 -0
  196. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/go/go.mod.j2 +0 -0
  197. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/go/main.go.j2 +0 -0
  198. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  199. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  200. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  201. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  202. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  203. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  204. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  205. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  206. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  207. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  208. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  209. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/js/package.json.j2 +0 -0
  210. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/ledger.md.j2 +0 -0
  211. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/python/cli.py.j2 +0 -0
  212. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/python/init.py.j2 +0 -0
  213. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  214. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/readme.md.j2 +0 -0
  215. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  216. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  217. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  218. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  219. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  220. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  221. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  222. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  223. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  224. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/tool_installer.py +0 -0
  225. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/toolrules.py +0 -0
  226. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/tools.py +0 -0
  227. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/trace.py +0 -0
  228. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/upgrader.py +0 -0
  229. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/validator.py +0 -0
  230. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs/__init__.py +0 -0
  231. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs/base.py +0 -0
  232. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs/bitbucket.py +0 -0
  233. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs/github.py +0 -0
  234. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs/gitlab.py +0 -0
  235. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/vcs_commands.py +0 -0
  236. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/wireframes.py +0 -0
  237. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith/workspace.py +0 -0
  238. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith.egg-info/SOURCES.txt +0 -0
  239. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith.egg-info/dependency_links.txt +0 -0
  240. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith.egg-info/entry_points.txt +0 -0
  241. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith.egg-info/requires.txt +0 -0
  242. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/src/specsmith.egg-info/top_level.txt +0 -0
  243. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_CMD_001.py +0 -0
  244. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_agent_profiles.py +0 -0
  245. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_agent_run_feedback.py +0 -0
  246. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_agent_runner_ready.py +0 -0
  247. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_ai_client.py +0 -0
  248. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_ai_intelligence.py +0 -0
  249. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_auditor.py +0 -0
  250. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_channel.py +0 -0
  251. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_chat_diff_decision.py +0 -0
  252. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_chat_runner_openai_compat.py +0 -0
  253. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_chat_stdin_protocol.py +0 -0
  254. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_cli_workflows_history_drive.py +0 -0
  255. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_compliance.py +0 -0
  256. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_compressor.py +0 -0
  257. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_dispatch.py +0 -0
  258. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_e2e_nexus.py +0 -0
  259. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_endpoints_cli.py +0 -0
  260. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_endpoints_store.py +0 -0
  261. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_epistemic.py +0 -0
  262. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_fallback_chain.py +0 -0
  263. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_importer.py +0 -0
  264. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_integrations.py +0 -0
  265. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_integrations_codity.py +0 -0
  266. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_intelligence.py +0 -0
  267. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_issue_reporter.py +0 -0
  268. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_mcp_client.py +0 -0
  269. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_new_modules.py +0 -0
  270. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_nexus.py +0 -0
  271. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_permissions.py +0 -0
  272. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_phase1_4_new.py +0 -0
  273. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_phase34_completion.py +0 -0
  274. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_rate_limits.py +0 -0
  275. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_req_248_262.py +0 -0
  276. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_scaffolder.py +0 -0
  277. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_skill_marketplace.py +0 -0
  278. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_skills_mcp.py +0 -0
  279. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_smoke.py +0 -0
  280. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_suggester.py +0 -0
  281. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_tools.py +0 -0
  282. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_validator.py +0 -0
  283. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_vcs.py +0 -0
  284. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/tests/test_warp_parity.py +0 -0
  285. {specsmith-0.11.6.dev456 → specsmith-0.11.7.dev461}/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.11.6.dev456
3
+ Version: 0.11.7.dev461
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.11.6.dev456"
7
+ version = "0.11.7.dev461"
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"
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
8
8
  try:
9
9
  __version__: str = _pkg_version("specsmith")
10
10
  except PackageNotFoundError: # running from source without install
11
- __version__ = "0.11.6" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.11.7" # fallback: keep in sync with pyproject.toml
@@ -97,12 +97,32 @@ class _AutoUpdateGroup(click.Group):
97
97
 
98
98
  def invoke(self, ctx: click.Context) -> object:
99
99
  import os
100
-
101
- # Skip if explicitly disabled or if this is a meta-command
102
- # ctx.protected_args is deprecated in Click 9.0; suppress the warning
103
- # on access (it still works in 8.x). In 9.0 the subcommand moves to args.
104
100
  import warnings
105
101
 
102
+ # ── Pipx-only enforcement ─────────────────────────────────────────────
103
+ # specsmith MUST be installed and invoked through pipx.
104
+ # Any invocation from a non-pipx Python environment is rejected unless
105
+ # the escape hatch SPECSMITH_ALLOW_NON_PIPX=1 is set (CI / dev only).
106
+ if not os.environ.get("SPECSMITH_ALLOW_NON_PIPX"):
107
+ from specsmith.updater import is_pipx_install
108
+
109
+ if not is_pipx_install():
110
+ click.echo(
111
+ "ERROR: specsmith must be installed and run via pipx only.\n"
112
+ " Any pip install, venv install, or editable dev install\n"
113
+ " is rejected to prevent version conflicts.\n"
114
+ "\n"
115
+ " Install: pipx install specsmith\n"
116
+ " Upgrade: pipx upgrade specsmith\n"
117
+ " Remove other: pip uninstall specsmith\n"
118
+ "\n"
119
+ " CI/testing override: set SPECSMITH_ALLOW_NON_PIPX=1",
120
+ err=True,
121
+ )
122
+ raise SystemExit(1)
123
+
124
+ # ── Version checks (skip for meta-commands) ───────────────────────────
125
+ # ctx.protected_args is deprecated in Click 9.0; suppress the warning.
106
126
  with warnings.catch_warnings():
107
127
  warnings.simplefilter("ignore", DeprecationWarning)
108
128
  protected = list(ctx.protected_args) # [subcommand] in 8.x, [] in 9.0
@@ -182,17 +202,53 @@ def _maybe_prompt_project_update() -> None:
182
202
  def _maybe_notify_pypi_update() -> None:
183
203
  """Check PyPI for a newer specsmith version. Prints one-liner if outdated.
184
204
 
185
- Runs at most once per shell session (tracked via env var). Uses a 3-second
186
- timeout to avoid blocking the CLI. Only checks stable versions.
205
+ Persists the last-check timestamp to ``~/.specsmith/last-update-check``
206
+ so the network call is only made when it has been more than
207
+ ``SPECSMITH_UPDATE_INTERVAL_HOURS`` hours since the previous check
208
+ (default: 24h). Within that window the function returns immediately
209
+ without any I/O — adding zero latency to every CLI invocation.
210
+
211
+ Override the interval::
212
+
213
+ SPECSMITH_UPDATE_INTERVAL_HOURS=4 specsmith audit
214
+
215
+ Disable entirely::
216
+
217
+ SPECSMITH_NO_UPDATE_CHECK=1 specsmith audit
218
+
219
+ Uses a 3-second network timeout so a slow/offline connection never
220
+ blocks the user.
187
221
  """
188
222
  import os
223
+ import time
224
+ from pathlib import Path
189
225
 
226
+ if os.environ.get("SPECSMITH_NO_UPDATE_CHECK"):
227
+ return
228
+
229
+ # One check per shell session — never fire twice in the same process tree.
190
230
  session_key = "SPECSMITH_PYPI_CHECKED"
191
231
  if os.environ.get(session_key):
192
232
  return
193
233
  os.environ[session_key] = "1"
194
234
 
195
235
  try:
236
+ interval_h = float(os.environ.get("SPECSMITH_UPDATE_INTERVAL_HOURS", "24"))
237
+ interval_s = interval_h * 3600
238
+
239
+ stamp_file = Path.home() / ".specsmith" / "last-update-check"
240
+ now = time.time()
241
+
242
+ # Read persisted last-check time (best-effort).
243
+ last_check = 0.0
244
+ if stamp_file.is_file():
245
+ with contextlib.suppress(ValueError, OSError):
246
+ last_check = float(stamp_file.read_text(encoding="utf-8").strip())
247
+
248
+ # Not due yet — skip entirely (no network call).
249
+ if now - last_check < interval_s:
250
+ return
251
+
196
252
  import json as _json # noqa: PLC0415
197
253
  from urllib.request import urlopen # noqa: PLC0415
198
254
 
@@ -202,9 +258,16 @@ def _maybe_notify_pypi_update() -> None:
202
258
  if not latest:
203
259
  return
204
260
 
205
- # Simple version comparison: split into tuples of ints
261
+ # Persist the timestamp now that we have a successful response.
262
+ try:
263
+ stamp_file.parent.mkdir(parents=True, exist_ok=True)
264
+ stamp_file.write_text(str(now), encoding="utf-8")
265
+ except OSError:
266
+ pass # Never fail the CLI over a timestamp write error
267
+
268
+ # Simple version comparison — no packaging dep needed.
206
269
  def _ver(v: str) -> tuple[int, ...]:
207
- import re
270
+ import re # noqa: PLC0415
208
271
 
209
272
  clean = re.match(r"(\d+\.\d+\.\d+)", v)
210
273
  return tuple(int(x) for x in clean.group(1).split(".")) if clean else (0,)
@@ -115,7 +115,7 @@ class ProjectConfig(BaseModel):
115
115
  ),
116
116
  )
117
117
  language: str = Field(default="python", description="Primary language/runtime")
118
- spec_version: str = Field(default="0.11.6", description="Spec version to scaffold from")
118
+ spec_version: str = Field(default="0.11.7", description="Spec version to scaffold from")
119
119
  description: str = Field(default="", description="Short project description")
120
120
 
121
121
  # Options
@@ -66,17 +66,32 @@ def is_outdated() -> bool:
66
66
  def is_pipx_install() -> bool:
67
67
  """Return True if specsmith was installed via pipx.
68
68
 
69
- Checks sys.executable path and PIPX_HOME / PIPX_LOCAL_VENVS env vars.
69
+ Checks sys.executable path against known pipx venv locations and the
70
+ PIPX_HOME / PIPX_LOCAL_VENVS env vars. Robust on Windows where pipx
71
+ stores venvs in ``~/pipx/venvs/`` without setting PIPX_HOME.
70
72
  """
71
73
  import os
72
74
  import sys
75
+ from pathlib import Path
73
76
 
74
77
  exe = sys.executable.replace("\\", "/").lower()
75
- return (
76
- "pipx" in exe
77
- or bool(os.environ.get("PIPX_HOME"))
78
- or bool(os.environ.get("PIPX_LOCAL_VENVS"))
79
- )
78
+
79
+ # 1. Executable path contains 'pipx' (catches most OS defaults)
80
+ if "pipx" in exe:
81
+ return True
82
+
83
+ # 2. Explicit pipx env vars (set by some CI / pipx versions)
84
+ if os.environ.get("PIPX_HOME") or os.environ.get("PIPX_LOCAL_VENVS"):
85
+ return True
86
+
87
+ # 3. Windows default: ~/pipx/venvs/<pkg>/Scripts/python.exe
88
+ win_pipx = (Path.home() / "pipx" / "venvs").as_posix().lower()
89
+ if exe.startswith(win_pipx):
90
+ return True
91
+
92
+ # 4. Linux/macOS default: ~/.local/pipx/venvs/<pkg>/bin/python
93
+ unix_pipx = (Path.home() / ".local" / "pipx" / "venvs").as_posix().lower()
94
+ return bool(exe.startswith(unix_pipx))
80
95
 
81
96
 
82
97
  def run_self_update(
@@ -123,14 +138,17 @@ def run_self_update(
123
138
 
124
139
 
125
140
  def check_project_version(root: Path) -> tuple[str, str]:
126
- """Compare scaffold.yml spec_version to installed version.
141
+ """Compare scaffold config spec_version to installed version.
127
142
 
143
+ Checks ``docs/SPECSMITH.yml`` (canonical) then ``scaffold.yml`` (legacy).
128
144
  Returns (project_version, installed_version).
129
145
  """
130
146
  import yaml
131
147
 
132
- scaffold_path = root / "scaffold.yml"
133
- if not scaffold_path.exists():
148
+ from specsmith.paths import find_scaffold
149
+
150
+ scaffold_path = find_scaffold(root)
151
+ if scaffold_path is None:
134
152
  return "", __version__
135
153
 
136
154
  with open(scaffold_path) as f:
@@ -150,15 +168,19 @@ def needs_migration(root: Path) -> bool:
150
168
  def run_migration(root: Path, *, dry_run: bool = False) -> list[str]:
151
169
  """Migrate a project to the current specsmith version.
152
170
 
171
+ Checks ``docs/SPECSMITH.yml`` (canonical) then ``scaffold.yml`` (legacy).
153
172
  Returns list of actions taken (or that would be taken for dry_run).
154
173
  """
155
174
  import yaml
156
175
 
157
176
  from specsmith.ledger import add_entry
177
+ from specsmith.paths import find_scaffold
158
178
 
159
- scaffold_path = root / "scaffold.yml"
160
- if not scaffold_path.exists():
161
- return ["No scaffold.yml found — nothing to migrate"]
179
+ scaffold_path = find_scaffold(root)
180
+ if scaffold_path is None:
181
+ return [
182
+ "No scaffold config found (docs/SPECSMITH.yml or scaffold.yml) — nothing to migrate"
183
+ ]
162
184
 
163
185
  with open(scaffold_path) as f:
164
186
  raw = yaml.safe_load(f) or {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.11.6.dev456
3
+ Version: 0.11.7.dev461
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
@@ -113,6 +113,15 @@ class TestCLIUpgrade:
113
113
 
114
114
  def test_upgrade_to_new_version(self, tmp_path: Path) -> None:
115
115
  target = _scaffold_governed(tmp_path)
116
+ # Backdate spec_version so there is an actual upgrade to perform.
117
+ # Without this the scaffold is already at __version__ and the
118
+ # command would return "Already at spec version" instead.
119
+ scaffold_yml = target / "scaffold.yml"
120
+ with open(scaffold_yml) as fh:
121
+ data = yaml.safe_load(fh)
122
+ data["spec_version"] = "0.11.6"
123
+ with open(scaffold_yml, "w") as fh:
124
+ yaml.dump(data, fh, default_flow_style=False)
116
125
  runner = CliRunner()
117
126
  result = runner.invoke(
118
127
  main, ["upgrade", "--project-dir", str(target), "--spec-version", "0.11.7"]