specsmith 0.2.2.dev48__tar.gz → 0.2.2.dev50__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.2.2.dev48/src/specsmith.egg-info → specsmith-0.2.2.dev50}/PKG-INFO +1 -1
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/pyproject.toml +1 -1
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/auditor.py +20 -12
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/upgrader.py +11 -5
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/LICENSE +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/README.md +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/setup.cfg +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/__init__.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/__main__.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/architect.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/cli.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/compressor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/config.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/credits.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/differ.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/doctor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/executor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/exporter.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/importer.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/ledger.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/plugins.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/releaser.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/requirements.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/session.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/tools.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/updater.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/validator.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_auditor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_cli.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_compressor.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_importer.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_integrations.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_scaffolder.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_smoke.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_tools.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_validator.py +0 -0
- {specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/tests/test_vcs.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.2.2.
|
|
7
|
+
version = "0.2.2.dev50"
|
|
8
8
|
description = "Forge governed project scaffolds from the Agentic AI Development Workflow Specification."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -79,11 +79,15 @@ def check_governance_files(root: Path) -> list[AuditResult]:
|
|
|
79
79
|
|
|
80
80
|
for f in REQUIRED_FILES:
|
|
81
81
|
path = root / f
|
|
82
|
+
found = path.exists()
|
|
83
|
+
# LEDGER.md: also check docs/LEDGER.md (some imported projects place it there)
|
|
84
|
+
if not found and f == "LEDGER.md":
|
|
85
|
+
found = (root / "docs" / "LEDGER.md").exists()
|
|
82
86
|
results.append(
|
|
83
87
|
AuditResult(
|
|
84
88
|
name=f"file-exists:{f}",
|
|
85
|
-
passed=
|
|
86
|
-
message=f"Required file {f} {'exists' if
|
|
89
|
+
passed=found,
|
|
90
|
+
message=f"Required file {f} {'exists' if found else 'MISSING'}",
|
|
87
91
|
)
|
|
88
92
|
)
|
|
89
93
|
|
|
@@ -123,8 +127,8 @@ def check_governance_files(root: Path) -> list[AuditResult]:
|
|
|
123
127
|
for f in RECOMMENDED_FILES:
|
|
124
128
|
path = root / f
|
|
125
129
|
found = path.exists()
|
|
126
|
-
# For
|
|
127
|
-
if not found and "architecture" in f:
|
|
130
|
+
# For ARCHITECTURE.md, also search subdirectories (e.g. docs/architecture/*.md)
|
|
131
|
+
if not found and "architecture" in f.lower():
|
|
128
132
|
found = (
|
|
129
133
|
bool(
|
|
130
134
|
list((root / "docs").glob("**/architecture*"))
|
|
@@ -232,16 +236,20 @@ def check_ledger_health(root: Path) -> list[AuditResult]:
|
|
|
232
236
|
"""Check ledger quality and staleness."""
|
|
233
237
|
results: list[AuditResult] = []
|
|
234
238
|
ledger_path = root / "LEDGER.md"
|
|
235
|
-
|
|
236
239
|
if not ledger_path.exists():
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
240
|
+
# Also check docs/LEDGER.md (some imported projects place it there)
|
|
241
|
+
alt = root / "docs" / "LEDGER.md"
|
|
242
|
+
if alt.exists():
|
|
243
|
+
ledger_path = alt
|
|
244
|
+
else:
|
|
245
|
+
results.append(
|
|
246
|
+
AuditResult(
|
|
247
|
+
name="ledger-exists",
|
|
248
|
+
passed=False,
|
|
249
|
+
message="LEDGER.md not found",
|
|
250
|
+
)
|
|
242
251
|
)
|
|
243
|
-
|
|
244
|
-
return results
|
|
252
|
+
return results
|
|
245
253
|
|
|
246
254
|
text = ledger_path.read_text(encoding="utf-8")
|
|
247
255
|
lines = text.splitlines()
|
|
@@ -246,12 +246,20 @@ def _sync_full(
|
|
|
246
246
|
out.write_text(tmpl.render(**ctx), encoding="utf-8")
|
|
247
247
|
synced.append(f"{output_rel} (created)")
|
|
248
248
|
|
|
249
|
-
# 6. Essential docs — create stubs if missing (
|
|
250
|
-
|
|
249
|
+
# 6. Essential docs — create stubs only if truly missing (check alternate paths)
|
|
250
|
+
has_ledger = (root / "LEDGER.md").exists() or (root / "docs" / "LEDGER.md").exists()
|
|
251
|
+
if not has_ledger:
|
|
251
252
|
(root / "LEDGER.md").write_text("# Ledger\n\nNo entries yet.\n", encoding="utf-8")
|
|
252
253
|
synced.append("LEDGER.md (created)")
|
|
253
254
|
|
|
254
|
-
|
|
255
|
+
has_arch = (root / "docs" / "ARCHITECTURE.md").exists()
|
|
256
|
+
if not has_arch and (root / "docs").is_dir():
|
|
257
|
+
# Check subdirectories (e.g. docs/architecture/CPSC-RE-ARCHITECTURE.md)
|
|
258
|
+
has_arch = bool(
|
|
259
|
+
list((root / "docs").glob("**/architecture*"))
|
|
260
|
+
+ list((root / "docs").glob("**/ARCHITECTURE*"))
|
|
261
|
+
)
|
|
262
|
+
if not has_arch:
|
|
255
263
|
try:
|
|
256
264
|
from specsmith.architect import generate_architecture
|
|
257
265
|
|
|
@@ -265,8 +273,6 @@ def _sync_full(
|
|
|
265
273
|
encoding="utf-8",
|
|
266
274
|
)
|
|
267
275
|
synced.append("docs/ARCHITECTURE.md (stub created)")
|
|
268
|
-
|
|
269
|
-
# Initialize credit tracking if not present
|
|
270
276
|
specsmith_dir = root / ".specsmith"
|
|
271
277
|
credit_budget = specsmith_dir / "credit-budget.json"
|
|
272
278
|
if not credit_budget.exists():
|
|
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.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/bug_report.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/contributing.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/license-MIT.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/community/security.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/architecture.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/readthedocs.yaml.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/requirements.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/docs/test-spec.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
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/roles.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/governance/rules.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/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.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/python/pyproject.toml.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
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/src/specsmith/templates/scripts/setup.cmd.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev48 → specsmith-0.2.2.dev50}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|