specsmith 0.14.0.dev540__tar.gz → 0.14.0.dev543__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 (298) hide show
  1. {specsmith-0.14.0.dev540/src/specsmith.egg-info → specsmith-0.14.0.dev543}/PKG-INFO +3 -3
  2. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/README.md +1 -1
  3. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/pyproject.toml +2 -2
  4. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/governance_logic.py +21 -22
  5. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543/src/specsmith.egg-info}/PKG-INFO +3 -3
  6. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith.egg-info/requires.txt +1 -1
  7. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/LICENSE +0 -0
  8. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/setup.cfg +0 -0
  9. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/__init__.py +0 -0
  10. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/belief.py +0 -0
  11. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/certainty.py +0 -0
  12. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/failure_graph.py +0 -0
  13. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/py.typed +0 -0
  14. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/recovery.py +0 -0
  15. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/session.py +0 -0
  16. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/stress_tester.py +0 -0
  17. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/epistemic/trace.py +0 -0
  18. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/__init__.py +0 -0
  19. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/__main__.py +0 -0
  20. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/__init__.py +0 -0
  21. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/broker.py +0 -0
  22. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/chat_runner.py +0 -0
  23. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/cleanup.py +0 -0
  24. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/context_seed.py +0 -0
  25. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/core.py +0 -0
  26. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/__init__.py +0 -0
  27. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/_status.py +0 -0
  28. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/dag.py +0 -0
  29. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  30. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/events.py +0 -0
  31. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/dispatch/result.py +0 -0
  32. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/endpoints.py +0 -0
  33. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/events.py +0 -0
  34. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/execution_profiles.py +0 -0
  35. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/fallback.py +0 -0
  36. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/hf_leaderboard.py +0 -0
  37. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/hf_sync.py +0 -0
  38. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/indexer.py +0 -0
  39. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/llm_client.py +0 -0
  40. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/mcp.py +0 -0
  41. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/memory.py +0 -0
  42. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/model_intelligence.py +0 -0
  43. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/model_profiles.py +0 -0
  44. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/orchestrator.py +0 -0
  45. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/permissions.py +0 -0
  46. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/profiles.py +0 -0
  47. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/provider_registry.py +0 -0
  48. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/repl.py +0 -0
  49. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/router.py +0 -0
  50. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/rules.py +0 -0
  51. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/runner.py +0 -0
  52. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/safety.py +0 -0
  53. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/spawner.py +0 -0
  54. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/suggester.py +0 -0
  55. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/teams.py +0 -0
  56. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/tools.py +0 -0
  57. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/verifier.py +0 -0
  58. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/agent/voice.py +0 -0
  59. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/architect.py +0 -0
  60. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/auditor.py +0 -0
  61. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/auth.py +0 -0
  62. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/block_export.py +0 -0
  63. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/channel.py +0 -0
  64. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/ci_manager.py +0 -0
  65. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/cli.py +0 -0
  66. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/commands/__init__.py +0 -0
  67. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/commands/intelligence.py +0 -0
  68. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/__init__.py +0 -0
  69. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/_compat.py +0 -0
  70. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/checker.py +0 -0
  71. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/evidence.py +0 -0
  72. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/regulations.py +0 -0
  73. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compliance/reporter.py +0 -0
  74. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/compressor.py +0 -0
  75. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/config.py +0 -0
  76. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/console_utils.py +0 -0
  77. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/context_orchestrator.py +0 -0
  78. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/context_window.py +0 -0
  79. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/credit_analyzer.py +0 -0
  80. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/credits.py +0 -0
  81. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/__init__.py +0 -0
  82. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/base.py +0 -0
  83. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/citations.py +0 -0
  84. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/fpd.py +0 -0
  85. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/odp.py +0 -0
  86. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/patentsview.py +0 -0
  87. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/pfw.py +0 -0
  88. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/ppubs.py +0 -0
  89. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/datasources/ptab.py +0 -0
  90. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/differ.py +0 -0
  91. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/doctor.py +0 -0
  92. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/drive.py +0 -0
  93. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/editor.py +0 -0
  94. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/__init__.py +0 -0
  95. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/belief.py +0 -0
  96. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/certainty.py +0 -0
  97. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/failure_graph.py +0 -0
  98. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/recovery.py +0 -0
  99. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/epistemic/stress_tester.py +0 -0
  100. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/esdb/__init__.py +0 -0
  101. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/esdb/_license.py +0 -0
  102. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/esdb/bridge.py +0 -0
  103. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/esdb/sqlite_store.py +0 -0
  104. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/eval/__init__.py +0 -0
  105. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/eval/builtins.py +0 -0
  106. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/eval/runner.py +0 -0
  107. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/executor.py +0 -0
  108. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/exporter.py +0 -0
  109. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/governance_store.py +0 -0
  110. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/governance_yaml.py +0 -0
  111. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/__init__.py +0 -0
  112. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/app.py +0 -0
  113. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/main_window.py +0 -0
  114. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/session_tab.py +0 -0
  115. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/theme.py +0 -0
  116. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/__init__.py +0 -0
  117. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/chat_view.py +0 -0
  118. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/input_bar.py +0 -0
  119. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  120. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/token_meter.py +0 -0
  121. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  122. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/widgets/update_checker.py +0 -0
  123. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/gui/worker.py +0 -0
  124. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/history_search.py +0 -0
  125. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/importer.py +0 -0
  126. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/instinct.py +0 -0
  127. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/__init__.py +0 -0
  128. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/agent_skill.py +0 -0
  129. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/aider.py +0 -0
  130. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/base.py +0 -0
  131. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/claude_code.py +0 -0
  132. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/codity.py +0 -0
  133. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/copilot.py +0 -0
  134. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/cursor.py +0 -0
  135. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/gemini.py +0 -0
  136. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/integrations/windsurf.py +0 -0
  137. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/issue_reporter.py +0 -0
  138. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/languages.py +0 -0
  139. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/ledger.py +0 -0
  140. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/mcp_generator.py +0 -0
  141. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/mcp_server.py +0 -0
  142. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/__init__.py +0 -0
  143. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  144. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  145. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  146. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  147. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  148. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/m006_session_governance.py +0 -0
  149. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/migrations/runner.py +0 -0
  150. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/ollama_cmds.py +0 -0
  151. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/patent.py +0 -0
  152. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/paths.py +0 -0
  153. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/phase.py +0 -0
  154. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/plugins.py +0 -0
  155. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/profiles.py +0 -0
  156. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/rate_limits.py +0 -0
  157. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/releaser.py +0 -0
  158. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/requirements.py +0 -0
  159. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/requirements_parser.py +0 -0
  160. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/retrieval.py +0 -0
  161. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/safe_write.py +0 -0
  162. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/scaffolder.py +0 -0
  163. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/serve.py +0 -0
  164. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/session.py +0 -0
  165. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/session_init.py +0 -0
  166. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/session_store.py +0 -0
  167. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/__init__.py +0 -0
  168. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/ai_agents.py +0 -0
  169. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/cloud.py +0 -0
  170. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/corporate.py +0 -0
  171. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/cross_platform.py +0 -0
  172. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/data_engineering.py +0 -0
  173. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/devops.py +0 -0
  174. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/docs.py +0 -0
  175. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/embedded.py +0 -0
  176. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/governance.py +0 -0
  177. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/hardware.py +0 -0
  178. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/mobile.py +0 -0
  179. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/platform_engineering.py +0 -0
  180. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/productivity.py +0 -0
  181. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/software_engineering.py +0 -0
  182. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/specsmith_skills.py +0 -0
  183. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/ssh.py +0 -0
  184. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills/web_backend.py +0 -0
  185. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/skills_builder.py +0 -0
  186. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/sync.py +0 -0
  187. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/agents.md.j2 +0 -0
  188. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  189. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  190. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  191. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  192. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  193. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  194. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  195. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/community/security.md.j2 +0 -0
  196. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  197. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  198. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  199. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  200. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  201. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/editorconfig.j2 +0 -0
  202. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/gitattributes.j2 +0 -0
  203. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/gitignore.j2 +0 -0
  204. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/go/go.mod.j2 +0 -0
  205. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/go/main.go.j2 +0 -0
  206. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  207. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  208. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  209. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  210. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  211. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  212. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  213. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  214. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  215. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  216. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  217. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/js/package.json.j2 +0 -0
  218. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/ledger.md.j2 +0 -0
  219. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/python/cli.py.j2 +0 -0
  220. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/python/init.py.j2 +0 -0
  221. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  222. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/readme.md.j2 +0 -0
  223. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  224. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  225. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  226. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  227. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  228. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  229. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  230. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  231. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  232. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/tool_installer.py +0 -0
  233. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/toolrules.py +0 -0
  234. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/tools.py +0 -0
  235. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/trace.py +0 -0
  236. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/updater.py +0 -0
  237. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/upgrader.py +0 -0
  238. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/validator.py +0 -0
  239. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs/__init__.py +0 -0
  240. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs/base.py +0 -0
  241. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs/bitbucket.py +0 -0
  242. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs/github.py +0 -0
  243. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs/gitlab.py +0 -0
  244. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/vcs_commands.py +0 -0
  245. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/wireframes.py +0 -0
  246. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith/workspace.py +0 -0
  247. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith.egg-info/SOURCES.txt +0 -0
  248. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith.egg-info/dependency_links.txt +0 -0
  249. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith.egg-info/entry_points.txt +0 -0
  250. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/src/specsmith.egg-info/top_level.txt +0 -0
  251. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_CMD_001.py +0 -0
  252. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_agent_profiles.py +0 -0
  253. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_agent_run_feedback.py +0 -0
  254. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_agent_runner_ready.py +0 -0
  255. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_ai_client.py +0 -0
  256. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_ai_intelligence.py +0 -0
  257. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_auditor.py +0 -0
  258. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_channel.py +0 -0
  259. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_chat_diff_decision.py +0 -0
  260. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_chat_runner_openai_compat.py +0 -0
  261. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_chat_stdin_protocol.py +0 -0
  262. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_cli.py +0 -0
  263. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_cli_workflows_history_drive.py +0 -0
  264. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_compliance.py +0 -0
  265. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_compressor.py +0 -0
  266. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_dispatch.py +0 -0
  267. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_e2e_nexus.py +0 -0
  268. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_endpoints_cli.py +0 -0
  269. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_endpoints_store.py +0 -0
  270. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_epistemic.py +0 -0
  271. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_esdb_license.py +0 -0
  272. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_esdb_sqlite.py +0 -0
  273. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_fallback_chain.py +0 -0
  274. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_importer.py +0 -0
  275. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_integrations.py +0 -0
  276. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_integrations_codity.py +0 -0
  277. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_intelligence.py +0 -0
  278. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_issue_reporter.py +0 -0
  279. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_mcp_client.py +0 -0
  280. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_mcp_server.py +0 -0
  281. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_new_modules.py +0 -0
  282. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_nexus.py +0 -0
  283. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_permissions.py +0 -0
  284. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_phase1_4_new.py +0 -0
  285. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_phase34_completion.py +0 -0
  286. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_rate_limits.py +0 -0
  287. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_req_248_262.py +0 -0
  288. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_req_358_359.py +0 -0
  289. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_scaffolder.py +0 -0
  290. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_skill_marketplace.py +0 -0
  291. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_skills_mcp.py +0 -0
  292. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_smoke.py +0 -0
  293. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_suggester.py +0 -0
  294. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_tools.py +0 -0
  295. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_validator.py +0 -0
  296. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_vcs.py +0 -0
  297. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/tests/test_warp_parity.py +0 -0
  298. {specsmith-0.14.0.dev540 → specsmith-0.14.0.dev543}/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.14.0.dev540
3
+ Version: 0.14.0.dev543
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
@@ -40,7 +40,7 @@ Requires-Dist: pre-commit>=3.0; extra == "dev"
40
40
  Requires-Dist: types-pyyaml>=6.0; extra == "dev"
41
41
  Requires-Dist: cryptography>=42.0; extra == "dev"
42
42
  Provides-Extra: esdb
43
- Requires-Dist: chronomemory>=0.1.6; extra == "esdb"
43
+ Requires-Dist: chronomemory>=0.1.7; extra == "esdb"
44
44
  Requires-Dist: cryptography>=42.0; extra == "esdb"
45
45
  Provides-Extra: docs
46
46
  Requires-Dist: mkdocs>=1.6; extra == "docs"
@@ -239,7 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
239
239
  # Step 1 — install the chronomemory package
240
240
  pip install "specsmith[esdb]" # installs chronomemory from PyPI
241
241
  # or if using pipx:
242
- pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
242
+ pipx inject specsmith "chronomemory>=0.1.7" # inject into the specsmith pipx venv
243
243
 
244
244
  # Step 2 — activate your license key
245
245
  specsmith esdb enable --key-file /path/to/your.esdb.key
@@ -161,7 +161,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
161
161
  # Step 1 — install the chronomemory package
162
162
  pip install "specsmith[esdb]" # installs chronomemory from PyPI
163
163
  # or if using pipx:
164
- pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
164
+ pipx inject specsmith "chronomemory>=0.1.7" # inject into the specsmith pipx venv
165
165
 
166
166
  # Step 2 — activate your license key
167
167
  specsmith esdb enable --key-file /path/to/your.esdb.key
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.14.0.dev540"
7
+ version = "0.14.0.dev543"
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"
@@ -60,7 +60,7 @@ dev = [
60
60
  # Install: pip install specsmith[esdb]
61
61
  # Activate: specsmith esdb enable --key-file /path/to/your.esdb.key
62
62
  esdb = [
63
- "chronomemory>=0.1.6", # proprietary commercial — see chronomemory LICENSE
63
+ "chronomemory>=0.1.7", # proprietary commercial — see chronomemory LICENSE
64
64
  "cryptography>=42.0",
65
65
  ]
66
66
  docs = [
@@ -72,30 +72,29 @@ def run_preflight(
72
72
  from specsmith.agent.broker import Intent, classify_intent, infer_scope
73
73
 
74
74
  _safe_resolve(project_dir) # validate: reject null bytes and traversal sequences
75
- # Assign os.path.realpath to a plain str first so CodeQL's py/path-injection
76
- # taint tracker sees the sanitiser directly on the assignment (not nested
77
- # inside Path()). Path() wrapping is done in a separate step.
75
+ # os.path.realpath breaks the taint chain and returns a clean plain str.
76
+ # ALL subsequent path construction uses os.path.join on _root_str never
77
+ # the Path / operator on root so CodeQL never re-acquires the taint from
78
+ # project_dir through a Path object.
78
79
  _root_str: str = os.path.realpath(str(project_dir))
79
- root = Path(_root_str)
80
80
  intent = classify_intent(utterance)
81
81
  # Requirements live at docs/REQUIREMENTS.md, not at the project root.
82
82
  # Falling back to root/REQUIREMENTS.md would always yield an empty list
83
83
  # on standard projects, causing preflight to always return
84
84
  # needs_clarification (GitHub issue #197).
85
- # Apply os.path.realpath on the child path so CodeQL sees the sanitiser
86
- # at the point of the file-system call (.exists()), not just at root.
87
- _req_md = Path(os.path.realpath(str(root / "docs" / "REQUIREMENTS.md")))
85
+ _req_md = Path(os.path.realpath(os.path.join(_root_str, "docs", "REQUIREMENTS.md")))
88
86
  if not _req_md.exists():
89
- _req_md = Path(os.path.realpath(str(root / "REQUIREMENTS.md"))) # legacy fallback
87
+ _req_md = Path(os.path.realpath(os.path.join(_root_str, "REQUIREMENTS.md"))) # legacy
88
+ _repo_idx = Path(os.path.realpath(os.path.join(_root_str, ".repo-index", "files.json")))
90
89
  scope = infer_scope(
91
90
  utterance,
92
91
  _req_md,
93
- repo_index_path=root / ".repo-index" / "files.json",
92
+ repo_index_path=_repo_idx,
94
93
  )
95
94
 
96
95
  requirement_ids = [r.req_id for r in scope.matched_requirements]
97
96
 
98
- # ── Direct ID extraction (fix #166) ──────────────────────────────────────
97
+ # ── Direct ID extraction (fix #166) ───────────────────────────────────────────
99
98
  # If the utterance contains explicit REQ-*/TEST-* IDs, look them up in the
100
99
  # JSON machine state and merge them in — this handles project-prefixed IDs
101
100
  # (e.g. REQ-NN-001, TEST-NN-002a) that token overlap may not catch.
@@ -104,12 +103,10 @@ def run_preflight(
104
103
  explicit_req_ids = [m.upper() for m in _EXPLICIT_REQ.findall(utterance)]
105
104
  explicit_test_ids = [m.upper() for m in _EXPLICIT_TEST.findall(utterance)]
106
105
 
107
- # Read requirements machine-state inline so CodeQL can trace the full
108
- # sanitisation chain from _safe_resolve root literal child path.
109
- # (Helper functions with a root: Path parameter are analysed conservatively
110
- # by CodeQL and can re-introduce py/path-injection alerts.)
106
+ # Read requirements machine-state using os.path.join on the clean _root_str
107
+ # so CodeQL traces the full sanitisation chain without re-tainting via Path.
111
108
  rq_records: list[Any] = []
112
- rq_path = Path(os.path.realpath(str(root / ".specsmith" / "requirements.json")))
109
+ rq_path = Path(os.path.realpath(os.path.join(_root_str, ".specsmith", "requirements.json")))
113
110
  if rq_path.is_file():
114
111
  try:
115
112
  _rq = _json.loads(rq_path.read_text(encoding="utf-8"))
@@ -123,10 +120,10 @@ def run_preflight(
123
120
  if eid in known_req_ids and eid not in requirement_ids:
124
121
  requirement_ids.append(eid)
125
122
 
126
- # Read test-case machine-state inline (same rationale as above).
123
+ # Read test-case machine-state (same rationale as above).
127
124
  test_case_ids: list[str] = []
128
125
  tc_records: list[Any] = []
129
- tc_path = Path(os.path.realpath(str(root / ".specsmith" / "testcases.json")))
126
+ tc_path = Path(os.path.realpath(os.path.join(_root_str, ".specsmith", "testcases.json")))
130
127
  if tc_path.is_file():
131
128
  try:
132
129
  _tc = _json.loads(tc_path.read_text(encoding="utf-8"))
@@ -193,8 +190,9 @@ def run_preflight(
193
190
  )
194
191
  confidence_target = 0.7
195
192
 
196
- # Config floor (REQ-098)
197
- cfg_threshold = _read_confidence_threshold(root)
193
+ # Config floor (REQ-098) — pass _root_str so the helper never receives
194
+ # a tainted Path object derived from project_dir.
195
+ cfg_threshold = _read_confidence_threshold(_root_str)
198
196
  if cfg_threshold is not None and cfg_threshold > confidence_target:
199
197
  confidence_target = cfg_threshold
200
198
 
@@ -1021,9 +1019,10 @@ def _resolve_provider_name() -> str:
1021
1019
  return "byoe"
1022
1020
 
1023
1021
 
1024
- def _read_confidence_threshold(root: Path) -> float | None:
1025
- # .resolve() clears CodeQL py/path-injection taint; path has a constant suffix.
1026
- cfg = (root / ".specsmith" / "config.yml").resolve()
1022
+ def _read_confidence_threshold(root: Path | str) -> float | None:
1023
+ # Use os.path.join + os.path.realpath on the plain-string form so CodeQL
1024
+ # sees the sanitiser inline and does not flag cfg.is_file() or cfg.read_text().
1025
+ cfg = Path(os.path.realpath(os.path.join(str(root), ".specsmith", "config.yml")))
1027
1026
  if not cfg.is_file():
1028
1027
  return None
1029
1028
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.14.0.dev540
3
+ Version: 0.14.0.dev543
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
@@ -40,7 +40,7 @@ Requires-Dist: pre-commit>=3.0; extra == "dev"
40
40
  Requires-Dist: types-pyyaml>=6.0; extra == "dev"
41
41
  Requires-Dist: cryptography>=42.0; extra == "dev"
42
42
  Provides-Extra: esdb
43
- Requires-Dist: chronomemory>=0.1.6; extra == "esdb"
43
+ Requires-Dist: chronomemory>=0.1.7; extra == "esdb"
44
44
  Requires-Dist: cryptography>=42.0; extra == "esdb"
45
45
  Provides-Extra: docs
46
46
  Requires-Dist: mkdocs>=1.6; extra == "docs"
@@ -239,7 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
239
239
  # Step 1 — install the chronomemory package
240
240
  pip install "specsmith[esdb]" # installs chronomemory from PyPI
241
241
  # or if using pipx:
242
- pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
242
+ pipx inject specsmith "chronomemory>=0.1.7" # inject into the specsmith pipx venv
243
243
 
244
244
  # Step 2 — activate your license key
245
245
  specsmith esdb enable --key-file /path/to/your.esdb.key
@@ -36,7 +36,7 @@ mkdocs>=1.6
36
36
  mkdocs-material>=9.5
37
37
 
38
38
  [esdb]
39
- chronomemory>=0.1.6
39
+ chronomemory>=0.1.7
40
40
  cryptography>=42.0
41
41
 
42
42
  [gemini]