meridian-cli 0.2.2__tar.gz → 0.2.4__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.
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/.gitignore +1 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/PKG-INFO +3 -3
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/README.md +1 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/pyproject.toml +1 -2
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/spawn.py +17 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/catalog.py +5 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/work_cmd.py +48 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/codex_ws.py +12 -3
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/.context/CONTEXT.md +12 -8
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/context.py +4 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/cwd.py +11 -3
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/.context/CONTEXT.md +51 -3
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/commands.py +17 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/runtime.py +3 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/api.py +80 -1
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/models.py +3 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/prepare.py +15 -10
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/work_lifecycle.py +54 -72
- meridian_cli-0.2.4/src/meridian/lib/ops/work_worktree.py +231 -0
- meridian_cli-0.2.4/src/meridian/lib/ops/worktree_ensure.py +775 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/worktree_lifecycle.py +69 -27
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/worktree_ops.py +13 -2
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/.context/CONTEXT.md +22 -0
- meridian_cli-0.2.4/src/meridian/lib/state/temp_worktree_store.py +107 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/work_store.py +84 -5
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/LICENSE +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/app_tree.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/chat_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/main.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/spawn_inject.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/backend_acquisition.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/backend_handle.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/checkpoint.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/command_handler.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/command_invariants.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/commands.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/discovery.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/launcher.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/portless.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/raw_vite.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/dev_frontend/supervisor.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/event_index.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/event_log.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/event_observer.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/event_pipeline.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/frontend.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/claude.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/codex.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/common.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/opencode.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/normalization/synthetic.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/protocol.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/recovery.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/replay.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/runtime.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/server.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/session_service.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/chat/ws_fanout.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/clock.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/lifecycle.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/process_cleanup.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/spawn_service.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/claude.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/pi_lifecycle_file.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/extractors/pi.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_claude.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/semantics.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/launch_types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/permissions.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/runner.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/prompt.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/report.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/streaming_runner.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/pruning.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_read.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/ops/worktree_format.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/base.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/platform/windows_job.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/safety/redaction.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/atomic.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/history.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/liveness.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/process_scope_projection.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/reaper.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/session_store.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/model.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/repository.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn/transitions.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/spawn_store.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/inject_lock.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/signal_canceller.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/spawn_manager.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/managed-bash/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/meridian-lifecycle/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/meridian-lifecycle/src/index.ts +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/shared/lifecycle_sidecar.ts +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/extensions/types.ts +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/py.typed +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.2.2 → meridian_cli-0.2.4}/src/meridian/server/main.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meridian-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Orchestrate CLI + MCP server for multi-model agent workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/haowjy/meridian-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/haowjy/meridian-cli
|
|
@@ -24,7 +24,7 @@ Requires-Dist: coolname>=4.0.0
|
|
|
24
24
|
Requires-Dist: cyclopts>=3.0
|
|
25
25
|
Requires-Dist: fastapi>=0.115
|
|
26
26
|
Requires-Dist: markdown-it-py>=4.0
|
|
27
|
-
Requires-Dist: mars-agents==0.7.
|
|
27
|
+
Requires-Dist: mars-agents==0.7.1
|
|
28
28
|
Requires-Dist: mcp>=1.0
|
|
29
29
|
Requires-Dist: pathspec>=1.1.0
|
|
30
30
|
Requires-Dist: psutil>=7.2.2
|
|
@@ -192,7 +192,7 @@ graph TB
|
|
|
192
192
|
uv sync --extra dev
|
|
193
193
|
uv run ruff check .
|
|
194
194
|
uv run pytest-llm
|
|
195
|
-
uv run pyright
|
|
195
|
+
uv run --extra dev python -m pyright
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
See [DEVELOPMENT.md](DEVELOPMENT.md) for full dev setup.
|
|
@@ -24,7 +24,7 @@ dependencies = [
|
|
|
24
24
|
"cyclopts>=3.0",
|
|
25
25
|
"fastapi>=0.115",
|
|
26
26
|
"markdown-it-py>=4.0",
|
|
27
|
-
"mars-agents==0.7.
|
|
27
|
+
"mars-agents==0.7.1",
|
|
28
28
|
"mcp>=1.0",
|
|
29
29
|
"pathspec>=1.1.0",
|
|
30
30
|
"psutil>=7.2.2",
|
|
@@ -44,7 +44,6 @@ Issues = "https://github.com/haowjy/meridian-cli/issues"
|
|
|
44
44
|
|
|
45
45
|
[project.scripts]
|
|
46
46
|
meridian = "meridian.cli.entrypoint:main"
|
|
47
|
-
pyright = "pyright.cli:entrypoint"
|
|
48
47
|
pytests = "meridian.dev.pytests:main"
|
|
49
48
|
pytest-llm = "meridian.dev.pytests:main"
|
|
50
49
|
|
|
@@ -275,7 +275,10 @@ def _spawn_create(
|
|
|
275
275
|
bool | None,
|
|
276
276
|
Parameter(
|
|
277
277
|
name="--worktree",
|
|
278
|
-
help=
|
|
278
|
+
help=(
|
|
279
|
+
"Ensure and use the selected work item's Meridian-managed canonical "
|
|
280
|
+
"worktree as task cwd."
|
|
281
|
+
),
|
|
279
282
|
),
|
|
280
283
|
] = None,
|
|
281
284
|
no_worktree: Annotated[
|
|
@@ -285,6 +288,16 @@ def _spawn_create(
|
|
|
285
288
|
help="Force authority root as task cwd, ignoring any configured worktree path.",
|
|
286
289
|
),
|
|
287
290
|
] = False,
|
|
291
|
+
repo: Annotated[
|
|
292
|
+
str | None,
|
|
293
|
+
Parameter(
|
|
294
|
+
name="--repo",
|
|
295
|
+
help=(
|
|
296
|
+
"Target implementation repository path or workspace alias for first "
|
|
297
|
+
"managed worktree ensure."
|
|
298
|
+
),
|
|
299
|
+
),
|
|
300
|
+
] = None,
|
|
288
301
|
dry_run: Annotated[
|
|
289
302
|
bool,
|
|
290
303
|
Parameter(name="--dry-run", help="Preview without executing harness."),
|
|
@@ -478,6 +491,7 @@ def _spawn_create(
|
|
|
478
491
|
desc=desc,
|
|
479
492
|
work=work,
|
|
480
493
|
worktree=worktree_intent,
|
|
494
|
+
repo=repo,
|
|
481
495
|
**shared_launch_kwargs,
|
|
482
496
|
),
|
|
483
497
|
sink=_current_output_sink(),
|
|
@@ -497,6 +511,7 @@ def _spawn_create(
|
|
|
497
511
|
desc=desc,
|
|
498
512
|
work=work,
|
|
499
513
|
worktree=worktree_intent,
|
|
514
|
+
repo=repo,
|
|
500
515
|
**shared_launch_kwargs,
|
|
501
516
|
),
|
|
502
517
|
sink=_current_output_sink(),
|
|
@@ -516,6 +531,7 @@ def _spawn_create(
|
|
|
516
531
|
goal=resolved_goal,
|
|
517
532
|
work=work,
|
|
518
533
|
worktree=worktree_intent,
|
|
534
|
+
repo=repo,
|
|
519
535
|
**shared_launch_kwargs,
|
|
520
536
|
),
|
|
521
537
|
sink=_current_output_sink(),
|
|
@@ -383,6 +383,11 @@ _COMMAND_DESCRIPTORS: tuple[CommandDescriptor, ...] = (
|
|
|
383
383
|
_write_runtime(("work", "delete"), "Delete work item.", extension_ref="meridian.work.delete"),
|
|
384
384
|
_write_runtime(("work", "rename"), "Rename work item.", extension_ref="meridian.work.rename"),
|
|
385
385
|
_write_runtime(("work", "clear"), "Clear current work.", extension_ref="meridian.work.clear"),
|
|
386
|
+
_write_runtime(
|
|
387
|
+
("work", "worktree"),
|
|
388
|
+
"Show or ensure canonical managed worktree state.",
|
|
389
|
+
extension_ref="meridian.work.worktree",
|
|
390
|
+
),
|
|
386
391
|
_write_runtime(
|
|
387
392
|
("work", "set-worktree"),
|
|
388
393
|
"Assign an existing worktree path to a work item.",
|
|
@@ -37,6 +37,7 @@ from meridian.lib.ops.work_lifecycle import (
|
|
|
37
37
|
WorkStartInput,
|
|
38
38
|
WorkSwitchInput,
|
|
39
39
|
WorkUpdateInput,
|
|
40
|
+
WorkWorktreeInput,
|
|
40
41
|
work_clear_sync,
|
|
41
42
|
work_clear_worktree_sync,
|
|
42
43
|
work_delete_sync,
|
|
@@ -47,6 +48,7 @@ from meridian.lib.ops.work_lifecycle import (
|
|
|
47
48
|
work_start_sync,
|
|
48
49
|
work_switch_sync,
|
|
49
50
|
work_update_sync,
|
|
51
|
+
work_worktree_sync,
|
|
50
52
|
)
|
|
51
53
|
|
|
52
54
|
Emitter = Callable[[Any], None]
|
|
@@ -76,12 +78,22 @@ def _work_start(
|
|
|
76
78
|
] = None,
|
|
77
79
|
worktree: Annotated[
|
|
78
80
|
bool | None,
|
|
79
|
-
Parameter(
|
|
81
|
+
Parameter(
|
|
82
|
+
name="--worktree",
|
|
83
|
+
help="Ensure Meridian-managed canonical isolation for this work item.",
|
|
84
|
+
),
|
|
80
85
|
] = None,
|
|
81
86
|
no_worktree: Annotated[
|
|
82
87
|
bool,
|
|
83
88
|
Parameter(name="--no-worktree", help="Skip worktree creation even if default is set."),
|
|
84
89
|
] = False,
|
|
90
|
+
repo: Annotated[
|
|
91
|
+
str | None,
|
|
92
|
+
Parameter(
|
|
93
|
+
name="--repo",
|
|
94
|
+
help="Target implementation repository path or [workspace.<name>] alias.",
|
|
95
|
+
),
|
|
96
|
+
] = None,
|
|
85
97
|
) -> None:
|
|
86
98
|
# Resolve explicit worktree intent from the two flags.
|
|
87
99
|
# --no-worktree wins over --worktree if both are passed (degenerate case).
|
|
@@ -100,6 +112,7 @@ def _work_start(
|
|
|
100
112
|
goal=goal,
|
|
101
113
|
chat_id=_runtime_chat_id(),
|
|
102
114
|
worktree=worktree_intent,
|
|
115
|
+
repo=repo,
|
|
103
116
|
)
|
|
104
117
|
)
|
|
105
118
|
)
|
|
@@ -277,6 +290,39 @@ def _work_clear(emit: Emitter) -> None:
|
|
|
277
290
|
emit(work_clear_sync(WorkClearInput(chat_id=_runtime_chat_id())))
|
|
278
291
|
|
|
279
292
|
|
|
293
|
+
def _work_worktree(
|
|
294
|
+
emit: Emitter,
|
|
295
|
+
work_id: Annotated[
|
|
296
|
+
str,
|
|
297
|
+
Parameter(help="Optional work item id. Defaults to active work for this session."),
|
|
298
|
+
] = "",
|
|
299
|
+
ensure: Annotated[
|
|
300
|
+
bool,
|
|
301
|
+
Parameter(
|
|
302
|
+
name="--ensure",
|
|
303
|
+
help="Create/recover Meridian's canonical managed worktree if needed.",
|
|
304
|
+
),
|
|
305
|
+
] = False,
|
|
306
|
+
repo: Annotated[
|
|
307
|
+
str | None,
|
|
308
|
+
Parameter(
|
|
309
|
+
name="--repo",
|
|
310
|
+
help="Target implementation repository path or [workspace.<name>] alias.",
|
|
311
|
+
),
|
|
312
|
+
] = None,
|
|
313
|
+
) -> None:
|
|
314
|
+
emit(
|
|
315
|
+
work_worktree_sync(
|
|
316
|
+
WorkWorktreeInput(
|
|
317
|
+
work_id=work_id,
|
|
318
|
+
ensure=ensure,
|
|
319
|
+
repo=repo,
|
|
320
|
+
chat_id=_runtime_chat_id(),
|
|
321
|
+
)
|
|
322
|
+
)
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
|
|
280
326
|
def _work_set_worktree(
|
|
281
327
|
emit: Emitter,
|
|
282
328
|
work_id: Annotated[
|
|
@@ -326,6 +372,7 @@ def register_work_commands(app: App, emit: Emitter) -> tuple[set[str], dict[str,
|
|
|
326
372
|
"meridian.work.reopen": lambda: partial(_work_reopen, emit),
|
|
327
373
|
"meridian.work.rename": lambda: partial(_work_rename, emit),
|
|
328
374
|
"meridian.work.clear": lambda: partial(_work_clear, emit),
|
|
375
|
+
"meridian.work.worktree": lambda: partial(_work_worktree, emit),
|
|
329
376
|
"meridian.work.set-worktree": lambda: partial(_work_set_worktree, emit),
|
|
330
377
|
"meridian.work.clear-worktree": lambda: partial(_work_clear_worktree, emit),
|
|
331
378
|
}
|
|
@@ -312,6 +312,7 @@ class CodexConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
312
312
|
|
|
313
313
|
env = inherit_child_env(os.environ, config.env_overrides)
|
|
314
314
|
self._codex_home = resolve_codex_home(env)
|
|
315
|
+
effective_cwd = self._effective_project_root()
|
|
315
316
|
spawn_dir = resolve_spawn_log_dir(config.control_root, config.spawn_id)
|
|
316
317
|
spawn_dir.mkdir(parents=True, exist_ok=True)
|
|
317
318
|
self._stderr_log_path = spawn_dir / "stderr.log"
|
|
@@ -329,7 +330,7 @@ class CodexConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
329
330
|
self._emit_startup_phase(StartupPhase.LAUNCHING_SUBPROCESS)
|
|
330
331
|
self._process = await asyncio.create_subprocess_exec(
|
|
331
332
|
*appserver_command,
|
|
332
|
-
cwd=str(
|
|
333
|
+
cwd=str(effective_cwd),
|
|
333
334
|
env=env,
|
|
334
335
|
stdout=asyncio.subprocess.DEVNULL,
|
|
335
336
|
stderr=self._stderr_handle,
|
|
@@ -1109,6 +1110,14 @@ class CodexConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
1109
1110
|
"""Check if this is a fresh session (not resume or fork)."""
|
|
1110
1111
|
return not (spec.continue_session_id or "").strip()
|
|
1111
1112
|
|
|
1113
|
+
def _effective_project_root(self) -> Path:
|
|
1114
|
+
"""Project root Codex should bind the app-server/thread/rollout to."""
|
|
1115
|
+
|
|
1116
|
+
config = self._config
|
|
1117
|
+
if config is None:
|
|
1118
|
+
raise RuntimeError("Codex connection config is unavailable")
|
|
1119
|
+
return config.task_cwd or config.control_root
|
|
1120
|
+
|
|
1112
1121
|
async def _send_bootstrap_turn_and_wait(self) -> None:
|
|
1113
1122
|
"""Send a minimal bootstrap turn and wait for completion.
|
|
1114
1123
|
|
|
@@ -1149,7 +1158,7 @@ class CodexConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
1149
1158
|
if (
|
|
1150
1159
|
find_attachable_rollout_session_id(
|
|
1151
1160
|
codex_home=codex_home,
|
|
1152
|
-
project_root=
|
|
1161
|
+
project_root=self._effective_project_root(),
|
|
1153
1162
|
session_id=thread_id,
|
|
1154
1163
|
)
|
|
1155
1164
|
== thread_id
|
|
@@ -1182,7 +1191,7 @@ class CodexConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
1182
1191
|
projected = project_managed_primary_bootstrap(
|
|
1183
1192
|
self.harness_id,
|
|
1184
1193
|
spec,
|
|
1185
|
-
project_root=
|
|
1194
|
+
project_root=self._effective_project_root(),
|
|
1186
1195
|
)
|
|
1187
1196
|
if not isinstance(projected, tuple):
|
|
1188
1197
|
raise TypeError("Codex managed-primary bootstrap must be (method, payload)")
|
|
@@ -196,11 +196,13 @@ to `logical_task_cwd` but may differ — Claude harness forces it to `authority_
|
|
|
196
196
|
when `has_distinct_task_cwd` is true, because Claude's `--add-dir` grants access
|
|
197
197
|
without needing the process to start in the task directory.
|
|
198
198
|
|
|
199
|
-
**Task CWD instruction injection.**
|
|
200
|
-
|
|
201
|
-
the task cwd before
|
|
202
|
-
|
|
203
|
-
|
|
199
|
+
**Task CWD instruction injection.** For non-primary child spawns with a distinct
|
|
200
|
+
`logical_task_cwd`, launch composition always adds a prompt instruction telling
|
|
201
|
+
the agent to `cd` into the task cwd before filesystem operations. This is a
|
|
202
|
+
conservative child-spawn safety contract: harnesses may bind tools differently
|
|
203
|
+
than Meridian's requested process cwd. Primary sessions stay quiet unless a
|
|
204
|
+
future primary flow explicitly needs task-cwd steering. Controlled by
|
|
205
|
+
`LaunchDirectoryContext.should_inject_task_cwd_instruction(surface)`.
|
|
204
206
|
|
|
205
207
|
Resolution priority in `resolve_task_cwd()`:
|
|
206
208
|
1. `--no-worktree` → authority root
|
|
@@ -263,11 +265,13 @@ Two steps inside `bind_launch_context()`:
|
|
|
263
265
|
`--add-dir` args; OpenCode gets `OPENCODE_CONFIG_CONTENT` env override (deep-merged).
|
|
264
266
|
|
|
265
267
|
Roots include workspace roots, git context clone roots, context projection roots
|
|
266
|
-
(work, kb, extras),
|
|
267
|
-
Extra args remain user-owned passthrough; they
|
|
268
|
+
(work, kb, extras), task cwd when task cwd is external, runtime root, and system
|
|
269
|
+
temp dir — deduplicated in order. Extra args remain user-owned passthrough; they
|
|
270
|
+
are not a workspace projection channel.
|
|
268
271
|
|
|
269
272
|
**Task CWD projection gap.** When `task_cwd` is outside both `control_root` and
|
|
270
|
-
all projected workspace roots,
|
|
273
|
+
all projected workspace roots, launch composition projects the exact task cwd
|
|
274
|
+
for active projection harnesses. If workspace projection is not active, a
|
|
271
275
|
`task_cwd_not_projected` warning is emitted. The launch continues but the agent
|
|
272
276
|
doesn't automatically get access to the task directory — harness-specific
|
|
273
277
|
configuration would be needed.
|
|
@@ -1549,6 +1549,9 @@ def bind_launch_context(
|
|
|
1549
1549
|
)
|
|
1550
1550
|
|
|
1551
1551
|
is_primary_launch = runtime.composition_surface == LaunchCompositionSurface.PRIMARY
|
|
1552
|
+
inject_task_cwd_instruction = directory_context.should_inject_task_cwd_instruction(
|
|
1553
|
+
runtime.composition_surface
|
|
1554
|
+
)
|
|
1552
1555
|
materialized = materialize_launch_artifacts(
|
|
1553
1556
|
harness=harness,
|
|
1554
1557
|
prompt=resolved_request.prompt,
|
|
@@ -1560,7 +1563,7 @@ def bind_launch_context(
|
|
|
1560
1563
|
extra_args=projected_extra_args,
|
|
1561
1564
|
control_root=resolved_control_root.as_posix(),
|
|
1562
1565
|
task_cwd=(task_cwd.as_posix() if task_cwd is not None else None),
|
|
1563
|
-
inject_task_cwd_instruction=
|
|
1566
|
+
inject_task_cwd_instruction=inject_task_cwd_instruction,
|
|
1564
1567
|
mcp_tools=resolved_request.mcp_tools,
|
|
1565
1568
|
projected_roots=projected_roots,
|
|
1566
1569
|
interactive=is_primary_launch,
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
from dataclasses import dataclass, replace
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
+
from meridian.lib.launch.request import LaunchCompositionSurface
|
|
8
9
|
from meridian.lib.state import work_store
|
|
9
10
|
|
|
10
11
|
|
|
@@ -56,9 +57,16 @@ class LaunchDirectoryContext:
|
|
|
56
57
|
def has_distinct_task_cwd(self) -> bool:
|
|
57
58
|
return self.logical_task_cwd != self.authority_root
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
def should_inject_task_cwd_instruction(self, surface: LaunchCompositionSurface) -> bool:
|
|
61
|
+
"""Whether launch composition should tell the agent to cd into task cwd.
|
|
62
|
+
|
|
63
|
+
Child spawn tool cwd can vary by harness even when Meridian requests the
|
|
64
|
+
task cwd. Be conservative for all non-primary child launches with a
|
|
65
|
+
distinct task cwd; keep primary sessions quiet unless a future primary
|
|
66
|
+
flow needs explicit task-cwd steering.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
return self.has_distinct_task_cwd and surface != LaunchCompositionSurface.PRIMARY
|
|
62
70
|
|
|
63
71
|
|
|
64
72
|
def _active_worktree_path_for_item(
|
|
@@ -77,9 +77,18 @@ use `SPEC_ONLY`. Do not set `REQUIRED` on execution paths.
|
|
|
77
77
|
|
|
78
78
|
### Worktree Lifecycle Protection
|
|
79
79
|
|
|
80
|
-
`ops/worktree_lifecycle.py`
|
|
81
|
-
and crash recovery. It is intentionally limited to git/worktree
|
|
82
|
-
structured results for callers
|
|
80
|
+
`ops/worktree_lifecycle.py` is the raw git worktree layer — it owns creation,
|
|
81
|
+
restoration, cleanup, and crash recovery. It is intentionally limited to git/worktree
|
|
82
|
+
concerns and returns structured results for callers to persist elsewhere.
|
|
83
|
+
|
|
84
|
+
`ops/worktree_ensure.py` sits above it and provides high-level ensure semantics used
|
|
85
|
+
by `work_worktree.py` and spawn logic. The split is: lifecycle owns raw git operations,
|
|
86
|
+
ensure owns state management and idempotency.
|
|
87
|
+
|
|
88
|
+
Managed worktree creation writes a `mars.local.toml` guard with
|
|
89
|
+
`[settings] targets = []` when the worktree is newly created. This prevents
|
|
90
|
+
repo-local `meridian mars sync` from materializing harness targets inside each
|
|
91
|
+
worktree. Existing `mars.local.toml` files are user-owned and preserved.
|
|
83
92
|
|
|
84
93
|
**Destructive operations guard against three conditions:**
|
|
85
94
|
|
|
@@ -124,6 +133,45 @@ type (e.g., `{"agents": [...], "skills": [...]}`). This avoids coupling Python
|
|
|
124
133
|
to the mars JSON report shape — new content types (hooks, MCP servers, etc.) are
|
|
125
134
|
automatically counted without Python model changes.
|
|
126
135
|
|
|
136
|
+
### ops/worktree_ensure.py — Managed Worktree Orchestration
|
|
137
|
+
|
|
138
|
+
`worktree_ensure.py` sits above `worktree_lifecycle.py` and provides high-level
|
|
139
|
+
ensure semantics with state management, dry-run support, and session-scoped temporary
|
|
140
|
+
worktrees. Used by `work_worktree.py` and `spawn/api.py`.
|
|
141
|
+
|
|
142
|
+
**Key contracts:**
|
|
143
|
+
|
|
144
|
+
`ensure_work_item_worktree()` is idempotent — calling twice returns `already_available`
|
|
145
|
+
on the second call. Once managed metadata (repo_path + name) is persisted, subsequent
|
|
146
|
+
calls reuse it regardless of `--repo` or cwd. Accepts dry-run mode and `allow_missing_dry_run`
|
|
147
|
+
for work items that don't exist yet. Returns `WorktreeEnsureResult` with status, metadata,
|
|
148
|
+
repo_root, canonical_path, and optional warning.
|
|
149
|
+
|
|
150
|
+
`ensure_temporary_worktree()` provides session-scoped isolation keyed by spawn_id/chat_id
|
|
151
|
+
(via `_temporary_key(ctx)` → `worktree-temp/` store). Uses same pending/rollback discipline:
|
|
152
|
+
set pending before git, clear on failure, upgrade to ready on success.
|
|
153
|
+
|
|
154
|
+
`get_temporary_worktree_status()` is read-only; heals pending-but-dir-exists records.
|
|
155
|
+
|
|
156
|
+
Repo resolution (`_resolve_target_repo()`, `_resolve_repo_root()`) supports path selectors,
|
|
157
|
+
workspace aliases, and cwd-based inference. Dry-run mode uses `.git` marker scanning
|
|
158
|
+
without running git commands.
|
|
159
|
+
|
|
160
|
+
Managed path policy: `_canonical_target()` derives `<repo>.worktrees/<name>`. Non-canonical
|
|
161
|
+
paths are detected as drift and fail clearly.
|
|
162
|
+
|
|
163
|
+
### ops/work_worktree.py — Work Worktree Command Orchestration
|
|
164
|
+
|
|
165
|
+
`work_worktree.py` orchestrates `meridian work worktree` command logic. Accepts
|
|
166
|
+
`WorkWorktreeInput` (work_id, ensure, repo, chat_id, project_root), returns
|
|
167
|
+
`WorkWorktreeOutput` with worktree path, branch, name, repo_root, managed status,
|
|
168
|
+
exists flag, temporary flag, ensured flag, message, and warning.
|
|
169
|
+
|
|
170
|
+
Routes based on whether a work item is active: calls `ensure_work_item_worktree()`
|
|
171
|
+
if present, else delegates to `ensure_temporary_worktree()`. When `ensure=False`,
|
|
172
|
+
returns status-only response (no-op) if path already exists. When work_id is empty
|
|
173
|
+
and no active work item, uses temporary worktree path.
|
|
174
|
+
|
|
127
175
|
## Contracts
|
|
128
176
|
|
|
129
177
|
### OperationRuntime
|
|
@@ -166,6 +166,8 @@ from meridian.lib.ops.work_lifecycle import (
|
|
|
166
166
|
WorkSwitchOutput,
|
|
167
167
|
WorkUpdateInput,
|
|
168
168
|
WorkUpdateOutput,
|
|
169
|
+
WorkWorktreeInput,
|
|
170
|
+
WorkWorktreeOutput,
|
|
169
171
|
work_clear,
|
|
170
172
|
work_clear_sync,
|
|
171
173
|
work_clear_worktree,
|
|
@@ -186,6 +188,8 @@ from meridian.lib.ops.work_lifecycle import (
|
|
|
186
188
|
work_switch_sync,
|
|
187
189
|
work_update,
|
|
188
190
|
work_update_sync,
|
|
191
|
+
work_worktree,
|
|
192
|
+
work_worktree_sync,
|
|
189
193
|
)
|
|
190
194
|
from meridian.lib.ops.workspace import (
|
|
191
195
|
WorkspaceInitInput,
|
|
@@ -569,6 +573,19 @@ _OP_SPECS: tuple[ExtensionCommandSpec, ...] = (
|
|
|
569
573
|
agent_default_format="text",
|
|
570
574
|
surfaces=frozenset({ExtensionSurface.CLI, ExtensionSurface.HTTP}),
|
|
571
575
|
),
|
|
576
|
+
ExtensionCommandSpec.from_op(
|
|
577
|
+
extension_id="meridian.work",
|
|
578
|
+
command_id="worktree",
|
|
579
|
+
summary="Show or ensure worktree state for an active or explicit work item.",
|
|
580
|
+
handler=work_worktree,
|
|
581
|
+
sync_handler=work_worktree_sync,
|
|
582
|
+
input_type=WorkWorktreeInput,
|
|
583
|
+
output_type=WorkWorktreeOutput,
|
|
584
|
+
cli_group="work",
|
|
585
|
+
cli_name="worktree",
|
|
586
|
+
agent_default_format="text",
|
|
587
|
+
surfaces=frozenset({ExtensionSurface.CLI, ExtensionSurface.HTTP}),
|
|
588
|
+
),
|
|
572
589
|
ExtensionCommandSpec.from_op(
|
|
573
590
|
extension_id="meridian.work",
|
|
574
591
|
command_id="set-worktree",
|
|
@@ -126,6 +126,7 @@ class ResolvedRoots:
|
|
|
126
126
|
project_root: Path
|
|
127
127
|
project_state_dir: Path
|
|
128
128
|
runtime_root: Path
|
|
129
|
+
execution_cwd: Path
|
|
129
130
|
|
|
130
131
|
|
|
131
132
|
def runtime_context(ctx: RuntimeContext | None) -> RuntimeContext:
|
|
@@ -361,6 +362,7 @@ def resolve_roots(project_root: str | None) -> ResolvedRoots:
|
|
|
361
362
|
project_root=authority.project_root,
|
|
362
363
|
project_state_dir=authority.project_state_dir,
|
|
363
364
|
runtime_root=authority.runtime_root,
|
|
365
|
+
execution_cwd=authority.execution_cwd,
|
|
364
366
|
)
|
|
365
367
|
|
|
366
368
|
|
|
@@ -370,6 +372,7 @@ def resolve_roots_for_read(project_root: str | None) -> ResolvedRoots:
|
|
|
370
372
|
project_root=authority.project_root,
|
|
371
373
|
project_state_dir=authority.project_state_dir,
|
|
372
374
|
runtime_root=authority.runtime_root or authority.project_state_dir,
|
|
375
|
+
execution_cwd=authority.execution_cwd,
|
|
373
376
|
)
|
|
374
377
|
|
|
375
378
|
|
|
@@ -19,6 +19,7 @@ from meridian.lib.core.spawn_lifecycle import ACTIVE_SPAWN_STATUSES, is_active_s
|
|
|
19
19
|
from meridian.lib.core.spawn_service import CancelOutcome
|
|
20
20
|
from meridian.lib.core.telemetry import register_debug_trace_observer
|
|
21
21
|
from meridian.lib.core.types import SpawnId
|
|
22
|
+
from meridian.lib.launch.cwd import TaskCwdResolution
|
|
22
23
|
from meridian.lib.launch.request import SessionRequest
|
|
23
24
|
from meridian.lib.ops.reference import ResolvedSessionReference, resolve_session_reference
|
|
24
25
|
from meridian.lib.ops.runtime import (
|
|
@@ -33,6 +34,8 @@ from meridian.lib.ops.runtime import (
|
|
|
33
34
|
resolve_runtime_root_for_read,
|
|
34
35
|
runtime_context,
|
|
35
36
|
)
|
|
37
|
+
from meridian.lib.ops.work_attachment import ensure_explicit_work_item
|
|
38
|
+
from meridian.lib.ops.worktree_ensure import ensure_work_item_worktree
|
|
36
39
|
from meridian.lib.state import session_store, spawn_store, work_store
|
|
37
40
|
from meridian.lib.state.paths import resolve_project_paths
|
|
38
41
|
from meridian.lib.state.primary_meta import (
|
|
@@ -247,6 +250,30 @@ def _merge_warnings(*warnings: str | None) -> str | None:
|
|
|
247
250
|
return " ".join(merged)
|
|
248
251
|
|
|
249
252
|
|
|
253
|
+
def _resolve_selected_work_item(
|
|
254
|
+
*,
|
|
255
|
+
payload_work: str,
|
|
256
|
+
context: RuntimeContext,
|
|
257
|
+
runtime_root: Path,
|
|
258
|
+
) -> str | None:
|
|
259
|
+
explicit_work_id = payload_work.strip() or None
|
|
260
|
+
if explicit_work_id is not None:
|
|
261
|
+
return explicit_work_id
|
|
262
|
+
|
|
263
|
+
ambient_work_id = (context.work_id or "").strip() or None
|
|
264
|
+
if ambient_work_id is not None:
|
|
265
|
+
return ambient_work_id
|
|
266
|
+
|
|
267
|
+
chat_id = (context.chat_id or "").strip()
|
|
268
|
+
if not chat_id:
|
|
269
|
+
return None
|
|
270
|
+
try:
|
|
271
|
+
active_work_id = session_store.get_session_active_work_id(runtime_root, chat_id) or ""
|
|
272
|
+
return active_work_id.strip() or None
|
|
273
|
+
except Exception:
|
|
274
|
+
return None
|
|
275
|
+
|
|
276
|
+
|
|
250
277
|
def spawn_create_sync(
|
|
251
278
|
payload: SpawnCreateInput,
|
|
252
279
|
ctx: RuntimeContext | None = None,
|
|
@@ -290,11 +317,57 @@ def spawn_create_sync(
|
|
|
290
317
|
work_id=payload.work,
|
|
291
318
|
)
|
|
292
319
|
payload = payload.model_copy(update={"work": resolved_work_id})
|
|
293
|
-
if not work_exists:
|
|
320
|
+
if not work_exists and payload.worktree is not True:
|
|
294
321
|
dry_run_work_warning = (
|
|
295
322
|
f"Work item '{resolved_work_id}' does not exist. "
|
|
296
323
|
"Dry-run leaves state unchanged; it would be created on launch."
|
|
297
324
|
)
|
|
325
|
+
ensure_warning: str | None = None
|
|
326
|
+
forced_task_cwd_resolution: TaskCwdResolution | None = None
|
|
327
|
+
if payload.worktree is True:
|
|
328
|
+
resolved_runtime_root = (
|
|
329
|
+
_runtime_root_from_prepared_for_read(
|
|
330
|
+
prepared_context,
|
|
331
|
+
project_root=resolved_root,
|
|
332
|
+
)
|
|
333
|
+
if prepared_context is not None
|
|
334
|
+
else (
|
|
335
|
+
authority.runtime_root
|
|
336
|
+
if authority.runtime_root is not None
|
|
337
|
+
else resolve_runtime_root_for_read(resolved_root)
|
|
338
|
+
)
|
|
339
|
+
)
|
|
340
|
+
selected_work_id = _resolve_selected_work_item(
|
|
341
|
+
payload_work=payload.work,
|
|
342
|
+
context=resolved_context,
|
|
343
|
+
runtime_root=resolved_runtime_root,
|
|
344
|
+
)
|
|
345
|
+
if selected_work_id is not None:
|
|
346
|
+
project_state_dir = resolve_project_paths(resolved_root).root_dir
|
|
347
|
+
explicit_work_requested = bool(payload.work.strip())
|
|
348
|
+
if explicit_work_requested and not payload.dry_run:
|
|
349
|
+
selected_work_id = ensure_explicit_work_item(
|
|
350
|
+
project_state_dir,
|
|
351
|
+
selected_work_id,
|
|
352
|
+
)
|
|
353
|
+
payload = payload.model_copy(update={"work": selected_work_id})
|
|
354
|
+
ensured = ensure_work_item_worktree(
|
|
355
|
+
project_root=resolved_root,
|
|
356
|
+
project_state_dir=project_state_dir,
|
|
357
|
+
work_id=selected_work_id,
|
|
358
|
+
target_repo=payload.repo,
|
|
359
|
+
execution_cwd=authority.execution_cwd,
|
|
360
|
+
dry_run=payload.dry_run,
|
|
361
|
+
allow_missing_dry_run=explicit_work_requested,
|
|
362
|
+
)
|
|
363
|
+
ensure_warning = ensured.warning
|
|
364
|
+
if payload.dry_run:
|
|
365
|
+
forced_task_cwd_resolution = TaskCwdResolution(
|
|
366
|
+
task_cwd=ensured.worktree_path,
|
|
367
|
+
source="forced-worktree",
|
|
368
|
+
work_item=selected_work_id,
|
|
369
|
+
)
|
|
370
|
+
preflight_warning = _merge_warnings(preflight_warning, ensure_warning)
|
|
298
371
|
|
|
299
372
|
runtime = None
|
|
300
373
|
if not payload.dry_run:
|
|
@@ -322,6 +395,7 @@ def spawn_create_sync(
|
|
|
322
395
|
runtime=runtime,
|
|
323
396
|
preflight_warning=preflight_warning,
|
|
324
397
|
ctx=resolved_context,
|
|
398
|
+
forced_task_cwd_resolution=forced_task_cwd_resolution,
|
|
325
399
|
)
|
|
326
400
|
forked_from = _forked_from_output(payload)
|
|
327
401
|
if payload.dry_run:
|
|
@@ -1528,6 +1602,7 @@ def _build_fork_create_input(
|
|
|
1528
1602
|
inherited_skills: tuple[str, ...],
|
|
1529
1603
|
requested_work: str,
|
|
1530
1604
|
requested_worktree: bool | None,
|
|
1605
|
+
requested_repo: str | None,
|
|
1531
1606
|
requested_goal: str | None,
|
|
1532
1607
|
harness: str | None,
|
|
1533
1608
|
) -> SpawnCreateInput:
|
|
@@ -1543,6 +1618,7 @@ def _build_fork_create_input(
|
|
|
1543
1618
|
desc=payload.desc,
|
|
1544
1619
|
work=requested_work or (resolved_reference.source_work_id or ""),
|
|
1545
1620
|
worktree=requested_worktree,
|
|
1621
|
+
repo=requested_repo,
|
|
1546
1622
|
goal=requested_goal,
|
|
1547
1623
|
session=SessionRequest(
|
|
1548
1624
|
requested_harness_session_id=resolved_reference.harness_session_id,
|
|
@@ -1609,6 +1685,7 @@ def spawn_fork_sync(
|
|
|
1609
1685
|
requested_agent = (payload.agent or "").strip() or None
|
|
1610
1686
|
requested_work = payload.work.strip()
|
|
1611
1687
|
requested_worktree = payload.worktree
|
|
1688
|
+
requested_repo = payload.repo
|
|
1612
1689
|
requested_goal = payload.goal
|
|
1613
1690
|
if requested_goal is None and _looks_like_spawn_ref(normalized_source_ref):
|
|
1614
1691
|
source_row = read_spawn_row(
|
|
@@ -1636,6 +1713,7 @@ def spawn_fork_sync(
|
|
|
1636
1713
|
inherited_skills=inherited_skills,
|
|
1637
1714
|
requested_work=requested_work,
|
|
1638
1715
|
requested_worktree=requested_worktree,
|
|
1716
|
+
requested_repo=requested_repo,
|
|
1639
1717
|
requested_goal=requested_goal,
|
|
1640
1718
|
harness=requested_harness,
|
|
1641
1719
|
)
|
|
@@ -1721,6 +1799,7 @@ def spawn_continue_sync(
|
|
|
1721
1799
|
desc=payload.desc,
|
|
1722
1800
|
work=payload.work,
|
|
1723
1801
|
worktree=payload.worktree,
|
|
1802
|
+
repo=payload.repo,
|
|
1724
1803
|
session=SessionRequest(
|
|
1725
1804
|
requested_harness_session_id=resolved_reference.harness_session_id,
|
|
1726
1805
|
continue_harness=resolved_reference.harness,
|
|
@@ -123,6 +123,7 @@ class SpawnCreateInput(SpawnLaunchOptions):
|
|
|
123
123
|
desc: str = ""
|
|
124
124
|
work: str = ""
|
|
125
125
|
worktree: bool | None = None
|
|
126
|
+
repo: str | None = None
|
|
126
127
|
session: SessionRequest = SessionRequest()
|
|
127
128
|
|
|
128
129
|
@field_validator("goal", mode="before")
|
|
@@ -1051,6 +1052,7 @@ class SpawnContinueInput(SpawnLaunchOptions):
|
|
|
1051
1052
|
desc: str = ""
|
|
1052
1053
|
work: str = ""
|
|
1053
1054
|
worktree: bool | None = None
|
|
1055
|
+
repo: str | None = None
|
|
1054
1056
|
fork: bool = False
|
|
1055
1057
|
|
|
1056
1058
|
@field_validator("goal", mode="before")
|
|
@@ -1074,6 +1076,7 @@ class SpawnForkInput(SpawnLaunchOptions):
|
|
|
1074
1076
|
desc: str = ""
|
|
1075
1077
|
work: str = ""
|
|
1076
1078
|
worktree: bool | None = None
|
|
1079
|
+
repo: str | None = None
|
|
1077
1080
|
|
|
1078
1081
|
@field_validator("goal", mode="before")
|
|
1079
1082
|
@classmethod
|