specsmith 0.13.1.dev536__tar.gz → 0.14.0__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.13.1.dev536/src/specsmith.egg-info → specsmith-0.14.0}/PKG-INFO +20 -7
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/README.md +19 -6
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/pyproject.toml +1 -1
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/__init__.py +1 -1
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/governance_logic.py +22 -17
- {specsmith-0.13.1.dev536 → specsmith-0.14.0/src/specsmith.egg-info}/PKG-INFO +20 -7
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/LICENSE +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/setup.cfg +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/belief.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/certainty.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/py.typed +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/recovery.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/session.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/epistemic/trace.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/__main__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/context_seed.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/architect.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/auditor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/auth.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/block_export.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/channel.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/cli.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/compressor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/config.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/context_window.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/credits.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/differ.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/doctor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/drive.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/editor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/esdb/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/esdb/_license.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/esdb/bridge.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/esdb/sqlite_store.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/executor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/exporter.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/history_search.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/importer.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/instinct.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/codity.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/languages.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/ledger.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/mcp_server.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/m006_session_governance.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/patent.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/paths.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/phase.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/plugins.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/profiles.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/releaser.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/requirements.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/retrieval.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/serve.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/session.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/session_init.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/session_store.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/ai_agents.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/data_engineering.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/devops.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/governance.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/platform_engineering.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/software_engineering.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/specsmith_skills.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills/web_backend.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/sync.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/tools.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/trace.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/updater.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/validator.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/vcs_commands.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith/workspace.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_CMD_001.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_agent_run_feedback.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_ai_client.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_auditor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_channel.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_cli.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_compliance.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_compressor.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_dispatch.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_epistemic.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_esdb_license.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_esdb_sqlite.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_importer.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_integrations.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_integrations_codity.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_intelligence.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_mcp_client.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_mcp_server.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_new_modules.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_nexus.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_permissions.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_rate_limits.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_req_248_262.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_req_358_359.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_scaffolder.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_smoke.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_suggester.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_tools.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_validator.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_vcs.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_warp_parity.py +0 -0
- {specsmith-0.13.1.dev536 → specsmith-0.14.0}/tests/test_warp_parity_followup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
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
|
|
@@ -93,7 +93,7 @@ specsmith treats belief systems like code: codable, testable, and deployable. It
|
|
|
93
93
|
epistemically-governed projects, stress-tests requirements as BeliefArtifacts, runs
|
|
94
94
|
cryptographically-sealed trace vaults, and orchestrates AI agents under formal AEE governance.
|
|
95
95
|
|
|
96
|
-
**v0.
|
|
96
|
+
**v0.14.0 — two-tier ESDB (free SQLite built-in + commercial ChronoStore via `specsmith[esdb]`), ESDB license gate, full ESDB CLI group, 10 CodeQL security fixes, chronomemory v0.1.6 support, and comprehensive ESDB documentation.**
|
|
97
97
|
specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
|
|
98
98
|
and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed,
|
|
99
99
|
every AI-generated output is disclosed, context windows are GPU-aware and protected against
|
|
@@ -187,12 +187,25 @@ of file/command criteria, recommended commands, and a readiness percentage.
|
|
|
187
187
|
**Recommended — via pipx (CLI + CI):**
|
|
188
188
|
|
|
189
189
|
```bash
|
|
190
|
-
pipx install specsmith
|
|
191
|
-
pipx inject specsmith anthropic # + Claude support
|
|
192
|
-
pipx inject specsmith openai # + GPT / O-series support
|
|
193
|
-
pipx inject specsmith google-generativeai # + Gemini support
|
|
190
|
+
pipx install specsmith
|
|
194
191
|
```
|
|
195
192
|
|
|
193
|
+
That's it. `specsmith audit`, `preflight`, `sync`, `checkpoint`, `esdb`, `mcp serve`,
|
|
194
|
+
and all governance commands work immediately with no additional packages.
|
|
195
|
+
|
|
196
|
+
> **Want `specsmith run` with a cloud LLM?** Inject the provider SDK only if you use
|
|
197
|
+
> the built-in agentic REPL with a cloud API key:
|
|
198
|
+
>
|
|
199
|
+
> ```bash
|
|
200
|
+
> pipx inject specsmith anthropic # if you set ANTHROPIC_API_KEY
|
|
201
|
+
> pipx inject specsmith openai # if you set OPENAI_API_KEY
|
|
202
|
+
> pipx inject specsmith google-genai # if you set GOOGLE_API_KEY
|
|
203
|
+
> ```
|
|
204
|
+
>
|
|
205
|
+
> Ollama works out of the box with no injection — specsmith uses stdlib HTTP.
|
|
206
|
+
> For Warp, Claude Code, Cursor, and Copilot, the AI client provides the LLM;
|
|
207
|
+
> no injection needed.
|
|
208
|
+
|
|
196
209
|
**Library-only use (venv / conda / any Python environment):**
|
|
197
210
|
|
|
198
211
|
```bash
|
|
@@ -226,7 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
|
|
|
226
239
|
# Step 1 — install the chronomemory package
|
|
227
240
|
pip install "specsmith[esdb]" # installs chronomemory from PyPI
|
|
228
241
|
# or if using pipx:
|
|
229
|
-
pipx inject specsmith "chronomemory>=0.1.
|
|
242
|
+
pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
|
|
230
243
|
|
|
231
244
|
# Step 2 — activate your license key
|
|
232
245
|
specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
@@ -15,7 +15,7 @@ specsmith treats belief systems like code: codable, testable, and deployable. It
|
|
|
15
15
|
epistemically-governed projects, stress-tests requirements as BeliefArtifacts, runs
|
|
16
16
|
cryptographically-sealed trace vaults, and orchestrates AI agents under formal AEE governance.
|
|
17
17
|
|
|
18
|
-
**v0.
|
|
18
|
+
**v0.14.0 — two-tier ESDB (free SQLite built-in + commercial ChronoStore via `specsmith[esdb]`), ESDB license gate, full ESDB CLI group, 10 CodeQL security fixes, chronomemory v0.1.6 support, and comprehensive ESDB documentation.**
|
|
19
19
|
specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
|
|
20
20
|
and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed,
|
|
21
21
|
every AI-generated output is disclosed, context windows are GPU-aware and protected against
|
|
@@ -109,12 +109,25 @@ of file/command criteria, recommended commands, and a readiness percentage.
|
|
|
109
109
|
**Recommended — via pipx (CLI + CI):**
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
|
-
pipx install specsmith
|
|
113
|
-
pipx inject specsmith anthropic # + Claude support
|
|
114
|
-
pipx inject specsmith openai # + GPT / O-series support
|
|
115
|
-
pipx inject specsmith google-generativeai # + Gemini support
|
|
112
|
+
pipx install specsmith
|
|
116
113
|
```
|
|
117
114
|
|
|
115
|
+
That's it. `specsmith audit`, `preflight`, `sync`, `checkpoint`, `esdb`, `mcp serve`,
|
|
116
|
+
and all governance commands work immediately with no additional packages.
|
|
117
|
+
|
|
118
|
+
> **Want `specsmith run` with a cloud LLM?** Inject the provider SDK only if you use
|
|
119
|
+
> the built-in agentic REPL with a cloud API key:
|
|
120
|
+
>
|
|
121
|
+
> ```bash
|
|
122
|
+
> pipx inject specsmith anthropic # if you set ANTHROPIC_API_KEY
|
|
123
|
+
> pipx inject specsmith openai # if you set OPENAI_API_KEY
|
|
124
|
+
> pipx inject specsmith google-genai # if you set GOOGLE_API_KEY
|
|
125
|
+
> ```
|
|
126
|
+
>
|
|
127
|
+
> Ollama works out of the box with no injection — specsmith uses stdlib HTTP.
|
|
128
|
+
> For Warp, Claude Code, Cursor, and Copilot, the AI client provides the LLM;
|
|
129
|
+
> no injection needed.
|
|
130
|
+
|
|
118
131
|
**Library-only use (venv / conda / any Python environment):**
|
|
119
132
|
|
|
120
133
|
```bash
|
|
@@ -148,7 +161,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
|
|
|
148
161
|
# Step 1 — install the chronomemory package
|
|
149
162
|
pip install "specsmith[esdb]" # installs chronomemory from PyPI
|
|
150
163
|
# or if using pipx:
|
|
151
|
-
pipx inject specsmith "chronomemory>=0.1.
|
|
164
|
+
pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
|
|
152
165
|
|
|
153
166
|
# Step 2 — activate your license key
|
|
154
167
|
specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.14.0"
|
|
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"
|
|
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
|
|
|
8
8
|
try:
|
|
9
9
|
__version__: str = _pkg_version("specsmith")
|
|
10
10
|
except PackageNotFoundError: # running from source without install
|
|
11
|
-
__version__ = "0.
|
|
11
|
+
__version__ = "0.14.0" # fallback: keep in sync with pyproject.toml
|
|
@@ -72,24 +72,29 @@ def run_preflight(
|
|
|
72
72
|
from specsmith.agent.broker import Intent, classify_intent, infer_scope
|
|
73
73
|
|
|
74
74
|
_safe_resolve(project_dir) # validate: reject null bytes and traversal sequences
|
|
75
|
-
|
|
75
|
+
# os.path.realpath breaks the taint chain and returns a clean plain str.
|
|
76
|
+
# ALL subsequent path construction uses os.path.join on _root_str — never
|
|
77
|
+
# the Path / operator on root — so CodeQL never re-acquires the taint from
|
|
78
|
+
# project_dir through a Path object.
|
|
79
|
+
_root_str: str = os.path.realpath(str(project_dir))
|
|
76
80
|
intent = classify_intent(utterance)
|
|
77
81
|
# Requirements live at docs/REQUIREMENTS.md, not at the project root.
|
|
78
82
|
# Falling back to root/REQUIREMENTS.md would always yield an empty list
|
|
79
83
|
# on standard projects, causing preflight to always return
|
|
80
84
|
# needs_clarification (GitHub issue #197).
|
|
81
|
-
_req_md =
|
|
85
|
+
_req_md = Path(os.path.realpath(os.path.join(_root_str, "docs", "REQUIREMENTS.md")))
|
|
82
86
|
if not _req_md.exists():
|
|
83
|
-
_req_md =
|
|
87
|
+
_req_md = Path(os.path.realpath(os.path.join(_root_str, "REQUIREMENTS.md"))) # legacy
|
|
88
|
+
_repo_idx = Path(os.path.realpath(os.path.join(_root_str, ".repo-index", "files.json")))
|
|
84
89
|
scope = infer_scope(
|
|
85
90
|
utterance,
|
|
86
91
|
_req_md,
|
|
87
|
-
repo_index_path=
|
|
92
|
+
repo_index_path=_repo_idx,
|
|
88
93
|
)
|
|
89
94
|
|
|
90
95
|
requirement_ids = [r.req_id for r in scope.matched_requirements]
|
|
91
96
|
|
|
92
|
-
# ── Direct ID extraction (fix #166)
|
|
97
|
+
# ── Direct ID extraction (fix #166) ───────────────────────────────────────────
|
|
93
98
|
# If the utterance contains explicit REQ-*/TEST-* IDs, look them up in the
|
|
94
99
|
# JSON machine state and merge them in — this handles project-prefixed IDs
|
|
95
100
|
# (e.g. REQ-NN-001, TEST-NN-002a) that token overlap may not catch.
|
|
@@ -98,12 +103,10 @@ def run_preflight(
|
|
|
98
103
|
explicit_req_ids = [m.upper() for m in _EXPLICIT_REQ.findall(utterance)]
|
|
99
104
|
explicit_test_ids = [m.upper() for m in _EXPLICIT_TEST.findall(utterance)]
|
|
100
105
|
|
|
101
|
-
# Read requirements machine-state
|
|
102
|
-
#
|
|
103
|
-
# (Helper functions with a root: Path parameter are analysed conservatively
|
|
104
|
-
# by CodeQL and can re-introduce py/path-injection alerts.)
|
|
106
|
+
# Read requirements machine-state using os.path.join on the clean _root_str
|
|
107
|
+
# so CodeQL traces the full sanitisation chain without re-tainting via Path.
|
|
105
108
|
rq_records: list[Any] = []
|
|
106
|
-
rq_path = (
|
|
109
|
+
rq_path = Path(os.path.realpath(os.path.join(_root_str, ".specsmith", "requirements.json")))
|
|
107
110
|
if rq_path.is_file():
|
|
108
111
|
try:
|
|
109
112
|
_rq = _json.loads(rq_path.read_text(encoding="utf-8"))
|
|
@@ -117,10 +120,10 @@ def run_preflight(
|
|
|
117
120
|
if eid in known_req_ids and eid not in requirement_ids:
|
|
118
121
|
requirement_ids.append(eid)
|
|
119
122
|
|
|
120
|
-
# Read test-case machine-state
|
|
123
|
+
# Read test-case machine-state (same rationale as above).
|
|
121
124
|
test_case_ids: list[str] = []
|
|
122
125
|
tc_records: list[Any] = []
|
|
123
|
-
tc_path = (
|
|
126
|
+
tc_path = Path(os.path.realpath(os.path.join(_root_str, ".specsmith", "testcases.json")))
|
|
124
127
|
if tc_path.is_file():
|
|
125
128
|
try:
|
|
126
129
|
_tc = _json.loads(tc_path.read_text(encoding="utf-8"))
|
|
@@ -187,8 +190,9 @@ def run_preflight(
|
|
|
187
190
|
)
|
|
188
191
|
confidence_target = 0.7
|
|
189
192
|
|
|
190
|
-
# Config floor (REQ-098)
|
|
191
|
-
|
|
193
|
+
# Config floor (REQ-098) — pass _root_str so the helper never receives
|
|
194
|
+
# a tainted Path object derived from project_dir.
|
|
195
|
+
cfg_threshold = _read_confidence_threshold(_root_str)
|
|
192
196
|
if cfg_threshold is not None and cfg_threshold > confidence_target:
|
|
193
197
|
confidence_target = cfg_threshold
|
|
194
198
|
|
|
@@ -1015,9 +1019,10 @@ def _resolve_provider_name() -> str:
|
|
|
1015
1019
|
return "byoe"
|
|
1016
1020
|
|
|
1017
1021
|
|
|
1018
|
-
def _read_confidence_threshold(root: Path) -> float | None:
|
|
1019
|
-
# .
|
|
1020
|
-
|
|
1022
|
+
def _read_confidence_threshold(root: Path | str) -> float | None:
|
|
1023
|
+
# Use os.path.join + os.path.realpath on the plain-string form so CodeQL
|
|
1024
|
+
# sees the sanitiser inline and does not flag cfg.is_file() or cfg.read_text().
|
|
1025
|
+
cfg = Path(os.path.realpath(os.path.join(str(root), ".specsmith", "config.yml")))
|
|
1021
1026
|
if not cfg.is_file():
|
|
1022
1027
|
return None
|
|
1023
1028
|
try:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: specsmith
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
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
|
|
@@ -93,7 +93,7 @@ specsmith treats belief systems like code: codable, testable, and deployable. It
|
|
|
93
93
|
epistemically-governed projects, stress-tests requirements as BeliefArtifacts, runs
|
|
94
94
|
cryptographically-sealed trace vaults, and orchestrates AI agents under formal AEE governance.
|
|
95
95
|
|
|
96
|
-
**v0.
|
|
96
|
+
**v0.14.0 — two-tier ESDB (free SQLite built-in + commercial ChronoStore via `specsmith[esdb]`), ESDB license gate, full ESDB CLI group, 10 CodeQL security fixes, chronomemory v0.1.6 support, and comprehensive ESDB documentation.**
|
|
97
97
|
specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
|
|
98
98
|
and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed,
|
|
99
99
|
every AI-generated output is disclosed, context windows are GPU-aware and protected against
|
|
@@ -187,12 +187,25 @@ of file/command criteria, recommended commands, and a readiness percentage.
|
|
|
187
187
|
**Recommended — via pipx (CLI + CI):**
|
|
188
188
|
|
|
189
189
|
```bash
|
|
190
|
-
pipx install specsmith
|
|
191
|
-
pipx inject specsmith anthropic # + Claude support
|
|
192
|
-
pipx inject specsmith openai # + GPT / O-series support
|
|
193
|
-
pipx inject specsmith google-generativeai # + Gemini support
|
|
190
|
+
pipx install specsmith
|
|
194
191
|
```
|
|
195
192
|
|
|
193
|
+
That's it. `specsmith audit`, `preflight`, `sync`, `checkpoint`, `esdb`, `mcp serve`,
|
|
194
|
+
and all governance commands work immediately with no additional packages.
|
|
195
|
+
|
|
196
|
+
> **Want `specsmith run` with a cloud LLM?** Inject the provider SDK only if you use
|
|
197
|
+
> the built-in agentic REPL with a cloud API key:
|
|
198
|
+
>
|
|
199
|
+
> ```bash
|
|
200
|
+
> pipx inject specsmith anthropic # if you set ANTHROPIC_API_KEY
|
|
201
|
+
> pipx inject specsmith openai # if you set OPENAI_API_KEY
|
|
202
|
+
> pipx inject specsmith google-genai # if you set GOOGLE_API_KEY
|
|
203
|
+
> ```
|
|
204
|
+
>
|
|
205
|
+
> Ollama works out of the box with no injection — specsmith uses stdlib HTTP.
|
|
206
|
+
> For Warp, Claude Code, Cursor, and Copilot, the AI client provides the LLM;
|
|
207
|
+
> no injection needed.
|
|
208
|
+
|
|
196
209
|
**Library-only use (venv / conda / any Python environment):**
|
|
197
210
|
|
|
198
211
|
```bash
|
|
@@ -226,7 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
|
|
|
226
239
|
# Step 1 — install the chronomemory package
|
|
227
240
|
pip install "specsmith[esdb]" # installs chronomemory from PyPI
|
|
228
241
|
# or if using pipx:
|
|
229
|
-
pipx inject specsmith "chronomemory>=0.1.
|
|
242
|
+
pipx inject specsmith "chronomemory>=0.1.6" # inject into the specsmith pipx venv
|
|
230
243
|
|
|
231
244
|
# Step 2 — activate your license key
|
|
232
245
|
specsmith esdb enable --key-file /path/to/your.esdb.key
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|