Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.ht

## [Unreleased]

## [0.10.7] - 2026-07-07
### Changed
- Expanded default `mco doctor` checks to all eight supported providers, including explicit opt-in Copilot, Hermes, and Pi.
- Kept `mco run` and `mco review` default provider set at the audited five built-ins.

## [0.10.6] - 2026-06-28
### Added
- Added per-provider context policy with `--provider-context-json`, including explicit skills/context/plugin controls where supported.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ The question isn't "which AI agent is best" — it's "why limit yourself to one?
| OpenCode | `opencode` | Supported |
| Qwen Code | `qwen` | Supported |

These five providers are the default set for `mco run`, `mco review`, and `mco doctor`.
These five providers are the default set for `mco run` and `mco review`. `mco doctor` checks all eight supported providers by default.

## Explicit Opt-in Providers

Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ MCO 设计为被任意编排方 Agent 或 AI IDE 调用 — Claude Code、Cursor
| OpenCode | `opencode` | 已支持 |
| Qwen Code | `qwen` | 已支持 |

这五个 provider 是 `mco run``mco review` `mco doctor` 的默认集合
这五个 provider 是 `mco run``mco review` 的默认集合。`mco doctor` 默认检查全部八个受支持的 provider

## 显式选择的 Provider

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@tt-a1i/mco",
"version": "0.10.6",
"version": "0.10.7",
"description": "Node wrapper for the mco CLI (Python runtime required).",
"license": "MIT",
"bin": {
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "mco"
version = "0.10.6"
version = "0.10.7"
description = "Neutral multi-provider CLI orchestrator for agent-style run/review workflows."
readme = "README.md"
requires-python = ">=3.10"
Expand Down
2 changes: 1 addition & 1 deletion runtime/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
from .artifacts import ARTIFACT_LAYOUT_VERSION
from .types import RUN_RESULT_SCHEMA_VERSION

__version__ = "0.10.6"
__version__ = "0.10.7"

__all__ = ["ARTIFACT_LAYOUT_VERSION", "RUN_RESULT_SCHEMA_VERSION", "__version__"]
5 changes: 3 additions & 2 deletions runtime/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

SUPPORTED_PROVIDERS = ("claude", "codex", "copilot", "gemini", "hermes", "opencode", "pi", "qwen")
SUPPORTED_PROVIDER_LIST = ",".join(SUPPORTED_PROVIDERS)
DEFAULT_DOCTOR_PROVIDERS = SUPPORTED_PROVIDERS
DEFAULT_CONFIG = ReviewConfig()
DEFAULT_POLICY = DEFAULT_CONFIG.policy

Expand Down Expand Up @@ -1070,7 +1071,7 @@ def build_parser() -> argparse.ArgumentParser:
)
doctor.add_argument(
"--providers",
default=",".join(DEFAULT_CONFIG.providers),
default=",".join(DEFAULT_DOCTOR_PROVIDERS),
help="Comma-separated providers. Supported: {}".format(SUPPORTED_PROVIDER_LIST),
)
doctor.add_argument("--json", action="store_true", help="Print machine-readable JSON output")
Expand Down Expand Up @@ -1727,7 +1728,7 @@ def _capture_parse_error(message: str) -> None:
print(err_event, flush=True)
return int(exc.code) if isinstance(exc.code, int) else 2
if args.command == "doctor":
providers_str = getattr(args, "providers", ",".join(DEFAULT_CONFIG.providers))
providers_str = getattr(args, "providers", ",".join(DEFAULT_DOCTOR_PROVIDERS))
providers = [item for item in _parse_providers(providers_str) if item in SUPPORTED_PROVIDERS]
if not providers:
print("No valid providers selected.", file=sys.stderr)
Expand Down
6 changes: 2 additions & 4 deletions runtime/mcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ def _validate_repo(repo: str, require_git: bool = False) -> Optional[Dict[str, A

def _sync_doctor(providers_csv: Optional[str]) -> Dict[str, Any]:
"""Check provider installation and auth status."""
from .cli import _doctor_provider_presence, SUPPORTED_PROVIDERS
from .config import ReviewConfig
from .cli import DEFAULT_DOCTOR_PROVIDERS, _doctor_provider_presence, SUPPORTED_PROVIDERS

if providers_csv:
providers = [p.strip() for p in providers_csv.split(",") if p.strip()]
Expand All @@ -59,8 +58,7 @@ def _sync_doctor(providers_csv: Optional[str]) -> Dict[str, Any]:
return _err("invalid_providers", "No valid providers in: {}".format(providers_csv))
providers = valid
else:
# Use the same safe default as CLI doctor (ReviewConfig built-in 5).
providers = list(ReviewConfig().providers)
providers = list(DEFAULT_DOCTOR_PROVIDERS)

presence_map = _doctor_provider_presence(providers)

Expand Down
4 changes: 2 additions & 2 deletions tests/test_cli_doctor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from contextlib import redirect_stderr, redirect_stdout
from unittest.mock import patch

from runtime.cli import build_parser, main
from runtime.cli import SUPPORTED_PROVIDER_LIST, build_parser, main
from runtime.contracts import ProviderPresence


Expand All @@ -15,7 +15,7 @@ def test_parser_accepts_doctor_subcommand(self) -> None:
parser = build_parser()
args = parser.parse_args(["doctor"])
self.assertEqual(args.command, "doctor")
self.assertEqual(args.providers, "claude,codex,gemini,opencode,qwen")
self.assertEqual(args.providers, SUPPORTED_PROVIDER_LIST)
self.assertFalse(args.json)

def test_doctor_json_payload_contract(self) -> None:
Expand Down
11 changes: 4 additions & 7 deletions tests/test_mcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import unittest
from unittest.mock import patch, MagicMock

from runtime.cli import SUPPORTED_PROVIDERS
from runtime.mcp_server import (
_ok, _err, _is_git_repo, _validate_repo,
_sync_doctor, _sync_review, _sync_run,
Expand Down Expand Up @@ -80,17 +81,13 @@ def test_invalid_provider_returns_error(self) -> None:
self.assertEqual(result["error"]["code"], "invalid_providers")

@patch("runtime.cli._doctor_provider_presence")
def test_default_providers_are_builtin_five(self, mock_presence) -> None:
"""Default doctor (no providers arg) checks exactly the 5 built-in providers."""
def test_default_providers_include_opt_in(self, mock_presence) -> None:
"""Default doctor (no providers arg) checks all supported built-in providers."""
mock_presence.return_value = {}
result = _sync_doctor(None)
self.assertTrue(result["ok"])
called_providers = mock_presence.call_args[0][0]
self.assertEqual(
called_providers,
["claude", "codex", "gemini", "opencode", "qwen"],
"Default doctor must check only the 5 built-in providers, not hermes/pi",
)
self.assertEqual(called_providers, list(SUPPORTED_PROVIDERS))

@patch("runtime.cli._doctor_provider_presence")
def test_explicit_hermes_pi_allowed(self, mock_presence) -> None:
Expand Down
Loading