specsmith 0.2.2.dev47__tar.gz → 0.2.2.dev49__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 (102) hide show
  1. {specsmith-0.2.2.dev47/src/specsmith.egg-info → specsmith-0.2.2.dev49}/PKG-INFO +1 -1
  2. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/pyproject.toml +1 -1
  3. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/auditor.py +18 -10
  4. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/upgrader.py +35 -0
  5. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49/src/specsmith.egg-info}/PKG-INFO +1 -1
  6. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/LICENSE +0 -0
  7. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/README.md +0 -0
  8. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/setup.cfg +0 -0
  9. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/__init__.py +0 -0
  10. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/__main__.py +0 -0
  11. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/architect.py +0 -0
  12. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/cli.py +0 -0
  13. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/commands/__init__.py +0 -0
  14. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/compressor.py +0 -0
  15. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/config.py +0 -0
  16. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/credit_analyzer.py +0 -0
  17. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/credits.py +0 -0
  18. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/differ.py +0 -0
  19. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/doctor.py +0 -0
  20. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/executor.py +0 -0
  21. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/exporter.py +0 -0
  22. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/importer.py +0 -0
  23. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/__init__.py +0 -0
  24. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/aider.py +0 -0
  25. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/base.py +0 -0
  26. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/claude_code.py +0 -0
  27. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/copilot.py +0 -0
  28. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/cursor.py +0 -0
  29. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/gemini.py +0 -0
  30. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/warp.py +0 -0
  31. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/integrations/windsurf.py +0 -0
  32. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/ledger.py +0 -0
  33. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/plugins.py +0 -0
  34. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/releaser.py +0 -0
  35. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/requirements.py +0 -0
  36. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/scaffolder.py +0 -0
  37. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/session.py +0 -0
  38. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/agents.md.j2 +0 -0
  39. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  40. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  41. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  42. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  43. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  44. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  45. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  46. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/community/security.md.j2 +0 -0
  47. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  48. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  49. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  50. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  51. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  52. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
  53. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/editorconfig.j2 +0 -0
  54. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/gitattributes.j2 +0 -0
  55. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/gitignore.j2 +0 -0
  56. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/go/go.mod.j2 +0 -0
  57. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/go/main.go.j2 +0 -0
  58. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  59. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  60. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  61. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  62. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  63. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
  64. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/js/package.json.j2 +0 -0
  65. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/ledger.md.j2 +0 -0
  66. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/python/cli.py.j2 +0 -0
  67. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/python/init.py.j2 +0 -0
  68. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  69. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/readme.md.j2 +0 -0
  70. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  71. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  72. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  73. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  74. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  75. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  76. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  77. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  78. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  79. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/tools.py +0 -0
  80. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/updater.py +0 -0
  81. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/validator.py +0 -0
  82. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs/__init__.py +0 -0
  83. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs/base.py +0 -0
  84. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs/bitbucket.py +0 -0
  85. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs/github.py +0 -0
  86. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs/gitlab.py +0 -0
  87. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith/vcs_commands.py +0 -0
  88. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith.egg-info/SOURCES.txt +0 -0
  89. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith.egg-info/dependency_links.txt +0 -0
  90. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith.egg-info/entry_points.txt +0 -0
  91. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith.egg-info/requires.txt +0 -0
  92. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/src/specsmith.egg-info/top_level.txt +0 -0
  93. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_auditor.py +0 -0
  94. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_cli.py +0 -0
  95. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_compressor.py +0 -0
  96. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_importer.py +0 -0
  97. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_integrations.py +0 -0
  98. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_scaffolder.py +0 -0
  99. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_smoke.py +0 -0
  100. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_tools.py +0 -0
  101. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_validator.py +0 -0
  102. {specsmith-0.2.2.dev47 → specsmith-0.2.2.dev49}/tests/test_vcs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.2.2.dev47
3
+ Version: 0.2.2.dev49
4
4
  Summary: Forge governed project scaffolds from the Agentic AI Development Workflow Specification.
5
5
  Author: BitConcepts
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.2.2.dev47"
7
+ version = "0.2.2.dev49"
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=path.exists(),
86
- message=f"Required file {f} {'exists' if path.exists() else 'MISSING'}",
89
+ passed=found,
90
+ message=f"Required file {f} {'exists' if found else 'MISSING'}",
87
91
  )
88
92
  )
89
93
 
@@ -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
- results.append(
238
- AuditResult(
239
- name="ledger-exists",
240
- passed=False,
241
- message="LEDGER.md not found",
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,6 +246,41 @@ 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 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:
252
+ (root / "LEDGER.md").write_text("# Ledger\n\nNo entries yet.\n", encoding="utf-8")
253
+ synced.append("LEDGER.md (created)")
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:
263
+ try:
264
+ from specsmith.architect import generate_architecture
265
+
266
+ generate_architecture(root)
267
+ synced.append("docs/ARCHITECTURE.md (generated from scan)")
268
+ except Exception: # noqa: BLE001
269
+ arch_path = root / "docs" / "ARCHITECTURE.md"
270
+ arch_path.parent.mkdir(parents=True, exist_ok=True)
271
+ arch_path.write_text(
272
+ f"# Architecture \u2014 {config.name}\n\n[Run `specsmith architect` to populate]\n",
273
+ encoding="utf-8",
274
+ )
275
+ synced.append("docs/ARCHITECTURE.md (stub created)")
276
+ specsmith_dir = root / ".specsmith"
277
+ credit_budget = specsmith_dir / "credit-budget.json"
278
+ if not credit_budget.exists():
279
+ from specsmith.credits import CreditBudget, save_budget
280
+
281
+ save_budget(root, CreditBudget())
282
+ synced.append(".specsmith/credit-budget.json (created)")
283
+
249
284
  return synced
250
285
 
251
286
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.2.2.dev47
3
+ Version: 0.2.2.dev49
4
4
  Summary: Forge governed project scaffolds from the Agentic AI Development Workflow Specification.
5
5
  Author: BitConcepts
6
6
  License: MIT
File without changes