codevira 3.0.0__tar.gz → 3.1.1__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.1}/CHANGELOG.md +423 -0
- {codevira-3.0.0/codevira.egg-info → codevira-3.1.1}/PKG-INFO +23 -1
- {codevira-3.0.0 → codevira-3.1.1}/README.md +22 -0
- {codevira-3.0.0 → codevira-3.1.1/codevira.egg-info}/PKG-INFO +23 -1
- {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/SOURCES.txt +31 -0
- codevira-3.1.1/docs/release-notes/v3.1.1.md +200 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/__init__.py +1 -1
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli.py +160 -1
- codevira-3.1.1/mcp_server/cli_consensus.py +55 -0
- codevira-3.1.1/mcp_server/cli_graph.py +476 -0
- codevira-3.1.1/mcp_server/cli_induce.py +328 -0
- codevira-3.1.1/mcp_server/cli_reflect.py +170 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_sync.py +28 -0
- codevira-3.1.1/mcp_server/cli_working.py +89 -0
- codevira-3.1.1/mcp_server/data/affordances.yaml +44 -0
- codevira-3.1.1/mcp_server/data/prompts/reflection_v1.md +40 -0
- codevira-3.1.1/mcp_server/engine/memory_fanout.py +242 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/relevance_inject.py +12 -1
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/mcp_dispatch.py +23 -2
- codevira-3.1.1/mcp_server/graph/template.html +2172 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/ide_inject.py +125 -14
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/server.py +715 -0
- codevira-3.1.1/mcp_server/storage/activity_store.py +274 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/agents_md_generator.py +14 -6
- codevira-3.1.1/mcp_server/storage/config.py +64 -0
- codevira-3.1.1/mcp_server/storage/consensus_store.py +625 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/decisions_store.py +105 -33
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/fts5_index.py +190 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/jsonl_store.py +185 -1
- codevira-3.1.1/mcp_server/storage/origin.py +130 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/outcomes_writer.py +47 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/paths.py +125 -0
- codevira-3.1.1/mcp_server/storage/reflections_store.py +342 -0
- codevira-3.1.1/mcp_server/storage/sanitize.py +44 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/sessions_store.py +43 -8
- codevira-3.1.1/mcp_server/storage/skills_store.py +747 -0
- codevira-3.1.1/mcp_server/storage/working_store.py +434 -0
- codevira-3.1.1/mcp_server/tools/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/check_conflict.py +4 -0
- codevira-3.1.1/mcp_server/tools/consensus.py +138 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/learning.py +75 -2
- codevira-3.1.1/mcp_server/tools/reflections.py +125 -0
- codevira-3.1.1/mcp_server/tools/skills.py +411 -0
- codevira-3.1.1/mcp_server/tools/spatial.py +521 -0
- codevira-3.1.1/mcp_server/tools/working.py +349 -0
- {codevira-3.0.0 → codevira-3.1.1}/pyproject.toml +2 -2
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_check_conflict.py +69 -0
- codevira-3.1.1/tests/test_cli_consensus.py +426 -0
- codevira-3.1.1/tests/test_cli_graph.py +852 -0
- codevira-3.1.1/tests/test_cli_induce.py +859 -0
- codevira-3.1.1/tests/test_cli_working.py +109 -0
- codevira-3.1.1/tests/test_consensus_handshake.py +585 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_ide_inject.py +391 -0
- codevira-3.1.1/tests/test_reflections.py +764 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_learning.py +65 -0
- codevira-3.1.1/tests/test_tools_skills.py +359 -0
- codevira-3.1.1/tests/test_tools_spatial.py +608 -0
- codevira-3.1.1/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.1}/LICENSE +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/MANIFEST.in +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/builder.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/developer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/documenter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/orchestrator.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/planner.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/01-code-review.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/02-adversarial-fix-review.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/03-cross-module-impact.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/06-doc-drift.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/07-security-audit.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/12-llm-redteam.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/13-multi-ide-schema.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/22-competitor-benchmark.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/tier2-scripts.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/qa/tier3-manual.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/reviewer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/agents/tester.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/dependency_links.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/entry_points.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/requires.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/top_level.txt +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/config.example.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/alpha-tester-invites.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/architecture.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/audit-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/demo/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/foolproof-product-charter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/00-engine.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/01-decision-lock.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/02-anti-regression.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/03-scope-contract.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/04-blast-radius.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/05-cross-session.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/06-token-budget.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/07-live-style.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/08-decision-replay.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/09-intent-inference.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/10-ai-promotion.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/README.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/pillar-1-setup.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/hn-launch-day.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/how-i-built-persistent-memory-for-ai-agents.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/internal/competitive-landscape.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/linkedin-article-ai-agent-memory.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/linkedin-post-ai-agent-memory.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/local-pypi-https.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/medium-your-ai-coding-agent-has-amnesia.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/morning-handoff-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.1.2.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.1.3.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.2.0.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v3.0.0.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/qa-playbook.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/release-process.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/roadmap.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/surface-cuts-2026-05-22.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/troubleshooting/antigravity.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/v2-completion-plan.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/v2-execution-log.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/v2-master-plan.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/docs/vs-other-memory-tools.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/graph/_schema.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/_dedupe_migration.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/_fork_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/_sqlite_util.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/chunker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/fix_history.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/global_db.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/graph_generator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/index_codebase.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/outcome_tracker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/sqlite_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/indexer/treesitter_parser.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/__main__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_ghost_check.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_mcp_registry.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_project_inventory.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_repair_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_safe_crash.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/auto_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_export.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_hooks_admin.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_projects.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_uninstall.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/crash_logger.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/builder.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/developer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/documenter.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/orchestrator.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/planner.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/reviewer.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/tester.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/config.example.yaml +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/post_tool_use.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/pre_tool_use.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/session_start.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/stop.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/user_prompt_submit.sh +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-generic.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-go.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-typescript.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/engineering-excellence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/git-cicd-governance.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/git_commits.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/incremental-updates.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/master_rule.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/multi-language.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/persistence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/resilience-observability.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/smoke-testing.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/testing-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/decision_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/doctor.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/demo_policy.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/events.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/_signature_detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/anti_regression.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/blast_radius.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/decision_lock.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/post_edit_refresh.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/token_budget.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policy.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/runner.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/signals.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/token_meter.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/claude_code_hooks.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/gitignore.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/global_sync.py +0 -0
- {codevira-3.0.0/mcp_server/tools → codevira-3.1.1/mcp_server/graph}/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/http_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/launchd.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/log_retention.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/migrate.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/paths.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/roadmap_drift.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/setup_wizard.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/__init__.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/atomic.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/digest.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/manifest.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/token_estimator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/changesets.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/code_reader.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/playbook.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/roadmap.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/search.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/coding-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/engineering-excellence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/git-cicd-governance.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/git_commits.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/incremental-updates.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/master_rule.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/persistence.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/resilience-observability.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/smoke-testing.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/rules/testing-standards.md +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/setup.cfg +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test__prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_auto_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_call_edge_fk_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_chunker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_projects.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_replay.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_uninstall.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_version.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_crash_logger.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_dedupe_migration.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_detect.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_doctor.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_fk_safety_extended.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_fork_safety.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_ghost_check.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_gitignore.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_global_db.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_global_sync.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_graph_generator.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_hook_resilience.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_http_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_index_codebase.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_launchd.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_log_retention.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_migrate.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_outcome_tracker.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_paths.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_prompts.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_record_decision.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_repair_init.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_roadmap_drift.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_server.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_setup_wizard.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_sqlite_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_sqlite_util.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_code_reader.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_graph.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_playbook.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_roadmap.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_treesitter_parser.py +0 -0
- {codevira-3.0.0 → codevira-3.1.1}/tests/test_watcher_circuit.py +0 -0
|
@@ -9,6 +9,429 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [3.1.1] — 2026-05-30 — Hardening, viewer overhaul, G3, sync-observe-git
|
|
13
|
+
|
|
14
|
+
v3.1.1 is the hardening release that supersedes the brief 3.1.0
|
|
15
|
+
window. Same five memory subsystems, but the read/write surface
|
|
16
|
+
is tightened (secret scrubbing across every store), the viewer
|
|
17
|
+
graduates from "look at the graph" to "interrogate the memory"
|
|
18
|
+
(ranked search + Q&A + outcome lens + lineage trace), and the
|
|
19
|
+
last permanently-skipped gauntlet gate (G3 real-IDE smoke) ships
|
|
20
|
+
as a real check.
|
|
21
|
+
|
|
22
|
+
If you installed 3.1.0, `pip install --upgrade codevira` brings
|
|
23
|
+
you straight to 3.1.1. 3.1.0 is yanked: undocumented at release
|
|
24
|
+
time (this CHANGELOG entry didn't ship with it), superseded
|
|
25
|
+
without code regressions.
|
|
26
|
+
|
|
27
|
+
### Memory hardening
|
|
28
|
+
|
|
29
|
+
- **Secret scrubbing across every store.** M8 (reflections) and
|
|
30
|
+
M3 (skills) already scrubbed; v3.1.1 brings parity to M2
|
|
31
|
+
(working) and to `decisions_store.record` (decision text +
|
|
32
|
+
context). One shared module: `mcp_server/storage/sanitize.py`.
|
|
33
|
+
Patterns: api-key, Bearer, password, AWS AKIA, long hex,
|
|
34
|
+
long base64. Scrub runs at the storage-write boundary so the
|
|
35
|
+
secret never lands on disk in committed surfaces.
|
|
36
|
+
- **`commit_session` path-traversal hardening.** Previously
|
|
37
|
+
`commit_session("../escape")` would write outside
|
|
38
|
+
`.codevira/working_archived/`. Now validates `session_id`
|
|
39
|
+
against `[A-Za-z0-9._-]+`; non-conforming inputs raise
|
|
40
|
+
`ValueError`.
|
|
41
|
+
- **`skills_store.record(triggers={"tags": "git"})` rejected.**
|
|
42
|
+
Previously a bare string would silently iterate as characters
|
|
43
|
+
and persist `["g", "i", "t"]`. Now raises `ValueError` pointing
|
|
44
|
+
the caller to wrap as a list.
|
|
45
|
+
- **BFS query-time crash fix.** `spatial._bfs_distances` now
|
|
46
|
+
catches `sqlite3.DatabaseError` raised inside the query loop
|
|
47
|
+
(not only at connect-time). A corrupt-bytes `graph.db` or a
|
|
48
|
+
schema with missing `edges` table falls back to neighborhood-
|
|
49
|
+
only mode instead of crashing `spatial_nearby`.
|
|
50
|
+
- **`skills_store.list_all(limit=0)` returns `[]`.** Previously
|
|
51
|
+
the for-loop did append-then-check, returning the first row
|
|
52
|
+
instead of empty.
|
|
53
|
+
- **`promote_skill_to_playbook` refuses archived skills.** A
|
|
54
|
+
low-value skill (5+ consecutive failures OR 90+ days unused)
|
|
55
|
+
is now refused unless `force=True` is passed. Previously
|
|
56
|
+
promoted silently and competed with active skills.
|
|
57
|
+
- **`origin.current_origin` normalizes agent_model.** Whitespace
|
|
58
|
+
and the literal strings `"null"` / `"None"` (any case) collapse
|
|
59
|
+
to `None`. Downstream consensus-check string compares no longer
|
|
60
|
+
see junk values.
|
|
61
|
+
- **Antigravity multi-target atomicity.** `inject_global_antigravity`
|
|
62
|
+
+ `_inject_antigravity` now snapshot each target's pre-write
|
|
63
|
+
content. On any write failure, all successfully-written targets
|
|
64
|
+
are restored from snapshot. Either every target is stamped or
|
|
65
|
+
none — no asymmetric provenance state from a mid-iteration
|
|
66
|
+
failure.
|
|
67
|
+
|
|
68
|
+
### Counter-decision discipline (schema change, back-compat)
|
|
69
|
+
|
|
70
|
+
`decisions_store.record` + `record_decision` MCP tool grew two
|
|
71
|
+
optional fields:
|
|
72
|
+
|
|
73
|
+
- `alternatives_considered: list[str]` — the strongest options
|
|
74
|
+
you rejected. Surfaces in the viewer's rich-detail panel.
|
|
75
|
+
- `would_re_examine_if: str` — the condition that should force
|
|
76
|
+
a re-examination. Pair with `do_not_revert=True` to turn the
|
|
77
|
+
one-way ratchet into a self-documenting precondition.
|
|
78
|
+
|
|
79
|
+
Both fields are optional, sanitized on write, and tolerated as
|
|
80
|
+
absent/null on read for legacy records.
|
|
81
|
+
|
|
82
|
+
### `codevira graph` viewer overhaul
|
|
83
|
+
|
|
84
|
+
The viewer graduates from a passive force-layout to an active
|
|
85
|
+
interrogation tool. Major additions:
|
|
86
|
+
|
|
87
|
+
- **Ranked search panel.** Free-text queries now produce a
|
|
88
|
+
top-K ranked panel under the search box (BM25-ish: token
|
|
89
|
+
overlap + recency + protected boost). Each row: id, snippet,
|
|
90
|
+
outcome badge, protected lock, score. Click any row →
|
|
91
|
+
centers + selects + opens the rich detail panel.
|
|
92
|
+
- **Q&A intent detection** (no LLM dependency, pure regex).
|
|
93
|
+
Four shapes today: `what did we decide about X`, `why did
|
|
94
|
+
we pick X`, `what got reverted`, `what's protected`. Each
|
|
95
|
+
produces a synthesized answer with clickable decision-id
|
|
96
|
+
chips that jump in the graph.
|
|
97
|
+
- **Rich detail panel for decisions.** Surfaces the new
|
|
98
|
+
counter-decision fields (alternatives_considered as a list,
|
|
99
|
+
would_re_examine_if as an italic banner), context as a
|
|
100
|
+
scrollable block, outcome badge in the title, and the full
|
|
101
|
+
supersedes lineage chain (clickable predecessors + successors).
|
|
102
|
+
- **Outcome lens.** New "Outcome" choice in the lens dropdown.
|
|
103
|
+
Colors decisions by classification: `kept`=green, `modified`=
|
|
104
|
+
amber, `reverted`=coral, `unclassified`=gray. Legend shows
|
|
105
|
+
per-bucket counts.
|
|
106
|
+
- **Lineage trace mode.** Click "trace" in the lineage block on
|
|
107
|
+
any decision in a supersedes chain — everything dims, the
|
|
108
|
+
chain stays full opacity with extra-thick warning-colored
|
|
109
|
+
edges, camera fits to the chain. Esc exits.
|
|
110
|
+
- **`alternatives_considered` + `would_re_examine_if` surfaced**
|
|
111
|
+
in the rich detail panel.
|
|
112
|
+
- **Search debouncing** (120ms trailing-edge) so the ranked-
|
|
113
|
+
score pass doesn't lag on typing bursts at the 2000-node cap.
|
|
114
|
+
|
|
115
|
+
The viewer's underlying file split: `mcp_server/cli_graph.py`
|
|
116
|
+
shrank 84KB → 14KB by extracting the HTML/CSS/JS template into
|
|
117
|
+
`mcp_server/graph/template.html`. Public API unchanged.
|
|
118
|
+
|
|
119
|
+
### `codevira sync` auto-classifies outcomes
|
|
120
|
+
|
|
121
|
+
Every `codevira sync` (manual or automatic) now runs
|
|
122
|
+
`observe-git` as a best-effort tail step. The outcome lens in
|
|
123
|
+
the viewer + the Q&A "what got reverted" surface now have real
|
|
124
|
+
data on every sync — previously stayed gray because outcome
|
|
125
|
+
classification was opt-in. Non-git projects degrade silently.
|
|
126
|
+
|
|
127
|
+
### G3 — real-IDE smoke (the last stubbed gate)
|
|
128
|
+
|
|
129
|
+
`scripts/check_real_ide_smoke.sh` was a stub returning exit 2
|
|
130
|
+
("skipped") since v2.0. Now ships a real implementation:
|
|
131
|
+
|
|
132
|
+
- Locates codevira on PATH (the same binary IDE configs invoke).
|
|
133
|
+
- For each detected IDE config (Claude Code, Claude Desktop,
|
|
134
|
+
Cursor, Windsurf, Antigravity — per-app + shared paths):
|
|
135
|
+
validates JSON; "empty file" treated as not-configured;
|
|
136
|
+
malformed JSON treated as hard fail.
|
|
137
|
+
- Verifies `codevira` (or `codevira-<safe_name>`) is registered;
|
|
138
|
+
reports `env.CODEVIRA_IDE` state (pre-v3.1.0 installs show
|
|
139
|
+
as missing with re-setup guidance).
|
|
140
|
+
- Spawns a real MCP stdio server (`codevira --project-dir <tmp>`),
|
|
141
|
+
runs initialize + tools/list. Thresholds: initialize 5s budget
|
|
142
|
+
(warm-load OK), tools/list 1s HARD (Claude Desktop disconnect
|
|
143
|
+
class), tool count ≥20.
|
|
144
|
+
|
|
145
|
+
Evidence file now records `G3_real_ide_smoke: true` for the
|
|
146
|
+
first time since v2.0.
|
|
147
|
+
|
|
148
|
+
### Process / discipline
|
|
149
|
+
|
|
150
|
+
- **`test_cross_tool_universality` added to `make test-e2e`.**
|
|
151
|
+
Previously the procedural lock (D000010) said "run test-e2e
|
|
152
|
+
before changing engine policies." The gate only included
|
|
153
|
+
`test_first_contact` + `test_product_invariants`. A bump to
|
|
154
|
+
`_DEFAULT_MIN_SCORE` 0.10 → 0.25 broke the cross-tool wedge
|
|
155
|
+
silently because the test that catches it wasn't in the gate.
|
|
156
|
+
Reverted the bump; widened the gate; added a wedge-regression
|
|
157
|
+
unit test (`TestCrossToolWedgeRegression`) so the same class
|
|
158
|
+
of regression also fails at the fast unit-test layer.
|
|
159
|
+
- **`make release-verify-version` BSD sed fix.** The version
|
|
160
|
+
drift check used `sed -E 's/.*=\s*"([^"]+)".*/\1/'` which is
|
|
161
|
+
GNU-only; BSD sed (macOS default) doesn't recognize `\s` in
|
|
162
|
+
`-E`. Replaced with `= *` (literal space).
|
|
163
|
+
- **CLAUDE.md "MUST"/"SHOULD" honesty.** The
|
|
164
|
+
"before-you-finish" contract claimed `MUST call
|
|
165
|
+
write_session_log` but no engine layer enforced it. Downgraded
|
|
166
|
+
to STRONG RECOMMENDATION with explicit "engine enforcement on
|
|
167
|
+
roadmap" note.
|
|
168
|
+
- **AGENTS.md idempotency.** `agents_md_generator.regenerate`
|
|
169
|
+
now compares computed content vs existing and short-circuits
|
|
170
|
+
when identical (no write, no mtime bump). Kills the
|
|
171
|
+
perpetual uncommitted-drift loop where every codevira write
|
|
172
|
+
bumped AGENTS.md even when content didn't change.
|
|
173
|
+
|
|
174
|
+
### Tests + suite
|
|
175
|
+
|
|
176
|
+
- Full project suite: 2538 → 2540 passing, 28 skipped, 0
|
|
177
|
+
failures.
|
|
178
|
+
- Widened `make test-e2e` gate: 39 → 43 passing.
|
|
179
|
+
- All 4 product fixes verified end-to-end through the fresh-
|
|
180
|
+
built wheel + against AgentStore's real memory.
|
|
181
|
+
|
|
182
|
+
### Locked decisions honored
|
|
183
|
+
|
|
184
|
+
D000010 procedural gate ran on every engine-policy change.
|
|
185
|
+
D000001 (atomic disk writes) honored. D000012 (project-root
|
|
186
|
+
validation) honored.
|
|
187
|
+
|
|
188
|
+
### Yanked
|
|
189
|
+
|
|
190
|
+
- **3.1.0 yanked 2026-05-30.** Same code shape; released
|
|
191
|
+
without this CHANGELOG entry. Process gap, not code gap.
|
|
192
|
+
Existing pins still work; new `pip install codevira` lands
|
|
193
|
+
on 3.1.1 directly.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## [3.1.0] — Five memory subsystems + cross-IDE consensus
|
|
200
|
+
|
|
201
|
+
v3.1.0 adds five memory subsystems on top of the v3.0.x decision
|
|
202
|
+
log, plus a cross-IDE consensus layer. Every addition is additive
|
|
203
|
+
to the existing schemas; v3.0.x records continue to read without
|
|
204
|
+
migration. The MCP surface gains 22 new tools across the new
|
|
205
|
+
subsystems.
|
|
206
|
+
|
|
207
|
+
### v3.0.x storage prereq (ships first)
|
|
208
|
+
|
|
209
|
+
- **`refactor(jsonl_store)`** — extract `read_merged` / `compact` /
|
|
210
|
+
`read_recent` from `decisions_store._read_merged` /
|
|
211
|
+
`sessions_store.read_recent`. The five new memory subsystems
|
|
212
|
+
share this amendment-overlay primitive instead of duplicating
|
|
213
|
+
it. Tests cover amendment-chain-three-deep recursion semantics.
|
|
214
|
+
Zero behavior change for existing callers.
|
|
215
|
+
|
|
216
|
+
- **`fix(session_id)`** — `decisions_store.record` and
|
|
217
|
+
`sessions_store.write` now default `session_id` to
|
|
218
|
+
`f"ad-hoc-{secrets.token_hex(3)}"` (e.g., `ad-hoc-a1b2c3`)
|
|
219
|
+
instead of the literal string `"ad-hoc"`. Every concurrent IDE
|
|
220
|
+
that didn't pass a slug previously collided into one bucket;
|
|
221
|
+
the unique-per-call default fixes cross-IDE attribution.
|
|
222
|
+
|
|
223
|
+
### M1 — Origin tagging (provenance)
|
|
224
|
+
|
|
225
|
+
Every decision and session write now carries an `origin` block:
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
"origin": {"ide": "claude_code", "agent_model": "...",
|
|
229
|
+
"host_hash": "<12 hex chars>", "ts": "..."}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- `host_hash` = `sha1(uuid.getnode() bytes + username)[:12]` —
|
|
233
|
+
stable per machine (MAC-based, `platform.node()` fallback),
|
|
234
|
+
privacy-preserving (no plaintext hostname/username leaks).
|
|
235
|
+
- `CODEVIRA_IDE` env var read at MCP server startup; default
|
|
236
|
+
`"unknown"`. `ide_inject.py` now writes `CODEVIRA_IDE=<ide_key>`
|
|
237
|
+
into the MCP config block for all 10 supported IDE configs
|
|
238
|
+
(Claude Code, Claude Desktop, Cursor, Windsurf, Antigravity —
|
|
239
|
+
per-project + global).
|
|
240
|
+
- `check_conflict` response includes the candidate's `origin` so
|
|
241
|
+
agents can see "this conflicts with a decision Cursor wrote 3
|
|
242
|
+
days ago" instead of just an opaque decision_id.
|
|
243
|
+
- Reads tolerate `origin` absent (legacy v3.0.x records treated
|
|
244
|
+
as `ide="unknown"`).
|
|
245
|
+
|
|
246
|
+
### M2 — Working memory
|
|
247
|
+
|
|
248
|
+
Bounded, decay-scored intra-session scratchpad.
|
|
249
|
+
|
|
250
|
+
- `.codevira-cache/working.jsonl` (per-machine, ephemeral,
|
|
251
|
+
gitignored). Auto-populated by `post_tool_use` hook on Edit /
|
|
252
|
+
Write / MultiEdit / NotebookEdit / update_node (importance 4),
|
|
253
|
+
Bash (importance 3), tool errors (importance bumped to 7).
|
|
254
|
+
- 4 MCP tools: `working_add`, `working_get`, `working_promote`
|
|
255
|
+
(to=decision|skill|playbook with check_conflict gate), and
|
|
256
|
+
`get_working_context` (compact markdown for ReAct loops).
|
|
257
|
+
- Decay score: `importance × exp(-Δt_hours / 6) + 0.5 ×
|
|
258
|
+
access_count`. Top-3 surfaces in `get_session_context`.
|
|
259
|
+
- Eviction = amendment tombstone; periodic compaction during
|
|
260
|
+
`codevira sync`.
|
|
261
|
+
- CLI: `codevira working commit <session_id>` archives a
|
|
262
|
+
session's live entries to
|
|
263
|
+
`.codevira/working_archived/<session_id>.jsonl`.
|
|
264
|
+
|
|
265
|
+
### M3 — Skill library (procedural memory)
|
|
266
|
+
|
|
267
|
+
`.codevira/skills.jsonl` (canonical, team-shareable). FTS5
|
|
268
|
+
retrieval + composite ranking.
|
|
269
|
+
|
|
270
|
+
- `skill_fts` virtual table in the existing
|
|
271
|
+
`.codevira-cache/fts5.sqlite`. Independent staleness key
|
|
272
|
+
(`skill_source_mtime`) so the existing decisions tracking is
|
|
273
|
+
unaffected.
|
|
274
|
+
- Composite ranking:
|
|
275
|
+
`score = 0.5 × BM25_norm + 0.3 × tag_jaccard + 0.2 ×
|
|
276
|
+
recency_decay(τ=30d)`. Never-used skills score 0 recency —
|
|
277
|
+
reinforcement, not existence, drives the recency signal.
|
|
278
|
+
- 6 MCP tools: `record_skill`, `get_skill`, `apply_skill_outcome`,
|
|
279
|
+
`list_skills`, `supersede_skill`,
|
|
280
|
+
`promote_skill_to_playbook` (writes
|
|
281
|
+
`.codevira/playbooks/<task_type>/<slug>.md`).
|
|
282
|
+
- Lifecycle states: `active` (default), `archived` (5 consec
|
|
283
|
+
failures OR `unused_days ≥ 90` — configurable; do_not_revert
|
|
284
|
+
exempt), `superseded` (final).
|
|
285
|
+
- M5 wires git-derived outcomes_writer to skill reinforcement (see
|
|
286
|
+
below).
|
|
287
|
+
|
|
288
|
+
### M4 — Spatial memory
|
|
289
|
+
|
|
290
|
+
Activity heatmap + folder-tree neighborhoods + affordances.
|
|
291
|
+
|
|
292
|
+
- `.codevira-cache/activity.jsonl` (per-machine). Auto-emitted on
|
|
293
|
+
Edit/Write via `memory_fanout` + on `decisions_store.record`
|
|
294
|
+
when `file_path` is set. Schema: `{id, ts, node_id, kind:
|
|
295
|
+
edit|decision_ref, session_id, origin, _schema_v: 1}`.
|
|
296
|
+
- 4 MCP tools: `spatial_nearby` (BFS ≤ 2 hops over the indexer
|
|
297
|
+
graph + same-neighborhood union, ranked by `(1/(1+bfs_dist)) ×
|
|
298
|
+
log(1+visit_count_30d)`), `spatial_heat`,
|
|
299
|
+
`spatial_neighborhood`, `spatial_affordances`.
|
|
300
|
+
- Folder-tree neighborhoods (top-2 dir components, e.g.,
|
|
301
|
+
`mcp_server/storage`). Project-overridable via
|
|
302
|
+
`.codevira/neighborhoods.yaml`.
|
|
303
|
+
- Bundled `mcp_server/data/affordances.yaml` mapping file globs to
|
|
304
|
+
task_type affordances (e.g., `mcp_server/tools/*.py` →
|
|
305
|
+
`{add_tool, write_test}`). Project override:
|
|
306
|
+
`.codevira/affordances.yaml`; bundled + project union per match.
|
|
307
|
+
|
|
308
|
+
### M5 — Skill induction wired to outcomes_writer
|
|
309
|
+
|
|
310
|
+
Closes the reinforcement loop. Two pieces:
|
|
311
|
+
|
|
312
|
+
- **Sessions schema additions**: `task_type` (`feature` | `bug` |
|
|
313
|
+
`refactor` | `release` | `docs` | `other`) and `skill_ids: []`
|
|
314
|
+
(skills used during the session). Additive; legacy sessions
|
|
315
|
+
tolerate absence.
|
|
316
|
+
- **outcomes_writer fan-out**: when `observe_all()` classifies a
|
|
317
|
+
decision as `kept` or `reverted`, each skill referenced via
|
|
318
|
+
`skill_ids` on the same session gets `mark_used(success=…)`.
|
|
319
|
+
Pre-builds a `{session_id → set[skill_id]}` index so the
|
|
320
|
+
per-decision fan-out is O(1). Best-effort: skill errors log and
|
|
321
|
+
drop without blocking the decision-outcome write.
|
|
322
|
+
- **CLI**: `codevira induce-skills [--apply] [--yes]` —
|
|
323
|
+
deterministic induction (no LLM in v3.1.0). Pipeline: filter
|
|
324
|
+
sessions with ≥80% kept; group by task_type; cluster by
|
|
325
|
+
tag-Jaccard ≥ 0.5; keep clusters ≥3 sessions; render candidate
|
|
326
|
+
skill with `name = "<task_type>: <top-3 tags>"`,
|
|
327
|
+
`procedure = bullet-summary of session.task +
|
|
328
|
+
decision.decision` (capped 30 lines).
|
|
329
|
+
|
|
330
|
+
### M6 — Consensus Phase B (cross-IDE conflict check, read-only)
|
|
331
|
+
|
|
332
|
+
- Per-IDE checkpoint files
|
|
333
|
+
`.codevira/checkpoints/<ide_key>.json` keyed on
|
|
334
|
+
`last_seen_decision_id` — zero-padded base-36 D-ids preserve
|
|
335
|
+
monotonic ordering without clock drift.
|
|
336
|
+
- `consensus_store.scan_and_materialize()`: walks decisions with
|
|
337
|
+
`id > checkpoint`, partitions by `origin.ide` into
|
|
338
|
+
`current_corpus` + `foreign`, runs the reused `check_conflict`
|
|
339
|
+
tokenize/Jaccard/overlap math on every pair, records matches as
|
|
340
|
+
PC-prefixed rows in `.codevira/pending_conflicts.jsonl`.
|
|
341
|
+
- 2 MCP tools: `consensus_check`, `consensus_status`.
|
|
342
|
+
`get_session_context` surfaces a top-3 panel sorted by
|
|
343
|
+
`(do_not_revert × recency)`.
|
|
344
|
+
- CLI: `codevira consensus check`. Read-only — no amendment rows
|
|
345
|
+
written on decisions.
|
|
346
|
+
|
|
347
|
+
### M7 — Consensus Phase C handshake (opt-in, default off)
|
|
348
|
+
|
|
349
|
+
Opt-in belief-revision protocol gated behind
|
|
350
|
+
`memory.consensus.handshake_enabled` in `.codevira/config.yaml`.
|
|
351
|
+
|
|
352
|
+
- New `config.py` helper for dotted-key lookups against
|
|
353
|
+
`.codevira/config.yaml`.
|
|
354
|
+
- `propose_supersession` (cross-IDE) appends a
|
|
355
|
+
`proposed_supersession` row with `expires_at = ts +
|
|
356
|
+
handshake_timeout_days` (default 14, configurable). Same-IDE
|
|
357
|
+
fast-path returns `{fast_path: True}` so the caller routes to
|
|
358
|
+
`decisions_store.supersede` directly.
|
|
359
|
+
- `resolve_proposal(action: approved|rejected|withdrawn)`
|
|
360
|
+
appends a resolution row carrying `resolver_origin`.
|
|
361
|
+
- `finalize_proposal(expired_unilateral=False)` — approved
|
|
362
|
+
proposals turn into a real `decisions_store.supersede` call.
|
|
363
|
+
Expired proposals require `expired_unilateral=True` (deadlock
|
|
364
|
+
safety); the audit row records the force-finalize.
|
|
365
|
+
- 3 MCP tools: `consensus_propose_supersession`,
|
|
366
|
+
`consensus_resolve`, `origin_of` (provenance lookup; always
|
|
367
|
+
available).
|
|
368
|
+
- Row kind taxonomy in pending_conflicts.jsonl: `conflict` (M6),
|
|
369
|
+
`proposed_supersession` (M7), `resolution` (M7).
|
|
370
|
+
|
|
371
|
+
### M8 — Reflections (durable LLM abstractions)
|
|
372
|
+
|
|
373
|
+
Generative-Agents-style abstractions over recent decisions +
|
|
374
|
+
sessions.
|
|
375
|
+
|
|
376
|
+
- `.codevira/reflections.jsonl` (canonical, committed) +
|
|
377
|
+
`.codevira/reflection_proposals.jsonl` (review staging).
|
|
378
|
+
- `scrub_sensitive` strips api keys, Bearer tokens, passwords,
|
|
379
|
+
AWS-style AKIA, long hex/base64 from source records before the
|
|
380
|
+
LLM sees them.
|
|
381
|
+
- `build_source_context` aggregates sessions + decisions in the
|
|
382
|
+
period window with plan caps (≤30 sessions, ≤100 decisions,
|
|
383
|
+
≤6 KB envelope).
|
|
384
|
+
- Bundled prompt template at
|
|
385
|
+
`mcp_server/data/prompts/reflection_v1.md`.
|
|
386
|
+
- **MCP sampling integration scope**: v3.1.0 ships the storage +
|
|
387
|
+
sanitization + prompt rendering + the API surface. The
|
|
388
|
+
`sampling/createMessage` RPC that asks the host LLM for the
|
|
389
|
+
abstraction is the **v3.2** deliverable. v3.1.0 `reflect()`
|
|
390
|
+
returns `{sampling_supported: False, rendered_prompt,
|
|
391
|
+
source_context, deferred_to: "v3.2"}`; the CLI accepts an LLM
|
|
392
|
+
response via `--from-file`.
|
|
393
|
+
- 3 MCP tools: `reflect`, `get_reflections`, `list_reflections`.
|
|
394
|
+
- CLI: `codevira reflect [--period 7d] [--from-file PATH]
|
|
395
|
+
[--apply] [--yes]`. Render mode prints the prompt;
|
|
396
|
+
`--from-file` parses the LLM YAML response and writes a
|
|
397
|
+
proposal; `--apply --yes` commits to `reflections.jsonl`.
|
|
398
|
+
|
|
399
|
+
### Schema versioning convention
|
|
400
|
+
|
|
401
|
+
All NEW JSONL stores (`working`, `skills`, `activity`,
|
|
402
|
+
`pending_conflicts`, `reflections`) carry `_schema_v: 1` on each
|
|
403
|
+
record. Readers tolerate absence (treats as v1). Existing
|
|
404
|
+
`decisions.jsonl` / `sessions.jsonl` are unchanged.
|
|
405
|
+
|
|
406
|
+
### `get_session_context` panels
|
|
407
|
+
|
|
408
|
+
Now carries five panels in addition to the existing roadmap /
|
|
409
|
+
recent decisions:
|
|
410
|
+
- `working` — top-3 live entries (M2).
|
|
411
|
+
- `consensus` — top-3 pending conflicts (M6) sorted by
|
|
412
|
+
`(do_not_revert × recency)`.
|
|
413
|
+
The plan reserves panels for working, skills, spatial,
|
|
414
|
+
reflections in future ticks if value justifies the token cost.
|
|
415
|
+
|
|
416
|
+
### Tests
|
|
417
|
+
|
|
418
|
+
~450+ new tests across `tests/storage/`, `tests/test_tools_*`,
|
|
419
|
+
`tests/test_cli_*`, `tests/test_reflections.py`,
|
|
420
|
+
`tests/test_consensus_handshake.py`, etc. The full v3.1.0 suite
|
|
421
|
+
runs in <20s; zero regressions from the v3.0.x baseline.
|
|
422
|
+
|
|
423
|
+
### Locked decisions honored
|
|
424
|
+
|
|
425
|
+
The v3.0.0 locks remain intact:
|
|
426
|
+
- D000001 (atomic writes through `mcp_server/storage/atomic.py`)
|
|
427
|
+
- D000012 (WRITE-path forbidden-root validation via
|
|
428
|
+
`ensure_dirs`)
|
|
429
|
+
- The v2.2.0 "no embeddings; FTS5 + Jaccard only" decision —
|
|
430
|
+
M3's skill retrieval and M6's conflict check both use the
|
|
431
|
+
existing FTS5/Jaccard infrastructure; no new embedding deps.
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
12
435
|
## [3.0.0] — 2026-05-27 — Lean, audited, opinionated
|
|
13
436
|
|
|
14
437
|
### 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.1
|
|
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
|
|
@@ -141,6 +141,28 @@ every AI tool, on every project, on your local machine.**
|
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
144
|
+
## What's new in v3.1.1 — hardening + interrogable memory
|
|
145
|
+
|
|
146
|
+
> 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
|
|
147
|
+
> without this README/CHANGELOG entry). Same code shape; this
|
|
148
|
+
> release is the documented one. Brings five memory subsystems
|
|
149
|
+
> (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
|
|
150
|
+
|
|
151
|
+
| Area | What you get |
|
|
152
|
+
|---|---|
|
|
153
|
+
| **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
|
|
154
|
+
| **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
|
|
155
|
+
| **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
|
|
156
|
+
| **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
|
|
157
|
+
| **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
|
|
158
|
+
| **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
|
|
159
|
+
| **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
|
|
160
|
+
| **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
|
|
161
|
+
|
|
162
|
+
Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
144
166
|
## What's new in v3.0.0 — audited, lean, opinionated
|
|
145
167
|
|
|
146
168
|
> Major version. v3.0.0 is the biggest API contraction since v2.0
|
|
@@ -92,6 +92,28 @@ every AI tool, on every project, on your local machine.**
|
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
95
|
+
## What's new in v3.1.1 — hardening + interrogable memory
|
|
96
|
+
|
|
97
|
+
> 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
|
|
98
|
+
> without this README/CHANGELOG entry). Same code shape; this
|
|
99
|
+
> release is the documented one. Brings five memory subsystems
|
|
100
|
+
> (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
|
|
101
|
+
|
|
102
|
+
| Area | What you get |
|
|
103
|
+
|---|---|
|
|
104
|
+
| **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
|
|
105
|
+
| **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
|
|
106
|
+
| **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
|
|
107
|
+
| **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
|
|
108
|
+
| **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
|
|
109
|
+
| **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
|
|
110
|
+
| **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
|
|
111
|
+
| **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
|
|
112
|
+
|
|
113
|
+
Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
95
117
|
## What's new in v3.0.0 — audited, lean, opinionated
|
|
96
118
|
|
|
97
119
|
> Major version. v3.0.0 is the biggest API contraction since v2.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: codevira
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.1.1
|
|
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
|
|
@@ -141,6 +141,28 @@ every AI tool, on every project, on your local machine.**
|
|
|
141
141
|
|
|
142
142
|
---
|
|
143
143
|
|
|
144
|
+
## What's new in v3.1.1 — hardening + interrogable memory
|
|
145
|
+
|
|
146
|
+
> 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
|
|
147
|
+
> without this README/CHANGELOG entry). Same code shape; this
|
|
148
|
+
> release is the documented one. Brings five memory subsystems
|
|
149
|
+
> (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
|
|
150
|
+
|
|
151
|
+
| Area | What you get |
|
|
152
|
+
|---|---|
|
|
153
|
+
| **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
|
|
154
|
+
| **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
|
|
155
|
+
| **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
|
|
156
|
+
| **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
|
|
157
|
+
| **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
|
|
158
|
+
| **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
|
|
159
|
+
| **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
|
|
160
|
+
| **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
|
|
161
|
+
|
|
162
|
+
Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
144
166
|
## What's new in v3.0.0 — audited, lean, opinionated
|
|
145
167
|
|
|
146
168
|
> Major version. v3.0.0 is the biggest API contraction since v2.0
|
|
@@ -66,6 +66,7 @@ docs/plans/v2.1.2.md
|
|
|
66
66
|
docs/plans/v2.1.3.md
|
|
67
67
|
docs/plans/v2.2.0.md
|
|
68
68
|
docs/plans/v3.0.0.md
|
|
69
|
+
docs/release-notes/v3.1.1.md
|
|
69
70
|
docs/troubleshooting/antigravity.md
|
|
70
71
|
graph/_schema.yaml
|
|
71
72
|
indexer/__init__.py
|
|
@@ -90,14 +91,18 @@ mcp_server/_repair_init.py
|
|
|
90
91
|
mcp_server/_safe_crash.py
|
|
91
92
|
mcp_server/auto_init.py
|
|
92
93
|
mcp_server/cli.py
|
|
94
|
+
mcp_server/cli_consensus.py
|
|
93
95
|
mcp_server/cli_export.py
|
|
94
96
|
mcp_server/cli_graph.py
|
|
95
97
|
mcp_server/cli_hooks_admin.py
|
|
98
|
+
mcp_server/cli_induce.py
|
|
96
99
|
mcp_server/cli_init.py
|
|
97
100
|
mcp_server/cli_projects.py
|
|
101
|
+
mcp_server/cli_reflect.py
|
|
98
102
|
mcp_server/cli_replay.py
|
|
99
103
|
mcp_server/cli_sync.py
|
|
100
104
|
mcp_server/cli_uninstall.py
|
|
105
|
+
mcp_server/cli_working.py
|
|
101
106
|
mcp_server/crash_logger.py
|
|
102
107
|
mcp_server/decision_replay.py
|
|
103
108
|
mcp_server/detect.py
|
|
@@ -115,6 +120,7 @@ mcp_server/roadmap_drift.py
|
|
|
115
120
|
mcp_server/server.py
|
|
116
121
|
mcp_server/setup_wizard.py
|
|
117
122
|
mcp_server/data/__init__.py
|
|
123
|
+
mcp_server/data/affordances.yaml
|
|
118
124
|
mcp_server/data/config.example.yaml
|
|
119
125
|
mcp_server/data/agents/builder.md
|
|
120
126
|
mcp_server/data/agents/developer.md
|
|
@@ -128,6 +134,7 @@ mcp_server/data/hooks/pre_tool_use.sh
|
|
|
128
134
|
mcp_server/data/hooks/session_start.sh
|
|
129
135
|
mcp_server/data/hooks/stop.sh
|
|
130
136
|
mcp_server/data/hooks/user_prompt_submit.sh
|
|
137
|
+
mcp_server/data/prompts/reflection_v1.md
|
|
131
138
|
mcp_server/data/rules/coding-standards-generic.md
|
|
132
139
|
mcp_server/data/rules/coding-standards-go.md
|
|
133
140
|
mcp_server/data/rules/coding-standards-typescript.md
|
|
@@ -145,6 +152,7 @@ mcp_server/data/rules/testing-standards.md
|
|
|
145
152
|
mcp_server/engine/__init__.py
|
|
146
153
|
mcp_server/engine/demo_policy.py
|
|
147
154
|
mcp_server/engine/events.py
|
|
155
|
+
mcp_server/engine/memory_fanout.py
|
|
148
156
|
mcp_server/engine/policy.py
|
|
149
157
|
mcp_server/engine/runner.py
|
|
150
158
|
mcp_server/engine/signals.py
|
|
@@ -160,27 +168,42 @@ mcp_server/engine/policies/token_budget.py
|
|
|
160
168
|
mcp_server/engine/wiring/__init__.py
|
|
161
169
|
mcp_server/engine/wiring/claude_code_hooks.py
|
|
162
170
|
mcp_server/engine/wiring/mcp_dispatch.py
|
|
171
|
+
mcp_server/graph/__init__.py
|
|
172
|
+
mcp_server/graph/template.html
|
|
163
173
|
mcp_server/storage/__init__.py
|
|
174
|
+
mcp_server/storage/activity_store.py
|
|
164
175
|
mcp_server/storage/agents_md_generator.py
|
|
165
176
|
mcp_server/storage/atomic.py
|
|
177
|
+
mcp_server/storage/config.py
|
|
178
|
+
mcp_server/storage/consensus_store.py
|
|
166
179
|
mcp_server/storage/decisions_store.py
|
|
167
180
|
mcp_server/storage/digest.py
|
|
168
181
|
mcp_server/storage/fts5_index.py
|
|
169
182
|
mcp_server/storage/jsonl_store.py
|
|
170
183
|
mcp_server/storage/manifest.py
|
|
184
|
+
mcp_server/storage/origin.py
|
|
171
185
|
mcp_server/storage/outcomes_writer.py
|
|
172
186
|
mcp_server/storage/paths.py
|
|
187
|
+
mcp_server/storage/reflections_store.py
|
|
188
|
+
mcp_server/storage/sanitize.py
|
|
173
189
|
mcp_server/storage/sessions_store.py
|
|
190
|
+
mcp_server/storage/skills_store.py
|
|
174
191
|
mcp_server/storage/token_estimator.py
|
|
192
|
+
mcp_server/storage/working_store.py
|
|
175
193
|
mcp_server/tools/__init__.py
|
|
176
194
|
mcp_server/tools/changesets.py
|
|
177
195
|
mcp_server/tools/check_conflict.py
|
|
178
196
|
mcp_server/tools/code_reader.py
|
|
197
|
+
mcp_server/tools/consensus.py
|
|
179
198
|
mcp_server/tools/graph.py
|
|
180
199
|
mcp_server/tools/learning.py
|
|
181
200
|
mcp_server/tools/playbook.py
|
|
201
|
+
mcp_server/tools/reflections.py
|
|
182
202
|
mcp_server/tools/roadmap.py
|
|
183
203
|
mcp_server/tools/search.py
|
|
204
|
+
mcp_server/tools/skills.py
|
|
205
|
+
mcp_server/tools/spatial.py
|
|
206
|
+
mcp_server/tools/working.py
|
|
184
207
|
rules/coding-standards.md
|
|
185
208
|
rules/engineering-excellence.md
|
|
186
209
|
rules/git-cicd-governance.md
|
|
@@ -196,11 +219,15 @@ tests/test_auto_init.py
|
|
|
196
219
|
tests/test_call_edge_fk_safety.py
|
|
197
220
|
tests/test_check_conflict.py
|
|
198
221
|
tests/test_chunker.py
|
|
222
|
+
tests/test_cli_consensus.py
|
|
199
223
|
tests/test_cli_graph.py
|
|
224
|
+
tests/test_cli_induce.py
|
|
200
225
|
tests/test_cli_projects.py
|
|
201
226
|
tests/test_cli_replay.py
|
|
202
227
|
tests/test_cli_uninstall.py
|
|
203
228
|
tests/test_cli_version.py
|
|
229
|
+
tests/test_cli_working.py
|
|
230
|
+
tests/test_consensus_handshake.py
|
|
204
231
|
tests/test_crash_logger.py
|
|
205
232
|
tests/test_dedupe_migration.py
|
|
206
233
|
tests/test_detect.py
|
|
@@ -223,6 +250,7 @@ tests/test_outcome_tracker.py
|
|
|
223
250
|
tests/test_paths.py
|
|
224
251
|
tests/test_prompts.py
|
|
225
252
|
tests/test_record_decision.py
|
|
253
|
+
tests/test_reflections.py
|
|
226
254
|
tests/test_repair_init.py
|
|
227
255
|
tests/test_roadmap_drift.py
|
|
228
256
|
tests/test_server.py
|
|
@@ -234,5 +262,8 @@ tests/test_tools_graph.py
|
|
|
234
262
|
tests/test_tools_learning.py
|
|
235
263
|
tests/test_tools_playbook.py
|
|
236
264
|
tests/test_tools_roadmap.py
|
|
265
|
+
tests/test_tools_skills.py
|
|
266
|
+
tests/test_tools_spatial.py
|
|
267
|
+
tests/test_tools_working.py
|
|
237
268
|
tests/test_treesitter_parser.py
|
|
238
269
|
tests/test_watcher_circuit.py
|