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.
Files changed (82) hide show
  1. {specsmith-0.1.3/src/specsmith.egg-info → specsmith-0.1.3.dev18}/PKG-INFO +3 -3
  2. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/README.md +2 -2
  3. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/pyproject.toml +1 -1
  4. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/auditor.py +48 -1
  5. specsmith-0.1.3.dev18/src/specsmith/cli.py +1303 -0
  6. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/differ.py +74 -0
  7. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/importer.py +398 -36
  8. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/claude_code.py +27 -4
  9. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/warp.py +26 -3
  10. specsmith-0.1.3.dev18/src/specsmith/ledger.py +88 -0
  11. specsmith-0.1.3.dev18/src/specsmith/plugins.py +78 -0
  12. specsmith-0.1.3.dev18/src/specsmith/releaser.py +108 -0
  13. specsmith-0.1.3.dev18/src/specsmith/requirements.py +120 -0
  14. specsmith-0.1.3.dev18/src/specsmith/session.py +130 -0
  15. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/agents.md.j2 +34 -8
  16. specsmith-0.1.3.dev18/src/specsmith/updater.py +137 -0
  17. specsmith-0.1.3.dev18/src/specsmith/vcs_commands.py +330 -0
  18. {specsmith-0.1.3 → specsmith-0.1.3.dev18/src/specsmith.egg-info}/PKG-INFO +3 -3
  19. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/SOURCES.txt +7 -0
  20. specsmith-0.1.3/src/specsmith/cli.py +0 -592
  21. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/LICENSE +0 -0
  22. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/setup.cfg +0 -0
  23. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/__init__.py +0 -0
  24. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/__main__.py +0 -0
  25. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/commands/__init__.py +0 -0
  26. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/compressor.py +0 -0
  27. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/config.py +0 -0
  28. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/doctor.py +0 -0
  29. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/exporter.py +0 -0
  30. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/__init__.py +0 -0
  31. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/aider.py +0 -0
  32. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/base.py +0 -0
  33. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/copilot.py +0 -0
  34. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/cursor.py +0 -0
  35. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/gemini.py +0 -0
  36. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/integrations/windsurf.py +0 -0
  37. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/scaffolder.py +0 -0
  38. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  39. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  40. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  41. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
  42. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/gitattributes.j2 +0 -0
  43. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/gitignore.j2 +0 -0
  44. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  45. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  46. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  47. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  48. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  49. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
  50. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/ledger.md.j2 +0 -0
  51. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/pyproject.toml.j2 +0 -0
  52. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/python/cli.py.j2 +0 -0
  53. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/python/init.py.j2 +0 -0
  54. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/readme.md.j2 +0 -0
  55. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  56. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  57. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  58. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  59. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  60. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  61. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/tools.py +0 -0
  62. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/upgrader.py +0 -0
  63. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/validator.py +0 -0
  64. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/__init__.py +0 -0
  65. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/base.py +0 -0
  66. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/bitbucket.py +0 -0
  67. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/github.py +0 -0
  68. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith/vcs/gitlab.py +0 -0
  69. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/dependency_links.txt +0 -0
  70. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/entry_points.txt +0 -0
  71. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/requires.txt +0 -0
  72. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/src/specsmith.egg-info/top_level.txt +0 -0
  73. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_auditor.py +0 -0
  74. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_cli.py +0 -0
  75. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_compressor.py +0 -0
  76. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_importer.py +0 -0
  77. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_integrations.py +0 -0
  78. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_scaffolder.py +0 -0
  79. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_smoke.py +0 -0
  80. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_tools.py +0 -0
  81. {specsmith-0.1.3 → specsmith-0.1.3.dev18}/tests/test_validator.py +0 -0
  82. {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
  [![CI](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml/badge.svg)](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
47
47
  [![Docs](https://readthedocs.org/projects/specsmith/badge/?version=latest)](https://specsmith.readthedocs.io/en/latest/)
48
- [![PyPI version](https://img.shields.io/pypi/v/specsmith?color=blue)](https://pypi.org/project/specsmith/)
48
+ [![PyPI](https://img.shields.io/pypi/v/specsmith?style=flat&color=blue)](https://pypi.org/project/specsmith/)
49
49
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
50
50
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](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
- ## 11 CLI Commands
101
+ ## 30+ CLI Commands
102
102
 
103
103
  | Command | Purpose |
104
104
  |---------|---------|
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml/badge.svg)](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
4
4
  [![Docs](https://readthedocs.org/projects/specsmith/badge/?version=latest)](https://specsmith.readthedocs.io/en/latest/)
5
- [![PyPI version](https://img.shields.io/pypi/v/specsmith?color=blue)](https://pypi.org/project/specsmith/)
5
+ [![PyPI](https://img.shields.io/pypi/v/specsmith?style=flat&color=blue)](https://pypi.org/project/specsmith/)
6
6
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](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
- ## 11 CLI Commands
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
- _TEST_COVERS_PATTERN = re.compile(r"Covers:\s*(REQ-[A-Z]+-\d+(?:\s*,\s*REQ-[A-Z]+-\d+)*)")
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