marvisx-cli 0.3.5__tar.gz → 0.3.6__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.6}/PKG-INFO +2 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/README.md +45 -18
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/config.py +13 -8
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/learnings.py +53 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/tasks.py +1 -2
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_brain_opportunistic.py +2 -4
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_brain_schedule.py +67 -9
- marvisx_cli-0.3.6/core/cli/_update_check.py +164 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_doctor.py +73 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_feedback.py +4 -5
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_init.py +29 -9
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_telemetry.py +3 -8
- marvisx_cli-0.3.6/core/platform/__init__.py +177 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/byok_vault.py +5 -8
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/defaults.py +7 -14
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/PKG-INFO +2 -1
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/SOURCES.txt +2 -0
- marvisx_cli-0.3.6/marvisx_cli.egg-info/entry_points.txt +3 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/requires.txt +1 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/pyproject.toml +5 -3
- marvisx_cli-0.3.5/marvisx_cli.egg-info/entry_points.txt +0 -3
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/LICENSE +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/MANIFEST.in +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/session_health.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/agents/session_manager.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/bin/marvisx-state-hook.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/db.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/dependencies/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/dependencies/tenant.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/main.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/_adapter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/server.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/ingest.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/safety.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/brainstorm.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/compound.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflow_playbooks/plan.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/mcp/tools/workflows.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/middleware/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/middleware/tool_call_audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/common.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_cosmo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/graph_ux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/ingest_keys.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/llm_config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/monitoring.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/teams.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/models/users.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/observability/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/observability/tracing.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/rate_limit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/rbac.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/_adapter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/admin_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/admin_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/agent.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/agent_tokens.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/app_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/bench.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/brain_directions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ci_checks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/comments.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/docs_coverage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/docs_governance.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/documents.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/files.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/finder.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ingest_api_keys.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/ingest_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/judge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/llm_config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/monitoring.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/notifications.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/push.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/raci.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/share_repo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/status_updates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/tags.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/teams.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/terminal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/users.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/routers/webhooks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/runtime_settings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/security.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/_fts.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/auto_approval.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/baseline.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/capabilities.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cascade_rollup.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/compound_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cycle.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/cycle_snapshot.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/digest_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/direction.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/drift.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/drift_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/edge_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/events_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/findings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/findings_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/jobs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/journal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/knowledge_forms.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/_runner.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/cache.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/constants.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/direction_alignment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/factory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_reasoning.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/finding_summary.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/grounding.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/journal_polish.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/parsers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/llm/router_glue.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/memory_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/models.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/owner_hint.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/recap.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/_signals.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr1_activity_without_status.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr2_decision_without_adr.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr3_stale_open_loop.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr4_docs_governance_drift.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr5_playbook_changed.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr6_external_update_unpropagated.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr7_claimed_decision_gap.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/rules/dr8_direction_misalignment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/runs_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/scope.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/git_kg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/ingestor.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/sources/pir_tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/warehouse_consolidate.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/watermarks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/brain/ws_emitter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/cc_tasks_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ci_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/claude_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/codex_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/conversation_reader.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/cost_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/crypto.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/confidence.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/config.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/enrichment.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/frontmatter_validator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/hard_gates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/docs_governance/triage_orchestrator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_backends/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_internal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/embedding_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/event_dispatcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/events.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/git_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_cosmo_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_ranker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/graph_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_deep_research.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_digest_jobs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_gmail_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_llm_classifier.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_source_identity.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_sources.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_taxonomy.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_tldr.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/inbox_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/api_key_auth.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/auto_approve.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/classifier.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/confidence.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/dispatch.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/embedding_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/events.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/ignore_patterns.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/image_probe.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/ingress.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/insert_saga.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/anthropic_haiku.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/base.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/byok_provider.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/classification_context.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/config_store.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/factory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/kg_enricher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/local_vllm.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/llm/openai_nano.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/lock_advisory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parser_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docling_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docparse_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/docx_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/folder_unpacker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/gateway_aux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/image_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/internal_markdown.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/ocr_pdf_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/pdf_types.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/transcript_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/vision_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/xlsx_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/parsers/zip_unpacker.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/preflight.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/routing_policy.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/serializers/xlsx_to_markdown.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/skip_log.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/ingest/watcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/hybrid_search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/lens.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/queries.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/ranking.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg/rrf.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/kg_watcher_control.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/async_client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/local_llm/url_validator.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/metrics_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/metrics_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/model_registry.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/model_router.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/n8n_client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/newsletter_llm_gateway.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/notification_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/openai_responses.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/opencode_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/opencode_sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pii_redactor.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/differ.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/dispatcher.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/gc.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/languages.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_impact_pipeline/writer.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/pr_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/project_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/project_status_updates.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/push_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/reminder_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/runas.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/salience_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/security_collector.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_catalog.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_metrics_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_ops.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/session_state.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/share_links.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/task_transitions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/terminal_metrics_dump.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/tmux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/webhook_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/services/workspace_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/templates/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/templates/markdown_share.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/terminal.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_agent_facing_auth_dependencies.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_audit_permissions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_session_conversations.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_backfill_working_seconds_msg.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_claude_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_codex_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_config_env_aliases.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_finder_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_git_ops_merge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_learnings_check_search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_metrics_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_087.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_088.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_migration_089.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_openai_responses.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_metrics.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_opencode_sessions.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_pr_workflow_e2e.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_projects_handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_providers.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_require_scope_empty_deny.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_catalog.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_conversations.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_metrics_service.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_resume_paths.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_session_theme_mode_migration.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_sessions_rbac.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_share_edit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_share_repo.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_session_manager.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_terminal_upload.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_tmux.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_workspace_sync.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/tests/test_ws_ticket_in_memory.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_context.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_errors.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/_roles.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/audit.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/costs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/graph.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/handoffs.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/ingest_triage.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/learnings.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/projects.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/pull_requests.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/search.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/use_cases/tasks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/api/visibility.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/README.md +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_index_source.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_runtime_ctx.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/_transmute.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_account.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_brain.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_governance.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_hooks.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_mcp.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/cli/marvis_runtime.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_drift_check.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_frontmatter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/_graph_writer.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/ast_parser.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/_config.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-dangerous-bash.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-db-direct-write.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-push-no-task.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-staging-to-prod.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/block-subtree-push.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/config.json +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-no-merge-main.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/enforce-worktree.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/quality-gate.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/install_hooks/secret-scan.sh +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/migrate_spike_node_ids.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_artifacts.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_cross_project.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_inbox_nodes.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_pr_impact.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_project_nodes.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/populate_touch_counter.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/reparse_failed.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/scripts/safety_bridge.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/client.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/entitlements.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/rollup.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/schema.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/telemetry/sender.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/state.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/steps.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/core/wizard/validation.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/dependency_links.txt +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/marvisx_cli.egg-info/top_level.txt +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/001_initial.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/002_tasks.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/003_session_management.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/004_projects_comments.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/005_session_intelligence.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/006_settings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/007_task_scoring.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/008_cost_tracking.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/009_session_card_metrics.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/010_monitoring.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/012_agent_api.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/013_session_complete.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/015_pull_requests.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/015_pull_requests_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/016_users_raci.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/017_task_cost_entries.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/018_agents.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/018_agents_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/019_review_feedback.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/020_pr_commit_sha.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/021_webhook_events.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/022_devx_agent_managed_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/023_devx_p1_gate_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_chat_messages.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_pr_conversation_id.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_task_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/024_task_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/025_audit_log.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/026_agent_tokens.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/027_teams_auth_phase_b.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/028_learnings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/029_team_roles.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/030_finder_pins.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/031_pr_deploy_status.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/032_task_reminders.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/033_events_retry_count.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/033_session_owner.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/034_notifications.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/035_shared_links.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/036_session_index_upgrade.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/037_pr_approval.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/038_pr_submitted_by.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/039_push_subscriptions.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/040_semantic_search.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/041_workspaces.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/042_oidc_providers.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/043_ci_checks.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/044_agent_metrics.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/045_documents_doc_type.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/046_salience.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/047_seed_missing_agents.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/048_fix_agent_paths_roles.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/049_agent_role_and_learnings_schema.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/050_session_provider.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/051_session_launch_profile.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/052_session_theme_mode.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/052_task_kind.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/053_inbox_items.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/054_inbox_triage_contract.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/055_inbox_topic_treatment.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/056_inbox_treatment_read_save.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/057_session_theme_mode_backfill.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/058_inbox_item_status_lifecycle.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/059_inbox_tldr_and_source_scores.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/060_newsletter.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/061_inbox_redesign.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/062_fix_inbox_sources_backfill.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/063_task_completion_mode.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/064_judge_mode_setting.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/065_knowledge_graph_spike.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/066_digest_ranking_inputs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/066_kg_artifact_nodes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/067_inbox_digest_selections.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/067_kg_temporal.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/068_inbox_digest_app_settings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/068_kg_touch_counter.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/069_kg_doc_types.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/070_digest_ranking_inputs_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/071_inbox_digest_selections_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/072_inbox_digest_app_settings_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/073_kg_cross_project_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/074_kg_infra_types_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/075_kg_file_state_recovery_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/076_kg_watcher_state_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/077_kg_doc_types_extend_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/078_kg_fts5.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/078_kg_fts5_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/079_kg_missing_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/080_kg_fts5_extended_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/081_kg_lens_indexes_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/082_kg_pins.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/082_kg_pins_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/083_kg_graph_nodes_degree_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/084_drop_legacy_scheduler_tables_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/085_kg_edge_resolves_to_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/086_project_status_updates_feed_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/087_session_metrics_dual_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/088_rename_context_pct_legacy_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/089_session_metrics_equivalent_cost_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/090_kg_inbox_node_type_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/091_kg_inbox_node_type_check_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/092_sessions_activity_state_ts_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/093_sessions_activity_state_column_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/094_ingest_pending.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/094_ingest_pending_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/095_kg_intent_first_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/096_kg_xlsx_artifact_prefix_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/097_ingest_change_history_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/098_kg_node_type_business_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/099_kg_edges_restore_weight_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/100_kg_enriched_at_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/101_local_llm_shadow_comparisons_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/102_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/103_ingest_skipped_log_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/120_docs_governance.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/120_docs_governance_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/121_notification_event_fk_cleanup_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/122_docs_drift_history_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/123_ingest_parser_waiting_status_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/124_heypocket_recordings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/125_kg_node_type_record_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/126_ingest_terminal_upload_source_kind_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/127_brain_v1_substrate_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/128_brain_drift_signals_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/129_brain_memory_operations_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/130_brain_findings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/130_brain_findings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/132_kg_pr_modifies_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/133_brain_v1_2_direction_schema_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/134_brain_journal_narrative_polished_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/135_kg_edges_provider.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/136_documents_fts.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/137_promote_llm_costs_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/138_ingest_api_keys_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/139_ingest_pending_ingress_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/140_ingest_idempotency_quota_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/141_ingest_pending_metadata_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/142_llm_function_config.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/142_llm_function_config_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/143_kg_code_embeddings_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/144_notifications_pending_sync_index.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/145_audit_log_immutable_down.sql +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/migrations/__init__.py +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/projects/_template/project.yaml +0 -0
- {marvisx_cli-0.3.5 → marvisx_cli-0.3.6}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: marvisx-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
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
|
|
@@ -1,10 +1,31 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Marvis
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**The Company Brain your agents install.** Use Claude Code, or whatever coding agent you run, to manage projects and coordinate your agents, not just write code. Marvis captures what your agents do as they work, structures it into a cross-project Knowledge Graph, and hands it back to them, so your work stays on track and the system learns from it. Self-hosted, EU-resident, governed by an immutable audit chain.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**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
6
|
|
|
7
|
-
##
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Marvis runs as a CLI your agent drives. Install it, then let the agent you already use take it from there:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv tool install marvisx-cli
|
|
13
|
+
marvis init
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`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
|
+
|
|
18
|
+
To run the full Console + API stack yourself, see [Self-hosting the full stack](#self-hosting-the-full-stack).
|
|
19
|
+
|
|
20
|
+
## What it does, in plain terms
|
|
21
|
+
|
|
22
|
+
- **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.
|
|
23
|
+
- **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.
|
|
24
|
+
- **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.
|
|
25
|
+
- **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.
|
|
26
|
+
- **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.
|
|
27
|
+
|
|
28
|
+
## Under the hood
|
|
8
29
|
|
|
9
30
|
- **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}`.
|
|
10
31
|
- **Foreign-key-immutable audit log** with provenance pinned at the SQLite level. Designed to satisfy the logging surface required by EU Regulation 2024/1689 (AI Act) Article 12.
|
|
@@ -14,22 +35,22 @@ Released as a defensive-publication architectural pattern. See the Zenodo prepri
|
|
|
14
35
|
|
|
15
36
|
## Search and embedding quality
|
|
16
37
|
|
|
17
|
-
|
|
38
|
+
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`.
|
|
18
39
|
|
|
19
40
|
This is a deliberate tradeoff: EU compliance, self-hosting, and zero external embedding cost come at the cost of retrieval quality that is below commercial managed embedding providers. See [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) for the benchmark numbers, affected workflows, mitigations available today, and the Phase 2 fine-tune roadmap.
|
|
20
41
|
|
|
21
42
|
## License posture
|
|
22
43
|
|
|
23
|
-
- Code
|
|
44
|
+
- **Free to self-host.** Code is **source-available** under the **Business Source License 1.1**, with an automatic change date converting to **Apache License 2.0** four years after release.
|
|
24
45
|
- Documentation and architectural patterns: **CC-BY 4.0**.
|
|
25
46
|
|
|
26
|
-
|
|
47
|
+
This is open-core, not OSI open source: the core is free to run and read, and the BSL holds back only competing commercial-as-a-service use until the change date. The combination keeps the architecture freely citable while preserving the ability to ship a self-hosted reference deployment.
|
|
27
48
|
|
|
28
49
|
## Architecture map
|
|
29
50
|
|
|
30
51
|
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.
|
|
31
52
|
|
|
32
|
-
|
|
53
|
+
The full architectural description is the MarvisX preprint on Zenodo: [`10.5281/zenodo.20341860`](https://doi.org/10.5281/zenodo.20341860).
|
|
33
54
|
|
|
34
55
|
## Repository layout
|
|
35
56
|
|
|
@@ -46,9 +67,9 @@ deploy/
|
|
|
46
67
|
# (Docker Compose + environment scaffolding)
|
|
47
68
|
```
|
|
48
69
|
|
|
49
|
-
##
|
|
70
|
+
## Self-hosting the full stack
|
|
50
71
|
|
|
51
|
-
The
|
|
72
|
+
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:
|
|
52
73
|
|
|
53
74
|
```bash
|
|
54
75
|
cp deploy/_template/.env.example deploy/_template/.env
|
|
@@ -58,13 +79,9 @@ docker compose up -d
|
|
|
58
79
|
|
|
59
80
|
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.
|
|
60
81
|
|
|
61
|
-
## Setting up local embeddings
|
|
62
|
-
|
|
63
|
-
[`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) covers the step-by-step path to the self-hosted Granite backend, including first-boot setup, re-indexing an existing corpus, and KG threshold recalibration.
|
|
64
|
-
|
|
65
82
|
## MCP surface
|
|
66
83
|
|
|
67
|
-
|
|
84
|
+
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.
|
|
68
85
|
|
|
69
86
|
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.
|
|
70
87
|
|
|
@@ -78,15 +95,25 @@ Setting `MARVIS_OSS_LOCAL=1` (truthy: `1`/`true`/`yes`/`on`) makes the `block-db
|
|
|
78
95
|
|
|
79
96
|
**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.
|
|
80
97
|
|
|
98
|
+
## Telemetry
|
|
99
|
+
|
|
100
|
+
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.
|
|
101
|
+
|
|
102
|
+
Turn it off at any time:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
marvis telemetry off
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
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.
|
|
109
|
+
|
|
81
110
|
## Documentation
|
|
82
111
|
|
|
83
112
|
- [`docs/SEARCH-QUALITY.md`](docs/SEARCH-QUALITY.md) — search quality expectations, affected workflows, and mitigations
|
|
84
|
-
- [`docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md`](docs/MIGRATION-TO-LOCAL-EMBEDDINGS.md) — setting up the self-hosted Granite embedding backend
|
|
85
|
-
- [`docs/solutions/architecture-patterns/`](docs/solutions/architecture-patterns/) — architectural decision records
|
|
86
113
|
|
|
87
114
|
## Contributing
|
|
88
115
|
|
|
89
|
-
|
|
116
|
+
Issues and bug reports are welcome through the repository tracker.
|
|
90
117
|
|
|
91
118
|
## References
|
|
92
119
|
|
|
@@ -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,7 +72,12 @@ 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
|
)
|
|
76
83
|
cookie_domain: str | None = Field(default=None, alias="COOKIE_DOMAIN")
|
|
@@ -544,16 +551,14 @@ class Settings(BaseSettings):
|
|
|
544
551
|
|
|
545
552
|
Returns '' when GIT_RUNAS_USER is unset or already matches the current
|
|
546
553
|
OS user (no privilege hop needed)."""
|
|
547
|
-
import pwd
|
|
548
|
-
|
|
549
554
|
user = (self.git_runas_user or "").strip()
|
|
550
555
|
if not user:
|
|
551
556
|
return ""
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
+
# current_user() is pwd.getpwuid(os.getuid()).pw_name on POSIX (identical
|
|
558
|
+
# to the previous inline lookup) and getpass-based on Windows; the bare
|
|
559
|
+
# `import pwd` here crashed `marvis project list` on Windows.
|
|
560
|
+
if current_user() == user:
|
|
561
|
+
return ""
|
|
557
562
|
return user
|
|
558
563
|
|
|
559
564
|
|
|
@@ -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(
|
|
@@ -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]:
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# v1.0.0 - 2026-06-03 - 0.3.6: opt-out CLI "update available" notice (notify-only)
|
|
2
|
+
"""Throttled, fail-silent "a new version is available" notice (NOTIFY ONLY).
|
|
3
|
+
|
|
4
|
+
NEVER self-updates — no ``pip``/``uv`` side effect. It prints one line to stderr
|
|
5
|
+
telling the user how to upgrade. npm-style decoupling so the notice is reliable:
|
|
6
|
+
|
|
7
|
+
- print INSTANTLY from a cached latest-version file (so it actually shows, even
|
|
8
|
+
on a fast command that would outrun a background network call), then
|
|
9
|
+
- refresh that cache in a detached daemon thread at most once per 24h.
|
|
10
|
+
|
|
11
|
+
First run has no cache → no notice, but kicks the refresh → the next run shows it.
|
|
12
|
+
|
|
13
|
+
Opt out via ``MARVIS_NO_UPDATE_CHECK=1`` or ``settings.yaml`` ``update_check: false``.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
from core.telemetry import client as _tc # canonical ~/.marvis + settings reader
|
|
21
|
+
|
|
22
|
+
_PACKAGE = "marvisx-cli"
|
|
23
|
+
_PYPI_JSON = "https://pypi.org/pypi/marvisx-cli/json"
|
|
24
|
+
_CHECK_INTERVAL_S = 24 * 3600
|
|
25
|
+
_TIMEOUT = 2.5
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _last_check_path():
|
|
29
|
+
return _tc._marvis_dir() / "update_last_check"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _cached_latest_path():
|
|
33
|
+
return _tc._marvis_dir() / "update_latest"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _opted_out() -> bool:
|
|
37
|
+
if os.environ.get("MARVIS_NO_UPDATE_CHECK"):
|
|
38
|
+
return True
|
|
39
|
+
try:
|
|
40
|
+
return _tc._read_settings().get("update_check") is False
|
|
41
|
+
except Exception: # noqa: BLE001
|
|
42
|
+
return False
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _installed_version() -> str | None:
|
|
46
|
+
try:
|
|
47
|
+
from importlib.metadata import version
|
|
48
|
+
|
|
49
|
+
return version(_PACKAGE)
|
|
50
|
+
except Exception: # noqa: BLE001
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _read_cached_latest() -> str | None:
|
|
55
|
+
try:
|
|
56
|
+
path = _cached_latest_path()
|
|
57
|
+
if path.is_file():
|
|
58
|
+
return path.read_text(encoding="utf-8").strip() or None
|
|
59
|
+
except Exception: # noqa: BLE001
|
|
60
|
+
return None
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _write_cached_latest(version: str) -> None:
|
|
65
|
+
try:
|
|
66
|
+
path = _cached_latest_path()
|
|
67
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
path.write_text(version.strip() + "\n", encoding="utf-8")
|
|
69
|
+
except Exception: # noqa: BLE001
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _should_check(now: float) -> bool:
|
|
74
|
+
try:
|
|
75
|
+
path = _last_check_path()
|
|
76
|
+
if not path.is_file():
|
|
77
|
+
return True
|
|
78
|
+
last = float(path.read_text(encoding="utf-8").strip() or 0)
|
|
79
|
+
return (now - last) >= _CHECK_INTERVAL_S
|
|
80
|
+
except Exception: # noqa: BLE001
|
|
81
|
+
return False
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _mark_checked(now: float) -> None:
|
|
85
|
+
try:
|
|
86
|
+
path = _last_check_path()
|
|
87
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
path.write_text(f"{now:.0f}\n", encoding="utf-8")
|
|
89
|
+
except Exception: # noqa: BLE001
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _parse(v: str) -> tuple[int, ...]:
|
|
94
|
+
"""Numeric release tuple; a pre-release/garbage chunk truncates to its int
|
|
95
|
+
prefix (0 if none) — conservative, never crashes."""
|
|
96
|
+
out: list[int] = []
|
|
97
|
+
for chunk in v.split("."):
|
|
98
|
+
digits = ""
|
|
99
|
+
for ch in chunk:
|
|
100
|
+
if ch.isdigit():
|
|
101
|
+
digits += ch
|
|
102
|
+
else:
|
|
103
|
+
break
|
|
104
|
+
out.append(int(digits) if digits else 0)
|
|
105
|
+
return tuple(out)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _is_newer(latest: str, installed: str) -> bool:
|
|
109
|
+
try:
|
|
110
|
+
return _parse(latest) > _parse(installed)
|
|
111
|
+
except Exception: # noqa: BLE001
|
|
112
|
+
return False
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _fetch_latest() -> str | None:
|
|
116
|
+
import json
|
|
117
|
+
import urllib.request
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
req = urllib.request.Request(
|
|
121
|
+
_PYPI_JSON, headers={"User-Agent": "marvis-update-check/1"}
|
|
122
|
+
)
|
|
123
|
+
with urllib.request.urlopen(req, timeout=_TIMEOUT) as resp: # noqa: S310 — https pinned
|
|
124
|
+
data = json.loads(resp.read().decode("utf-8", "replace"))
|
|
125
|
+
v = (data.get("info") or {}).get("version")
|
|
126
|
+
return v if isinstance(v, str) and v else None
|
|
127
|
+
except Exception: # noqa: BLE001 — down/slow PyPI → silent
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _refresh_cache() -> None:
|
|
132
|
+
latest = _fetch_latest()
|
|
133
|
+
if latest:
|
|
134
|
+
_write_cached_latest(latest)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def maybe_notify_update() -> None:
|
|
138
|
+
"""Print a cached "update available" notice (instant), then refresh the cache
|
|
139
|
+
in the background ≤1×/day. Notify-only, fail-silent, never blocks."""
|
|
140
|
+
try:
|
|
141
|
+
if _opted_out():
|
|
142
|
+
return
|
|
143
|
+
|
|
144
|
+
installed = _installed_version()
|
|
145
|
+
if installed:
|
|
146
|
+
cached = _read_cached_latest()
|
|
147
|
+
if cached and _is_newer(cached, installed):
|
|
148
|
+
sys.stderr.write(
|
|
149
|
+
f"\n[marvis] update available: {installed} → {cached}. "
|
|
150
|
+
f"Upgrade with: uv tool upgrade {_PACKAGE}\n"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
from time import time
|
|
154
|
+
|
|
155
|
+
now = time()
|
|
156
|
+
if _should_check(now):
|
|
157
|
+
_mark_checked(now) # claim the 24h window before the network call
|
|
158
|
+
import threading
|
|
159
|
+
|
|
160
|
+
threading.Thread(
|
|
161
|
+
target=_refresh_cache, name="marvis-update-check", daemon=True
|
|
162
|
+
).start()
|
|
163
|
+
except Exception: # noqa: BLE001 — must never affect the command
|
|
164
|
+
return
|