specsmith 0.2.2.dev46__tar.gz → 0.2.2.dev48__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.dev46/src/specsmith.egg-info → specsmith-0.2.2.dev48}/PKG-INFO +1 -1
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/pyproject.toml +1 -1
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/upgrader.py +70 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48/src/specsmith.egg-info}/PKG-INFO +1 -1
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/LICENSE +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/README.md +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/setup.cfg +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/__init__.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/__main__.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/architect.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/auditor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/cli.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/compressor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/config.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/credits.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/differ.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/doctor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/executor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/exporter.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/importer.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/ledger.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/plugins.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/releaser.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/requirements.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/session.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/tools.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/updater.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/validator.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_auditor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_cli.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_compressor.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_importer.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_integrations.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_scaffolder.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_smoke.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_tools.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/tests/test_validator.py +0 -0
- {specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/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.dev48"
|
|
8
8
|
description = "Forge governed project scaffolds from the Agentic AI Development Workflow Specification."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
@@ -246,6 +246,35 @@ 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 (these are needed for audit to pass)
|
|
250
|
+
if not (root / "LEDGER.md").exists():
|
|
251
|
+
(root / "LEDGER.md").write_text("# Ledger\n\nNo entries yet.\n", encoding="utf-8")
|
|
252
|
+
synced.append("LEDGER.md (created)")
|
|
253
|
+
|
|
254
|
+
if not (root / "docs" / "ARCHITECTURE.md").exists():
|
|
255
|
+
try:
|
|
256
|
+
from specsmith.architect import generate_architecture
|
|
257
|
+
|
|
258
|
+
generate_architecture(root)
|
|
259
|
+
synced.append("docs/ARCHITECTURE.md (generated from scan)")
|
|
260
|
+
except Exception: # noqa: BLE001
|
|
261
|
+
arch_path = root / "docs" / "ARCHITECTURE.md"
|
|
262
|
+
arch_path.parent.mkdir(parents=True, exist_ok=True)
|
|
263
|
+
arch_path.write_text(
|
|
264
|
+
f"# Architecture \u2014 {config.name}\n\n[Run `specsmith architect` to populate]\n",
|
|
265
|
+
encoding="utf-8",
|
|
266
|
+
)
|
|
267
|
+
synced.append("docs/ARCHITECTURE.md (stub created)")
|
|
268
|
+
|
|
269
|
+
# Initialize credit tracking if not present
|
|
270
|
+
specsmith_dir = root / ".specsmith"
|
|
271
|
+
credit_budget = specsmith_dir / "credit-budget.json"
|
|
272
|
+
if not credit_budget.exists():
|
|
273
|
+
from specsmith.credits import CreditBudget, save_budget
|
|
274
|
+
|
|
275
|
+
save_budget(root, CreditBudget())
|
|
276
|
+
synced.append(".specsmith/credit-budget.json (created)")
|
|
277
|
+
|
|
249
278
|
return synced
|
|
250
279
|
|
|
251
280
|
|
|
@@ -255,9 +284,13 @@ def _migrate_legacy_filenames(root: Path, result: UpgradeResult) -> None:
|
|
|
255
284
|
Handles both case-sensitive (Linux) and case-insensitive (Windows/macOS)
|
|
256
285
|
filesystems. On case-insensitive FS, uses a two-step rename via a
|
|
257
286
|
temporary name to avoid conflicts.
|
|
287
|
+
|
|
288
|
+
Also updates references in AGENTS.md so the hub links stay valid.
|
|
258
289
|
"""
|
|
259
290
|
import shutil
|
|
260
291
|
|
|
292
|
+
renamed: list[tuple[str, str]] = []
|
|
293
|
+
|
|
261
294
|
for old_rel, new_rel in _LEGACY_RENAMES:
|
|
262
295
|
old_path = root / old_rel
|
|
263
296
|
new_path = root / new_rel
|
|
@@ -276,4 +309,41 @@ def _migrate_legacy_filenames(root: Path, result: UpgradeResult) -> None:
|
|
|
276
309
|
shutil.move(str(old_path), str(new_path))
|
|
277
310
|
else:
|
|
278
311
|
continue # Both exist as truly separate files — skip
|
|
312
|
+
renamed.append((old_rel, new_rel))
|
|
279
313
|
result.updated_files.append(f"{old_rel} → {new_rel}")
|
|
314
|
+
|
|
315
|
+
# Update references in user-owned docs that point to renamed files
|
|
316
|
+
if renamed:
|
|
317
|
+
_update_references(root, renamed, result)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def _update_references(
|
|
321
|
+
root: Path,
|
|
322
|
+
renames: list[tuple[str, str]],
|
|
323
|
+
result: UpgradeResult,
|
|
324
|
+
) -> None:
|
|
325
|
+
"""Rewrite old paths to new paths in AGENTS.md and other hub files.
|
|
326
|
+
|
|
327
|
+
Only performs safe string replacement of exact path references.
|
|
328
|
+
"""
|
|
329
|
+
docs_to_patch = [
|
|
330
|
+
"AGENTS.md",
|
|
331
|
+
"CLAUDE.md",
|
|
332
|
+
"GEMINI.md",
|
|
333
|
+
".warp/skills/SKILL.md",
|
|
334
|
+
".cursor/rules/governance.mdc",
|
|
335
|
+
".windsurfrules",
|
|
336
|
+
".aider.conf.yml",
|
|
337
|
+
]
|
|
338
|
+
|
|
339
|
+
for doc_name in docs_to_patch:
|
|
340
|
+
doc_path = root / doc_name
|
|
341
|
+
if not doc_path.exists():
|
|
342
|
+
continue
|
|
343
|
+
content = doc_path.read_text(encoding="utf-8")
|
|
344
|
+
original = content
|
|
345
|
+
for old_rel, new_rel in renames:
|
|
346
|
+
content = content.replace(old_rel, new_rel)
|
|
347
|
+
if content != original:
|
|
348
|
+
doc_path.write_text(content, encoding="utf-8")
|
|
349
|
+
result.updated_files.append(f"{doc_name} (references updated)")
|
|
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.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/bug_report.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/contributing.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/license-MIT.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/community/security.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/architecture.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/readthedocs.yaml.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/docs/requirements.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/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.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/roles.md.j2
RENAMED
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/governance/rules.md.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/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.dev46 → specsmith-0.2.2.dev48}/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.dev46 → specsmith-0.2.2.dev48}/src/specsmith/templates/scripts/setup.cmd.j2
RENAMED
|
File without changes
|
|
File without changes
|
{specsmith-0.2.2.dev46 → specsmith-0.2.2.dev48}/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
|