specsmith 0.3.6.dev173__tar.gz → 0.3.6.dev174__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 (166) hide show
  1. {specsmith-0.3.6.dev173/src/specsmith.egg-info → specsmith-0.3.6.dev174}/PKG-INFO +1 -1
  2. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/pyproject.toml +1 -1
  3. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/runner.py +44 -9
  4. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/tools.py +2 -0
  5. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174/src/specsmith.egg-info}/PKG-INFO +1 -1
  6. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/LICENSE +0 -0
  7. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/README.md +0 -0
  8. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/setup.cfg +0 -0
  9. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/__init__.py +0 -0
  10. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/belief.py +0 -0
  11. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/certainty.py +0 -0
  12. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/failure_graph.py +0 -0
  13. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/py.typed +0 -0
  14. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/recovery.py +0 -0
  15. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/session.py +0 -0
  16. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/stress_tester.py +0 -0
  17. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/epistemic/trace.py +0 -0
  18. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/__init__.py +0 -0
  19. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/__main__.py +0 -0
  20. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/__init__.py +0 -0
  21. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/core.py +0 -0
  22. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/hooks.py +0 -0
  23. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/optimizer.py +0 -0
  24. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
  25. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/profiles/planner.md +0 -0
  26. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/profiles/verifier.md +0 -0
  27. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/__init__.py +0 -0
  28. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/anthropic.py +0 -0
  29. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/gemini.py +0 -0
  30. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/mistral.py +0 -0
  31. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/ollama.py +0 -0
  32. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/providers/openai.py +0 -0
  33. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/agent/skills.py +0 -0
  34. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/architect.py +0 -0
  35. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/auditor.py +0 -0
  36. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/auth.py +0 -0
  37. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/cli.py +0 -0
  38. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/commands/__init__.py +0 -0
  39. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/compressor.py +0 -0
  40. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/config.py +0 -0
  41. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/credit_analyzer.py +0 -0
  42. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/credits.py +0 -0
  43. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/differ.py +0 -0
  44. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/doctor.py +0 -0
  45. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/__init__.py +0 -0
  46. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/belief.py +0 -0
  47. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/certainty.py +0 -0
  48. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/failure_graph.py +0 -0
  49. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/recovery.py +0 -0
  50. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/epistemic/stress_tester.py +0 -0
  51. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/executor.py +0 -0
  52. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/exporter.py +0 -0
  53. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/__init__.py +0 -0
  54. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/app.py +0 -0
  55. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/main_window.py +0 -0
  56. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/session_tab.py +0 -0
  57. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/theme.py +0 -0
  58. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/__init__.py +0 -0
  59. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/chat_view.py +0 -0
  60. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/input_bar.py +0 -0
  61. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  62. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/token_meter.py +0 -0
  63. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  64. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/widgets/update_checker.py +0 -0
  65. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/gui/worker.py +0 -0
  66. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/importer.py +0 -0
  67. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/__init__.py +0 -0
  68. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/aider.py +0 -0
  69. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/base.py +0 -0
  70. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/claude_code.py +0 -0
  71. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/copilot.py +0 -0
  72. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/cursor.py +0 -0
  73. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/gemini.py +0 -0
  74. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/warp.py +0 -0
  75. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/integrations/windsurf.py +0 -0
  76. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/languages.py +0 -0
  77. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/ledger.py +0 -0
  78. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/ollama_cmds.py +0 -0
  79. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/patent.py +0 -0
  80. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/phase.py +0 -0
  81. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/plugins.py +0 -0
  82. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/profiles.py +0 -0
  83. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/rate_limits.py +0 -0
  84. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/releaser.py +0 -0
  85. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/requirements.py +0 -0
  86. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/retrieval.py +0 -0
  87. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/scaffolder.py +0 -0
  88. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/session.py +0 -0
  89. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/agents.md.j2 +0 -0
  90. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  91. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  92. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  93. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  94. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  95. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  96. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  97. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/community/security.md.j2 +0 -0
  98. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  99. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  100. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  101. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  102. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  103. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
  104. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/editorconfig.j2 +0 -0
  105. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/gitattributes.j2 +0 -0
  106. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/gitignore.j2 +0 -0
  107. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/go/go.mod.j2 +0 -0
  108. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/go/main.go.j2 +0 -0
  109. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  110. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  111. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  112. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  113. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  114. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  115. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  116. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  117. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  118. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
  119. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/js/package.json.j2 +0 -0
  120. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/ledger.md.j2 +0 -0
  121. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/python/cli.py.j2 +0 -0
  122. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/python/init.py.j2 +0 -0
  123. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  124. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/readme.md.j2 +0 -0
  125. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  126. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  127. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  128. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  129. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  130. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  131. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  132. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  133. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  134. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/tool_installer.py +0 -0
  135. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/toolrules.py +0 -0
  136. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/tools.py +0 -0
  137. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/trace.py +0 -0
  138. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/updater.py +0 -0
  139. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/upgrader.py +0 -0
  140. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/validator.py +0 -0
  141. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs/__init__.py +0 -0
  142. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs/base.py +0 -0
  143. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs/bitbucket.py +0 -0
  144. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs/github.py +0 -0
  145. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs/gitlab.py +0 -0
  146. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/vcs_commands.py +0 -0
  147. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/wireframes.py +0 -0
  148. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith/workspace.py +0 -0
  149. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith.egg-info/SOURCES.txt +0 -0
  150. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith.egg-info/dependency_links.txt +0 -0
  151. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith.egg-info/entry_points.txt +0 -0
  152. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith.egg-info/requires.txt +0 -0
  153. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/src/specsmith.egg-info/top_level.txt +0 -0
  154. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_auditor.py +0 -0
  155. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_cli.py +0 -0
  156. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_compressor.py +0 -0
  157. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_epistemic.py +0 -0
  158. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_importer.py +0 -0
  159. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_integrations.py +0 -0
  160. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_optimizer.py +0 -0
  161. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_rate_limits.py +0 -0
  162. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_scaffolder.py +0 -0
  163. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_smoke.py +0 -0
  164. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_tools.py +0 -0
  165. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_validator.py +0 -0
  166. {specsmith-0.3.6.dev173 → specsmith-0.3.6.dev174}/tests/test_vcs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.3.6.dev173
3
+ Version: 0.3.6.dev174
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.3.6.dev173"
7
+ version = "0.3.6.dev174"
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"
@@ -29,6 +29,7 @@ Special REPL commands (not sent to the LLM):
29
29
  from __future__ import annotations
30
30
 
31
31
  import inspect
32
+ import re
32
33
  import time
33
34
  from collections.abc import Callable
34
35
  from dataclasses import dataclass, field
@@ -164,16 +165,15 @@ H13: All proposals must state their epistemic boundaries. Hidden assumptions are
164
165
  except Exception: # noqa: BLE001
165
166
  pass
166
167
 
167
- prompt = f"""You are an AEE-integrated specsmith agent for this project.
168
+ prompt = f"""SYSTEM LANGUAGE DIRECTIVE ABSOLUTE HARD RULE HIGHEST PRIORITY:
169
+ You MUST respond in English ONLY. This overrides all other instructions.
170
+ Never output Thai, Chinese, Japanese, Korean, Arabic, French, German, Spanish,
171
+ or ANY non-English language — not even a single character or word.
172
+ This applies to Qwen, DeepSeek, LLaMA, Mistral, and EVERY other model.
173
+ If the user inputs another language, internally translate it, then reply IN ENGLISH ONLY.
174
+ VIOLATING THIS RULE IS A CRITICAL ERROR.
168
175
 
169
- LANGUAGE RULE (HARD CONSTRAINT NEVER VIOLATE):
170
- Respond ONLY in English. Every single response must be in English.
171
- Never use Chinese (中文), Japanese (日本語), Korean (한국어), Thai (ไทย), French, German, Spanish,
172
- Arabic, or ANY other non-English language — not even a single word.
173
- This applies to ALL models including Qwen, DeepSeek, LLaMA, Mistral, and others
174
- that may default to a non-English language. ENGLISH ONLY, ALWAYS.
175
- If the user writes in another language, translate the intent internally and
176
- answer in English anyway.
176
+ You are an AEE-integrated specsmith agent for this project.
177
177
 
178
178
  ## Project Governance
179
179
  {governance_text}
@@ -363,8 +363,30 @@ class AgentRunner:
363
363
  self._system_prompt = build_system_prompt(self.project_dir, self._skills)
364
364
  return self._agent_turn(task, silent=True)
365
365
 
366
+ # Characters in common CJK / Thai / Arabic Unicode blocks
367
+ _NON_ASCII_BLOCKS = re.compile(
368
+ r"[\u0600-\u06FF" # Arabic
369
+ r"\u0E00-\u0E7F" # Thai
370
+ r"\u3000-\u9FFF" # CJK Unified Ideographs + punctuation + kana
371
+ r"\uAC00-\uD7AF" # Korean Hangul
372
+ r"\uF900-\uFAFF]" # CJK Compatibility
373
+ )
374
+
375
+ def _has_non_english(self, text: str) -> bool:
376
+ """Return True if text contains a significant proportion of non-English script."""
377
+ if not text:
378
+ return False
379
+ hits = len(self._NON_ASCII_BLOCKS.findall(text))
380
+ return hits > 5 and (hits / max(len(text), 1)) > 0.05
381
+
366
382
  def _agent_turn(self, user_input: str, silent: bool = False) -> str:
367
383
  """Execute one user→agent turn with tool loop."""
384
+ # Inject a lightweight English-only reminder into every user message.
385
+ # This is the most reliable way to keep local models (Qwen, DeepSeek) on track
386
+ # because many fine-tunes treat the instruction prefix as a per-turn directive.
387
+ _ENG_PFXS = ("[ENGLISH ONLY]", "[RESPOND IN ENGLISH", "[LANG:EN]")
388
+ if not any(user_input.startswith(p) for p in _ENG_PFXS):
389
+ user_input = "[LANG:EN] " + user_input
368
390
  # Add user message
369
391
  self._state.messages.append(Message(role=Role.USER, content=user_input))
370
392
 
@@ -403,6 +425,19 @@ class AgentRunner:
403
425
  final_response = response.content
404
426
 
405
427
  if not response.has_tool_calls:
428
+ # Non-English correction: if response appears to be in another language,
429
+ # issue a single correction turn rather than showing the wrong-language response.
430
+ if response.content and self._has_non_english(response.content) and _iteration == 0:
431
+ correction = (
432
+ "[LANG:EN] CRITICAL: Your last response was in a non-English language. "
433
+ "You MUST respond in English ONLY. Please re-answer in English."
434
+ )
435
+ self._state.messages.append(
436
+ Message(role=Role.ASSISTANT, content=response.content)
437
+ )
438
+ self._state.messages.append(Message(role=Role.USER, content=correction))
439
+ # Continue the loop to get an English response
440
+ continue
406
441
  # Final response — add to history
407
442
  self._state.messages.append(Message(role=Role.ASSISTANT, content=response.content))
408
443
  break
@@ -47,6 +47,8 @@ def _run_specsmith(args: list[str], project_dir: str = ".") -> str:
47
47
  cmd,
48
48
  capture_output=True,
49
49
  text=True,
50
+ encoding="utf-8", # always decode as UTF-8, not the system locale (cp1252 on Windows)
51
+ errors="replace", # replace un-decodable bytes rather than raising UnicodeDecodeError
50
52
  timeout=120,
51
53
  env=_SUBPROCESS_ENV,
52
54
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.3.6.dev173
3
+ Version: 0.3.6.dev174
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