specsmith 0.3.6.dev179__tar.gz → 0.3.6.dev181__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.3.6.dev179/src/specsmith.egg-info → specsmith-0.3.6.dev181}/PKG-INFO +21 -11
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/README.md +20 -10
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/pyproject.toml +1 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/auditor.py +44 -4
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/cli.py +30 -7
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/differ.py +15 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/exporter.py +2 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/importer.py +30 -7
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/phase.py +6 -6
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/scaffolder.py +13 -2
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/agents.md.j2 +237 -230
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/context-budget.md.j2 +2 -1
- specsmith-0.3.6.dev181/src/specsmith/templates/governance/lifecycle.md.j2 +44 -0
- specsmith-0.3.6.dev179/src/specsmith/templates/governance/workflow.md.j2 → specsmith-0.3.6.dev181/src/specsmith/templates/governance/session-protocol.md.j2 +1 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/readme.md.j2 +1 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/upgrader.py +27 -5
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181/src/specsmith.egg-info}/PKG-INFO +21 -11
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/SOURCES.txt +2 -2
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_auditor.py +2 -1
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_scaffolder.py +2 -1
- specsmith-0.3.6.dev179/src/specsmith/templates/docs/workflow.md.j2 +0 -15
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/LICENSE +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/setup.cfg +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/belief.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/certainty.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/py.typed +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/recovery.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/session.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/trace.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/__main__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/hooks.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/optimizer.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/planner.md +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/verifier.md +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/anthropic.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/gemini.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/mistral.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/ollama.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/openai.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/skills.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/architect.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/auth.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/compressor.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/config.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/credits.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/doctor.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/executor.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/warp.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/languages.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/ledger.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/patent.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/plugins.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/profiles.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/releaser.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/requirements.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/session.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/tools.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/trace.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/updater.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/validator.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/workspace.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_cli.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_compressor.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_epistemic.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_importer.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_integrations.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_optimizer.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_rate_limits.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_smoke.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_tools.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_validator.py +0 -0
- {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_vcs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.3.6.
|
|
3
|
+
Version: 0.3.6.dev181
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License-Expression: MIT
|
|
@@ -130,7 +130,15 @@ and a readiness percentage.
|
|
|
130
130
|
|
|
131
131
|
## Install
|
|
132
132
|
|
|
133
|
-
**Recommended —
|
|
133
|
+
**Recommended — via the VS Code extension (creates a project-isolated environment):**
|
|
134
|
+
|
|
135
|
+
1. Install the [specsmith AEE Workbench](https://github.com/BitConcepts/specsmith-vscode) VS Code extension
|
|
136
|
+
2. Open `Ctrl+Shift+,` (⚙ specsmith Settings)
|
|
137
|
+
3. Click **🔒 Create Environment** — creates `~/.specsmith/venv/` with specsmith + your provider packages
|
|
138
|
+
|
|
139
|
+
The extension uses this environment for all agent sessions and terminal commands.
|
|
140
|
+
|
|
141
|
+
**Or via pipx (system-wide):**
|
|
134
142
|
|
|
135
143
|
```bash
|
|
136
144
|
pipx install specsmith # core CLI + epistemic library
|
|
@@ -189,24 +197,26 @@ specsmith phase --project-dir ./my-project
|
|
|
189
197
|
The **specsmith AEE Workbench** VS Code extension is the flagship client:
|
|
190
198
|
|
|
191
199
|
```
|
|
192
|
-
# Install specsmith first, then:
|
|
193
200
|
# VS Code: Ctrl+Shift+P → specsmith: New Agent Session
|
|
194
|
-
# Settings
|
|
201
|
+
# Settings: Ctrl+Shift+, (⚙ specsmith Settings — global)
|
|
202
|
+
# Project Settings: Ctrl+Shift+G (⚙ Project Settings — per-project)
|
|
195
203
|
```
|
|
196
204
|
|
|
197
205
|
**Key features:**
|
|
198
|
-
- **
|
|
199
|
-
|
|
200
|
-
- **
|
|
206
|
+
- **Dual-panel architecture** — **⚙ specsmith Settings** (global: venv, version, Ollama, system)
|
|
207
|
+
and **⚙ Project Settings** (per-project: scaffold, tools, files, actions, execution)
|
|
208
|
+
- **Global environment management** — `~/.specsmith/venv/` with Create / Update / Rebuild / Delete;
|
|
209
|
+
persistent restart banner; Remove System Installs cleanup button
|
|
210
|
+
- **VCS context at session start** — git status + recent commits shown in chat and in system prompt
|
|
211
|
+
- **Execution profiles** — safe / standard / open / admin; custom allow/block command lists
|
|
212
|
+
- **AEE phase indicator** — shows current phase with readiness %, Next Phase button, phase selector
|
|
201
213
|
- **AI agent sessions** — independent process per project, JSONL bridge, chat with file injection
|
|
202
214
|
- **Live model listing** — Anthropic, OpenAI, Gemini, Mistral, local Ollama (GPU-aware)
|
|
203
|
-
- **Ollama integration** —
|
|
215
|
+
- **Ollama integration** — model manager (update/remove/update-all), version check, upgrade
|
|
204
216
|
- **FPGA/HDL tool support** — vivado, gtkwave, vsg, ghdl, verilator, yosys, nextpnr, and 15 more
|
|
205
217
|
- **Tool installer** — scan installed tools; one-click install via winget/brew/apt for missing tools
|
|
206
|
-
- **Tool rules** — curated AI context rules for 20+ tools (VSG, GHDL, Verilator, ruff, mypy, etc.) auto-injected into agent system prompt
|
|
207
218
|
- **API key management** — stored in OS credential store (Windows Credential Manager / macOS Keychain)
|
|
208
|
-
- **Update checker** — PyPI version check,
|
|
209
|
-
- **Auto-open** — Settings panel always opens alongside every new session; never a blank pane
|
|
219
|
+
- **Update checker** — PyPI version check, auto-checks on panel open, release channel selector
|
|
210
220
|
|
|
211
221
|
**[→ specsmith-vscode on GitHub](https://github.com/BitConcepts/specsmith-vscode)**
|
|
212
222
|
|
|
@@ -65,7 +65,15 @@ and a readiness percentage.
|
|
|
65
65
|
|
|
66
66
|
## Install
|
|
67
67
|
|
|
68
|
-
**Recommended —
|
|
68
|
+
**Recommended — via the VS Code extension (creates a project-isolated environment):**
|
|
69
|
+
|
|
70
|
+
1. Install the [specsmith AEE Workbench](https://github.com/BitConcepts/specsmith-vscode) VS Code extension
|
|
71
|
+
2. Open `Ctrl+Shift+,` (⚙ specsmith Settings)
|
|
72
|
+
3. Click **🔒 Create Environment** — creates `~/.specsmith/venv/` with specsmith + your provider packages
|
|
73
|
+
|
|
74
|
+
The extension uses this environment for all agent sessions and terminal commands.
|
|
75
|
+
|
|
76
|
+
**Or via pipx (system-wide):**
|
|
69
77
|
|
|
70
78
|
```bash
|
|
71
79
|
pipx install specsmith # core CLI + epistemic library
|
|
@@ -124,24 +132,26 @@ specsmith phase --project-dir ./my-project
|
|
|
124
132
|
The **specsmith AEE Workbench** VS Code extension is the flagship client:
|
|
125
133
|
|
|
126
134
|
```
|
|
127
|
-
# Install specsmith first, then:
|
|
128
135
|
# VS Code: Ctrl+Shift+P → specsmith: New Agent Session
|
|
129
|
-
# Settings
|
|
136
|
+
# Settings: Ctrl+Shift+, (⚙ specsmith Settings — global)
|
|
137
|
+
# Project Settings: Ctrl+Shift+G (⚙ Project Settings — per-project)
|
|
130
138
|
```
|
|
131
139
|
|
|
132
140
|
**Key features:**
|
|
133
|
-
- **
|
|
134
|
-
|
|
135
|
-
- **
|
|
141
|
+
- **Dual-panel architecture** — **⚙ specsmith Settings** (global: venv, version, Ollama, system)
|
|
142
|
+
and **⚙ Project Settings** (per-project: scaffold, tools, files, actions, execution)
|
|
143
|
+
- **Global environment management** — `~/.specsmith/venv/` with Create / Update / Rebuild / Delete;
|
|
144
|
+
persistent restart banner; Remove System Installs cleanup button
|
|
145
|
+
- **VCS context at session start** — git status + recent commits shown in chat and in system prompt
|
|
146
|
+
- **Execution profiles** — safe / standard / open / admin; custom allow/block command lists
|
|
147
|
+
- **AEE phase indicator** — shows current phase with readiness %, Next Phase button, phase selector
|
|
136
148
|
- **AI agent sessions** — independent process per project, JSONL bridge, chat with file injection
|
|
137
149
|
- **Live model listing** — Anthropic, OpenAI, Gemini, Mistral, local Ollama (GPU-aware)
|
|
138
|
-
- **Ollama integration** —
|
|
150
|
+
- **Ollama integration** — model manager (update/remove/update-all), version check, upgrade
|
|
139
151
|
- **FPGA/HDL tool support** — vivado, gtkwave, vsg, ghdl, verilator, yosys, nextpnr, and 15 more
|
|
140
152
|
- **Tool installer** — scan installed tools; one-click install via winget/brew/apt for missing tools
|
|
141
|
-
- **Tool rules** — curated AI context rules for 20+ tools (VSG, GHDL, Verilator, ruff, mypy, etc.) auto-injected into agent system prompt
|
|
142
153
|
- **API key management** — stored in OS credential store (Windows Credential Manager / macOS Keychain)
|
|
143
|
-
- **Update checker** — PyPI version check,
|
|
144
|
-
- **Auto-open** — Settings panel always opens alongside every new session; never a blank pane
|
|
154
|
+
- **Update checker** — PyPI version check, auto-checks on panel open, release channel selector
|
|
145
155
|
|
|
146
156
|
**[→ specsmith-vscode on GitHub](https://github.com/BitConcepts/specsmith-vscode)**
|
|
147
157
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.3.6.
|
|
7
|
+
version = "0.3.6.dev181"
|
|
8
8
|
description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -57,7 +57,8 @@ REQUIRED_FILES = [
|
|
|
57
57
|
|
|
58
58
|
GOVERNANCE_FILES = [
|
|
59
59
|
"docs/governance/RULES.md",
|
|
60
|
-
"docs/governance/
|
|
60
|
+
"docs/governance/SESSION-PROTOCOL.md",
|
|
61
|
+
"docs/governance/LIFECYCLE.md",
|
|
61
62
|
"docs/governance/ROLES.md",
|
|
62
63
|
"docs/governance/CONTEXT-BUDGET.md",
|
|
63
64
|
"docs/governance/VERIFICATION.md",
|
|
@@ -331,7 +332,8 @@ def check_ledger_health(root: Path) -> list[AuditResult]:
|
|
|
331
332
|
_DEFAULT_THRESHOLDS: dict[str, int] = {
|
|
332
333
|
"AGENTS.md": 200,
|
|
333
334
|
"docs/governance/RULES.md": 800,
|
|
334
|
-
"docs/governance/
|
|
335
|
+
"docs/governance/SESSION-PROTOCOL.md": 400,
|
|
336
|
+
"docs/governance/LIFECYCLE.md": 200,
|
|
335
337
|
"docs/governance/ROLES.md": 300,
|
|
336
338
|
"docs/governance/CONTEXT-BUDGET.md": 300,
|
|
337
339
|
"docs/governance/VERIFICATION.md": 400,
|
|
@@ -342,12 +344,12 @@ _DEFAULT_THRESHOLDS: dict[str, int] = {
|
|
|
342
344
|
_TYPE_THRESHOLD_OVERRIDES: dict[str, dict[str, int]] = {
|
|
343
345
|
"fpga-rtl": {
|
|
344
346
|
"docs/governance/RULES.md": 1000,
|
|
345
|
-
"docs/governance/
|
|
347
|
+
"docs/governance/SESSION-PROTOCOL.md": 500,
|
|
346
348
|
"docs/governance/VERIFICATION.md": 600,
|
|
347
349
|
},
|
|
348
350
|
"yocto-bsp": {
|
|
349
351
|
"docs/governance/RULES.md": 1000,
|
|
350
|
-
"docs/governance/
|
|
352
|
+
"docs/governance/SESSION-PROTOCOL.md": 500,
|
|
351
353
|
"docs/governance/VERIFICATION.md": 500,
|
|
352
354
|
},
|
|
353
355
|
"embedded-hardware": {
|
|
@@ -579,6 +581,43 @@ def check_trace_chain_integrity(root: Path) -> list[AuditResult]:
|
|
|
579
581
|
return []
|
|
580
582
|
|
|
581
583
|
|
|
584
|
+
def check_phase_readiness(root: Path) -> list[AuditResult]:
|
|
585
|
+
"""Check AEE phase readiness (advisory — failed checks are warnings)."""
|
|
586
|
+
results: list[AuditResult] = []
|
|
587
|
+
scaffold_path = root / "scaffold.yml"
|
|
588
|
+
if not scaffold_path.exists():
|
|
589
|
+
return results
|
|
590
|
+
|
|
591
|
+
from specsmith.phase import PHASE_MAP, evaluate_phase, read_phase
|
|
592
|
+
|
|
593
|
+
phase_key = read_phase(root)
|
|
594
|
+
phase = PHASE_MAP.get(phase_key)
|
|
595
|
+
if not phase:
|
|
596
|
+
return results
|
|
597
|
+
|
|
598
|
+
passed, failed = evaluate_phase(phase, root)
|
|
599
|
+
pct = int(len(passed) / len(phase.checks) * 100) if phase.checks else 100
|
|
600
|
+
|
|
601
|
+
if failed:
|
|
602
|
+
results.append(
|
|
603
|
+
AuditResult(
|
|
604
|
+
name="phase-readiness",
|
|
605
|
+
passed=True, # advisory — don't fail the audit
|
|
606
|
+
message=(
|
|
607
|
+
f"Phase {phase.emoji} {phase.label}: {pct}% ready "
|
|
608
|
+
f"({len(failed)} check(s) remaining: {', '.join(failed[:3])})"
|
|
609
|
+
),
|
|
610
|
+
)
|
|
611
|
+
)
|
|
612
|
+
else:
|
|
613
|
+
msg = f"Phase {phase.emoji} {phase.label}: 100% ready"
|
|
614
|
+
if phase.next_phase:
|
|
615
|
+
msg += f" — run `specsmith phase next` to advance to {phase.next_phase}"
|
|
616
|
+
results.append(AuditResult(name="phase-readiness", passed=True, message=msg))
|
|
617
|
+
|
|
618
|
+
return results
|
|
619
|
+
|
|
620
|
+
|
|
582
621
|
def run_audit(root: Path) -> AuditReport:
|
|
583
622
|
"""Run all audit checks and return a report."""
|
|
584
623
|
report = AuditReport()
|
|
@@ -589,6 +628,7 @@ def run_audit(root: Path) -> AuditReport:
|
|
|
589
628
|
report.results.extend(check_tool_configuration(root))
|
|
590
629
|
report.results.extend(check_type_mismatch(root))
|
|
591
630
|
report.results.extend(check_trace_chain_integrity(root))
|
|
631
|
+
report.results.extend(check_phase_readiness(root))
|
|
592
632
|
return report
|
|
593
633
|
|
|
594
634
|
|
|
@@ -184,6 +184,11 @@ def init(config_path: str | None, output_dir: str, no_git: bool, guided: bool) -
|
|
|
184
184
|
with open(config_out, "w") as fh:
|
|
185
185
|
yaml.dump(cfg.model_dump(mode="json"), fh, default_flow_style=False, sort_keys=False)
|
|
186
186
|
|
|
187
|
+
# Ensure AEE phase is set (write_phase appends to scaffold.yml)
|
|
188
|
+
from specsmith.phase import write_phase
|
|
189
|
+
|
|
190
|
+
write_phase(target, "inception")
|
|
191
|
+
|
|
187
192
|
|
|
188
193
|
def _load_config_with_inheritance(config_path: str) -> dict[str, object]:
|
|
189
194
|
"""Load scaffold.yml, merging parent config if `extends` is set."""
|
|
@@ -641,7 +646,8 @@ def import_project(
|
|
|
641
646
|
"docs/ARCHITECTURE.md",
|
|
642
647
|
"scaffold.yml",
|
|
643
648
|
"docs/governance/RULES.md",
|
|
644
|
-
"docs/governance/
|
|
649
|
+
"docs/governance/SESSION-PROTOCOL.md",
|
|
650
|
+
"docs/governance/LIFECYCLE.md",
|
|
645
651
|
"docs/governance/ROLES.md",
|
|
646
652
|
"docs/governance/CONTEXT-BUDGET.md",
|
|
647
653
|
"docs/governance/VERIFICATION.md",
|
|
@@ -682,6 +688,11 @@ def import_project(
|
|
|
682
688
|
yaml.dump(config.model_dump(mode="json"), fh, default_flow_style=False, sort_keys=False)
|
|
683
689
|
console.print(" [green]\u2713[/green] scaffold.yml")
|
|
684
690
|
|
|
691
|
+
# Ensure AEE phase is set
|
|
692
|
+
from specsmith.phase import write_phase
|
|
693
|
+
|
|
694
|
+
write_phase(root, "inception")
|
|
695
|
+
|
|
685
696
|
# Guided architecture definition after import
|
|
686
697
|
if guided:
|
|
687
698
|
guided_files = _run_guided_architecture(config, root)
|
|
@@ -3442,14 +3453,26 @@ def phase_status(project_dir: str) -> None:
|
|
|
3442
3453
|
|
|
3443
3454
|
|
|
3444
3455
|
@phase_group.command(name="list")
|
|
3445
|
-
|
|
3446
|
-
|
|
3447
|
-
|
|
3456
|
+
@click.option("--project-dir", type=click.Path(exists=True), default=".")
|
|
3457
|
+
def phase_list(project_dir: str) -> None:
|
|
3458
|
+
"""List all AEE lifecycle phases with current position highlighted."""
|
|
3459
|
+
from specsmith.phase import PHASES, read_phase
|
|
3448
3460
|
|
|
3449
|
-
|
|
3461
|
+
root = Path(project_dir).resolve()
|
|
3462
|
+
current = read_phase(root)
|
|
3463
|
+
|
|
3464
|
+
console.print("[bold]AEE Project Lifecycle[/bold]\n")
|
|
3465
|
+
console.print(
|
|
3466
|
+
" inception \u2192 architecture \u2192 requirements \u2192 test_spec "
|
|
3467
|
+
"\u2192 implementation \u2192 verification \u2192 release\n"
|
|
3468
|
+
)
|
|
3450
3469
|
for i, p in enumerate(PHASES, 1):
|
|
3451
|
-
|
|
3452
|
-
|
|
3470
|
+
marker = "[bold cyan]\u25b6[/bold cyan]" if p.key == current else " "
|
|
3471
|
+
style = "bold cyan" if p.key == current else ""
|
|
3472
|
+
console.print(
|
|
3473
|
+
f" {marker} {i}. {p.emoji} [{style}]{p.label:<20s}[/{style}] {p.description}"
|
|
3474
|
+
)
|
|
3475
|
+
console.print(f"\n Current: [bold]{current}[/bold]")
|
|
3453
3476
|
|
|
3454
3477
|
|
|
3455
3478
|
main.add_command(phase_group)
|
|
@@ -14,7 +14,8 @@ from specsmith.config import ProjectConfig
|
|
|
14
14
|
|
|
15
15
|
_GOVERNANCE_FILES: list[tuple[str, str]] = [
|
|
16
16
|
("governance/rules.md.j2", "docs/governance/RULES.md"),
|
|
17
|
-
("governance/
|
|
17
|
+
("governance/session-protocol.md.j2", "docs/governance/SESSION-PROTOCOL.md"),
|
|
18
|
+
("governance/lifecycle.md.j2", "docs/governance/LIFECYCLE.md"),
|
|
18
19
|
("governance/roles.md.j2", "docs/governance/ROLES.md"),
|
|
19
20
|
("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
|
|
20
21
|
("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
|
|
@@ -47,13 +48,19 @@ def run_diff(root: Path) -> list[tuple[str, str]]:
|
|
|
47
48
|
lstrip_blocks=True,
|
|
48
49
|
)
|
|
49
50
|
|
|
51
|
+
from specsmith.phase import PHASE_MAP, read_phase
|
|
50
52
|
from specsmith.tools import get_tools
|
|
51
53
|
|
|
54
|
+
phase_key = read_phase(root)
|
|
55
|
+
phase_obj = PHASE_MAP.get(phase_key, PHASE_MAP["inception"])
|
|
52
56
|
ctx = {
|
|
53
57
|
"project": config,
|
|
54
58
|
"today": date.today().isoformat(),
|
|
55
59
|
"package_name": config.package_name,
|
|
56
60
|
"tools": get_tools(config),
|
|
61
|
+
"aee_phase": phase_key,
|
|
62
|
+
"aee_phase_label": phase_obj.label,
|
|
63
|
+
"aee_phase_emoji": phase_obj.emoji,
|
|
57
64
|
}
|
|
58
65
|
|
|
59
66
|
results: list[tuple[str, str]] = []
|
|
@@ -101,11 +108,18 @@ def run_diff_html(root: Path) -> str:
|
|
|
101
108
|
trim_blocks=True,
|
|
102
109
|
lstrip_blocks=True,
|
|
103
110
|
)
|
|
111
|
+
from specsmith.phase import PHASE_MAP, read_phase
|
|
112
|
+
|
|
113
|
+
phase_key = read_phase(root)
|
|
114
|
+
phase_obj = PHASE_MAP.get(phase_key, PHASE_MAP["inception"])
|
|
104
115
|
ctx = {
|
|
105
116
|
"project": config,
|
|
106
117
|
"today": date.today().isoformat(),
|
|
107
118
|
"package_name": config.package_name,
|
|
108
119
|
"tools": get_tools(config),
|
|
120
|
+
"aee_phase": phase_key,
|
|
121
|
+
"aee_phase_label": phase_obj.label,
|
|
122
|
+
"aee_phase_emoji": phase_obj.emoji,
|
|
109
123
|
}
|
|
110
124
|
|
|
111
125
|
differ = difflib.HtmlDiff(wrapcolumn=80)
|
|
@@ -138,7 +138,8 @@ def run_export(root: Path) -> str:
|
|
|
138
138
|
"docs/TEST_SPEC.md",
|
|
139
139
|
"docs/ARCHITECTURE.md",
|
|
140
140
|
"docs/governance/RULES.md",
|
|
141
|
-
"docs/governance/
|
|
141
|
+
"docs/governance/SESSION-PROTOCOL.md",
|
|
142
|
+
"docs/governance/LIFECYCLE.md",
|
|
142
143
|
"docs/governance/ROLES.md",
|
|
143
144
|
"docs/governance/VERIFICATION.md",
|
|
144
145
|
]
|
|
@@ -877,8 +877,8 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
|
|
|
877
877
|
"H2: All proposals require human approval.\n"
|
|
878
878
|
"H3: The ledger is append-only.\n"
|
|
879
879
|
),
|
|
880
|
-
"
|
|
881
|
-
"#
|
|
880
|
+
"session-protocol": (
|
|
881
|
+
"# Session Protocol\n\n"
|
|
882
882
|
"1. Propose changes\n2. Get approval\n"
|
|
883
883
|
"3. Execute\n4. Verify\n5. Record in ledger\n"
|
|
884
884
|
),
|
|
@@ -935,7 +935,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
|
|
|
935
935
|
# Classify each section into a governance category
|
|
936
936
|
category_map: list[tuple[str, list[str]]] = [
|
|
937
937
|
("rules", _RULES_KW),
|
|
938
|
-
("
|
|
938
|
+
("session-protocol", _WORKFLOW_KW),
|
|
939
939
|
("roles", _ROLES_KW),
|
|
940
940
|
("context-budget", _CTX_KW),
|
|
941
941
|
("verification", _VERIFY_KW),
|
|
@@ -944,7 +944,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
|
|
|
944
944
|
|
|
945
945
|
buckets: dict[str, list[tuple[str, str]]] = {
|
|
946
946
|
"rules": [],
|
|
947
|
-
"
|
|
947
|
+
"session-protocol": [],
|
|
948
948
|
"roles": [],
|
|
949
949
|
"context-budget": [],
|
|
950
950
|
"verification": [],
|
|
@@ -1007,7 +1007,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
|
|
|
1007
1007
|
# Build output
|
|
1008
1008
|
titles = {
|
|
1009
1009
|
"rules": "# Rules",
|
|
1010
|
-
"
|
|
1010
|
+
"session-protocol": "# Session Protocol",
|
|
1011
1011
|
"roles": "# Roles",
|
|
1012
1012
|
"context-budget": "# Context Budget",
|
|
1013
1013
|
"verification": "# Verification",
|
|
@@ -1279,12 +1279,33 @@ def generate_overlay(
|
|
|
1279
1279
|
# Otherwise use generic stubs.
|
|
1280
1280
|
gov = _extract_governance_sections(target)
|
|
1281
1281
|
_write("docs/governance/RULES.md", gov["rules"])
|
|
1282
|
-
_write("docs/governance/
|
|
1282
|
+
_write("docs/governance/SESSION-PROTOCOL.md", gov["session-protocol"])
|
|
1283
|
+
_write(
|
|
1284
|
+
"docs/governance/LIFECYCLE.md",
|
|
1285
|
+
"# Project Lifecycle\n\n"
|
|
1286
|
+
"See `specsmith phase show` for current phase readiness.\n"
|
|
1287
|
+
"See `specsmith phase list` for the full AEE lifecycle.\n",
|
|
1288
|
+
)
|
|
1283
1289
|
_write("docs/governance/ROLES.md", gov["roles"])
|
|
1284
1290
|
_write("docs/governance/CONTEXT-BUDGET.md", gov["context-budget"])
|
|
1285
1291
|
_write("docs/governance/VERIFICATION.md", gov["verification"])
|
|
1286
1292
|
_write("docs/governance/DRIFT-METRICS.md", gov["drift-metrics"])
|
|
1287
1293
|
|
|
1294
|
+
# Migrate old WORKFLOW.md files if found
|
|
1295
|
+
import shutil as _shutil
|
|
1296
|
+
|
|
1297
|
+
old_gov_wf = target / "docs" / "governance" / "WORKFLOW.md"
|
|
1298
|
+
new_sp = target / "docs" / "governance" / "SESSION-PROTOCOL.md"
|
|
1299
|
+
if old_gov_wf.exists() and not new_sp.exists():
|
|
1300
|
+
_shutil.move(str(old_gov_wf), str(new_sp))
|
|
1301
|
+
created.append(new_sp)
|
|
1302
|
+
elif old_gov_wf.exists():
|
|
1303
|
+
old_gov_wf.unlink() # new file already exists, remove old one
|
|
1304
|
+
|
|
1305
|
+
old_doc_wf = target / "docs" / "WORKFLOW.md"
|
|
1306
|
+
if old_doc_wf.exists():
|
|
1307
|
+
old_doc_wf.unlink() # replaced by LIFECYCLE.md + phase system
|
|
1308
|
+
|
|
1288
1309
|
# If existing AGENTS.md is oversized, back it up and replace with a hub.
|
|
1289
1310
|
agents_path = target / "AGENTS.md"
|
|
1290
1311
|
if agents_path.exists():
|
|
@@ -1306,8 +1327,10 @@ def generate_overlay(
|
|
|
1306
1327
|
"| ---- | ------- | ----------- |\n"
|
|
1307
1328
|
"| `docs/governance/RULES.md` | Hard rules, stop conditions, "
|
|
1308
1329
|
"project-specific rules | Every session start |\n"
|
|
1309
|
-
"| `docs/governance/
|
|
1330
|
+
"| `docs/governance/SESSION-PROTOCOL.md` | Session lifecycle, "
|
|
1310
1331
|
"save/push protocol | Every session start |\n"
|
|
1332
|
+
"| `docs/governance/LIFECYCLE.md` | AEE phase lifecycle, "
|
|
1333
|
+
"readiness gates | Every session start |\n"
|
|
1311
1334
|
"| `docs/governance/ROLES.md` | Agent role boundaries | "
|
|
1312
1335
|
"Every session start |\n"
|
|
1313
1336
|
"| `docs/governance/CONTEXT-BUDGET.md` | Context management | "
|
|
@@ -184,7 +184,7 @@ PHASES: list[Phase] = [
|
|
|
184
184
|
"ARCHITECTURE.md has content",
|
|
185
185
|
_file_min_lines("docs/ARCHITECTURE.md", 20),
|
|
186
186
|
),
|
|
187
|
-
PhaseCheck("AGENTS.md
|
|
187
|
+
PhaseCheck("AGENTS.md has substantial content", _file_min_lines("AGENTS.md", 30)),
|
|
188
188
|
PhaseCheck("Trace vault has at least 1 seal", _trace_vault_exists()),
|
|
189
189
|
],
|
|
190
190
|
commands=[
|
|
@@ -207,7 +207,7 @@ PHASES: list[Phase] = [
|
|
|
207
207
|
PhaseCheck("At least 5 requirements defined", _req_count(5)),
|
|
208
208
|
PhaseCheck("TEST_SPEC.md exists", _file_exists("docs/TEST_SPEC.md")),
|
|
209
209
|
PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
|
|
210
|
-
PhaseCheck("
|
|
210
|
+
PhaseCheck("REQUIREMENTS.md has content", _file_min_lines("REQUIREMENTS.md", 10)),
|
|
211
211
|
],
|
|
212
212
|
commands=[
|
|
213
213
|
"specsmith stress-test",
|
|
@@ -230,7 +230,7 @@ PHASES: list[Phase] = [
|
|
|
230
230
|
),
|
|
231
231
|
PhaseCheck("TEST coverage ≥ 80 %", _test_spec_covers_reqs(80)),
|
|
232
232
|
PhaseCheck("REQUIREMENTS.md has ≥ 5 REQs", _req_count(5)),
|
|
233
|
-
PhaseCheck("
|
|
233
|
+
PhaseCheck("LEDGER.md exists", _file_exists("LEDGER.md")),
|
|
234
234
|
],
|
|
235
235
|
commands=[
|
|
236
236
|
"specsmith validate",
|
|
@@ -267,7 +267,7 @@ PHASES: list[Phase] = [
|
|
|
267
267
|
PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
|
|
268
268
|
PhaseCheck("TEST coverage ≥ 80 %", _test_spec_covers_reqs(80)),
|
|
269
269
|
PhaseCheck("Trace vault has seals", _trace_vault_exists()),
|
|
270
|
-
PhaseCheck("
|
|
270
|
+
PhaseCheck("Trace vault has ≥ 2 seals", _trace_vault_exists()),
|
|
271
271
|
PhaseCheck("LEDGER.md has content", _file_min_lines("LEDGER.md", 10)),
|
|
272
272
|
],
|
|
273
273
|
commands=[
|
|
@@ -286,8 +286,8 @@ PHASES: list[Phase] = [
|
|
|
286
286
|
checks=[
|
|
287
287
|
PhaseCheck("CHANGELOG.md has version entry", _changelog_has_version()),
|
|
288
288
|
PhaseCheck("Trace vault has seals", _trace_vault_exists()),
|
|
289
|
-
PhaseCheck("
|
|
290
|
-
PhaseCheck("
|
|
289
|
+
PhaseCheck("CHANGELOG.md exists", _file_exists("CHANGELOG.md")),
|
|
290
|
+
PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
|
|
291
291
|
],
|
|
292
292
|
commands=[
|
|
293
293
|
"specsmith export --output docs/COMPLIANCE.md",
|
|
@@ -11,6 +11,7 @@ from pathlib import Path
|
|
|
11
11
|
from jinja2 import Environment, PackageLoader, select_autoescape
|
|
12
12
|
|
|
13
13
|
from specsmith.config import ProjectConfig, ProjectType
|
|
14
|
+
from specsmith.phase import PHASE_MAP
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
|
|
@@ -29,11 +30,16 @@ def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
|
|
|
29
30
|
from specsmith.tools import get_tools
|
|
30
31
|
|
|
31
32
|
tools = get_tools(config)
|
|
33
|
+
phase_key = "inception" # new projects always start at inception
|
|
34
|
+
phase_obj = PHASE_MAP[phase_key]
|
|
32
35
|
ctx = {
|
|
33
36
|
"project": config,
|
|
34
37
|
"today": date.today().isoformat(),
|
|
35
38
|
"package_name": config.package_name,
|
|
36
39
|
"tools": tools,
|
|
40
|
+
"aee_phase": phase_key,
|
|
41
|
+
"aee_phase_label": phase_obj.label,
|
|
42
|
+
"aee_phase_emoji": phase_obj.emoji,
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
created: list[Path] = []
|
|
@@ -86,6 +92,11 @@ def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
|
|
|
86
92
|
save_budget(target, CreditBudget()) # unlimited by default
|
|
87
93
|
created.append(target / ".specsmith" / "credit-budget.json")
|
|
88
94
|
|
|
95
|
+
# Set initial AEE phase in scaffold.yml
|
|
96
|
+
from specsmith.phase import write_phase
|
|
97
|
+
|
|
98
|
+
write_phase(target, "inception")
|
|
99
|
+
|
|
89
100
|
# Git init
|
|
90
101
|
if config.git_init:
|
|
91
102
|
subprocess.run( # noqa: S603
|
|
@@ -109,14 +120,14 @@ def _build_file_map(config: ProjectConfig) -> list[tuple[str, str]]:
|
|
|
109
120
|
("editorconfig.j2", ".editorconfig"),
|
|
110
121
|
# Modular governance
|
|
111
122
|
("governance/rules.md.j2", "docs/governance/RULES.md"),
|
|
112
|
-
("governance/
|
|
123
|
+
("governance/session-protocol.md.j2", "docs/governance/SESSION-PROTOCOL.md"),
|
|
124
|
+
("governance/lifecycle.md.j2", "docs/governance/LIFECYCLE.md"),
|
|
113
125
|
("governance/roles.md.j2", "docs/governance/ROLES.md"),
|
|
114
126
|
("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
|
|
115
127
|
("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
|
|
116
128
|
("governance/drift-metrics.md.j2", "docs/governance/DRIFT-METRICS.md"),
|
|
117
129
|
# Project docs
|
|
118
130
|
("docs/architecture.md.j2", "docs/ARCHITECTURE.md"),
|
|
119
|
-
("docs/workflow.md.j2", "docs/WORKFLOW.md"),
|
|
120
131
|
("docs/requirements.md.j2", "docs/REQUIREMENTS.md"),
|
|
121
132
|
("docs/test-spec.md.j2", "docs/TEST_SPEC.md"),
|
|
122
133
|
# Scripts
|