)]}'
{
  "log": [
    {
      "commit": "9f871dc769372c8c1543fec1633c1cf9f8a5f229",
      "tree": "c8c98c4bfec5eafa5006ad86c919876be8b48bdb",
      "parents": [
        "905db6f5ee70588ba6db11254f1728928d1a287f",
        "70ba05fe22864a7dd7723afcde09913779141a56"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Oct 19 03:17:59 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Oct 19 03:17:59 2026 -0700"
      },
      "message": "Merge \"List and delete drafts on every patch set\""
    },
    {
      "commit": "905db6f5ee70588ba6db11254f1728928d1a287f",
      "tree": "7e077c085ebe31e19b5d722a58206fb07ca3114f",
      "parents": [
        "cd7513c6df4633fabb85b6b19dff24b9b4f0792b",
        "e2984ab7e552d51b087fa3aaea89af98318b88cb"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Wed Oct 14 14:06:17 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Oct 14 14:06:17 2026 -0700"
      },
      "message": "Merge changes I8de65b45,Ia9f02ac9\n\n* changes:\n  Add full_messages to get_change_details\n  Add get_file_content tool\n"
    },
    {
      "commit": "cd7513c6df4633fabb85b6b19dff24b9b4f0792b",
      "tree": "220351c31f6334eb175ee405437ef05ac2b5330d",
      "parents": [
        "5a7ff4ff3673b6fe59affffdb3c5c3fe9c4118be",
        "e9ce215a1e39784a0a7b828e788700b53ec55045"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Oct 13 16:04:44 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Oct 13 16:04:44 2026 -0700"
      },
      "message": "Merge \"Test Claude Code plugin artifacts\""
    },
    {
      "commit": "70ba05fe22864a7dd7723afcde09913779141a56",
      "tree": "94d13f3eb0bda6913e50b22302457dbbab4e9545",
      "parents": [
        "e2984ab7e552d51b087fa3aaea89af98318b88cb"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Sep 23 21:57:54 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Oct 07 13:46:33 2026 +0300"
      },
      "message": "List and delete drafts on every patch set\n\nThe draft tools read and deleted drafts on the current revision only,\nso a draft left on an earlier patch set was invisible to\nlist_draft_comments and could not be deleted by delete_draft_comment\nor delete_draft_comments. After a push, the drafts left on the\nprevious patch set looked as if the push had dropped them. The tools\nread the change-level drafts endpoint, which returns the drafts of\nevery patch set, show each draft\u0027s patch set, and delete a draft on\nthe revision it belongs to.\n\nA delete that Gerrit refuses was reported as a success, which hid the\nwrong revision. The delete tools report Gerrit\u0027s answer instead.\n\nThe three tools return typed results and raise ValueError on failure,\nas AGENTS.md asks of every tool. list_draft_comments returns each draft\nwhole, with the comment it replies to, and delete_draft_comments lists\nthe drafts that Gerrit refused to delete.\n\nChange-Id: Ic60d011f652477de8552f34a71612d5ca286030f\n"
    },
    {
      "commit": "e2984ab7e552d51b087fa3aaea89af98318b88cb",
      "tree": "e08f8898233645104db4f1938b75fcf370c39cd3",
      "parents": [
        "a6aadb2c9a28a4ce8126aef861f183db1fdde2aa"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Thu Sep 24 13:13:03 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Oct 07 13:31:01 2026 +0300"
      },
      "message": "Add full_messages to get_change_details\n\nThe summary shows only the first line of the three latest messages, so\nwhat a CI bot writes after its vote line - the build result and the\nlink to the build - never reaches the caller, and an agent has to query\nGerrit around the tool to find which build checked a change.\nfull_messages\u003dTrue returns every message in full; the default output\nis unchanged.\n\nChange-Id: I8de65b452928f9ae9a5eacfe97bf1d3c8664e93b\n"
    },
    {
      "commit": "a6aadb2c9a28a4ce8126aef861f183db1fdde2aa",
      "tree": "c85e7a7f1938d49efb6dd824de40f8de1c115399",
      "parents": [
        "5a7ff4ff3673b6fe59affffdb3c5c3fe9c4118be"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Sep 23 20:18:11 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Oct 07 13:31:01 2026 +0300"
      },
      "message": "Add get_file_content tool\n\nOnly get_file_diff could read a file of a CL, and it frames the file as\na diff, so reading a large file whole meant a manual curl against\n/files/{path}/content. get_file_content returns the decoded file from\nany revision as a typed result: the content, the numbers of its first\nand last line, and the line count of the whole file. It raises\nValueError, with Gerrit\u0027s answer, when the file cannot be fetched, and\nfor a file that is not UTF-8 text.\n\nstart_line and end_line return only a range of lines, for a file too\nlarge to read whole, and a range with no line in the file raises\nValueError. Only a newline ends a line, as in Gerrit, so the line\nnumbers match those of line comments.\n\nChange-Id: Ia9f02ac9c24a3aec5b2def20406523643f049203\n"
    },
    {
      "commit": "5a7ff4ff3673b6fe59affffdb3c5c3fe9c4118be",
      "tree": "7a19a294845b5b9d2d2ce6d7503d69518ab2fd22",
      "parents": [
        "31411368b3ec4fd7946a622fa46694cbf7ae7823"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Sep 23 20:18:11 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Oct 05 12:23:54 2026 +0300"
      },
      "message": "Allow a draft comment without a line\n\npost_draft_comment required line_number, so neither a comment on a\nwhole file nor a patch-set-level comment on /PATCHSET_LEVEL could be\ndrafted, and line 0 is rejected by Gerrit. line_number is now optional\nand left out of the request when omitted, which is how Gerrit tells a\nfile or patch-set comment from a line comment.\n\npost_draft_comment rejects a range that misses one of its four fields.\nDropping such a range silently would put the comment on the whole file\nwhen line_number is omitted. A full range puts the comment on end_line,\nand the success message reports that line.\n\nChange-Id: I280166c1bbab69c74d28b4aad3d47b839236d8ee\n"
    },
    {
      "commit": "31411368b3ec4fd7946a622fa46694cbf7ae7823",
      "tree": "c7a6e9079000ee03b4473df565f2eb834d016ed4",
      "parents": [
        "cc70434540f5fe7ef08bcf1fcc81637c4b77bb77",
        "382915c0bc835e899831bd3f9e3708e1f163f011"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Fri Oct 02 09:16:19 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Oct 02 09:16:19 2026 -0700"
      },
      "message": "Merge \"Keep an explicit http:// scheme for loopback Gerrit hosts\""
    },
    {
      "commit": "e9ce215a1e39784a0a7b828e788700b53ec55045",
      "tree": "56a6488f55aaf70f1c3bed1becd12ae0b4fee14e",
      "parents": [
        "70a4f8f7e72af742a492634099879d305e4d629b"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu Oct 01 17:25:17 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Fri Oct 02 08:52:34 2026 -0700"
      },
      "message": "Test Claude Code plugin artifacts\n\nClaude plugin packaging failures currently surface only when a client\nloads the repository, making regressions difficult to catch in CI.\n\nAdd integration coverage for the Claude manifest, marketplace entry, MCP\nlaunch configuration, skill metadata, and configuration-hook behavior.\nDocument the automated artifact test and the manual Claude Code\nsmoke test without scripting client launches.\n\nChange-Id: If4d8ceb7ae01695656be258cefd34b17bb79f3c6\n"
    },
    {
      "commit": "cc70434540f5fe7ef08bcf1fcc81637c4b77bb77",
      "tree": "c9307ee3f363b0c5558a57e5fc43390ab215436c",
      "parents": [
        "70a4f8f7e72af742a492634099879d305e4d629b",
        "7adb8c7de714cfee971a1b6de67374cb55cca1a2"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Fri Oct 02 02:20:23 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Fri Oct 02 02:20:23 2026 -0700"
      },
      "message": "Merge changes I4e5740b1,I5b4629b2\n\n* changes:\n  Report the current patch set in get_change_details\n  Redact credentials from server.log\n"
    },
    {
      "commit": "382915c0bc835e899831bd3f9e3708e1f163f011",
      "tree": "9b569db2b29fd98f6803a3d0212fb6e26e1344bc",
      "parents": [
        "70a4f8f7e72af742a492634099879d305e4d629b"
      ],
      "author": {
        "name": "Jacek Centkowski",
        "email": "geminica.programs@gmail.com",
        "time": "Wed Sep 30 10:11:07 2026 +0200"
      },
      "committer": {
        "name": "Jacek Centkowski",
        "email": "geminica.programs@gmail.com",
        "time": "Wed Sep 30 11:02:15 2026 +0200"
      },
      "message": "Keep an explicit http:// scheme for loopback Gerrit hosts\n\n_normalize_gerrit_url() rewrote every http:// URL to https://, so a\nGerrit running on the developer\u0027s machine over plain HTTP (a local\ndocker instance or a test fixture on localhost) could not be used even\nwhen gerrit_config.json declared it with \"external_url\": \"http://...\":\nevery request failed with \"curl: (35) ... tlsv1 alert protocol version\".\n\nKeep http:// only when the host is a loopback address (localhost,\n127.0.0.0/8, ::1, 0.0.0.0); every other http:// URL is still rewritten\nto https:// so credentials never travel in cleartext to a remote host,\nand bare hostnames still default to https.\n\nAdd unit tests for the loopback spellings and for a remote http:// host,\nand document the rule next to external_url in docs/configuration.md.\n\nChange-Id: I270dc27ed4129973b2a2acfad635c8188c552fd5\n"
    },
    {
      "commit": "7adb8c7de714cfee971a1b6de67374cb55cca1a2",
      "tree": "cf8b092ad2704ede10ae79689646158b574b6849",
      "parents": [
        "970679925b3bf59779776e8e0ff4f59fb92ce147"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Sep 23 20:18:11 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Thu Sep 24 12:29:13 2026 +0300"
      },
      "message": "Report the current patch set in get_change_details\n\nThe summary named the change but not its current revision, so an agent\ncould not tell which patch set to fetch (refs/changes/NN/CL/PS) or\nwhich one a local commit matches without falling back to git\nls-remote. It now prints the current patch set\u0027s number, commit and\nref, and with ALL_REVISIONS the number and commit of every patch set.\n\nChange-Id: I4e5740b117fcfc0b7655997e240b68450ba8099d\n"
    },
    {
      "commit": "970679925b3bf59779776e8e0ff4f59fb92ce147",
      "tree": "b3fdf707e09ddfd1855116e7d775712427cf21e2",
      "parents": [
        "3ce2ed3ec362dc416ef7ac175ca0b7b2e64d5bc0"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Wed Sep 16 22:03:46 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Thu Sep 24 12:29:13 2026 +0300"
      },
      "message": "Redact credentials from server.log\n\nrun_curl logs the full curl command on every request, and the\nhttp_basic authentication command carries the Gerrit HTTP password as\nthe --user value, so every call wrote that password to server.log in\nclear text.\n\nThe authentication layer now returns a CurlAuth, which carries the\ncommand together with the credentials that command puts on it: the\nfunction that builds an authenticated command is the one that knows\nwhich of its arguments are secret, so nothing downstream has to\nrecognise a credential in a flat argument list. CurlAuth masks those\narguments itself, and run_curl logs the masked prefix followed by the\nheaders, URL and payload exactly as sent, so the line stays useful for\ndebugging and nothing outside the credential arguments is replaced.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I5b4629b2c41bb55a43cf6e9525021bbdb8f92705\n"
    },
    {
      "commit": "70a4f8f7e72af742a492634099879d305e4d629b",
      "tree": "f0ab84b0acbd1919016c41e4aecc01001c367939",
      "parents": [
        "3ce2ed3ec362dc416ef7ac175ca0b7b2e64d5bc0"
      ],
      "author": {
        "name": "Hari Jeyamani",
        "email": "hariprak@google.com",
        "time": "Fri Sep 11 17:25:58 2026 +0000"
      },
      "committer": {
        "name": "Hari Jeyamani",
        "email": "hariprak@google.com",
        "time": "Fri Sep 11 11:28:48 2026 -0700"
      },
      "message": "build-gerrit: install uv via pip3 with --require-hashes fallback\n\nUpdate build-gerrit.sh to use pip3 install --require-hashes -r\nrequirements.txt if uv is not pre-installed on PATH. Add\nrequirements.txt containing pinned uv package with SHA-256 hashes for\nfallback installation. This protects users from supply chain attack.\n\nBug: 544134452\nChange-Id: I1516eb480aebe05f2b811f3abf3d6a6f69750b78\n"
    },
    {
      "commit": "3ce2ed3ec362dc416ef7ac175ca0b7b2e64d5bc0",
      "tree": "6a9b6312ef722db3f77748b18782b0dbec128cca",
      "parents": [
        "da6ae7b64c6f4e643754454a8a546bc82882f240"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Fri Jun 05 21:01:56 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Sep 01 16:06:24 2026 -0700"
      },
      "message": "Add Zuul CI configuration for style checks and tests\n\nAdd zuul config files defining a check pipeline that runs ruff style\nchecks, Markdown format checking, and pytest on proposed changes. An\nabstract base job holds the shared uv prep step (using the ensure-uv\nrole), which three child jobs inherit for formatting and test execution.\n\nChange-Id: I313544f12d650d10837a4abd6590c46c20b944fe\n"
    },
    {
      "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"
    },
    {
      "commit": "0f96c199e485b848b611466452ae6c14dd9578ac",
      "tree": "119fffb063e68ea9a963a650d57b8ad6bc88c9d8",
      "parents": [
        "2d2f63d6fb0174d60c4ba4c1c2935bc93bc76bea"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu May 21 16:12:31 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:46:49 2026 -0700"
      },
      "message": "Add depends-on plugin as an extension\n\nAdds tools and skills for the depends-on plugin into the extension\nframework as a sibling package. `register()` wires up the tools\n`get_depends_on` (using the `--depends-on--all` option) and\n`get_dependents` (using the `independson:\u003cchange\u003e` query operator), both\ngated via `@requires_plugin(\"depends-on\")`.\n\nBoth tools return a TypedDict (`_DependsOnResult`, `_DependentsResult`)\nso the MCP SDK auto-generates an output_schema and emits structured\ncontent alongside the text fallback. Error paths raise exceptions rather\nthan returning text/JSON-string error payloads.\n\nIncludes a find-dependencies skill and 11 unit tests covering both\ntools.\n\nCo-Authored-By: Claude Sonnet 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I9ea4161c8dce8b298cb24c88057a1e65a53317b2\n"
    },
    {
      "commit": "2d2f63d6fb0174d60c4ba4c1c2935bc93bc76bea",
      "tree": "8d519eac7241cf633e3cd9675ba83aa0cc497232",
      "parents": [
        "347bc50371251f4e0c193b914a93ee534ba186f6"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon May 04 15:33:59 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:45:55 2026 -0700"
      },
      "message": "Add get_git_parent_changes tool with structured output\n\nAdds a new MCP tool that queries immediate git-parent changes of a given\nchange using Gerrit\u0027s `parentof:` query operator. Useful when navigating\na stack: given a change ID, it surfaces which open Gerrit changes have a\ncommit that is a direct parent of the queried change. Only immediate\nparents are returned; grandparents and higher ancestors are excluded by\ndesign.\n\nReturns a typed _GitParentChangesResult so the MCP SDK auto-generates an\noutput_schema and produces both structured and unstructured text\ncontent. Error paths raise exceptions rather than returning text error\ncontent blocks. This follows the structured-output pattern documented\nin AGENTS.md and the writing-extensions skill.\n\nIncludes tests/unit/test_get_git_parent_changes.py covering success, WIP\nflag, multiple parents, empty result, JSON decode error, and curl\nexception cases.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: I61e8703d6dfb2f5aee2135b3a2d6c0a3bea7bf19\n"
    },
    {
      "commit": "347bc50371251f4e0c193b914a93ee534ba186f6",
      "tree": "d8b453033519244bfddb9525b55882423b1fbd34",
      "parents": [
        "2560f660e197ee55a90bd45793d64fe14d8e92de"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Jun 01 16:17:55 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:44:28 2026 -0700"
      },
      "message": "Add get_revision_commit tool\n\nExposes GET /changes/{change-id}/revisions/{revision-id}/commit so\nagents can retrieve parent SHA(s) for a single revision. This fills the\ngap left by get_commit_message (message only) and query_changes (which\nstrips parent SHAs): with parent SHAs in hand, an agent can call\nquery_changes(\"commit:\u003csha\u003e\") to check whether each parent is merged.\n\nReturns a typed `_RevisionCommitResult` mapping CommitInfo to:\ncommit_sha, author, committer, subject, parents[]{commit_sha, subject},\nand verbatim message. The MCP SDK auto-generates an output_schema from\nthe return annotation and emits both structured and unstructured\ncontent. Error paths raise exceptions rather than returning text error\ncontent blocks.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ia0cd0484d3482b9e586a3ec6f67a47daac4a73c2\n"
    },
    {
      "commit": "2560f660e197ee55a90bd45793d64fe14d8e92de",
      "tree": "b4379860618d679fbb567106ffde6fea23eb69af",
      "parents": [
        "def7665b6fe75f850b4e02260782101d736dbca2"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Jun 01 16:11:48 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:43:08 2026 -0700"
      },
      "message": "Add get_related_changes tool\n\nExposes Gerrit\u0027s relation-chain endpoint\n(GET /changes/{id}/revisions/{rev}/related) so agents can inspect the\nfull git-parent chain and per-ancestor merge status in a single call.\n\nComplements changes_submitted_together (submit groups) and\nget_depends_on (explicit footers) by covering the implicit git-parent\ndimension needed to diagnose \"git dependencies need to be fixed\"\nfailures.\n\nReturns a typed `_RelatedChangesResult` 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 content blocks.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: If152aa77be8dc2f8436b2dec502cd5caad9fc9de\n"
    },
    {
      "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"
    },
    {
      "commit": "c6b13b1b9b74dfea7ce49c2e952f8ae762f30d14",
      "tree": "73601ad6071243dc258ec2b9a9be2ea2783098c3",
      "parents": [
        "6fc7384bba2d8ecab7fbfa53e8fb5aef737aecd8"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu May 21 14:50:58 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:31:04 2026 -0700"
      },
      "message": "Add writing-extensions skill for the extension framework\n\nDocuments the ExtensionContext API, register(ctx) contract, tool\nregistration, requires_plugin gating, entry-point declaration,\nstructured return-type pattern, and test patterns so agents can author\nnew in-process extensions without reading internal sources.\n\nThis is a developer-facing skill for extension authors, not for end\nusers of the installed plugin. `.claude/skills/` is the correct home as\nplugin skill.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: Id9f40ca481fdd68bc1961a7e0c0ac1bce705553d\n"
    },
    {
      "commit": "6fc7384bba2d8ecab7fbfa53e8fb5aef737aecd8",
      "tree": "83ea8d24747fd8f8cba74f225374885c596faef0",
      "parents": [
        "545f2ce3a4185aa6fb26469bb07107c5b2d06da0"
      ],
      "author": {
        "name": "Ajay Gupta",
        "email": "ajagup@qti.qualcomm.com",
        "time": "Tue May 05 19:43:24 2026 +0530"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:31:04 2026 -0700"
      },
      "message": "Add extension hook for registering additional MCP tools\n\nLet external code register additional MCP tools without modifying core.\nExtensions provide a module-level `register(ctx)` and are discovered via\nthe `gerrit_mcp_server.extensions` entry-point group or the\n`GERRIT_MCP_EXTENSIONS` env var. Failures are logged and skipped so one\nbroken extension never aborts startup.\n\nExtensionContext exposes a stable API (FastMCP instance, URL\nnormalization, `run_curl`, config loading, `extension_config` for\nnamespaced config). PluginRegistry adds lazy per-host discovery of\ninstalled Gerrit plugins; the `requires_plugin` decorator auto-routes to\na host that has the plugin or raises a RuntimeError when none does. It\nraises (rather than returning a content-block list) so it stays\ncompatible with tools that declare a structured TypedDict return type,\nwhose output is validated against an auto-generated schema.\n\nChange-Id: Ie5011657e04bdddb5836492afe5a7d730a81a7b0\n"
    },
    {
      "commit": "545f2ce3a4185aa6fb26469bb07107c5b2d06da0",
      "tree": "dd5d9d4756783b93f8fd07513e008f06730d0989",
      "parents": [
        "c35875b731dd7f07abf645a770231c8132462cdc"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue May 26 12:21:05 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 11 16:31:04 2026 -0700"
      },
      "message": "Enforce verbatim use of commit messages returned by get_commit_message\n\nReturn a typed _CommitMessageResult TypedDict with change_id and\nverbatim_commit_message fields instead of assembling text content blocks\nmanually. The MCP SDK auto-generates an output_schema from the return\nannotation and produces both structured and unstructured content. Error\npaths now raise exceptions rather than returning text error content\nblocks.\n\nThe docstring keeps an explicit IMPORTANT notice instructing callers to\nuse the returned commit message exactly as-is, without paraphrasing or\nreformatting the subject, body, or footers (e.g. Change-Id, Bug:,\nReviewed-by:).\n\nDocuments the TypedDict return-type pattern in AGENT.md (new \"Tool\nDesign\" section), using get_commit_message as the reference example.\n\nAdds tests/unit/test_get_commit_message.py covering the verbatim return,\nthe missing-message fallback, JSON decode errors, and curl exceptions.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I706c0a4c243eb9e9f9ea3ce4ef635db1d98d1b99\n"
    },
    {
      "commit": "c35875b731dd7f07abf645a770231c8132462cdc",
      "tree": "b6e53dec101c7166c563a0ab2549d60eb6deb67c",
      "parents": [
        "678c48d657a149798bab06c8241c3629469af1f4"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu May 21 15:56:18 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Aug 10 14:58:36 2026 -0700"
      },
      "message": "Add gerrit-workflow skill\n\nTeaches AI agents how to push for review, update patch sets, handle\nChange-Id trailers, work with dependent change stacks, and diagnose\ncommon Gerrit push errors.\n\nCo-Authored-By: Claude Sonnet 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: Ief2ee7fd6b5ff9e5e82beeede5fe6a92f4173b05\n"
    },
    {
      "commit": "678c48d657a149798bab06c8241c3629469af1f4",
      "tree": "d9b3f24480087355e78591fa2f631dff7973f956",
      "parents": [
        "e178cced87daf8467924a7b6b82c708d7c399207"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Fri May 22 15:04:13 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Aug 10 13:37:31 2026 -0700"
      },
      "message": "Add HTTP attribution headers with injection protection\n\nInstrument all curl calls with a User-Agent identifying the server and\nMCP SDK, plus X-MCP-Tool / X-MCP-Client / X-MCP-Protocol-Version headers\nso Gerrit server-side logs can identify MCP traffic and trace it to a\nspecific tool invocation and client.\n\nClient-supplied values (clientInfo.name, clientInfo.version, protocol\nversion) flow directly from the MCP initialize handshake into curl -A\nand -H arguments. Without validation, a client embedding \\r\\n in its\nname could inject arbitrary headers or trigger HTTP request splitting\nagainst a proxied Gerrit instance. Each value is now passed through\n_reject_if_unsafe(), which substitutes \"unparseable\" for any string\ncontaining C0 control characters (0x00–0x1F) or DEL (0x7F), keeping\nmalicious clients identifiable in logs rather than silently dropping\ntheir attribution.\n\n- New http_headers.py module owns all header logic: a ContextVar carries\n  per-request state (tool name, client name/version, protocol version)\n  through the async call chain without touching any tool signatures.\n- GerritFastMCP subclasses FastMCP and overrides call_tool to populate\n  the ContextVar from ctx.session.client_params before dispatching.\n- run_curl() reads the ContextVar and splices in the headers; extensions\n  get them automatically via the same run_curl closure.\n- url_utilities.is_public_url() gets the static UA (no MCP context).\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: I771e401ed8a92766086f2a8126e58d1dfcbe0132\n"
    },
    {
      "commit": "e178cced87daf8467924a7b6b82c708d7c399207",
      "tree": "837c9f73d70a019e02be1ce916ff59e090838a51",
      "parents": [
        "8882b38d412ec055c68b0ce041d6e4953ce739aa"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Jun 01 13:16:31 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 15:58:37 2026 -0700"
      },
      "message": "Extract Gerrit config details into a reusable reference file\n\nThe setup skill inlined the full configuration knowledge — the file\nlocation, all three authentication methods, and the config schema —\nwhich made it impossible for other skills to reuse without duplicating.\n\nMove that static reference into skills/setup/references/gerrit-config.md\nand trim SKILL.md to focus on the interactive setup flow, pointing at\nthe reference for the details. This lets other skills consume the\ncanonical config format from one place.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I38a85742bf420814c00d6831b0fca0ea6a6ac50a\n"
    },
    {
      "commit": "8882b38d412ec055c68b0ce041d6e4953ce739aa",
      "tree": "ec6c0bc354703d6095d5a4246c09512cac3fb7de",
      "parents": [
        "1b89f2d847025e79f106ad5ec9d27d063f5faa60"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Mon Jun 01 13:03:10 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 15:55:04 2026 -0700"
      },
      "message": "Support netrc credentials for http_basic auth\n\nUsing http_basic previously required storing a username and HTTP token\ndirectly in gerrit_config.json, duplicating credentials that many users\nalready keep in ~/.netrc and leaving plaintext tokens in the config.\n\nhttp_basic now treats inline credentials as optional: when both\n\u0027username\u0027 and \u0027auth_token\u0027 are omitted, curl reads credentials from a\nnetrc file (keyed by host) via --netrc, or --netrc-file when an optional\n\u0027netrc_path\u0027 is set. Supplying only one of the two still raises an error.\nThis makes the credential-free netrc form the preferred setup, analogous\nto git_cookies.\n\nUpdates the configuration docs, setup skill, and sample config to lead\nwith the netrc form. Adds unit tests for the --netrc and --netrc-file\ncommands and an end-to-end dispatcher test proving a credential-free\nhttp_basic host resolves to a --netrc curl command.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I46fed73774e83b1d36145c1d56ec5774274a81e8\n"
    },
    {
      "commit": "1b89f2d847025e79f106ad5ec9d27d063f5faa60",
      "tree": "46eb351875394fa49de9069b2d8d503c9ea9dcbb",
      "parents": [
        "7aebdb995fb1b060df0c9687eac7f181accd0cee"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Fri May 08 16:20:08 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 15:52:26 2026 -0700"
      },
      "message": "Fix gitcookies domain matching to correctly handle wildcard entries\n\nAuthentication silently failed for some hosts because the gitcookies\ndomain match was both too narrow and too broad. The original substring\ncheck (`domain in line`) matched the domain string anywhere in the\ncookie record, including the value field, while entries stored with the\nstandard wildcard prefix (a leading dot, e.g. `.gerrit.example.com`)\nwere skipped entirely.\n\nParse the cookie record first and match the extracted domain field\naccording to the gitcookies wildcard convention: an entry with a leading\ndot matches both the bare domain and any subdomain, while an entry\nwithout one requires an exact host match. This avoids the opposite error\nof letting a non-wildcard entry such as `my-gerrit.com` match an\nunrelated `sub.my-gerrit.com`.\n\nAdd unit tests covering wildcard subdomain and exact matches and\nconfirming non-wildcard entries do not match subdomains.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nChange-Id: I746d2ba13e74071e5a8cc9119fa5ef8b6ae63d76\n"
    },
    {
      "commit": "7aebdb995fb1b060df0c9687eac7f181accd0cee",
      "tree": "2bb8892b72cf993c02d7f4742be059e03989b57d",
      "parents": [
        "fd15095505c4f617655b2daf60db57cb46dcb8ec"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue May 26 13:50:23 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 15:52:16 2026 -0700"
      },
      "message": "Add SessionStart setup diagnostics and /gerrit:setup skill\n\nWhen the Python env or config is broken, MCP tools fail silently. A new\ngerrit-check-config CLI entry-point reports the setup state via exit\ncode (0\u003dvalid / 1\u003dconfig missing / 2\u003dconfig invalid), and a SessionStart\nhook turns that into clear, actionable guidance at the start of every\nsession.\n\nThe hook runs hooks/check-config.sh, which emits JSON with a\nsystemMessage for the user and additionalContext for the model so the\nright party acts on each state:\n\n- config missing/invalid: tell the user to run /gerrit:setup (it is\n  disable-model-invocation, so the model cannot run it itself)\n- env not built: offer the exact build-gerrit.sh command to rebuild\n- valid: stay quiet and report that the tools are available\n\nThis keeps the common first-run case (no config yet) from being reported\nas a broken install, and avoids hiding real failures: SessionStart\nstdout goes to the model\u0027s context rather than the user\u0027s terminal, so\nthe script uses systemMessage to reach the user directly.\n\nAdds and documents `skills/setup/SKILL.md`: an interactive setup skill\n(`/gerrit:setup`) that guides the user through creating\n`gerrit_mcp_server/gerrit_config.json`. Written against the Agent Skills\nopen standard so it works across Claude Code, Gemini CLI, OpenAI Codex,\nand other compatible harnesses.\n\nbuild-gerrit.sh reports which UV_PROJECT_ENVIRONMENT it builds into, so\nthe build and runtime (hook/MCP) venv targets stay visible and in\nagreement.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ic6e527d37e2d77f2159896230d21f5334f9ea596\n"
    },
    {
      "commit": "fd15095505c4f617655b2daf60db57cb46dcb8ec",
      "tree": "a36cb945a050b82e39f3837de590e24ece133bf7",
      "parents": [
        "f56631418012901a95ba150d25f527562065e0b3"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue May 26 12:10:58 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 15:47:11 2026 -0700"
      },
      "message": "Add Claude Code plugin support\n\nBundles the repo as an installable Claude Code plugin alongside the\nexisting Gemini extension. Four files are added:\n\n- `.claude-plugin/plugin.json`: plugin manifest (name, description,\n  license) required by the Claude Code plugin system.\n- `.claude-plugin/marketplace.json`: marketplace listing so the plugin\n  can be distributed via a plugin registry.\n- `.mcp.json`: MCP server configuration using `${CLAUDE_PLUGIN_ROOT}`\n  and `${CLAUDE_PLUGIN_DATA}` so paths resolve correctly wherever the\n  plugin is installed.\n- `docs/claude-code.md`: setup guide explaining plugin installation\n  and the on-demand `uv`-based launch (no separate build step needed).\n\n`README.md` and `AGENTS.md` are updated to reference the new doc.\n`.gitignore` is updated to ignore `.claude/settings.local.json`\n(personal settings).\n\nUsers can install the plugin via the repo provided marketplace:\n    /plugin marketplace add https://gerrit.googlesource.com/gerrit-mcp-server\n    /plugin install gerrit@gerrit-mcp\n\nOr load the plugin locally with:\n\n    claude --plugin-dir /path/to/gerrit-mcp-server\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: I08110f0f7cd401b44b2264bbdd87765da08eab23\n"
    },
    {
      "commit": "f56631418012901a95ba150d25f527562065e0b3",
      "tree": "b4f07eef9cda2b9b1cd09d64849e979e7d85f033",
      "parents": [
        "70f269560effa74bc13cd325563be313320d7ee1"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 14:04:37 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Aug 04 14:18:03 2026 -0700"
      },
      "message": "Pin mcp dep to \u003c2\n\nFollow the recommendation [1] and pin to the v1 branch until we update\nthe code. Update our locked version to the latest 1.29.0 release.\n\n[1] https://py.sdk.modelcontextprotocol.io/v1/\n\nChange-Id: Ia0f596f0c5a9a1a95111cc68076307c3fbe726b8\n"
    },
    {
      "commit": "70f269560effa74bc13cd325563be313320d7ee1",
      "tree": "560ce744913bb60a6d3b4e130438825e213f20de",
      "parents": [
        "6a27cd02d468c807cb9e607989ca608e49f1aa1d"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Wed May 27 16:43:24 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Jun 30 16:02:50 2026 -0700"
      },
      "message": "Enforce consistent Markdown style with mdformat\n\nAdd mdformat (with GFM, front-matter, and pyproject plugins) as a dev\ndependency and apply it across all documentation files. Configures\n80-character line wrapping and numbered list normalization in\npyproject.toml, and reformats AGENTS.md, README.md, and all docs/*.md\nfiles to match.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ic3efb11899b5113fd3e8be1cfb6684551a300f0a\n"
    },
    {
      "commit": "6a27cd02d468c807cb9e607989ca608e49f1aa1d",
      "tree": "2a2877e4c3bfe418f4babb5cc700aa37b479b987",
      "parents": [
        "9902eed981ea10d7b8938eab3111ecdeb52d0b1a"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue May 26 15:13:10 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Jun 30 16:02:50 2026 -0700"
      },
      "message": "Enforce consistent code style with ruff linting and formatting\n\nDocument ruff usage for AI agents in AGENTS.md (prefer /astral:ruff\nskill, fallback commands included) and for human contributors in\ndocs/contributing.md.\n\nUse a line length of 88 as it seems to minimize the number of affected\nfile.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ie2eb7e5d7d964cd68677ed083910f737a116487f\n"
    },
    {
      "commit": "9902eed981ea10d7b8938eab3111ecdeb52d0b1a",
      "tree": "feefe5913a9b987f57619a7fe6a97ae5cd48a997",
      "parents": [
        "430aa3589bfb784f63912875016fc81b56bfb8f5"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue May 26 12:10:21 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Tue Jun 30 16:02:27 2026 -0700"
      },
      "message": "Simplify project setup and add script entry point\n\nReplace the manual uv pip compile + uv pip sync + wheel-build sequence\nin build-gerrit.sh with a single `uv sync --extra dev`, which is the\nnative uv project workflow. The build script now checks for uv on the\nhost PATH before falling back to installing it via pip.\n\nAdd [build-system] to pyproject.toml and commit uv.lock for reproducible\ninstalls. Drop the generated requirements.txt and uv-requirements.txt.\n\nRemove test.sh — `uv run pytest` covers everything it did (venv setup,\nenv vars, test discovery) without a wrapper script.\n\nAdd a `gerrit-mcp-server` console script entry point that delegates to\ncli_main, so the server can be run directly after installation. Use the\nscript in the gemini config files and document uvx usage in the README\nand Gemini CLI setup guide.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nChange-Id: Ia9795e9c4f2a6d9b440c4c035155454616c75529\n"
    },
    {
      "commit": "430aa3589bfb784f63912875016fc81b56bfb8f5",
      "tree": "3215b31d566df94716922a074ae241865eae0ec0",
      "parents": [
        "82637684fde03080d9d959afc86703a307a05a81"
      ],
      "author": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu Jun 11 11:51:18 2026 -0700"
      },
      "committer": {
        "name": "Nasser Grainawi",
        "email": "nasser.grainawi@oss.qualcomm.com",
        "time": "Thu Jun 11 11:51:18 2026 -0700"
      },
      "message": "Fix naming to use the more generic AGENTS.md context file\n\nThe updated standard [1] uses a plural name `AGENTS.md` and we can add a\nGemini CLI settings file to point to it as the context file, removing\nthe need for a `GEMINI.md`. This change moves the little bit of\nnon-duplicate content from GEMINI.md into AGENTS.md and then removes it.\n\nTweak the gitignore rules to allow committing the .gemini/settings.json\nwith that context.fileName setting.\n\n[1] https://agents.md/\n\nChange-Id: Ieaff45ed4136a181b6c11ee45d39522a1f1d7698\n"
    },
    {
      "commit": "82637684fde03080d9d959afc86703a307a05a81",
      "tree": "c0cbc69f942c29f28d0626685b0b0185c86649f7",
      "parents": [
        "5666642afe1a5217e2529225d4bd9c9df6310bd6",
        "ca302bb9c1433d3028126125cfa1a05b61d5ea9a"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Thu Apr 23 10:06:41 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Apr 23 10:06:41 2026 -0700"
      },
      "message": "Merge changes I0be06fcb,Ib2a70554,I498a2e96,Iac9599cd,Iaf7d208d\n\n* changes:\n  Add publish_drafts tool and threaded reply support for draft comments\n  Add delete_draft_comments tool to bulk-remove all drafts on a CL\n  Add delete_draft_comment tool to remove a single draft by ID\n  Add list_draft_comments tool to view drafts on a CL\n  Add post_draft_comment tool for creating draft review comments\n"
    },
    {
      "commit": "ca302bb9c1433d3028126125cfa1a05b61d5ea9a",
      "tree": "549d912b8aeca6fa603c29b1f35f546c096b9b1a",
      "parents": [
        "3556275d48577b17c49823b73555d29708396e48"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Fri Apr 03 16:48:09 2026 +0300"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Fri Apr 03 16:49:21 2026 +0300"
      },
      "message": "Add publish_drafts tool and threaded reply support for draft comments\n\nChange-Id: I0be06fcb65e9132e7a5ad23e7b3b63dc9ee6c7a1\n"
    },
    {
      "commit": "5666642afe1a5217e2529225d4bd9c9df6310bd6",
      "tree": "16d6e5570049f47fc4dab41f09e4ae131f9212b6",
      "parents": [
        "441687eaf47eebf7a19348d846fa3e2affb89bcb",
        "5f764bfd0cc674ae91ac66450e3170763fbdf20e"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 23 13:21:27 2026 -0700"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Mon Mar 23 13:21:27 2026 -0700"
      },
      "message": "Merge \"Add /a/ prefix to Gerrit API URLs for authenticated access\""
    },
    {
      "commit": "5f764bfd0cc674ae91ac66450e3170763fbdf20e",
      "tree": "ba9ad86fea967028788bdd11fe73bc4860700105",
      "parents": [
        "9cadc50cffefe1c584d9be7d01e885189c909462"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Fri Mar 13 20:42:48 2026 +0200"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 23 17:16:13 2026 +0200"
      },
      "message": "Add /a/ prefix to Gerrit API URLs for authenticated access\n\nPer Gerrit REST API docs, all endpoints assume anonymous access by\ndefault. Users must prefix the URL path with /a/ to authenticate with\nHTTP basic credentials or cookies. Without /a/, Gerrit ignores any\nauth headers and returns only publicly visible data (which may be\nnothing at all).\n\nChange-Id: Icbd710e2bdfb1705c92e7e5a11c5fb5adae2e6d8\n"
    },
    {
      "commit": "441687eaf47eebf7a19348d846fa3e2affb89bcb",
      "tree": "66b4025f7724e2a6ec7ac98631084d5d8fe53c30",
      "parents": [
        "d2d599b589729f3ea0e9ccf4c68ade9afac828ad"
      ],
      "author": {
        "name": "Andrii Kosachenko",
        "email": "andrey.kosachenko@gmail.com",
        "time": "Mon Mar 16 22:18:01 2026 +0200"
      },
      "committer": {
        "name": "Andrii Kosachenko",
        "email": "andrey.kosachenko@gmail.com",
        "time": "Mon Mar 16 22:18:14 2026 +0200"
      },
      "message": "Return LSB-compliant exit code from server.sh status\n\nExit with code 3 when the service is stopped, per LSB init script\nguidelines, instead of falling through to exit 0.\n\nChange-Id: I72be8efb3b306c8adb431a328cf3057ea9c11db2\n"
    },
    {
      "commit": "d2d599b589729f3ea0e9ccf4c68ade9afac828ad",
      "tree": "2de36492e442445354d01d0f1611e76ab77c9522",
      "parents": [
        "9cadc50cffefe1c584d9be7d01e885189c909462"
      ],
      "author": {
        "name": "Andrii Kosachenko",
        "email": "andrey.kosachenko@gmail.com",
        "time": "Mon Mar 16 22:12:53 2026 +0200"
      },
      "committer": {
        "name": "Andrii Kosachenko",
        "email": "andrey.kosachenko@gmail.com",
        "time": "Mon Mar 16 22:14:15 2026 +0200"
      },
      "message": "Improve cross-platform compatibility (required for FreeBSD)\n\nUse portable shebangs (#!/usr/bin/env bash) in all shell scripts\nand avoid hardcoded /bin/bash in integration tests, since bash is\nnot at /bin/bash on FreeBSD.\n\nInclude uv source tarball hash in uv-requirements.txt for\nplatforms without pre-built wheels (otherwise build fails\npointing to hash mismatch).\n\nChange-Id: I3d733c0fa767076471ad10ddb005e8f85a1169bb\n"
    },
    {
      "commit": "3556275d48577b17c49823b73555d29708396e48",
      "tree": "c18f6b353f311fc17c14da09fb4ba8c097823182",
      "parents": [
        "a6d9bb2808ac227a1dd503eb68682ca90d7ee241"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:44:17 2026 +0200"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:48:05 2026 +0200"
      },
      "message": "Add delete_draft_comments tool to bulk-remove all drafts on a CL\n\nLists all drafts then deletes each one, reporting count and any\npartial failures.\n\nChange-Id: Ib2a705544fbfc2230a57af309fdf18d45bad7105\n"
    },
    {
      "commit": "a6d9bb2808ac227a1dd503eb68682ca90d7ee241",
      "tree": "cb98b45d91a1dacb5494f41e00df54b6bea7d983",
      "parents": [
        "a74b380ac0ecd5ae52444e1369f313a4aaada07f"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:43:45 2026 +0200"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:48:05 2026 +0200"
      },
      "message": "Add delete_draft_comment tool to remove a single draft by ID\n\nAdds _create_delete_args helper for curl DELETE requests and a\n_delete_draft_comment internal helper for reuse.\n\nChange-Id: I498a2e966b7f89bc1db1f0351cfc3e4ffd698788\n"
    },
    {
      "commit": "a74b380ac0ecd5ae52444e1369f313a4aaada07f",
      "tree": "57f06a51964790645bc864b72aa1c9c68deace32",
      "parents": [
        "6aa34983b8db2635d3ec13162dfea51e22a2436e"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:43:04 2026 +0200"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:48:05 2026 +0200"
      },
      "message": "Add list_draft_comments tool to view drafts on a CL\n\nLists all draft comments grouped by file, showing ID, line number,\nand a truncated message preview.\n\nChange-Id: Iac9599cd3d25bae3386d041d80518deb14524e43\n"
    },
    {
      "commit": "6aa34983b8db2635d3ec13162dfea51e22a2436e",
      "tree": "771debb88c443710cfdc8ceaf43aeeb4a2fe8256",
      "parents": [
        "9cadc50cffefe1c584d9be7d01e885189c909462"
      ],
      "author": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:42:44 2026 +0200"
      },
      "committer": {
        "name": "Yevhenii Yatchenko",
        "email": "yevhenii.yatchenko@gmail.com",
        "time": "Mon Mar 16 20:42:44 2026 +0200"
      },
      "message": "Add post_draft_comment tool for creating draft review comments\n\nCreate drafts on specific file/line with optional range and\nsuggestion support. Drafts are private until explicitly published.\n\nChange-Id: Iaf7d208df2eb29975a21ef6d1b46098fbf773ced\n"
    },
    {
      "commit": "9cadc50cffefe1c584d9be7d01e885189c909462",
      "tree": "ad784b448fafad3765fb3f320d40bc5d14fbac2e",
      "parents": [
        "d27e44b19092f3fa96ab75dba1941625be638587"
      ],
      "author": {
        "name": "Wat Lim",
        "email": "watl@google.com",
        "time": "Thu Mar 05 19:44:02 2026 +0000"
      },
      "committer": {
        "name": "Wat Lim",
        "email": "watl@google.com",
        "time": "Thu Mar 05 20:42:31 2026 +0000"
      },
      "message": "Fix dependency installation by explicitly using PyPI index.\n\nThe build script was failing because the default internal index was missing\nnecessary dependencies (like uv and build-time requirements).\nThis change sets PIP_INDEX_URL, UV_INDEX_URL, and UV_DEFAULT_INDEX to\nhttps://pypi.org/simple and adds an explicit --index-url to the initial\npip installation of uv to ensure it can bootstrap correctly.\n\nChange-Id: Id4f61c5f0a812e60d31cd22f340afdeed66960ef\n"
    },
    {
      "commit": "d27e44b19092f3fa96ab75dba1941625be638587",
      "tree": "20c1e1e11962a00a2eb1e35097ee8abc69f579e0",
      "parents": [
        "daec615fed4805bd4cf2cfa842481b633f71c337",
        "fbe51c50a87056acff64fa16c47100300a15d6ad"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Thu Jan 08 11:47:17 2026 -0800"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Thu Jan 08 11:47:17 2026 -0800"
      },
      "message": "Merge \"Fix authentication via gitcookie file\""
    },
    {
      "commit": "fbe51c50a87056acff64fa16c47100300a15d6ad",
      "tree": "045b906f155b3a179f2ddef9a24dc067ce4366da",
      "parents": [
        "5db26ca745dc645b7a19754d924590a8dd941bbb"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Thu Jan 08 17:33:45 2026 +0000"
      },
      "committer": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Thu Jan 08 18:41:17 2026 +0000"
      },
      "message": "Fix authentication via gitcookie file\n\nCurrently the code was picking the first cookie in the file, which\nhappens to be the oldest and most likely invalid cookie, we should pick\nthe most recent.\n\nChange-Id: I42e7fcc4276c5ea71cd4edcb24d37d2abe35a8ed\n"
    },
    {
      "commit": "daec615fed4805bd4cf2cfa842481b633f71c337",
      "tree": "9addf34d667a155005bcb11c2f9e36024c3926b2",
      "parents": [
        "5db26ca745dc645b7a19754d924590a8dd941bbb"
      ],
      "author": {
        "name": "Josh Skow",
        "email": "joshskow@google.com",
        "time": "Mon Dec 08 21:39:26 2025 +0000"
      },
      "committer": {
        "name": "Josh Skow",
        "email": "joshskow@google.com",
        "time": "Mon Dec 08 21:39:26 2025 +0000"
      },
      "message": "Add additional UV hash to uv-requirements\n\nChange-Id: I16e4b1f94756aab79e54159f1bcff8d58f7e1871\n"
    },
    {
      "commit": "5db26ca745dc645b7a19754d924590a8dd941bbb",
      "tree": "52086f8bce01b37af40f23b8cdd91b877fcdb44a",
      "parents": [
        "256813dd2b00c137a94dfba4c53f5fc4b2556a64"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:28:44 2025 +0000"
      },
      "committer": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:28:44 2025 +0000"
      },
      "message": "Add users local config file to gitignore\n\nChange-Id: I654539d4a8921b0ec08e91af1f14ee7a0f154f03\n"
    },
    {
      "commit": "256813dd2b00c137a94dfba4c53f5fc4b2556a64",
      "tree": "6d5ea22740875e5b246cd48fa0a56d78b10d4253",
      "parents": [
        "f6e2fdb3b2411d3a6e32af1004ce04c7737f2881"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:26:01 2025 +0000"
      },
      "committer": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:26:01 2025 +0000"
      },
      "message": "Remove non-prerequisites from prerequisites section\n\nChange-Id: I1b331632824af9466f1bbce6a2fb1c888e4dd66a\n"
    },
    {
      "commit": "f6e2fdb3b2411d3a6e32af1004ce04c7737f2881",
      "tree": "17257f30904636fc138493e4272c82fbb580546d",
      "parents": [
        "4c96bdaa6b9197dc08f5411a9a1398b932a3eb2f"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:22:56 2025 +0000"
      },
      "committer": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Sat Nov 22 13:22:56 2025 +0000"
      },
      "message": "Update sha for uv 0.8.0\n\nChange-Id: I874f5e5f2a5441a1a4893bb7d490e48dccf6ed2c\n"
    },
    {
      "commit": "4c96bdaa6b9197dc08f5411a9a1398b932a3eb2f",
      "tree": "c00dfd5fa5431410533df4cea1c7296501f8ac9b",
      "parents": [
        "181817629abb9883bcd8c1b854e26e9d145f1f23"
      ],
      "author": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Fri Nov 21 23:34:19 2025 +0000"
      },
      "committer": {
        "name": "Daniele Sassoli",
        "email": "danielesassoli@gmail.com",
        "time": "Fri Nov 21 23:34:51 2025 +0000"
      },
      "message": "Limit lines on md files to 80 characters to aid readability\n\nChange-Id: Ic59f9dd4066cfb19233b2ccadf543beddfaffb7a\n"
    },
    {
      "commit": "181817629abb9883bcd8c1b854e26e9d145f1f23",
      "tree": "1b70de77bc44c08d8a5e7de10e239ca531060f7b",
      "parents": [
        "3e8e9fe566b34059d93e72ab3b724e773994491a",
        "95abd6fdc20fe55aaeb0c52ee77be3c296bd60ec"
      ],
      "author": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Wed Nov 19 01:07:16 2025 -0800"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Wed Nov 19 01:07:16 2025 -0800"
      },
      "message": "Merge \"feat: Add support for setting review labels\""
    },
    {
      "commit": "95abd6fdc20fe55aaeb0c52ee77be3c296bd60ec",
      "tree": "b599587bb8eed8819527dc55437ffcc18338e347",
      "parents": [
        "8b75cc3cf34b4409c62a7cb8a3726a45e212735a"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Nov 19 02:09:52 2025 -0500"
      },
      "committer": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Nov 19 04:00:13 2025 -0500"
      },
      "message": "feat: Add support for setting review labels\n\nChange-Id: I2d8f44aff659524c14719d0bfbe53c9ee98e61b4\n"
    },
    {
      "commit": "3e8e9fe566b34059d93e72ab3b724e773994491a",
      "tree": "2e45b38b010090adb8fcd20518efa4d38944f97b",
      "parents": [
        "8b75cc3cf34b4409c62a7cb8a3726a45e212735a",
        "5e787d52a3541a031041a4f32d93d5264c0e34f0"
      ],
      "author": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Tue Nov 18 23:26:53 2025 -0800"
      },
      "committer": {
        "name": "Gerrit Code Review",
        "email": "noreply-gerritcodereview@google.com",
        "time": "Tue Nov 18 23:26:53 2025 -0800"
      },
      "message": "Merge \"Docs(agent): Add contributing guide to AGENT.md\""
    },
    {
      "commit": "8b75cc3cf34b4409c62a7cb8a3726a45e212735a",
      "tree": "105d57997981ebb081bd62aa6f13b9aa4e216d5d",
      "parents": [
        "ef46e3475c4c134939c38bb4e32b12f50bff50b7"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Nov 19 01:48:46 2025 -0500"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Tue Nov 18 23:07:15 2025 -0800"
      },
      "message": "Fix(build): Include dev dependencies in build script\n\nChange-Id: I3ab179a08a730962e61b951117810f10a9f3c423\n"
    },
    {
      "commit": "5e787d52a3541a031041a4f32d93d5264c0e34f0",
      "tree": "0e92cd400cecffdb58146854d12b2dcb756129e0",
      "parents": [
        "ef46e3475c4c134939c38bb4e32b12f50bff50b7"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Nov 19 01:52:30 2025 -0500"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Tue Nov 18 23:06:21 2025 -0800"
      },
      "message": "Docs(agent): Add contributing guide to AGENT.md\n\nChange-Id: I33d18262a1f7f09c978467b23b1c88b560e2d686\n"
    },
    {
      "commit": "ef46e3475c4c134939c38bb4e32b12f50bff50b7",
      "tree": "5f15e85d4addeed775350a63fe06ebc204e90c57",
      "parents": [
        "fc14c982c51740acfd4301b14a200d3122c9dc94"
      ],
      "author": {
        "name": "Jason Zhang",
        "email": "zezhang@google.com",
        "time": "Wed Nov 19 04:15:42 2025 +0000"
      },
      "committer": {
        "name": "Jason Zhang",
        "email": "zezhang@google.com",
        "time": "Wed Nov 19 04:24:06 2025 +0000"
      },
      "message": "Add Gemini CLI extension support\n\nIntroduces \u0027gemini-extension.json\u0027 for extension configuration and updates documentation with installation instructions.\n\nChange-Id: I83e93d3ee31da03384a7928ccb22bce74acf7a78\n"
    },
    {
      "commit": "fc14c982c51740acfd4301b14a200d3122c9dc94",
      "tree": "edc35b1609fce9336ebe2f0cefa935378cc2d0a1",
      "parents": [
        "3c72b924650c7d8503601b610bae2c327d580121"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Mon Nov 17 20:16:46 2025 -0500"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Tue Nov 18 01:12:55 2025 -0800"
      },
      "message": "refactor: Migrate E2E tests from unittest to pytest, update testing infrastructure and documentation, and add AGENT.md.\n\nChange-Id: I91a59a62bdef7b2431b38728f4b922ecaeba71f5\n"
    },
    {
      "commit": "3c72b924650c7d8503601b610bae2c327d580121",
      "tree": "76e6de342cd8c2aa78672c035be2c9809636f6e7",
      "parents": [
        "727f04a02531a6f1c1d6a0cdda09e50a1cffe047"
      ],
      "author": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Mon Nov 17 19:22:06 2025 -0500"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Mon Nov 17 16:30:50 2025 -0800"
      },
      "message": "feat: Improve docs for authentication, Validate default Gerrit URL, refactor URL normalization, and update authentication documentation.\n\nChange-Id: Ie646a7f2e5bf3e3480ecb3de6c8af52c046d5721\n"
    },
    {
      "commit": "727f04a02531a6f1c1d6a0cdda09e50a1cffe047",
      "tree": "924d036c9caa1490711e8175b8b4bde398ef7f6f",
      "parents": [
        "b889b6525fbbcfcce77f6a722fb62b17e77ab605"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Thu Oct 30 14:34:32 2025 +0000"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dannyrosen@google.com",
        "time": "Thu Oct 30 08:12:33 2025 -0700"
      },
      "message": "Fixed pip install vulnerability via hash verification, updated uv to 0.8.0, \u0026 + agent.md for developer guidelines.\n\nChange-Id: I7465b8605450aec51a8a136746dd3dedee51fc13\n"
    },
    {
      "commit": "b889b6525fbbcfcce77f6a722fb62b17e77ab605",
      "tree": "43ce08ea6ca1dd7eb703ab0bfed437719c8c8d33",
      "parents": [
        "0dc3550284972e2b5f7967230432808837b8c3d0"
      ],
      "author": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Oct 29 16:01:44 2025 +0000"
      },
      "committer": {
        "name": "dannyzen",
        "email": "dannyrosen@google.com",
        "time": "Wed Oct 29 17:08:47 2025 +0000"
      },
      "message": "feat: Improve build process and update dependencies\n\nChange-Id: I38634e97a6f0bab703ebf3d0980455f2570139c8\n"
    },
    {
      "commit": "0dc3550284972e2b5f7967230432808837b8c3d0",
      "tree": "13619537fefbb71748d9bcf42536fce0b00c5667",
      "parents": [],
      "author": {
        "name": "dannyzen",
        "email": "dzn@google.com",
        "time": "Fri Sep 26 10:58:58 2025 -0400"
      },
      "committer": {
        "name": "Danny Rosen",
        "email": "dzn@google.com",
        "time": "Mon Sep 29 06:14:17 2025 -0700"
      },
      "message": "[release] Public Release: Gerrit MCP Server 1.0.0.0 (bereshit)\n\nChange-Id: I7a667858413f48bb69228468b3cc510b3bd613c6\n"
    }
  ]
}
