marvisx-cli 0.3.6__tar.gz → 0.3.7__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 (626) hide show
  1. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/LICENSE +12 -13
  2. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/MANIFEST.in +1 -0
  3. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/PKG-INFO +1 -1
  4. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/README.md +9 -5
  5. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/config.py +8 -0
  6. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/db.py +11 -7
  7. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/jobs.py +14 -1
  8. marvisx_cli-0.3.7/core/cli/guides/__init__.py +6 -0
  9. marvisx_cli-0.3.7/core/cli/guides/marvis-way.md +183 -0
  10. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_brain.py +113 -2
  11. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_doctor.py +28 -1
  12. marvisx_cli-0.3.7/core/cli/marvis_guide.py +112 -0
  13. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_init.py +77 -40
  14. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_runtime.py +49 -6
  15. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/client.py +36 -22
  16. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/PKG-INFO +1 -1
  17. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/SOURCES.txt +13 -1
  18. marvisx_cli-0.3.7/migrations/146_drop_kg_backup_tables.sql +37 -0
  19. marvisx_cli-0.3.7/migrations/146_drop_kg_backup_tables_down.sql +9 -0
  20. marvisx_cli-0.3.7/projects/_template/context.md +28 -0
  21. marvisx_cli-0.3.7/projects/_template/docs/brainstorms/YYYY-MM-DD-example-brainstorm.md +19 -0
  22. marvisx_cli-0.3.7/projects/_template/docs/plans/YYYY-MM-DD-example-plan.md +23 -0
  23. marvisx_cli-0.3.7/projects/_template/docs/solutions/YYYY-MM-DD-example-solution.md +21 -0
  24. marvisx_cli-0.3.7/projects/_template/input/README.md +6 -0
  25. marvisx_cli-0.3.7/projects/_template/memory/handoff.md +27 -0
  26. marvisx_cli-0.3.7/projects/_template/output/README.md +7 -0
  27. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/projects/_template/project.yaml +2 -2
  28. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/pyproject.toml +6 -2
  29. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/__init__.py +0 -0
  30. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/__init__.py +0 -0
  31. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/session_health.py +0 -0
  32. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/session_manager.py +0 -0
  33. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/bin/marvisx-state-hook.py +0 -0
  34. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/dependencies/__init__.py +0 -0
  35. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/dependencies/tenant.py +0 -0
  36. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/main.py +0 -0
  37. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/__init__.py +0 -0
  38. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/_adapter.py +0 -0
  39. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/server.py +0 -0
  40. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/__init__.py +0 -0
  41. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/brain.py +0 -0
  42. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/graph.py +0 -0
  43. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/handoffs.py +0 -0
  44. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/ingest.py +0 -0
  45. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/learnings.py +0 -0
  46. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/projects.py +0 -0
  47. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/pull_requests.py +0 -0
  48. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/safety.py +0 -0
  49. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/search.py +0 -0
  50. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/tasks.py +0 -0
  51. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
  52. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
  53. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
  54. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflows.py +0 -0
  55. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/middleware/__init__.py +0 -0
  56. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/middleware/tool_call_audit.py +0 -0
  57. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/__init__.py +0 -0
  58. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/auth.py +0 -0
  59. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/brain.py +0 -0
  60. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/common.py +0 -0
  61. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/costs.py +0 -0
  62. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph.py +0 -0
  63. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_cosmo.py +0 -0
  64. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_pr_impact.py +0 -0
  65. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_ux.py +0 -0
  66. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/inbox.py +0 -0
  67. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/ingest_keys.py +0 -0
  68. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/kg.py +0 -0
  69. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/llm_config.py +0 -0
  70. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/monitoring.py +0 -0
  71. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/projects.py +0 -0
  72. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/search.py +0 -0
  73. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/sessions.py +0 -0
  74. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/tasks.py +0 -0
  75. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/teams.py +0 -0
  76. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/users.py +0 -0
  77. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/observability/__init__.py +0 -0
  78. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/observability/tracing.py +0 -0
  79. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/paths.py +0 -0
  80. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/rate_limit.py +0 -0
  81. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/rbac.py +0 -0
  82. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/__init__.py +0 -0
  83. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/_adapter.py +0 -0
  84. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/admin_pr_impact.py +0 -0
  85. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/admin_settings.py +0 -0
  86. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/agent.py +0 -0
  87. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/agent_tokens.py +0 -0
  88. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/app_settings.py +0 -0
  89. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/audit.py +0 -0
  90. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/auth.py +0 -0
  91. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/bench.py +0 -0
  92. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/brain.py +0 -0
  93. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/brain_directions.py +0 -0
  94. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ci_checks.py +0 -0
  95. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/comments.py +0 -0
  96. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/costs.py +0 -0
  97. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/docs_coverage.py +0 -0
  98. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/docs_governance.py +0 -0
  99. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/documents.py +0 -0
  100. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/files.py +0 -0
  101. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/finder.py +0 -0
  102. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/graph.py +0 -0
  103. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/handoffs.py +0 -0
  104. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/inbox.py +0 -0
  105. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ingest_api_keys.py +0 -0
  106. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ingest_triage.py +0 -0
  107. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/judge.py +0 -0
  108. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/kg.py +0 -0
  109. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/learnings.py +0 -0
  110. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/llm_config.py +0 -0
  111. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/monitoring.py +0 -0
  112. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/notifications.py +0 -0
  113. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/pr_impact.py +0 -0
  114. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/projects.py +0 -0
  115. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/pull_requests.py +0 -0
  116. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/push.py +0 -0
  117. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/raci.py +0 -0
  118. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/search.py +0 -0
  119. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/sessions.py +0 -0
  120. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/settings.py +0 -0
  121. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/share_repo.py +0 -0
  122. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/status_updates.py +0 -0
  123. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/tags.py +0 -0
  124. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/tasks.py +0 -0
  125. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/teams.py +0 -0
  126. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/terminal.py +0 -0
  127. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/users.py +0 -0
  128. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/webhooks.py +0 -0
  129. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/runtime_settings.py +0 -0
  130. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/security.py +0 -0
  131. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/__init__.py +0 -0
  132. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/_fts.py +0 -0
  133. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/audit.py +0 -0
  134. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/auto_approval.py +0 -0
  135. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/__init__.py +0 -0
  136. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/baseline.py +0 -0
  137. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/capabilities.py +0 -0
  138. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cascade_rollup.py +0 -0
  139. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/compound_bridge.py +0 -0
  140. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cycle.py +0 -0
  141. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cycle_snapshot.py +0 -0
  142. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/digest_collector.py +0 -0
  143. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/direction.py +0 -0
  144. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/drift.py +0 -0
  145. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/drift_router.py +0 -0
  146. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/edge_metrics.py +0 -0
  147. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/events_reader.py +0 -0
  148. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/findings.py +0 -0
  149. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/findings_reader.py +0 -0
  150. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/journal.py +0 -0
  151. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/knowledge_forms.py +0 -0
  152. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/__init__.py +0 -0
  153. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/_runner.py +0 -0
  154. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/base.py +0 -0
  155. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/cache.py +0 -0
  156. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/constants.py +0 -0
  157. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/direction_alignment.py +0 -0
  158. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/factory.py +0 -0
  159. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/finding_reasoning.py +0 -0
  160. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/finding_summary.py +0 -0
  161. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/grounding.py +0 -0
  162. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/journal_polish.py +0 -0
  163. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/local_gateway.py +0 -0
  164. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/parsers.py +0 -0
  165. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/router_glue.py +0 -0
  166. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/memory_ops.py +0 -0
  167. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/models.py +0 -0
  168. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/owner_hint.py +0 -0
  169. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/recap.py +0 -0
  170. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/__init__.py +0 -0
  171. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/_signals.py +0 -0
  172. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
  173. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
  174. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
  175. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
  176. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
  177. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
  178. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
  179. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
  180. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/runs_reader.py +0 -0
  181. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/scope.py +0 -0
  182. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/__init__.py +0 -0
  183. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/base.py +0 -0
  184. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/git_kg.py +0 -0
  185. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/handoffs.py +0 -0
  186. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/ingestor.py +0 -0
  187. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/learnings.py +0 -0
  188. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/pir_tasks.py +0 -0
  189. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/warehouse_consolidate.py +0 -0
  190. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/watermarks.py +0 -0
  191. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/ws_emitter.py +0 -0
  192. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/cc_tasks_reader.py +0 -0
  193. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ci_service.py +0 -0
  194. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/claude_metrics.py +0 -0
  195. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/codex_metrics.py +0 -0
  196. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/conversation_reader.py +0 -0
  197. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/cost_service.py +0 -0
  198. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/crypto.py +0 -0
  199. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/__init__.py +0 -0
  200. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/confidence.py +0 -0
  201. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/config.py +0 -0
  202. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/enrichment.py +0 -0
  203. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
  204. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/hard_gates.py +0 -0
  205. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
  206. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_backends/__init__.py +0 -0
  207. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_internal.py +0 -0
  208. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_service.py +0 -0
  209. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/event_dispatcher.py +0 -0
  210. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/events.py +0 -0
  211. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/git_ops.py +0 -0
  212. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_cosmo_service.py +0 -0
  213. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_ranker.py +0 -0
  214. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_service.py +0 -0
  215. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox.py +0 -0
  216. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest.py +0 -0
  217. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest_deep_research.py +0 -0
  218. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest_jobs.py +0 -0
  219. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_gmail_sync.py +0 -0
  220. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_llm_classifier.py +0 -0
  221. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_source_identity.py +0 -0
  222. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_sources.py +0 -0
  223. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_taxonomy.py +0 -0
  224. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_tldr.py +0 -0
  225. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_triage.py +0 -0
  226. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/__init__.py +0 -0
  227. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/api_key_auth.py +0 -0
  228. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/auto_approve.py +0 -0
  229. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/classifier.py +0 -0
  230. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/confidence.py +0 -0
  231. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/dispatch.py +0 -0
  232. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/embedding_router.py +0 -0
  233. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/events.py +0 -0
  234. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/ignore_patterns.py +0 -0
  235. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/image_probe.py +0 -0
  236. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/ingress.py +0 -0
  237. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/insert_saga.py +0 -0
  238. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/__init__.py +0 -0
  239. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
  240. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/base.py +0 -0
  241. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/byok_provider.py +0 -0
  242. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/classification_context.py +0 -0
  243. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/config_store.py +0 -0
  244. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/factory.py +0 -0
  245. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/kg_enricher.py +0 -0
  246. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/local_gateway.py +0 -0
  247. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/local_vllm.py +0 -0
  248. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/openai_nano.py +0 -0
  249. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/lock_advisory.py +0 -0
  250. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parser_router.py +0 -0
  251. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/__init__.py +0 -0
  252. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docling_parser.py +0 -0
  253. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
  254. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docx_parser.py +0 -0
  255. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
  256. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
  257. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/image_parser.py +0 -0
  258. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
  259. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
  260. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
  261. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/pdf_types.py +0 -0
  262. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
  263. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
  264. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
  265. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
  266. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/preflight.py +0 -0
  267. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/routing_policy.py +0 -0
  268. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/serializers/__init__.py +0 -0
  269. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
  270. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/skip_log.py +0 -0
  271. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/watcher.py +0 -0
  272. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/__init__.py +0 -0
  273. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/audit.py +0 -0
  274. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/hybrid_search.py +0 -0
  275. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/lens.py +0 -0
  276. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/pr_impact.py +0 -0
  277. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/queries.py +0 -0
  278. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/ranking.py +0 -0
  279. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/rrf.py +0 -0
  280. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg_watcher_control.py +0 -0
  281. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/__init__.py +0 -0
  282. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/async_client.py +0 -0
  283. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/client.py +0 -0
  284. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/url_validator.py +0 -0
  285. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/metrics_collector.py +0 -0
  286. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/metrics_providers.py +0 -0
  287. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/model_registry.py +0 -0
  288. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/model_router.py +0 -0
  289. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/n8n_client.py +0 -0
  290. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/newsletter_llm_gateway.py +0 -0
  291. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/notification_service.py +0 -0
  292. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/openai_responses.py +0 -0
  293. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/opencode_metrics.py +0 -0
  294. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/opencode_sessions.py +0 -0
  295. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pii_redactor.py +0 -0
  296. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
  297. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/differ.py +0 -0
  298. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
  299. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/gc.py +0 -0
  300. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/languages.py +0 -0
  301. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/parser.py +0 -0
  302. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/writer.py +0 -0
  303. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_service.py +0 -0
  304. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/project_paths.py +0 -0
  305. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/project_status_updates.py +0 -0
  306. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/providers.py +0 -0
  307. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/push_service.py +0 -0
  308. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/reminder_service.py +0 -0
  309. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/runas.py +0 -0
  310. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/salience_service.py +0 -0
  311. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/security_collector.py +0 -0
  312. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_catalog.py +0 -0
  313. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_metrics_service.py +0 -0
  314. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_ops.py +0 -0
  315. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_state.py +0 -0
  316. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/share_links.py +0 -0
  317. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/task_transitions.py +0 -0
  318. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/terminal_metrics.py +0 -0
  319. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/terminal_metrics_dump.py +0 -0
  320. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/tmux.py +0 -0
  321. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/webhook_service.py +0 -0
  322. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/workspace_sync.py +0 -0
  323. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/templates/__init__.py +0 -0
  324. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/templates/markdown_share.py +0 -0
  325. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/terminal.py +0 -0
  326. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/__init__.py +0 -0
  327. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
  328. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_audit_permissions.py +0 -0
  329. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_backfill_session_conversations.py +0 -0
  330. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
  331. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_claude_metrics.py +0 -0
  332. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_codex_metrics.py +0 -0
  333. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_config_env_aliases.py +0 -0
  334. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_finder_paths.py +0 -0
  335. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_git_ops_merge.py +0 -0
  336. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_learnings_check_search.py +0 -0
  337. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_metrics_providers.py +0 -0
  338. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_087.py +0 -0
  339. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_088.py +0 -0
  340. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_089.py +0 -0
  341. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_openai_responses.py +0 -0
  342. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_opencode_metrics.py +0 -0
  343. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_opencode_sessions.py +0 -0
  344. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_pr_workflow_e2e.py +0 -0
  345. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_projects_handoffs.py +0 -0
  346. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_providers.py +0 -0
  347. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_require_scope_empty_deny.py +0 -0
  348. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_safety_bridge.py +0 -0
  349. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_catalog.py +0 -0
  350. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_conversations.py +0 -0
  351. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_metrics_service.py +0 -0
  352. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_resume_paths.py +0 -0
  353. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_theme_mode_migration.py +0 -0
  354. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_sessions_rbac.py +0 -0
  355. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_share_edit.py +0 -0
  356. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_share_repo.py +0 -0
  357. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_terminal_session_manager.py +0 -0
  358. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_terminal_upload.py +0 -0
  359. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_tmux.py +0 -0
  360. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_workspace_sync.py +0 -0
  361. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
  362. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/__init__.py +0 -0
  363. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_context.py +0 -0
  364. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_errors.py +0 -0
  365. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_roles.py +0 -0
  366. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/audit.py +0 -0
  367. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/brain.py +0 -0
  368. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/costs.py +0 -0
  369. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/graph.py +0 -0
  370. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/handoffs.py +0 -0
  371. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/ingest_triage.py +0 -0
  372. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/learnings.py +0 -0
  373. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/projects.py +0 -0
  374. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/pull_requests.py +0 -0
  375. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/search.py +0 -0
  376. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/tasks.py +0 -0
  377. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/visibility.py +0 -0
  378. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/README.md +0 -0
  379. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/__init__.py +0 -0
  380. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_brain_opportunistic.py +0 -0
  381. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_brain_schedule.py +0 -0
  382. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_index_source.py +0 -0
  383. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_runtime_ctx.py +0 -0
  384. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_transmute.py +0 -0
  385. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_update_check.py +0 -0
  386. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_account.py +0 -0
  387. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_feedback.py +0 -0
  388. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_governance.py +0 -0
  389. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_hooks.py +0 -0
  390. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_mcp.py +0 -0
  391. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_telemetry.py +0 -0
  392. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/platform/__init__.py +0 -0
  393. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_drift_check.py +0 -0
  394. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_frontmatter.py +0 -0
  395. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_graph_writer.py +0 -0
  396. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/ast_parser.py +0 -0
  397. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/__init__.py +0 -0
  398. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/_config.sh +0 -0
  399. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
  400. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
  401. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
  402. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
  403. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
  404. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/config.json +0 -0
  405. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
  406. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
  407. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/quality-gate.sh +0 -0
  408. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/safety_bridge.py +0 -0
  409. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/secret-scan.sh +0 -0
  410. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/migrate_spike_node_ids.py +0 -0
  411. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_artifacts.py +0 -0
  412. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_cross_project.py +0 -0
  413. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_inbox_nodes.py +0 -0
  414. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_pr_impact.py +0 -0
  415. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_project_nodes.py +0 -0
  416. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_touch_counter.py +0 -0
  417. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/reparse_failed.py +0 -0
  418. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/safety_bridge.py +0 -0
  419. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/__init__.py +0 -0
  420. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/entitlements.py +0 -0
  421. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/rollup.py +0 -0
  422. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/schema.py +0 -0
  423. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/sender.py +0 -0
  424. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/__init__.py +0 -0
  425. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/byok_vault.py +0 -0
  426. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/defaults.py +0 -0
  427. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/state.py +0 -0
  428. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/steps.py +0 -0
  429. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/validation.py +0 -0
  430. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/dependency_links.txt +0 -0
  431. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/entry_points.txt +0 -0
  432. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/requires.txt +0 -0
  433. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/top_level.txt +0 -0
  434. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/001_initial.sql +0 -0
  435. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/002_tasks.sql +0 -0
  436. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/003_session_management.sql +0 -0
  437. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/004_projects_comments.sql +0 -0
  438. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/005_session_intelligence.sql +0 -0
  439. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/006_settings.sql +0 -0
  440. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/007_task_scoring.sql +0 -0
  441. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/008_cost_tracking.sql +0 -0
  442. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/009_session_card_metrics.sql +0 -0
  443. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/010_monitoring.sql +0 -0
  444. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/012_agent_api.sql +0 -0
  445. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/013_session_complete.sql +0 -0
  446. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/015_pull_requests.sql +0 -0
  447. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/015_pull_requests_down.sql +0 -0
  448. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/016_users_raci.sql +0 -0
  449. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/017_task_cost_entries.sql +0 -0
  450. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/018_agents.sql +0 -0
  451. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/018_agents_down.sql +0 -0
  452. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/019_review_feedback.sql +0 -0
  453. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/020_pr_commit_sha.sql +0 -0
  454. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/021_webhook_events.sql +0 -0
  455. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/022_devx_agent_managed.sql +0 -0
  456. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/022_devx_agent_managed_down.sql +0 -0
  457. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/023_devx_p1_gate.sql +0 -0
  458. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/023_devx_p1_gate_down.sql +0 -0
  459. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_chat_messages.sql +0 -0
  460. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_pr_conversation_id.sql +0 -0
  461. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_task_indexes.sql +0 -0
  462. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_task_indexes_down.sql +0 -0
  463. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/025_audit_log.sql +0 -0
  464. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/026_agent_tokens.sql +0 -0
  465. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/027_teams_auth_phase_b.sql +0 -0
  466. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/028_learnings.sql +0 -0
  467. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/029_team_roles.sql +0 -0
  468. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/030_finder_pins.sql +0 -0
  469. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/031_pr_deploy_status.sql +0 -0
  470. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/032_task_reminders.sql +0 -0
  471. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/033_events_retry_count.sql +0 -0
  472. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/033_session_owner.sql +0 -0
  473. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/034_notifications.sql +0 -0
  474. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/035_shared_links.sql +0 -0
  475. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/036_session_index_upgrade.sql +0 -0
  476. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/037_pr_approval.sql +0 -0
  477. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/038_pr_submitted_by.sql +0 -0
  478. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/039_push_subscriptions.sql +0 -0
  479. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/040_semantic_search.sql +0 -0
  480. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/041_workspaces.sql +0 -0
  481. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/042_oidc_providers.sql +0 -0
  482. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/043_ci_checks.sql +0 -0
  483. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/044_agent_metrics.sql +0 -0
  484. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/045_documents_doc_type.sql +0 -0
  485. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/046_salience.sql +0 -0
  486. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/047_seed_missing_agents.sql +0 -0
  487. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/048_fix_agent_paths_roles.sql +0 -0
  488. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
  489. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/050_session_provider.sql +0 -0
  490. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/051_session_launch_profile.sql +0 -0
  491. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/052_session_theme_mode.sql +0 -0
  492. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/052_task_kind.sql +0 -0
  493. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/053_inbox_items.sql +0 -0
  494. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/054_inbox_triage_contract.sql +0 -0
  495. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/055_inbox_topic_treatment.sql +0 -0
  496. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/056_inbox_treatment_read_save.sql +0 -0
  497. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/057_session_theme_mode_backfill.sql +0 -0
  498. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
  499. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
  500. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/060_newsletter.sql +0 -0
  501. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/061_inbox_redesign.sql +0 -0
  502. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
  503. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/063_task_completion_mode.sql +0 -0
  504. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/064_judge_mode_setting.sql +0 -0
  505. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/065_knowledge_graph_spike.sql +0 -0
  506. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/066_digest_ranking_inputs.sql +0 -0
  507. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/066_kg_artifact_nodes.sql +0 -0
  508. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/067_inbox_digest_selections.sql +0 -0
  509. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/067_kg_temporal.sql +0 -0
  510. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/068_inbox_digest_app_settings.sql +0 -0
  511. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/068_kg_touch_counter.sql +0 -0
  512. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/069_kg_doc_types.sql +0 -0
  513. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
  514. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
  515. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
  516. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/073_kg_cross_project.sql +0 -0
  517. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/073_kg_cross_project_down.sql +0 -0
  518. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/074_kg_infra_types.sql +0 -0
  519. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/074_kg_infra_types_down.sql +0 -0
  520. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/075_kg_file_state_recovery.sql +0 -0
  521. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/075_kg_file_state_recovery_down.sql +0 -0
  522. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/076_kg_watcher_state.sql +0 -0
  523. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/076_kg_watcher_state_down.sql +0 -0
  524. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/077_kg_doc_types_extend.sql +0 -0
  525. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/077_kg_doc_types_extend_down.sql +0 -0
  526. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/078_kg_fts5.sql +0 -0
  527. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/078_kg_fts5_down.sql +0 -0
  528. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/079_kg_missing_indexes.sql +0 -0
  529. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/079_kg_missing_indexes_down.sql +0 -0
  530. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/080_kg_fts5_extended.sql +0 -0
  531. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/080_kg_fts5_extended_down.sql +0 -0
  532. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/081_kg_lens_indexes.sql +0 -0
  533. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/081_kg_lens_indexes_down.sql +0 -0
  534. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/082_kg_pins.sql +0 -0
  535. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/082_kg_pins_down.sql +0 -0
  536. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/083_kg_graph_nodes_degree.sql +0 -0
  537. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
  538. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
  539. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
  540. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/085_kg_edge_resolves_to.sql +0 -0
  541. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
  542. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/086_project_status_updates_feed.sql +0 -0
  543. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/086_project_status_updates_feed_down.sql +0 -0
  544. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/087_session_metrics_dual.sql +0 -0
  545. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/087_session_metrics_dual_down.sql +0 -0
  546. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/088_rename_context_pct_legacy.sql +0 -0
  547. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
  548. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
  549. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
  550. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/090_kg_inbox_node_type.sql +0 -0
  551. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/090_kg_inbox_node_type_down.sql +0 -0
  552. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/091_kg_inbox_node_type_check.sql +0 -0
  553. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
  554. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/092_sessions_activity_state_ts.sql +0 -0
  555. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
  556. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/093_sessions_activity_state_column.sql +0 -0
  557. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/093_sessions_activity_state_column_down.sql +0 -0
  558. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/094_ingest_pending.sql +0 -0
  559. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/094_ingest_pending_down.sql +0 -0
  560. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/095_kg_intent_first.sql +0 -0
  561. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/095_kg_intent_first_down.sql +0 -0
  562. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
  563. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
  564. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/097_ingest_change_history.sql +0 -0
  565. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/097_ingest_change_history_down.sql +0 -0
  566. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/098_kg_node_type_business.sql +0 -0
  567. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/098_kg_node_type_business_down.sql +0 -0
  568. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/099_kg_edges_restore_weight.sql +0 -0
  569. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
  570. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/100_kg_enriched_at.sql +0 -0
  571. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/100_kg_enriched_at_down.sql +0 -0
  572. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
  573. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
  574. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/102_promote_llm_costs.sql +0 -0
  575. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/102_promote_llm_costs_down.sql +0 -0
  576. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/103_ingest_skipped_log.sql +0 -0
  577. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/103_ingest_skipped_log_down.sql +0 -0
  578. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/120_docs_governance.sql +0 -0
  579. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/120_docs_governance_down.sql +0 -0
  580. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/121_notification_event_fk_cleanup.sql +0 -0
  581. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
  582. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/122_docs_drift_history.sql +0 -0
  583. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/122_docs_drift_history_down.sql +0 -0
  584. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/123_ingest_parser_waiting_status.sql +0 -0
  585. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
  586. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/124_heypocket_recordings.sql +0 -0
  587. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/124_heypocket_recordings_down.sql +0 -0
  588. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/125_kg_node_type_record.sql +0 -0
  589. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/125_kg_node_type_record_down.sql +0 -0
  590. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
  591. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
  592. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/127_brain_v1_substrate.sql +0 -0
  593. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/127_brain_v1_substrate_down.sql +0 -0
  594. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/128_brain_drift_signals.sql +0 -0
  595. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/128_brain_drift_signals_down.sql +0 -0
  596. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/129_brain_memory_operations.sql +0 -0
  597. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/129_brain_memory_operations_down.sql +0 -0
  598. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/130_brain_findings.sql +0 -0
  599. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/130_brain_findings_down.sql +0 -0
  600. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/132_kg_pr_modifies.sql +0 -0
  601. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/132_kg_pr_modifies_down.sql +0 -0
  602. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
  603. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
  604. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/134_brain_journal_narrative_polished.sql +0 -0
  605. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
  606. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/135_kg_edges_provider.sql +0 -0
  607. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/136_documents_fts.sql +0 -0
  608. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/137_promote_llm_costs.sql +0 -0
  609. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/137_promote_llm_costs_down.sql +0 -0
  610. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/138_ingest_api_keys.sql +0 -0
  611. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/138_ingest_api_keys_down.sql +0 -0
  612. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/139_ingest_pending_ingress.sql +0 -0
  613. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/139_ingest_pending_ingress_down.sql +0 -0
  614. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/140_ingest_idempotency_quota.sql +0 -0
  615. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
  616. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/141_ingest_pending_metadata.sql +0 -0
  617. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/141_ingest_pending_metadata_down.sql +0 -0
  618. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/142_llm_function_config.sql +0 -0
  619. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/142_llm_function_config_down.sql +0 -0
  620. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/143_kg_code_embeddings.sql +0 -0
  621. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/143_kg_code_embeddings_down.sql +0 -0
  622. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/144_notifications_pending_sync_index.sql +0 -0
  623. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/145_audit_log_immutable.sql +0 -0
  624. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/145_audit_log_immutable_down.sql +0 -0
  625. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/__init__.py +0 -0
  626. {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/setup.cfg +0 -0
@@ -5,19 +5,18 @@ Parameters
5
5
  Licensor: Emilio Martucci
6
6
  Licensed Work: MarvisX
7
7
  The Licensed Work is (c) 2026 Emilio Martucci.
8
- Additional Use Grant: You may make production use of the Licensed Work only
9
- for personal, non-commercial purposes (for example,
10
- self-hosting it for your own individual use). Any other
11
- production use is not granted here and requires a separate
12
- commercial license from the Licensor. Uses that are NOT
13
- granted include, without limitation: any commercial use;
14
- any use by, within, or for the benefit of a business,
15
- company, or other organization; offering the Licensed
16
- Work (or a modified or adapted version of it) to third
17
- parties as a hosted or managed service; and using a
18
- modified or adapted version of the Licensed Work as, or
19
- as part of, a product or service that competes with the
20
- Licensor.
8
+ Additional Use Grant: You may make production use of the Licensed Work,
9
+ including for internal business and commercial
10
+ purposes and including self-hosting the Licensed
11
+ Work for your own use, provided that you may not
12
+ provide the Licensed Work to third parties as a
13
+ Hosted or Managed Service. A "Hosted or Managed
14
+ Service" is a commercial offering that gives third
15
+ parties (other than your employees and contractors)
16
+ access to the substantial functionality of the
17
+ Licensed Work, or of a modified or derived version
18
+ of it, or that otherwise competes with a product or
19
+ service the Licensor offers using the Licensed Work.
21
20
  Change Date: 2030-01-01
22
21
  Change License: Apache License, Version 2.0
23
22
 
@@ -10,4 +10,5 @@ recursive-include migrations *.sql
10
10
  recursive-include core/scripts/install_hooks *.sh *.json *.py
11
11
  recursive-include core/api/templates *.md *.j2
12
12
  recursive-include core/api/mcp/tools/workflow_playbooks *.md
13
+ recursive-include core/cli/guides *.md
13
14
  recursive-include projects/_template *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marvisx-cli
3
- Version: 0.3.6
3
+ Version: 0.3.7
4
4
  Summary: MarvisX OSS — agent-native company-brain CLI runtime (init, status, brief, triage)
5
5
  Author: MarvisX maintainers
6
6
  License: BSL-1.1
@@ -1,6 +1,8 @@
1
1
  # Marvis
2
2
 
3
- **The Company Brain your agents install.** Use Claude Code, or whatever coding agent you run, to manage projects and coordinate your agents, not just write code. Marvis captures what your agents do as they work, structures it into a cross-project Knowledge Graph, and hands it back to them, so your work stays on track and the system learns from it. Self-hosted, EU-resident, governed by an immutable audit chain.
3
+ [![PyPI](https://img.shields.io/pypi/v/marvisx-cli.svg)](https://pypi.org/project/marvisx-cli/) [![License: BSL 1.1](https://img.shields.io/badge/license-BSL%201.1-blue.svg)](LICENSE) [![Change Date: Apache-2.0 2030](https://img.shields.io/badge/change%20date-Apache--2.0%20(2030)-lightgrey.svg)](LICENSE)
4
+
5
+ **The Company Brain your agents install.** Use Claude Code, or whatever coding agent you run, to manage projects and coordinate your agents, not just write code. Marvis captures what your agents do as they work, structures it into a cross-project Knowledge Graph, and hands it back to them, so your work stays on track and the system learns from it. Self-hosted, EU-resident, with a tamper-evident audit log.
4
6
 
5
7
  **Open-core and free to run.** Marvis is the free core: you self-host it, read the source, fork it, audit it, at no cost. MarvisX is the commercial tier on top of the same brain: multi-department teams, data sovereignty and managed hosting, and autonomous, hands-off-the-keyboard operation. Marvis is what you install today; MarvisX is what you reach for when a single self-hosted instance is no longer enough.
6
8
 
@@ -15,6 +17,8 @@ marvis init
15
17
 
16
18
  `marvis init` scaffolds the project and installs the governance hooks, then exposes the MCP surface to your agent. Python 3.10–3.13; on 3.14, pin the interpreter: `uv tool install --python 3.13 marvisx-cli`. No `uv` yet? `curl -LsSf https://astral.sh/uv/install.sh | sh`.
17
19
 
20
+ **Managed Windows (application-control policy)?** If your organization enforces application control — Windows **WDAC** / AppLocker / Managed Installer, common on managed corporate machines — Windows blocks running any binary placed in `%LOCALAPPDATA%`, which is where `uv` installs tools, so `uv tool install` can't execute. Don't bypass it. Install Marvis inside **WSL2** (recommended) or **Docker**, or ask IT to whitelist `uv` (or publish it through your managed channel); the Linux runtime is identical.
21
+
18
22
  To run the full Console + API stack yourself, see [Self-hosting the full stack](#self-hosting-the-full-stack).
19
23
 
20
24
  ## What it does, in plain terms
@@ -28,7 +32,7 @@ To run the full Console + API stack yourself, see [Self-hosting the full stack](
28
32
  ## Under the hood
29
33
 
30
34
  - **Cross-project Knowledge Graph** with 17 deterministic edge types covering code, work-chain artifacts, knowledge-chain documents, cross-project references, and bridge edges. Canonical IDs follow `{prefix}:{kind}:{slug}`.
31
- - **Foreign-key-immutable audit log** with provenance pinned at the SQLite level. Designed to satisfy the logging surface required by EU Regulation 2024/1689 (AI Act) Article 12.
35
+ - **Append-only audit log** (foreign-key + trigger enforced) with provenance pinned at the SQLite level. The managed **MarvisX** tier builds on it to cover the logging surface required by EU Regulation 2024/1689 (AI Act) Article 12.
32
36
  - **Brain reflection pipeline** in five layers — substrate, digest and journal, drift checker, memory operations, findings — closed by a Direction-Aware loop.
33
37
  - **Constitution-enforced safety rules** enforced by deterministic hook gates and an MCP mirror for providers without native hooks.
34
38
  - **Agent-native MCP surface** exposing 91 tools, callable identically from Claude Code, Codex, Gemini, OpenCode, and a web console.
@@ -37,14 +41,14 @@ To run the full Console + API stack yourself, see [Self-hosting the full stack](
37
41
 
38
42
  Marvis defaults to **IBM Granite-Embedding-97m-Multilingual-R2** self-hosted via ONNX, blended with SQLite BM25 keyword search through Reciprocal Rank Fusion. Backend is selectable through `EMBEDDING_MODE`.
39
43
 
40
- This is a deliberate tradeoff: EU compliance, self-hosting, and zero external embedding cost come at the cost of retrieval quality that is below commercial managed embedding providers. See [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) for the benchmark numbers, affected workflows, mitigations available today, and the Phase 2 fine-tune roadmap.
44
+ This is a deliberate tradeoff: EU residency, self-hosting, and zero external embedding cost come at the cost of retrieval quality that is below commercial managed embedding providers. See [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) for the benchmark numbers, affected workflows, mitigations available today, and the Phase 2 fine-tune roadmap.
41
45
 
42
46
  ## License posture
43
47
 
44
- - **Free to self-host.** Code is **source-available** under the **Business Source License 1.1**, with an automatic change date converting to **Apache License 2.0** four years after release.
48
+ - **Free to self-host and use internally**, including for commercial purposes. Code is **source-available** under the **Business Source License 1.1**; a paid license is required only to offer Marvis to third parties as a hosted or managed service. The change date automatically converts the code to **Apache License 2.0** four years after release.
45
49
  - Documentation and architectural patterns: **CC-BY 4.0**.
46
50
 
47
- This is open-core, not OSI open source: the core is free to run and read, and the BSL holds back only competing commercial-as-a-service use until the change date. The combination keeps the architecture freely citable while preserving the ability to ship a self-hosted reference deployment.
51
+ This is open-core, not OSI open source: the core is free to run, read and fork, and the BSL holds back only competing commercial-as-a-service use until the change date. GitHub does not recognize the BSL and labels the repo `NOASSERTION`; the authoritative terms are in [`LICENSE`](LICENSE).
48
52
 
49
53
  ## Architecture map
50
54
 
@@ -80,6 +80,14 @@ class Settings(BaseSettings):
80
80
  default_factory=lambda: str(db_default_path()),
81
81
  validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
82
82
  )
83
+ db_backup_dir: str = Field(
84
+ # Where pre-migration / pre-rebuild console.db snapshots land. Empty (the
85
+ # OSS default) keeps them next to the DB. In a managed deployment set this
86
+ # to a roomy data volume: the snapshots are full DB copies (>1GB) and a
87
+ # couple of them fill a small root disk — the recurring 90%-full cause.
88
+ default="",
89
+ validation_alias=AliasChoices("MARVIS_DB_BACKUP_DIR", "PIR_DB_BACKUP_DIR"),
90
+ )
83
91
  cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
84
92
  cors_origins_prod: list[str] = Field(
85
93
  default_factory=list,
@@ -617,20 +617,24 @@ def run_migrations() -> None:
617
617
  and int(f.stem.split("_")[0]) > current_version
618
618
  ]
619
619
 
620
- # Pre-migration backup (enterprise rollback strategy)
621
- # Keep only last 2 backups to prevent disk fill (was unbounded)
620
+ # Pre-migration backup (enterprise rollback strategy).
621
+ # Snapshots go to settings.db_backup_dir (a roomy data volume in prod)
622
+ # when set, otherwise next to the DB. Rotation is GLOBAL keep-2 across
623
+ # ALL tags in that dir (migration `backup-v*`, kg `backup-pre-rebuild-*`,
624
+ # etc.) — full DB copies are >1GB, so only the two newest are retained.
622
625
  if pending:
623
- backup_path = f"{settings.db_path}.backup-v{current_version}"
626
+ db_name = os.path.basename(settings.db_path)
627
+ backup_dir = settings.db_backup_dir or os.path.dirname(settings.db_path) or "."
628
+ backup_path = os.path.join(backup_dir, f"{db_name}.backup-v{current_version}")
624
629
  try:
630
+ os.makedirs(backup_dir, exist_ok=True)
625
631
  shutil.copy2(settings.db_path, backup_path)
626
632
  logger.info("Pre-migration backup: %s", backup_path)
627
- # Rotate: keep only the 2 most recent backups
633
+ # Rotate: keep only the 2 most recent backups (global, all tags)
628
634
  import glob
629
635
 
630
- db_dir = os.path.dirname(settings.db_path) or "."
631
- db_name = os.path.basename(settings.db_path)
632
636
  backups = sorted(
633
- glob.glob(os.path.join(db_dir, f"{db_name}.backup-v*")),
637
+ glob.glob(os.path.join(backup_dir, f"{db_name}.backup-*")),
634
638
  key=os.path.getmtime,
635
639
  )
636
640
  for old_backup in backups[:-2]:
@@ -283,7 +283,20 @@ async def _execute_cycle(
283
283
  event_count = 0
284
284
  journal_count = 0
285
285
 
286
- collectors = collectors if collectors is not None else registered_collectors()
286
+ if collectors is None:
287
+ collectors = registered_collectors()
288
+ if not collectors:
289
+ # Standalone runtime (`marvis brain run` / brain_cycles_recompute via
290
+ # the CLI + stdio MCP) never runs the API lifespan startup hook that
291
+ # registers the source collectors, so the registry is empty and the
292
+ # cycle would silently collect 0 events even with in-window data
293
+ # (issue #6). Register them lazily here so the standalone path lights
294
+ # up the same capture→reflect collectors as the API service. Idempotent
295
+ # and inert when the API already registered them at startup.
296
+ from core.api.services.brain.sources import register_all_collectors
297
+
298
+ register_all_collectors()
299
+ collectors = registered_collectors()
287
300
 
288
301
  # Cycle window resolution (bug fix 2026-05-18). When caller did not pass
289
302
  # explicit window bounds (legacy periodic path), default to the legacy
@@ -0,0 +1,6 @@
1
+ """Packaged Marvis reference guides loaded at runtime by `marvis guide`.
2
+
3
+ The ``__init__.py`` makes this a regular package so
4
+ ``importlib.resources.files("core.cli.guides")`` resolves the bundled markdown
5
+ identically from a source checkout and from an installed wheel.
6
+ """
@@ -0,0 +1,183 @@
1
+ # The Marvis Way
2
+
3
+ > **If you are an AI agent, this is your operating manual — read it before you
4
+ > touch the user's repository.** It tells you exactly how to organize their
5
+ > work, where to write what, and how to leave the workspace better than you
6
+ > found it so the next agent (or you, tomorrow) picks up without losing context.
7
+ > Everything here is concrete and you can act on it immediately.
8
+
9
+ Marvis is a **mold** for how an agent-run workspace keeps its memory. It does
10
+ not replace your agent — Claude Code, Codex, Cursor, whatever you use — it gives
11
+ that agent a place to put what it learns, a shape for your projects, and a way
12
+ to find prior decisions across them.
13
+
14
+ This guide is the source of truth for how that shape works. Read it, then apply
15
+ it to your own repository: an agent can use these conventions to organize a
16
+ messy folder, write the missing context, and let Marvis index the result. You
17
+ do not have to adopt everything at once — start with one project and a
18
+ `context.md`, and grow into the rest.
19
+
20
+ **Installing on a locked-down machine.** If `uv tool install` is blocked by an
21
+ organization's application-control policy (Windows WDAC / AppLocker / Managed
22
+ Installer — common on managed corporate machines), do not bypass it. Install
23
+ Marvis inside WSL2 (recommended) or Docker, or ask IT to whitelist `uv`; the
24
+ Linux runtime is identical.
25
+
26
+ Sections (jump with `marvis guide --section <name>`): concepts, naming,
27
+ directories, dependencies, tags, frontmatter, brain, lifecycle, adopt.
28
+
29
+ ## Concepts
30
+
31
+ Three nested units organize everything:
32
+
33
+ - **Program** — a long-running line of work or a team area. Optional grouping
34
+ over projects (e.g. "platform", "growth"). Programs give cross-project views.
35
+ - **Project** — the main unit. One folder, one `project.yaml`. A project has a
36
+ `type`: `code` (has a git repo and ships PRs), `work` (docs/research, no git),
37
+ or `system` (infrastructure). Everything below — context, memory, docs — hangs
38
+ off a project.
39
+ - **Task** — a single tracked piece of work inside a project. Tasks survive
40
+ across agent sessions, so an agent that picks up tomorrow sees what was open.
41
+ Tasks carry an intent score (impact / confidence / ease) and a delegation
42
+ (agent, hybrid, human).
43
+
44
+ The rule of thumb: **one thing in progress at a time per worker**, and every
45
+ implementation change starts by creating a task — so the work is tracked before
46
+ the first edit, not reconstructed afterwards.
47
+
48
+ ## Naming
49
+
50
+ - **Slugs** are kebab-case, lowercase, stable: `growth-site`, `q3-research`.
51
+ A slug never changes once other things reference it.
52
+ - **Canonical IDs** in the Knowledge Graph follow `{prefix}:{kind}:{slug}`,
53
+ for example `task:artifact:<uuid>`, `handoff:artifact:2026-06-04-onboarding`,
54
+ `py:function:core.api.db.get_db`. The prefix says what kind of thing it is;
55
+ the kind says whether it is a file, function, module, or artifact.
56
+ - **Files** are dated when they are events (`handoff-2026-06-04-<topic>.md`) and
57
+ named by subject when they are references (`context.md`, `project.yaml`).
58
+
59
+ ## Directories
60
+
61
+ A project is a folder. The conventional layout:
62
+
63
+ ```
64
+ <project-slug>/
65
+ project.yaml # name, slug, type, lifecycle (the only required file)
66
+ context.md # the living state of the project: goal, status, constraints
67
+ memory/
68
+ handoff-YYYY-MM-DD-<topic>.md # what happened in a session, for the next one
69
+ docs/
70
+ brainstorms/ # exploring WHAT to build
71
+ plans/ # deciding HOW to build it
72
+ solutions/ # what was built and why (post-hoc, durable)
73
+ input/ # raw material you bring in (transcripts, exports, briefs)
74
+ output/ # finished artifacts you hand out
75
+ ```
76
+
77
+ `code` projects keep their actual source wherever it already lives (a `repo_path`
78
+ in `project.yaml` points at it); the project folder holds the *memory* around the
79
+ code, not necessarily the code itself.
80
+
81
+ ## Dependencies
82
+
83
+ Marvis links artifacts in a **Knowledge Graph** so an agent can ask "who calls
84
+ this", "what breaks if I change it", and "why does this exist" instead of
85
+ grepping blind. The edges are deterministic — derived from the code and the
86
+ documents, not guessed by a model. They fall into categories:
87
+
88
+ - **Code**: `calls`, `imports`, `defines` — extracted from the source tree.
89
+ - **Work chain**: `produces`, `contains` — a task produces a PR; a project
90
+ contains its docs.
91
+ - **Knowledge chain**: `describes`, `documents`, `cites`, `applies_to` — a
92
+ handoff describes a task; a learning applies to a module.
93
+ - **Cross-project**: `depends_on`, `mentions`, `refers_to`, `shares_tag`,
94
+ `similar_to` — how one project's work relates to another's.
95
+ - **Bridge**: `resolves_to` — links a referenced symbol to its canonical file.
96
+
97
+ You never write edges by hand. They are populated from what you commit and the
98
+ frontmatter you fill in. The authoritative, live set of edge types for an
99
+ install is what the graph reports — treat the list above as the shape, not a
100
+ fixed count.
101
+
102
+ ## Tags
103
+
104
+ Tags are free-form, lowercase, kebab-case labels on tasks, handoffs, and
105
+ learnings. They power search and the `shares_tag` cross-project edge. Keep them
106
+ few and meaningful: a topic (`auth`, `billing`), a surface (`frontend`, `api`),
107
+ or a workstream (`q3-launch`). Tags are not a taxonomy you design up front; they
108
+ accrete, and search does the rest.
109
+
110
+ ## Frontmatter
111
+
112
+ Every durable markdown artifact starts with a YAML frontmatter block. It is how
113
+ Marvis indexes the file and how an agent reads its metadata without parsing
114
+ prose. The body below the block is **only content** — no "this document is for
115
+ X" preamble; audience and status live in the frontmatter.
116
+
117
+ A handoff:
118
+
119
+ ```yaml
120
+ ---
121
+ date: 2026-06-04
122
+ project: growth-site
123
+ tags: [onboarding, launch]
124
+ ---
125
+ ```
126
+
127
+ A plan or brainstorm adds `title`, `type`, `status`. A solution records what was
128
+ built. The minimum that makes a file first-class is a `date` (for events) or a
129
+ `title` + `project` (for references). Missing frontmatter does not break
130
+ anything — the file is just weaker signal until you add it.
131
+
132
+ ## Brain
133
+
134
+ The Brain is a reflection layer that runs on a schedule (or on demand with
135
+ `marvis brain run`). It does not write your code; it watches the work and keeps
136
+ the memory honest. It runs in layers:
137
+
138
+ 1. **Substrate** — collects what changed since last time.
139
+ 2. **Digest & journal** — a short narrative of what happened, per project.
140
+ 3. **Drift** — compares what was produced against the stated intent and flags
141
+ where they diverge before it compounds.
142
+ 4. **Memory operations** — proposes consolidating duplicates, superseding stale
143
+ notes, hardening provenance. Proposals, not silent edits.
144
+ 5. **Findings** — conclusions worth your attention, queued for you to approve.
145
+
146
+ The free mode never uses an LLM key — it is local upkeep. The full mode adds an
147
+ LLM pass for narrative polish and citations when you have configured a key.
148
+
149
+ ## Lifecycle
150
+
151
+ Work moves through a fixed set of states so nothing is silently dropped:
152
+
153
+ ```
154
+ pending → approved → in_progress → review → completed
155
+ (or rejected / failed)
156
+ ```
157
+
158
+ - **pending** — created, not yet greenlit. A human approves it.
159
+ - **approved** — greenlit, ready to start.
160
+ - **in_progress** — being worked. Exactly one per worker at a time.
161
+ - **review** — a `code`/`system` task opens a pull request and waits for a human
162
+ to merge it. `completed` is reached by the merge, not set by hand.
163
+ - **completed** — done and verified.
164
+
165
+ For `work` projects there is no PR — the task completes when its document
166
+ exists. For quick diagnostics, a task can complete with no artifact at all.
167
+
168
+ ## Adopt
169
+
170
+ To bring an existing, messy folder into this shape, point your agent at this
171
+ guide and ask it to work **non-destructively** — map first, then propose:
172
+
173
+ 1. **Read** the folder and group files by the project they belong to.
174
+ 2. **Propose** a structure (the layout above), one project at a time, and wait
175
+ for your OK before moving anything. Nothing is deleted or overwritten without
176
+ confirmation.
177
+ 3. **Create** the missing `project.yaml` and a `context.md` from the templates,
178
+ and add frontmatter to the documents that lack it.
179
+ 4. **Index** — let Marvis read the resulting project folders. The Knowledge
180
+ Graph and search build themselves from there.
181
+
182
+ Marvis is the mold; your agent does the shaping. You stay in control of every
183
+ move.
@@ -41,6 +41,106 @@ def register(app: typer.Typer) -> None:
41
41
  )
42
42
 
43
43
 
44
+ # ---------------------------------------------------------------------------
45
+ # brain_enabled setter (issue #7) — a supported toggle instead of a direct
46
+ # console.db UPDATE (which the governance hooks block).
47
+ # ---------------------------------------------------------------------------
48
+
49
+
50
+ async def _read_brain_enabled() -> str:
51
+ """Current brain_enabled mode; defaults to 'shadow' like the runtime loader."""
52
+ from core.cli._runtime_ctx import with_db
53
+
54
+ async with with_db() as db:
55
+ cur = await db.execute(
56
+ "SELECT value FROM app_settings WHERE key = 'brain_enabled'"
57
+ )
58
+ row = await cur.fetchone()
59
+ return row[0] if row and row[0] else "shadow"
60
+
61
+
62
+ async def _write_brain_enabled(value: str) -> None:
63
+ """Set brain_enabled through the single writer (the supported path) and close
64
+ the pool we opened so the one-shot CLI exits immediately (no ~30s teardown)."""
65
+ from datetime import datetime, timezone
66
+
67
+ from core.cli._runtime_ctx import _apply_settings
68
+
69
+ _apply_settings()
70
+ from core.api import db as db_mod
71
+
72
+ own_pool = db_mod._writer is None
73
+ if own_pool:
74
+ await db_mod.init_pool()
75
+ try:
76
+ async with db_mod.acquire_write_db(label="marvis-brain-set") as db:
77
+ await db.execute(
78
+ "INSERT INTO app_settings (key, value, updated_at) VALUES (?, ?, ?) "
79
+ "ON CONFLICT(key) DO UPDATE SET value = excluded.value, "
80
+ "updated_at = excluded.updated_at",
81
+ ("brain_enabled", value, datetime.now(timezone.utc).isoformat()),
82
+ )
83
+ await db.commit()
84
+ finally:
85
+ if own_pool:
86
+ await db_mod.close_pool()
87
+
88
+
89
+ def _print_brain_mode(mode: str) -> None:
90
+ from core.cli._runtime_ctx import console
91
+
92
+ style = {"true": "green", "shadow": "cyan", "false": "yellow"}.get(mode, "white")
93
+ explain = {
94
+ "true": "on — reflection runs and writes",
95
+ "shadow": "shadow — reflection runs, proposals only (default)",
96
+ "false": "off — reflection disabled",
97
+ }.get(mode, mode)
98
+ console.print(f"[{style}]brain_enabled = {mode}[/{style}] ({explain})")
99
+
100
+
101
+ @brain_app.command("enable")
102
+ def enable_cmd(
103
+ shadow: bool = typer.Option(
104
+ False, "--shadow", help="Enable in shadow mode (proposals only) instead of full."
105
+ ),
106
+ json_out: bool = typer.Option(False, "--json", help="Emit pure JSON to stdout."),
107
+ ) -> None:
108
+ """Turn the Company Brain on — a supported setter, no direct DB write."""
109
+ mode = "shadow" if shadow else "true"
110
+ run_async(_write_brain_enabled(mode))
111
+ emit(
112
+ {"brain_enabled": mode},
113
+ json_out=json_out,
114
+ render=lambda r: _print_brain_mode(r["brain_enabled"]),
115
+ )
116
+
117
+
118
+ @brain_app.command("disable")
119
+ def disable_cmd(
120
+ json_out: bool = typer.Option(False, "--json", help="Emit pure JSON to stdout."),
121
+ ) -> None:
122
+ """Turn the Company Brain off."""
123
+ run_async(_write_brain_enabled("false"))
124
+ emit(
125
+ {"brain_enabled": "false"},
126
+ json_out=json_out,
127
+ render=lambda r: _print_brain_mode(r["brain_enabled"]),
128
+ )
129
+
130
+
131
+ @brain_app.command("status")
132
+ def brain_status_cmd(
133
+ json_out: bool = typer.Option(False, "--json", help="Emit pure JSON to stdout."),
134
+ ) -> None:
135
+ """Show whether the Company Brain is on, off, or in shadow mode."""
136
+ mode = run_async(_read_brain_enabled())
137
+ emit(
138
+ {"brain_enabled": mode},
139
+ json_out=json_out,
140
+ render=lambda r: _print_brain_mode(r["brain_enabled"]),
141
+ )
142
+
143
+
44
144
  @brain_app.command("run")
45
145
  def run_cmd(
46
146
  mode: str = typer.Option(
@@ -72,12 +172,23 @@ def run_cmd(
72
172
  async def _run() -> dict[str, Any]:
73
173
  from core.api import db as db_mod
74
174
 
75
- if db_mod._writer is None: # lazy one-shot writer init for the CLI process
175
+ # We own the pool only if we open it here. A server-hosted process that
176
+ # already initialized the pool keeps owning it — we must not tear it down.
177
+ own_pool = db_mod._writer is None
178
+ if own_pool: # lazy one-shot writer init for the CLI process
76
179
  await db_mod.init_pool()
77
180
 
78
181
  from core.api.services.brain.jobs import run_brain_cycle_once
79
182
 
80
- return await run_brain_cycle_once(reflection_mode=mode)
183
+ try:
184
+ return await run_brain_cycle_once(reflection_mode=mode)
185
+ finally:
186
+ # Close the connections we opened. Each aiosqlite connection runs on a
187
+ # NON-daemon thread that the interpreter joins at exit, so leaving the
188
+ # writer open hangs the one-shot CLI ~30s after run_async returns —
189
+ # the flagship-command "is it broken?" bug (issue #1).
190
+ if own_pool:
191
+ await db_mod.close_pool()
81
192
 
82
193
  payload = run_async(_run())
83
194
  emit(payload, json_out=json_out, render=_render)
@@ -389,7 +389,16 @@ def _check_resolved_paths() -> CheckResult:
389
389
  from core.api.config import settings
390
390
 
391
391
  db = Path(settings.db_path)
392
- projects = projects_root_default()
392
+ # The configured projects root — apply_marvis_settings() (run at the top of
393
+ # doctor) set core.api.routers.projects.PROJECT_DIRS from settings.yaml, the
394
+ # same source `project list` reads. Fall back to the platform default only
395
+ # when nothing is configured, so doctor reports the real root, not the default.
396
+ try:
397
+ from core.api.routers.projects import PROJECT_DIRS
398
+
399
+ projects = PROJECT_DIRS[0] if PROJECT_DIRS else projects_root_default()
400
+ except Exception: # noqa: BLE001 — never let a resolver hiccup break doctor
401
+ projects = projects_root_default()
393
402
  detail = f"db={db} | projects={projects}"
394
403
  if not db.is_absolute():
395
404
  return CheckResult(
@@ -846,6 +855,18 @@ def doctor_cmd(
846
855
  """
847
856
  checks: list[CheckResult] = []
848
857
 
858
+ # Resolve the user's settings.yaml into `settings` BEFORE any check reads a
859
+ # path, so resolved_paths reports the configured db / projects_root instead
860
+ # of the module defaults (the ~/Library/Application Support cosmetic bug).
861
+ # Best-effort: a missing/unreadable settings.yaml leaves the defaults, which
862
+ # is the correct state for a not-yet-initialized install.
863
+ try:
864
+ from core.api.runtime_settings import apply_marvis_settings
865
+
866
+ apply_marvis_settings()
867
+ except Exception: # noqa: BLE001 — doctor must never crash on settings load
868
+ pass
869
+
849
870
  checks.append(_check_os())
850
871
  checks.append(_check_python())
851
872
  checks.append(_check_install_manager())
@@ -923,3 +944,9 @@ def _render_human(checks: list[CheckResult]) -> None:
923
944
  console.print("[yellow]! WARNING: install is functional but has issues.[/yellow]")
924
945
  else:
925
946
  console.print("[green bold]✓ All checks passed.[/green bold]")
947
+
948
+ console.print()
949
+ console.print(
950
+ "[dim]Tip: `marvis guide` explains how Marvis organizes work — point "
951
+ "your agent at an existing folder to adopt it.[/dim]"
952
+ )
@@ -0,0 +1,112 @@
1
+ # v1.0.0 - 2026-06-04 - C1: `marvis guide` — the single callable "Marvis way" guide.
2
+ """``marvis guide`` — print the one reference for how Marvis works.
3
+
4
+ The guide is a packaged markdown data-file (``core/cli/guides/marvis-way.md``)
5
+ loaded at runtime via ``importlib.resources`` so it resolves identically from a
6
+ source checkout and from an installed wheel. It is the SAME content published on
7
+ the web (so an agent can read it before installing anything); this command is
8
+ the offline, already-installed surface.
9
+
10
+ Registered onto the SAME Typer ``app`` as ``marvis init`` via ``register(app)``,
11
+ exactly like ``marvis_doctor`` / ``marvis_telemetry``.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import sys
16
+ from typing import Any
17
+
18
+ import typer
19
+
20
+ _PANEL_GUIDE = "Guide"
21
+ _GUIDE_PACKAGE = "core.cli.guides"
22
+ _GUIDE_FILE = "marvis-way.md"
23
+
24
+
25
+ def _load_guide() -> str:
26
+ """Read the packaged guide markdown (works from checkout and from wheel)."""
27
+ import importlib.resources as ir
28
+
29
+ return ir.files(_GUIDE_PACKAGE).joinpath(_GUIDE_FILE).read_text(encoding="utf-8")
30
+
31
+
32
+ def _split_sections(text: str) -> dict[str, str]:
33
+ """Map each lowercased H2 title → its section markdown (title line included)."""
34
+ sections: dict[str, str] = {}
35
+ current_key: str | None = None
36
+ current: list[str] = []
37
+ for line in text.splitlines(keepends=True):
38
+ if line.startswith("## "):
39
+ if current_key is not None:
40
+ sections[current_key] = "".join(current)
41
+ current_key = line[3:].strip().lower()
42
+ current = [line]
43
+ elif current_key is not None:
44
+ current.append(line)
45
+ if current_key is not None:
46
+ sections[current_key] = "".join(current)
47
+ return sections
48
+
49
+
50
+ def guide_cmd(
51
+ section: str | None = typer.Option(
52
+ None,
53
+ "--section",
54
+ "-s",
55
+ help="Print only one section (e.g. frontmatter, lifecycle, adopt).",
56
+ ),
57
+ list_sections: bool = typer.Option(
58
+ False, "--list", help="List the section names and exit."
59
+ ),
60
+ json_out: bool = typer.Option(
61
+ False, "--json", help="Emit the guide as JSON to stdout."
62
+ ),
63
+ no_pager: bool = typer.Option(
64
+ False, "--no-pager", help="Print straight to stdout, never page."
65
+ ),
66
+ ) -> None:
67
+ """Print the Marvis way: how projects, tasks, the graph and the brain fit together."""
68
+ import click
69
+
70
+ text = _load_guide()
71
+ sections = _split_sections(text)
72
+
73
+ if list_sections:
74
+ for name in sections:
75
+ click.echo(name)
76
+ return
77
+
78
+ if section:
79
+ key = section.strip().lower()
80
+ if key not in sections:
81
+ from core.cli._runtime_ctx import err_console
82
+
83
+ err_console.print(
84
+ f"[red]No section '{section}'. Available: {', '.join(sections)}[/red]"
85
+ )
86
+ raise typer.Exit(2)
87
+ text = sections[key]
88
+
89
+ if json_out:
90
+ import json
91
+
92
+ if section:
93
+ payload: dict[str, Any] = {
94
+ "section": section.strip().lower(),
95
+ "markdown": text,
96
+ }
97
+ else:
98
+ payload = {"guide": text, "sections": list(sections)}
99
+ click.echo(json.dumps(payload))
100
+ return
101
+
102
+ # Page for a human TTY; plain stdout when piped or asked. echo_via_pager
103
+ # silently skips the pager when stdin isn't a TTY, so gate on stdout instead.
104
+ if sys.stdout.isatty() and not no_pager:
105
+ click.echo_via_pager(text)
106
+ else:
107
+ click.echo(text)
108
+
109
+
110
+ def register(app: typer.Typer) -> None:
111
+ """Attach ``guide`` onto an existing Typer app."""
112
+ app.command("guide", rich_help_panel=_PANEL_GUIDE)(guide_cmd)