specsmith 0.1.3__tar.gz → 0.1.3.dev18__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.1.3/src/specsmith.egg-info → specsmith-0.1.3.dev18}/PKG-INFO +3 -3
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/README.md +2 -2
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/pyproject.toml +1 -1
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/auditor.py +48 -1
- specsmith-0.1.3.dev18/src/specsmith/cli.py +1303 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/differ.py +74 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/importer.py +398 -36
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/claude_code.py +27 -4
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/warp.py +26 -3
- specsmith-0.1.3.dev18/src/specsmith/ledger.py +88 -0
- specsmith-0.1.3.dev18/src/specsmith/plugins.py +78 -0
- specsmith-0.1.3.dev18/src/specsmith/releaser.py +108 -0
- specsmith-0.1.3.dev18/src/specsmith/requirements.py +120 -0
- specsmith-0.1.3.dev18/src/specsmith/session.py +130 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/agents.md.j2 +34 -8
- specsmith-0.1.3.dev18/src/specsmith/updater.py +137 -0
- specsmith-0.1.3.dev18/src/specsmith/vcs_commands.py +330 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18/src/specsmith.egg-info}/PKG-INFO +3 -3
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/SOURCES.txt +7 -0
- specsmith-0.1.3/src/specsmith/cli.py +0 -592
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/LICENSE +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/setup.cfg +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/__init__.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/__main__.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/compressor.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/config.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/doctor.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/exporter.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/pyproject.toml.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/tools.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/validator.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_auditor.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_cli.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_compressor.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_importer.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_integrations.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_scaffolder.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_smoke.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_tools.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_validator.py +0 -0
- {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_vcs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.1.3
|
|
3
|
+
Version: 0.1.3.dev18
|
|
4
4
|
Summary: Forge governed project scaffolds from the Agentic AI Development Workflow Specification.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License: MIT
|
|
@@ -45,7 +45,7 @@ Dynamic: license-file
|
|
|
45
45
|
|
|
46
46
|
[](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
|
|
47
47
|
[](https://specsmith.readthedocs.io/en/latest/)
|
|
48
|
-
[](https://pypi.org/project/specsmith/)
|
|
49
49
|
[](https://www.python.org/downloads/)
|
|
50
50
|
[](LICENSE)
|
|
51
51
|
|
|
@@ -98,7 +98,7 @@ specsmith doctor --project-dir ./my-project # Tool check
|
|
|
98
98
|
|
|
99
99
|
Each type gets: tool-aware CI (correct lint/test/security/build tools), domain-specific directory structure, governance rules in AGENTS.md, and pre-populated requirements and test stubs.
|
|
100
100
|
|
|
101
|
-
##
|
|
101
|
+
## 30+ CLI Commands
|
|
102
102
|
|
|
103
103
|
| Command | Purpose |
|
|
104
104
|
|---------|---------|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
|
|
4
4
|
[](https://specsmith.readthedocs.io/en/latest/)
|
|
5
|
-
[](https://pypi.org/project/specsmith/)
|
|
6
6
|
[](https://www.python.org/downloads/)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
@@ -55,7 +55,7 @@ specsmith doctor --project-dir ./my-project # Tool check
|
|
|
55
55
|
|
|
56
56
|
Each type gets: tool-aware CI (correct lint/test/security/build tools), domain-specific directory structure, governance rules in AGENTS.md, and pre-populated requirements and test stubs.
|
|
57
57
|
|
|
58
|
-
##
|
|
58
|
+
## 30+ CLI Commands
|
|
59
59
|
|
|
60
60
|
| Command | Purpose |
|
|
61
61
|
|---------|---------|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.1.3"
|
|
7
|
+
version = "0.1.3.dev18"
|
|
8
8
|
description = "Forge governed project scaffolds from the Agentic AI Development Workflow Specification."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -137,7 +137,11 @@ def check_governance_files(root: Path) -> list[AuditResult]:
|
|
|
137
137
|
|
|
138
138
|
_REQ_PATTERN = re.compile(r"\b(REQ-[A-Z]+-\d+)\b")
|
|
139
139
|
_TEST_PATTERN = re.compile(r"\b(TEST-[A-Z]+-\d+)\b")
|
|
140
|
-
|
|
140
|
+
# Match 'Covers: REQ-xxx', '**Requirement:** REQ-xxx', 'Requirement: REQ-xxx'
|
|
141
|
+
_TEST_COVERS_PATTERN = re.compile(
|
|
142
|
+
r"(?:Covers|\*\*Requirement:?\*\*|Requirement):?\s*"
|
|
143
|
+
r"(REQ-[A-Z]+-\d+(?:\s*,\s*REQ-[A-Z]+-\d+)*)"
|
|
144
|
+
)
|
|
141
145
|
|
|
142
146
|
|
|
143
147
|
def check_req_test_consistency(root: Path) -> list[AuditResult]:
|
|
@@ -391,6 +395,48 @@ def check_tool_configuration(root: Path) -> list[AuditResult]:
|
|
|
391
395
|
return results
|
|
392
396
|
|
|
393
397
|
|
|
398
|
+
def check_type_mismatch(root: Path) -> list[AuditResult]:
|
|
399
|
+
"""Check if scaffold.yml type matches actual detected project type."""
|
|
400
|
+
results: list[AuditResult] = []
|
|
401
|
+
scaffold_path = root / "scaffold.yml"
|
|
402
|
+
if not scaffold_path.exists():
|
|
403
|
+
return results
|
|
404
|
+
|
|
405
|
+
import yaml
|
|
406
|
+
|
|
407
|
+
from specsmith.config import ProjectConfig
|
|
408
|
+
from specsmith.importer import detect_project
|
|
409
|
+
|
|
410
|
+
try:
|
|
411
|
+
with open(scaffold_path) as f:
|
|
412
|
+
raw = yaml.safe_load(f)
|
|
413
|
+
config = ProjectConfig(**raw)
|
|
414
|
+
detected = detect_project(root)
|
|
415
|
+
if detected.inferred_type and detected.inferred_type != config.type:
|
|
416
|
+
results.append(
|
|
417
|
+
AuditResult(
|
|
418
|
+
name="type-mismatch",
|
|
419
|
+
passed=False,
|
|
420
|
+
message=(
|
|
421
|
+
f"scaffold.yml type is {config.type.value} but detected "
|
|
422
|
+
f"{detected.inferred_type.value} from project files"
|
|
423
|
+
),
|
|
424
|
+
)
|
|
425
|
+
)
|
|
426
|
+
else:
|
|
427
|
+
results.append(
|
|
428
|
+
AuditResult(
|
|
429
|
+
name="type-mismatch",
|
|
430
|
+
passed=True,
|
|
431
|
+
message=f"Project type {config.type.value} matches detected structure",
|
|
432
|
+
)
|
|
433
|
+
)
|
|
434
|
+
except Exception: # noqa: BLE001
|
|
435
|
+
pass
|
|
436
|
+
|
|
437
|
+
return results
|
|
438
|
+
|
|
439
|
+
|
|
394
440
|
def run_audit(root: Path) -> AuditReport:
|
|
395
441
|
"""Run all audit checks and return a report."""
|
|
396
442
|
report = AuditReport()
|
|
@@ -399,6 +445,7 @@ def run_audit(root: Path) -> AuditReport:
|
|
|
399
445
|
report.results.extend(check_ledger_health(root))
|
|
400
446
|
report.results.extend(check_context_size(root))
|
|
401
447
|
report.results.extend(check_tool_configuration(root))
|
|
448
|
+
report.results.extend(check_type_mismatch(root))
|
|
402
449
|
return report
|
|
403
450
|
|
|
404
451
|
|