specsmith 0.3.6.dev176__tar.gz → 0.3.6.dev178__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.
- {specsmith-0.3.6.dev176/src/specsmith.egg-info → specsmith-0.3.6.dev178}/PKG-INFO +1 -1
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/pyproject.toml +1 -1
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/runner.py +72 -9
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/LICENSE +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/README.md +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/setup.cfg +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/belief.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/certainty.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/py.typed +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/recovery.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/session.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/epistemic/trace.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/__main__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/hooks.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/optimizer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/profiles/planner.md +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/profiles/verifier.md +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/anthropic.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/gemini.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/mistral.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/ollama.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/openai.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/skills.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/architect.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/auditor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/auth.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/cli.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/compressor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/config.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/credits.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/differ.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/doctor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/executor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/exporter.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/importer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/languages.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/ledger.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/patent.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/phase.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/plugins.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/profiles.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/releaser.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/requirements.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/session.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/tools.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/trace.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/updater.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/validator.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/workspace.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_auditor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_cli.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_compressor.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_epistemic.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_importer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_integrations.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_optimizer.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_rate_limits.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_scaffolder.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_smoke.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_tools.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/tests/test_validator.py +0 -0
- {specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/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.
|
|
3
|
+
Version: 0.3.6.dev178
|
|
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.
|
|
7
|
+
version = "0.3.6.dev178"
|
|
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"
|
|
@@ -153,6 +153,36 @@ H13: All proposals must state their epistemic boundaries. Hidden assumptions are
|
|
|
153
153
|
agents_md or f"Spec version: {spec_version}. AGENTS.md not found — run specsmith audit."
|
|
154
154
|
)
|
|
155
155
|
|
|
156
|
+
# Snapshot of VCS state at session start so the agent knows what’s pending
|
|
157
|
+
vcs_section = ""
|
|
158
|
+
try:
|
|
159
|
+
import subprocess as _sp
|
|
160
|
+
|
|
161
|
+
_st = _sp.run(
|
|
162
|
+
["git", "status", "--short"],
|
|
163
|
+
cwd=project_dir,
|
|
164
|
+
capture_output=True,
|
|
165
|
+
text=True,
|
|
166
|
+
timeout=5,
|
|
167
|
+
)
|
|
168
|
+
_log = _sp.run(
|
|
169
|
+
["git", "log", "--oneline", "-5"],
|
|
170
|
+
cwd=project_dir,
|
|
171
|
+
capture_output=True,
|
|
172
|
+
text=True,
|
|
173
|
+
timeout=5,
|
|
174
|
+
)
|
|
175
|
+
if _st.returncode == 0:
|
|
176
|
+
status_text = _st.stdout.strip() or "(clean — no uncommitted changes)"
|
|
177
|
+
log_text = _log.stdout.strip() if _log.returncode == 0 else "(no commits yet)"
|
|
178
|
+
vcs_section = (
|
|
179
|
+
"\n## VCS State at Session Start\n"
|
|
180
|
+
f"```\n{status_text}\n```\n"
|
|
181
|
+
f"Recent commits:\n```\n{log_text}\n```\n"
|
|
182
|
+
)
|
|
183
|
+
except Exception: # noqa: BLE001
|
|
184
|
+
pass
|
|
185
|
+
|
|
156
186
|
# Load tool-specific rules for this project type
|
|
157
187
|
tool_rules_section = ""
|
|
158
188
|
if project_type:
|
|
@@ -166,6 +196,7 @@ H13: All proposals must state their epistemic boundaries. Hidden assumptions are
|
|
|
166
196
|
pass
|
|
167
197
|
|
|
168
198
|
prompt = f"""SYSTEM LANGUAGE DIRECTIVE — ABSOLUTE HARD RULE — HIGHEST PRIORITY:
|
|
199
|
+
{vcs_section}
|
|
169
200
|
You MUST respond in English ONLY. This overrides all other instructions.
|
|
170
201
|
Never output Thai, Chinese, Japanese, Korean, Arabic, French, German, Spanish,
|
|
171
202
|
or ANY non-English language — not even a single character or word.
|
|
@@ -257,8 +288,12 @@ class AgentRunner:
|
|
|
257
288
|
QUICK_COMMANDS = {
|
|
258
289
|
"start": (
|
|
259
290
|
"[RESPOND IN ENGLISH ONLY] "
|
|
260
|
-
"Run session start protocol
|
|
261
|
-
"
|
|
291
|
+
"Run the session start protocol in this order:\n"
|
|
292
|
+
"1. Run: git status (report staged, modified, and untracked files)\n"
|
|
293
|
+
"2. Run: git log --oneline -5 (report the 5 most recent commits)\n"
|
|
294
|
+
"3. Read AGENTS.md (confirm your role and governance rules)\n"
|
|
295
|
+
"4. Read the last 10 lines of LEDGER.md (confirm current project state)\n"
|
|
296
|
+
"Summarize findings in 3-4 plain sentences, then propose the most logical next action."
|
|
262
297
|
),
|
|
263
298
|
"resume": (
|
|
264
299
|
"[RESPOND IN ENGLISH ONLY] Resume from last LEDGER.md entry"
|
|
@@ -480,6 +515,11 @@ class AgentRunner:
|
|
|
480
515
|
# Add user message
|
|
481
516
|
self._state.messages.append(Message(role=Role.USER, content=user_input))
|
|
482
517
|
|
|
518
|
+
# In json_events mode we defer the llm_chunk emission so we can run the
|
|
519
|
+
# language check BEFORE the UI sees the text. Without this, a Thai/Chinese
|
|
520
|
+
# response would be displayed even when the correction turn later succeeds.
|
|
521
|
+
_defer_emit = not silent and self._json_events
|
|
522
|
+
|
|
483
523
|
final_response = ""
|
|
484
524
|
for _iteration in range(self._max_iterations):
|
|
485
525
|
messages_with_system = [
|
|
@@ -487,7 +527,9 @@ class AgentRunner:
|
|
|
487
527
|
] + self._state.messages
|
|
488
528
|
|
|
489
529
|
try:
|
|
490
|
-
response = self._call_provider(
|
|
530
|
+
response = self._call_provider(
|
|
531
|
+
messages_with_system, silent=silent, defer_emit=_defer_emit
|
|
532
|
+
)
|
|
491
533
|
except Exception as e: # noqa: BLE001
|
|
492
534
|
error_msg = f"[Provider error] {e}"
|
|
493
535
|
if not silent:
|
|
@@ -515,9 +557,12 @@ class AgentRunner:
|
|
|
515
557
|
final_response = response.content
|
|
516
558
|
|
|
517
559
|
if not response.has_tool_calls:
|
|
518
|
-
# Non-English correction: if
|
|
519
|
-
# issue a
|
|
520
|
-
|
|
560
|
+
# Non-English correction: if the final response is in a non-English
|
|
561
|
+
# language, silently issue a correction turn instead of surfacing the
|
|
562
|
+
# bad text. _defer_emit ensures the UI never sees the Thai/Chinese
|
|
563
|
+
# content — we only emit llm_chunk once we have an English reply.
|
|
564
|
+
# The iteration limit acts as a natural loop-break (max_iterations).
|
|
565
|
+
if response.content and self._has_non_english(response.content):
|
|
521
566
|
correction = (
|
|
522
567
|
"[LANG:EN] CRITICAL: Your last response was in a non-English language. "
|
|
523
568
|
"You MUST respond in English ONLY. Please re-answer in English."
|
|
@@ -526,12 +571,22 @@ class AgentRunner:
|
|
|
526
571
|
Message(role=Role.ASSISTANT, content=response.content)
|
|
527
572
|
)
|
|
528
573
|
self._state.messages.append(Message(role=Role.USER, content=correction))
|
|
529
|
-
# Continue the loop to get an English response
|
|
574
|
+
# Continue the loop to get an English response (don't emit bad content)
|
|
530
575
|
continue
|
|
576
|
+
# Language OK — emit the deferred llm_chunk now
|
|
577
|
+
if _defer_emit and response.content:
|
|
578
|
+
self._emit_event(type="llm_chunk", text=response.content)
|
|
531
579
|
# Final response — add to history
|
|
532
580
|
self._state.messages.append(Message(role=Role.ASSISTANT, content=response.content))
|
|
533
581
|
break
|
|
534
582
|
|
|
583
|
+
# Has tool calls — emit any deferred partial text (planning/thinking text
|
|
584
|
+
# that precedes the tool invocation), but only if it is in English.
|
|
585
|
+
# Some Qwen/DeepSeek variants emit Thai/Chinese thinking text before tool
|
|
586
|
+
# calls; silently drop that rather than surfacing it to the UI.
|
|
587
|
+
if _defer_emit and response.content and not self._has_non_english(response.content):
|
|
588
|
+
self._emit_event(type="llm_chunk", text=response.content)
|
|
589
|
+
|
|
535
590
|
# Process tool calls
|
|
536
591
|
self._hard_stop = False # reset before each batch
|
|
537
592
|
tool_results = self._execute_tool_calls(response.tool_calls, silent=silent)
|
|
@@ -571,12 +626,20 @@ class AgentRunner:
|
|
|
571
626
|
|
|
572
627
|
return final_response
|
|
573
628
|
|
|
574
|
-
def _call_provider(
|
|
629
|
+
def _call_provider(
|
|
630
|
+
self,
|
|
631
|
+
messages: list[Message],
|
|
632
|
+
silent: bool = False,
|
|
633
|
+
defer_emit: bool = False,
|
|
634
|
+
) -> CompletionResponse:
|
|
575
635
|
"""Call the LLM provider with optimization engine pre/post hooks.
|
|
576
636
|
|
|
577
637
|
Streaming is disabled when tools are registered (streaming drops tool_call blocks).
|
|
578
638
|
When an OptimizationEngine is active, pre_call() may return a cache hit
|
|
579
639
|
or transform messages/model/tools before the actual provider call.
|
|
640
|
+
|
|
641
|
+
``defer_emit=True`` suppresses the ``llm_chunk`` event so the caller can
|
|
642
|
+
validate the response (e.g. language check) before surfacing it to the UI.
|
|
580
643
|
"""
|
|
581
644
|
provider: Any = self._provider
|
|
582
645
|
tools = self._tools
|
|
@@ -613,7 +676,7 @@ class AgentRunner:
|
|
|
613
676
|
response = CompletionResponse(content=accumulated, model=str(provider.model))
|
|
614
677
|
else:
|
|
615
678
|
response = cast(CompletionResponse, provider.complete(messages, tools=tools))
|
|
616
|
-
if not silent and response.content:
|
|
679
|
+
if not silent and not defer_emit and response.content:
|
|
617
680
|
if self._json_events:
|
|
618
681
|
self._emit_event(type="llm_chunk", text=response.content)
|
|
619
682
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.3.6.
|
|
3
|
+
Version: 0.3.6.dev178
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/profiles/epistemic-auditor.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/agent/providers/anthropic.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/gui/widgets/update_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/bug_report.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/license-MIT.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/community/security.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/architecture.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/mkdocs.yml.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/readthedocs.yaml.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/requirements.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/test-spec.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/docs/workflow.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/roles.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/rules.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/governance/workflow.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/js/package.json.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/python/pyproject.toml.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/rust/Cargo.toml.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/exec.cmd.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/exec.sh.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/run.cmd.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/setup.cmd.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/scripts/setup.sh.j2
RENAMED
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith/templates/workflows/release.yml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.6.dev176 → specsmith-0.3.6.dev178}/src/specsmith.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|