)]}'
{
  "commit": "def7665b6fe75f850b4e02260782101d736dbca2",
  "tree": "371f9ec9be399fd7af6bed8d344cd2813b641a9f",
  "parents": [
    "c6b13b1b9b74dfea7ce49c2e952f8ae762f30d14"
  ],
  "author": {
    "name": "Nasser Grainawi",
    "email": "nasser.grainawi@oss.qualcomm.com",
    "time": "Thu May 21 14:51:09 2026 -0700"
  },
  "committer": {
    "name": "Nasser Grainawi",
    "email": "nasser.grainawi@oss.qualcomm.com",
    "time": "Tue Aug 11 16:31:04 2026 -0700"
  },
  "message": "Add task plugin as an extension\n\nAdds tools and skills for the task plugin into the extension framework\nas a sibling package. `register()` wires up the tools `get_task_tree`\nand `get_actionable_tasks` via `@requires_plugin(\"task\")` so they\nauto-route to hosts with the task plugin or raise a RuntimeError when\nno host has it.\n\nBoth tools return a TypedDict (`_TaskTreeResult`,\n`_ActionableTasksResult`) so the MCP SDK auto-generates an output_schema\nand emits structured content alongside the text fallback. Error paths\nraise exceptions rather than returning text/JSON-string error payloads.\n\nWire the sibling package into the build via a uv workspace: declare\n`gerrit_mcp_server_task` as a workspace member and add it to the core\nproject\u0027s dependencies. Listing it as a plain dependency (rather than\nrelying on `uv sync --all-packages`) is what guarantees a plain\n`uv sync` installs it, so its `gerrit_mcp_server.extensions` entry\npoint is discovered at startup and survives the `uv run` launch path.\nThe `gerrit-mcp-server \u003d { workspace \u003d true }` source is required for\nthe member to resolve its own dependency on the core package.\n\nUpdate the build-and-run integration test to copy the new sibling\npackage into its clean-build temp dir; without it the workspace build\nfails on the missing member.\n\nIncludes a gerrit-task-query skill and 15 unit tests covering\n`_find_actionable` traversal and both registered tools.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I8c1bc9745962dbc7b355a1cb1220ffb07a141533\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6c12f9e528a2bff76073850489ac4ac265684c32",
      "old_mode": 33188,
      "old_path": ".claude/skills/writing-extensions/SKILL.md",
      "new_id": "fff8d8362e61a22e2493ad744d7394983831b103",
      "new_mode": 33188,
      "new_path": ".claude/skills/writing-extensions/SKILL.md"
    },
    {
      "type": "modify",
      "old_id": "4ecf485d96471a7ff8110d13b07dc5c853b9a626",
      "old_mode": 33188,
      "old_path": ".gitignore",
      "new_id": "9ece6156795326dfeeece4a1f0600b5d413d61ec",
      "new_mode": 33188,
      "new_path": ".gitignore"
    },
    {
      "type": "modify",
      "old_id": "7f11539bd336dcf2e16d7d1e191f3753f601cb8b",
      "old_mode": 33188,
      "old_path": "docs/available_tools.md",
      "new_id": "6bb75a5dd4a1e6cb792c2ed58acaa3798459b40b",
      "new_mode": 33188,
      "new_path": "docs/available_tools.md"
    },
    {
      "type": "modify",
      "old_id": "2eaa414f855b814e60514ac61342a04c04d76f91",
      "old_mode": 33188,
      "old_path": "docs/extensions.md",
      "new_id": "9f0880e870b3338fe34540ad8131267056e94e15",
      "new_mode": 33188,
      "new_path": "docs/extensions.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_task/__init__.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dc66e7d0f15ecd9d8de8ba74351412fa931b1253",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_task/extension.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "65ca276bc9e8f9a79f11e1a0c4cb8552438ce087",
      "new_mode": 33188,
      "new_path": "gerrit_mcp_server_task/pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "ed09778c6eab994d31eb45ebf12200c8baea9af4",
      "old_mode": 33188,
      "old_path": "pyproject.toml",
      "new_id": "c50386c15ef4b24c275fa6eb80584f11d62d2f42",
      "new_mode": 33188,
      "new_path": "pyproject.toml"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "18ae6563453da90763ee57a43bdced69292d5051",
      "new_mode": 33188,
      "new_path": "skills/gerrit-task-query/SKILL.md"
    },
    {
      "type": "modify",
      "old_id": "1ecf68cf4f0fadedf6489edf5ea03a11bc7659e8",
      "old_mode": 33188,
      "old_path": "tests/integration/test_build_and_run.py",
      "new_id": "7a10b030a483ed6408d9f09b72bf7ab32789ce35",
      "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": "4df4b7122c419f136c6b6b994f34ddd7554d7c7a",
      "new_mode": 33188,
      "new_path": "tests/unit/test_task_extension.py"
    },
    {
      "type": "modify",
      "old_id": "be2a788f4599d764a058f3750c8006386cba856c",
      "old_mode": 33188,
      "old_path": "uv.lock",
      "new_id": "d95be9bad0c9a5b96776d5658fef752abee6b94a",
      "new_mode": 33188,
      "new_path": "uv.lock"
    }
  ]
}
