marvisx-cli 0.3.5__tar.gz → 0.3.7b1__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.5 → marvisx_cli-0.3.7b1}/LICENSE +12 -13
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/MANIFEST.in +1 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/PKG-INFO +2 -1
- marvisx_cli-0.3.7b1/README.md +124 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/config.py +21 -8
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/db.py +11 -7
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/learnings.py +53 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/tasks.py +1 -2
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/jobs.py +14 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/_brain_opportunistic.py +2 -4
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/_brain_schedule.py +67 -9
- marvisx_cli-0.3.7b1/core/cli/_update_check.py +164 -0
- marvisx_cli-0.3.7b1/core/cli/guides/__init__.py +6 -0
- marvisx_cli-0.3.7b1/core/cli/guides/marvis-way.md +177 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_brain.py +113 -2
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_doctor.py +91 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_feedback.py +4 -5
- marvisx_cli-0.3.7b1/core/cli/marvis_guide.py +112 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_init.py +106 -49
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_runtime.py +32 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_telemetry.py +3 -8
- marvisx_cli-0.3.7b1/core/platform/__init__.py +177 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/client.py +36 -22
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/byok_vault.py +5 -8
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/defaults.py +7 -14
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/marvisx_cli.egg-info/PKG-INFO +2 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/marvisx_cli.egg-info/SOURCES.txt +15 -1
- marvisx_cli-0.3.7b1/marvisx_cli.egg-info/entry_points.txt +3 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/marvisx_cli.egg-info/requires.txt +1 -0
- marvisx_cli-0.3.7b1/migrations/146_drop_kg_backup_tables.sql +37 -0
- marvisx_cli-0.3.7b1/migrations/146_drop_kg_backup_tables_down.sql +9 -0
- marvisx_cli-0.3.7b1/projects/_template/context.md +28 -0
- marvisx_cli-0.3.7b1/projects/_template/docs/brainstorms/YYYY-MM-DD-example-brainstorm.md +19 -0
- marvisx_cli-0.3.7b1/projects/_template/docs/plans/YYYY-MM-DD-example-plan.md +23 -0
- marvisx_cli-0.3.7b1/projects/_template/docs/solutions/YYYY-MM-DD-example-solution.md +21 -0
- marvisx_cli-0.3.7b1/projects/_template/input/README.md +6 -0
- marvisx_cli-0.3.7b1/projects/_template/memory/handoff.md +27 -0
- marvisx_cli-0.3.7b1/projects/_template/output/README.md +7 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/projects/_template/project.yaml +2 -2
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/pyproject.toml +10 -4
- marvisx_cli-0.3.5/README.md +0 -95
- marvisx_cli-0.3.5/marvisx_cli.egg-info/entry_points.txt +0 -3
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/agents/session_manager.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/main.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/_adapter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/server.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/safety.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/mcp/tools/workflows.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/common.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/graph_ux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/monitoring.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/models/users.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/rbac.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/runtime_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/security.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/_fts.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/findings_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/direction_alignment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/factory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/memory_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/recap.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/sources/pir_tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/warehouse_consolidate.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/embedding_backends/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/embedding_internal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/embedding_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/events.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/git_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/graph_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_tldr.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/embedding_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/insert_saga.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/classification_context.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/llm/openai_nano.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/ingest/watcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/hybrid_search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/metrics_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/model_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/tmux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/webhook_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/terminal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_config_env_aliases.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_git_ops_merge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/use_cases/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/api/visibility.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/README.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_governance.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/cli/marvis_mcp.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/_drift_check.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_artifacts.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_cross_project.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_project_nodes.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/scripts/safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/schema.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/state.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/078_kg_fts5.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/095_kg_intent_first.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/migrations/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.7b1}/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,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: marvisx-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.7b1
|
|
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
|
|
@@ -31,6 +31,7 @@ Requires-Dist: click>=8
|
|
|
31
31
|
Requires-Dist: pydantic>=2.5
|
|
32
32
|
Requires-Dist: pydantic-settings>=2.7.0
|
|
33
33
|
Requires-Dist: PyYAML>=6
|
|
34
|
+
Requires-Dist: platformdirs>=4.0
|
|
34
35
|
Requires-Dist: cryptography>=42
|
|
35
36
|
Requires-Dist: fastapi>=0.115.0
|
|
36
37
|
Requires-Dist: slowapi>=0.1.9
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Marvis
|
|
2
|
+
|
|
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.
|
|
6
|
+
|
|
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.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
Marvis runs as a CLI your agent drives. Install it, then let the agent you already use take it from there:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv tool install marvisx-cli
|
|
15
|
+
marvis init
|
|
16
|
+
```
|
|
17
|
+
|
|
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`.
|
|
19
|
+
|
|
20
|
+
To run the full Console + API stack yourself, see [Self-hosting the full stack](#self-hosting-the-full-stack).
|
|
21
|
+
|
|
22
|
+
## What it does, in plain terms
|
|
23
|
+
|
|
24
|
+
- **Your agents stop forgetting.** Decisions, specs, playbooks, learnings and mistakes are captured as a side effect of the work your agents already do, not retyped by hand.
|
|
25
|
+
- **Your work stays on track.** A reflective Brain layer compares what agents produce against your intent and surfaces drift early, before it compounds across sessions.
|
|
26
|
+
- **One brain, many projects and teams.** A cross-project Knowledge Graph links decisions, code and documents, so an agent working in one project can see what was decided in another.
|
|
27
|
+
- **Governed by default.** Constitution rules enforced at the hook level, plus a foreign-key-immutable audit log: every action traces back to the human who approved it.
|
|
28
|
+
- **It lives in your terminal, not a dashboard.** An agent-native MCP surface keeps your existing Claude Code / Codex / Cursor as the place you work.
|
|
29
|
+
|
|
30
|
+
## Under the hood
|
|
31
|
+
|
|
32
|
+
- **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}`.
|
|
33
|
+
- **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.
|
|
34
|
+
- **Brain reflection pipeline** in five layers — substrate, digest and journal, drift checker, memory operations, findings — closed by a Direction-Aware loop.
|
|
35
|
+
- **Constitution-enforced safety rules** enforced by deterministic hook gates and an MCP mirror for providers without native hooks.
|
|
36
|
+
- **Agent-native MCP surface** exposing 91 tools, callable identically from Claude Code, Codex, Gemini, OpenCode, and a web console.
|
|
37
|
+
|
|
38
|
+
## Search and embedding quality
|
|
39
|
+
|
|
40
|
+
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`.
|
|
41
|
+
|
|
42
|
+
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.
|
|
43
|
+
|
|
44
|
+
## License posture
|
|
45
|
+
|
|
46
|
+
- **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.
|
|
47
|
+
- Documentation and architectural patterns: **CC-BY 4.0**.
|
|
48
|
+
|
|
49
|
+
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).
|
|
50
|
+
|
|
51
|
+
## Architecture map
|
|
52
|
+
|
|
53
|
+
The system groups capabilities into eight functional domains (`M1 Capture`, `M2 Index`, `M3 Retrieve`, `M4 Reflect`, `M5 Act`, `M6 Agent-native I/O`, `M7 Compliance`, `M8 Productization`). The Knowledge Graph stitches them together with canonical IDs and an audit chain.
|
|
54
|
+
|
|
55
|
+
The full architectural description is the MarvisX preprint on Zenodo: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
|
|
56
|
+
|
|
57
|
+
## Repository layout
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
core/
|
|
61
|
+
├── api/ # FastAPI service: KG, ingest, brain, MCP transport
|
|
62
|
+
├── console/ # Next.js web console
|
|
63
|
+
├── kb/ # Project-local knowledge base templates
|
|
64
|
+
├── mcp-pir/ # MCP server (stdio) exposing the 91-tool surface
|
|
65
|
+
└── scripts/ # Deployment, migration, and operational scripts
|
|
66
|
+
|
|
67
|
+
deploy/
|
|
68
|
+
└── _template/ # Reference deployment template
|
|
69
|
+
# (Docker Compose + environment scaffolding)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Self-hosting the full stack
|
|
73
|
+
|
|
74
|
+
The CLI above runs Marvis against a local SQLite database. To run the full Console + API stack yourself, use the reference Docker Compose deployment. Clone the repository, copy `deploy/_template/.env.example` to `.env`, populate the required secrets, and bring the stack up:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
cp deploy/_template/.env.example deploy/_template/.env
|
|
78
|
+
cd deploy/_template/
|
|
79
|
+
docker compose up -d
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The Console becomes available on the configured `CONSOLE_PORT` and the API on the configured `API_PORT`. Detailed first-run instructions are inside the deployment template.
|
|
83
|
+
|
|
84
|
+
## MCP surface
|
|
85
|
+
|
|
86
|
+
Marvis ships an MCP server exposing 91 tools across 11 categories: project and session context, tasks, handoffs, semantic search, learnings, costs, pull requests, knowledge graph queries, ingest triage, brain reflection layer, and audit-and-monitoring controls.
|
|
87
|
+
|
|
88
|
+
The same surface is used by autonomous agents and by humans through the web console. The intent is parity: any action a user can take through the console, an agent can also take through MCP, and the reverse.
|
|
89
|
+
|
|
90
|
+
## Single-user local runtime (`MARVIS_OSS_LOCAL`)
|
|
91
|
+
|
|
92
|
+
The MCP server runs in-process: it calls the same use_cases the HTTP API calls, against the local SQLite database, with no uvicorn and no Node bridge. In this single-user mode there is no HTTP API in front of the database, so the HTTP audit chokepoint (which in the managed deployment forces every mutation through the API) does not exist.
|
|
93
|
+
|
|
94
|
+
Audit is still recorded: the extracted use_cases write the audit log themselves (`core/api/use_cases/{tasks,pull_requests,audit}.py`), so a mutation issued through MCP still produces an audit row at the use_case level. What is lost is only the additional HTTP-surface chokepoint.
|
|
95
|
+
|
|
96
|
+
Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db-direct-write` safety rule **advisory** — direct writes to a Marvis SQLite database are allowed with a warning instead of being blocked. When the variable is unset or falsey the rule is unchanged: direct DB writes are blocked fail-closed, exactly as in the managed deployment. This trade-off is intentional for single-user self-hosting and never weakens the default.
|
|
97
|
+
|
|
98
|
+
**No-fork guarantee.** The HTTP API and the MCP server are not two implementations: both are thin adapters over the same `core/api/use_cases`, differing only in how they fill the per-call `CallerContext`. The proof is the API test suite staying green after the extraction — the same behaviour, exercised through the HTTP surface, over the identical use_cases the MCP server calls.
|
|
99
|
+
|
|
100
|
+
## Telemetry
|
|
101
|
+
|
|
102
|
+
Marvis sends anonymous, opt-out usage telemetry to help improve it: coarse event counts plus version and OS buckets, tied to a random install id (a plain UUID, never derived from your machine, user, or email). It never sends file content, project data, or personal information.
|
|
103
|
+
|
|
104
|
+
Turn it off at any time:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
marvis telemetry off
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Or per environment: `MARVIS_TELEMETRY=0`, the universal `DO_NOT_TRACK=1`, or `telemetry: false` in `~/.marvis/settings.yaml`. With `MARVIS_TELEMETRY=log`, Marvis prints exactly what it would send to stderr and transmits nothing.
|
|
111
|
+
|
|
112
|
+
## Documentation
|
|
113
|
+
|
|
114
|
+
- [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
|
|
115
|
+
|
|
116
|
+
## Contributing
|
|
117
|
+
|
|
118
|
+
Issues and bug reports are welcome through the repository tracker.
|
|
119
|
+
|
|
120
|
+
## References
|
|
121
|
+
|
|
122
|
+
- Preprint (Zenodo): [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860)
|
|
123
|
+
- License (code): Business Source License 1.1, change date converts to Apache License 2.0 four years after release
|
|
124
|
+
- License (documentation): CC-BY 4.0
|
|
@@ -8,6 +8,8 @@ from typing import Literal
|
|
|
8
8
|
from pydantic import AliasChoices, Field, SecretStr
|
|
9
9
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
10
|
|
|
11
|
+
from core.platform import current_user, db_default_path
|
|
12
|
+
|
|
11
13
|
# Prod (Hetzner/Docker) ships the vec0 loadable at this path; it stays the
|
|
12
14
|
# final fallback so prod keeps working unchanged.
|
|
13
15
|
_VEC0_PATH_PROD_DEFAULT = "/data/pir/lib/vec0"
|
|
@@ -70,9 +72,22 @@ class Settings(BaseSettings):
|
|
|
70
72
|
),
|
|
71
73
|
)
|
|
72
74
|
db_path: str = Field(
|
|
73
|
-
|
|
75
|
+
# Fallback when no MARVIS_DB_PATH/PIR_DB_PATH/DB_PATH env is set: the
|
|
76
|
+
# platformdirs data root (was a CWD-relative "console.db" that opened a
|
|
77
|
+
# different DB per launch directory — split-brain, and on Windows a
|
|
78
|
+
# nonsense root). The env aliases still win via pydantic; this factory
|
|
79
|
+
# runs ONLY when none are set.
|
|
80
|
+
default_factory=lambda: str(db_default_path()),
|
|
74
81
|
validation_alias=AliasChoices("MARVIS_DB_PATH", "PIR_DB_PATH", "DB_PATH"),
|
|
75
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
|
+
)
|
|
76
91
|
cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
|
|
77
92
|
cors_origins_prod: list[str] = Field(
|
|
78
93
|
default_factory=list,
|
|
@@ -544,16 +559,14 @@ class Settings(BaseSettings):
|
|
|
544
559
|
|
|
545
560
|
Returns '' when GIT_RUNAS_USER is unset or already matches the current
|
|
546
561
|
OS user (no privilege hop needed)."""
|
|
547
|
-
import pwd
|
|
548
|
-
|
|
549
562
|
user = (self.git_runas_user or "").strip()
|
|
550
563
|
if not user:
|
|
551
564
|
return ""
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
565
|
+
# current_user() is pwd.getpwuid(os.getuid()).pw_name on POSIX (identical
|
|
566
|
+
# to the previous inline lookup) and getpass-based on Windows; the bare
|
|
567
|
+
# `import pwd` here crashed `marvis project list` on Windows.
|
|
568
|
+
if current_user() == user:
|
|
569
|
+
return ""
|
|
557
570
|
return user
|
|
558
571
|
|
|
559
572
|
|
|
@@ -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]:
|
|
@@ -109,6 +109,59 @@ def register(mcp) -> None:
|
|
|
109
109
|
except ServiceError as e:
|
|
110
110
|
raise_mcp_error(e)
|
|
111
111
|
|
|
112
|
+
@mcp.tool()
|
|
113
|
+
async def update_learning(
|
|
114
|
+
learning_id: Annotated[str, Field(min_length=1)],
|
|
115
|
+
title: Annotated[str, Field(min_length=1, max_length=200)] | None = None,
|
|
116
|
+
category: LearningCategory | None = None,
|
|
117
|
+
description: Annotated[str, Field(min_length=1)] | None = None,
|
|
118
|
+
prevention: Annotated[str, Field(min_length=1)] | None = None,
|
|
119
|
+
severity: LearningSeverity | None = None,
|
|
120
|
+
module: str | None = None,
|
|
121
|
+
tags: list[str] | None = None,
|
|
122
|
+
project: str | None = None,
|
|
123
|
+
) -> dict[str, Any]:
|
|
124
|
+
"""Update an existing learning (operator+), then re-embed it so search/check_learnings see the new content immediately.
|
|
125
|
+
|
|
126
|
+
QUANDO USARLO: il contenuto di un learning e' obsoleto/incompleto (prevention piu' precisa, severity ricalibrata, nuovo modulo) ma vuoi PRESERVARE la history. BOUNDARY: update_learning aggiorna in-place + re-embed; delete_learning cancella permanente; create_learning scrive nuovo.
|
|
127
|
+
QUANDO NON USARLO: NOT per un learning nuovo -> usa create_learning. NOT per azzerare un campo a null: la superficie MCP NON puo' settare null (omettere un campo lo lascia invariato) -> usa l'HTTP PATCH se devi pulire un campo.
|
|
128
|
+
RESTITUISCE: il learning aggiornato {id, title, category, severity, prevention, tags, module, project, updated_at} — gia' ri-embeddato (retrievable by meaning, non solo keyword)."""
|
|
129
|
+
fields = {
|
|
130
|
+
k: v
|
|
131
|
+
for k, v in {
|
|
132
|
+
"title": title,
|
|
133
|
+
"category": category,
|
|
134
|
+
"description": description,
|
|
135
|
+
"prevention": prevention,
|
|
136
|
+
"severity": severity,
|
|
137
|
+
"module": module,
|
|
138
|
+
"tags": tags,
|
|
139
|
+
"project": project,
|
|
140
|
+
}.items()
|
|
141
|
+
if v is not None
|
|
142
|
+
}
|
|
143
|
+
try:
|
|
144
|
+
async with acquire_write_db(label="mcp.update_learning") as db:
|
|
145
|
+
result = await learnings_uc.update_learning(
|
|
146
|
+
LOCAL_CTX, db, learning_id=learning_id, fields=fields
|
|
147
|
+
)
|
|
148
|
+
# Writer lock released: re-embed-on-write (mirror create_learning) so the
|
|
149
|
+
# updated content is retrievable by meaning immediately, not stale until
|
|
150
|
+
# a manual reindex.
|
|
151
|
+
await mcp_embed_learning(
|
|
152
|
+
learning_id=result.id,
|
|
153
|
+
title=result.title,
|
|
154
|
+
description=result.description,
|
|
155
|
+
category=result.category,
|
|
156
|
+
severity=result.severity,
|
|
157
|
+
prevention=result.prevention,
|
|
158
|
+
project=result.project,
|
|
159
|
+
workspace_id=LOCAL_CTX.workspace_id,
|
|
160
|
+
)
|
|
161
|
+
return dump(result)
|
|
162
|
+
except ServiceError as e:
|
|
163
|
+
raise_mcp_error(e)
|
|
164
|
+
|
|
112
165
|
@mcp.tool()
|
|
113
166
|
async def list_learnings(
|
|
114
167
|
project: str | None = None,
|
|
@@ -18,7 +18,6 @@ VALID_STATUSES = {
|
|
|
18
18
|
VALID_PRIORITIES = {"high", "medium", "low"}
|
|
19
19
|
VALID_KINDS = {"normal", "idea"}
|
|
20
20
|
VALID_SOURCES = {
|
|
21
|
-
"reflectx_proposal",
|
|
22
21
|
"telegram",
|
|
23
22
|
"manual",
|
|
24
23
|
"session",
|
|
@@ -51,7 +50,7 @@ class TaskCreateRequest(BaseModel):
|
|
|
51
50
|
priority: str = Field("medium", pattern=r"^(high|medium|low)$")
|
|
52
51
|
source: str = Field(
|
|
53
52
|
...,
|
|
54
|
-
pattern=r"^(
|
|
53
|
+
pattern=r"^(telegram|manual|session|console|rem_proposal)$",
|
|
55
54
|
)
|
|
56
55
|
source_ref: str | None = Field(None, max_length=500)
|
|
57
56
|
owner_id: str | None = Field(
|
|
@@ -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
|
|
@@ -29,6 +29,7 @@ import shutil
|
|
|
29
29
|
import sys
|
|
30
30
|
from typing import Any
|
|
31
31
|
|
|
32
|
+
from core.platform import secure_path
|
|
32
33
|
from core.telemetry import client as _tc # canonical ~/.marvis + settings.yaml reader
|
|
33
34
|
|
|
34
35
|
_RUN_INTERVAL_S = 24 * 3600
|
|
@@ -71,10 +72,7 @@ def _mark_ran(now: float) -> None:
|
|
|
71
72
|
path = _last_run_path()
|
|
72
73
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
73
74
|
path.write_text(f"{now:.0f}\n", encoding="utf-8")
|
|
74
|
-
|
|
75
|
-
os.chmod(path, 0o600)
|
|
76
|
-
except OSError:
|
|
77
|
-
pass
|
|
75
|
+
secure_path(path, mode=0o600)
|
|
78
76
|
except Exception: # noqa: BLE001
|
|
79
77
|
pass
|
|
80
78
|
|
|
@@ -35,10 +35,13 @@ import sys
|
|
|
35
35
|
from pathlib import Path
|
|
36
36
|
from typing import Any
|
|
37
37
|
|
|
38
|
+
from core.platform import current_uid
|
|
39
|
+
|
|
38
40
|
# launchd Label / systemd unit base / cron marker — one identity across backends.
|
|
39
41
|
_LABEL = "com.marvisx.brain"
|
|
40
42
|
_UNIT = "marvis-brain"
|
|
41
43
|
_CRON_MARKER = "# marvis-brain"
|
|
44
|
+
_SCHTASKS_TN = "MarvisX Brain" # Windows Task Scheduler task name
|
|
42
45
|
|
|
43
46
|
# Default daily fire time (local), off-peak.
|
|
44
47
|
_HOUR = 3
|
|
@@ -75,11 +78,11 @@ def _run(cmd: list[str], *, input_text: str | None = None) -> tuple[int, str, st
|
|
|
75
78
|
|
|
76
79
|
|
|
77
80
|
def detect_backend() -> str:
|
|
78
|
-
"""Return ``launchd`` | ``systemd`` | ``cron`` | ``unsupported``."""
|
|
81
|
+
"""Return ``launchd`` | ``systemd`` | ``cron`` | ``schtasks`` | ``unsupported``."""
|
|
79
82
|
if sys.platform == "darwin":
|
|
80
83
|
return "launchd"
|
|
81
84
|
if sys.platform.startswith("win"):
|
|
82
|
-
return "
|
|
85
|
+
return "schtasks"
|
|
83
86
|
if shutil.which("systemctl"):
|
|
84
87
|
return "systemd"
|
|
85
88
|
if shutil.which("crontab"):
|
|
@@ -93,7 +96,7 @@ def _marvis_path() -> str | None:
|
|
|
93
96
|
if exe:
|
|
94
97
|
return exe
|
|
95
98
|
argv0 = sys.argv[0] if sys.argv else ""
|
|
96
|
-
if argv0.endswith(("marvis", "marvis-init")) and os.path.isfile(argv0):
|
|
99
|
+
if argv0.endswith(("marvis", "marvis.exe", "marvis-init", "marvis-init.exe")) and os.path.isfile(argv0):
|
|
97
100
|
return os.path.abspath(argv0)
|
|
98
101
|
return None
|
|
99
102
|
|
|
@@ -189,7 +192,7 @@ def _launchd_enable() -> dict[str, Any]:
|
|
|
189
192
|
plist = _launchd_plist_path()
|
|
190
193
|
plist.parent.mkdir(parents=True, exist_ok=True)
|
|
191
194
|
plist.write_text(plist_text(marvis), encoding="utf-8")
|
|
192
|
-
domain = f"gui/{
|
|
195
|
+
domain = f"gui/{current_uid()}"
|
|
193
196
|
# Idempotent: bootout an existing instance first (ignore failure), then bootstrap.
|
|
194
197
|
_run(["launchctl", "bootout", f"{domain}/{_LABEL}"])
|
|
195
198
|
rc, _out, err = _run(["launchctl", "bootstrap", domain, str(plist)])
|
|
@@ -203,7 +206,7 @@ def _launchd_enable() -> dict[str, Any]:
|
|
|
203
206
|
|
|
204
207
|
def _launchd_disable() -> dict[str, Any]:
|
|
205
208
|
plist = _launchd_plist_path()
|
|
206
|
-
rc, _out, err = _run(["launchctl", "bootout", f"gui/{
|
|
209
|
+
rc, _out, err = _run(["launchctl", "bootout", f"gui/{current_uid()}/{_LABEL}"])
|
|
207
210
|
removed = False
|
|
208
211
|
if plist.is_file():
|
|
209
212
|
plist.unlink()
|
|
@@ -214,7 +217,7 @@ def _launchd_disable() -> dict[str, Any]:
|
|
|
214
217
|
|
|
215
218
|
def _launchd_status() -> dict[str, Any]:
|
|
216
219
|
plist = _launchd_plist_path()
|
|
217
|
-
rc, _out, _err = _run(["launchctl", "print", f"gui/{
|
|
220
|
+
rc, _out, _err = _run(["launchctl", "print", f"gui/{current_uid()}/{_LABEL}"])
|
|
218
221
|
return {
|
|
219
222
|
"backend": "launchd",
|
|
220
223
|
"enabled": rc == 0,
|
|
@@ -335,13 +338,68 @@ def _cron_status() -> dict[str, Any]:
|
|
|
335
338
|
return {"backend": "cron", "enabled": present}
|
|
336
339
|
|
|
337
340
|
|
|
341
|
+
# ---------------------------------------------------------------------------
|
|
342
|
+
# schtasks backend (Windows Task Scheduler)
|
|
343
|
+
# ---------------------------------------------------------------------------
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def schtasks_argv_create(
|
|
347
|
+
marvis_path: str, *, hour: int = _HOUR, minute: int = _MINUTE, tn: str = _SCHTASKS_TN
|
|
348
|
+
) -> list[str]:
|
|
349
|
+
"""Build the ``schtasks /create`` argv (PURE — unit-tested).
|
|
350
|
+
|
|
351
|
+
``/tr`` is ONE argv element; the program path keeps its OWN inner quotes so a
|
|
352
|
+
space in ``%USERPROFILE%`` (e.g. ``C:\\Users\\Marsida Curaj\\...``) survives Task
|
|
353
|
+
Scheduler parsing. ``_run`` passes a list (no shell), so subprocess does the
|
|
354
|
+
OUTER quoting via ``list2cmdline``; this builder owns only the inner ``/tr``.
|
|
355
|
+
``/f`` force-overwrites = idempotent; no ``/ru`` = current user, no admin.
|
|
356
|
+
"""
|
|
357
|
+
tr = f'"{marvis_path}" brain run --mode full'
|
|
358
|
+
return [
|
|
359
|
+
"schtasks", "/create", "/tn", tn, "/tr", tr,
|
|
360
|
+
"/sc", "DAILY", "/st", f"{hour:02d}:{minute:02d}", "/f",
|
|
361
|
+
]
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def _schtasks_enable() -> dict[str, Any]:
|
|
365
|
+
marvis = _marvis_path()
|
|
366
|
+
if not marvis:
|
|
367
|
+
return {"backend": "schtasks", "ok": False, "error": "marvis not found on PATH"}
|
|
368
|
+
rc, _out, err = _run(schtasks_argv_create(marvis))
|
|
369
|
+
# schtasks can refuse on a password-protected / Microsoft-account user without
|
|
370
|
+
# stored creds; never crash — the opportunistic on-invocation upkeep is the net.
|
|
371
|
+
return {
|
|
372
|
+
"backend": "schtasks",
|
|
373
|
+
"ok": rc == 0,
|
|
374
|
+
"task_name": _SCHTASKS_TN,
|
|
375
|
+
"error": err.strip() if rc != 0 else None,
|
|
376
|
+
"warning": (
|
|
377
|
+
None
|
|
378
|
+
if rc == 0
|
|
379
|
+
else "could not register the Windows scheduled task; the opportunistic "
|
|
380
|
+
"on-invocation upkeep still runs whenever you use marvis"
|
|
381
|
+
),
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
def _schtasks_disable() -> dict[str, Any]:
|
|
386
|
+
# rc!=0 when the task does not exist — still a successful disable.
|
|
387
|
+
rc, _out, _err = _run(["schtasks", "/delete", "/tn", _SCHTASKS_TN, "/f"])
|
|
388
|
+
return {"backend": "schtasks", "ok": True, "deleted_rc": rc}
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def _schtasks_status() -> dict[str, Any]:
|
|
392
|
+
rc, _out, _err = _run(["schtasks", "/query", "/tn", _SCHTASKS_TN])
|
|
393
|
+
return {"backend": "schtasks", "enabled": rc == 0}
|
|
394
|
+
|
|
395
|
+
|
|
338
396
|
# ---------------------------------------------------------------------------
|
|
339
397
|
# Public dispatch
|
|
340
398
|
# ---------------------------------------------------------------------------
|
|
341
399
|
|
|
342
|
-
_ENABLE = {"launchd": _launchd_enable, "systemd": _systemd_enable, "cron": _cron_enable}
|
|
343
|
-
_DISABLE = {"launchd": _launchd_disable, "systemd": _systemd_disable, "cron": _cron_disable}
|
|
344
|
-
_STATUS = {"launchd": _launchd_status, "systemd": _systemd_status, "cron": _cron_status}
|
|
400
|
+
_ENABLE = {"launchd": _launchd_enable, "systemd": _systemd_enable, "cron": _cron_enable, "schtasks": _schtasks_enable}
|
|
401
|
+
_DISABLE = {"launchd": _launchd_disable, "systemd": _systemd_disable, "cron": _cron_disable, "schtasks": _schtasks_disable}
|
|
402
|
+
_STATUS = {"launchd": _launchd_status, "systemd": _systemd_status, "cron": _cron_status, "schtasks": _schtasks_status}
|
|
345
403
|
|
|
346
404
|
|
|
347
405
|
def enable(cadence: str = "daily") -> dict[str, Any]:
|