specsmith 0.1.4.dev35__tar.gz → 0.1.4.dev37__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 (93) hide show
  1. {specsmith-0.1.4.dev35/src/specsmith.egg-info → specsmith-0.1.4.dev37}/PKG-INFO +33 -8
  2. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/README.md +32 -7
  3. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/pyproject.toml +1 -1
  4. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/architect.py +1 -1
  5. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/auditor.py +29 -27
  6. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/cli.py +7 -7
  7. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/config.py +12 -0
  8. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/differ.py +6 -6
  9. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/exporter.py +5 -5
  10. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/importer.py +32 -17
  11. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/aider.py +1 -1
  12. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/claude_code.py +1 -1
  13. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/cursor.py +1 -1
  14. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/gemini.py +1 -1
  15. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/warp.py +2 -2
  16. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/windsurf.py +1 -1
  17. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/scaffolder.py +54 -8
  18. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/agents.md.j2 +10 -10
  19. specsmith-0.1.4.dev37/src/specsmith/templates/community/bug_report.md.j2 +34 -0
  20. specsmith-0.1.4.dev37/src/specsmith/templates/community/code_of_conduct.md.j2 +30 -0
  21. specsmith-0.1.4.dev37/src/specsmith/templates/community/contributing.md.j2 +59 -0
  22. specsmith-0.1.4.dev37/src/specsmith/templates/community/feature_request.md.j2 +26 -0
  23. specsmith-0.1.4.dev37/src/specsmith/templates/community/license-Apache-2.0.j2 +17 -0
  24. specsmith-0.1.4.dev37/src/specsmith/templates/community/license-MIT.j2 +21 -0
  25. specsmith-0.1.4.dev37/src/specsmith/templates/community/pull_request_template.md.j2 +29 -0
  26. specsmith-0.1.4.dev37/src/specsmith/templates/community/security.md.j2 +32 -0
  27. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/context-budget.md.j2 +7 -7
  28. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/upgrader.py +59 -6
  29. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37/src/specsmith.egg-info}/PKG-INFO +33 -8
  30. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/SOURCES.txt +8 -0
  31. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_validator.py +4 -4
  32. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/LICENSE +0 -0
  33. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/setup.cfg +0 -0
  34. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/__init__.py +0 -0
  35. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/__main__.py +0 -0
  36. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/commands/__init__.py +0 -0
  37. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/compressor.py +0 -0
  38. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/credit_analyzer.py +0 -0
  39. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/credits.py +0 -0
  40. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/doctor.py +0 -0
  41. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/__init__.py +0 -0
  42. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/base.py +0 -0
  43. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/copilot.py +0 -0
  44. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/ledger.py +0 -0
  45. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/plugins.py +0 -0
  46. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/releaser.py +0 -0
  47. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/requirements.py +0 -0
  48. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/session.py +0 -0
  49. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  50. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  51. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  52. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
  53. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/editorconfig.j2 +0 -0
  54. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/gitattributes.j2 +0 -0
  55. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/gitignore.j2 +0 -0
  56. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  57. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  58. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  59. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  60. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
  61. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/ledger.md.j2 +0 -0
  62. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/pyproject.toml.j2 +0 -0
  63. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/python/cli.py.j2 +0 -0
  64. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/python/init.py.j2 +0 -0
  65. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/readme.md.j2 +0 -0
  66. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  67. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  68. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  69. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  70. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  71. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  72. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/tools.py +0 -0
  73. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/updater.py +0 -0
  74. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/validator.py +0 -0
  75. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/__init__.py +0 -0
  76. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/base.py +0 -0
  77. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/bitbucket.py +0 -0
  78. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/github.py +0 -0
  79. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/gitlab.py +0 -0
  80. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs_commands.py +0 -0
  81. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/dependency_links.txt +0 -0
  82. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/entry_points.txt +0 -0
  83. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/requires.txt +0 -0
  84. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/top_level.txt +0 -0
  85. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_auditor.py +0 -0
  86. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_cli.py +0 -0
  87. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_compressor.py +0 -0
  88. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_importer.py +0 -0
  89. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_integrations.py +0 -0
  90. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_scaffolder.py +0 -0
  91. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_smoke.py +0 -0
  92. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_tools.py +0 -0
  93. {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_vcs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.1.4.dev35
3
+ Version: 0.1.4.dev37
4
4
  Summary: Forge governed project scaffolds from the Agentic AI Development Workflow Specification.
5
5
  Author: BitConcepts
6
6
  License: MIT
@@ -79,14 +79,36 @@ pip install specsmith
79
79
  ## Quick Start
80
80
 
81
81
  ```bash
82
- specsmith init # New project (interactive)
83
- specsmith init --config scaffold.yml # New project (from config)
84
- specsmith import --project-dir ./my-project # Adopt existing project
85
- specsmith audit --project-dir ./my-project # Health check
86
- specsmith export --project-dir ./my-project # Compliance report
87
- specsmith doctor --project-dir ./my-project # Tool check
82
+ # Install
83
+ pip install specsmith
84
+
85
+ # New project (interactive)
86
+ specsmith init
87
+
88
+ # Adopt an existing project
89
+ specsmith import --project-dir ./my-project
90
+
91
+ # Check governance health
92
+ specsmith audit --project-dir ./my-project
93
+
94
+ # Generate architecture docs interactively
95
+ specsmith architect --project-dir ./my-project
96
+
97
+ # Start an AI agent session (universal pattern)
98
+ # From any governed repo root:
99
+ /agent AGENTS.md
88
100
  ```
89
101
 
102
+ ### Starting an AI Agent Session
103
+
104
+ The universal pattern for any specsmith-governed project:
105
+
106
+ ```
107
+ /agent AGENTS.md
108
+ ```
109
+
110
+ This works in Warp, Claude Code, Cursor, and any agent that reads markdown context files. The agent loads AGENTS.md (the governance hub), reads LEDGER.md for session state, and picks up from the last recorded action.
111
+
90
112
  ## 30 Project Types
91
113
 
92
114
  **Software:** Python, Rust, Go, C/C++, .NET, JS/TS, mobile, monorepo, microservices, DevOps/IaC, data/ML, browser extensions.
@@ -99,13 +121,14 @@ specsmith doctor --project-dir ./my-project # Tool check
99
121
 
100
122
  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.
101
123
 
102
- ## 30+ CLI Commands
124
+ ## 40+ CLI Commands
103
125
 
104
126
  | Command | Purpose |
105
127
  |---------|---------|
106
128
  | `init` | Scaffold a new governed project |
107
129
  | `import` | Adopt an existing project (merge mode) |
108
130
  | `audit` | Drift detection and health checks (`--fix` to auto-repair) |
131
+ | `architect` | Interactive architecture generation |
109
132
  | `validate` | Governance file consistency checks |
110
133
  | `compress` | Archive old ledger entries |
111
134
  | `upgrade` | Update governance to new spec version |
@@ -113,6 +136,8 @@ Each type gets: tool-aware CI (correct lint/test/security/build tools), domain-s
113
136
  | `diff` | Compare governance against templates |
114
137
  | `export` | Compliance report with REQ↔TEST coverage |
115
138
  | `doctor` | Check if verification tools are installed |
139
+ | `self-update` | Update specsmith (channel-aware) |
140
+ | `credits` | AI credit tracking, analysis, and budgets |
116
141
 
117
142
  ## 7 Agent Integrations
118
143
 
@@ -36,14 +36,36 @@ pip install specsmith
36
36
  ## Quick Start
37
37
 
38
38
  ```bash
39
- specsmith init # New project (interactive)
40
- specsmith init --config scaffold.yml # New project (from config)
41
- specsmith import --project-dir ./my-project # Adopt existing project
42
- specsmith audit --project-dir ./my-project # Health check
43
- specsmith export --project-dir ./my-project # Compliance report
44
- specsmith doctor --project-dir ./my-project # Tool check
39
+ # Install
40
+ pip install specsmith
41
+
42
+ # New project (interactive)
43
+ specsmith init
44
+
45
+ # Adopt an existing project
46
+ specsmith import --project-dir ./my-project
47
+
48
+ # Check governance health
49
+ specsmith audit --project-dir ./my-project
50
+
51
+ # Generate architecture docs interactively
52
+ specsmith architect --project-dir ./my-project
53
+
54
+ # Start an AI agent session (universal pattern)
55
+ # From any governed repo root:
56
+ /agent AGENTS.md
45
57
  ```
46
58
 
59
+ ### Starting an AI Agent Session
60
+
61
+ The universal pattern for any specsmith-governed project:
62
+
63
+ ```
64
+ /agent AGENTS.md
65
+ ```
66
+
67
+ This works in Warp, Claude Code, Cursor, and any agent that reads markdown context files. The agent loads AGENTS.md (the governance hub), reads LEDGER.md for session state, and picks up from the last recorded action.
68
+
47
69
  ## 30 Project Types
48
70
 
49
71
  **Software:** Python, Rust, Go, C/C++, .NET, JS/TS, mobile, monorepo, microservices, DevOps/IaC, data/ML, browser extensions.
@@ -56,13 +78,14 @@ specsmith doctor --project-dir ./my-project # Tool check
56
78
 
57
79
  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.
58
80
 
59
- ## 30+ CLI Commands
81
+ ## 40+ CLI Commands
60
82
 
61
83
  | Command | Purpose |
62
84
  |---------|---------|
63
85
  | `init` | Scaffold a new governed project |
64
86
  | `import` | Adopt an existing project (merge mode) |
65
87
  | `audit` | Drift detection and health checks (`--fix` to auto-repair) |
88
+ | `architect` | Interactive architecture generation |
66
89
  | `validate` | Governance file consistency checks |
67
90
  | `compress` | Archive old ledger entries |
68
91
  | `upgrade` | Update governance to new spec version |
@@ -70,6 +93,8 @@ Each type gets: tool-aware CI (correct lint/test/security/build tools), domain-s
70
93
  | `diff` | Compare governance against templates |
71
94
  | `export` | Compliance report with REQ↔TEST coverage |
72
95
  | `doctor` | Check if verification tools are installed |
96
+ | `self-update` | Update specsmith (channel-aware) |
97
+ | `credits` | AI credit tracking, analysis, and budgets |
73
98
 
74
99
  ## 7 Agent Integrations
75
100
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.1.4.dev35"
7
+ version = "0.1.4.dev37"
8
8
  description = "Forge governed project scaffolds from the Agentic AI Development Workflow Specification."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -148,7 +148,7 @@ def generate_architecture(
148
148
  doc += "\n"
149
149
 
150
150
  # Write
151
- arch_path = root / "docs" / "architecture.md"
151
+ arch_path = root / "docs" / "ARCHITECTURE.md"
152
152
  arch_path.parent.mkdir(parents=True, exist_ok=True)
153
153
  arch_path.write_text(doc, encoding="utf-8")
154
154
  return arch_path
@@ -56,18 +56,20 @@ REQUIRED_FILES = [
56
56
  ]
57
57
 
58
58
  GOVERNANCE_FILES = [
59
- "docs/governance/rules.md",
60
- "docs/governance/workflow.md",
61
- "docs/governance/roles.md",
62
- "docs/governance/context-budget.md",
63
- "docs/governance/verification.md",
64
- "docs/governance/drift-metrics.md",
59
+ "docs/governance/RULES.md",
60
+ "docs/governance/WORKFLOW.md",
61
+ "docs/governance/ROLES.md",
62
+ "docs/governance/CONTEXT-BUDGET.md",
63
+ "docs/governance/VERIFICATION.md",
64
+ "docs/governance/DRIFT-METRICS.md",
65
65
  ]
66
66
 
67
67
  RECOMMENDED_FILES = [
68
68
  "docs/REQUIREMENTS.md",
69
69
  "docs/TEST_SPEC.md",
70
- "docs/architecture.md",
70
+ "docs/ARCHITECTURE.md",
71
+ "CONTRIBUTING.md",
72
+ "LICENSE",
71
73
  ]
72
74
 
73
75
 
@@ -294,33 +296,33 @@ def check_ledger_health(root: Path) -> list[AuditResult]:
294
296
  # Default thresholds (used when no project type is detected)
295
297
  _DEFAULT_THRESHOLDS: dict[str, int] = {
296
298
  "AGENTS.md": 200,
297
- "docs/governance/rules.md": 800,
298
- "docs/governance/workflow.md": 400,
299
- "docs/governance/roles.md": 300,
300
- "docs/governance/context-budget.md": 300,
301
- "docs/governance/verification.md": 400,
302
- "docs/governance/drift-metrics.md": 300,
299
+ "docs/governance/RULES.md": 800,
300
+ "docs/governance/WORKFLOW.md": 400,
301
+ "docs/governance/ROLES.md": 300,
302
+ "docs/governance/CONTEXT-BUDGET.md": 300,
303
+ "docs/governance/VERIFICATION.md": 400,
304
+ "docs/governance/DRIFT-METRICS.md": 300,
303
305
  }
304
306
 
305
307
  # Type-specific overrides — hardware/embedded projects have denser rules.
306
308
  _TYPE_THRESHOLD_OVERRIDES: dict[str, dict[str, int]] = {
307
309
  "fpga-rtl": {
308
- "docs/governance/rules.md": 1000,
309
- "docs/governance/workflow.md": 500,
310
- "docs/governance/verification.md": 600,
310
+ "docs/governance/RULES.md": 1000,
311
+ "docs/governance/WORKFLOW.md": 500,
312
+ "docs/governance/VERIFICATION.md": 600,
311
313
  },
312
314
  "yocto-bsp": {
313
- "docs/governance/rules.md": 1000,
314
- "docs/governance/workflow.md": 500,
315
- "docs/governance/verification.md": 500,
315
+ "docs/governance/RULES.md": 1000,
316
+ "docs/governance/WORKFLOW.md": 500,
317
+ "docs/governance/VERIFICATION.md": 500,
316
318
  },
317
319
  "embedded-hardware": {
318
- "docs/governance/rules.md": 1000,
319
- "docs/governance/verification.md": 500,
320
+ "docs/governance/RULES.md": 1000,
321
+ "docs/governance/VERIFICATION.md": 500,
320
322
  },
321
323
  "pcb-hardware": {
322
- "docs/governance/rules.md": 900,
323
- "docs/governance/verification.md": 500,
324
+ "docs/governance/RULES.md": 900,
325
+ "docs/governance/VERIFICATION.md": 500,
324
326
  },
325
327
  }
326
328
 
@@ -567,22 +569,22 @@ def run_auto_fix(root: Path, report: AuditReport) -> list[str]:
567
569
  pass # Best-effort
568
570
 
569
571
  # Fix missing recommended files
570
- elif result.name == "recommended:docs/architecture.md" and not result.passed:
572
+ elif result.name == "recommended:docs/ARCHITECTURE.md" and not result.passed:
571
573
  from specsmith.architect import generate_architecture
572
574
 
573
575
  try:
574
576
  generate_architecture(root)
575
- fixed.append("Generated docs/architecture.md from project scan")
577
+ fixed.append("Generated docs/ARCHITECTURE.md from project scan")
576
578
  except Exception: # noqa: BLE001
577
579
  # Fallback stub
578
- path = root / "docs" / "architecture.md"
580
+ path = root / "docs" / "ARCHITECTURE.md"
579
581
  path.parent.mkdir(parents=True, exist_ok=True)
580
582
  path.write_text(
581
583
  f"# Architecture — {root.name}\n\n"
582
584
  "[Run `specsmith architect` to populate]\n",
583
585
  encoding="utf-8",
584
586
  )
585
- fixed.append("Created stub docs/architecture.md")
587
+ fixed.append("Created stub docs/ARCHITECTURE.md")
586
588
 
587
589
  elif result.name == "recommended:docs/REQUIREMENTS.md" and not result.passed:
588
590
  path = root / "docs" / "REQUIREMENTS.md"
@@ -517,14 +517,14 @@ def import_project(project_dir: str, force: bool, guided: bool, dry_run: bool) -
517
517
  "LEDGER.md",
518
518
  "docs/REQUIREMENTS.md",
519
519
  "docs/TEST_SPEC.md",
520
- "docs/architecture.md",
520
+ "docs/ARCHITECTURE.md",
521
521
  "scaffold.yml",
522
- "docs/governance/rules.md",
523
- "docs/governance/workflow.md",
524
- "docs/governance/roles.md",
525
- "docs/governance/context-budget.md",
526
- "docs/governance/verification.md",
527
- "docs/governance/drift-metrics.md",
522
+ "docs/governance/RULES.md",
523
+ "docs/governance/WORKFLOW.md",
524
+ "docs/governance/ROLES.md",
525
+ "docs/governance/CONTEXT-BUDGET.md",
526
+ "docs/governance/VERIFICATION.md",
527
+ "docs/governance/DRIFT-METRICS.md",
528
528
  ]
529
529
  for f in overlay_files:
530
530
  exists = (root / f).exists()
@@ -145,6 +145,18 @@ class ProjectConfig(BaseModel):
145
145
  default="", description="Test framework detected by import"
146
146
  )
147
147
 
148
+ # License
149
+ license: str = Field(
150
+ default="MIT",
151
+ description="SPDX license identifier (MIT, Apache-2.0, GPL-3.0-only, etc.)",
152
+ )
153
+
154
+ # Community files
155
+ community_files: list[str] = Field(
156
+ default=["contributing", "license", "security", "coc", "pr-template", "issue-templates"],
157
+ description="Community/compliance files to generate",
158
+ )
159
+
148
160
  # Agent integrations
149
161
  integrations: list[str] = Field(
150
162
  default=["agents-md"],
@@ -13,12 +13,12 @@ from jinja2 import Environment, PackageLoader, select_autoescape
13
13
  from specsmith.config import ProjectConfig
14
14
 
15
15
  _GOVERNANCE_FILES: list[tuple[str, str]] = [
16
- ("governance/rules.md.j2", "docs/governance/rules.md"),
17
- ("governance/workflow.md.j2", "docs/governance/workflow.md"),
18
- ("governance/roles.md.j2", "docs/governance/roles.md"),
19
- ("governance/context-budget.md.j2", "docs/governance/context-budget.md"),
20
- ("governance/verification.md.j2", "docs/governance/verification.md"),
21
- ("governance/drift-metrics.md.j2", "docs/governance/drift-metrics.md"),
16
+ ("governance/rules.md.j2", "docs/governance/RULES.md"),
17
+ ("governance/workflow.md.j2", "docs/governance/WORKFLOW.md"),
18
+ ("governance/roles.md.j2", "docs/governance/ROLES.md"),
19
+ ("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
20
+ ("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
21
+ ("governance/drift-metrics.md.j2", "docs/governance/DRIFT-METRICS.md"),
22
22
  ]
23
23
 
24
24
 
@@ -136,11 +136,11 @@ def run_export(root: Path) -> str:
136
136
  "scaffold.yml",
137
137
  "docs/REQUIREMENTS.md",
138
138
  "docs/TEST_SPEC.md",
139
- "docs/architecture.md",
140
- "docs/governance/rules.md",
141
- "docs/governance/workflow.md",
142
- "docs/governance/roles.md",
143
- "docs/governance/verification.md",
139
+ "docs/ARCHITECTURE.md",
140
+ "docs/governance/RULES.md",
141
+ "docs/governance/WORKFLOW.md",
142
+ "docs/governance/ROLES.md",
143
+ "docs/governance/VERIFICATION.md",
144
144
  ]
145
145
  for gf in gov_files:
146
146
  exists = (root / gf).exists()
@@ -275,7 +275,7 @@ def detect_project(root: Path) -> DetectionResult:
275
275
  "GEMINI.md",
276
276
  "docs/REQUIREMENTS.md",
277
277
  "docs/TEST_SPEC.md",
278
- "docs/architecture.md",
278
+ "docs/ARCHITECTURE.md",
279
279
  ):
280
280
  if (root / gov_file).exists():
281
281
  result.existing_governance.append(gov_file)
@@ -1033,8 +1033,8 @@ def generate_overlay(
1033
1033
  _write("docs/TEST_SPEC.md", tests)
1034
1034
 
1035
1035
  # docs/architecture.md — skip if project has architecture doc anywhere under docs/
1036
- existing_arch = list(target.glob("docs/**/architecture*")) + list(
1037
- target.glob("docs/**/ARCHITECTURE*")
1036
+ existing_arch = list(target.glob("docs/**/ARCHITECTURE*")) + list(
1037
+ target.glob("docs/**/architecture*")
1038
1038
  )
1039
1039
  if not (existing_arch and not force):
1040
1040
  arch = (
@@ -1059,18 +1059,18 @@ def generate_overlay(
1059
1059
  arch += "## Language Distribution\n"
1060
1060
  for lang_name, count in sorted(result.languages.items(), key=lambda x: -x[1]):
1061
1061
  arch += f"- {lang_name}: {count} files\n"
1062
- _write("docs/architecture.md", arch)
1062
+ _write("docs/ARCHITECTURE.md", arch)
1063
1063
 
1064
1064
  # --- Modular governance files ---
1065
1065
  # If AGENTS.md exists and is rich, extract sections from it.
1066
1066
  # Otherwise use generic stubs.
1067
1067
  gov = _extract_governance_sections(target)
1068
- _write("docs/governance/rules.md", gov["rules"])
1069
- _write("docs/governance/workflow.md", gov["workflow"])
1070
- _write("docs/governance/roles.md", gov["roles"])
1071
- _write("docs/governance/context-budget.md", gov["context-budget"])
1072
- _write("docs/governance/verification.md", gov["verification"])
1073
- _write("docs/governance/drift-metrics.md", gov["drift-metrics"])
1068
+ _write("docs/governance/RULES.md", gov["rules"])
1069
+ _write("docs/governance/WORKFLOW.md", gov["workflow"])
1070
+ _write("docs/governance/ROLES.md", gov["roles"])
1071
+ _write("docs/governance/CONTEXT-BUDGET.md", gov["context-budget"])
1072
+ _write("docs/governance/VERIFICATION.md", gov["verification"])
1073
+ _write("docs/governance/DRIFT-METRICS.md", gov["drift-metrics"])
1074
1074
 
1075
1075
  # If existing AGENTS.md is oversized, back it up and replace with a hub.
1076
1076
  agents_path = target / "AGENTS.md"
@@ -1091,17 +1091,17 @@ def generate_overlay(
1091
1091
  "## Governance File Registry\n\n"
1092
1092
  "| File | Content | Load timing |\n"
1093
1093
  "| ---- | ------- | ----------- |\n"
1094
- "| `docs/governance/rules.md` | Hard rules, stop conditions, "
1094
+ "| `docs/governance/RULES.md` | Hard rules, stop conditions, "
1095
1095
  "project-specific rules | Every session start |\n"
1096
- "| `docs/governance/workflow.md` | Session lifecycle, "
1096
+ "| `docs/governance/WORKFLOW.md` | Session lifecycle, "
1097
1097
  "save/push protocol | Every session start |\n"
1098
- "| `docs/governance/roles.md` | Agent role boundaries | "
1098
+ "| `docs/governance/ROLES.md` | Agent role boundaries | "
1099
1099
  "Every session start |\n"
1100
- "| `docs/governance/context-budget.md` | Context management | "
1100
+ "| `docs/governance/CONTEXT-BUDGET.md` | Context management | "
1101
1101
  "Every session start |\n"
1102
- "| `docs/governance/verification.md` | Verification, "
1102
+ "| `docs/governance/VERIFICATION.md` | Verification, "
1103
1103
  "consistency | When verifying |\n"
1104
- "| `docs/governance/drift-metrics.md` | Environment, "
1104
+ "| `docs/governance/DRIFT-METRICS.md` | Environment, "
1105
1105
  "platform | On audit |\n\n"
1106
1106
  "Other project documents:\n\n"
1107
1107
  "| File | Content |\n"
@@ -1109,7 +1109,7 @@ def generate_overlay(
1109
1109
  "| `LEDGER.md` | Append-only work record |\n"
1110
1110
  "| `docs/REQUIREMENTS.md` | Formal requirements |\n"
1111
1111
  "| `docs/TEST_SPEC.md` | Test cases |\n"
1112
- "| `docs/architecture.md` | Architecture |\n\n"
1112
+ "| `docs/ARCHITECTURE.md` | Architecture |\n\n"
1113
1113
  "---\n\n"
1114
1114
  f"*Original AGENTS.md ({agents_lines} lines) backed up "
1115
1115
  "to AGENTS.md.bak. Content extracted into modular "
@@ -1126,6 +1126,21 @@ def generate_overlay(
1126
1126
  save_budget(target, CreditBudget()) # unlimited by default
1127
1127
  created.append(target / ".specsmith" / "credit-budget.json")
1128
1128
 
1129
+ # --- Community files (only create if missing) ---
1130
+ _write(
1131
+ "CONTRIBUTING.md",
1132
+ f"# Contributing to {name}\n\n"
1133
+ "See `AGENTS.md` for governance and `LEDGER.md` for session state.\n\n"
1134
+ "## Workflow\n"
1135
+ "All changes follow: propose \u2192 check \u2192 execute \u2192 verify \u2192 record.\n",
1136
+ )
1137
+ _write(
1138
+ "SECURITY.md",
1139
+ f"# Security Policy\n\n"
1140
+ f"To report a vulnerability in {name}, please use the repository's "
1141
+ "private vulnerability reporting feature. Do not open a public issue.\n",
1142
+ )
1143
+
1129
1144
  # --- CI config (merge: only create if no CI detected) ---
1130
1145
  if not result.existing_ci and result.vcs_platform:
1131
1146
  try:
@@ -34,5 +34,5 @@ class AiderAdapter(AgentAdapter):
34
34
  f"read:\n"
35
35
  f" - AGENTS.md\n"
36
36
  f" - LEDGER.md\n"
37
- f" - docs/governance/rules.md\n"
37
+ f" - docs/governance/RULES.md\n"
38
38
  )
@@ -48,7 +48,7 @@ Project type: {config.type_label}. Description: {config.description or "See READ
48
48
  ## Start here
49
49
  1. Read `AGENTS.md` for project identity, governance hub, and file registry
50
50
  2. Read `LEDGER.md` for session state and open TODOs
51
- 3. Read `docs/governance/rules.md` for hard rules
51
+ 3. Read `docs/governance/RULES.md` for hard rules
52
52
 
53
53
  ## Workflow
54
54
  All changes follow: propose → check → execute → verify → record.
@@ -49,7 +49,7 @@ Project type: {config.type_label} (Section {config.section_ref}).
49
49
  ## Required reading
50
50
  1. `AGENTS.md` — governance hub
51
51
  2. `LEDGER.md` — session state
52
- 3. `docs/governance/rules.md` — hard rules
52
+ 3. `docs/governance/RULES.md` — hard rules
53
53
 
54
54
  ## Workflow
55
55
  All changes: propose → check → execute → verify → record.
@@ -40,7 +40,7 @@ class GeminiAdapter(AgentAdapter):
40
40
  f"## Required reading\n"
41
41
  f"1. `AGENTS.md` — governance hub\n"
42
42
  f"2. `LEDGER.md` — session state and open TODOs\n"
43
- f"3. `docs/governance/rules.md` hard rules and stop conditions\n\n"
43
+ f"3. `docs/governance/RULES.md` \u2014 hard rules and stop conditions\n\n"
44
44
  f"## Constraints\n"
45
45
  f"- Keep AGENTS.md under 200 lines\n"
46
46
  f"- All agent-invoked commands must have timeouts\n"
@@ -53,7 +53,7 @@ Description: {config.description or "See README.md"}.
53
53
  ## Session Start
54
54
  1. Read `AGENTS.md` — the governance hub
55
55
  2. Read `LEDGER.md` — check last session state and open TODOs
56
- 3. Read `docs/governance/rules.md` — hard rules and stop conditions
56
+ 3. Read `docs/governance/RULES.md` — hard rules and stop conditions
57
57
 
58
58
  ## Workflow
59
59
  All changes follow: **propose → check → execute → verify → record**.
@@ -67,7 +67,7 @@ All changes follow: **propose → check → execute → verify → record**.
67
67
  - `docs/governance/` — modular governance docs (load on demand)
68
68
  - `docs/REQUIREMENTS.md` — formal requirements
69
69
  - `docs/TEST_SPEC.md` — test specifications
70
- - `docs/architecture.md` — system architecture
70
+ - `docs/ARCHITECTURE.md` — system architecture
71
71
 
72
72
  ## Session Start
73
73
  Before any work, run: `specsmith update --check --project-dir .`
@@ -35,7 +35,7 @@ class WindsurfAdapter(AgentAdapter):
35
35
  f"## Required reading\n"
36
36
  f"1. Read `AGENTS.md` — governance hub\n"
37
37
  f"2. Read `LEDGER.md` — session state\n"
38
- f"3. Read `docs/governance/rules.md` hard rules\n\n"
38
+ f"3. Read `docs/governance/RULES.md` \u2014 hard rules\n\n"
39
39
  f"## Workflow\n"
40
40
  f"All changes: propose → check → execute → verify → record.\n\n"
41
41
  f"## Constraints\n"
@@ -108,15 +108,15 @@ def _build_file_map(config: ProjectConfig) -> list[tuple[str, str]]:
108
108
  ("gitattributes.j2", ".gitattributes"),
109
109
  ("editorconfig.j2", ".editorconfig"),
110
110
  # Modular governance
111
- ("governance/rules.md.j2", "docs/governance/rules.md"),
112
- ("governance/workflow.md.j2", "docs/governance/workflow.md"),
113
- ("governance/roles.md.j2", "docs/governance/roles.md"),
114
- ("governance/context-budget.md.j2", "docs/governance/context-budget.md"),
115
- ("governance/verification.md.j2", "docs/governance/verification.md"),
116
- ("governance/drift-metrics.md.j2", "docs/governance/drift-metrics.md"),
111
+ ("governance/rules.md.j2", "docs/governance/RULES.md"),
112
+ ("governance/workflow.md.j2", "docs/governance/WORKFLOW.md"),
113
+ ("governance/roles.md.j2", "docs/governance/ROLES.md"),
114
+ ("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
115
+ ("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
116
+ ("governance/drift-metrics.md.j2", "docs/governance/DRIFT-METRICS.md"),
117
117
  # Project docs
118
- ("docs/architecture.md.j2", "docs/architecture.md"),
119
- ("docs/workflow.md.j2", "docs/workflow.md"),
118
+ ("docs/architecture.md.j2", "docs/ARCHITECTURE.md"),
119
+ ("docs/workflow.md.j2", "docs/WORKFLOW.md"),
120
120
  ("docs/requirements.md.j2", "docs/REQUIREMENTS.md"),
121
121
  ("docs/test-spec.md.j2", "docs/TEST_SPEC.md"),
122
122
  # Scripts
@@ -134,6 +134,9 @@ def _build_file_map(config: ProjectConfig) -> list[tuple[str, str]]:
134
134
  ]
135
135
  )
136
136
 
137
+ # Community / compliance files
138
+ files.extend(_build_community_files(config))
139
+
137
140
  # Python project types get pyproject.toml and src layout
138
141
  if config.type in (
139
142
  ProjectType.CLI_PYTHON,
@@ -375,5 +378,48 @@ def _get_empty_dirs(config: ProjectConfig, target: Path) -> list[Path]:
375
378
  return dirs
376
379
 
377
380
 
381
+ # License template mapping: SPDX ID → template filename
382
+ _LICENSE_TEMPLATES: dict[str, str] = {
383
+ "MIT": "community/license-MIT.j2",
384
+ "Apache-2.0": "community/license-Apache-2.0.j2",
385
+ }
386
+
387
+
388
+ def _build_community_files(config: ProjectConfig) -> list[tuple[str, str]]:
389
+ """Build community/compliance file map based on config.community_files."""
390
+ files: list[tuple[str, str]] = []
391
+ cf = set(config.community_files)
392
+
393
+ if "contributing" in cf:
394
+ files.append(("community/contributing.md.j2", "CONTRIBUTING.md"))
395
+
396
+ if "license" in cf:
397
+ tmpl = _LICENSE_TEMPLATES.get(config.license)
398
+ if tmpl:
399
+ files.append((tmpl, "LICENSE"))
400
+ # Unsupported license → skip (user provides their own)
401
+
402
+ if "security" in cf:
403
+ files.append(("community/security.md.j2", "SECURITY.md"))
404
+
405
+ if "coc" in cf:
406
+ files.append(("community/code_of_conduct.md.j2", "CODE_OF_CONDUCT.md"))
407
+
408
+ if "pr-template" in cf and config.vcs_platform == "github":
409
+ files.append(
410
+ ("community/pull_request_template.md.j2", ".github/PULL_REQUEST_TEMPLATE.md")
411
+ )
412
+
413
+ if "issue-templates" in cf and config.vcs_platform == "github":
414
+ files.extend(
415
+ [
416
+ ("community/bug_report.md.j2", ".github/ISSUE_TEMPLATE/bug_report.md"),
417
+ ("community/feature_request.md.j2", ".github/ISSUE_TEMPLATE/feature_request.md"),
418
+ ]
419
+ )
420
+
421
+ return files
422
+
423
+
378
424
  def _init_commands(config: ProjectConfig) -> None:
379
425
  """Placeholder for src/specsmith/commands/__init__.py."""
@@ -13,12 +13,12 @@ This project uses the modular governance layout. Read this file in full on every
13
13
 
14
14
  | File | Content | Load timing |
15
15
  | ---- | ------- | ----------- |
16
- | `docs/governance/rules.md` | Hard rules H1–H9, stop conditions | Every session start |
17
- | `docs/governance/workflow.md` | Session lifecycle, proposal format, ledger format | Every session start |
18
- | `docs/governance/roles.md` | Agent role boundaries, behavioral rules | Every session start |
19
- | `docs/governance/context-budget.md` | Context management, credit optimization | Every session start |
20
- | `docs/governance/verification.md` | Verification standards, acceptance criteria | When performing verification |
21
- | `docs/governance/drift-metrics.md` | Drift detection, feedback loops, health signals | On `audit` or session start |
16
+ | `docs/governance/RULES.md` | Hard rules H1–H9, stop conditions | Every session start |
17
+ | `docs/governance/WORKFLOW.md` | Session lifecycle, proposal format, ledger format | Every session start |
18
+ | `docs/governance/ROLES.md` | Agent role boundaries, behavioral rules | Every session start |
19
+ | `docs/governance/CONTEXT-BUDGET.md` | Context management, credit optimization | Every session start |
20
+ | `docs/governance/VERIFICATION.md` | Verification standards, acceptance criteria | When performing verification |
21
+ | `docs/governance/DRIFT-METRICS.md` | Drift detection, feedback loops, health signals | On `audit` or session start |
22
22
 
23
23
  Other project documents:
24
24
 
@@ -26,8 +26,8 @@ Other project documents:
26
26
  | ---- | ------- |
27
27
  | `README.md` | Project overview, structure, goals, status |
28
28
  | `LEDGER.md` | Append-only work record (sole authority for session state) |
29
- | `docs/architecture.md` | Components, boundaries, interfaces, platform expectations |
30
- | `docs/workflow.md` | Work loop, milestones, PR expectations |
29
+ | `docs/ARCHITECTURE.md` | Components, boundaries, interfaces, platform expectations |
30
+ | `docs/WORKFLOW.md` | Work loop, milestones, PR expectations |
31
31
  | `docs/REQUIREMENTS.md` | Formal, numbered, testable requirements |
32
32
  | `docs/TEST_SPEC.md` | Test cases linked to requirements |
33
33
 
@@ -38,10 +38,10 @@ Other project documents:
38
38
  1. **AGENTS.md + docs/governance/*** — highest (governance docs inherit this file's authority)
39
39
  2. **README.md** — project intent and scope
40
40
  3. **docs/REQUIREMENTS.md** — what the system must do
41
- 4. **docs/architecture.md** — how the system is structured
41
+ 4. **docs/ARCHITECTURE.md** — how the system is structured
42
42
  5. **docs/TEST_SPEC.md** — how the system is verified
43
43
  6. **LEDGER.md** — sole authority for session state
44
- 7. **docs/workflow.md** — how work proceeds
44
+ 7. **docs/WORKFLOW.md** — how work proceeds
45
45
 
46
46
  ---
47
47