specsmith 0.3.0a1.dev8__tar.gz → 0.3.0.dev16__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.0a1.dev8/src/specsmith.egg-info → specsmith-0.3.0.dev16}/PKG-INFO +2 -3
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/README.md +1 -2
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/pyproject.toml +1 -1
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/__init__.py +1 -1
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/auditor.py +53 -11
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/config.py +1 -1
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/doctor.py +22 -4
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/importer.py +26 -4
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/validator.py +27 -4
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16/src/specsmith.egg-info}/PKG-INFO +2 -3
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/LICENSE +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/setup.cfg +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/belief.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/certainty.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/py.typed +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/recovery.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/session.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/trace.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/__main__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/hooks.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/planner.md +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/verifier.md +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/anthropic.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/gemini.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/ollama.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/openai.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/skills.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/architect.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/auth.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/cli.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/compressor.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/credits.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/differ.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/executor.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/exporter.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/ledger.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/patent.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/plugins.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/releaser.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/requirements.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/session.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/tools.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/trace.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/updater.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/workspace.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_auditor.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_cli.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_compressor.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_epistemic.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_importer.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_integrations.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_rate_limits.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_scaffolder.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_smoke.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_tools.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_validator.py +0 -0
- {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_vcs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.0.dev16
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License: MIT
|
|
@@ -64,8 +64,7 @@ Dynamic: license-file
|
|
|
64
64
|
|
|
65
65
|
[](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
|
|
66
66
|
[](https://specsmith.readthedocs.io/en/stable/)
|
|
67
|
-
[](https://pypi.org/project/specsmith/#history)
|
|
67
|
+
[](https://pypi.org/project/specsmith/)
|
|
69
68
|
[](https://www.python.org/downloads/)
|
|
70
69
|
[](LICENSE)
|
|
71
70
|
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
|
|
4
4
|
[](https://specsmith.readthedocs.io/en/stable/)
|
|
5
|
-
[](https://pypi.org/project/specsmith/#history)
|
|
5
|
+
[](https://pypi.org/project/specsmith/)
|
|
7
6
|
[](https://www.python.org/downloads/)
|
|
8
7
|
[](LICENSE)
|
|
9
8
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.0.dev16"
|
|
8
8
|
description = "Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -143,7 +143,7 @@ from epistemic.recovery import RecoveryOperator, RecoveryProposal, RecoveryStrat
|
|
|
143
143
|
from epistemic.session import AEEResult, AEESession
|
|
144
144
|
from epistemic.stress_tester import StressTester, StressTestResult
|
|
145
145
|
|
|
146
|
-
__version__ = "0.3.
|
|
146
|
+
__version__ = "0.3.0"
|
|
147
147
|
|
|
148
148
|
__all__ = [
|
|
149
149
|
# Session facade (primary entry point)
|
|
@@ -182,7 +182,17 @@ def check_req_test_consistency(root: Path) -> list[AuditResult]:
|
|
|
182
182
|
req_text = req_path.read_text(encoding="utf-8")
|
|
183
183
|
test_text = test_path.read_text(encoding="utf-8")
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
# Only check coverage for non-Draft requirements.
|
|
186
|
+
# Draft requirements are stubs (e.g. auto-generated by import) and don't
|
|
187
|
+
# need tests yet — checking them would produce noise on freshly imported projects.
|
|
188
|
+
all_req_ids = set(_REQ_PATTERN.findall(req_text))
|
|
189
|
+
draft_req_ids: set[str] = set()
|
|
190
|
+
for block in re.split(r"(?=^## REQ-)", req_text, flags=re.MULTILINE):
|
|
191
|
+
ids_in_block = set(_REQ_PATTERN.findall(block))
|
|
192
|
+
if ids_in_block and re.search(r"\*\*Status\*\*:\s*[Dd]raft", block):
|
|
193
|
+
draft_req_ids |= ids_in_block
|
|
194
|
+
# Requirements that need coverage = all REQs minus those explicitly marked Draft
|
|
195
|
+
req_ids = all_req_ids - draft_req_ids
|
|
186
196
|
|
|
187
197
|
# Find which REQs are covered by tests
|
|
188
198
|
covered_reqs: set[str] = set()
|
|
@@ -201,12 +211,23 @@ def check_req_test_consistency(root: Path) -> list[AuditResult]:
|
|
|
201
211
|
),
|
|
202
212
|
)
|
|
203
213
|
)
|
|
214
|
+
elif draft_req_ids and not req_ids:
|
|
215
|
+
# All requirements are Draft — coverage is not yet required
|
|
216
|
+
results.append(
|
|
217
|
+
AuditResult(
|
|
218
|
+
name="req-test-coverage",
|
|
219
|
+
passed=True,
|
|
220
|
+
message=(
|
|
221
|
+
f"{len(all_req_ids)} REQ(s) are Draft (coverage not required until accepted)"
|
|
222
|
+
),
|
|
223
|
+
)
|
|
224
|
+
)
|
|
204
225
|
else:
|
|
205
226
|
results.append(
|
|
206
227
|
AuditResult(
|
|
207
228
|
name="req-test-coverage",
|
|
208
229
|
passed=True,
|
|
209
|
-
message=f"All {len(req_ids)} REQ(s) have test coverage",
|
|
230
|
+
message=f"All {len(req_ids)} accepted REQ(s) have test coverage",
|
|
210
231
|
)
|
|
211
232
|
)
|
|
212
233
|
|
|
@@ -430,23 +451,44 @@ def check_tool_configuration(root: Path) -> list[AuditResult]:
|
|
|
430
451
|
)
|
|
431
452
|
return results
|
|
432
453
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
if tool_name not in ci_content:
|
|
438
|
-
missing.append(f"lint:{tool_name}")
|
|
454
|
+
lint_missing: list[str] = []
|
|
455
|
+
test_missing: list[str] = []
|
|
456
|
+
|
|
457
|
+
# Check primary test tool (critical — hard fail if absent)
|
|
439
458
|
for cmd in tools.test[:1]:
|
|
440
459
|
tool_name = cmd.split()[0]
|
|
441
460
|
if tool_name not in ci_content:
|
|
442
|
-
|
|
461
|
+
test_missing.append(f"test:{tool_name}")
|
|
462
|
+
|
|
463
|
+
# Check primary lint tool (advisory — projects may use a different linter
|
|
464
|
+
# or none at all, especially when imported with existing CI)
|
|
465
|
+
for cmd in tools.lint[:1]:
|
|
466
|
+
tool_name = cmd.split()[0]
|
|
467
|
+
if tool_name not in ci_content:
|
|
468
|
+
lint_missing.append(f"lint:{tool_name}")
|
|
443
469
|
|
|
444
|
-
|
|
470
|
+
all_missing = test_missing + lint_missing
|
|
471
|
+
|
|
472
|
+
if test_missing:
|
|
473
|
+
# Test tool missing — hard failure (tests are non-negotiable)
|
|
445
474
|
results.append(
|
|
446
475
|
AuditResult(
|
|
447
476
|
name="tool-ci-config",
|
|
448
477
|
passed=False,
|
|
449
|
-
message=f"CI config missing expected tools: {', '.join(
|
|
478
|
+
message=f"CI config missing expected tools: {', '.join(all_missing)}",
|
|
479
|
+
)
|
|
480
|
+
)
|
|
481
|
+
elif lint_missing:
|
|
482
|
+
# Only lint missing — fixable warning (test tool is present; lint is advisory)
|
|
483
|
+
results.append(
|
|
484
|
+
AuditResult(
|
|
485
|
+
name="tool-ci-config",
|
|
486
|
+
passed=True, # Pass — test tool is there; lint is a recommendation
|
|
487
|
+
message=(
|
|
488
|
+
f"CI config missing lint tool ({', '.join(lint_missing)}); "
|
|
489
|
+
f"test tool is present. Consider adding {lint_missing[0].split(':')[1]}."
|
|
490
|
+
),
|
|
491
|
+
fixable=True,
|
|
450
492
|
)
|
|
451
493
|
)
|
|
452
494
|
else:
|
|
@@ -85,7 +85,7 @@ class ProjectConfig(BaseModel):
|
|
|
85
85
|
description="Target platforms",
|
|
86
86
|
)
|
|
87
87
|
language: str = Field(default="python", description="Primary language/runtime")
|
|
88
|
-
spec_version: str = Field(default="0.
|
|
88
|
+
spec_version: str = Field(default="0.3.0", description="Spec version to scaffold from")
|
|
89
89
|
description: str = Field(default="", description="Short project description")
|
|
90
90
|
|
|
91
91
|
# Options
|
|
@@ -68,14 +68,15 @@ def run_doctor(root: Path) -> DoctorReport:
|
|
|
68
68
|
]:
|
|
69
69
|
for cmd in cmds:
|
|
70
70
|
tool_name = cmd.split()[0]
|
|
71
|
-
|
|
71
|
+
# Pass root so doctor can find tools in the project's .venv
|
|
72
|
+
check = _check_tool(tool_name, category, root=root)
|
|
72
73
|
report.checks.append(check)
|
|
73
74
|
|
|
74
75
|
return report
|
|
75
76
|
|
|
76
77
|
|
|
77
|
-
def _check_tool(name: str, category: str) -> ToolCheck:
|
|
78
|
-
"""Check if a tool is available on PATH."""
|
|
78
|
+
def _check_tool(name: str, category: str, root: Path | None = None) -> ToolCheck:
|
|
79
|
+
"""Check if a tool is available on PATH or in the project's .venv."""
|
|
79
80
|
# Handle compound tool names (cargo clippy → cargo)
|
|
80
81
|
exe = name.split()[0] if " " in name else name
|
|
81
82
|
|
|
@@ -85,7 +86,24 @@ def _check_tool(name: str, category: str) -> ToolCheck:
|
|
|
85
86
|
elif exe in ("golangci-lint",):
|
|
86
87
|
pass # Already the executable name
|
|
87
88
|
|
|
89
|
+
# 1. Check system PATH
|
|
88
90
|
path = shutil.which(exe)
|
|
91
|
+
|
|
92
|
+
# 2. Fall back to project's .venv (projects often don't install tools globally)
|
|
93
|
+
if not path and root is not None:
|
|
94
|
+
for venv_dir in (".venv", "venv", ".env"):
|
|
95
|
+
# POSIX layout: .venv/bin/<exe>
|
|
96
|
+
posix_path = root / venv_dir / "bin" / exe
|
|
97
|
+
# Windows layout: .venv\Scripts\<exe>.exe
|
|
98
|
+
win_path = root / venv_dir / "Scripts" / (exe + ".exe")
|
|
99
|
+
win_path_no_ext = root / venv_dir / "Scripts" / exe
|
|
100
|
+
for candidate in (posix_path, win_path, win_path_no_ext):
|
|
101
|
+
if candidate.exists():
|
|
102
|
+
path = str(candidate)
|
|
103
|
+
break
|
|
104
|
+
if path:
|
|
105
|
+
break
|
|
106
|
+
|
|
89
107
|
if not path:
|
|
90
108
|
return ToolCheck(name=name, category=category, installed=False)
|
|
91
109
|
|
|
@@ -93,7 +111,7 @@ def _check_tool(name: str, category: str) -> ToolCheck:
|
|
|
93
111
|
version = ""
|
|
94
112
|
try:
|
|
95
113
|
result = subprocess.run(
|
|
96
|
-
[
|
|
114
|
+
[path, "--version"],
|
|
97
115
|
capture_output=True,
|
|
98
116
|
text=True,
|
|
99
117
|
timeout=5,
|
|
@@ -941,12 +941,18 @@ def _infer_type(result: DetectionResult) -> ProjectType:
|
|
|
941
941
|
|
|
942
942
|
def generate_import_config(result: DetectionResult) -> ProjectConfig:
|
|
943
943
|
"""Generate a ProjectConfig from detection results."""
|
|
944
|
+
# Prefer README summary; fall back to generic description
|
|
945
|
+
description = (
|
|
946
|
+
result.readme_summary[:120]
|
|
947
|
+
if result.readme_summary
|
|
948
|
+
else f"Imported {result.primary_language or 'project'} library"
|
|
949
|
+
)
|
|
944
950
|
return ProjectConfig(
|
|
945
951
|
name=result.root.name,
|
|
946
952
|
type=result.inferred_type or ProjectType.CLI_PYTHON,
|
|
947
953
|
platforms=[Platform.WINDOWS, Platform.LINUX, Platform.MACOS],
|
|
948
954
|
language=result.primary_language or "python",
|
|
949
|
-
description=
|
|
955
|
+
description=description,
|
|
950
956
|
git_init=False, # Already has git
|
|
951
957
|
vcs_platform=result.vcs_platform,
|
|
952
958
|
detected_build_system=result.build_system,
|
|
@@ -1043,9 +1049,20 @@ def generate_overlay(
|
|
|
1043
1049
|
tests += f"## TEST-{i:03d}\n- **File**: {test_file}\n- **Status**: Detected\n"
|
|
1044
1050
|
for module in result.modules:
|
|
1045
1051
|
if module in test_file:
|
|
1046
|
-
|
|
1052
|
+
# Use 'Covers:' — matches the audit's _TEST_COVERS_PATTERN
|
|
1053
|
+
tests += f" Covers: REQ-{module.upper().replace('-', '_')}-001\n"
|
|
1047
1054
|
break
|
|
1048
1055
|
tests += "\n"
|
|
1056
|
+
# Add an explicit build test so REQ-BUILD-001 has coverage
|
|
1057
|
+
if result.build_system:
|
|
1058
|
+
n = len(result.test_files[:20]) + 1
|
|
1059
|
+
tests += (
|
|
1060
|
+
f"## TEST-{n:03d}\n"
|
|
1061
|
+
"- **Type**: integration\n"
|
|
1062
|
+
f"- **Description**: Project installs and {result.test_framework or 'runs'} successfully\n" # noqa: E501
|
|
1063
|
+
" Covers: REQ-BUILD-001\n"
|
|
1064
|
+
"- **Status**: Detected\n\n"
|
|
1065
|
+
)
|
|
1049
1066
|
_write("docs/TEST_SPEC.md", tests)
|
|
1050
1067
|
|
|
1051
1068
|
# docs/architecture.md — skip if project has architecture doc anywhere under docs/
|
|
@@ -1054,7 +1071,7 @@ def generate_overlay(
|
|
|
1054
1071
|
)
|
|
1055
1072
|
if not (existing_arch and not force):
|
|
1056
1073
|
arch = (
|
|
1057
|
-
f"# Architecture
|
|
1074
|
+
f"# Architecture \u2014 {name}\n\n"
|
|
1058
1075
|
"Architecture auto-generated from project detection.\n\n"
|
|
1059
1076
|
"## Overview\n"
|
|
1060
1077
|
f"- **Languages**: {lang_display}\n"
|
|
@@ -1064,7 +1081,9 @@ def generate_overlay(
|
|
|
1064
1081
|
if result.modules:
|
|
1065
1082
|
arch += "## Modules\n"
|
|
1066
1083
|
for module in result.modules:
|
|
1067
|
-
|
|
1084
|
+
mu = module.upper().replace("-", "_")
|
|
1085
|
+
# Reference the auto-generated requirement so validate passes
|
|
1086
|
+
arch += f"- **{module}**: [Describe module purpose] (see REQ-{mu}-001)\n"
|
|
1068
1087
|
arch += "\n"
|
|
1069
1088
|
if result.entry_points:
|
|
1070
1089
|
arch += "## Entry Points\n"
|
|
@@ -1075,6 +1094,9 @@ def generate_overlay(
|
|
|
1075
1094
|
arch += "## Language Distribution\n"
|
|
1076
1095
|
for lang_name, count in sorted(result.languages.items(), key=lambda x: -x[1]):
|
|
1077
1096
|
arch += f"- {lang_name}: {count} files\n"
|
|
1097
|
+
if result.build_system:
|
|
1098
|
+
arch += "\n## Build\n"
|
|
1099
|
+
arch += f"- Build system: {result.build_system} (see REQ-BUILD-001)\n"
|
|
1078
1100
|
_write("docs/ARCHITECTURE.md", arch)
|
|
1079
1101
|
|
|
1080
1102
|
# --- Modular governance files ---
|
|
@@ -198,10 +198,19 @@ def _check_req_ids_unique(root: Path) -> list[ValidationResult]:
|
|
|
198
198
|
def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
|
|
199
199
|
"""Check that architecture.md references requirements."""
|
|
200
200
|
results: list[ValidationResult] = []
|
|
201
|
-
|
|
201
|
+
|
|
202
|
+
# Accept both ARCHITECTURE.md and architecture.md
|
|
203
|
+
arch_path = next(
|
|
204
|
+
(
|
|
205
|
+
root / "docs" / f
|
|
206
|
+
for f in ("ARCHITECTURE.md", "architecture.md")
|
|
207
|
+
if (root / "docs" / f).exists()
|
|
208
|
+
),
|
|
209
|
+
None,
|
|
210
|
+
)
|
|
202
211
|
req_path = root / "docs" / "REQUIREMENTS.md"
|
|
203
212
|
|
|
204
|
-
if
|
|
213
|
+
if arch_path is None or not req_path.exists():
|
|
205
214
|
return results
|
|
206
215
|
|
|
207
216
|
req_text = req_path.read_text(encoding="utf-8")
|
|
@@ -210,7 +219,16 @@ def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
|
|
|
210
219
|
req_ids = set(_REQ_PATTERN.findall(req_text))
|
|
211
220
|
arch_refs = set(_REQ_PATTERN.findall(arch_text))
|
|
212
221
|
|
|
213
|
-
|
|
222
|
+
# If all requirements are Draft stubs (e.g. auto-generated by import),
|
|
223
|
+
# don't require architecture to reference them yet — they haven't been
|
|
224
|
+
# accepted or enriched. The check is only meaningful for accepted requirements.
|
|
225
|
+
all_draft = (
|
|
226
|
+
bool(req_ids)
|
|
227
|
+
and bool(re.search(r"\*\*Status\*\*:\s*[Dd]raft", req_text))
|
|
228
|
+
and not re.search(r"\*\*Status\*\*:\s*(?!Draft|draft)[A-Za-z]", req_text)
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
if req_ids and not arch_refs and not all_draft:
|
|
214
232
|
results.append(
|
|
215
233
|
ValidationResult(
|
|
216
234
|
name="arch-req-refs",
|
|
@@ -221,11 +239,16 @@ def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
|
|
|
221
239
|
)
|
|
222
240
|
)
|
|
223
241
|
else:
|
|
242
|
+
msg = (
|
|
243
|
+
f"architecture.md references {len(arch_refs)} REQ IDs"
|
|
244
|
+
if arch_refs
|
|
245
|
+
else f"REQs are all Draft \u2014 architecture linkage not yet required ({len(req_ids)} REQs)" # noqa: E501
|
|
246
|
+
)
|
|
224
247
|
results.append(
|
|
225
248
|
ValidationResult(
|
|
226
249
|
name="arch-req-refs",
|
|
227
250
|
passed=True,
|
|
228
|
-
message=
|
|
251
|
+
message=msg,
|
|
229
252
|
)
|
|
230
253
|
)
|
|
231
254
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.0.dev16
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License: MIT
|
|
@@ -64,8 +64,7 @@ Dynamic: license-file
|
|
|
64
64
|
|
|
65
65
|
[](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
|
|
66
66
|
[](https://specsmith.readthedocs.io/en/stable/)
|
|
67
|
-
[](https://pypi.org/project/specsmith/#history)
|
|
67
|
+
[](https://pypi.org/project/specsmith/)
|
|
69
68
|
[](https://www.python.org/downloads/)
|
|
70
69
|
[](LICENSE)
|
|
71
70
|
|
|
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.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/epistemic-auditor.md
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
|
|
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.0a1.dev8 → specsmith-0.3.0.dev16}/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.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/license-MIT.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/security.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/architecture.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/readthedocs.yaml.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/requirements.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/test-spec.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/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.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/roles.md.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/rules.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/workflow.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/pyproject.toml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/exec.cmd.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.cmd.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.sh.j2
RENAMED
|
File without changes
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/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
|
{specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/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
|