codevira 2.0.0rc1__tar.gz → 2.1.2__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-2.0.0rc1 → codevira-2.1.2}/CHANGELOG.md +372 -1
- {codevira-2.0.0rc1/codevira.egg-info → codevira-2.1.2}/PKG-INFO +174 -53
- {codevira-2.0.0rc1 → codevira-2.1.2}/README.md +163 -50
- {codevira-2.0.0rc1 → codevira-2.1.2/codevira.egg-info}/PKG-INFO +174 -53
- {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/SOURCES.txt +14 -1
- {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/requires.txt +9 -0
- codevira-2.1.2/docs/foolproof-product-charter.md +197 -0
- codevira-2.1.2/docs/internal/competitive-landscape.md +239 -0
- codevira-2.1.2/docs/plans/v2.1.2.md +1342 -0
- codevira-2.1.2/docs/release-process.md +335 -0
- codevira-2.1.2/docs/troubleshooting/antigravity.md +131 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/chunker.py +264 -71
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/global_db.py +78 -21
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/index_codebase.py +661 -101
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/rule_learner.py +178 -28
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/sqlite_graph.py +469 -168
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/treesitter_parser.py +118 -65
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/__init__.py +1 -1
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_prompts.py +47 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/agents_md.py +33 -27
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli.py +1266 -176
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_agents.py +33 -21
- codevira-2.1.2/mcp_server/cli_calibrate.py +140 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_configure.py +153 -31
- codevira-2.1.2/mcp_server/cli_export.py +318 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_projects.py +62 -14
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/crash_logger.py +119 -11
- codevira-2.1.2/mcp_server/data/rules/coding-standards-generic.md +60 -0
- codevira-2.1.2/mcp_server/data/rules/coding-standards-go.md +63 -0
- codevira-2.1.2/mcp_server/data/rules/coding-standards-typescript.md +56 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/detect.py +264 -66
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/__init__.py +18 -9
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/cross_session.py +280 -52
- codevira-2.1.2/mcp_server/engine/policies/post_edit_refresh.py +91 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/runner.py +17 -10
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/token_meter.py +15 -6
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/ide_inject.py +161 -33
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/prompts.py +12 -3
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/server.py +524 -75
- codevira-2.1.2/mcp_server/tools/_decision_embeddings.py +694 -0
- codevira-2.1.2/mcp_server/tools/check_conflict.py +175 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/code_reader.py +24 -18
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/graph.py +285 -108
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/learning.py +449 -40
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/playbook.py +53 -11
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/roadmap.py +297 -22
- codevira-2.1.2/mcp_server/tools/search.py +897 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/pyproject.toml +25 -3
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_chunker.py +141 -17
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli.py +396 -228
- codevira-2.1.2/tests/test_decision_embeddings.py +253 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_detect.py +141 -15
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_global_db.py +96 -19
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_ide_inject.py +369 -119
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_index_codebase.py +851 -165
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_server.py +533 -286
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_sqlite_graph.py +530 -181
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_graph.py +235 -53
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_learning.py +332 -124
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_roadmap.py +128 -51
- codevira-2.0.0rc1/mcp_server/data/__pycache__/__init__.cpython-313.pyc +0 -0
- codevira-2.0.0rc1/mcp_server/tools/search.py +0 -449
- {codevira-2.0.0rc1 → codevira-2.1.2}/LICENSE +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/MANIFEST.in +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/builder.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/developer.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/documenter.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/orchestrator.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/planner.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/01-code-review.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/02-adversarial-fix-review.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/03-cross-module-impact.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/06-doc-drift.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/07-security-audit.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/12-llm-redteam.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/13-multi-ide-schema.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/22-competitor-benchmark.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/README.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/tier2-scripts.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/tier3-manual.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/reviewer.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/agents/tester.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/dependency_links.txt +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/entry_points.txt +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/top_level.txt +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/config.example.yaml +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/alpha-tester-invites.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/demo/README.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/00-engine.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/01-decision-lock.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/02-anti-regression.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/03-scope-contract.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/04-blast-radius.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/05-cross-session.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/06-token-budget.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/07-live-style.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/08-decision-replay.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/09-intent-inference.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/10-ai-promotion.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/README.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/pillar-1-setup.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/hn-launch-day.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/how-i-built-persistent-memory-for-ai-agents.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/linkedin-article-ai-agent-memory.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/linkedin-post-ai-agent-memory.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/local-pypi-https.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/medium-your-ai-coding-agent-has-amnesia.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/qa-playbook.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/roadmap.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-completion-plan.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-execution-log.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-master-plan.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/docs/vs-other-memory-tools.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/graph/_schema.yaml +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/__init__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_dedupe_migration.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_fork_safety.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_sqlite_util.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/fix_history.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/graph_generator.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/outcome_tracker.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/__main__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_ghost_check.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_project_inventory.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_repair_init.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_safe_crash.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/auto_init.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_budget.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_hooks_admin.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_insights.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_replay.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/__init__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/builder.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/developer.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/documenter.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/orchestrator.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/planner.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/reviewer.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/tester.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/config.example.yaml +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/post_tool_use.sh +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/pre_tool_use.sh +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/session_start.sh +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/stop.sh +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/user_prompt_submit.sh +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/coding-standards.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/engineering-excellence.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/git-cicd-governance.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/git_commits.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/incremental-updates.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/master_rule.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/multi-language.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/persistence.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/resilience-observability.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/smoke-testing.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/testing-standards.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/agents_md.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/canonical_block.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/claude_md.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/copilot_instructions.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/cursor_rules.mdc.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/gemini_md.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/windsurfrules.tmpl +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/decision_replay.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/doctor.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/demo_policy.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/events.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/intent_classifier.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/__init__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/_signature_detect.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/ai_promotion.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/anti_regression.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/blast_radius.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/decision_lock.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/intent_inference.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/live_style.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/scope_contract.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/token_budget.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policy.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/promotion_score.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/scope_contract.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/signals.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/__init__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/claude_code_hooks.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/mcp_dispatch.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/gitignore.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/global_sync.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/http_server.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/launchd.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/log_retention.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/migrate.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/paths.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/roadmap_drift.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/setup_wizard.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/__init__.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/changesets.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/coding-standards.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/engineering-excellence.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/git-cicd-governance.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/git_commits.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/incremental-updates.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/master_rule.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/persistence.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/resilience-observability.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/smoke-testing.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/rules/testing-standards.md +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/setup.cfg +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test__prompts.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_auto_init.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_call_edge_fk_safety.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_agents.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_configure.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_insights.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_projects.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_replay.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_version.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_crash_logger.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_dedupe_migration.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_doctor.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_fk_safety_extended.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_fork_safety.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_ghost_check.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_gitignore.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_global_sync.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_graph_generator.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_hook_resilience.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_http_server.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_launchd.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_log_retention.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_migrate.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_outcome_tracker.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_paths.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_prompts.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_record_decision.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_repair_init.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_retire_rule.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_roadmap_drift.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_rule_learner.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_setup_wizard.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_sqlite_util.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_changesets.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_code_reader.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_playbook.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_search.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_treesitter_parser.py +0 -0
- {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_watcher_circuit.py +0 -0
|
@@ -11,7 +11,378 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
11
11
|
|
|
12
12
|
## [Unreleased]
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
## [2.1.2] — 2026-05-19 — Trust recovery + QoL
|
|
15
|
+
|
|
16
|
+
Trust-recovery release based on **four independent field-test reports** that
|
|
17
|
+
converged on "trust" as the gap (not capability). Full plan:
|
|
18
|
+
[docs/plans/v2.1.2.md](docs/plans/v2.1.2.md).
|
|
19
|
+
|
|
20
|
+
### Added — Smart similarity threshold (Item 1)
|
|
21
|
+
|
|
22
|
+
- `search_decisions` now applies a per-project, self-calibrating similarity
|
|
23
|
+
threshold before RRF fusion. Gibberish queries (`"zzzzzz xqzv9"`,
|
|
24
|
+
`"how to make a cake"`, `""`) return zero results with
|
|
25
|
+
`retrieval: "semantic-no-results-above-threshold"` instead of the
|
|
26
|
+
v2.1.1 regression where they surfaced the "least bad" matches.
|
|
27
|
+
- New `codevira calibrate` CLI command for manual threshold re-fit.
|
|
28
|
+
Auto-recalibration runs in a daemon thread every ~10 decisions added.
|
|
29
|
+
- Per-project `<data_dir>/calibration.json` (search threshold + hook
|
|
30
|
+
threshold + positive-sample count + ISO timestamp).
|
|
31
|
+
- Cross-session hook injection (`CrossSessionConsistency`) applies the
|
|
32
|
+
stricter `hook` threshold (search − 0.10). Commit-message-shaped
|
|
33
|
+
prompts (`feat(api):` / `fix:` / etc.) skipped entirely.
|
|
34
|
+
|
|
35
|
+
### Added — Honest cleanup (Item 3)
|
|
36
|
+
|
|
37
|
+
- `codevira reset --vectors / --graph / --all` — destructive operations
|
|
38
|
+
split out of `codevira heal` (whose name implied fix-in-place).
|
|
39
|
+
- Auto-export of decisions + outcomes + preferences + learned_rules to
|
|
40
|
+
`<data_dir>/exports/<ts>-pre-<target>.json` BEFORE any wipe of `graph/`.
|
|
41
|
+
Pass `--no-backup` to skip.
|
|
42
|
+
- Typed confirmation: user must type `reset` / `graph` / `vectors` /
|
|
43
|
+
`all` (not just `y`) to proceed. `--yes` skips for scripts.
|
|
44
|
+
- `codevira heal --vectors / --graph / --all` deprecation cycle:
|
|
45
|
+
forwards to `cmd_reset` with a one-time warning. Removal planned v2.2.
|
|
46
|
+
- New `codevira export decisions [--format json|sql] [--out PATH]`
|
|
47
|
+
standalone backup command. Closes Report 1 §7 gap.
|
|
48
|
+
- New `confirm_typed(...)` helper in `_prompts.py`.
|
|
49
|
+
|
|
50
|
+
### Added — Proactive correctness
|
|
51
|
+
|
|
52
|
+
- **Item 20**: `check_conflict(decision_text, file_path?)` MCP tool detects
|
|
53
|
+
duplicates and conflicts vs `do_not_revert=True` decisions. Uses Item 1's
|
|
54
|
+
calibrated threshold. `record_decision` runs it automatically pre-write
|
|
55
|
+
and surfaces `_conflict_warning` in the response (suppressible with
|
|
56
|
+
`force=True`).
|
|
57
|
+
- **Item 26**: `supersede_decision(old_id, new_decision, reason)` retires
|
|
58
|
+
a prior decision with auditable history. Schema auto-migrates with
|
|
59
|
+
`is_superseded INTEGER + superseded_by INTEGER`. `list_decisions` filters
|
|
60
|
+
superseded rows by default; `include_superseded=True` opts back in.
|
|
61
|
+
|
|
62
|
+
### Added — Enumeration + filtering
|
|
63
|
+
|
|
64
|
+
- **Item 11**: `list_decisions(limit, since_date, file_pattern,
|
|
65
|
+
protected_only, session_id, tags, include_superseded, full)` MCP tool.
|
|
66
|
+
Closes Report 3 "remembers but can't list" gap.
|
|
67
|
+
- **Item 27 (partial)**: `tags=[...]` on `record_decision`; `list_tags()`
|
|
68
|
+
MCP tool; tag filter on `list_decisions`. `decision_tags` table
|
|
69
|
+
auto-migrated.
|
|
70
|
+
- **Item 25**: `since="YYYY-MM-DD"` (or ISO 8601) filter on
|
|
71
|
+
`search_decisions`, `get_history`, `get_session_context`. SQL-layer
|
|
72
|
+
for BM25, post-filter for semantic results.
|
|
73
|
+
|
|
74
|
+
### Added — Batch APIs (Items 23 + 24)
|
|
75
|
+
|
|
76
|
+
- `record_decisions([...])` and `write_session_logs([...])` cut
|
|
77
|
+
memory-dump sessions from ~26 separate round trips to 1. Returns
|
|
78
|
+
`{count, recorded:[ids], errors:[{idx, error}]}` with per-item
|
|
79
|
+
partial-failure surfacing.
|
|
80
|
+
|
|
81
|
+
### Added — Trust + correctness fixes
|
|
82
|
+
|
|
83
|
+
- **Item 2**: `get_node` / `get_impact` / `query_graph` / `update_node`
|
|
84
|
+
return `not_indexed: True` + null counts instead of misleading 0 for
|
|
85
|
+
un-indexed paths.
|
|
86
|
+
- **Item 4**: New `PostEditGraphRefresh` policy refreshes graph nodes in
|
|
87
|
+
a daemon thread after Edit/Write/MultiEdit so subsequent
|
|
88
|
+
`get_node` / `get_impact` calls see fresh data.
|
|
89
|
+
- **Item 9**: `global_db.get_rules()` strict-language match by default
|
|
90
|
+
(was `language = ? OR language IS NULL`). Prevents Go-project rules
|
|
91
|
+
with NULL language from leaking into Python projects. Pass
|
|
92
|
+
`strict_language=False` for legacy behavior.
|
|
93
|
+
- **Item 17**: Rule extractor noise filter — stopword filter + minimum
|
|
94
|
+
content-density gate + substring suppression in `_find_common_phrases`.
|
|
95
|
+
Pre-code projects (0 indexed source files) skip
|
|
96
|
+
`_infer_decision_pattern_rules` entirely.
|
|
97
|
+
- **Item 18**: `add_phase()` silently replaces the bootstrap
|
|
98
|
+
"Getting Started" placeholder when called with the SAME number (and
|
|
99
|
+
the placeholder is pristine — status=pending, no changesets, default
|
|
100
|
+
description).
|
|
101
|
+
- **Item 19**: Regression test for `file_path` serialization round-trip
|
|
102
|
+
through `get_session_context`'s `recent_decisions`.
|
|
103
|
+
- **Item 22**: `write_session_log` / `log_session` auto-suffix
|
|
104
|
+
`session_id` on content collision (was: silent `INSERT OR REPLACE`).
|
|
105
|
+
Same id + same summary remains idempotent; different summary returns
|
|
106
|
+
the new suffixed id with `collision_resolved: True`.
|
|
107
|
+
- **Item 33**: Hook commit-message pre-filter suppresses injection on
|
|
108
|
+
prompts matching `^(feat|fix|chore|docs|refactor|test|style|perf|build|ci|revert)(\(.*\))?:`.
|
|
109
|
+
|
|
110
|
+
### Added — Roadmap workflow
|
|
111
|
+
|
|
112
|
+
- **Item 10**: `complete_phase(backfill=True, completed_at='YYYY-MM-DD')`
|
|
113
|
+
for retroactive phase completion (current / upcoming / synthetic
|
|
114
|
+
cases).
|
|
115
|
+
- **Item 12**: `complete_phase(git_ref="...")` links a commit sha or PR
|
|
116
|
+
reference to the completion entry.
|
|
117
|
+
- **Item 29**: `bulk_import_phases([...])` for adopting codevira on a
|
|
118
|
+
project that already shipped N phases in git. Idempotent.
|
|
119
|
+
|
|
120
|
+
### Added — QoL
|
|
121
|
+
|
|
122
|
+
- **Item 5**: `do_not_revert` int→bool coercion at SQLite read boundary
|
|
123
|
+
(`search_decisions`, missing-rows fetch path). API contract now
|
|
124
|
+
matches schema.
|
|
125
|
+
- **Item 6**: Smart truncation in `top_signals.rules` (word-boundary +
|
|
126
|
+
path-aware, 160-char limit).
|
|
127
|
+
- **Item 7**: `summary` derived from first 80 chars of decision text
|
|
128
|
+
instead of `"ad-hoc record_decision"` placeholder.
|
|
129
|
+
- **Item 8**: `get_session_context` returns `confidence_note` instead of
|
|
130
|
+
`confidence=null` on fresh projects.
|
|
131
|
+
- **Item 28**: `summary_only=True` mode on `search_decisions` returns
|
|
132
|
+
id + summary + score + do_not_revert only — ~70% smaller payload for
|
|
133
|
+
AI triage queries.
|
|
134
|
+
- **Item 30**: `record_decision` input-coerced echo — when
|
|
135
|
+
`do_not_revert` is passed as a non-bool (int 1, string "true"),
|
|
136
|
+
response carries `_input_coerced_warning`.
|
|
137
|
+
- **Item 31**: Bundled non-Python playbooks (TypeScript / Go / generic)
|
|
138
|
+
in `mcp_server/data/rules/coding-standards-<lang>.md`. Auto-selected
|
|
139
|
+
by detected project language. Closes Report 1 §3.5.
|
|
140
|
+
- **Items 13 + 14**: `clean --orphans` catches bare global.db rows (no
|
|
141
|
+
data dir + path missing on disk). `clean --ghosts` catches truly-
|
|
142
|
+
empty data dirs (<10 KB, status='stale').
|
|
143
|
+
|
|
144
|
+
### Added — Plan + governance (Item 16)
|
|
145
|
+
|
|
146
|
+
- `docs/plans/v2.1.2.md` mirrors the master plan (33 items + 4 deferred
|
|
147
|
+
v2.2-class items). Establishes release-planning discipline: every
|
|
148
|
+
vX.Y.Z release with 3+ items gets its own `docs/plans/` doc.
|
|
149
|
+
- `ROADMAP.md` v2.1.2 section.
|
|
150
|
+
- `CONTRIBUTING.md` Release planning + Documentation discipline.
|
|
151
|
+
|
|
152
|
+
### Fixed
|
|
153
|
+
|
|
154
|
+
- **Item 21**: Multi-language `get_signature` / `get_code` confirmed
|
|
155
|
+
working in v2.1.1 (15+ languages via tree-sitter-language-pack). No
|
|
156
|
+
new code needed; doc fix only.
|
|
157
|
+
- **Item 32**: All 42 pre-existing mypy errors cleared via real fixes
|
|
158
|
+
(type narrowing, missing imports, `Counter` / `dict[str, Any]`
|
|
159
|
+
annotations, AST isinstance gating) and targeted
|
|
160
|
+
`# type: ignore[code]` for invariant pre-existing patterns. mypy is
|
|
161
|
+
now a hard pre-commit gate.
|
|
162
|
+
|
|
163
|
+
### Late additions (caught by post-tag smoke testing)
|
|
164
|
+
|
|
165
|
+
These three patches landed AFTER the initial v2.1.2 release commit but
|
|
166
|
+
BEFORE shipping the wheel. They're all part of the v2.1.2 line:
|
|
167
|
+
|
|
168
|
+
- **bulk_import_phases placeholder fix**: importing `phase=1` on a
|
|
169
|
+
fresh project was silently SKIPPING phase 1 because the bootstrap
|
|
170
|
+
"Getting Started" placeholder occupies that number. Adopters
|
|
171
|
+
migrating multi-phase git history (Report 3 #5 — the exact use case
|
|
172
|
+
Item 29 exists for) would hit this. Fixed by applying Item 18's
|
|
173
|
+
placeholder-recognition logic to bulk_import too.
|
|
174
|
+
- **calibrate doc range fix**: `codevira calibrate --help` said
|
|
175
|
+
"Clamped to [0.20, 0.55]" but actual code clamps to [0.35, 0.80]
|
|
176
|
+
(the empirically-tuned values from Item 1 after measuring
|
|
177
|
+
all-MiniLM-L6-v2's distance distribution on real query/decision
|
|
178
|
+
pairs). Doc string corrected.
|
|
179
|
+
- **Issue #10 — Antigravity sandbox + torch dlopen**: graceful
|
|
180
|
+
degradation across 3 tiers. (1) Removed `prewarm_embedding_model()`
|
|
181
|
+
from MCP server startup — torch loads lazily on first
|
|
182
|
+
`search_codebase` / `search_decisions` call. MCP `initialize` and
|
|
183
|
+
`tools/list` complete instantly without touching torch. All
|
|
184
|
+
non-search tools work in Antigravity. (2) `_decisions_collection_or_none()`
|
|
185
|
+
traps `OSError` (macOS dlopen errors arrive as OSError, not
|
|
186
|
+
ImportError) and surfaces `_semantic_warning` in `search_decisions`
|
|
187
|
+
responses with a clear explanation + issue link.
|
|
188
|
+
(3) `docs/troubleshooting/antigravity.md` documents the root cause
|
|
189
|
+
and four user-side workarounds. Closes
|
|
190
|
+
[#10](https://github.com/sachinshelke/codevira/issues/10).
|
|
191
|
+
|
|
192
|
+
### Tests
|
|
193
|
+
|
|
194
|
+
- 2401/2401 unit tests pass + 4/4 e2e cross-tool universality.
|
|
195
|
+
- Replaced: `test_log_session_replaces_on_duplicate` → idempotent +
|
|
196
|
+
auto-suffix variants (Item 22).
|
|
197
|
+
- Renamed: `test_8_evaluation_under_5ms_p95` → `_50ms_p95` (semantic
|
|
198
|
+
gate is inherently slower than BM25-only).
|
|
199
|
+
- Updated: all `test_default_heroes_*` / `test_*_default_policies_*`
|
|
200
|
+
acceptance tests to expect `post_edit_graph_refresh` in the default
|
|
201
|
+
set; `test_dispatch_complete_phase` (×2) + `test_dispatch_get_history`
|
|
202
|
+
for new kwarg defaults.
|
|
203
|
+
- New positive tests: `test_get_node_not_indexed`,
|
|
204
|
+
`test_get_impact_not_indexed`,
|
|
205
|
+
`test_gibberish_query_returns_zero_above_threshold`,
|
|
206
|
+
`test_session_context_recent_decisions_preserve_file_path`,
|
|
207
|
+
`test_add_phase_replaces_pristine_placeholder`,
|
|
208
|
+
`test_log_session_idempotent_on_same_content`,
|
|
209
|
+
`test_log_session_auto_suffixes_on_different_content`,
|
|
210
|
+
`test_language_filter_strict_excludes_null_language`,
|
|
211
|
+
`test_language_filter_loose_includes_null_language`.
|
|
212
|
+
|
|
213
|
+
### Deferred to v2.1.3 / v2.2
|
|
214
|
+
|
|
215
|
+
- Full README rewrite with animated 60-second demo GIF (Item 15) — pair
|
|
216
|
+
with v2.2 launch / benchmark publishing once benchmark suite ships.
|
|
217
|
+
- Bundled `coding-standards-<lang>.md` for Rust / Java / etc. — extend
|
|
218
|
+
the per-language playbook system as adopters request.
|
|
219
|
+
|
|
220
|
+
## [2.1.1] — 2026-05-17 — Hybrid decision search
|
|
221
|
+
|
|
222
|
+
### Added
|
|
223
|
+
- **Hybrid search for `search_decisions`** (BM25 + ChromaDB semantic + RRF fusion).
|
|
224
|
+
Closes the UDAP-benchmark gap: queries like `"DDD architecture layer"` or
|
|
225
|
+
`"codevira backfill"` that returned 0 hits in v2.0/v2.1.0 now surface the
|
|
226
|
+
right decisions via semantic recall. Response includes a `retrieval` field
|
|
227
|
+
indicating which path contributed (hybrid / keyword / semantic).
|
|
228
|
+
- **`codevira heal --decisions`** — non-destructive backfill embedding all
|
|
229
|
+
existing decisions into the semantic index. Run once after upgrading from
|
|
230
|
+
v2.0/v2.1.0 to pick up hybrid recall on pre-existing decision history.
|
|
231
|
+
Idempotent (upsert pattern).
|
|
232
|
+
- **`mcp_server/tools/_decision_embeddings.py`** — new helper module:
|
|
233
|
+
embed_decision, semantic_search_decisions, rrf_merge, backfill_all_decisions.
|
|
234
|
+
P9 graceful degradation throughout — chromadb failures never block SQL
|
|
235
|
+
writes or BM25 reads.
|
|
236
|
+
|
|
237
|
+
### Tests
|
|
238
|
+
- `tests/test_decision_embeddings.py` — 15 new regression tests covering
|
|
239
|
+
RRF math, graceful-degradation paths, and the explicit benchmark queries.
|
|
240
|
+
|
|
241
|
+
## [2.1.0] — 2026-05-17 — Reliability hardening + Pillar 3 discipline scaffold
|
|
242
|
+
|
|
243
|
+
### Added — Pillar 3: AI development discipline scaffold (2026-05-16)
|
|
244
|
+
|
|
245
|
+
The codevira repo now ships its own discipline scaffold — the same
|
|
246
|
+
pattern that will be exposed as `codevira discipline install` in
|
|
247
|
+
v2.2. This is the reference implementation, eaten as dog food.
|
|
248
|
+
|
|
249
|
+
- **`.claude/skills/`** — 4 SKILL.md files: `development-discipline`,
|
|
250
|
+
`open-source-quality`, `release-readiness`, `epistemic-honesty`.
|
|
251
|
+
- **`.claude/hooks/pre-release-block.sh`** — PreToolUse hard wall.
|
|
252
|
+
Refuses `twine upload`, `gh release ... --draft=false`,
|
|
253
|
+
`pipx publish`, etc. unless `.release-evidence/<version>.json`
|
|
254
|
+
shows G1–G5 pass. Bypass via `CODEVIRA_RELEASE_OVERRIDE=1`.
|
|
255
|
+
- **`Makefile`** — 12 targets including `release-verify-version`,
|
|
256
|
+
`release-gauntlet`, `release-build`, `release-dry-run`,
|
|
257
|
+
`release-publish`, `release-smoke`, `release-full`.
|
|
258
|
+
- **`.pre-commit-config.yaml`** — ruff lint+format, mypy, hygiene.
|
|
259
|
+
- **`tests/e2e/test_first_contact.py`** + 4 fixtures (docs_only,
|
|
260
|
+
code_only_python, polyglot, monorepo). G2 gate.
|
|
261
|
+
- **`.github/workflows/{ci,release-gate}.yml`** — CI hard wall.
|
|
262
|
+
- **`codevira.discipline.yaml`** — central scaffold config.
|
|
263
|
+
- **`scripts/check_real_ide_smoke.sh`** — G3 stub.
|
|
264
|
+
- **`docs/release-process.md`** — step-by-step foolproof release.
|
|
265
|
+
|
|
266
|
+
### Planned for v2.1
|
|
267
|
+
|
|
268
|
+
See [ROADMAP.md](ROADMAP.md#-v21--new-user-first-contact--reliability-hardening).
|
|
269
|
+
|
|
270
|
+
- **Reliability hardening (23 bugs A–O)** — silent-failure elimination
|
|
271
|
+
surfaced by the discipline-scaffold e2e fixtures.
|
|
272
|
+
- **Hybrid search (BM25 + semantic + rerank)** — natural-language
|
|
273
|
+
decision search.
|
|
274
|
+
- **Decision deduplication** (ADD/UPDATE/NOOP) + audit trail.
|
|
275
|
+
- **Conditional hook injection** — kill the always-on token tax.
|
|
276
|
+
- **Multi-language `get_signature` / `get_code`** — wire tree-sitter.
|
|
277
|
+
- **`record_decisions_batch` API** — compress protocol overhead.
|
|
278
|
+
- **CLI naming clarity** — `init` / `setup` / `register` / `configure`
|
|
279
|
+
canonical hierarchy.
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## [2.0.0] — 2026-05-14 — First public 2.0 release
|
|
284
|
+
|
|
285
|
+
The 2.0 release moves codevira from "memory layer for one developer in one IDE" to
|
|
286
|
+
"active guardian for every AI coding tool you use, on every project, on your local
|
|
287
|
+
machine." Five internal iterations (rc1..rc5 in dev tags) plus a same-day public
|
|
288
|
+
release-candidate cycle (`2.0.0rc1`) of dogfood + audit + product-credibility
|
|
289
|
+
work consolidate into 2.0.0. **Full changelog: [RELEASE_NOTES.md](RELEASE_NOTES.md).**
|
|
290
|
+
|
|
291
|
+
### Added
|
|
292
|
+
|
|
293
|
+
- **All 10 hero policies** — active guardian engine intercepts every AI tool
|
|
294
|
+
call (Edit, Write, prompt submit, session start) and routes through
|
|
295
|
+
registered policies (Decision Lock, Anti-Regression, Scope Contract,
|
|
296
|
+
Blast-Radius Veto, Cross-Session Consistency, Token Budget, Live Style
|
|
297
|
+
Enforcement, Decision Replay, Proactive Intent Inference, AI Promotion
|
|
298
|
+
Score).
|
|
299
|
+
- **`codevira setup`** — one-prompt installer that detects every AI tool
|
|
300
|
+
on the machine (Claude Code, Cursor, Windsurf, Antigravity, OpenAI Codex,
|
|
301
|
+
GitHub Copilot, Continue.dev, Aider) and configures all of them at once.
|
|
302
|
+
- **`codevira projects`** — canonical inventory with `tracked / ghost /
|
|
303
|
+
orphan / stale` classification (`--json` for scripting; `--ghosts-only`
|
|
304
|
+
pairs with `clean --ghosts`).
|
|
305
|
+
- **`codevira hooks list / uninstall`** — admin commands for Claude Code
|
|
306
|
+
lifecycle hooks; surgical install + clean removal.
|
|
307
|
+
- **`codevira clean --ghosts`** — surgical removal of incomplete project
|
|
308
|
+
data dirs without touching tracked projects.
|
|
309
|
+
- **`codevira init --single-language`** — opt-out flag for the new
|
|
310
|
+
index-everything default.
|
|
311
|
+
- **`codevira engine` subcommand** — internal hook dispatcher; surfaces in
|
|
312
|
+
`--help` so the lifecycle hooks can call it.
|
|
313
|
+
- **4 new doctor checks** — `claude_mcp_visibility`, `codeindex_freshness`,
|
|
314
|
+
`semantic_search_health`, `ghost_projects` (total 14 per run).
|
|
315
|
+
- **Per-project config opt-out for cross-session injection** —
|
|
316
|
+
`.codevira/config.yaml: project: { cross_session_mode: off }` disables
|
|
317
|
+
the per-prompt context block without touching env vars.
|
|
318
|
+
|
|
319
|
+
### Changed
|
|
320
|
+
|
|
321
|
+
- **`codevira init` default** — indexes every common source/config/docs
|
|
322
|
+
extension (~75 total: `.py`, `.ts`, `.go`, `.yaml`, `.toml`, `.md`,
|
|
323
|
+
`.html`, `.sql`, `.proto`, …) instead of narrowing to one language.
|
|
324
|
+
- **`codevira agents` default** — renders nudge files for **detected** IDEs
|
|
325
|
+
only; `--ide=all` opt-in for the legacy "render for every supported IDE"
|
|
326
|
+
behavior.
|
|
327
|
+
- **`codevira doctor`** — now genuinely read-only; snapshots the projects
|
|
328
|
+
dir at entry and removes any new dirs at exit.
|
|
329
|
+
- **`search_codebase`** — graceful structural fallback (filename + symbol
|
|
330
|
+
substring) when the semantic index is unavailable, with the correct
|
|
331
|
+
`fix_command` instead of a misleading "reinstall codevira" hint.
|
|
332
|
+
- **`get_node` / `get_impact` / `query_graph`** — three-case error
|
|
333
|
+
differentiation: "no graph DB" / "graph empty" / "file not in populated
|
|
334
|
+
graph", each with its own `fix_command`.
|
|
335
|
+
- **`get_decision_confidence`** — exposes `decisions_in_db_total` and
|
|
336
|
+
`decisions_eligible_for_outcomes` plus a four-state interpretation so
|
|
337
|
+
users understand WHY their `total_decisions` may be zero. Outcome
|
|
338
|
+
tracker also classifies file-less decisions via mention-extraction.
|
|
339
|
+
- **Playbooks** — project-scoped first
|
|
340
|
+
(`<data_dir>/playbooks/` or `<project>/.codevira/playbooks/`); bundled
|
|
341
|
+
Python defaults are skipped with a clear warning when project language
|
|
342
|
+
≠ Python.
|
|
343
|
+
- **`register_project`** uses `ON CONFLICT … COALESCE(excluded.git_remote,
|
|
344
|
+
projects.git_remote)` — subsequent registrations can't silently clear
|
|
345
|
+
the `git_remote` column.
|
|
346
|
+
- **Auto-init self-heal** runs SYNCHRONOUSLY in the calling thread of every
|
|
347
|
+
CLI invocation — daemon thread death no longer leaves ghost data dirs.
|
|
348
|
+
- **Default install** includes ChromaDB + sentence-transformers (no
|
|
349
|
+
`[search]` extra needed for semantic search).
|
|
350
|
+
- **README "92% reduction" claim** qualified with honest scope, per-prompt
|
|
351
|
+
cost, and amortization curve.
|
|
352
|
+
- **`register` deprecation** now names the removal version (v2.1).
|
|
353
|
+
|
|
354
|
+
### Fixed
|
|
355
|
+
|
|
356
|
+
- macOS Apple Silicon **fork-safety segfault on first `codevira index`**
|
|
357
|
+
(auto-applied at indexer import).
|
|
358
|
+
- **Setup interactive prompt** silent-fail on unexpected input — replaced
|
|
359
|
+
with a shared `_prompts.confirm` helper that retries, flushes stdout,
|
|
360
|
+
and handles `KeyboardInterrupt` cleanly.
|
|
361
|
+
- Three **`status --global` UI typos** that always rendered 0/0/0
|
|
362
|
+
regardless of actual `global.db` state.
|
|
363
|
+
- Four **FK race conditions** in the watcher pipeline.
|
|
364
|
+
- **Python `None` leaked into argparse choices** for `agents --ide` and
|
|
365
|
+
`budget` positional.
|
|
366
|
+
- Several **silent argument clamps** in `replay --since`, `insights --since`,
|
|
367
|
+
and `insights --top` now print visible warnings.
|
|
368
|
+
|
|
369
|
+
### Tests
|
|
370
|
+
|
|
371
|
+
- 2395 / 2395 passing (deterministic).
|
|
372
|
+
- ~1091 net new tests since v1.8.0 (mostly from the v2.0 hero policies +
|
|
373
|
+
audit-driven regression coverage).
|
|
374
|
+
|
|
375
|
+
### Note on internal v1.8.1 + 2.0.0rc1
|
|
376
|
+
|
|
377
|
+
A v1.8.1 production hotfix existed in dev tags but was never published to
|
|
378
|
+
PyPI; its fixes are folded into 2.0.0. A `2.0.0rc1` was briefly published
|
|
379
|
+
on PyPI (2026-05-14) as a same-day public release candidate; the code is
|
|
380
|
+
identical to 2.0.0. Anyone who installed `codevira==2.0.0rc1` can
|
|
381
|
+
`pipx install --upgrade codevira` to move to 2.0.0 final.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## [Original v1.9 plan, deferred]
|
|
15
386
|
|
|
16
387
|
- **Interactive checkbox UI for `codevira configure`**. The current
|
|
17
388
|
prompt asks users to type comma-separated indices ("1,3,5") into a
|