specsmith 0.15.3.dev573__tar.gz → 0.15.3.dev586__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.15.3.dev573/src/specsmith.egg-info → specsmith-0.15.3.dev586}/PKG-INFO +44 -7
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/README.md +42 -5
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/pyproject.toml +2 -2
- specsmith-0.15.3.dev586/src/specsmith/approvals.py +124 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/auditor.py +75 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/cli.py +314 -18
- specsmith-0.15.3.dev586/src/specsmith/commands/issues_policy.py +241 -0
- specsmith-0.15.3.dev586/src/specsmith/commands/reporting.py +891 -0
- specsmith-0.15.3.dev586/src/specsmith/dashboard.py +125 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/esdb/__init__.py +2 -1
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/esdb/sqlite_store.py +107 -2
- specsmith-0.15.3.dev586/src/specsmith/governed_pr.py +76 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/ledger.py +22 -0
- specsmith-0.15.3.dev586/src/specsmith/plugins.py +179 -0
- specsmith-0.15.3.dev586/src/specsmith/policy.py +125 -0
- specsmith-0.15.3.dev586/src/specsmith/recover.py +69 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/requirements.py +2 -1
- specsmith-0.15.3.dev586/src/specsmith/risk.py +148 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/sync.py +14 -4
- specsmith-0.15.3.dev586/src/specsmith/transcripts.py +140 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/wi_store.py +16 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586/src/specsmith.egg-info}/PKG-INFO +44 -7
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith.egg-info/SOURCES.txt +17 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith.egg-info/requires.txt +1 -1
- specsmith-0.15.3.dev586/tests/test_architecture.py +56 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_esdb_sqlite.py +37 -0
- specsmith-0.15.3.dev586/tests/test_esdb_verify_chain_cli.py +35 -0
- specsmith-0.15.3.dev586/tests/test_golden_path.py +53 -0
- specsmith-0.15.3.dev586/tests/test_init_modes.py +114 -0
- specsmith-0.15.3.dev586/tests/test_issue_policy_features.py +170 -0
- specsmith-0.15.3.dev586/tests/test_reporting_commands.py +197 -0
- specsmith-0.15.3.dev586/tests/test_schema_migrations.py +66 -0
- specsmith-0.15.3.dev586/tests/test_typing_guardrails.py +16 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_warp_parity_followup.py +1 -0
- specsmith-0.15.3.dev573/src/specsmith/plugins.py +0 -78
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/LICENSE +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/setup.cfg +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/belief.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/certainty.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/py.typed +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/recovery.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/session.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/epistemic/trace.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/__main__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/architect.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/auth.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/block_export.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/channel.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/compressor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/config.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/context_window.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/credits.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/differ.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/doctor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/drive.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/editor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/executor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/exporter.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/history_search.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/importer.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/instinct.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/languages.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/patent.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/paths.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/phase.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/profiles.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/releaser.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/serve.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/session.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/session_init.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/session_store.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/tools.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/trace.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/updater.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/validator.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith/workspace.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_CMD_001.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_ai_client.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_auditor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_channel.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_cli.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_cli_regressions.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_compliance.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_compliance_governance.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_compressor.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_dispatch.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_epistemic.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_esdb_enforcement.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_esdb_license.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_importer.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_integrations.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_intelligence.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_mcp_client.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_mcp_server.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_new_modules.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_nexus.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_permissions.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_rate_limits.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_req_248_262.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_req_358_359.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_scaffolder.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_smoke.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_suggester.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_tools.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_validator.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_vcs.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_warp_parity.py +0 -0
- {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev586}/tests/test_wi_lifecycle.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.15.3.
|
|
3
|
+
Version: 0.15.3.dev586
|
|
4
4
|
Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
|
|
5
5
|
Author: Layer1Labs Silicon, Inc.
|
|
6
6
|
License-Expression: MIT
|
|
@@ -40,7 +40,7 @@ Requires-Dist: pre-commit>=3.0; extra == "dev"
|
|
|
40
40
|
Requires-Dist: types-pyyaml>=6.0; extra == "dev"
|
|
41
41
|
Requires-Dist: cryptography>=42.0; extra == "dev"
|
|
42
42
|
Provides-Extra: esdb
|
|
43
|
-
Requires-Dist: chronomemory>=0.1.
|
|
43
|
+
Requires-Dist: chronomemory>=0.1.9; extra == "esdb"
|
|
44
44
|
Requires-Dist: cryptography>=42.0; extra == "esdb"
|
|
45
45
|
Provides-Extra: docs
|
|
46
46
|
Requires-Dist: mkdocs>=1.6; extra == "docs"
|
|
@@ -85,13 +85,30 @@ Dynamic: license-file
|
|
|
85
85
|
[](https://www.python.org/downloads/)
|
|
86
86
|
[](https://github.com/layer1labs/specsmith/blob/main/LICENSE)
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
SpecSmith is the governance layer for AI-assisted development: it sits between agents and your repo, enforces preflight decisions, and records requirement/test traceability with auditable evidence. It is **not** an IDE, autonomous coding agent, CI runner, or legal-compliance certifier. Use SpecSmith when changes need repeatable controls, work-item lineage, and review-ready artifacts; do not use it for throwaway prototyping where governance overhead is unnecessary. Compared with GitHub Spec Kit, OpenSpec, and BMAD, SpecSmith adds execution-time policy gates and trace chains. Compared with Aider, Claude Code, and Cursor, SpecSmith governs those clients instead of replacing them. Compared with LangGraph and AutoGen, SpecSmith prioritizes software-governance outcomes and evidence quality over general-purpose multi-agent orchestration.
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
## Architecture at a glance
|
|
91
91
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
```mermaid
|
|
93
|
+
flowchart LR
|
|
94
|
+
A[AI Agents / IDE Clients] --> B[SpecSmith Governance Layer]
|
|
95
|
+
B --> C[Repository Files]
|
|
96
|
+
B --> D[Requirements and Tests]
|
|
97
|
+
B --> E[ESDB / Audit Ledger]
|
|
98
|
+
E --> F[CI and MCP Integrations]
|
|
99
|
+
D --> F
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## When to use / when not to use
|
|
103
|
+
|
|
104
|
+
- Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
|
|
105
|
+
- Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
|
|
106
|
+
|
|
107
|
+
## Comparison summary
|
|
108
|
+
|
|
109
|
+
- **GitHub Spec Kit / OpenSpec / BMAD:** strong specification practices; SpecSmith adds execution-time governance, work-item lifecycle control, and trace-chain evidence.
|
|
110
|
+
- **Aider / Claude Code / Cursor:** agentic coding interfaces; SpecSmith is the policy and evidence layer around these clients.
|
|
111
|
+
- **LangGraph / AutoGen:** orchestration frameworks; SpecSmith is a governance-first development layer with compliance-oriented traceability.
|
|
95
112
|
|
|
96
113
|
**v0.15.2 — PyPI-safe README links, RTD nav coverage, updated security policy, and expanded embedded skill catalog (Zephyr 4.4→3.x, FreeRTOS, bare-metal C).**
|
|
97
114
|
specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
|
|
@@ -180,6 +197,18 @@ specsmith phase list # list all phases
|
|
|
180
197
|
The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
|
|
181
198
|
of file/command criteria, recommended commands, and a readiness percentage.
|
|
182
199
|
|
|
200
|
+
## 1.0 release criteria status
|
|
201
|
+
|
|
202
|
+
| Criterion | Status | Source |
|
|
203
|
+
|---|---|---|
|
|
204
|
+
| Stable CLI core contract documented | In progress | `docs/stability.md` |
|
|
205
|
+
| Stable generated file schemas documented | In progress | `docs/stability.md` |
|
|
206
|
+
| Stable MCP tool schemas documented | In progress | `docs/stability.md` |
|
|
207
|
+
| Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
208
|
+
| Security threat model documented | In progress | `docs/security-threat-model.md` |
|
|
209
|
+
| Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
210
|
+
| Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
211
|
+
|
|
183
212
|
---
|
|
184
213
|
|
|
185
214
|
## Install
|
|
@@ -224,6 +253,8 @@ in your own application without managing a pipx environment.
|
|
|
224
253
|
| **Default** | `specsmith` (built-in) | MIT, free | SQLite backend — requirements, test cases, confidence filtering |
|
|
225
254
|
| **Commercial** | `chronomemory` via `specsmith[esdb]` | Proprietary — license required | ChronoStore: tamper-evident SHA-256 WAL, OEA anti-hallucination fields, Rust acceleration, epistemic rollback |
|
|
226
255
|
|
|
256
|
+
See `docs/editions.md` for the full OSS vs commercial feature matrix.
|
|
257
|
+
|
|
227
258
|
`pip install specsmith` always installs the **free SQLite backend** automatically.
|
|
228
259
|
No additional packages, no license key, no configuration — it works out of the box.
|
|
229
260
|
|
|
@@ -1187,8 +1218,14 @@ command reference, project types, tool registry, governance model, ESDB, skills
|
|
|
1187
1218
|
|
|
1188
1219
|
- [PyPI](https://pypi.org/project/specsmith/)
|
|
1189
1220
|
- [Documentation](https://specsmith.readthedocs.io)
|
|
1221
|
+
- [Stability Contract](https://github.com/layer1labs/specsmith/blob/main/docs/stability.md)
|
|
1222
|
+
- [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/main/docs/roadmap/1.0-criteria.md)
|
|
1223
|
+
- [Editions Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/editions.md)
|
|
1190
1224
|
- [Changelog](https://github.com/layer1labs/specsmith/blob/main/CHANGELOG.md)
|
|
1191
1225
|
- [Contributing](https://github.com/layer1labs/specsmith/blob/main/CONTRIBUTING.md)
|
|
1226
|
+
- [Roadmap](https://github.com/layer1labs/specsmith/blob/main/ROADMAP.md)
|
|
1227
|
+
- [Compatibility Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/site/compatibility.md)
|
|
1228
|
+
- [Product Principles](https://github.com/layer1labs/specsmith/blob/main/docs/product-principles.md)
|
|
1192
1229
|
- [Security](https://github.com/layer1labs/specsmith/blob/main/SECURITY.md)
|
|
1193
1230
|
|
|
1194
1231
|
## License
|
|
@@ -7,13 +7,30 @@
|
|
|
7
7
|
[](https://www.python.org/downloads/)
|
|
8
8
|
[](https://github.com/layer1labs/specsmith/blob/main/LICENSE)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
SpecSmith is the governance layer for AI-assisted development: it sits between agents and your repo, enforces preflight decisions, and records requirement/test traceability with auditable evidence. It is **not** an IDE, autonomous coding agent, CI runner, or legal-compliance certifier. Use SpecSmith when changes need repeatable controls, work-item lineage, and review-ready artifacts; do not use it for throwaway prototyping where governance overhead is unnecessary. Compared with GitHub Spec Kit, OpenSpec, and BMAD, SpecSmith adds execution-time policy gates and trace chains. Compared with Aider, Claude Code, and Cursor, SpecSmith governs those clients instead of replacing them. Compared with LangGraph and AutoGen, SpecSmith prioritizes software-governance outcomes and evidence quality over general-purpose multi-agent orchestration.
|
|
11
|
+
|
|
12
|
+
## Architecture at a glance
|
|
13
|
+
|
|
14
|
+
```mermaid
|
|
15
|
+
flowchart LR
|
|
16
|
+
A[AI Agents / IDE Clients] --> B[SpecSmith Governance Layer]
|
|
17
|
+
B --> C[Repository Files]
|
|
18
|
+
B --> D[Requirements and Tests]
|
|
19
|
+
B --> E[ESDB / Audit Ledger]
|
|
20
|
+
E --> F[CI and MCP Integrations]
|
|
21
|
+
D --> F
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## When to use / when not to use
|
|
11
25
|
|
|
12
|
-
|
|
26
|
+
- Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
|
|
27
|
+
- Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
|
|
13
28
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
29
|
+
## Comparison summary
|
|
30
|
+
|
|
31
|
+
- **GitHub Spec Kit / OpenSpec / BMAD:** strong specification practices; SpecSmith adds execution-time governance, work-item lifecycle control, and trace-chain evidence.
|
|
32
|
+
- **Aider / Claude Code / Cursor:** agentic coding interfaces; SpecSmith is the policy and evidence layer around these clients.
|
|
33
|
+
- **LangGraph / AutoGen:** orchestration frameworks; SpecSmith is a governance-first development layer with compliance-oriented traceability.
|
|
17
34
|
|
|
18
35
|
**v0.15.2 — PyPI-safe README links, RTD nav coverage, updated security policy, and expanded embedded skill catalog (Zephyr 4.4→3.x, FreeRTOS, bare-metal C).**
|
|
19
36
|
specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
|
|
@@ -102,6 +119,18 @@ specsmith phase list # list all phases
|
|
|
102
119
|
The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
|
|
103
120
|
of file/command criteria, recommended commands, and a readiness percentage.
|
|
104
121
|
|
|
122
|
+
## 1.0 release criteria status
|
|
123
|
+
|
|
124
|
+
| Criterion | Status | Source |
|
|
125
|
+
|---|---|---|
|
|
126
|
+
| Stable CLI core contract documented | In progress | `docs/stability.md` |
|
|
127
|
+
| Stable generated file schemas documented | In progress | `docs/stability.md` |
|
|
128
|
+
| Stable MCP tool schemas documented | In progress | `docs/stability.md` |
|
|
129
|
+
| Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
130
|
+
| Security threat model documented | In progress | `docs/security-threat-model.md` |
|
|
131
|
+
| Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
132
|
+
| Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
|
|
133
|
+
|
|
105
134
|
---
|
|
106
135
|
|
|
107
136
|
## Install
|
|
@@ -146,6 +175,8 @@ in your own application without managing a pipx environment.
|
|
|
146
175
|
| **Default** | `specsmith` (built-in) | MIT, free | SQLite backend — requirements, test cases, confidence filtering |
|
|
147
176
|
| **Commercial** | `chronomemory` via `specsmith[esdb]` | Proprietary — license required | ChronoStore: tamper-evident SHA-256 WAL, OEA anti-hallucination fields, Rust acceleration, epistemic rollback |
|
|
148
177
|
|
|
178
|
+
See `docs/editions.md` for the full OSS vs commercial feature matrix.
|
|
179
|
+
|
|
149
180
|
`pip install specsmith` always installs the **free SQLite backend** automatically.
|
|
150
181
|
No additional packages, no license key, no configuration — it works out of the box.
|
|
151
182
|
|
|
@@ -1109,8 +1140,14 @@ command reference, project types, tool registry, governance model, ESDB, skills
|
|
|
1109
1140
|
|
|
1110
1141
|
- [PyPI](https://pypi.org/project/specsmith/)
|
|
1111
1142
|
- [Documentation](https://specsmith.readthedocs.io)
|
|
1143
|
+
- [Stability Contract](https://github.com/layer1labs/specsmith/blob/main/docs/stability.md)
|
|
1144
|
+
- [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/main/docs/roadmap/1.0-criteria.md)
|
|
1145
|
+
- [Editions Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/editions.md)
|
|
1112
1146
|
- [Changelog](https://github.com/layer1labs/specsmith/blob/main/CHANGELOG.md)
|
|
1113
1147
|
- [Contributing](https://github.com/layer1labs/specsmith/blob/main/CONTRIBUTING.md)
|
|
1148
|
+
- [Roadmap](https://github.com/layer1labs/specsmith/blob/main/ROADMAP.md)
|
|
1149
|
+
- [Compatibility Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/site/compatibility.md)
|
|
1150
|
+
- [Product Principles](https://github.com/layer1labs/specsmith/blob/main/docs/product-principles.md)
|
|
1114
1151
|
- [Security](https://github.com/layer1labs/specsmith/blob/main/SECURITY.md)
|
|
1115
1152
|
|
|
1116
1153
|
## License
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.15.3.
|
|
7
|
+
version = "0.15.3.dev586"
|
|
8
8
|
description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -60,7 +60,7 @@ dev = [
|
|
|
60
60
|
# Install: pip install specsmith[esdb]
|
|
61
61
|
# Activate: specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
62
62
|
esdb = [
|
|
63
|
-
"chronomemory>=0.1.
|
|
63
|
+
"chronomemory>=0.1.9", # proprietary commercial — see chronomemory LICENSE
|
|
64
64
|
"cryptography>=42.0",
|
|
65
65
|
]
|
|
66
66
|
docs = [
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import subprocess
|
|
5
|
+
import time
|
|
6
|
+
from dataclasses import asdict, dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
APPROVAL_TYPES = ("requirement", "plan", "implementation", "verification", "release")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class ApprovalRecord:
|
|
15
|
+
approval_type: str
|
|
16
|
+
work_item_id: str
|
|
17
|
+
approver: str
|
|
18
|
+
timestamp: str
|
|
19
|
+
scope: str
|
|
20
|
+
rationale: str
|
|
21
|
+
requirement_ids: list[str]
|
|
22
|
+
|
|
23
|
+
def to_dict(self) -> dict[str, Any]:
|
|
24
|
+
return asdict(self)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _now_iso() -> str:
|
|
28
|
+
return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _approvals_path(root: Path) -> Path:
|
|
32
|
+
return root / ".specsmith" / "approvals.json"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def load_approvals(root: Path) -> list[ApprovalRecord]:
|
|
36
|
+
path = _approvals_path(root)
|
|
37
|
+
if not path.is_file():
|
|
38
|
+
return []
|
|
39
|
+
try:
|
|
40
|
+
raw = json.loads(path.read_text(encoding="utf-8"))
|
|
41
|
+
except (OSError, ValueError):
|
|
42
|
+
return []
|
|
43
|
+
if not isinstance(raw, list):
|
|
44
|
+
return []
|
|
45
|
+
out: list[ApprovalRecord] = []
|
|
46
|
+
for row in raw:
|
|
47
|
+
if isinstance(row, dict):
|
|
48
|
+
out.append(
|
|
49
|
+
ApprovalRecord(
|
|
50
|
+
approval_type=str(row.get("approval_type", "")),
|
|
51
|
+
work_item_id=str(row.get("work_item_id", "")),
|
|
52
|
+
approver=str(row.get("approver", "")),
|
|
53
|
+
timestamp=str(row.get("timestamp", "")),
|
|
54
|
+
scope=str(row.get("scope", "")),
|
|
55
|
+
rationale=str(row.get("rationale", "")),
|
|
56
|
+
requirement_ids=list(row.get("requirement_ids", []) or []),
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
return out
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def save_approvals(root: Path, approvals: list[ApprovalRecord]) -> None:
|
|
63
|
+
path = _approvals_path(root)
|
|
64
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
65
|
+
path.write_text(
|
|
66
|
+
json.dumps([a.to_dict() for a in approvals], indent=2, ensure_ascii=False),
|
|
67
|
+
encoding="utf-8",
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def detect_approver(root: Path) -> str:
|
|
72
|
+
def _git_config(key: str) -> str:
|
|
73
|
+
try:
|
|
74
|
+
proc = subprocess.run(
|
|
75
|
+
["git", "-C", str(root), "config", "--get", key],
|
|
76
|
+
check=False,
|
|
77
|
+
capture_output=True,
|
|
78
|
+
text=True,
|
|
79
|
+
timeout=5,
|
|
80
|
+
)
|
|
81
|
+
except Exception: # noqa: BLE001
|
|
82
|
+
return ""
|
|
83
|
+
return (proc.stdout or "").strip()
|
|
84
|
+
|
|
85
|
+
name = _git_config("user.name")
|
|
86
|
+
email = _git_config("user.email")
|
|
87
|
+
if name and email:
|
|
88
|
+
return f"{name} <{email}>"
|
|
89
|
+
if name:
|
|
90
|
+
return name
|
|
91
|
+
if email:
|
|
92
|
+
return email
|
|
93
|
+
return "unknown-approver"
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def record_approval(
|
|
97
|
+
root: Path,
|
|
98
|
+
approval_type: str,
|
|
99
|
+
work_item_id: str,
|
|
100
|
+
rationale: str,
|
|
101
|
+
*,
|
|
102
|
+
scope: str = "",
|
|
103
|
+
requirement_ids: list[str] | None = None,
|
|
104
|
+
) -> ApprovalRecord:
|
|
105
|
+
if approval_type not in APPROVAL_TYPES:
|
|
106
|
+
msg = f"approval_type must be one of {APPROVAL_TYPES}"
|
|
107
|
+
raise ValueError(msg)
|
|
108
|
+
approvals = load_approvals(root)
|
|
109
|
+
record = ApprovalRecord(
|
|
110
|
+
approval_type=approval_type,
|
|
111
|
+
work_item_id=work_item_id,
|
|
112
|
+
approver=detect_approver(root),
|
|
113
|
+
timestamp=_now_iso(),
|
|
114
|
+
scope=scope or work_item_id,
|
|
115
|
+
rationale=rationale.strip(),
|
|
116
|
+
requirement_ids=list(requirement_ids or []),
|
|
117
|
+
)
|
|
118
|
+
approvals.append(record)
|
|
119
|
+
save_approvals(root, approvals)
|
|
120
|
+
return record
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def approvals_by_work_item(root: Path, work_item_id: str) -> list[ApprovalRecord]:
|
|
124
|
+
return [a for a in load_approvals(root) if a.work_item_id == work_item_id]
|
|
@@ -1281,6 +1281,79 @@ def check_cross_repo_dependencies(root: Path) -> list[AuditResult]:
|
|
|
1281
1281
|
return results
|
|
1282
1282
|
|
|
1283
1283
|
|
|
1284
|
+
def check_policy_validation(root: Path) -> list[AuditResult]:
|
|
1285
|
+
results: list[AuditResult] = []
|
|
1286
|
+
from specsmith.policy import load_policy
|
|
1287
|
+
|
|
1288
|
+
policy, errors = load_policy(root)
|
|
1289
|
+
if errors:
|
|
1290
|
+
for err in errors:
|
|
1291
|
+
results.append(
|
|
1292
|
+
AuditResult(
|
|
1293
|
+
name="policy-validation",
|
|
1294
|
+
passed=False,
|
|
1295
|
+
message=f"policy.yml invalid: {err}",
|
|
1296
|
+
)
|
|
1297
|
+
)
|
|
1298
|
+
return results
|
|
1299
|
+
if (root / ".specsmith" / "policy.yml").is_file():
|
|
1300
|
+
results.append(
|
|
1301
|
+
AuditResult(
|
|
1302
|
+
name="policy-validation",
|
|
1303
|
+
passed=True,
|
|
1304
|
+
message=f"policy.yml valid (risk_threshold={policy.risk_threshold})",
|
|
1305
|
+
)
|
|
1306
|
+
)
|
|
1307
|
+
return results
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
def check_work_item_risk_gates(root: Path) -> list[AuditResult]:
|
|
1311
|
+
results: list[AuditResult] = []
|
|
1312
|
+
from specsmith.approvals import approvals_by_work_item
|
|
1313
|
+
from specsmith.risk import assess_all_work_items
|
|
1314
|
+
from specsmith.wi_store import WorkItemStore
|
|
1315
|
+
|
|
1316
|
+
store = WorkItemStore(root)
|
|
1317
|
+
items = {item.id: item for item in store.load()}
|
|
1318
|
+
if not items:
|
|
1319
|
+
return results
|
|
1320
|
+
for wi_id, risk in assess_all_work_items(root):
|
|
1321
|
+
item = items.get(wi_id)
|
|
1322
|
+
if item is None:
|
|
1323
|
+
continue
|
|
1324
|
+
approvals = {a.approval_type for a in approvals_by_work_item(root, wi_id)}
|
|
1325
|
+
missing_gates: list[str] = []
|
|
1326
|
+
if (
|
|
1327
|
+
"human_approval:implementation" in risk.required_gates
|
|
1328
|
+
and "implementation" not in approvals
|
|
1329
|
+
):
|
|
1330
|
+
missing_gates.append("implementation approval")
|
|
1331
|
+
if "human_approval:verification" in risk.required_gates and "verification" not in approvals:
|
|
1332
|
+
missing_gates.append("verification approval")
|
|
1333
|
+
if "tests_required" in risk.required_gates and not item.test_case_ids:
|
|
1334
|
+
missing_gates.append("linked tests")
|
|
1335
|
+
if missing_gates:
|
|
1336
|
+
results.append(
|
|
1337
|
+
AuditResult(
|
|
1338
|
+
name=f"risk-gates:{wi_id}",
|
|
1339
|
+
passed=False,
|
|
1340
|
+
message=(
|
|
1341
|
+
f"{wi_id} risk={risk.level} missing gates: {', '.join(missing_gates)}"
|
|
1342
|
+
+ (f" (override: {risk.override_reason})" if risk.overridden else "")
|
|
1343
|
+
),
|
|
1344
|
+
)
|
|
1345
|
+
)
|
|
1346
|
+
else:
|
|
1347
|
+
results.append(
|
|
1348
|
+
AuditResult(
|
|
1349
|
+
name=f"risk-gates:{wi_id}",
|
|
1350
|
+
passed=True,
|
|
1351
|
+
message=f"{wi_id} risk={risk.level} gates satisfied",
|
|
1352
|
+
)
|
|
1353
|
+
)
|
|
1354
|
+
return results
|
|
1355
|
+
|
|
1356
|
+
|
|
1284
1357
|
def run_audit(root: Path) -> AuditReport:
|
|
1285
1358
|
"""Run all audit checks and return a report."""
|
|
1286
1359
|
report = AuditReport()
|
|
@@ -1298,6 +1371,8 @@ def run_audit(root: Path) -> AuditReport:
|
|
|
1298
1371
|
report.results.extend(check_industrial_artifacts(root))
|
|
1299
1372
|
report.results.extend(check_derived_artifacts(root))
|
|
1300
1373
|
report.results.extend(check_cross_repo_dependencies(root))
|
|
1374
|
+
report.results.extend(check_policy_validation(root))
|
|
1375
|
+
report.results.extend(check_work_item_risk_gates(root))
|
|
1301
1376
|
|
|
1302
1377
|
# Apply accepted_warnings / audit_suppressions from scaffold.yml (REQ-357)
|
|
1303
1378
|
raw = _read_scaffold_raw(root)
|