)]}'
{
  "commit": "da6ae7b64c6f4e643754454a8a546bc82882f240",
  "tree": "7bbab1c4bd4c6d916ac5306844a9ef8801a6c09c",
  "parents": [
    "0f96c199e485b848b611466452ae6c14dd9578ac"
  ],
  "author": {
    "name": "Nasser Grainawi",
    "email": "nasser.grainawi@oss.qualcomm.com",
    "time": "Fri Jun 26 10:16:11 2026 -0700"
  },
  "committer": {
    "name": "Nasser Grainawi",
    "email": "nasser.grainawi@oss.qualcomm.com",
    "time": "Tue Aug 11 17:18:09 2026 -0700"
  },
  "message": "Add code-owners plugin as an extension\n\nAdds a new sibling package `gerrit_mcp_server_code_owners` wrapping the\nGerrit code-owners plugin REST API. `register()` wires up three tools,\nall gated via `@requires_plugin(\"code-owners\")`:\n\n- `get_code_owner_status`: per-file ownership status for a change\n  (APPROVED/PENDING/INSUFFICIENT_REVIEWERS), with pagination via\n  `limit` and `start`.\n- `get_code_owners_for_path`: suggested owners for a specific path in a\n  change revision, filtered and ranked by the plugin (current reviewers\n  ranked higher, change owner and service users excluded).\n- `check_code_owner`: checks code ownership for a path in a branch,\n  returning ownership kind (global/default/fallback) and optional\n  change-level permissions when `change_id` is supplied.\n\nAll tools return typed TypedDicts so the MCP SDK auto-generates an\noutput_schema and emits both structured and unstructured content. Error\npaths raise exceptions rather than returning text error payloads.\n\nIncludes 23 unit tests and updates docs/available_tools.md.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ibf1ec8a491c18a39f20c0f294abc818b9ad055bf\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "dc42429fd067f32a539bd25f34b8761054d15bac",
      "old_mode": 33188,
      "old_path": "docs/available_tools.md",
      "new_id": "53fcdd29d8a3ab09ca9a336e7ffc51fced22d6a6",
      "new_mode": 33188,
      "new_path": "docs/available_tools.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_code_owners/__init__.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "2b9c9fce93f322900b9f4eaeb561037d0256c548",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_code_owners/extension.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "eaf556236e958ae94d70155b60c7ec3c9921e1a6",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_code_owners/pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "c22546f72d0bb74f24d0b4af1087932d72ca4cd0",
      "old_mode": 33188,
      "old_path": "pyproject.toml",
      "new_id": "a6fabac6c74ebeeafa726e196008644d78d58394",
      "new_mode": 33188,
      "new_path": "pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "e36f558ed8103ec4e9f3a7d64610740ec9924e19",
      "old_mode": 33188,
      "old_path": "tests/integration/test_build_and_run.py",
      "new_id": "cad340a6470ecda0e7e0971ee3ce07a8a6ba33db",
      "new_mode": 33188,
      "new_path": "tests/integration/test_build_and_run.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "0f5d941e1502de4cccf4cbc258d98b757e701133",
      "new_mode": 33188,
      "new_path": "tests/unit/test_code_owners_extension.py"
    },
    {
      "type": "modify",
      "old_id": "d6ae7b6c9eaf67912ffbaa61348c2596b6d6527a",
      "old_mode": 33188,
      "old_path": "uv.lock",
      "new_id": "e6efd0c2658dca7a869bb939d3e35cb646801d27",
      "new_mode": 33188,
      "new_path": "uv.lock"
    }
  ]
}
