specsmith 0.11.3.dev427__tar.gz → 0.11.3.dev431__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.11.3.dev427/src/specsmith.egg-info → specsmith-0.11.3.dev431}/PKG-INFO +1 -1
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/pyproject.toml +3 -1
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/context_seed.py +8 -2
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/cli.py +29 -6
- specsmith-0.11.3.dev431/src/specsmith/esdb/__init__.py +62 -0
- specsmith-0.11.3.dev431/src/specsmith/esdb/bridge.py +28 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/retrieval.py +6 -2
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/devops.py +170 -0
- specsmith-0.11.3.dev431/src/specsmith/skills/governance.py +418 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs_commands.py +35 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431/src/specsmith.egg-info}/PKG-INFO +1 -1
- specsmith-0.11.3.dev427/src/specsmith/esdb/__init__.py +0 -2
- specsmith-0.11.3.dev427/src/specsmith/esdb/bridge.py +0 -10
- specsmith-0.11.3.dev427/src/specsmith/skills/governance.py +0 -168
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/LICENSE +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/README.md +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/setup.cfg +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/belief.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/certainty.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/failure_graph.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/py.typed +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/recovery.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/session.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/stress_tester.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/epistemic/trace.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/__main__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/broker.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/chat_runner.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/cleanup.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/core.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/_status.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/dag.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/events.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/dispatch/result.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/endpoints.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/events.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/execution_profiles.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/fallback.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/hf_leaderboard.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/hf_sync.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/indexer.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/llm_client.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/mcp.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/memory.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/model_intelligence.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/model_profiles.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/orchestrator.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/permissions.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/profiles.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/provider_registry.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/repl.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/router.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/rules.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/runner.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/safety.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/spawner.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/suggester.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/teams.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/tools.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/verifier.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/agent/voice.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/architect.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/auditor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/auth.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/block_export.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/channel.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/ci_manager.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/commands/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/commands/intelligence.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/_compat.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/checker.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/evidence.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/regulations.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compliance/reporter.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/compressor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/config.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/console_utils.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/context_orchestrator.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/context_window.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/credit_analyzer.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/credits.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/base.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/citations.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/fpd.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/odp.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/patentsview.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/pfw.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/ppubs.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/datasources/ptab.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/differ.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/doctor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/drive.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/editor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/belief.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/certainty.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/failure_graph.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/recovery.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/epistemic/stress_tester.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/eval/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/eval/builtins.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/eval/runner.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/executor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/exporter.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/governance_logic.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/governance_store.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/governance_yaml.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/app.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/main_window.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/session_tab.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/theme.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/chat_view.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/input_bar.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/provider_bar.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/token_meter.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/tool_panel.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/widgets/update_checker.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/gui/worker.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/history_search.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/importer.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/instinct.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/agent_skill.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/aider.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/base.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/claude_code.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/copilot.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/cursor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/gemini.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/integrations/windsurf.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/issue_reporter.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/languages.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/ledger.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/mcp_generator.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/m002_agents_slim.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/m003_compliance_init.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/migrations/runner.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/ollama_cmds.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/patent.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/paths.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/phase.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/plugins.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/profiles.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/rate_limits.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/releaser.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/requirements.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/requirements_parser.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/safe_write.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/scaffolder.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/serve.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/session.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/session_init.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/session_store.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/cloud.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/corporate.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/cross_platform.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/docs.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/embedded.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/hardware.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/mobile.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/productivity.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills/ssh.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/skills_builder.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/sync.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/agents.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/contributing.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/license-MIT.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/community/security.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/editorconfig.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/gitattributes.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/gitignore.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/go/go.mod.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/go/main.go.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/roles.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/rules.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/governance/verification.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/js/package.json.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/ledger.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/python/cli.py.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/python/init.py.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/readme.md.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/rust/main.rs.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/tool_installer.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/toolrules.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/tools.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/trace.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/updater.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/upgrader.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/validator.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs/__init__.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs/base.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs/bitbucket.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs/github.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/vcs/gitlab.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/wireframes.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith/workspace.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith.egg-info/SOURCES.txt +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith.egg-info/dependency_links.txt +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith.egg-info/entry_points.txt +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith.egg-info/requires.txt +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/src/specsmith.egg-info/top_level.txt +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_CMD_001.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_agent_profiles.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_agent_runner_ready.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_ai_client.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_ai_intelligence.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_auditor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_channel.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_chat_diff_decision.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_chat_runner_openai_compat.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_chat_stdin_protocol.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_cli.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_cli_workflows_history_drive.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_compliance.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_compressor.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_dispatch.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_e2e_nexus.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_endpoints_cli.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_endpoints_store.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_epistemic.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_fallback_chain.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_importer.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_integrations.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_intelligence.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_issue_reporter.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_mcp_client.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_new_modules.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_nexus.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_permissions.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_phase1_4_new.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_phase34_completion.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_rate_limits.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_req_248_262.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_scaffolder.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_skill_marketplace.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_skills_mcp.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_smoke.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_suggester.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_tools.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_validator.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_vcs.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/tests/test_warp_parity.py +0 -0
- {specsmith-0.11.3.dev427 → specsmith-0.11.3.dev431}/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.11.3.
|
|
3
|
+
Version: 0.11.3.dev431
|
|
4
4
|
Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
|
|
5
5
|
Author: BitConcepts
|
|
6
6
|
License-Expression: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specsmith"
|
|
7
|
-
version = "0.11.3.
|
|
7
|
+
version = "0.11.3.dev431"
|
|
8
8
|
description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -127,6 +127,8 @@ select = ["E", "F", "W", "I", "UP", "B", "SIM"]
|
|
|
127
127
|
"src/specsmith/ci_manager.py" = ["E501"]
|
|
128
128
|
# Context orchestrator: tier descriptions are intentionally descriptive
|
|
129
129
|
"src/specsmith/context_orchestrator.py" = ["E501"]
|
|
130
|
+
# Skills module: skill body strings contain markdown content with long lines
|
|
131
|
+
"src/specsmith/skills/*.py" = ["E501"]
|
|
130
132
|
# Migration files: rule description strings and template content
|
|
131
133
|
"src/specsmith/migrations/m001_governance_yaml.py" = ["E501"]
|
|
132
134
|
"src/specsmith/migrations/m004_ledger_esdb.py" = ["E501"]
|
|
@@ -186,12 +186,18 @@ def _load_ledger_snippet(root: Path, *, max_lines: int) -> str:
|
|
|
186
186
|
|
|
187
187
|
|
|
188
188
|
def _load_esdb_snippet(root: Path, *, max_records: int) -> str:
|
|
189
|
-
"""Return a compact summary of the most recent ESDB ChronoRecords.
|
|
189
|
+
"""Return a compact summary of the most recent ESDB ChronoRecords.
|
|
190
|
+
|
|
191
|
+
Uses query.what_is_known() (not store.query()) so infrastructure records
|
|
192
|
+
(edge, rollback_event, token_metric, skill_run) are excluded from the
|
|
193
|
+
LLM context seed — critical rule §23 / ESDB spec rule 3.
|
|
194
|
+
"""
|
|
190
195
|
try:
|
|
191
196
|
from chronomemory import ChronoStore
|
|
197
|
+
from chronomemory import query as _cm_query
|
|
192
198
|
|
|
193
199
|
with ChronoStore(root) as store:
|
|
194
|
-
all_records =
|
|
200
|
+
all_records = _cm_query.what_is_known(store) # active, conf>=0.6, no infra
|
|
195
201
|
recent = all_records[-max_records:] if len(all_records) > max_records else all_records
|
|
196
202
|
if not recent:
|
|
197
203
|
return ""
|
|
@@ -2471,8 +2471,14 @@ def push_cmd(project_dir: str, force: bool) -> None:
|
|
|
2471
2471
|
default=False,
|
|
2472
2472
|
help="Commit only; skip push.",
|
|
2473
2473
|
)
|
|
2474
|
+
@click.option(
|
|
2475
|
+
"--force",
|
|
2476
|
+
is_flag=True,
|
|
2477
|
+
default=False,
|
|
2478
|
+
help="Override push safety checks (e.g. direct-to-main guard).",
|
|
2479
|
+
)
|
|
2474
2480
|
@click.option("--json", "as_json", is_flag=True, default=False)
|
|
2475
|
-
def save_cmd(project_dir: str, message: str, no_push: bool, as_json: bool) -> None:
|
|
2481
|
+
def save_cmd(project_dir: str, message: str, no_push: bool, force: bool, as_json: bool) -> None:
|
|
2476
2482
|
"""Save governance state: ESDB backup, commit, and push.
|
|
2477
2483
|
|
|
2478
2484
|
Combines ``specsmith esdb backup`` + ``specsmith commit`` + ``specsmith push``
|
|
@@ -2511,7 +2517,7 @@ def save_cmd(project_dir: str, message: str, no_push: bool, as_json: bool) -> No
|
|
|
2511
2517
|
|
|
2512
2518
|
# 3. Push
|
|
2513
2519
|
if not no_push:
|
|
2514
|
-
push_result = run_push(root)
|
|
2520
|
+
push_result = run_push(root, force=force)
|
|
2515
2521
|
steps.append({"step": "push", "ok": push_result.success, "message": push_result.message})
|
|
2516
2522
|
|
|
2517
2523
|
ok = all(s["ok"] for s in steps)
|
|
@@ -2688,11 +2694,28 @@ def pr_cmd(project_dir: str, title: str, draft: bool) -> None:
|
|
|
2688
2694
|
|
|
2689
2695
|
@main.command(name="pull")
|
|
2690
2696
|
@click.option("--project-dir", type=click.Path(exists=True), default=".")
|
|
2691
|
-
|
|
2692
|
-
""
|
|
2693
|
-
|
|
2697
|
+
@click.option(
|
|
2698
|
+
"--discard",
|
|
2699
|
+
is_flag=True,
|
|
2700
|
+
default=False,
|
|
2701
|
+
help="Hard-reset to remote and pull, discarding all local changes.",
|
|
2702
|
+
)
|
|
2703
|
+
@click.option(
|
|
2704
|
+
"--clean",
|
|
2705
|
+
is_flag=True,
|
|
2706
|
+
default=False,
|
|
2707
|
+
help="Like --discard but also removes untracked files (git clean -fd).",
|
|
2708
|
+
)
|
|
2709
|
+
def pull_cmd(project_dir: str, discard: bool, clean: bool) -> None:
|
|
2710
|
+
"""Pull latest changes and check for governance conflicts.
|
|
2711
|
+
|
|
2712
|
+
Use --discard to hard-reset to the remote branch, discarding local
|
|
2713
|
+
changes. Add --clean to also remove untracked files.
|
|
2714
|
+
"""
|
|
2715
|
+
from specsmith.vcs_commands import run_discard, run_sync
|
|
2694
2716
|
|
|
2695
|
-
|
|
2717
|
+
root = Path(project_dir).resolve()
|
|
2718
|
+
result = run_discard(root, clean=clean) if discard or clean else run_sync(root)
|
|
2696
2719
|
if result.success:
|
|
2697
2720
|
console.print(f"[green]\u2713[/green] {result.message}")
|
|
2698
2721
|
else:
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# specsmith.esdb — ESDB integration package
|
|
2
|
+
#
|
|
3
|
+
# Re-exports the full chronomemory v0.1.1 public surface under the
|
|
4
|
+
# specsmith.esdb namespace so internal modules can use a single import
|
|
5
|
+
# path and never import chronomemory directly in more than one place.
|
|
6
|
+
|
|
7
|
+
# Re-export query and metrics as module references so callers can do:
|
|
8
|
+
# from specsmith.esdb import query, metrics
|
|
9
|
+
from chronomemory import (
|
|
10
|
+
RUST_BACKEND,
|
|
11
|
+
# Core store
|
|
12
|
+
ChronoRecord,
|
|
13
|
+
ChronoStore,
|
|
14
|
+
# Phase 2: context pack compiler
|
|
15
|
+
ContextPack,
|
|
16
|
+
ContextPackCompiler,
|
|
17
|
+
ContextPackEntry,
|
|
18
|
+
DependencyEdge,
|
|
19
|
+
# Phase 2: dependency graph
|
|
20
|
+
DepGraph,
|
|
21
|
+
# Bridge (backward-compat with .specsmith/*.json)
|
|
22
|
+
EsdbBridge,
|
|
23
|
+
EsdbRecord,
|
|
24
|
+
EsdbStatus,
|
|
25
|
+
# Phase 2: epistemic rollback
|
|
26
|
+
RollbackReport,
|
|
27
|
+
# Phase 3: optional Rust acceleration (None / False when not compiled)
|
|
28
|
+
RustChronoStore,
|
|
29
|
+
RustRecord,
|
|
30
|
+
WalEvent,
|
|
31
|
+
invalidate,
|
|
32
|
+
metrics, # noqa: F401 — module re-export
|
|
33
|
+
open_store,
|
|
34
|
+
query, # noqa: F401 — module re-export
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
__all__ = [
|
|
38
|
+
# Core
|
|
39
|
+
"ChronoStore",
|
|
40
|
+
"ChronoRecord",
|
|
41
|
+
"WalEvent",
|
|
42
|
+
"open_store",
|
|
43
|
+
# Bridge
|
|
44
|
+
"EsdbBridge",
|
|
45
|
+
"EsdbRecord",
|
|
46
|
+
"EsdbStatus",
|
|
47
|
+
# Phase 2
|
|
48
|
+
"DepGraph",
|
|
49
|
+
"DependencyEdge",
|
|
50
|
+
"RollbackReport",
|
|
51
|
+
"invalidate",
|
|
52
|
+
"ContextPack",
|
|
53
|
+
"ContextPackCompiler",
|
|
54
|
+
"ContextPackEntry",
|
|
55
|
+
# Phase 3
|
|
56
|
+
"RustChronoStore",
|
|
57
|
+
"RustRecord",
|
|
58
|
+
"RUST_BACKEND",
|
|
59
|
+
# Modules
|
|
60
|
+
"query",
|
|
61
|
+
"metrics",
|
|
62
|
+
]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""specsmith.esdb.bridge — backward-compat bridge shim (chronomemory v0.1.1).
|
|
2
|
+
|
|
3
|
+
For direct use prefer importing from specsmith.esdb (the package __init__)
|
|
4
|
+
which re-exports the full chronomemory v0.1.1 surface. This module is kept
|
|
5
|
+
for any code that specifically imports from specsmith.esdb.bridge.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from chronomemory import (
|
|
9
|
+
RUST_BACKEND,
|
|
10
|
+
ContextPackCompiler,
|
|
11
|
+
DepGraph,
|
|
12
|
+
EsdbBridge,
|
|
13
|
+
EsdbRecord,
|
|
14
|
+
EsdbStatus,
|
|
15
|
+
metrics,
|
|
16
|
+
query,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"EsdbBridge",
|
|
21
|
+
"EsdbRecord",
|
|
22
|
+
"EsdbStatus",
|
|
23
|
+
"ContextPackCompiler",
|
|
24
|
+
"DepGraph",
|
|
25
|
+
"RUST_BACKEND",
|
|
26
|
+
"query",
|
|
27
|
+
"metrics",
|
|
28
|
+
]
|
|
@@ -40,14 +40,18 @@ def build_index(root: Path, *, include_ledger: bool = False, external: str = "")
|
|
|
40
40
|
"""
|
|
41
41
|
entries: list[dict[str, str]] = []
|
|
42
42
|
|
|
43
|
-
# H18: inject high-confidence ESDB records as retrieval context
|
|
43
|
+
# H18: inject high-confidence ESDB records as retrieval context.
|
|
44
|
+
# Use query.what_is_known() (not store.query(rag_filter=True)) so that
|
|
45
|
+
# infrastructure records (edge, rollback_event, token_metric, skill_run)
|
|
46
|
+
# are excluded from the RAG index — critical rule §18.
|
|
44
47
|
wal = root / ".chronomemory" / "events.wal"
|
|
45
48
|
if wal.exists():
|
|
46
49
|
try:
|
|
47
50
|
from chronomemory import ChronoStore
|
|
51
|
+
from chronomemory import query as _cm_query
|
|
48
52
|
|
|
49
53
|
with ChronoStore(root) as store:
|
|
50
|
-
for rec in
|
|
54
|
+
for rec in _cm_query.what_is_known(store):
|
|
51
55
|
if rec.data:
|
|
52
56
|
content = (
|
|
53
57
|
f"[{rec.kind.upper()} {rec.id}] {rec.label}\n"
|
|
@@ -4,6 +4,176 @@
|
|
|
4
4
|
from specsmith.skills import SkillDomain, SkillEntry
|
|
5
5
|
|
|
6
6
|
SKILLS: list[SkillEntry] = [
|
|
7
|
+
SkillEntry(
|
|
8
|
+
slug="github-actions-ci",
|
|
9
|
+
name="GitHub Actions CI — Layer1Labs pattern (zero-trust, parallel, coverage-gated)",
|
|
10
|
+
description=(
|
|
11
|
+
"Standard Layer1Labs GitHub Actions CI pattern: permissions: {} at workflow level, "
|
|
12
|
+
"per-job contents: read grants, parallel jobs (no needs chain), full Python matrix "
|
|
13
|
+
"3.10–3.13, and --cov-fail-under=85 coverage gate."
|
|
14
|
+
),
|
|
15
|
+
domain=SkillDomain.DEVOPS,
|
|
16
|
+
tags=[
|
|
17
|
+
"ci",
|
|
18
|
+
"github-actions",
|
|
19
|
+
"permissions",
|
|
20
|
+
"pytest",
|
|
21
|
+
"coverage",
|
|
22
|
+
"ruff",
|
|
23
|
+
"mypy",
|
|
24
|
+
"security",
|
|
25
|
+
"python",
|
|
26
|
+
"matrix",
|
|
27
|
+
"zero-trust",
|
|
28
|
+
],
|
|
29
|
+
platforms=["linux", "windows", "macos"],
|
|
30
|
+
prerequisites=["gh"],
|
|
31
|
+
body=(
|
|
32
|
+
"""\
|
|
33
|
+
# GitHub Actions CI Skill (Layer1Labs pattern)
|
|
34
|
+
|
|
35
|
+
Standard CI pattern used across all Layer1Labs / BitConcepts Python projects.
|
|
36
|
+
Reference implementation: `chronomemory/.github/workflows/ci.yml`
|
|
37
|
+
|
|
38
|
+
## Core principles
|
|
39
|
+
- `permissions: {}` at workflow level — deny all by default.
|
|
40
|
+
- `permissions: contents: read` on each individual job — grant minimum needed.
|
|
41
|
+
- All jobs run **in parallel** — no `needs:` dependency chain unless truly required.
|
|
42
|
+
- Full Python matrix: **3.10, 3.11, 3.12, 3.13** × ubuntu-latest, windows-latest.
|
|
43
|
+
- Coverage gate: `--cov-fail-under=85`.
|
|
44
|
+
- Named jobs (`name:` field) for readable GitHub UI.
|
|
45
|
+
- `fail-fast: false` on the test matrix so all combinations are reported.
|
|
46
|
+
|
|
47
|
+
## Canonical template
|
|
48
|
+
```yaml
|
|
49
|
+
name: CI
|
|
50
|
+
|
|
51
|
+
on:
|
|
52
|
+
push:
|
|
53
|
+
branches: [main, develop]
|
|
54
|
+
pull_request:
|
|
55
|
+
branches: [main, develop]
|
|
56
|
+
workflow_dispatch:
|
|
57
|
+
|
|
58
|
+
# Default: deny all. Each job grants only what it needs.
|
|
59
|
+
permissions: {}
|
|
60
|
+
|
|
61
|
+
jobs:
|
|
62
|
+
lint:
|
|
63
|
+
name: Lint (ruff)
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
permissions:
|
|
66
|
+
contents: read
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v6
|
|
69
|
+
- uses: actions/setup-python@v6
|
|
70
|
+
with:
|
|
71
|
+
python-version: "3.12"
|
|
72
|
+
cache: pip
|
|
73
|
+
- run: pip install ruff
|
|
74
|
+
- name: ruff format --check
|
|
75
|
+
run: ruff format --check src/ tests/
|
|
76
|
+
- name: ruff check
|
|
77
|
+
run: ruff check src/ tests/
|
|
78
|
+
|
|
79
|
+
typecheck:
|
|
80
|
+
name: Type check (mypy)
|
|
81
|
+
runs-on: ubuntu-latest
|
|
82
|
+
permissions:
|
|
83
|
+
contents: read
|
|
84
|
+
steps:
|
|
85
|
+
- uses: actions/checkout@v6
|
|
86
|
+
- uses: actions/setup-python@v6
|
|
87
|
+
with:
|
|
88
|
+
python-version: "3.12"
|
|
89
|
+
cache: pip
|
|
90
|
+
- run: pip install -e ".[dev]"
|
|
91
|
+
- run: mypy src/<package>/
|
|
92
|
+
|
|
93
|
+
test:
|
|
94
|
+
name: Test (Python ${{ matrix.python-version }} / ${{ matrix.os }})
|
|
95
|
+
runs-on: ${{ matrix.os }}
|
|
96
|
+
permissions:
|
|
97
|
+
contents: read
|
|
98
|
+
strategy:
|
|
99
|
+
fail-fast: false
|
|
100
|
+
matrix:
|
|
101
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
102
|
+
os: [ubuntu-latest, windows-latest]
|
|
103
|
+
steps:
|
|
104
|
+
- uses: actions/checkout@v6
|
|
105
|
+
- uses: actions/setup-python@v6
|
|
106
|
+
with:
|
|
107
|
+
python-version: ${{ matrix.python-version }}
|
|
108
|
+
cache: pip
|
|
109
|
+
- run: pip install -e ".[dev]"
|
|
110
|
+
- run: pytest --cov=<package> --cov-report=term-missing --cov-fail-under=85
|
|
111
|
+
|
|
112
|
+
security:
|
|
113
|
+
name: Security audit (pip-audit)
|
|
114
|
+
runs-on: ubuntu-latest
|
|
115
|
+
permissions:
|
|
116
|
+
contents: read
|
|
117
|
+
steps:
|
|
118
|
+
- uses: actions/checkout@v6
|
|
119
|
+
- uses: actions/setup-python@v6
|
|
120
|
+
with:
|
|
121
|
+
python-version: "3.12"
|
|
122
|
+
cache: pip
|
|
123
|
+
- run: pip install pip-audit
|
|
124
|
+
- run: pip install -e .
|
|
125
|
+
- run: pip-audit
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## What NOT to do
|
|
129
|
+
- Do NOT set `permissions: contents: read` at workflow level — use `permissions: {}` + per-job grants.
|
|
130
|
+
- Do NOT use `needs: [lint, typecheck]` to gate the test job — run all in parallel.
|
|
131
|
+
- Do NOT omit Python 3.11 from the matrix.
|
|
132
|
+
- Do NOT skip `--cov-fail-under` — the 85% gate is non-negotiable.
|
|
133
|
+
- Do NOT use `cancel-in-progress: true` (concurrency block) unless there is a
|
|
134
|
+
specific reason — chronomemory pattern omits it.
|
|
135
|
+
- Do NOT use `macos-latest` in the matrix unless macOS-specific behavior must be
|
|
136
|
+
tested — it is ~10× slower and uses more CI minutes.
|
|
137
|
+
|
|
138
|
+
## Rust projects (additional jobs)
|
|
139
|
+
```yaml
|
|
140
|
+
rust-lint:
|
|
141
|
+
name: Rust lint (clippy + fmt)
|
|
142
|
+
runs-on: ubuntu-latest
|
|
143
|
+
permissions:
|
|
144
|
+
contents: read
|
|
145
|
+
steps:
|
|
146
|
+
- uses: actions/checkout@v6
|
|
147
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
148
|
+
with:
|
|
149
|
+
components: clippy, rustfmt
|
|
150
|
+
- run: cargo fmt --check --all
|
|
151
|
+
- run: cargo clippy --workspace -- -D warnings
|
|
152
|
+
|
|
153
|
+
rust-test:
|
|
154
|
+
name: Rust tests
|
|
155
|
+
runs-on: ubuntu-latest
|
|
156
|
+
permissions:
|
|
157
|
+
contents: read
|
|
158
|
+
steps:
|
|
159
|
+
- uses: actions/checkout@v6
|
|
160
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
161
|
+
- run: cargo test --workspace
|
|
162
|
+
|
|
163
|
+
security:
|
|
164
|
+
name: Security audit (cargo-audit)
|
|
165
|
+
runs-on: ubuntu-latest
|
|
166
|
+
permissions:
|
|
167
|
+
contents: read
|
|
168
|
+
steps:
|
|
169
|
+
- uses: actions/checkout@v6
|
|
170
|
+
- uses: dtolnay/rust-toolchain@stable
|
|
171
|
+
- run: cargo install cargo-audit --locked
|
|
172
|
+
- run: cargo audit
|
|
173
|
+
```
|
|
174
|
+
"""
|
|
175
|
+
),
|
|
176
|
+
),
|
|
7
177
|
SkillEntry(
|
|
8
178
|
slug="docker-workflow",
|
|
9
179
|
name="Docker — multi-stage builds, Compose, registries, security",
|