)]}'
{
  "log": [
    {
      "commit": "857ba4375a0a05b276046a5d6530bf68019643ae",
      "tree": "2873b7543c82282229796eee722241e7e46556d6",
      "parents": [
        "a1f67a6afc1fb3849e55cb0b35781ce23944e249"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 13:06:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:06:29 2026 -0700"
      },
      "message": "update wording for selection dialogs (#557)\n\nThis should make it more obvious that you won\u0027t be installing all skills, but will be presented with another dialog to choose which skills to install."
    },
    {
      "commit": "a1f67a6afc1fb3849e55cb0b35781ce23944e249",
      "tree": "0c06716c91f329579a5e21f75910c14088ee2b3c",
      "parents": [
        "7d404cf73ed3209c933f4a8f70d6549ab32f0533"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 11:11:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 11:11:32 2026 -0700"
      },
      "message": "add version flag (#545)\n\nFrom the bug bash, a version flag would have been helpful :)"
    },
    {
      "commit": "7d404cf73ed3209c933f4a8f70d6549ab32f0533",
      "tree": "45665b569a66b7e2cf32c921c44d91a6e023641d",
      "parents": [
        "7ee46a3002cd271939388f8a1b8394e58519744d"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 10:29:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 10:29:04 2026 -0700"
      },
      "message": "Fix skills create description escaping (#547)\n\nJust JSON encode the descriptions, Yaml is a superset of JSON so this should be sufficient.\n\nFixes #542"
    },
    {
      "commit": "7ee46a3002cd271939388f8a1b8394e58519744d",
      "tree": "fd761990d361e2f44ffd21ce7c31ffd286dc3422",
      "parents": [
        "5b2b8351d6e894ef41efec1e3f50dc493d5b1ea0"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 09:24:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:24:12 2026 -0700"
      },
      "message": "use the dart/workspace/analysis/complete request where possible (#544)\n\nCloses https://github.com/dart-lang/ai/issues/536\nCloses https://github.com/dart-lang/ai/issues/499\n\nAlso preps for a release, we have a decent chunk of functionality ready now.\n\ncc @DanTup"
    },
    {
      "commit": "5b2b8351d6e894ef41efec1e3f50dc493d5b1ea0",
      "tree": "3b8e35d4d4a81cf170097baf221970d4a9a2dafa",
      "parents": [
        "85a5da7f54e9205a18f19e3502394c068750f77e"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 09:02:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:02:34 2026 -0700"
      },
      "message": "use parseDartSDKVersion from unified_analytics (#538)\n\nThis might resolve https://github.com/dart-lang/ai/issues/537, or we might need to actually update the helper, it isn\u0027t clear to me that it will actually resolve the issue looking at the implementation."
    },
    {
      "commit": "85a5da7f54e9205a18f19e3502394c068750f77e",
      "tree": "6df53aeee2f80db696ab420e73bccfffd6841813",
      "parents": [
        "7e7a2f6e0fb9efae347675072b0546fbf79be235"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 07:54:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 07:54:09 2026 -0700"
      },
      "message": "log error types for unhandled errors (#539)\n\nPart of https://github.com/dart-lang/ai/issues/532, it looks like these are actually unhandled errors, this will help determine what kinds of unhandled errors."
    },
    {
      "commit": "7e7a2f6e0fb9efae347675072b0546fbf79be235",
      "tree": "7fd406e1b3d67e9e4e4cc972f2667240e9b4c828",
      "parents": [
        "61c0f0cadf1d328e89d3d568afe88475b6837dfa"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jul 23 07:44:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 07:44:06 2026 -0700"
      },
      "message": "update the github repo link to the new location (#540)"
    },
    {
      "commit": "61c0f0cadf1d328e89d3d568afe88475b6837dfa",
      "tree": "310ab5161a7c127b40c0781fb7aae61ce2ee8fe3",
      "parents": [
        "ae8d4388298023033871311aca79121252c4bd99"
      ],
      "author": {
        "name": "Michael Thomsen",
        "email": "mit@google.com",
        "time": "Thu Jul 23 16:35:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 07:35:44 2026 -0700"
      },
      "message": "Revise CLI description for clarity (#543)"
    },
    {
      "commit": "ae8d4388298023033871311aca79121252c4bd99",
      "tree": "e35f82e69b128196a471d4638240fbc005930dbb",
      "parents": [
        "e69f9ece10c6578f1273568fd3bcea1d192dea99"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 22 07:32:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 07:32:18 2026 -0700"
      },
      "message": "Harden various tools (#534)\n\nThese fixes prevent agents from circumventing the registered project roots, providing unsafe arguments to cli tools, and connect to likely malicious DTD instances that are not on loopback addresses."
    },
    {
      "commit": "e69f9ece10c6578f1273568fd3bcea1d192dea99",
      "tree": "4aeaa96ab1f771afd11bd86943ec21e1370ea4ef",
      "parents": [
        "78ea03eea984bda05509b7ff4745021d5e046fda"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Jul 21 08:18:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 08:18:30 2026 -0700"
      },
      "message": "add basic analytics for commands ran and errors (#533)\n\nCloses https://github.com/dart-lang/ai/issues/467"
    },
    {
      "commit": "78ea03eea984bda05509b7ff4745021d5e046fda",
      "tree": "4ef214144dcb5a36685936813b4a7f3ba8e0d72d",
      "parents": [
        "1e2f7c76e4cd972d1f816e0de2abeb97e1c30cd0"
      ],
      "author": {
        "name": "Yusuf İhsan Görgel",
        "email": "developeryusuf@icloud.com",
        "time": "Mon Jul 20 22:03:00 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 12:03:00 2026 -0700"
      },
      "message": "operate on decoded messages instead of JSON strings (#531)\n\nFollow-up to [this thread](https://github.com/dart-lang/ai/pull/528#discussion_r3604241409) in #528: `MCPBase`, `MCPClient.connectServer`, `MCPServerFactory`, and `stdioChannel` now operate on `StreamChannel\u003cMap\u003cString, Object?\u003e\u003e` instead of `StreamChannel\u003cString\u003e`, so JSON is encoded and decoded only at the transport edge rather than once more within the process.\n\n- `MCPBase` hands the channel to `Peer.withoutJson`. The channel type admits only JSON objects, so json_rpc_2 never receives a batch and never emits the `List` frames its batch support would answer one with.\n- `stdioChannel` still speaks newline-delimited JSON on the wire and now returns the decoded channel. The string-to-map adaptation is exposed separately as `jsonRpcChannel` for other `StreamChannel\u003cString\u003e` transports.\n- Behavior deltas worth calling out:\n  - Frames which are not valid JSON, or which decode to something other than a JSON object, are answered at the transport edge by `jsonRpcChannel` instead of by json_rpc_2 inside the peer. The two existing invalid-JSON tests moved to `stdio_test.dart` accordingly, and neither those frames nor their error responses appear in `protocolLogSink` anymore (which now logs each message re-encoded as JSON, falling back to `toString` when a message cannot be encoded). If wire-level visibility of rejected frames turns out to matter for debugging, an optional log sink on `jsonRpcChannel` would be a small follow-up.\n  - JSON-RPC batch frames now get a single invalid request error response with a null id and a message pointing at the 2025-06-18 removal. Batching was added in protocol version 2025-03-26 and removed in 2025-06-18; this package never sent batches itself.\n  - `handleRequestScopedMessage` now stamps server info onto a copy of the response. With decoded channels the response embeds the very maps the handler returned — which may be retained by the handler or even unmodifiable, like `EmptyResult()`\u0027s — where previously it saw private `jsonDecode` copies.\n- The URL elicitation retry path now restores a typed view of the error data itself. `RpcException.serialize` copies the data into an untyped map, and the JSON round trip previously re-laundered it to `Map\u003cString, dynamic\u003e` before user code saw it.\n\nDoes not add any transport or change protocol behavior beyond the frame type: HTTP, `server/discover`, and roots are untouched. Since 0.6.0-wip has never been published, current `dart_mcp` users only see this when they opt into 0.6.0; `dart_mcp_server` pins `^0.5.0` and migrates with its own 0.6.0 dependency bump.\n\n## Tests\n\n- New `stdio_test.dart` covers `jsonRpcChannel` (decode/encode round trip, parse error and non-object frames with null ids, batch rejection, and a server and a client each surviving invalid frames) plus `stdioChannel` at the byte level.\n- New request-scoped tests pin that server info is stamped onto unmodifiable results (the built-in `ping` path) without modifying the map the handler returned, and skipped for metadata with non-string keys.\n- A new test pins that a server survives a map which is not a valid message, now representable at the public channel seam.\n- `dart test -p chrome,vm -c dart2wasm,dart2js,kernel,exe` passes (218 tests in each of the four configurations).\n- `dart analyze --fatal-infos` and `dart format` (dev SDK) are clean here, and in `mcp_examples` resolved against this branch.\n\nPart of #162."
    },
    {
      "commit": "1e2f7c76e4cd972d1f816e0de2abeb97e1c30cd0",
      "tree": "4133d29ced78fe84a69103cbae92d5b9cdfc3f40",
      "parents": [
        "cf04e97717188b78c92362caada6dcb9bfd30a0b"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jul 20 09:25:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 09:25:33 2026 -0700"
      },
      "message": "improve security of workflow files (#530)\n\nRan zizmore and applied fixes"
    },
    {
      "commit": "cf04e97717188b78c92362caada6dcb9bfd30a0b",
      "tree": "9cfef2960da5622fa647ee414f141c39324f71ee",
      "parents": [
        "ed0f12a832847236e2d5b8b974a5644ca069dd71"
      ],
      "author": {
        "name": "Yusuf İhsan Görgel",
        "email": "developeryusuf@icloud.com",
        "time": "Fri Jul 17 23:33:08 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 13:33:08 2026 -0700"
      },
      "message": "add request-scoped message dispatch for MCP servers (#528)\n\nPart of https://github.com/dart-lang/ai/issues/162.\n\nAdds `handleRequestScopedMessage` and `MCPServerFactory`: each decoded\nJSON-RPC message is served on a fresh `MCPServer` instance (following\nhttps://github.com/dart-lang/ai/pull/524#discussion_r3582076312), which gets\n`initialize(MCPServerInitialization)` with the per-request context and a\ncompleted `initialized` before the message is delivered. The shape follows\nthe sketch in\nhttps://github.com/dart-lang/ai/issues/162#issuecomment-3198530648: a server\nfactory plus a handle function, no new transport abstraction.\n\nEach message round-trips through an in-memory string channel, so the exchange\nruns through the exact same `Peer` validation and dispatch path as a wire\nconnection; a message-typed channel could drop the extra encode/decode later.\nNotifications emitted while handling are surfaced through a callback so a\ntransport can decide how to deliver them, and server-to-client requests fail\nwith an error inside their handler instead of deadlocking the exchange; real\nrouting for those comes with the transport work.\n\nAlso makes `MCPServerInitialization.clientInfo` (and `MCPServer.clientInfo`)\nnullable, since\nhttps://github.com/modelcontextprotocol/modelcontextprotocol/pull/3002 made\nthe per-request client info optional, and records the server implementation\non responses under the reserved `io.modelcontextprotocol/serverInfo` result\nmetadata key which the same spec change added. `RootsTrackingSupport` now\ntolerates the connection closing while `listRoots` is in flight, which the\nper-request teardown made easy to hit.\n\nTests:\n\n- `dart_mcp`: analyze clean; format clean (dev SDK); 828/828 tests across\n  chrome/vm and dart2wasm/dart2js/kernel/exe. 22 new request-scoped tests\n  cover fresh-instance isolation, per-request capabilities, absent client\n  info, server info stamping (including malformed metadata), notification\n  passthrough, server-to-client request failure, malformed, legacy, and\n  response-shaped message rejection, early shutdown, and initialization\n  failure, plus a legacy handshake regression test for the nullable client\n  info.\n- `dart_mcp_examples` (path-overrides the local `dart_mcp`): analyze clean.\n\nThis PR does not add Streamable HTTP or any transport; wire formats, envelope\nvalidation, and `server/discover` land separately."
    },
    {
      "commit": "ed0f12a832847236e2d5b8b974a5644ca069dd71",
      "tree": "84f30269a43e635e6840234884dd1c5bdf5708b9",
      "parents": [
        "0b8e661347f6168ba235256e4621b281b64eaceb"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Jul 17 10:53:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 10:53:25 2026 -0700"
      },
      "message": "add create command for creating a skill to share (#529)\n\nThis makes it simple to create new skills in a package, it scaffolds the skill file in the correct place with the correct name etc."
    },
    {
      "commit": "0b8e661347f6168ba235256e4621b281b64eaceb",
      "tree": "0872d6fcf405e28afce35b15bf019db15888e5ff",
      "parents": [
        "6923032fe29bd3c28b34d738e0f5df0308cec357"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Jul 17 08:08:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 08:08:26 2026 -0700"
      },
      "message": "publish package:skills 1.0.0-beta.1 (#527)\n\nThis release will allow us to get a few dogfooders using the package like `dart run skills@1.0.0-beta.1` or `dart run skills@^1.0.0.beta`\n\n- Also cleans up the README a bit\n- And includes the agent aliases in the agent selection dialog"
    },
    {
      "commit": "6923032fe29bd3c28b34d738e0f5df0308cec357",
      "tree": "ac13008f006afd6fa88e8805e6348229dcc0e309",
      "parents": [
        "4386608cbf4694f3a42225bbaacf73cd618c4960"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 15 13:05:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 13:05:24 2026 -0700"
      },
      "message": "suggest installing dart/flutter skill repos (#521)\n\nCloses https://github.com/dart-lang/ai/issues/504\n\n- Once per project/machine (as recorded in the skill manifest), suggest installing dart/flutter skill repos.\n- Allows a global opt out for this behavior.\n- Can install either globally or locally (if global, this dialog will be skipped for future projects)."
    },
    {
      "commit": "4386608cbf4694f3a42225bbaacf73cd618c4960",
      "tree": "7561d0165f5dfb1e7aa4b769c2e7ce2bfa9d8a6d",
      "parents": [
        "478341566252a005c420c9f874fc32cbe80f507f"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 15 12:45:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:45:13 2026 -0700"
      },
      "message": "rename --ide to --agent and all APIs similarly (#525)\n\nCloses https://github.com/dart-lang/ai/issues/505\n\nThis involved changing a large amount of code as well to use the new naming, as well as an environment variable (`SKILLS_IDE` -\u003e `SKILLS_AGENT`).\n\nThis does also clean up the arg parsing some so it is more consistent, and drops the dependency on the `config` package."
    },
    {
      "commit": "478341566252a005c420c9f874fc32cbe80f507f",
      "tree": "865a601a0a01892f8718bd3ab692f0e5ba851e7f",
      "parents": [
        "a067ab8287b6e74bf9ed3c279657261a8d1610ed"
      ],
      "author": {
        "name": "Yusuf İhsan Görgel",
        "email": "developeryusuf@icloud.com",
        "time": "Wed Jul 15 22:28:39 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 12:28:39 2026 -0700"
      },
      "message": "Separate server feature registration from legacy initialization (#524)\n\nSeparates feature registration from the legacy MCP initialize handshake.\n\n- Add `MCPServer.initialize(MCPServerInitialization)` as the reusable feature and capability lifecycle hook. The context carries the real protocol version, client information, and client capabilities for either lifecycle.\n- Move protocol negotiation and the legacy wire response to `MCPServer.initializeLegacy(InitializeRequest)`.\n- Move the built-in `dart_mcp` support mixins and examples to the reusable hook, including roots and elicitation setup shared by both lifecycle modes.\n- Keep `dart_mcp_server` on the published 0.5 line by removing its local `dart_mcp` override; its 0.6 migration remains a separate concern.\n- Document the lifecycle boundary and start the breaking `dart_mcp` 0.6.0 development version.\n\nThe legacy channel path still performs the same negotiation and calls the reusable hook with the real request context. A future request-scoped dispatcher can invoke feature setup without fabricating a legacy initialize request, then complete `initialized` after the full registration chain and transport setup have finished.\n\nTests:\n\n- `dart_mcp`: analyze; 736/736 Chrome/VM tests across dart2wasm, dart2js, kernel, and exe.\n- `dart_mcp_server` against published `dart_mcp 0.5.2`: analyze; 18/18 selected API, configuration, and server tests.\n- `mcp_examples`: analyze and format.\n- `dart doc --dry-run`: 0 errors; 128 baseline-identical re-export warnings.\n\nThis is only the lifecycle seam discussed in #162. It does not add or claim Streamable HTTP support."
    },
    {
      "commit": "a067ab8287b6e74bf9ed3c279657261a8d1610ed",
      "tree": "252828a2a902b898cb21b600914c34914543e334",
      "parents": [
        "de3ea7373c1e5a19ce117b5440363e001b1543e5"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 15 09:43:50 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 09:43:50 2026 -0700"
      },
      "message": "Support `internal: true` metadata to skip installing certain skills (#520)\n\nCloses https://github.com/dart-lang/ai/issues/502\n\n- Adds a simple parser for skill frontmatter as well.\n- Uses that to extract the internal metadata field if present and skip skills unless the environment variable is set\n- Cleans up some older tests that I noticed were set up wrong or invalid."
    },
    {
      "commit": "de3ea7373c1e5a19ce117b5440363e001b1543e5",
      "tree": "74574ab8c11e321fba7ca9be525a9d41a3832d2c",
      "parents": [
        "0461a5df46964a9031d2dba22060d7d61a2540bb"
      ],
      "author": {
        "name": "Keerti Parthasarathy",
        "email": "keertip@users.noreply.github.com",
        "time": "Tue Jul 14 11:00:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 11:00:34 2026 -0700"
      },
      "message": "Revert \"Add a Claude Code plugin (#511)\" (#523)"
    },
    {
      "commit": "0461a5df46964a9031d2dba22060d7d61a2540bb",
      "tree": "ac9c9660cd66a5d36a1723970f4d600dd7997d8c",
      "parents": [
        "50dae986c12921295798ad0433760d87183c0a96"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Jul 10 12:41:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:41:04 2026 -0700"
      },
      "message": "Fix vm service disconnection hangs (#519)\n\nI noticed that when connecting to remote apps in particular, it isn\u0027t uncommon for the vm service connection to get dropped. We weren\u0027t handling that case well and would keep it in the active vm services map.\n\nNow, if a vm service gets disposed we will remove it from that map. Also handles the case where the service dies in the middle of a tool call."
    },
    {
      "commit": "50dae986c12921295798ad0433760d87183c0a96",
      "tree": "13a07b9745892458325d28664b9fd84c773f5f61",
      "parents": [
        "5f503c9558522e16d7dc4ff281f6015b0ec96913",
        "e7a3405a2d502c499f39536bfd025a54ea54a88c"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Jul 10 12:28:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 12:28:16 2026 -0700"
      },
      "message": "Fork package:skills into this repo at pkgs/skills (#507)\n\nCloses https://github.com/dart-lang/ai/issues/456\n\n- Retains history from the original repo (https://github.com/serverpod/skills).\n- Additional commits after the fork\n  - Move and update the GitHub workflows to follow our style, update our README.md, and append the Google license to the existing one.\n  - Format with the dev SDK (which is what the rest of this repo formats with).\n  - Some fixes to get tests passing on windows\n\ncc @marcelomendoncasoares @vlidholt\n\n**This should be merged as a merge commit and not squashed**"
    },
    {
      "commit": "5f503c9558522e16d7dc4ff281f6015b0ec96913",
      "tree": "b985c4b28545f87be71732125fbffe08313f9db4",
      "parents": [
        "171ca06a113862c5c3c63856c3c5282ae2c28871"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 08 09:32:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 09:32:59 2026 -0700"
      },
      "message": "move SdkSupport to implements clause of DartToolingDaemonSupport (#515)\n\nThis should have always been `implements`, we don\u0027t use `super.sdk`, we just require there to be an sdk getter."
    },
    {
      "commit": "171ca06a113862c5c3c63856c3c5282ae2c28871",
      "tree": "3db03962f614005f0a488ab126fe8fa63aa003a5",
      "parents": [
        "bdfe08ca2416dea6bf80d371da289cdff3005775"
      ],
      "author": {
        "name": "Keerti Parthasarathy",
        "email": "keertip@users.noreply.github.com",
        "time": "Wed Jul 08 08:38:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 08:38:25 2026 -0700"
      },
      "message": "Add a Claude Code plugin (#511)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Jacob MacDonald \u003cjakemac@google.com\u003e"
    },
    {
      "commit": "bdfe08ca2416dea6bf80d371da289cdff3005775",
      "tree": "5549c2594e3d2e7668a2940376b537907d5fffd1",
      "parents": [
        "359069efb1eea984bfad18631e60e2205535a284"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Jul 07 09:31:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 09:31:36 2026 -0700"
      },
      "message": "add some missing tool call failure reasons (#514)\n\nStill seeing a fair number of `null` failure reasons in our analytics, this should cover at least some of those."
    },
    {
      "commit": "359069efb1eea984bfad18631e60e2205535a284",
      "tree": "c061952d721ef3878c1de1b4bfdf4935a84c298c",
      "parents": [
        "7fbc9833ad240b1e0f087f081567a882078c8df5"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jul 01 10:28:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 10:28:43 2026 -0700"
      },
      "message": "allow connecting directly to vm service URIs (#512)\n\nAdds a new `vm_service` tool, with `connect` and `disconnect` commands. These accept raw vm service URIs instead of DTD uris, for cases where a DTD uri does not exist or is not known.\n\nAlso moves the previous `call_vm_service_method` tool under this tool, as a `callMethod` command."
    },
    {
      "commit": "7fbc9833ad240b1e0f087f081567a882078c8df5",
      "tree": "af2153d1cc30a369816dfbeffa2adb56c64478c4",
      "parents": [
        "254852ca84a301b94c5ee3d592e19065dce700e2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 07:14:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 07:14:22 2026 -0700"
      },
      "message": "Bump the github-actions group with 2 updates (#513)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "254852ca84a301b94c5ee3d592e19065dce700e2",
      "tree": "3b78b7d4c84e9fb2df7b8e9a774d33782c633268",
      "parents": [
        "d4c0045d72aa0fac6207e477dec1341b46f5c0f2"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 29 10:21:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 10:21:25 2026 -0700"
      },
      "message": "try using package:test version 1.30.0 to avoid test hangs on exit (#509)\n\nWe have been seeing issues with the test runner not exiting, ever since package:test 1.31.0 was released. Specifically this is just on windows, and just for the dart_mcp package.\n\nTrying with the old version to see if that fixes things for now."
    },
    {
      "commit": "d4c0045d72aa0fac6207e477dec1341b46f5c0f2",
      "tree": "89bf8e045e6beada7110eed192ab7334d78726ff",
      "parents": [
        "025cc11916eee491341ddb5cff8c8dc518dd9fff"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 29 09:24:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 09:24:55 2026 -0700"
      },
      "message": "normalize roots so they always have a scheme (#508)\n\nFixes https://github.com/dart-lang/ai/issues/506.\n\nSome clients (such as Cursor) may give a file path for roots, which violates the spec (which specifies `file:` roots only). However we can still gracefully handle this.\n\nExactly why this was timing out is a separate issue though, I think we are likely just swallowing errors from a zone, and then never returning them as errors."
    },
    {
      "commit": "e7a3405a2d502c499f39536bfd025a54ea54a88c",
      "tree": "79cff2a87baf7c9408acb9315c89e2ce23f7f25c",
      "parents": [
        "97df09f401d5a1ff75f0d7d41a087513db8ef08b"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:54:23 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:59:27 2026 +0000"
      },
      "message": "try enabling long paths in git\n"
    },
    {
      "commit": "97df09f401d5a1ff75f0d7d41a087513db8ef08b",
      "tree": "e5e777bfc2a5a2e606f3bcd91745ae9bc5196f2b",
      "parents": [
        "62f38bd5a061f7fae1129e529fddd18763786238"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:37:27 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:37:27 2026 +0000"
      },
      "message": "use a test descriptor validator in git_sync_test.dart\n"
    },
    {
      "commit": "62f38bd5a061f7fae1129e529fddd18763786238",
      "tree": "28a1eeafe48040060bad67ae8ada28c9f41dc147",
      "parents": [
        "693e0f016b143949b7789e54c53cb4577c29193a"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:21:05 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:21:05 2026 +0000"
      },
      "message": "format with the dev SDK\n"
    },
    {
      "commit": "693e0f016b143949b7789e54c53cb4577c29193a",
      "tree": "ca85b404c09c34ddd6646a62112138ec4bde298b",
      "parents": [
        "5059d49695d8f29399fad7f272ee544200ffc0a8"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 16:39:47 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 17:06:40 2026 +0000"
      },
      "message": "append google license, update github workflows, update README.md\n"
    },
    {
      "commit": "5059d49695d8f29399fad7f272ee544200ffc0a8",
      "tree": "607030911390238565fb5affde36f4b119bdd20f",
      "parents": [
        "025cc11916eee491341ddb5cff8c8dc518dd9fff",
        "377e6d87773e53ff4b97b7bffc58d756877815a3"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 16:50:45 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 16:50:45 2026 +0000"
      },
      "message": "Merge branch \u0027temp-skills-merge\u0027 into merge-skills-with-history\n"
    },
    {
      "commit": "377e6d87773e53ff4b97b7bffc58d756877815a3",
      "tree": "6bca19d1d54774082aaaeb9d49b78ea3230cb81b",
      "parents": [
        "d71f3a35165d470909cfc0e7627655135a1eab37"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 16:48:29 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 16:48:29 2026 +0000"
      },
      "message": "Move files to pkgs/skills\n"
    },
    {
      "commit": "d71f3a35165d470909cfc0e7627655135a1eab37",
      "tree": "33df90d14c1596c9b455c8ba840769ef35d6c019",
      "parents": [
        "1326501bb26e529879ea37d8ed04919b6bb3dd6a"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Jun 26 09:17:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 09:17:49 2026 -0700"
      },
      "message": "Replace registries with new `add` command which installs from git without filtering (#32)\n\nCloses https://github.com/dart-lang/ai/issues/470\n\n-  Adds a new `add` command with syntax similar to `npx skills add`, standard commands from https://skills.sh will work if you substitute `dart run skills@` for `npx skills`.\n  - Example to install dart skills `dart run skills@ add dart-lang/skills`. I filed a separate issue for us to suggest dart-lang/skills and flutter/skills on the first run in any project.\n- Drop all registry support, in favor of just installing any/all skills directly from git repos.\n  - The main difference is we don\u0027t search for skills matching names of package dependencies.\n- Drops the `registry` command entirely,\n- Reworks the manifest (with a migration) to drop the registry section and merge it into the regular skills section. Keys are now not package names but source URIs. For packages, these are just `package:\u003cname\u003e`.\n- The `get` command will now list any installed repos as available to install skills from."
    },
    {
      "commit": "1326501bb26e529879ea37d8ed04919b6bb3dd6a",
      "tree": "5254213536623f1dce7793540c1cfb73659a739a",
      "parents": [
        "82d2374cd128afb523327c8bc5a894579383257e"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 22 10:28:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 10:28:00 2026 -0700"
      },
      "message": "Improve update flow with computed diffs (#30)\n\nUpdates `skills get` to compute a difference between the old and new skills, allowing a more streamlined update flow.\n\n- The first step of `get` now groups all skills into several states and presents them in the install dialog as follows.\n  - Up to date: will not appear in dialog\n  - Update available: will appear auto-selected in dialog\n  - Update available but has local edits: will appear, but not auto-selected in dialog\n  - Orphaned (deleted): these get their own dialog, auto selected to be uninstalled, but can be kept in an orphaned state\n  - New: Will appear in dialog, not auto selected\n  - Skipped previously: Will appear in dialog, not auto selected\n- If multiple --ide options are provided, and a skill is in different states for those different IDEs, it will show an option for each IDE with its corresponding state.\n- Drops the `--force` flag which would force updates of skills with local edits. Now you can just pass the name of the skill and it will update, even with local edits. Or you can pass `--all`.\n- During install, we now only uninstall the selected skills, if given. This leaves all other skills in tact.\n\nThis PR also drops entirely the `RulesAdapter` which added some extra complications here and it turns out wasn\u0027t used at all anyways.\n\nCloses https://github.com/dart-lang/ai/issues/460"
    },
    {
      "commit": "025cc11916eee491341ddb5cff8c8dc518dd9fff",
      "tree": "7eedbf02966f066b0b8d12ec570b35d1afdc5433",
      "parents": [
        "def0bac38a59e05725dcbd885fadceef2ed2f6a6"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 22 09:33:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 09:33:00 2026 -0700"
      },
      "message": "send a sigkill to analysis server if it doesnt respond to sigterm (#501)\n\nCloses https://github.com/dart-lang/ai/issues/500.\n\nI can\u0027t confirm whether or not this actually resolves the issue, but I think it is about the best we can possibly do here."
    },
    {
      "commit": "82d2374cd128afb523327c8bc5a894579383257e",
      "tree": "6096e7ba28b8ae149579d0e8e7902b558f5ce6aa",
      "parents": [
        "7e4a1eb37693d0c30129c6d7d7bb7d55f0a55290"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jun 17 10:10:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 10:10:47 2026 -0700"
      },
      "message": "only install skills from immediate deps (#29)\n\nCloses https://github.com/dart-lang/ai/issues/497\n\nReads the package_graph.json file next to each package config when resolving packages and uses that to only load regular/dev dependencies.\n\nUpdates tests to just have a valid pubspec.yaml and rely on `pub get` to create the requisite files (package_config.json, package_graph.json).\n\nIncreases the SDK constraint to ^3.10, so that we can use dot shorthands in the tests."
    },
    {
      "commit": "def0bac38a59e05725dcbd885fadceef2ed2f6a6",
      "tree": "9e9b26a5aeb212ddca4aecd5891c1e1197e6638a",
      "parents": [
        "f9d87894d975ae8f582a9a3ce94630943a3df27f"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 15 10:06:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 10:06:49 2026 -0700"
      },
      "message": "add architecture doc for the mcp server (#496)"
    },
    {
      "commit": "7e4a1eb37693d0c30129c6d7d7bb7d55f0a55290",
      "tree": "f29d2937e689f39afb9000ca488c83343ad216cf",
      "parents": [
        "ee736ac9603e0ac6cd217645c897a1477296c414"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jun 11 08:15:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 08:15:03 2026 -0700"
      },
      "message": "Improve update flow by checking for local modifications first (#25)\n\nPart of https://github.com/dart-lang/ai/issues/460\n\n- Stores a hash of a skill directory on install in the manifest.\n- During `skills get`, before removing a skill check if the _existing_ directory hash is still the same as it was when installed.\n  - If not, prompt the user to see if they want to bash over their local changes, or log a warning about the `--force` flag if we don\u0027t have dialog support.\n- Adds support for the `--force` flag to `get`, which will skip the dialogs.\n\n**Note**: This does not handle skipping install dialogs for already installed skills - the current logic just uninstalls and then re-installs skills as separate operations, and we always present the full dialog whenever you run `skills get`, which also doesn\u0027t pre-select already installed skills. So there is work to be done there."
    },
    {
      "commit": "ee736ac9603e0ac6cd217645c897a1477296c414",
      "tree": "378451dd0daaa0b75a2d01fad8a1a697730fa0f0",
      "parents": [
        "0efbc6a79389bf9a89eaf98852f4c3ff4add4732"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jun 10 13:22:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 13:22:19 2026 -0700"
      },
      "message": "feat: Make dialogs use up all the vertical space available (#28)\n\nUse `stdout.terminalLines` to set the max number of items to show at a time in dialogs.\n\nChange default to 10 items (if we can\u0027t compute the terminal lines), with a minimum of 5."
    },
    {
      "commit": "0efbc6a79389bf9a89eaf98852f4c3ff4add4732",
      "tree": "5fe47fcc14c0c7e3eeee9d3f0a5bb7932793661d",
      "parents": [
        "1aabbabb12071ecedb88cabbf1830713983120e9"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Jun 10 08:00:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 12:00:32 2026 -0300"
      },
      "message": "chore: Hotfix a 0.3.1 release that allows config 0.9.x (#27)"
    },
    {
      "commit": "1aabbabb12071ecedb88cabbf1830713983120e9",
      "tree": "e757b3b5f460a8004f1907edb27883d7d485808f",
      "parents": [
        "2f0ae262340ea80c264e0f011960519b3e3469aa"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 08 10:22:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 10:22:59 2026 -0700"
      },
      "message": "Support workspace security advisories (#24)\n\nFixes https://github.com/dart-lang/ai/issues/487\n\n- All found versions of a package are now returned when resolving a workspace (de-duped by path instead of name)\n- When resolving a single package that is a part of a workspace, uses the workspace pubspec.lock and package config\n- Updates ResolvedPackage to remember the package config that it was resolved from (this is used to find the appropriate pubspec.lock).\n- Skills are now de-duped by name when installing. If multiple versions of a package are found when installing, the skills from each are installed. For the duplicate skills we just install the first one (this retains old behavior)."
    },
    {
      "commit": "2f0ae262340ea80c264e0f011960519b3e3469aa",
      "tree": "3c14990345f60deba4d634e4d6e0354250cce2af",
      "parents": [
        "4536dc65bfb3bbd5f5820a3e9697cb52812fc353"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Jun 04 11:12:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 11:12:16 2026 -0700"
      },
      "message": "Add skill selection dialogs when installing and removing skills (#21)\n\nNow that you can select both packages and skills, the rest args no longer make sense, so I made a few changes related to that:\n\n- Changed package names to a `--package` multi option instead of rest args\n- Added a `--skill` multi-option argument for listing skills\n- Changed magic `all` package name to a `--all` flag, this applies to both packages and skills, unless either is specified through their options\n\nI also made some other smaller refactors:\n\n- package/skill name sets are never nullable, instead empty sets are treated as \"all\"\n- allow the fake dialog to handle several dialogs\n\n\nCloses https://github.com/dart-lang/ai/issues/458\n\n* update changelog\n\n* remove _prettyGitUrl\n\n* rename pkgEntry to skills (after extracting the skills)\n\n* Clarify comment in get_skills.dart\n\nCo-authored-by: Kenzie Davisson \u003c43759233+kenzieschmoll@users.noreply.github.com\u003e\n\n* code review fix + test\n\n* add changelog note about the allFlag parameter\n\n---------\n\nCo-authored-by: Kenzie Davisson \u003c43759233+kenzieschmoll@users.noreply.github.com\u003e"
    },
    {
      "commit": "4536dc65bfb3bbd5f5820a3e9697cb52812fc353",
      "tree": "55eb999e990002a30d3cd84764aebe0a68a3dac8",
      "parents": [
        "26b3db136ef2d2db59109206c091dda216a61c2f"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 01 17:08:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 17:08:55 2026 -0700"
      },
      "message": "Provide a package selection dialog when installing skills (#17)\n\nThis provides not only a bit more transparency into what exactly is being installed, but also lets you pick and choose which packages skills you ultimately do install. If packages are explicitly given, the dialog is skipped.\n\n- Adds support for multiple trailing arguments so that multiple packages can be explicitly specified on the CLI\n- Adds a magic `all` package name that just means install for all packages.\n- Require either explicit package names or dialog support when installing/removing packages.\n- Updated the `DialogSupport.showMultiSelect` method to take a set of initially selected indices\n  - We use this to select all packages by default.   \n\nCloses https://github.com/dart-lang/ai/issues/457"
    },
    {
      "commit": "26b3db136ef2d2db59109206c091dda216a61c2f",
      "tree": "58b62e53f03324c503436ecf0c835e45a7c30601",
      "parents": [
        "e0c399268f19e23d314401b1ef6175b1808102cd"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 01 13:13:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 13:13:52 2026 -0700"
      },
      "message": "move local manifest file to .config/dart_skills/skils_config.json (#20)\n\nCloses https://github.com/dart-lang/ai/issues/493\n\nThis directory won\u0027t be deleted by `flutter clean`, so local configuration will be retained."
    },
    {
      "commit": "e0c399268f19e23d314401b1ef6175b1808102cd",
      "tree": "ad30eec5de629ac4a5b0c40eafab1bc63cd4fcd7",
      "parents": [
        "6cc1e16c3b5bef09e87e118adc149b4f12fbcdc4"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Jun 01 11:16:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 11:16:55 2026 -0700"
      },
      "message": "feat: add registry command to manage global and local skill registries, drop built-in registries (#19)\n\nThis task ended up snowballing a lot and includes various registry related improvements and a new set of commands:\n\n- Adds `registry add`, `registry list`, and `registry remove` commands.\n  - These support both git URIs and owner/repo formats (which infers GitHub), as trailing arguments. Multiple registries can be added/removed at time.\n- Adds a global config file to store permanent configuration for a machine.\n- Adds support for globally installed registries as well as project level registries.\n  - Includes tracking back links to where registry skills were installed so that when you remove a global registry it can go clean up all of those skills.\n- Adds support for running global migrations, and adds a migration for existing projects. It will ask if they want to retain the existing registries or not. This supports a graceful migration for existing users.\n- The API can still just provide its own list of registries, so serverpod can automatically provide registries if it wants. But the core package does not have any built in registries.\n- Registry layout (flat vs nested) is now inferred and not hard coded in the config.\n\nCloses https://github.com/dart-lang/ai/issues/463\n\nNote that this PR and https://github.com/serverpod/skills/pull/14 are stepping on each toes a bit, whichever lands first though I can reconcile the other one. Or possibly we should just not do #14, as deleting .dart_tool will end up also effectively removing any locally installed registries as well, I am a bit unsure about that."
    },
    {
      "commit": "f9d87894d975ae8f582a9a3ce94630943a3df27f",
      "tree": "5c2cac8dbb223997861c0b369b4b4013afcc3c28",
      "parents": [
        "736b945cd3fb38037d8e5a53d9210fcdee96b6c1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 01 08:43:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 08:43:12 2026 -0700"
      },
      "message": "Bump actions/labeler from 6.0.1 to 6.1.0 in the github-actions group (#492)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "736b945cd3fb38037d8e5a53d9210fcdee96b6c1",
      "tree": "fecf73c841d8daee184cdbcac916d26948f0a83f",
      "parents": [
        "ce2bf90fa509738909bae67e3865647c88b1d919"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu May 28 09:19:44 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 09:19:44 2026 -0700"
      },
      "message": "make some minor changes to improve the pub score (#490)\n\nOne useful thing here is the lower bound on unified_analytics was incorrect."
    },
    {
      "commit": "ce2bf90fa509738909bae67e3865647c88b1d919",
      "tree": "f7b0434b6d9605fe3ecba3ef9e518c2a8c7d6925",
      "parents": [
        "09ac9b19e213dd543a146903fa16323eeedcbda4"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed May 27 11:38:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 11:38:17 2026 -0700"
      },
      "message": "prep to publish dart_mcp_server, remove vendored pubspec, fix lints (#489)\n\nPart of https://github.com/dart-lang/ai/issues/477\n\nI realized we also need to remove the pubspec entirely from the vendored package, otherwise when running locally via a pub workspace it actually got a different language version than it would for real users (since it wouldn\u0027t be a part of the package config, it would get the mcp server packages language version). This would be a potential source of bugs so its better to just never have it be its own package in any context."
    },
    {
      "commit": "09ac9b19e213dd543a146903fa16323eeedcbda4",
      "tree": "e43e6888d8d43d2f870a73887fc7acc0cd7ac5ea",
      "parents": [
        "b05dbe873a9c4581f37721b6b5ef4c4d0246de17"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed May 27 10:23:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 10:23:45 2026 -0700"
      },
      "message": "add back executable section, necessary for dart run (#488)\n\nApparently this is required by `dart run \u003cpackage\u003e@`."
    },
    {
      "commit": "b05dbe873a9c4581f37721b6b5ef4c4d0246de17",
      "tree": "513f6d656336a2cb86e8b49f87cfb3b6d1145965",
      "parents": [
        "261f526348ad12fd9965178b592e2fa0110bcfee"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed May 27 07:12:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 07:12:03 2026 -0700"
      },
      "message": "vendor language_server_protocol under lib/src/third_party (#486)\n\nPossible solution for https://github.com/dart-lang/ai/issues/484.\n\nThis is a near direct copy but I did have to change imports to be relative. And I also formatted it.\n\ncc @athomas @DanTup"
    },
    {
      "commit": "6cc1e16c3b5bef09e87e118adc149b4f12fbcdc4",
      "tree": "2a73d7b7f21502fee72733bb07791b48ef5efad3",
      "parents": [
        "04307f8b3cb1d6df5be60077b6ea4ed5c25a9e4e"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri May 22 14:04:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 14:04:57 2026 -0700"
      },
      "message": "Check for security advisories when installing skills and warn. (#15)\n\nQueries the https://osv.dev database for vulnerabilities when installing skills. UX roughly matches that of `pub get`.\n\nIt will check anything coming from a git repo or hosted pub dependency. \n\nCloses https://github.com/dart-lang/ai/issues/468"
    },
    {
      "commit": "261f526348ad12fd9965178b592e2fa0110bcfee",
      "tree": "2850aea55fd73f9c92655f21866251f9eb7eb8a3",
      "parents": [
        "2816cd6b2e40dc0fd96ab7ea38418fc14d99ece7"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri May 22 08:42:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 08:42:56 2026 -0700"
      },
      "message": "enable analytics if DASH__TOOL is set when running as a package (#483)\n\nCloses https://github.com/dart-lang/ai/issues/478"
    },
    {
      "commit": "2816cd6b2e40dc0fd96ab7ea38418fc14d99ece7",
      "tree": "ab2fd597badbe5ca0a791ee290763758a675ce05",
      "parents": [
        "cc2d19a0e676f450f4b361435d8e3461d3bfc90a"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri May 22 08:42:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 08:42:30 2026 -0700"
      },
      "message": "Graduate dart_mcp_server to be a published package (#485)\n\nBefore we can actually publish, we will have to resolve https://github.com/dart-lang/ai/issues/484.\n\nCloses https://github.com/dart-lang/ai/issues/482"
    },
    {
      "commit": "cc2d19a0e676f450f4b361435d8e3461d3bfc90a",
      "tree": "d419be2aff8badacb5f590cd73af1b19dc0673e0",
      "parents": [
        "8d052acce78b34eb0aff9701715549003d7e82b0"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu May 21 08:27:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 08:27:04 2026 -0700"
      },
      "message": "check for DART_ROOT environment variable to find the SDK (#481)\n\nWe still also check for `Platform.resolvedExecutable` etc, but first we check for this variable, which is now set by `dart run` and other dartdev commands.\n\nWe also keep a DART_SDK and FLUTTER_SDK fallback since these were previously supported.\n\nCloses https://github.com/dart-lang/ai/issues/480"
    },
    {
      "commit": "04307f8b3cb1d6df5be60077b6ea4ed5c25a9e4e",
      "tree": "92dd9c8b088aebcb6195934a0b4753c984eb15be",
      "parents": [
        "5e6fa8d06b3a9c30ef67413a252ff16579d553b5"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu May 21 06:49:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 10:49:19 2026 -0300"
      },
      "message": "refactor: Migrate cache directory from `.dart_skills` to `.dart_tool/skills`. (#14)\n\n* Move config directory to .dart_tool/skills and add migration\n\n* Update AGENTS.md for new path\n\n* Revert load methods to take File and add loadFromRoot\n\n* code cleanup\n\n* use test_descriptor validate\n\n* update changelog/pubspec\n\n* format\n\n* add file content expectation\n\n* remove unused import\n\n* remove unused import"
    },
    {
      "commit": "8d052acce78b34eb0aff9701715549003d7e82b0",
      "tree": "28b4c699c1541daabb00d0434cea882203bb7921",
      "parents": [
        "9c96bfe5f091c9451eff5b59c9bffeb2e806b875"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed May 20 10:00:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 10:00:58 2026 -0700"
      },
      "message": "add a tool to make arbitrary vm service method calls (#473)\n\nAdds a new tool `call_vm_service_method`, which takes an app uri, method name, isolate ID, and arguments, and returns the raw vm service response.\n\nWhile low level, you can easily write various skills on top of this API to do things such as calling custom VM service methods (specific to a package or app), setting breakpoints, evaluating expressions, etc.\n\nUltimately it is a very powerful building block for arbitrary agent interactions, and anybody can write skills to guide agents through complex use cases.\n\nCloses https://github.com/dart-lang/ai/issues/472"
    },
    {
      "commit": "5e6fa8d06b3a9c30ef67413a252ff16579d553b5",
      "tree": "9e36706a72c31565e15b9a71dff6d5fc76543c7f",
      "parents": [
        "047655e06ae8db46d444aaf7024e15af77be8421"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue May 12 07:19:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 07:19:34 2026 -0700"
      },
      "message": "add selection dialog to choose an IDE if not detected (#16)\n\nIf we can\u0027t detect an IDE but have dialog support, just directly let the user choose which IDEs to install on\n\nCloses https://github.com/dart-lang/ai/issues/466"
    },
    {
      "commit": "047655e06ae8db46d444aaf7024e15af77be8421",
      "tree": "1b39fe7959f5b420efebc1e82e7f3002b6ab129d",
      "parents": [
        "e91b9aa64777bf15c3af2ceeec083aa1a13e16c9"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon May 11 10:33:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 14:33:32 2026 -0300"
      },
      "message": "feat: Add migration from `.agent/skills` to `.agents/skills` with auto migration script (#12)"
    },
    {
      "commit": "e91b9aa64777bf15c3af2ceeec083aa1a13e16c9",
      "tree": "1b497db02d3d55833630ee974301dd5973ccc782",
      "parents": [
        "17c33a2404b4a1a880ca0d2afbd54eab6db120f8"
      ],
      "author": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Tue May 05 11:06:34 2026 -0300"
      },
      "committer": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Tue May 05 11:06:34 2026 -0300"
      },
      "message": "chore: Bumps version to 0.3.0 and updates CHANGELOG\n"
    },
    {
      "commit": "17c33a2404b4a1a880ca0d2afbd54eab6db120f8",
      "tree": "39f9f15b6c35f07391f1858a4290ab5247bb9505",
      "parents": [
        "a9972a8f8406c888c4af4fdf655acbf5378f41a5"
      ],
      "author": {
        "name": "Hugo Alberto Garcia",
        "email": "15798087+hugo-bluecorn@users.noreply.github.com",
        "time": "Tue May 05 15:46:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 10:46:45 2026 -0300"
      },
      "message": "feat: inject user-invocable: false in ClaudeAdapter (#4)\n\nCo-authored-by: Hugo Bluecorn \u003chugo.bluecorn@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Marcelo Soares \u003cmarcelo.me.soares@gmail.com\u003e"
    },
    {
      "commit": "a9972a8f8406c888c4af4fdf655acbf5378f41a5",
      "tree": "dccbb8d8281932cdcf537393a3f5f984b165c64c",
      "parents": [
        "0f330256d02fa20bec1c7259240938babd6ebc67"
      ],
      "author": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Tue May 05 10:01:44 2026 -0300"
      },
      "committer": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Tue May 05 10:02:00 2026 -0300"
      },
      "message": "feat: Export `getSkills` for programmatic usage as part of the public API\n"
    },
    {
      "commit": "0f330256d02fa20bec1c7259240938babd6ebc67",
      "tree": "090aa3c7d9bc3146c8dbc23aadad006917dcca78",
      "parents": [
        "c2f79f0922431c85d42ebd262703e4860ac2be58"
      ],
      "author": {
        "name": "Aboo",
        "email": "azarnoush@gmail.com",
        "time": "Tue May 05 22:56:54 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 09:56:54 2026 -0300"
      },
      "message": "feat: Adds support for OpenCode (#8)\n\nAdds the OpenCode adapter and enables auto-detection of the `.opencode` directory. Skills are installed to `.opencode/skills/` as per the OpenCode specification.\n\nFixes #7"
    },
    {
      "commit": "c2f79f0922431c85d42ebd262703e4860ac2be58",
      "tree": "ea440d5cc681878622a657242b939f7bd1aec61b",
      "parents": [
        "7ffcf36469b2193f737a29c94f7152aed38dc4db"
      ],
      "author": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Mon May 04 20:46:44 2026 -0300"
      },
      "committer": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Mon May 04 20:46:44 2026 -0300"
      },
      "message": "chore: Bumps version to 0.2.2 and updates CHANGELOG\n"
    },
    {
      "commit": "7ffcf36469b2193f737a29c94f7152aed38dc4db",
      "tree": "da5770b91a81df330fed24d1c06b083ea2f312f1",
      "parents": [
        "611337d3a5371d656c17f06af1bcd9505318c7e8"
      ],
      "author": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Mon May 04 20:45:00 2026 -0300"
      },
      "committer": {
        "name": "Marcelo Soares",
        "email": "marcelo.me.soares@gmail.com",
        "time": "Mon May 04 20:45:00 2026 -0300"
      },
      "message": "chore: Add publish CI pipeline\n"
    },
    {
      "commit": "611337d3a5371d656c17f06af1bcd9505318c7e8",
      "tree": "f233cebddb03fc107c6c5c39a28f5039f55b253a",
      "parents": [
        "3061197127f84753826062c085c346376db3624e"
      ],
      "author": {
        "name": "Lucky Ebere",
        "email": "58946834+Crazelu@users.noreply.github.com",
        "time": "Tue May 05 00:41:44 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 20:41:44 2026 -0300"
      },
      "message": "feat: Extract skill installation into `getSkills` method for external usage (#13)\n\nCo-authored-by: Copilot \u003ccopilot@github.com\u003e"
    },
    {
      "commit": "9c96bfe5f091c9451eff5b59c9bffeb2e806b875",
      "tree": "4bd5fa8927354a54d991fc7868d0e74052ceb490",
      "parents": [
        "af7e8292fcb368ad27e31602661513d77a72cd54"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon May 04 09:35:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 09:35:46 2026 -0700"
      },
      "message": "Add test for DTD discovery (#465)"
    },
    {
      "commit": "af7e8292fcb368ad27e31602661513d77a72cd54",
      "tree": "4bd5fa8927354a54d991fc7868d0e74052ceb490",
      "parents": [
        "f151df92782103faf259379455fb696d94ded8f0"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon May 04 08:36:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 15:36:10 2026 +0000"
      },
      "message": "Add test for DTD discovery (#465)\n\nCloses https://github.com/dart-lang/ai/issues/405\r\n\r\nThis expands the existing test just a bit to ensure that a DTD instance spawned completely outside of the test harness is discoverable via the MCP server."
    },
    {
      "commit": "f151df92782103faf259379455fb696d94ded8f0",
      "tree": "7b23af337db8b37bf4ca798c098259d8bff73996",
      "parents": [
        "03d251c959bacb97fcd221933ef4ac3992c0491c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri May 01 07:54:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 07:54:12 2026 -0700"
      },
      "message": "Bump actions/cache from 5.0.4 to 5.0.5 in the github-actions group (#464)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "03d251c959bacb97fcd221933ef4ac3992c0491c",
      "tree": "81e027d99e2def59871a7e1ab58f604901338456",
      "parents": [
        "7270c43155f03423966891fe65a69676c7fdefc5"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Apr 30 12:34:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 12:34:59 2026 -0700"
      },
      "message": "add obsolete issues skill (#462)"
    },
    {
      "commit": "7270c43155f03423966891fe65a69676c7fdefc5",
      "tree": "55c879a840be8ef0251feb5e5797ffdbe35ac75d",
      "parents": [
        "07af327b141a173229fa6154ded97a417c870077"
      ],
      "author": {
        "name": "Sourav-Sonkar",
        "email": "58032164+Sourav-Sonkar@users.noreply.github.com",
        "time": "Wed Apr 29 01:14:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:44:51 2026 -0700"
      },
      "message": "fix: graceful shutdown of orphaned test apps on windows (#438)\n\nFixes #407\n\nThis PR resolves the multi-app DTD test teardown failure on Windows.\n\n**What this PR changes:**\n- Modified the test dummy applications in `dtd_multiple_connection_test.dart` and `infinite_wait.dart` to gracefully shut down by listening to `stdin` and calling `exit(0)` when the pipe is closed.\n\n**Why:**\nOn Windows, when `AppDebugSession` terminates the parent `dart run` test process via `process.kill()`, the child `dart` process running the infinite `while(true)` loop tends to be left orphaned. This orphaned process maintained a lock on the `d.sandbox` directory, preventing the test framework from deleting the temp directory during teardown and throwing a \"file in use\" or \"access denied\" error. By having the test fixture scripts monitor `stdin` and exit on its closure, the child process dies gracefully as soon as the test stops the debug session or the test forcefully crashes."
    },
    {
      "commit": "07af327b141a173229fa6154ded97a417c870077",
      "tree": "5066f150d13c3b06940743e50163b4dad315085d",
      "parents": [
        "ff1866d245cb483fa1ae0876af44b0312b099f52"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 28 11:11:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:11:31 2026 -0700"
      },
      "message": "Update dependencies (#453)"
    },
    {
      "commit": "ff1866d245cb483fa1ae0876af44b0312b099f52",
      "tree": "841bb692fb6781d1efec3db32aa312d78b54736e",
      "parents": [
        "8ce74503fc41368111348eb1dd50cdfa9ec657c6"
      ],
      "author": {
        "name": "Goweii",
        "email": "goweii@163.com",
        "time": "Wed Apr 29 00:13:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 09:13:33 2026 -0700"
      },
      "message": "fix: Add empty properties object to tool input schemas to resolve Claude 400 validation error (#444)\n\nfix: Add empty properties object to tool input schemas to resolve Claude 400 validation error\n\n## Description\n\nThis PR fixes a 400 validation error that occurs when using the Dart MCP server with Claude Code, Claude Desktop, LMStudio, and other AI clients that strictly validate tool input schemas.\n\n### Problem\n\nSeveral MCP tools defined in the server have an `inputSchema` that lacks a `properties` object. While the MCP specification states that only `type` is required for tool input schemas, some clients (including Claude Code, LMStudio, and VS Code) expect `properties` to be present and throw validation errors when it is missing.\n\nThe affected tools are:\n- `mcp_dart_sdk_mcp__analyze_files`\n- `mcp_dart_sdk_mcp__get_active_location`\n- `mcp_dart_sdk_mcp__get_selected_widget`\n- `mcp_dart_sdk_mcp__get_widget_tree`\n- `mcp_dart_sdk_mcp__take_screenshot`\n\nAdditionally, the `pub_dev_search` tool has an excessively long description that causes truncation warnings in some clients.\n\nClaude Code produces the following error when these tools are registered:\n```\nAPI Error: 400 {\"type\":\"error\",\"error\":{\"type\":\"invalid_request_error\",\"message\":\"request.tools.22.input_schema.properties: Required\"}}\n```\n\n### Solution\n\nThis PR updates the tool definitions to:\n1. Add an empty `properties: {}` object to the `inputSchema` of all tools that do not require any input parameters\n2. Truncate the description of the `pub_dev_search` tool to comply with client limitations (1024 characters)\n\n### Related Issue\n\nFixes #170 (https://github.com/dart-lang/ai/issues/170#issuecomment-3920296030)\n\n### Testing\n\n- [ ] Verified that the MCP server starts without validation warnings in VS Code\n- [x] Verified that Claude Code can successfully register and call all tools without 400 errors\n- [ ] Verified that existing tool functionality remains unchanged\n\n### Notes for Reviewers\n\nAccording to the MCP specification, `properties` is optional in the `inputSchema` definition:\n```typescript\nexport interface Tool {\n  inputSchema: {\n    type: \"object\";\n    properties?: { [key: string]: object };\n    required?: string[];\n  };\n}\n```\n\nHowever, adding an empty `properties` object is a simple, low-risk change that improves compatibility with clients that implement stricter validation, such as LMStudio (which defines `properties` as a required field in its `LLMToolParameters` type) and Claude Code."
    },
    {
      "commit": "8ce74503fc41368111348eb1dd50cdfa9ec657c6",
      "tree": "0e17d8b91e617922d24ca5a5809be4bbc0250a9b",
      "parents": [
        "899e56256ea82e01b3c9d78248cb5c582c56cb0f"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Apr 16 11:03:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 11:03:55 2026 -0700"
      },
      "message": "add gemini code assist configuration for reviews (#443)\n\nBased on the devtools config at https://github.com/flutter/devtools/blob/master/.gemini/config.yaml"
    },
    {
      "commit": "899e56256ea82e01b3c9d78248cb5c582c56cb0f",
      "tree": "b3932b45cd471fac7943b2905a31b353ffdc0e02",
      "parents": [
        "3d3b7fdaddead83ce262377e5c4ce5b2a843066c",
        "5eae0aef1cd1435a3a7d4b19e7e7a9f6e38cc991"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 14 11:38:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 11:38:29 2026 -0700"
      },
      "message": "Merge cherry-pick branch into main (#442)\n\nMerges the cherry-pick branch into main to ensure it doesn\u0027t get GC\u0027d"
    },
    {
      "commit": "5eae0aef1cd1435a3a7d4b19e7e7a9f6e38cc991",
      "tree": "b3932b45cd471fac7943b2905a31b353ffdc0e02",
      "parents": [
        "3d3b7fdaddead83ce262377e5c4ce5b2a843066c",
        "1e69aa896fa23c93458017ee9b0bfacf446cb616"
      ],
      "author": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 14 18:27:49 2026 +0000"
      },
      "committer": {
        "name": "Jake Macdonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 14 18:27:49 2026 +0000"
      },
      "message": "Merge remote-tracking branch \u0027origin/cherry-pick\u0027 into merge-cherry-pick\n"
    },
    {
      "commit": "1e69aa896fa23c93458017ee9b0bfacf446cb616",
      "tree": "217b8abee3776b663d4486d435598b829aa10326",
      "parents": [
        "a3a196bf4773c7a7a9f93b6798232fb0d8220bc3"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 14 11:20:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 11:20:43 2026 -0700"
      },
      "message": "re-implement most of #440 for the current stable release (#441)"
    },
    {
      "commit": "3d3b7fdaddead83ce262377e5c4ce5b2a843066c",
      "tree": "b3932b45cd471fac7943b2905a31b353ffdc0e02",
      "parents": [
        "07df396bdb15cb52edbe59b4bc2c5648c2203781"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Apr 13 14:11:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 14:11:43 2026 -0700"
      },
      "message": "Enable roots tools always, collapse under one tool (#440)\n\nFixes https://github.com/dart-lang/ai/issues/439 - and hopefully all future roots issues.\n\nThis enables adding/removing roots at will and will merge those with any roots set by the client.\n\n## Security implications\n\nThe Dart MCP server in general doesn\u0027t perform destructive operations (outside of dart format), so security implications here are light. It does mean that an agent attached to one workspace, can actually interact with other dart projects through the MCP server, but I think that is generally a plus.\n\nEverything is still guarded behind a tool call, so users can choose to not auto-approve based on their agent settings, and any adding/removing of roots will be explicit in that mode."
    },
    {
      "commit": "07df396bdb15cb52edbe59b4bc2c5648c2203781",
      "tree": "b106c09df9b07dd637e1e87a34ae0514b732c6bd",
      "parents": [
        "f1cddc8e1905b9a5753a93ce451522e564311251"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Apr 07 13:59:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:59:34 2026 -0700"
      },
      "message": "add some instructions for connecting to apps to the README.md (#425)\n\nAdds some basic documentation for connecting to flutter and dart applications, with hints about `--observe` and `--print-dtd`.\n\nCloses https://github.com/dart-lang/ai/issues/416"
    },
    {
      "commit": "f1cddc8e1905b9a5753a93ce451522e564311251",
      "tree": "f5baee6f2abaa8ff6079b869c7eb206220a31f5a",
      "parents": [
        "4bc6fd793c80b5c8cc58939435b4b542c2c04572"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Apr 02 12:12:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 12:12:14 2026 -0700"
      },
      "message": "Add support for custom tool metrics, implement some for analyzer tools (#423)\n\nNow that analysis server starts up lazily, we want to capture how much of any given call went towards that initialization versus actual work in the tool call. This also will capture how much extra time is added in order to apply quick fixes.\n\nDetails:\n- Adds elapsed time and boolean for whether the server was started to the `withAnalysisServer` callback \n- Adds a new `customMetrics` extension on `CallToolResult` which uses an expando to store additional analytics information for a given tool call.\n- Adds support to `CallToolMetrics` to merge this extra information into the analytics data (flat merge)."
    },
    {
      "commit": "4bc6fd793c80b5c8cc58939435b4b542c2c04572",
      "tree": "c963de51d514d21ee47e9c1f27f4aa4715d4fa23",
      "parents": [
        "a5ed11e4c4880b35a55b995321c19a6b58fa0867"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 01 07:23:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 07:23:03 2026 -0700"
      },
      "message": "Bump the github-actions group with 2 updates (#421)\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a5ed11e4c4880b35a55b995321c19a6b58fa0867",
      "tree": "64c01cef3846b68e76b006bcf3f9002ffef5af61",
      "parents": [
        "e637e7fea4f80142e5a8f023407eec94d7861b62"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Mar 30 13:22:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 13:22:14 2026 -0700"
      },
      "message": "Add `listDtdUris` command to the DTD tool, drop auto DTD connection logic. (#418)\n\nRelated to https://github.com/dart-lang/ai/issues/416.\n\nThis changes the flow for connecting to DTD to require an extra tool call in most cases (list then connect), but also makes things a lot more explicit and also less confusing for the agents.\n\nEventually, this `listDtdUris` command should become just a skill or something like that, but given it is a new command agents won\u0027t know about it out of the box, and adding it as an MCP subcommand should make things much more reliable in general.\n\nAlso adds the application name if provided when listing apps, and fixes a bug where _all_ connected apps would be listed under each DTD URI, instead of only the apps relevant to that DTD instance."
    },
    {
      "commit": "e637e7fea4f80142e5a8f023407eec94d7861b62",
      "tree": "8ae88dfd3849a173690769b1b0711912c5f46ca5",
      "parents": [
        "62370cb632d6e5418ed1571969c2d7f3d442567a"
      ],
      "author": {
        "name": "Ortes",
        "email": "malo.allee@gmail.com",
        "time": "Thu Mar 26 11:19:38 2026 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 07:19:38 2026 -0700"
      },
      "message": "[dart_mcp_server] flutter_driver: expose set_frame_sync command (#392)\n\nFixes #391.\n\n## Change\n\nUncomment `set_frame_sync` from the `flutter_driver_command` enum in `dtd.dart`. The `enabled` parameter was already present in the schema — this is a one-line change.\n\n## Why\n\nApps with continuous animations (Rive, Lottie, loading spinners) keep `SchedulerBinding.transientCallbackCount \u003e 0` indefinitely, causing `tap`, `waitFor`, and other finder-based commands to always time out. Calling `set_frame_sync` with `enabled: false` disables frame synchronization for the session, unblocking those commands — but it was unreachable through the MCP tool due to the enum restriction."
    },
    {
      "commit": "62370cb632d6e5418ed1571969c2d7f3d442567a",
      "tree": "da03d78139f6725ab15b1ec051a03c302c403ceb",
      "parents": [
        "325fe27f493a64ae82b39ac32a0d2de7354477cd"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Mar 25 13:40:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 13:40:01 2026 -0700"
      },
      "message": "enable the set_semantics flutter driver command (#415)\n\nThis enables agents to enable or disable the semantics tree, which can help with finding and selecting certain elements on the page."
    },
    {
      "commit": "325fe27f493a64ae82b39ac32a0d2de7354477cd",
      "tree": "c743cc045b5adaa9fa53bcc14b04f1711ac02851",
      "parents": [
        "326a0a34ffe2c328deabfab136bf856feddf976f"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Wed Mar 25 08:08:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 08:08:54 2026 -0700"
      },
      "message": "start analysis server instances lazily, and time them out after 10 mins (#411)\n\nFixes https://github.com/dart-lang/ai/issues/399\n\nRefactors how the analysis server is handled so that you now pass a callback to a `withAnalysisServer` function, which is given a reference to a live analysis server.\n\nThis function tracks the number of callbacks holding on to an analysis server instance. Once there are no callbacks using an analysis server, we start a 10 minute timer to shut it down. This timer is also reset at the top of `withAnalysisServer`."
    },
    {
      "commit": "326a0a34ffe2c328deabfab136bf856feddf976f",
      "tree": "3b7452a9d1544f28ef4a3d9dc9dcf22d06554b46",
      "parents": [
        "8370c7b351424617f695f7ae88e24668feac37d7"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Mar 24 12:35:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:35:57 2026 -0700"
      },
      "message": "include subcommand name in tool name when present for analytics (#410)\n\nGiven that we have moved more towards meta-tools with subcommands, we are going to lose some of the granularity on our tool call analytics.\n\nThis will restore that by including the subcommand as a part of the `tool` parameter, using `\u003ctool\u003e.\u003csubcommand\u003e` syntax.\n\nThis will make analytics a bit awkward during the transition, but it shouldn\u0027t be too bad.\n\nWe could decide to _just_ use the sub-command name if we wanted to try and keep the analytics consistent."
    },
    {
      "commit": "8370c7b351424617f695f7ae88e24668feac37d7",
      "tree": "13e6ec99345ad8200b7697fda767b211b2dafed2",
      "parents": [
        "67a879eee8abf1ea22dde3bb114009d1721276b8"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Tue Mar 24 10:13:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:13:20 2026 +0000"
      },
      "message": "change analyze output to be more compact (#409)\n\nFixes https://github.com/dart-lang/ai/issues/371\r\n\r\nThe output is now very similar to `dart analyze`.\r\n\r\nWhen analyzing the Dart SDK, which has 399 diagnostics for my configuration, this reduced the output size from 160KB to 92KB.\r\n\r\nThe old output was just the pure JSON of the diagnostic, and now it looks like this:\r\n\r\n```md\r\n# Diagnostics for root \u003cyour-root-uri\u003e\r\n\r\nwarning • pkg/front_end/test/id_testing/data/directory_testing/pubspec.yaml:1:1 • The \u0027name\u0027 field is required but missing.\r\nTry adding a field named \u0027name\u0027. • missing_name\r\n\r\nwarning • pkg/front_end/test/language_versioning/data/specified_packages_01/pubspec.yaml:1:1 • The \u0027name\u0027 field is required but missing.\r\nTry adding a field named \u0027name\u0027. • missing_name\r\n```\r\n\r\nPaths are relative to each analyzed root instead of encoding the absolute URI in each, and JSON overhead is removed."
    },
    {
      "commit": "67a879eee8abf1ea22dde3bb114009d1721276b8",
      "tree": "fdcca08338fccba706a0a4a035c71b8eb8483321",
      "parents": [
        "ab352a55a1029a7ff5312a1df56cceea98b30e67"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Mar 23 12:28:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 12:28:06 2026 -0700"
      },
      "message": "disable launch_app and all related features by default (#408)\n\nAdds the `flutter_app_lifecycle` category to renable these (`--enable flutter_app_lifecycle`).\n\nAlso somewhat fixes the web server device flows - specifically for the AntiGravity use case. You can now use `launch_app` with the `web_server` device and will just get a URL back to load in the browser.  We no longer wait for the DTD or VmService URIs before returning."
    },
    {
      "commit": "ab352a55a1029a7ff5312a1df56cceea98b30e67",
      "tree": "5340a3c5cdb7ea431be1045b3132ac72176e9666",
      "parents": [
        "8536160d78a34f05bf8668424ab8073b895ddbe7"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Mon Mar 23 10:16:08 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 10:16:08 2026 -0700"
      },
      "message": "add tests for getting runtime errors from multiple apps (#406)\n\nCloses https://github.com/dart-lang/ai/issues/404\n\nI opened https://github.com/dart-lang/ai/issues/405 as well though, as we don\u0027t really have tests of the automatic discovery flow."
    },
    {
      "commit": "8536160d78a34f05bf8668424ab8073b895ddbe7",
      "tree": "e18f97d15431542023713e4c03b0cd6ec744332d",
      "parents": [
        "738019b7b31a678fe61eb2af575bc44274d984df"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Fri Mar 20 10:10:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 20 10:10:38 2026 -0700"
      },
      "message": "Enable quick fixes (#400)\n\nCloses https://github.com/dart-lang/ai/issues/398\n\nAdds an `applyFixes` boolean to the analyze files tool. If passed, then all quick fixes will be applied, and analysis will only return the unfixed diagnostics.\n\n## Highlights\n\n- The MCP server now registers the `workspaceEdit` capability, only handling basic changes since we don\u0027t support file versioning.\n- When `autoFix` is passed to `analyze_files`, we first make an LSP call to `dart.edit.fixAllInWorkspace`. This ends up triggering various workspace edits which we handle and apply (if we can).\n- We then wait again for any ongoing analysis to complete.\n- Then, we return any diagnostics that are still present, following the normal logic.\n\n## Analysis Server Interactions\n\nBelow is the full series of events that now happens when we are applying fixes:\n\n- We send the `dart.edit.fixAllInWorkspace` request\n- We get an analysis start notification (it is computing fixes)\n- We get a diagnostics published notification (twice? unclear why twice)\n- We get one or more workspace edit requests\n- We get an analysis end notification\n- We get an analysis start notification (edits have now been applied presumably)\n- We get a new diagnostics published notification (hopefully fewer!)\n- The original sendRequest call completes\n- We wait for analysis done\n- We get the analysis done notification\n- We return only the remaining diagnostics\n\nThe result is that the tool call applies all fixes and only returns the remaining diagnostics"
    },
    {
      "commit": "738019b7b31a678fe61eb2af575bc44274d984df",
      "tree": "33218f5af92bab9be6b40a5b4541309c0ab0e2a7",
      "parents": [
        "8c64b4c74ecd1f8942a42a80f998e3e081173188"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Mar 19 20:59:05 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 13:59:05 2026 -0700"
      },
      "message": "re-enable the pub tool by default (#401)\n\nThis was previously disabled by default along with many other tools, following the general reasoning that anything which can be done on the CLI should be done on the CLI.\n\nWhile this still holds generally true, the problem with this particular case is it can _also_ be done by just directly editing the `pubspec.yaml` file, and agents often use their outdated knowledge to put bad versions in there. You always want them to end up using `dart pub add` because it will put the latest version that can actually be solved for.\n\nUltimately, it is worth having this tool because when present they do tend to actually use it, where they won\u0027t in my experience use `dart pub add` without some other sort of prompt pushing them to do so.\n\nWe could evaluate in the future whether this can/should be replaced by a skill instead, which would likely have fewer up front tokens since the schema for this tool is somewhat lengthy."
    },
    {
      "commit": "8c64b4c74ecd1f8942a42a80f998e3e081173188",
      "tree": "f3b2fb3446a953fd4d5c862021acf2cf45818d69",
      "parents": [
        "237fe55c084e13c603c9970cb458510092e4561e"
      ],
      "author": {
        "name": "Jacob MacDonald",
        "email": "jakemac@google.com",
        "time": "Thu Mar 19 20:58:17 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 13:58:17 2026 -0700"
      },
      "message": "update server instructions (#402)\n\nMoves much of what was in instructions to the description, dropped the note about preferring MCP tools, and added some more useful information such as encouraging agents to list resources.\n\nI also added a short description of the `package-root:` uris and associated tools."
    },
    {
      "commit": "237fe55c084e13c603c9970cb458510092e4561e",
      "tree": "1572d5035989e9941eb7e2e0f9f4155de90d97d1",
      "parents": [
        "a619d4bba99e736b0fbabd3e8b94b0538e013f46"
      ],
      "author": {
        "name": "Jaime Wren",
        "email": "jwren@google.com",
        "time": "Thu Mar 19 13:36:52 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 11:36:52 2026 -0700"
      },
      "message": "[dart_mcp_server] Add automatic DTD discovery and app fallback (#393)"
    },
    {
      "commit": "3061197127f84753826062c085c346376db3624e",
      "tree": "d7aed3091738da99d2fe4a745283fbeb14e55f5c",
      "parents": [
        "58d043eb50e7e2c76bab8ade228a684710665946"
      ],
      "author": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Tue Mar 17 19:04:25 2026 +0100"
      },
      "committer": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Tue Mar 17 19:04:25 2026 +0100"
      },
      "message": "chore: Bumps version to 0.2.1 and updates README.\n"
    },
    {
      "commit": "58d043eb50e7e2c76bab8ade228a684710665946",
      "tree": "c063e27b8193b85d288fd37d96930735319ff736",
      "parents": [
        "281499e7f40e33c04e3abdc9c698b09fb7496f9a"
      ],
      "author": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 17:08:42 2026 +0100"
      },
      "committer": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 17:08:42 2026 +0100"
      },
      "message": "chore: Bumps version.\n"
    },
    {
      "commit": "281499e7f40e33c04e3abdc9c698b09fb7496f9a",
      "tree": "14b26b9551966fbb72d21e708b508668e0e37ff1",
      "parents": [
        "5fa6a9118d788aaa5cc6aecc28636c8bdbd30ed7"
      ],
      "author": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 17:07:18 2026 +0100"
      },
      "committer": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 17:07:18 2026 +0100"
      },
      "message": "feat: Adds prune command.\n"
    },
    {
      "commit": "5fa6a9118d788aaa5cc6aecc28636c8bdbd30ed7",
      "tree": "d3d53b9874b2c423a821046b7b086bf4541069b0",
      "parents": [
        "c96b6207dfa09afbb38097ebc08432899ce84bdd"
      ],
      "author": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 16:25:30 2026 +0100"
      },
      "committer": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 16:25:30 2026 +0100"
      },
      "message": "feat: Adds support for codex and generic IDEs.\n"
    },
    {
      "commit": "c96b6207dfa09afbb38097ebc08432899ce84bdd",
      "tree": "beabf6ba28c160cd997d38c8c27ea5c043d7a673",
      "parents": [
        "31468be7657004f48e82c60795cf196366166817"
      ],
      "author": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 15:34:50 2026 +0100"
      },
      "committer": {
        "name": "Viktor Lidholt",
        "email": "viktorlidholt@gmail.com",
        "time": "Sun Mar 15 15:34:50 2026 +0100"
      },
      "message": "fix: Lowers required Dart version.\n"
    }
  ],
  "next": "31468be7657004f48e82c60795cf196366166817"
}
