codevira 3.0.0__tar.gz → 3.1.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.
- {codevira-3.0.0 → codevira-3.1.0}/CHANGELOG.md +236 -0
- {codevira-3.0.0/codevira.egg-info → codevira-3.1.0}/PKG-INFO +1 -1
- {codevira-3.0.0 → codevira-3.1.0/codevira.egg-info}/PKG-INFO +1 -1
- {codevira-3.0.0 → codevira-3.1.0}/codevira.egg-info/SOURCES.txt +30 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/__init__.py +1 -1
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli.py +160 -1
- codevira-3.1.0/mcp_server/cli_consensus.py +55 -0
- codevira-3.1.0/mcp_server/cli_graph.py +476 -0
- codevira-3.1.0/mcp_server/cli_induce.py +328 -0
- codevira-3.1.0/mcp_server/cli_reflect.py +170 -0
- codevira-3.1.0/mcp_server/cli_working.py +89 -0
- codevira-3.1.0/mcp_server/data/affordances.yaml +44 -0
- codevira-3.1.0/mcp_server/data/prompts/reflection_v1.md +40 -0
- codevira-3.1.0/mcp_server/engine/memory_fanout.py +242 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/relevance_inject.py +12 -1
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/wiring/mcp_dispatch.py +23 -2
- codevira-3.1.0/mcp_server/graph/template.html +2172 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/ide_inject.py +125 -14
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/server.py +715 -0
- codevira-3.1.0/mcp_server/storage/activity_store.py +274 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/agents_md_generator.py +14 -6
- codevira-3.1.0/mcp_server/storage/config.py +64 -0
- codevira-3.1.0/mcp_server/storage/consensus_store.py +625 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/decisions_store.py +105 -33
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/fts5_index.py +190 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/jsonl_store.py +185 -1
- codevira-3.1.0/mcp_server/storage/origin.py +130 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/outcomes_writer.py +47 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/paths.py +125 -0
- codevira-3.1.0/mcp_server/storage/reflections_store.py +342 -0
- codevira-3.1.0/mcp_server/storage/sanitize.py +44 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/sessions_store.py +43 -8
- codevira-3.1.0/mcp_server/storage/skills_store.py +747 -0
- codevira-3.1.0/mcp_server/storage/working_store.py +434 -0
- codevira-3.1.0/mcp_server/tools/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/check_conflict.py +4 -0
- codevira-3.1.0/mcp_server/tools/consensus.py +138 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/learning.py +75 -2
- codevira-3.1.0/mcp_server/tools/reflections.py +125 -0
- codevira-3.1.0/mcp_server/tools/skills.py +411 -0
- codevira-3.1.0/mcp_server/tools/spatial.py +521 -0
- codevira-3.1.0/mcp_server/tools/working.py +349 -0
- {codevira-3.0.0 → codevira-3.1.0}/pyproject.toml +2 -2
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_check_conflict.py +69 -0
- codevira-3.1.0/tests/test_cli_consensus.py +426 -0
- codevira-3.1.0/tests/test_cli_graph.py +852 -0
- codevira-3.1.0/tests/test_cli_induce.py +859 -0
- codevira-3.1.0/tests/test_cli_working.py +109 -0
- codevira-3.1.0/tests/test_consensus_handshake.py +585 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_ide_inject.py +391 -0
- codevira-3.1.0/tests/test_reflections.py +764 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_tools_learning.py +65 -0
- codevira-3.1.0/tests/test_tools_skills.py +359 -0
- codevira-3.1.0/tests/test_tools_spatial.py +608 -0
- codevira-3.1.0/tests/test_tools_working.py +306 -0
- codevira-3.0.0/mcp_server/cli_graph.py +0 -447
- codevira-3.0.0/tests/test_cli_graph.py +0 -162
- {codevira-3.0.0 → codevira-3.1.0}/LICENSE +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/MANIFEST.in +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/builder.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/developer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/documenter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/orchestrator.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/planner.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/01-code-review.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/02-adversarial-fix-review.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/03-cross-module-impact.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/06-doc-drift.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/07-security-audit.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/12-llm-redteam.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/13-multi-ide-schema.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/22-competitor-benchmark.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/tier2-scripts.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/qa/tier3-manual.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/reviewer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/agents/tester.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/codevira.egg-info/dependency_links.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/codevira.egg-info/entry_points.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/codevira.egg-info/requires.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/codevira.egg-info/top_level.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/config.example.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/alpha-tester-invites.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/architecture.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/audit-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/demo/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/foolproof-product-charter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/00-engine.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/01-decision-lock.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/02-anti-regression.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/03-scope-contract.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/04-blast-radius.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/05-cross-session.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/06-token-budget.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/07-live-style.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/08-decision-replay.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/09-intent-inference.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/10-ai-promotion.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/heroes/pillar-1-setup.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/hn-launch-day.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/how-i-built-persistent-memory-for-ai-agents.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/internal/competitive-landscape.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/linkedin-article-ai-agent-memory.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/linkedin-post-ai-agent-memory.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/local-pypi-https.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/medium-your-ai-coding-agent-has-amnesia.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/morning-handoff-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/plans/v2.1.2.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/plans/v2.1.3.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/plans/v2.2.0.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/plans/v3.0.0.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/qa-playbook.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/release-process.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/roadmap.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/surface-cuts-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/troubleshooting/antigravity.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/v2-completion-plan.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/v2-execution-log.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/v2-master-plan.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/docs/vs-other-memory-tools.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/graph/_schema.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/_dedupe_migration.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/_fork_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/_sqlite_util.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/chunker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/fix_history.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/global_db.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/graph_generator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/index_codebase.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/outcome_tracker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/sqlite_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/indexer/treesitter_parser.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/__main__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_ghost_check.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_mcp_registry.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_project_inventory.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_repair_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/_safe_crash.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/auto_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_export.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_hooks_admin.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_projects.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_sync.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/cli_uninstall.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/crash_logger.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/builder.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/developer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/documenter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/orchestrator.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/planner.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/reviewer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/agents/tester.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/config.example.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/hooks/post_tool_use.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/hooks/pre_tool_use.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/hooks/session_start.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/hooks/stop.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/hooks/user_prompt_submit.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/coding-standards-generic.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/coding-standards-go.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/coding-standards-typescript.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/coding-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/engineering-excellence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/git-cicd-governance.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/git_commits.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/incremental-updates.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/master_rule.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/multi-language.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/persistence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/resilience-observability.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/smoke-testing.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/data/rules/testing-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/decision_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/doctor.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/demo_policy.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/events.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/_signature_detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/anti_regression.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/blast_radius.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/decision_lock.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/post_edit_refresh.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policies/token_budget.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/policy.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/runner.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/signals.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/token_meter.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/wiring/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/engine/wiring/claude_code_hooks.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/gitignore.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/global_sync.py +0 -0
- {codevira-3.0.0/mcp_server/tools → codevira-3.1.0/mcp_server/graph}/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/http_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/launchd.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/log_retention.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/migrate.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/paths.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/roadmap_drift.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/setup_wizard.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/atomic.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/digest.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/manifest.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/storage/token_estimator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/changesets.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/code_reader.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/playbook.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/roadmap.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/mcp_server/tools/search.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/coding-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/engineering-excellence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/git-cicd-governance.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/git_commits.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/incremental-updates.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/master_rule.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/persistence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/resilience-observability.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/smoke-testing.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/rules/testing-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/setup.cfg +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test__prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_auto_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_call_edge_fk_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_chunker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_cli_projects.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_cli_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_cli_uninstall.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_cli_version.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_crash_logger.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_dedupe_migration.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_doctor.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_fk_safety_extended.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_fork_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_ghost_check.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_gitignore.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_global_db.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_global_sync.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_graph_generator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_hook_resilience.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_http_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_index_codebase.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_launchd.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_log_retention.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_migrate.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_outcome_tracker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_paths.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_record_decision.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_repair_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_roadmap_drift.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_setup_wizard.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_sqlite_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_sqlite_util.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_tools_code_reader.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_tools_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_tools_playbook.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_tools_roadmap.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_treesitter_parser.py +0 -0
- {codevira-3.0.0 → codevira-3.1.0}/tests/test_watcher_circuit.py +0 -0
|
@@ -9,6 +9,242 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [3.1.0] — Five memory subsystems + cross-IDE consensus
|
|
13
|
+
|
|
14
|
+
v3.1.0 adds five memory subsystems on top of the v3.0.x decision
|
|
15
|
+
log, plus a cross-IDE consensus layer. Every addition is additive
|
|
16
|
+
to the existing schemas; v3.0.x records continue to read without
|
|
17
|
+
migration. The MCP surface gains 22 new tools across the new
|
|
18
|
+
subsystems.
|
|
19
|
+
|
|
20
|
+
### v3.0.x storage prereq (ships first)
|
|
21
|
+
|
|
22
|
+
- **`refactor(jsonl_store)`** — extract `read_merged` / `compact` /
|
|
23
|
+
`read_recent` from `decisions_store._read_merged` /
|
|
24
|
+
`sessions_store.read_recent`. The five new memory subsystems
|
|
25
|
+
share this amendment-overlay primitive instead of duplicating
|
|
26
|
+
it. Tests cover amendment-chain-three-deep recursion semantics.
|
|
27
|
+
Zero behavior change for existing callers.
|
|
28
|
+
|
|
29
|
+
- **`fix(session_id)`** — `decisions_store.record` and
|
|
30
|
+
`sessions_store.write` now default `session_id` to
|
|
31
|
+
`f"ad-hoc-{secrets.token_hex(3)}"` (e.g., `ad-hoc-a1b2c3`)
|
|
32
|
+
instead of the literal string `"ad-hoc"`. Every concurrent IDE
|
|
33
|
+
that didn't pass a slug previously collided into one bucket;
|
|
34
|
+
the unique-per-call default fixes cross-IDE attribution.
|
|
35
|
+
|
|
36
|
+
### M1 — Origin tagging (provenance)
|
|
37
|
+
|
|
38
|
+
Every decision and session write now carries an `origin` block:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
"origin": {"ide": "claude_code", "agent_model": "...",
|
|
42
|
+
"host_hash": "<12 hex chars>", "ts": "..."}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- `host_hash` = `sha1(uuid.getnode() bytes + username)[:12]` —
|
|
46
|
+
stable per machine (MAC-based, `platform.node()` fallback),
|
|
47
|
+
privacy-preserving (no plaintext hostname/username leaks).
|
|
48
|
+
- `CODEVIRA_IDE` env var read at MCP server startup; default
|
|
49
|
+
`"unknown"`. `ide_inject.py` now writes `CODEVIRA_IDE=<ide_key>`
|
|
50
|
+
into the MCP config block for all 10 supported IDE configs
|
|
51
|
+
(Claude Code, Claude Desktop, Cursor, Windsurf, Antigravity —
|
|
52
|
+
per-project + global).
|
|
53
|
+
- `check_conflict` response includes the candidate's `origin` so
|
|
54
|
+
agents can see "this conflicts with a decision Cursor wrote 3
|
|
55
|
+
days ago" instead of just an opaque decision_id.
|
|
56
|
+
- Reads tolerate `origin` absent (legacy v3.0.x records treated
|
|
57
|
+
as `ide="unknown"`).
|
|
58
|
+
|
|
59
|
+
### M2 — Working memory
|
|
60
|
+
|
|
61
|
+
Bounded, decay-scored intra-session scratchpad.
|
|
62
|
+
|
|
63
|
+
- `.codevira-cache/working.jsonl` (per-machine, ephemeral,
|
|
64
|
+
gitignored). Auto-populated by `post_tool_use` hook on Edit /
|
|
65
|
+
Write / MultiEdit / NotebookEdit / update_node (importance 4),
|
|
66
|
+
Bash (importance 3), tool errors (importance bumped to 7).
|
|
67
|
+
- 4 MCP tools: `working_add`, `working_get`, `working_promote`
|
|
68
|
+
(to=decision|skill|playbook with check_conflict gate), and
|
|
69
|
+
`get_working_context` (compact markdown for ReAct loops).
|
|
70
|
+
- Decay score: `importance × exp(-Δt_hours / 6) + 0.5 ×
|
|
71
|
+
access_count`. Top-3 surfaces in `get_session_context`.
|
|
72
|
+
- Eviction = amendment tombstone; periodic compaction during
|
|
73
|
+
`codevira sync`.
|
|
74
|
+
- CLI: `codevira working commit <session_id>` archives a
|
|
75
|
+
session's live entries to
|
|
76
|
+
`.codevira/working_archived/<session_id>.jsonl`.
|
|
77
|
+
|
|
78
|
+
### M3 — Skill library (procedural memory)
|
|
79
|
+
|
|
80
|
+
`.codevira/skills.jsonl` (canonical, team-shareable). FTS5
|
|
81
|
+
retrieval + composite ranking.
|
|
82
|
+
|
|
83
|
+
- `skill_fts` virtual table in the existing
|
|
84
|
+
`.codevira-cache/fts5.sqlite`. Independent staleness key
|
|
85
|
+
(`skill_source_mtime`) so the existing decisions tracking is
|
|
86
|
+
unaffected.
|
|
87
|
+
- Composite ranking:
|
|
88
|
+
`score = 0.5 × BM25_norm + 0.3 × tag_jaccard + 0.2 ×
|
|
89
|
+
recency_decay(τ=30d)`. Never-used skills score 0 recency —
|
|
90
|
+
reinforcement, not existence, drives the recency signal.
|
|
91
|
+
- 6 MCP tools: `record_skill`, `get_skill`, `apply_skill_outcome`,
|
|
92
|
+
`list_skills`, `supersede_skill`,
|
|
93
|
+
`promote_skill_to_playbook` (writes
|
|
94
|
+
`.codevira/playbooks/<task_type>/<slug>.md`).
|
|
95
|
+
- Lifecycle states: `active` (default), `archived` (5 consec
|
|
96
|
+
failures OR `unused_days ≥ 90` — configurable; do_not_revert
|
|
97
|
+
exempt), `superseded` (final).
|
|
98
|
+
- M5 wires git-derived outcomes_writer to skill reinforcement (see
|
|
99
|
+
below).
|
|
100
|
+
|
|
101
|
+
### M4 — Spatial memory
|
|
102
|
+
|
|
103
|
+
Activity heatmap + folder-tree neighborhoods + affordances.
|
|
104
|
+
|
|
105
|
+
- `.codevira-cache/activity.jsonl` (per-machine). Auto-emitted on
|
|
106
|
+
Edit/Write via `memory_fanout` + on `decisions_store.record`
|
|
107
|
+
when `file_path` is set. Schema: `{id, ts, node_id, kind:
|
|
108
|
+
edit|decision_ref, session_id, origin, _schema_v: 1}`.
|
|
109
|
+
- 4 MCP tools: `spatial_nearby` (BFS ≤ 2 hops over the indexer
|
|
110
|
+
graph + same-neighborhood union, ranked by `(1/(1+bfs_dist)) ×
|
|
111
|
+
log(1+visit_count_30d)`), `spatial_heat`,
|
|
112
|
+
`spatial_neighborhood`, `spatial_affordances`.
|
|
113
|
+
- Folder-tree neighborhoods (top-2 dir components, e.g.,
|
|
114
|
+
`mcp_server/storage`). Project-overridable via
|
|
115
|
+
`.codevira/neighborhoods.yaml`.
|
|
116
|
+
- Bundled `mcp_server/data/affordances.yaml` mapping file globs to
|
|
117
|
+
task_type affordances (e.g., `mcp_server/tools/*.py` →
|
|
118
|
+
`{add_tool, write_test}`). Project override:
|
|
119
|
+
`.codevira/affordances.yaml`; bundled + project union per match.
|
|
120
|
+
|
|
121
|
+
### M5 — Skill induction wired to outcomes_writer
|
|
122
|
+
|
|
123
|
+
Closes the reinforcement loop. Two pieces:
|
|
124
|
+
|
|
125
|
+
- **Sessions schema additions**: `task_type` (`feature` | `bug` |
|
|
126
|
+
`refactor` | `release` | `docs` | `other`) and `skill_ids: []`
|
|
127
|
+
(skills used during the session). Additive; legacy sessions
|
|
128
|
+
tolerate absence.
|
|
129
|
+
- **outcomes_writer fan-out**: when `observe_all()` classifies a
|
|
130
|
+
decision as `kept` or `reverted`, each skill referenced via
|
|
131
|
+
`skill_ids` on the same session gets `mark_used(success=…)`.
|
|
132
|
+
Pre-builds a `{session_id → set[skill_id]}` index so the
|
|
133
|
+
per-decision fan-out is O(1). Best-effort: skill errors log and
|
|
134
|
+
drop without blocking the decision-outcome write.
|
|
135
|
+
- **CLI**: `codevira induce-skills [--apply] [--yes]` —
|
|
136
|
+
deterministic induction (no LLM in v3.1.0). Pipeline: filter
|
|
137
|
+
sessions with ≥80% kept; group by task_type; cluster by
|
|
138
|
+
tag-Jaccard ≥ 0.5; keep clusters ≥3 sessions; render candidate
|
|
139
|
+
skill with `name = "<task_type>: <top-3 tags>"`,
|
|
140
|
+
`procedure = bullet-summary of session.task +
|
|
141
|
+
decision.decision` (capped 30 lines).
|
|
142
|
+
|
|
143
|
+
### M6 — Consensus Phase B (cross-IDE conflict check, read-only)
|
|
144
|
+
|
|
145
|
+
- Per-IDE checkpoint files
|
|
146
|
+
`.codevira/checkpoints/<ide_key>.json` keyed on
|
|
147
|
+
`last_seen_decision_id` — zero-padded base-36 D-ids preserve
|
|
148
|
+
monotonic ordering without clock drift.
|
|
149
|
+
- `consensus_store.scan_and_materialize()`: walks decisions with
|
|
150
|
+
`id > checkpoint`, partitions by `origin.ide` into
|
|
151
|
+
`current_corpus` + `foreign`, runs the reused `check_conflict`
|
|
152
|
+
tokenize/Jaccard/overlap math on every pair, records matches as
|
|
153
|
+
PC-prefixed rows in `.codevira/pending_conflicts.jsonl`.
|
|
154
|
+
- 2 MCP tools: `consensus_check`, `consensus_status`.
|
|
155
|
+
`get_session_context` surfaces a top-3 panel sorted by
|
|
156
|
+
`(do_not_revert × recency)`.
|
|
157
|
+
- CLI: `codevira consensus check`. Read-only — no amendment rows
|
|
158
|
+
written on decisions.
|
|
159
|
+
|
|
160
|
+
### M7 — Consensus Phase C handshake (opt-in, default off)
|
|
161
|
+
|
|
162
|
+
Opt-in belief-revision protocol gated behind
|
|
163
|
+
`memory.consensus.handshake_enabled` in `.codevira/config.yaml`.
|
|
164
|
+
|
|
165
|
+
- New `config.py` helper for dotted-key lookups against
|
|
166
|
+
`.codevira/config.yaml`.
|
|
167
|
+
- `propose_supersession` (cross-IDE) appends a
|
|
168
|
+
`proposed_supersession` row with `expires_at = ts +
|
|
169
|
+
handshake_timeout_days` (default 14, configurable). Same-IDE
|
|
170
|
+
fast-path returns `{fast_path: True}` so the caller routes to
|
|
171
|
+
`decisions_store.supersede` directly.
|
|
172
|
+
- `resolve_proposal(action: approved|rejected|withdrawn)`
|
|
173
|
+
appends a resolution row carrying `resolver_origin`.
|
|
174
|
+
- `finalize_proposal(expired_unilateral=False)` — approved
|
|
175
|
+
proposals turn into a real `decisions_store.supersede` call.
|
|
176
|
+
Expired proposals require `expired_unilateral=True` (deadlock
|
|
177
|
+
safety); the audit row records the force-finalize.
|
|
178
|
+
- 3 MCP tools: `consensus_propose_supersession`,
|
|
179
|
+
`consensus_resolve`, `origin_of` (provenance lookup; always
|
|
180
|
+
available).
|
|
181
|
+
- Row kind taxonomy in pending_conflicts.jsonl: `conflict` (M6),
|
|
182
|
+
`proposed_supersession` (M7), `resolution` (M7).
|
|
183
|
+
|
|
184
|
+
### M8 — Reflections (durable LLM abstractions)
|
|
185
|
+
|
|
186
|
+
Generative-Agents-style abstractions over recent decisions +
|
|
187
|
+
sessions.
|
|
188
|
+
|
|
189
|
+
- `.codevira/reflections.jsonl` (canonical, committed) +
|
|
190
|
+
`.codevira/reflection_proposals.jsonl` (review staging).
|
|
191
|
+
- `scrub_sensitive` strips api keys, Bearer tokens, passwords,
|
|
192
|
+
AWS-style AKIA, long hex/base64 from source records before the
|
|
193
|
+
LLM sees them.
|
|
194
|
+
- `build_source_context` aggregates sessions + decisions in the
|
|
195
|
+
period window with plan caps (≤30 sessions, ≤100 decisions,
|
|
196
|
+
≤6 KB envelope).
|
|
197
|
+
- Bundled prompt template at
|
|
198
|
+
`mcp_server/data/prompts/reflection_v1.md`.
|
|
199
|
+
- **MCP sampling integration scope**: v3.1.0 ships the storage +
|
|
200
|
+
sanitization + prompt rendering + the API surface. The
|
|
201
|
+
`sampling/createMessage` RPC that asks the host LLM for the
|
|
202
|
+
abstraction is the **v3.2** deliverable. v3.1.0 `reflect()`
|
|
203
|
+
returns `{sampling_supported: False, rendered_prompt,
|
|
204
|
+
source_context, deferred_to: "v3.2"}`; the CLI accepts an LLM
|
|
205
|
+
response via `--from-file`.
|
|
206
|
+
- 3 MCP tools: `reflect`, `get_reflections`, `list_reflections`.
|
|
207
|
+
- CLI: `codevira reflect [--period 7d] [--from-file PATH]
|
|
208
|
+
[--apply] [--yes]`. Render mode prints the prompt;
|
|
209
|
+
`--from-file` parses the LLM YAML response and writes a
|
|
210
|
+
proposal; `--apply --yes` commits to `reflections.jsonl`.
|
|
211
|
+
|
|
212
|
+
### Schema versioning convention
|
|
213
|
+
|
|
214
|
+
All NEW JSONL stores (`working`, `skills`, `activity`,
|
|
215
|
+
`pending_conflicts`, `reflections`) carry `_schema_v: 1` on each
|
|
216
|
+
record. Readers tolerate absence (treats as v1). Existing
|
|
217
|
+
`decisions.jsonl` / `sessions.jsonl` are unchanged.
|
|
218
|
+
|
|
219
|
+
### `get_session_context` panels
|
|
220
|
+
|
|
221
|
+
Now carries five panels in addition to the existing roadmap /
|
|
222
|
+
recent decisions:
|
|
223
|
+
- `working` — top-3 live entries (M2).
|
|
224
|
+
- `consensus` — top-3 pending conflicts (M6) sorted by
|
|
225
|
+
`(do_not_revert × recency)`.
|
|
226
|
+
The plan reserves panels for working, skills, spatial,
|
|
227
|
+
reflections in future ticks if value justifies the token cost.
|
|
228
|
+
|
|
229
|
+
### Tests
|
|
230
|
+
|
|
231
|
+
~450+ new tests across `tests/storage/`, `tests/test_tools_*`,
|
|
232
|
+
`tests/test_cli_*`, `tests/test_reflections.py`,
|
|
233
|
+
`tests/test_consensus_handshake.py`, etc. The full v3.1.0 suite
|
|
234
|
+
runs in <20s; zero regressions from the v3.0.x baseline.
|
|
235
|
+
|
|
236
|
+
### Locked decisions honored
|
|
237
|
+
|
|
238
|
+
The v3.0.0 locks remain intact:
|
|
239
|
+
- D000001 (atomic writes through `mcp_server/storage/atomic.py`)
|
|
240
|
+
- D000012 (WRITE-path forbidden-root validation via
|
|
241
|
+
`ensure_dirs`)
|
|
242
|
+
- The v2.2.0 "no embeddings; FTS5 + Jaccard only" decision —
|
|
243
|
+
M3's skill retrieval and M6's conflict check both use the
|
|
244
|
+
existing FTS5/Jaccard infrastructure; no new embedding deps.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
12
248
|
## [3.0.0] — 2026-05-27 — Lean, audited, opinionated
|
|
13
249
|
|
|
14
250
|
### Hardened (RC audit — rounds 2 + 3, pre-publish)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: codevira
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: Cross-IDE decision enforcement for AI coding agents. 1 MB per project, in your repo, no cloud, no vectors. Claude Code, Cursor, Windsurf, Antigravity, Codex all share the same in-repo memory; hooks block AI tool calls that violate prior decisions. MIT, local-first.
|
|
5
5
|
Author-email: Sachin Shelke <sachin.worldnet@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: codevira
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.0
|
|
4
4
|
Summary: Cross-IDE decision enforcement for AI coding agents. 1 MB per project, in your repo, no cloud, no vectors. Claude Code, Cursor, Windsurf, Antigravity, Codex all share the same in-repo memory; hooks block AI tool calls that violate prior decisions. MIT, local-first.
|
|
5
5
|
Author-email: Sachin Shelke <sachin.worldnet@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -90,14 +90,18 @@ mcp_server/_repair_init.py
|
|
|
90
90
|
mcp_server/_safe_crash.py
|
|
91
91
|
mcp_server/auto_init.py
|
|
92
92
|
mcp_server/cli.py
|
|
93
|
+
mcp_server/cli_consensus.py
|
|
93
94
|
mcp_server/cli_export.py
|
|
94
95
|
mcp_server/cli_graph.py
|
|
95
96
|
mcp_server/cli_hooks_admin.py
|
|
97
|
+
mcp_server/cli_induce.py
|
|
96
98
|
mcp_server/cli_init.py
|
|
97
99
|
mcp_server/cli_projects.py
|
|
100
|
+
mcp_server/cli_reflect.py
|
|
98
101
|
mcp_server/cli_replay.py
|
|
99
102
|
mcp_server/cli_sync.py
|
|
100
103
|
mcp_server/cli_uninstall.py
|
|
104
|
+
mcp_server/cli_working.py
|
|
101
105
|
mcp_server/crash_logger.py
|
|
102
106
|
mcp_server/decision_replay.py
|
|
103
107
|
mcp_server/detect.py
|
|
@@ -115,6 +119,7 @@ mcp_server/roadmap_drift.py
|
|
|
115
119
|
mcp_server/server.py
|
|
116
120
|
mcp_server/setup_wizard.py
|
|
117
121
|
mcp_server/data/__init__.py
|
|
122
|
+
mcp_server/data/affordances.yaml
|
|
118
123
|
mcp_server/data/config.example.yaml
|
|
119
124
|
mcp_server/data/agents/builder.md
|
|
120
125
|
mcp_server/data/agents/developer.md
|
|
@@ -128,6 +133,7 @@ mcp_server/data/hooks/pre_tool_use.sh
|
|
|
128
133
|
mcp_server/data/hooks/session_start.sh
|
|
129
134
|
mcp_server/data/hooks/stop.sh
|
|
130
135
|
mcp_server/data/hooks/user_prompt_submit.sh
|
|
136
|
+
mcp_server/data/prompts/reflection_v1.md
|
|
131
137
|
mcp_server/data/rules/coding-standards-generic.md
|
|
132
138
|
mcp_server/data/rules/coding-standards-go.md
|
|
133
139
|
mcp_server/data/rules/coding-standards-typescript.md
|
|
@@ -145,6 +151,7 @@ mcp_server/data/rules/testing-standards.md
|
|
|
145
151
|
mcp_server/engine/__init__.py
|
|
146
152
|
mcp_server/engine/demo_policy.py
|
|
147
153
|
mcp_server/engine/events.py
|
|
154
|
+
mcp_server/engine/memory_fanout.py
|
|
148
155
|
mcp_server/engine/policy.py
|
|
149
156
|
mcp_server/engine/runner.py
|
|
150
157
|
mcp_server/engine/signals.py
|
|
@@ -160,27 +167,42 @@ mcp_server/engine/policies/token_budget.py
|
|
|
160
167
|
mcp_server/engine/wiring/__init__.py
|
|
161
168
|
mcp_server/engine/wiring/claude_code_hooks.py
|
|
162
169
|
mcp_server/engine/wiring/mcp_dispatch.py
|
|
170
|
+
mcp_server/graph/__init__.py
|
|
171
|
+
mcp_server/graph/template.html
|
|
163
172
|
mcp_server/storage/__init__.py
|
|
173
|
+
mcp_server/storage/activity_store.py
|
|
164
174
|
mcp_server/storage/agents_md_generator.py
|
|
165
175
|
mcp_server/storage/atomic.py
|
|
176
|
+
mcp_server/storage/config.py
|
|
177
|
+
mcp_server/storage/consensus_store.py
|
|
166
178
|
mcp_server/storage/decisions_store.py
|
|
167
179
|
mcp_server/storage/digest.py
|
|
168
180
|
mcp_server/storage/fts5_index.py
|
|
169
181
|
mcp_server/storage/jsonl_store.py
|
|
170
182
|
mcp_server/storage/manifest.py
|
|
183
|
+
mcp_server/storage/origin.py
|
|
171
184
|
mcp_server/storage/outcomes_writer.py
|
|
172
185
|
mcp_server/storage/paths.py
|
|
186
|
+
mcp_server/storage/reflections_store.py
|
|
187
|
+
mcp_server/storage/sanitize.py
|
|
173
188
|
mcp_server/storage/sessions_store.py
|
|
189
|
+
mcp_server/storage/skills_store.py
|
|
174
190
|
mcp_server/storage/token_estimator.py
|
|
191
|
+
mcp_server/storage/working_store.py
|
|
175
192
|
mcp_server/tools/__init__.py
|
|
176
193
|
mcp_server/tools/changesets.py
|
|
177
194
|
mcp_server/tools/check_conflict.py
|
|
178
195
|
mcp_server/tools/code_reader.py
|
|
196
|
+
mcp_server/tools/consensus.py
|
|
179
197
|
mcp_server/tools/graph.py
|
|
180
198
|
mcp_server/tools/learning.py
|
|
181
199
|
mcp_server/tools/playbook.py
|
|
200
|
+
mcp_server/tools/reflections.py
|
|
182
201
|
mcp_server/tools/roadmap.py
|
|
183
202
|
mcp_server/tools/search.py
|
|
203
|
+
mcp_server/tools/skills.py
|
|
204
|
+
mcp_server/tools/spatial.py
|
|
205
|
+
mcp_server/tools/working.py
|
|
184
206
|
rules/coding-standards.md
|
|
185
207
|
rules/engineering-excellence.md
|
|
186
208
|
rules/git-cicd-governance.md
|
|
@@ -196,11 +218,15 @@ tests/test_auto_init.py
|
|
|
196
218
|
tests/test_call_edge_fk_safety.py
|
|
197
219
|
tests/test_check_conflict.py
|
|
198
220
|
tests/test_chunker.py
|
|
221
|
+
tests/test_cli_consensus.py
|
|
199
222
|
tests/test_cli_graph.py
|
|
223
|
+
tests/test_cli_induce.py
|
|
200
224
|
tests/test_cli_projects.py
|
|
201
225
|
tests/test_cli_replay.py
|
|
202
226
|
tests/test_cli_uninstall.py
|
|
203
227
|
tests/test_cli_version.py
|
|
228
|
+
tests/test_cli_working.py
|
|
229
|
+
tests/test_consensus_handshake.py
|
|
204
230
|
tests/test_crash_logger.py
|
|
205
231
|
tests/test_dedupe_migration.py
|
|
206
232
|
tests/test_detect.py
|
|
@@ -223,6 +249,7 @@ tests/test_outcome_tracker.py
|
|
|
223
249
|
tests/test_paths.py
|
|
224
250
|
tests/test_prompts.py
|
|
225
251
|
tests/test_record_decision.py
|
|
252
|
+
tests/test_reflections.py
|
|
226
253
|
tests/test_repair_init.py
|
|
227
254
|
tests/test_roadmap_drift.py
|
|
228
255
|
tests/test_server.py
|
|
@@ -234,5 +261,8 @@ tests/test_tools_graph.py
|
|
|
234
261
|
tests/test_tools_learning.py
|
|
235
262
|
tests/test_tools_playbook.py
|
|
236
263
|
tests/test_tools_roadmap.py
|
|
264
|
+
tests/test_tools_skills.py
|
|
265
|
+
tests/test_tools_spatial.py
|
|
266
|
+
tests/test_tools_working.py
|
|
237
267
|
tests/test_treesitter_parser.py
|
|
238
268
|
tests/test_watcher_circuit.py
|
|
@@ -1139,6 +1139,18 @@ def main() -> None:
|
|
|
1139
1139
|
action="store_false",
|
|
1140
1140
|
help="Decisions-only view (omit the code-file overlay)",
|
|
1141
1141
|
)
|
|
1142
|
+
graph_parser.add_argument(
|
|
1143
|
+
"--no-skills",
|
|
1144
|
+
dest="with_skills",
|
|
1145
|
+
action="store_false",
|
|
1146
|
+
help="Omit the skills overlay (procedural memory)",
|
|
1147
|
+
)
|
|
1148
|
+
graph_parser.add_argument(
|
|
1149
|
+
"--no-reflections",
|
|
1150
|
+
dest="with_reflections",
|
|
1151
|
+
action="store_false",
|
|
1152
|
+
help="Omit the reflections overlay (LLM abstractions)",
|
|
1153
|
+
)
|
|
1142
1154
|
graph_parser.add_argument(
|
|
1143
1155
|
"--dry-run",
|
|
1144
1156
|
action="store_true",
|
|
@@ -1239,6 +1251,106 @@ def main() -> None:
|
|
|
1239
1251
|
),
|
|
1240
1252
|
)
|
|
1241
1253
|
|
|
1254
|
+
# v3.1.0 M8: reflections — codevira reflect [--period 7d]
|
|
1255
|
+
# [--from-file PATH] [--apply] [--yes]. Without --from-file the
|
|
1256
|
+
# CLI prints the rendered prompt + source-context summary for the
|
|
1257
|
+
# user to feed to their own LLM; with --from-file it parses the
|
|
1258
|
+
# LLM response and writes a proposal (or commits with --apply).
|
|
1259
|
+
reflect_parser = subparsers.add_parser(
|
|
1260
|
+
"reflect",
|
|
1261
|
+
help="Build a reflection over recent decisions + sessions "
|
|
1262
|
+
"(v3.1.0 M8). MCP sampling/createMessage integration ships "
|
|
1263
|
+
"in v3.2; meanwhile this CLI renders the prompt and accepts "
|
|
1264
|
+
"an LLM response via --from-file.",
|
|
1265
|
+
)
|
|
1266
|
+
reflect_parser.add_argument(
|
|
1267
|
+
"--period",
|
|
1268
|
+
type=int,
|
|
1269
|
+
default=7,
|
|
1270
|
+
help="Look-back window in days (default 7).",
|
|
1271
|
+
)
|
|
1272
|
+
reflect_parser.add_argument(
|
|
1273
|
+
"--from-file",
|
|
1274
|
+
type=str,
|
|
1275
|
+
default=None,
|
|
1276
|
+
help="Read an LLM YAML response from this file (per the prompt "
|
|
1277
|
+
"template) and persist it as a reflection proposal.",
|
|
1278
|
+
)
|
|
1279
|
+
reflect_parser.add_argument(
|
|
1280
|
+
"--apply",
|
|
1281
|
+
action="store_true",
|
|
1282
|
+
help="Commit to .codevira/reflections.jsonl (otherwise the "
|
|
1283
|
+
"result lands in reflection_proposals.jsonl for review).",
|
|
1284
|
+
)
|
|
1285
|
+
reflect_parser.add_argument(
|
|
1286
|
+
"--yes",
|
|
1287
|
+
action="store_true",
|
|
1288
|
+
help="With --apply: skip the interactive confirm prompt.",
|
|
1289
|
+
)
|
|
1290
|
+
|
|
1291
|
+
# v3.1.0 M6 Phase B: cross-IDE consensus check (read-only). The
|
|
1292
|
+
# MCP surface (consensus_check / consensus_status) is also exposed.
|
|
1293
|
+
consensus_parser = subparsers.add_parser(
|
|
1294
|
+
"consensus",
|
|
1295
|
+
help="Cross-IDE consensus operations (v3.1.0 M6). `check` "
|
|
1296
|
+
"materializes conflicts between decisions written by this IDE "
|
|
1297
|
+
"vs other IDEs into .codevira/pending_conflicts.jsonl for "
|
|
1298
|
+
"human review. No automatic resolution; the handshake "
|
|
1299
|
+
"protocol is M7 (opt-in).",
|
|
1300
|
+
)
|
|
1301
|
+
consensus_sub = consensus_parser.add_subparsers(dest="consensus_action")
|
|
1302
|
+
consensus_sub.add_parser(
|
|
1303
|
+
"check",
|
|
1304
|
+
help="Scan for conflicts since the last checkpoint; advance "
|
|
1305
|
+
"this IDE's checkpoint.",
|
|
1306
|
+
)
|
|
1307
|
+
|
|
1308
|
+
# v3.1.0 M5: induced-skill candidate generation. CLI-only — the MCP
|
|
1309
|
+
# surface for skills is record_skill / get_skill / list_skills.
|
|
1310
|
+
induce_parser = subparsers.add_parser(
|
|
1311
|
+
"induce-skills",
|
|
1312
|
+
help="Cluster productive sessions and propose induced skills "
|
|
1313
|
+
"(v3.1.0 M5). Without --apply: writes proposals to "
|
|
1314
|
+
".codevira/induction_proposals.jsonl for human review. With "
|
|
1315
|
+
"--apply: interactively confirms each proposal (use --yes to "
|
|
1316
|
+
"skip prompts in CI).",
|
|
1317
|
+
)
|
|
1318
|
+
induce_parser.add_argument(
|
|
1319
|
+
"--apply",
|
|
1320
|
+
action="store_true",
|
|
1321
|
+
help="Commit the proposals as induced skills "
|
|
1322
|
+
"(otherwise dry-run to induction_proposals.jsonl)",
|
|
1323
|
+
)
|
|
1324
|
+
induce_parser.add_argument(
|
|
1325
|
+
"--yes",
|
|
1326
|
+
action="store_true",
|
|
1327
|
+
help="With --apply: skip the interactive confirm prompt "
|
|
1328
|
+
"(non-interactive, CI-safe).",
|
|
1329
|
+
)
|
|
1330
|
+
|
|
1331
|
+
# v3.1.0 M2 Phase 3: working-memory subcommands. The MCP tool
|
|
1332
|
+
# surface (working_add / working_get / working_promote) is the
|
|
1333
|
+
# everyday agent-facing API; this CLI tier is the escape hatch for
|
|
1334
|
+
# a human user operating on the per-machine cache outside an IDE.
|
|
1335
|
+
working_parser = subparsers.add_parser(
|
|
1336
|
+
"working",
|
|
1337
|
+
help="Operate on working memory (v3.1.0 M2). `commit <session_id>` "
|
|
1338
|
+
"copies a session's live scratchpad entries from the per-machine "
|
|
1339
|
+
"cache (.codevira-cache/working.jsonl) to the canonical archive "
|
|
1340
|
+
"(.codevira/working_archived/<session_id>.jsonl).",
|
|
1341
|
+
)
|
|
1342
|
+
working_sub = working_parser.add_subparsers(dest="working_action")
|
|
1343
|
+
working_commit_parser = working_sub.add_parser(
|
|
1344
|
+
"commit",
|
|
1345
|
+
help="Promote a session's live working entries to the canonical archive.",
|
|
1346
|
+
)
|
|
1347
|
+
working_commit_parser.add_argument(
|
|
1348
|
+
"session_id",
|
|
1349
|
+
help="Session slug to commit (the value the MCP tool reported as "
|
|
1350
|
+
"session_id, typically `ad-hoc-XXXXXX` or an explicit slug you "
|
|
1351
|
+
"passed to working_add).",
|
|
1352
|
+
)
|
|
1353
|
+
|
|
1242
1354
|
engine_parser = subparsers.add_parser(
|
|
1243
1355
|
"engine",
|
|
1244
1356
|
help="Internal: lifecycle-hook engine entry (called by hook scripts)",
|
|
@@ -1270,7 +1382,7 @@ def main() -> None:
|
|
|
1270
1382
|
)
|
|
1271
1383
|
engine_sub.add_parser(
|
|
1272
1384
|
"enable",
|
|
1273
|
-
help="Re-enable hook engine policies (removes
|
|
1385
|
+
help="Re-enable hook engine policies (removes ~/.codevira/engine.disabled).",
|
|
1274
1386
|
)
|
|
1275
1387
|
engine_sub.add_parser(
|
|
1276
1388
|
"status",
|
|
@@ -1469,6 +1581,8 @@ def main() -> None:
|
|
|
1469
1581
|
out=getattr(args, "out", None),
|
|
1470
1582
|
dry_run=getattr(args, "dry_run", False),
|
|
1471
1583
|
with_files=getattr(args, "with_files", True),
|
|
1584
|
+
with_skills=getattr(args, "with_skills", True),
|
|
1585
|
+
with_reflections=getattr(args, "with_reflections", True),
|
|
1472
1586
|
)
|
|
1473
1587
|
sys.exit(rc)
|
|
1474
1588
|
elif args.command == "sync":
|
|
@@ -1497,6 +1611,51 @@ def main() -> None:
|
|
|
1497
1611
|
keep_data=getattr(args, "keep_data", False),
|
|
1498
1612
|
)
|
|
1499
1613
|
sys.exit(rc)
|
|
1614
|
+
elif args.command == "reflect":
|
|
1615
|
+
# v3.1.0 M8: reflections CLI.
|
|
1616
|
+
from mcp_server.cli_reflect import cmd_reflect
|
|
1617
|
+
|
|
1618
|
+
sys.exit(
|
|
1619
|
+
cmd_reflect(
|
|
1620
|
+
period_days=getattr(args, "period", 7),
|
|
1621
|
+
from_file=getattr(args, "from_file", None),
|
|
1622
|
+
apply=getattr(args, "apply", False),
|
|
1623
|
+
yes=getattr(args, "yes", False),
|
|
1624
|
+
)
|
|
1625
|
+
)
|
|
1626
|
+
elif args.command == "consensus":
|
|
1627
|
+
# v3.1.0 M6: cross-IDE consensus CLI.
|
|
1628
|
+
consensus_action = getattr(args, "consensus_action", None)
|
|
1629
|
+
if consensus_action == "check":
|
|
1630
|
+
from mcp_server.cli_consensus import cmd_consensus_check
|
|
1631
|
+
|
|
1632
|
+
sys.exit(cmd_consensus_check())
|
|
1633
|
+
sys.stderr.write(
|
|
1634
|
+
"codevira consensus: missing subcommand. Try `codevira consensus check`.\n"
|
|
1635
|
+
)
|
|
1636
|
+
sys.exit(2)
|
|
1637
|
+
elif args.command == "induce-skills":
|
|
1638
|
+
# v3.1.0 M5: skill induction CLI.
|
|
1639
|
+
from mcp_server.cli_induce import cmd_induce_skills
|
|
1640
|
+
|
|
1641
|
+
sys.exit(
|
|
1642
|
+
cmd_induce_skills(
|
|
1643
|
+
apply=getattr(args, "apply", False),
|
|
1644
|
+
yes=getattr(args, "yes", False),
|
|
1645
|
+
)
|
|
1646
|
+
)
|
|
1647
|
+
elif args.command == "working":
|
|
1648
|
+
# v3.1.0 M2 Phase 3: working-memory subcommands.
|
|
1649
|
+
working_action = getattr(args, "working_action", None)
|
|
1650
|
+
if working_action == "commit":
|
|
1651
|
+
from mcp_server.cli_working import cmd_working_commit
|
|
1652
|
+
|
|
1653
|
+
sys.exit(cmd_working_commit(getattr(args, "session_id", None)))
|
|
1654
|
+
sys.stderr.write(
|
|
1655
|
+
"codevira working: missing subcommand. Try `codevira working commit "
|
|
1656
|
+
"<session_id>`.\n"
|
|
1657
|
+
)
|
|
1658
|
+
sys.exit(2)
|
|
1500
1659
|
elif args.command == "engine":
|
|
1501
1660
|
# Internal — Claude Code hook scripts call us with `engine handle <event>`.
|
|
1502
1661
|
engine_action = getattr(args, "engine_action", None)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
cli_consensus.py — v3.1.0 M6 Phase B: ``codevira consensus check`` CLI.
|
|
3
|
+
|
|
4
|
+
Read-only scan that materializes cross-IDE conflicts to
|
|
5
|
+
``.codevira/pending_conflicts.jsonl`` for human review. Calls into
|
|
6
|
+
``consensus_store.scan_and_materialize`` so the same path also
|
|
7
|
+
backs the ``consensus_check`` MCP tool.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def cmd_consensus_check(*, verbose: bool = False) -> int:
|
|
16
|
+
"""Entry point for ``codevira consensus check``.
|
|
17
|
+
|
|
18
|
+
Returns 0 on success (including no conflicts found). Non-zero only
|
|
19
|
+
on storage / IO errors raised by the scan.
|
|
20
|
+
"""
|
|
21
|
+
try:
|
|
22
|
+
from mcp_server.storage import consensus_store
|
|
23
|
+
except Exception as exc: # noqa: BLE001
|
|
24
|
+
sys.stderr.write(
|
|
25
|
+
f"codevira consensus check: consensus_store import failed: {exc}\n"
|
|
26
|
+
)
|
|
27
|
+
return 1
|
|
28
|
+
|
|
29
|
+
try:
|
|
30
|
+
summary = consensus_store.scan_and_materialize()
|
|
31
|
+
except Exception as exc: # noqa: BLE001
|
|
32
|
+
sys.stderr.write(f"codevira consensus check: scan failed: {exc}\n")
|
|
33
|
+
return 1
|
|
34
|
+
|
|
35
|
+
if summary.get("skipped_reason"):
|
|
36
|
+
sys.stdout.write(
|
|
37
|
+
f"codevira consensus check: skipped — {summary['skipped_reason']}.\n"
|
|
38
|
+
f" Set CODEVIRA_IDE in your MCP config (ide_inject.py handles "
|
|
39
|
+
f"this for newly-injected IDE configs) and re-run.\n"
|
|
40
|
+
)
|
|
41
|
+
return 0
|
|
42
|
+
|
|
43
|
+
sys.stdout.write(
|
|
44
|
+
f"codevira consensus check: scanned {summary.get('scanned', 0)} "
|
|
45
|
+
f"decision(s) since last checkpoint "
|
|
46
|
+
f"(foreign-IDE: {summary.get('foreign', 0)}; "
|
|
47
|
+
f"conflicts recorded: {summary.get('conflicts_recorded', 0)}).\n"
|
|
48
|
+
f" Checkpoint advanced to "
|
|
49
|
+
f"{summary.get('new_checkpoint') or '<none>'}.\n"
|
|
50
|
+
)
|
|
51
|
+
if summary.get("conflicts_recorded"):
|
|
52
|
+
from mcp_server.storage import paths
|
|
53
|
+
|
|
54
|
+
sys.stdout.write(f" Review: {paths.pending_conflicts_path()}\n")
|
|
55
|
+
return 0
|