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.
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/LICENSE +12 -13
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/MANIFEST.in +1 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/PKG-INFO +1 -1
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/README.md +9 -5
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/config.py +8 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/db.py +11 -7
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/jobs.py +14 -1
- marvisx_cli-0.3.7/core/cli/guides/__init__.py +6 -0
- marvisx_cli-0.3.7/core/cli/guides/marvis-way.md +183 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_brain.py +113 -2
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_doctor.py +28 -1
- marvisx_cli-0.3.7/core/cli/marvis_guide.py +112 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_init.py +77 -40
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_runtime.py +49 -6
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/client.py +36 -22
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/PKG-INFO +1 -1
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/SOURCES.txt +13 -1
- marvisx_cli-0.3.7/migrations/146_drop_kg_backup_tables.sql +37 -0
- marvisx_cli-0.3.7/migrations/146_drop_kg_backup_tables_down.sql +9 -0
- marvisx_cli-0.3.7/projects/_template/context.md +28 -0
- marvisx_cli-0.3.7/projects/_template/docs/brainstorms/YYYY-MM-DD-example-brainstorm.md +19 -0
- marvisx_cli-0.3.7/projects/_template/docs/plans/YYYY-MM-DD-example-plan.md +23 -0
- marvisx_cli-0.3.7/projects/_template/docs/solutions/YYYY-MM-DD-example-solution.md +21 -0
- marvisx_cli-0.3.7/projects/_template/input/README.md +6 -0
- marvisx_cli-0.3.7/projects/_template/memory/handoff.md +27 -0
- marvisx_cli-0.3.7/projects/_template/output/README.md +7 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/projects/_template/project.yaml +2 -2
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/pyproject.toml +6 -2
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/agents/session_manager.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/main.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/_adapter.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/server.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/brain.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/graph.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/learnings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/projects.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/pull_requests.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/safety.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/tasks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/mcp/tools/workflows.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/common.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/graph_ux.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/monitoring.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/tasks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/models/users.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/paths.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/rbac.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/brain.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/graph.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/kg.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/learnings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/projects.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/sessions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/runtime_settings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/security.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/_fts.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/findings_reader.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/direction_alignment.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/factory.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/memory_ops.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/recap.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/sources/pir_tasks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/warehouse_consolidate.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_backends/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_internal.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/embedding_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/events.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/git_ops.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/graph_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_tldr.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/embedding_router.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/insert_saga.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/classification_context.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/llm/openai_nano.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/ingest/watcher.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/hybrid_search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/pr_impact.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/metrics_collector.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/model_router.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/tmux.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/webhook_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/terminal.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_config_env_aliases.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_git_ops_merge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/brain.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/graph.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/handoffs.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/learnings.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/projects.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/search.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/use_cases/tasks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/api/visibility.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/README.md +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_brain_opportunistic.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_brain_schedule.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/_update_check.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_feedback.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_governance.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_mcp.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/cli/marvis_telemetry.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/platform/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_drift_check.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/safety_bridge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_artifacts.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_cross_project.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_project_nodes.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/scripts/safety_bridge.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/schema.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/byok_vault.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/defaults.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/state.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/entry_points.txt +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/requires.txt +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/078_kg_fts5.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/095_kg_intent_first.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.3.6 → marvisx_cli-0.3.7}/migrations/__init__.py +0 -0
- {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
|
|
9
|
-
for
|
|
10
|
-
self-hosting
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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,8 @@
|
|
|
1
1
|
# Marvis
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://pypi.org/project/marvisx-cli/) [](LICENSE) [-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
|
-
- **
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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)
|