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.
- {specsmith-0.1.4.dev35/src/specsmith.egg-info → specsmith-0.1.4.dev37}/PKG-INFO +33 -8
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/README.md +32 -7
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/pyproject.toml +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/architect.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/auditor.py +29 -27
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/cli.py +7 -7
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/config.py +12 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/differ.py +6 -6
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/exporter.py +5 -5
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/importer.py +32 -17
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/aider.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/claude_code.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/cursor.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/gemini.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/warp.py +2 -2
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/windsurf.py +1 -1
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/scaffolder.py +54 -8
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/agents.md.j2 +10 -10
- specsmith-0.1.4.dev37/src/specsmith/templates/community/bug_report.md.j2 +34 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/code_of_conduct.md.j2 +30 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/contributing.md.j2 +59 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/feature_request.md.j2 +26 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/license-Apache-2.0.j2 +17 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/license-MIT.j2 +21 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/pull_request_template.md.j2 +29 -0
- specsmith-0.1.4.dev37/src/specsmith/templates/community/security.md.j2 +32 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/context-budget.md.j2 +7 -7
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/upgrader.py +59 -6
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37/src/specsmith.egg-info}/PKG-INFO +33 -8
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/SOURCES.txt +8 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_validator.py +4 -4
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/LICENSE +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/setup.cfg +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/__init__.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/__main__.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/compressor.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/credits.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/doctor.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/ledger.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/plugins.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/releaser.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/requirements.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/session.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/pyproject.toml.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/tools.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/updater.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/validator.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_auditor.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_cli.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_compressor.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_importer.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_integrations.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_scaffolder.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_smoke.py +0 -0
- {specsmith-0.1.4.dev35 → specsmith-0.1.4.dev37}/tests/test_tools.py +0 -0
- {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.
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
specsmith
|
|
87
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
specsmith
|
|
44
|
-
|
|
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
|
-
##
|
|
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.
|
|
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" / "
|
|
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/
|
|
60
|
-
"docs/governance/
|
|
61
|
-
"docs/governance/
|
|
62
|
-
"docs/governance/
|
|
63
|
-
"docs/governance/
|
|
64
|
-
"docs/governance/
|
|
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/
|
|
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/
|
|
298
|
-
"docs/governance/
|
|
299
|
-
"docs/governance/
|
|
300
|
-
"docs/governance/
|
|
301
|
-
"docs/governance/
|
|
302
|
-
"docs/governance/
|
|
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/
|
|
309
|
-
"docs/governance/
|
|
310
|
-
"docs/governance/
|
|
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/
|
|
314
|
-
"docs/governance/
|
|
315
|
-
"docs/governance/
|
|
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/
|
|
319
|
-
"docs/governance/
|
|
320
|
+
"docs/governance/RULES.md": 1000,
|
|
321
|
+
"docs/governance/VERIFICATION.md": 500,
|
|
320
322
|
},
|
|
321
323
|
"pcb-hardware": {
|
|
322
|
-
"docs/governance/
|
|
323
|
-
"docs/governance/
|
|
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/
|
|
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/
|
|
577
|
+
fixed.append("Generated docs/ARCHITECTURE.md from project scan")
|
|
576
578
|
except Exception: # noqa: BLE001
|
|
577
579
|
# Fallback stub
|
|
578
|
-
path = root / "docs" / "
|
|
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/
|
|
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/
|
|
520
|
+
"docs/ARCHITECTURE.md",
|
|
521
521
|
"scaffold.yml",
|
|
522
|
-
"docs/governance/
|
|
523
|
-
"docs/governance/
|
|
524
|
-
"docs/governance/
|
|
525
|
-
"docs/governance/
|
|
526
|
-
"docs/governance/
|
|
527
|
-
"docs/governance/
|
|
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/
|
|
17
|
-
("governance/workflow.md.j2", "docs/governance/
|
|
18
|
-
("governance/roles.md.j2", "docs/governance/
|
|
19
|
-
("governance/context-budget.md.j2", "docs/governance/
|
|
20
|
-
("governance/verification.md.j2", "docs/governance/
|
|
21
|
-
("governance/drift-metrics.md.j2", "docs/governance/
|
|
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/
|
|
140
|
-
"docs/governance/
|
|
141
|
-
"docs/governance/
|
|
142
|
-
"docs/governance/
|
|
143
|
-
"docs/governance/
|
|
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/
|
|
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/**/
|
|
1037
|
-
target.glob("docs/**/
|
|
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/
|
|
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/
|
|
1069
|
-
_write("docs/governance/
|
|
1070
|
-
_write("docs/governance/
|
|
1071
|
-
_write("docs/governance/
|
|
1072
|
-
_write("docs/governance/
|
|
1073
|
-
_write("docs/governance/
|
|
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/
|
|
1094
|
+
"| `docs/governance/RULES.md` | Hard rules, stop conditions, "
|
|
1095
1095
|
"project-specific rules | Every session start |\n"
|
|
1096
|
-
"| `docs/governance/
|
|
1096
|
+
"| `docs/governance/WORKFLOW.md` | Session lifecycle, "
|
|
1097
1097
|
"save/push protocol | Every session start |\n"
|
|
1098
|
-
"| `docs/governance/
|
|
1098
|
+
"| `docs/governance/ROLES.md` | Agent role boundaries | "
|
|
1099
1099
|
"Every session start |\n"
|
|
1100
|
-
"| `docs/governance/
|
|
1100
|
+
"| `docs/governance/CONTEXT-BUDGET.md` | Context management | "
|
|
1101
1101
|
"Every session start |\n"
|
|
1102
|
-
"| `docs/governance/
|
|
1102
|
+
"| `docs/governance/VERIFICATION.md` | Verification, "
|
|
1103
1103
|
"consistency | When verifying |\n"
|
|
1104
|
-
"| `docs/governance/
|
|
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/
|
|
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:
|
|
@@ -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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
112
|
-
("governance/workflow.md.j2", "docs/governance/
|
|
113
|
-
("governance/roles.md.j2", "docs/governance/
|
|
114
|
-
("governance/context-budget.md.j2", "docs/governance/
|
|
115
|
-
("governance/verification.md.j2", "docs/governance/
|
|
116
|
-
("governance/drift-metrics.md.j2", "docs/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"),
|
|
117
117
|
# Project docs
|
|
118
|
-
("docs/architecture.md.j2", "docs/
|
|
119
|
-
("docs/workflow.md.j2", "docs/
|
|
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/
|
|
17
|
-
| `docs/governance/
|
|
18
|
-
| `docs/governance/
|
|
19
|
-
| `docs/governance/
|
|
20
|
-
| `docs/governance/
|
|
21
|
-
| `docs/governance/
|
|
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/
|
|
30
|
-
| `docs/
|
|
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/
|
|
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/
|
|
44
|
+
7. **docs/WORKFLOW.md** — how work proceeds
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|