codevira 3.0.0__tar.gz → 3.1.0__tar.gz

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