)]}'
{
  "log": [
    {
      "commit": "568bebf2f2a23917ac6ce7d2f2f30aba54a57eca",
      "tree": "0fa126370bdc31193834bd00b2d0ed36b952b82b",
      "parents": [
        "7fe76973f6cba7c7a51f4b896444c2ce3c1ce0d5"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 24 02:44:54 2025 +0000"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 24 02:51:34 2025 +0000"
      },
      "message": "webui: fix IDLE/DISCONNECTED oscillation by replacing initialLoadComplete misuse\n\nFix DataManager session_ended handler that caused rapid status switching\nbetween IDLE and DISCONNECTED when sessions ended.\n\nIssue Description:\nWhen a session ended, the UI\u0027s sketch-call-status component would rapidly\noscillate between IDLE and DISCONNECTED states, suggesting continued\nconnection attempts despite the session being over.\n\nRoot Cause Analysis:\nThe primary issue was session_ended handler improperly firing initialLoadComplete\nevent, confusing timeline component state management. The initialLoadComplete event\nwas added for newsessions functionality but broke assumptions in regular sketch\nsessions. The timeline component expects initialLoadComplete to signal new page\nloads, not ended sessions.\n\nWhen fired for ended sessions, this caused UI re-render cycles and state confusion\nthat interfered with connection status display, creating the oscillation effect.\n\nImplementation Changes:\n- Added sessionDataReady event type for ended session data readiness\n- Modified session_ended handler to emit sessionDataReady instead of\n  initialLoadComplete for ended sessions\n- Preserved initialLoadComplete semantics for active session data loading\n- Added clarifying comment to existing isSessionEnded guard in connect()\n\nSecurity \u0026 Compatibility:\n- No security implications, purely UI state management fix\n- Newsessions component unaffected (doesn\u0027t use initialLoadComplete)\n- Timeline component behavior restored to expected state\n- All existing event handling preserved\n\nThis fix eliminates the connection status oscillation while maintaining\nproper separation of concerns between live session loading and ended\nsession display states.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: scd1b437c8ae7c381k\n"
    },
    {
      "commit": "7fe76973f6cba7c7a51f4b896444c2ce3c1ce0d5",
      "tree": "619c0b433cd856fd2b0a977a3453dd9b79105d54",
      "parents": [
        "3dd3e4144d2e0b9fec6b5e0039ed12e2c0170265"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 23 19:19:01 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 23 19:19:01 2025 -0700"
      },
      "message": "data.ts: add missing .isSessionEnded check in .connect()\n"
    },
    {
      "commit": "3dd3e4144d2e0b9fec6b5e0039ed12e2c0170265",
      "tree": "11eb418a7980cb9f7faa6b1a20dee2e811a24b13",
      "parents": [
        "a6b995b83277dd730e35a8f5be14c139d82a544e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 20:32:03 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 17:53:58 2025 -0700"
      },
      "message": "webui: add diff display for patches\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2e9bdfb014ddec3ck\n"
    },
    {
      "commit": "a6b995b83277dd730e35a8f5be14c139d82a544e",
      "tree": "2cb9d54d6c38916a6639061e2086f24055e68ecf",
      "parents": [
        "57afbca4ac1dbd4351aae93302e34ee45b36a25f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 24 00:45:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 17:53:58 2025 -0700"
      },
      "message": "webui: kill eslint\u0027s no-explicit-any warning dead dead dead\n\nA sign that it maybe it\u0027s not a good fit for us\nis the fact that it was sprinkled around our codebase\nas prolifically as blinding snow in an Antarctic blizzard.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s79f40917a73a3320k\n"
    },
    {
      "commit": "57afbca4ac1dbd4351aae93302e34ee45b36a25f",
      "tree": "6c9222f0c81394c3f1089ceb040a4ca1a0ed9eb0",
      "parents": [
        "aa22eb7947ae6bb09ce558bcfa52a1d8b2b3286a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 13:29:59 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 17:19:23 2025 -0700"
      },
      "message": "llm: rename -dump-ant-calls to -dump-llm\n\nAnd tweak behavior.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1605a29b744ae5f1k\n"
    },
    {
      "commit": "aa22eb7947ae6bb09ce558bcfa52a1d8b2b3286a",
      "tree": "89a95de4ba4f9e7889f6133dea31a7e5f73f54c6",
      "parents": [
        "9dc2f62c6d44f53e057bd7319ffbcbc00ef5f2a0"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 23 19:59:36 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 23 19:59:36 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "9dc2f62c6d44f53e057bd7319ffbcbc00ef5f2a0",
      "tree": "753ea15307dd1ee834ae6973f1a363858e09f4b5",
      "parents": [
        "ddd22da04ed405520012089ffb2bc244b82e41e7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 01:04:00 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 12:58:52 2025 -0700"
      },
      "message": "all: remove multiplechoice tool\n\nIt\u0027s rarely used; doesn\u0027t pull its weight.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s11d827ec20c6ddb8k\n"
    },
    {
      "commit": "ddd22da04ed405520012089ffb2bc244b82e41e7",
      "tree": "56289a404f162c80f848fccacb0a53dec4b0891f",
      "parents": [
        "359273758d4651ec7212d49b963b56b9a7db1e34"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 20:14:50 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 12:58:45 2025 -0700"
      },
      "message": "claudetool: add detail to keyword search error message\n"
    },
    {
      "commit": "359273758d4651ec7212d49b963b56b9a7db1e34",
      "tree": "62bfa9444e6d87f6a883f1f967155d7ae6d2750a",
      "parents": [
        "c67d7bced3a3619cbf031075fa8442a696381c4a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 21:38:17 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 12:58:13 2025 -0700"
      },
      "message": "git_tools: add even more detail when commit fails\n\nFollow-up to 32577b177e34bc7b23183df22d375c9ada146613\n"
    },
    {
      "commit": "c67d7bced3a3619cbf031075fa8442a696381c4a",
      "tree": "27e8b6990244865fd3d020ea1fd4ef56f61fc603",
      "parents": [
        "3b44cc3120b595e82dcc2a6081b8a07fc24c739e"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 23 10:59:02 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 23 19:09:31 2025 +0000"
      },
      "message": "webui/src/data: handle ended and read-only sessions\n"
    },
    {
      "commit": "3b44cc3120b595e82dcc2a6081b8a07fc24c739e",
      "tree": "3d4f3c2911390428c0c89aa8dcd13dbfb035ce31",
      "parents": [
        "f18aafd177a90b928b1c1babbe5e763f85eab56d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 02:28:14 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 20:10:27 2025 -0700"
      },
      "message": "loop: do slug generation outside the agent loop\n\n[This commit message written entirely by a human; it is all useful.]\n\nWe can make a slug based on the first message.\nIt\u0027s good enough.\nThat keeps it--and the slug tool--out of the agent\u0027s context.\nIt\u0027s also one fewer step for extremely short Sketch runs,\nwhich is the straw that broke this particular camel\u0027s back.\n\nThis is a mild UI regression, in that there\u0027s a slight stall\nafter the user types their first message, during which\nthe slug is being generated. See (2) below.\n\nWhile we\u0027re here, add handling of compaction agent messages.\n\nThis leaves two big TODOs outstanding:\n\n1.\n\nUntangle the awful rats nest that is slug and branch management;\nwe have callbacks back and forth and layers and locking and it\u0027s all confusing.\nOne visible for that this ugliness takes is that every time the agent tries out a slug,\nthe top bar in the webui updates, even if we then reject that slug as a duplicate.\nthere are other forms of ugliness, just less visible.\n\n2.\n\nMake slug generation concurrent with the rest of the agent,\nto avoid a short stall right after the user\u0027s first request (ick).\n\nWhen we make slug setting concurrent, we\u0027ll likely need to resuscitate\nthe bashPermissionCheck, except it\u0027ll be \"silently block and wait for\nbackground slug generation to complete\", rather than \"reject the tool call\".\nDitto for about_sketch, and any other tool call that expects\nthe slug or branch name to be set.\n\nGenerally, before undertaking this effort, we should fix (1) above,\nmake convos generally concurrency safe (maybe COW?), and\nfigure out to get race-enabled innie builds.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8ac5f6a9faa611ebk\n"
    },
    {
      "commit": "f18aafd177a90b928b1c1babbe5e763f85eab56d",
      "tree": "84fdd856884c956139be6af5cab76a0c4e1a93be",
      "parents": [
        "1ee0bc6c8f6ee7a6d0b26189815879f7455069c6"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 21 15:15:54 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Jul 22 19:29:50 2025 -0700"
      },
      "message": "Diff view: include boundary commits.\n\nIn a nearly empty repo, you want to include the boundary commits for the\ndiff view list commit list.\n"
    },
    {
      "commit": "1ee0bc6c8f6ee7a6d0b26189815879f7455069c6",
      "tree": "9779a6c73738efb9375887d2dcd6de84a3ddcbc6",
      "parents": [
        "d37f7a73a0b77329d4701edee3d6d9a6b79d4e47"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Tue Jul 22 23:24:18 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 22 23:31:38 2025 +0000"
      },
      "message": "webui: add dark mode support to demo server\n\nCore Component Dark Mode Support:\n- sketch-timeline.ts: Welcome box, loading indicators, thinking bubbles, navigation\n- sketch-tool-card-base.ts: Status icons, elapsed time, hover states, details panel\n- All 14 sketch-tool-card-* components: Consistent dark styling for tool results\n\nDemo System Infrastructure:\n- Enhanced demo runner (demo.html) with complete dark theme CSS variables\n- Added sketch-theme-toggle integration in sidebar for easy theme switching\n- Extended demo-fixtures utilities with semantic color system (8 new CSS variables)\n- Comprehensive color mappings: backgrounds, text, borders, controls, buttons\n\nDemo File Compatibility (13 files updated):\n- Fixed 60+ instances of hardcoded colors across all demo components\n- Replaced light-mode-only colors (#24292f, #f6f8fa, etc.) with CSS variables\n- Updated text colors, backgrounds, borders for proper contrast in both themes\n- Maintained visual hierarchy while ensuring accessibility\n\nTechnical Implementation:\n- CSS custom properties system with automatic :root/.dark theme switching\n- GitHub-inspired dark color palette for professional appearance\n- Smooth 0.2s transitions for seamless theme changes\n- Semantic variable naming for maintainability and consistency\n\nKey Features Added:\n- Theme toggle accessible from any demo (no need to navigate to Theme Toggle demo)\n- Complete visual consistency between light and dark modes\n- Proper contrast ratios throughout for accessibility\n- Tool card demos showcase dark mode styling with realistic content\n\nComponents Updated:\nTimeline: Welcome messages, loading states, thinking indicators, jump button\nTool Cards: Status icons, input/output display, hover states, detailed views\nDemos: Labels, backgrounds, instruction panels, control elements, text content\n\nThe demo system now provides a complete, professional dark mode experience\nthat matches modern development tool standards with excellent usability\nand visual consistency across all components and demonstrations.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s97589e2fe2fdeeb3k\n"
    },
    {
      "commit": "d37f7a73a0b77329d4701edee3d6d9a6b79d4e47",
      "tree": "07e5bb969f7a1e48292fa8c4674f4f1cb9fce58c",
      "parents": [
        "488e8a476fccf2514f3703d0d576c35989987b34"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 13:43:52 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 06:54:08 2025 -0700"
      },
      "message": "webui: make diff UI update after data loads\n\nSometimes diff content would load quickly but the UI would stay stuck\nshowing \u0027Loading...\u0027 for many seconds until some external action\n(like clicking in console) triggered a repaint.\n\nRoot cause: Lit wasn\u0027t automatically detecting that it needed to re-render\nwhen the async loadDiffData() completed and this.loading changed from\ntrue to false.\n\nFix: Explicitly call requestUpdate() to force a re-render after loading\ncompletes, ensuring the UI immediately shows the loaded diff content.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6ba963f401c89febk\n"
    },
    {
      "commit": "488e8a476fccf2514f3703d0d576c35989987b34",
      "tree": "6e4935a8e789057408d1c8037fbca5ab2cbd51b9",
      "parents": [
        "d1b7dd616f47c873e241d2354f03feacce46e637"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 22 02:47:29 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 22 02:47:29 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "d1b7dd616f47c873e241d2354f03feacce46e637",
      "tree": "ca542f2d24021707404ccea1083a8b9bff0b8a9a",
      "parents": [
        "43b60b9b6906a2077175bcb1c3ea53b90d92a9f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:36:23 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "loop: skip TestPortMonitor_ShouldIgnoreProcess on macOS\n\nIt doesn\u0027t work, and can\u0027t be made to work.\n"
    },
    {
      "commit": "43b60b9b6906a2077175bcb1c3ea53b90d92a9f8",
      "tree": "14ecadd5c94db811087f97b0e7858f1482ff5f4e",
      "parents": [
        "95354b15c6469f871ecabd778c04304bcce16195"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 14:57:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "llm: make Tool.Run return ToolOut\n\nThis is preliminary work towards\nallowing tools to add additional information.\nNo functional changes (at least, that\u0027s the intent).\n"
    },
    {
      "commit": "95354b15c6469f871ecabd778c04304bcce16195",
      "tree": "0cf43e5b9d0d071df1557bf158828c4c93626c2f",
      "parents": [
        "e75d0eac125c8b72f8fa899c7d6eb64d6bdedb9e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 00:03:50 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "git_tools: add more detail when commit fails\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sae1162580ef7ab85k\n"
    },
    {
      "commit": "e75d0eac125c8b72f8fa899c7d6eb64d6bdedb9e",
      "tree": "261087d7f452f5e99b75bada3643fc0da9cc5427",
      "parents": [
        "f2b5ee0011655cae4e3c977eaec6255ae46a5b88"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 23:50:44 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "llm/ant: convert dumpText constant to dump-ant-calls command line flag\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd58268f97ed95de8k\n"
    },
    {
      "commit": "f2b5ee0011655cae4e3c977eaec6255ae46a5b88",
      "tree": "c0ccbaa55962839542939083521b0a344a71c1d3",
      "parents": [
        "44de46c38652047d3ff70b59f69d00bad4985561"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 16:42:53 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "llm/ant: dump debug to files, not stdout\n\n- doesn\u0027t break termui\n- easier to tell apart different requests\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0e399715e9573285k\n"
    },
    {
      "commit": "44de46c38652047d3ff70b59f69d00bad4985561",
      "tree": "ada533469ed18d0e3ccc29870a620e5b5edef219",
      "parents": [
        "15a0ffa7a68f5915eaed6044260edc794c806283"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 16:14:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "mcp: fix ineffectual break\n\nCaught by gopls, surfaced by sketch.\n"
    },
    {
      "commit": "15a0ffa7a68f5915eaed6044260edc794c806283",
      "tree": "20f7b89d99ff320f89ebb7025cc71aa2bcef3597",
      "parents": [
        "0f00427c39583c905df906ed16843dadce8e19bd"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 15:53:48 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "webui: improve reconnection delays\n\n- make them a lot more aggressive,\n  as the user is likely sitting and staring at the screen\n- make the numbers rounder (easier to grok)\n- add some jitter\n"
    },
    {
      "commit": "0f00427c39583c905df906ed16843dadce8e19bd",
      "tree": "bedcfe4b085e781317c7f2a40998094423b168fe",
      "parents": [
        "106f6f5472c233011b6abee307cb6cd0e962f718"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 22:40:03 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "webui: refactor reconnection timeout logic to use lookup table\n\nNo functional changes.\nJust a lot clearer, and a lot easier to reason about and edit.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s3faf2c10280df867k\n"
    },
    {
      "commit": "106f6f5472c233011b6abee307cb6cd0e962f718",
      "tree": "06caf9e7ab2a1ecafebdc6d9a3a9846d8cfe161c",
      "parents": [
        "cf724583660cf683efa7fd8eb9b32e120e88beb7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 15:22:00 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 21 19:46:45 2025 -0700"
      },
      "message": "claudetool: tweak bashkit error message when changing branches\n\n- remove reference to outie (normal sketch sessions\n  don\u0027t have the concept introduced in the prompt anywhere)\n- tweak wording for precision\n- add some extra details\n- point out the Push button\n- let claude rewrite a bit for concision\n"
    },
    {
      "commit": "cf724583660cf683efa7fd8eb9b32e120e88beb7",
      "tree": "ca8f4072f3e131ace3400552698caa04786a155c",
      "parents": [
        "4432056dc2db2f4b9b1120a890255a540a4c8537"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Mon Jul 21 22:22:57 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 21 22:45:56 2025 +0000"
      },
      "message": "skaband: move timeline viewer from sketch/webui to resolve bundle conflicts\n\nMove read-only timeline viewer functionality from sketch/webui to skaband\nto eliminate custom element registration conflicts when using newsessions\nwith newui\u003dtrue parameter.\n\nChanges made:\n- Created skaband/sketch-timeline-readonly.ts with timeline viewer functionality\n- Updated skaband/messages.gohtml to use local sketch-timeline-readonly.js bundle\n- Removed messages-viewer.ts from sketch/webui build configuration\n- Updated Makefile to remove messages-viewer bundle extraction steps\n- Added sketch-timeline-readonly.ts to skaband build.js entry points\n\nFiles created:\n- skaband/sketch-timeline-readonly.ts: Timeline viewer component for archived sessions\n- skaband/sketch-timeline-readonly.test.ts: Test coverage for timeline functionality\n\nFiles removed:\n- sketch/webui/src/messages-viewer.ts: Relocated to skaband\n- sketch/webui/src/messages-viewer.test.ts: Relocated to skaband\n\nBuild configuration updates:\n- sketch/webui/esbuild.go: Remove messages-viewer.ts from bundleTs arrays\n- sketch/webui/package.json: Remove messages-viewer.js export\n- skaband/build.js: Add sketch-timeline-readonly.ts entry point\n- Makefile: Remove messages-viewer bundle extraction from build and prepare-deploy\n\nThe timeline viewer is only used by skaband for archived session viewing,\nso co-locating it with skaband eliminates the architectural issue where\nboth messages-viewer.js and newsessions-components.js contained overlapping\ncustom elements (sketch-timeline, sketch-tool-card-*, etc.) causing\nregistration conflicts.\n\nThis change resolves bundle conflicts on /newsessions?newui\u003dtrue while\nmaintaining identical functionality for archived message viewing.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd62ec3594672899ek\n"
    },
    {
      "commit": "4432056dc2db2f4b9b1120a890255a540a4c8537",
      "tree": "8e9738b3335fb5112ddb2ebfe70fe3aa8fb23f44",
      "parents": [
        "d8eb4649835351b57d0143242b96547e8e67a14a"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Mon Jul 21 11:09:38 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 21 18:10:38 2025 +0000"
      },
      "message": "webui: update DEAR_LLM.md, rm .shadowRoot refs\n"
    },
    {
      "commit": "d8eb4649835351b57d0143242b96547e8e67a14a",
      "tree": "14130199c24d7b38777288b0d9849d36dac8d4c2",
      "parents": [
        "44f7616740655a904c6b0319d739bfce97f4951b"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Mon Jul 21 03:04:52 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 21 17:50:00 2025 +0000"
      },
      "message": "webui: migrate sketch-monaco-view to tailind\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2b8f6e849aabb45fk\n"
    },
    {
      "commit": "44f7616740655a904c6b0319d739bfce97f4951b",
      "tree": "6728e7919443b389c53009365efc881089e47671",
      "parents": [
        "581bd795582ab99b1aa81a39466a8433c14d4485"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Mon Jul 21 03:04:52 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 21 03:09:20 2025 +0000"
      },
      "message": "webui: remove sketch-network-status component\n\nRemove legacy sketch-network-status component that was emptied in\nprevious commits. The component has been superseded by sketch-call-status\nwhich handles all connection status functionality.\n\nFiles removed:\n- sketch-network-status.ts: Component with empty render (display: none)\n- sketch-network-status.test.ts: Test file for invisible component\n- sketch-network-status.demo.ts: Demo file for non-functional component\n\nUpdated references:\n- sketch-app-shell-base.ts: Remove import and component usage\n- status-indicators.demo.ts: Remove unused import\n- demo-framework/demo-runner.ts: Remove from component list\n- index-generated.html: Regenerated without network status demo\n\nConnection status functionality is now fully handled by sketch-call-status\ncomponent which properly displays IDLE/WORKING/DISCONNECTED states with\nvisual indicators and animations. This removal eliminates dead code and\nreduces the LitElement migration scope to just sketch-monaco-view.ts.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2b8f6e849aabb45fk\n"
    },
    {
      "commit": "581bd795582ab99b1aa81a39466a8433c14d4485",
      "tree": "ce1e1b90c6800486ad94c8f1fa58cf2cbbce9e05",
      "parents": [
        "d52d39d31ad33400b6bdb0ff678a6739de92b2eb"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 20 18:30:12 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 20 18:34:11 2025 -0700"
      },
      "message": "webui: s/demo-runner/demo/g\n"
    },
    {
      "commit": "d52d39d31ad33400b6bdb0ff678a6739de92b2eb",
      "tree": "a777c975562ee7ace6e3459a4701f6098c80fa8c",
      "parents": [
        "23a35b8da9da135ad130bee89a1f96cac4d02bf6"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 20 14:57:38 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 21 01:16:10 2025 +0000"
      },
      "message": "webui: clean up component demos\n"
    },
    {
      "commit": "23a35b8da9da135ad130bee89a1f96cac4d02bf6",
      "tree": "5d76d0de2217cd78ba33ed0dd3fa00f725bac90d",
      "parents": [
        "9ee3042aa7826d9ae662c86743a5f87468972d27"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 20 21:18:31 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun Jul 20 21:49:21 2025 +0000"
      },
      "message": "webui: migrate mobile components to SketchTailwindElement\n\nComplete migration of all mobile web components from LitElement to\nSketchTailwindElement base class with Tailwind CSS styling:\n\nComponents migrated:\n- mobile-chat-input.ts: Chat input with file upload, textarea auto-resize\n- mobile-chat.ts: Message display with markdown rendering and tool calls\n- mobile-diff.ts: Git diff viewer with Monaco editor integration\n- mobile-shell.ts: Main container coordinating mobile UI layout\n- mobile-title.ts: Header with connection status and view switching\n\nKey changes:\n- Replaced LitElement inheritance with SketchTailwindElement\n- Converted all CSS-in-JS styles to Tailwind utility classes\n- Removed static styles blocks and shadow DOM styling\n- Added custom animations via document.head for non-Tailwind effects\n- Preserved all existing functionality and component interactions\n\nTechnical improvements:\n- Consistent iOS safe area support with env() CSS functions\n- Proper flexbox layouts for mobile responsive design\n- Maintained accessibility with proper ARIA labels and focus states\n- Enhanced hover and active states using Tailwind modifiers\n- Optimized touch interactions with -webkit-overflow-scrolling\n\nThe mobile components now follow the established SketchTailwindElement\npattern while maintaining full feature parity with the original\nshadow DOM implementations.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s21f840091392b02ek\n"
    },
    {
      "commit": "9ee3042aa7826d9ae662c86743a5f87468972d27",
      "tree": "a669fecd906f39e504508cf2c8c31c3a26726322",
      "parents": [
        "3eaa43377ddaec484ea3564f178078a84dc6e02d"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sat Jul 19 12:57:45 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sat Jul 19 12:57:45 2025 -0700"
      },
      "message": "default to light mode instead of system, for now\n"
    },
    {
      "commit": "3eaa43377ddaec484ea3564f178078a84dc6e02d",
      "tree": "79c226b85a10f50cf554b87899828e318d63f46f",
      "parents": [
        "d082fdceb0378ddbceb81f51ab77ac1af904d57c"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sat Jul 19 02:19:06 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jul 19 18:44:56 2025 +0000"
      },
      "message": "webui: implement comprehensive dark mode support\n\nAdd complete dark mode implementation across all web UI components with\ntheme initialization and consistent styling:\n\nCore infrastructure:\n- Update DARK_MODE.md documentation with current implementation details\n- Add theme initialization to sketch-app-shell-base component\n- Implement ThemeService integration with existing theme toggle system\n\nComponent updates with dark mode variants:\n- sketch-app-shell: Main container backgrounds and text colors\n- sketch-app-shell-base: Top banner, todo panel container with gradient backgrounds\n- sketch-chat-input: Input fields, buttons, overlay messages, and drop zones\n- sketch-container-status: Info panels, SSH connection displays, and expandable details\n- sketch-call-status: Status indicators, banners, and activity states\n- sketch-view-mode-select: Tab container, button states, and active tab styling\n- sketch-timeline-message: Message bubbles, markdown content, code blocks, and commit info\n- sketch-push-button: Overlay popup, form controls, and result containers\n- sketch-todo-panel: Todo items, headers, comment modal, and form elements\n- sketch-diff-range-picker: Dropdown interface, commit display, and git reference badges\n\nCSS and styling improvements:\n- Comprehensive markdown content styling for dark theme\n- Code block backgrounds and syntax highlighting adjustments\n- Mermaid diagram container styling for dark mode\n- Auto-generated link styling with proper contrast\n- Git reference badge colors (tags: amber, branches: green, sketch-base: blue)\n\nInteractive element enhancements:\n- Consistent hover states across light and dark themes\n- Proper focus indicators with accessible contrast ratios\n- Loading spinners and progress indicators adapted for dark backgrounds\n- Error and success message styling with semantic color preservation\n\nKey implementation details:\n- Consistent color mappings: white→gray-900, gray-100→gray-800, gray-200→gray-700\n- Preserved brand colors (blue-500, red-600, green-600) that work in both themes\n- Maintained semantic color coding for success/error/warning states\n- Ensured accessibility with proper contrast ratios throughout\n- Theme system integration enables seamless switching without page reload\n\nThe web UI now provides a complete, professional dark mode experience\nwith excellent usability and visual consistency while preserving all\nexisting functionality and accessibility standards.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8219557c3ecba46dk\n"
    },
    {
      "commit": "d082fdceb0378ddbceb81f51ab77ac1af904d57c",
      "tree": "85ebda02944618e18dfc4612fe8954f58ff05c29",
      "parents": [
        "ae3724ef039833e1227714412e2c5289ad8875c8"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 13:31:52 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 13:33:10 2025 -0700"
      },
      "message": "claudetool/bashkit: don\u0027t mention set-slug when blocking sketch-wip renames\n"
    },
    {
      "commit": "ae3724ef039833e1227714412e2c5289ad8875c8",
      "tree": "7242aaea3ef677a86ace50e7c805935f27890d94",
      "parents": [
        "19a32eaa120562170595e42584f3fc4b40828b97"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 16:52:37 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 20:29:23 2025 +0000"
      },
      "message": "webui: add dark mode implementation plan\n\nAlso implements phase 1 of the plan, which just lays the foundation\nfor implementing the user-visible changes. This does not include\nany dark-mode theme settings for the rest of the web UI, and\nwhile it does inlcude a \"sketch-theme-toggle\" element, this is\nonly included in the demo:runner vite server for interactive testing.\nIt\u0027s not included in the app shell base yet.\n\n-SM\n\n---\n\nDocuments comprehensive strategy for implementing dark mode in Sketch\u0027s\nweb UI using Tailwind CSS class-based approach.\n\nThe plan covers:\n- Foundation setup (Tailwind config, theme service, toggle component)\n- Systematic component updates with dark mode variants\n- Accessibility considerations and testing checklist\n- 4-week implementation timeline\n\nKey technical decisions:\n- Uses SketchTailwindElement base class following existing patterns\n- Singleton theme service with event system for component coordination\n- Respects system preferences while allowing user override\n- Persistent theme storage in localStorage\n\nThis provides a roadmap for adding dark mode support while maintaining\nconsistency with Sketch\u0027s existing web component architecture.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6b69ad95a4394f98k\n"
    },
    {
      "commit": "19a32eaa120562170595e42584f3fc4b40828b97",
      "tree": "eaa6cac6a052a02a97a94a62a2fc13adadd50a6e",
      "parents": [
        "2be768e4f4d28dc56c7e0b10df342c607ef04833"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 18:29:31 2025 +0000"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 12:04:31 2025 -0700"
      },
      "message": "claudetool/bashkit: add sketch-wip branch protection with process-level tracking\n\nAdd a best-effort check to reject git commands that would change the\ncontainer-side \u0027sketch-wip\u0027 git branch. The protection prevents:\n\n1. Branch renaming: git branch -m sketch-wip newname\n2. Branch switching: git checkout otherbranch, git switch otherbranch\n3. Force branch renaming: git branch -M sketch-wip newname\n\nThe check allows legitimate operations like:\n- File checkout: git checkout -- file.txt\n- Path operations: git checkout src/main.go\n- Branch creation: git switch -c newbranch\n- Standard git operations: git commit, git status, etc.\n\nKey features:\n- Process-level tracking: Shows warning only once per process\n- Informative error message explaining why it\u0027s blocked\n- Suggests using \u0027set-slug\u0027 tool for external branch naming\n- Tells user they can repeat the command if really needed\n\nImplementation:\n- Added process-aware check alongside existing static checks\n- Process-level tracking via mutex-protected boolean\n- Comprehensive test coverage including edge cases\n- Maintains backward compatibility with existing Check() function\n\nThis prevents agents from inadvertently breaking the outie\u0027s ability\nto detect and push changes to GitHub by changing the expected branch name.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s3bb00ecac8a4badek\n"
    },
    {
      "commit": "2be768e4f4d28dc56c7e0b10df342c607ef04833",
      "tree": "0ee35d42338c188b6d88fb60f00700a3c07e3264",
      "parents": [
        "5681b7c857682006489780fca02384e1db26ceab"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 18 16:41:39 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 18:59:33 2025 +0000"
      },
      "message": "webui: convert SketchDiffRangePicker to SketchTailwindElement\n\nChanges the sketch-diff-range-picker component to extend SketchTailwindElement\ninstead of LitElement. This removes the shadow DOM and allows Tailwind CSS\nclasses to work properly with the component.\n\nChanges:\n- Updated imports to include SketchTailwindElement\n- Removed LitElement import\n- Changed class inheritance from LitElement to SketchTailwindElement\n- Added test file to verify the conversion works correctly\n- Added demo HTML file for manual testing\n\nThe component functionality remains unchanged - this is purely a refactoring\nto use the project\u0027s standard base class for web components.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se92a5fe960a4312dk\n"
    },
    {
      "commit": "5681b7c857682006489780fca02384e1db26ceab",
      "tree": "63d70c33be17d0eea5efd78fa5012e5985090dd0",
      "parents": [
        "08b073b79f4372e2f61c03ba17e5d86a5cf7a769"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 18 10:42:47 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 18 10:43:17 2025 -0700"
      },
      "message": "Fix terminal CSS.\n"
    },
    {
      "commit": "08b073b79f4372e2f61c03ba17e5d86a5cf7a769",
      "tree": "9cafdbc3e14006f1d338ec350035a3d905e266a7",
      "parents": [
        "d11714374f290a693b724a3e2b7d5b81b49da803"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 18 10:40:00 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 17:41:06 2025 +0000"
      },
      "message": "sketch/mcp: add docs and test out playwright, and extend timeouts.\n"
    },
    {
      "commit": "d11714374f290a693b724a3e2b7d5b81b49da803",
      "tree": "add0092125903ad2141d050d9572fe5b9e79d6ff",
      "parents": [
        "160fade1d452244517c5089d61694c70fb0a82a7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 15:04:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 08:39:51 2025 -0700"
      },
      "message": "dockerimg: explain docker image builds\n\nHelps explain to new users what exactly is happening.\nHints to them about custom images.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s62e7d150498ad2dfk\n"
    },
    {
      "commit": "160fade1d452244517c5089d61694c70fb0a82a7",
      "tree": "224b4e627ac4f780bc0c720d182314ca1bc8ff2c",
      "parents": [
        "accf37cc10b9606702e8719157f60fb0488d9228"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 15:09:00 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 08:39:51 2025 -0700"
      },
      "message": "cmd/sketch: add -rebuild as alias for -force-rebuild-container\n\nMakes the flag more convenient to use with shorter syntax.\nBoth flags map to the same boolean variable and provide identical functionality.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6b2f38efaed1b060k\n"
    },
    {
      "commit": "accf37cc10b9606702e8719157f60fb0488d9228",
      "tree": "b0ae324feea823b5ba669e1290d2f408bbe4c652",
      "parents": [
        "93b53d8e55e1b0c5c85d387ab46a6ee3f96a8e8c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 18 07:29:19 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 18 07:29:19 2025 -0700"
      },
      "message": "Fix sketch -unsafe after push button change.\n\nI missed a case for -unsafe.\n"
    },
    {
      "commit": "93b53d8e55e1b0c5c85d387ab46a6ee3f96a8e8c",
      "tree": "a5a38ef8d33dcbd38efd39c527354e676be7edd3",
      "parents": [
        "9d9c812b496268f033d48df5e8f91c421730a2e2"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Jul 18 00:11:07 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Jul 18 13:50:16 2025 +1000"
      },
      "message": "skaband: fix terminal under /newsessions\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf39677ac8518e6dfk\n"
    },
    {
      "commit": "9d9c812b496268f033d48df5e8f91c421730a2e2",
      "tree": "0bfede0eb60d890faf499ec4d839c3b4eac95d08",
      "parents": [
        "725cfe088d37e1d27057b13598b0955cae02bffd"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 03:37:23 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 03:37:23 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "725cfe088d37e1d27057b13598b0955cae02bffd",
      "tree": "0b5555eb5a1dcc1218cce47ec1d45d8e978cbcff",
      "parents": [
        "4594388b5a5297295b39cccc924dd4727e97035a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:31:06 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 20:36:36 2025 -0700"
      },
      "message": "loop: set upstream tracking for sketch branches on outie\n\nFixes boldsoftware/sketch#143\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s782ec3188bf0856ak\n"
    },
    {
      "commit": "4594388b5a5297295b39cccc924dd4727e97035a",
      "tree": "deffbe3d30f84a37da0e58a7f6a286c3a9b6f93b",
      "parents": [
        "9db8c2a4713e4ddc0c2e5e9f75767d770412ee80"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 02:13:31 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 20:33:34 2025 -0700"
      },
      "message": "webui: add tooltips to 🥷 and 🐢 in bash tool cards\n\nFor when people are curious.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc49577a78023541dk\n"
    },
    {
      "commit": "9db8c2a4713e4ddc0c2e5e9f75767d770412ee80",
      "tree": "7699e20a768625dfae8335aa7dc4acdc82bd81a8",
      "parents": [
        "596aa33bf96e9003ad645403fb1f7dd6fafa2b0f"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 02:15:29 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 02:15:29 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "596aa33bf96e9003ad645403fb1f7dd6fafa2b0f",
      "tree": "a4ef8a3fc77ca20e5ef0d304143f9f35d0ae8d39",
      "parents": [
        "7de3bdd597e962ab2533f67018545c6fd2a33d16"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:00:39 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:13:58 2025 -0700"
      },
      "message": "webui: silence build noise\n\n**again**\n\nlast one was f8954383da9fbe04125c35548afbc6bf9d5272eb,\nwhich was earlier today.\n\ndear sketch: successful builds are SILENT. kthxbye.\n"
    },
    {
      "commit": "7de3bdd597e962ab2533f67018545c6fd2a33d16",
      "tree": "5c3116b9e2fc88f47f820014a1ce071d104b1773",
      "parents": [
        "ebe74cdcc911d70afd804b6218bab25744513578"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:53 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:13:58 2025 -0700"
      },
      "message": "webui: hide GitHub link in push dialog for non-GitHub remotes\n\nOnly show \"Open on GitHub\" button when pushing to GitHub remotes.\nThe dialog now checks the remote\u0027s is_github property before generating\na branch URL, returning empty string for non-GitHub remotes.\n\nChanges:\n- Modified _computeBranchURL() to check selectedRemote.is_github\n- Added test coverage for GitHub, GitLab, and self-hosted remotes\n- Updated demo mock to include non-GitHub remotes for testing\n\nThis prevents the confusing \"Open on GitHub\" button from appearing\nwhen pushing to GitLab, self-hosted Git servers, or other non-GitHub\nremote repositories.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb441bfcebf8fea07k\n"
    },
    {
      "commit": "ebe74cdcc911d70afd804b6218bab25744513578",
      "tree": "9f8fa6d00356bfe97283dad9fbc1754c6625196d",
      "parents": [
        "3a41f1501568811b7a6a83e6d674f19188595848"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:57:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:57:34 2025 -0700"
      },
      "message": "sketch/dockerimg: reduce error text on some refused pushes\n"
    },
    {
      "commit": "3a41f1501568811b7a6a83e6d674f19188595848",
      "tree": "2545072c225a258ac2b2d0fe35eb862c237ecc76",
      "parents": [
        "75b45f5665fad8d386d36f88bf7dc37808a8dcac"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:54 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:54 2025 +0000"
      },
      "message": "webui: update Push button tooltip to indicate it opens a dialog\n\nChange tooltip from \u0027Push current HEAD to remote\u0027 to \u0027Open push dialog\nto push current HEAD to remote\u0027 to better communicate that clicking\nthe button opens a dialog interface rather than immediately pushing.\n\nUser changes from diff view.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa22bbc9efe9d6ad2k\n"
    },
    {
      "commit": "75b45f5665fad8d386d36f88bf7dc37808a8dcac",
      "tree": "484353433b24d7906740ea22108f6873257f3a4b",
      "parents": [
        "c3b65d73caf6ea873ef6981aa926ef8ea9d31e83"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:47:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:23 2025 -0700"
      },
      "message": "cmd/sketch: keep public keys separate per skaband\n\nChange the layering a bit.\nAlways create a public key, for better telemetry.\nKeep separate things separate.\nThis could use a touch more refactoring,\nbut good enough for today.\n"
    },
    {
      "commit": "c3b65d73caf6ea873ef6981aa926ef8ea9d31e83",
      "tree": "78471ccaceb9941d4e349cab0465986efa9957f1",
      "parents": [
        "7208bb4b7fbdfec4a86843020eb8d384ac9889e7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:35:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:23 2025 -0700"
      },
      "message": "cmd/sketch: add version check at startup\n"
    },
    {
      "commit": "7208bb4b7fbdfec4a86843020eb8d384ac9889e7",
      "tree": "b5b577fdde5d46c00d624595ddba49209701e7a4",
      "parents": [
        "254c49faa2537d79e1394c4109f48a6e0990967c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 00:44:11 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:13 2025 -0700"
      },
      "message": "webui: add tooltips for upper-right corner buttons\n\nFixes https://github.com/boldsoftware/sketch/issues/160\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7884db8812a87864k\n"
    },
    {
      "commit": "254c49faa2537d79e1394c4109f48a6e0990967c",
      "tree": "3b13d86f48e45846dc225ccd24253f5b0dca0398",
      "parents": [
        "55b4ab50d0ee61e15825cb4254cfc63b8f5489bd"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 17 17:26:24 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 00:40:30 2025 +0000"
      },
      "message": "sketch: \"git push\" button\n\nUltimately, we want to allow users to push their changes to github, and\nthereby do a good chunk of work without resorting to the terminal (and\nfiguring out how to move the git references around, which requires a\nbunch of esotiric and annoying expertise).\n\nThis commit introduces:\n\n1. For outtie\u0027s HTTP server (which is now comically Go HTTP -\u003e\n   CGI-effing-bin -\u003e git -\u003e shell script -\u003e git in this case), there\u0027s a\n   custom git hook that forwards changes to refs/remotes/origin/foo to\n   origin/foo. This is a git proxy of sorts. By forwarding the\n   SSH_AUTH_SOCK, we can use outtie\u0027s auth options without giving innie\n   the actual credentials. This works by creating a temporary directory\n   for git hooks (for outtie).\n\n2. Innie sets up a new remote, \"upstream\" when a \"passthrough-upstream\"\n   flag is pasksed. This remote kind of looks like the real upstream (so\n   upstream/foo) is fetched. This will let the agent handle rebases\n   better.\n\n3. Innie exposes a /pushinfo handler that returns the list of remotes\n   and the current commit and such. These have nice display names for\n   the outtie\u0027s machine and github if useful.\n\n   There\u0027s also a /push handler. This is the thing that knows about the\n   refs/remotes/origin/foo thing. There\u0027s no magic git push refspec that\n   makes this all work without that, I think. (Maybe there is? I don\u0027t\n   think there is.)\n\n   Note that there\u0027s been some changes about what the remotes look like,\n   and when we use the remotes and when we use agent.GitOrigin().\n   We may be able to simplify this by using git\u0027s insteadof\n   configurations, but I think it\u0027s fine.\n\n4. The web UI exposes a button to push, choose the remote and branch,\n   and such. If it can\u0027t do the push, you\u0027ll get a button to try to get\n   the agent to rebase.\n\n   We don\u0027t allow force pushes in the UI. We\u0027re treating those\n   as an advanced feature, and, if you need to do that, you can\n   figure it out.\n\nThis was collaboration with a gazillion sketch sessions.\n"
    },
    {
      "commit": "55b4ab50d0ee61e15825cb4254cfc63b8f5489bd",
      "tree": "fd9d27682d1274b5b0cc25acd44bea281aeeddbe",
      "parents": [
        "e3e886b93d5a5d632de26afa5ba3a0d0fa0f6488"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:45 2025 -0700"
      },
      "message": "build: remove output from webui.sh\n\nUnix says: if everything goes well, remain silent.\n"
    },
    {
      "commit": "e3e886b93d5a5d632de26afa5ba3a0d0fa0f6488",
      "tree": "7c815a328b20dba07c9dc0fc85614cb7c58c5eac",
      "parents": [
        "b6affffad340ca6a7ff76000f469f80b065200c2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:16 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:16 2025 -0700"
      },
      "message": "build: shfmt webui.sh\n"
    },
    {
      "commit": "b6affffad340ca6a7ff76000f469f80b065200c2",
      "tree": "a230ee62a73d06934de9b91588e6cd5ff86cee9d",
      "parents": [
        "5e91d1352bfa7b97bcf9d4e2394b58294eead6a9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:22:46 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:27:59 2025 -0700"
      },
      "message": "cmd/sketch: simplify code\n\nsilly llm-generated faff\n"
    },
    {
      "commit": "5e91d1352bfa7b97bcf9d4e2394b58294eead6a9",
      "tree": "1f5da8aa4174410d4651b4b6bf3dc307c8917c24",
      "parents": [
        "89ba5f420da139d126c3160794ca1b55821d661a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 21:56:13 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:22:09 2025 -0700"
      },
      "message": "sketch: eval symlinks in pwd on startup\n\nFixes #205\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s14259a0fe01511d1k\n"
    },
    {
      "commit": "89ba5f420da139d126c3160794ca1b55821d661a",
      "tree": "b44c981402b7a9f03e3a83cb0de61b3c19ad3578",
      "parents": [
        "d561a0e0eeda7cef031056c199ee2ce5a0c05202"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 14:21:43 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 14:30:44 2025 -0700"
      },
      "message": "sketch/termui: add \"v\" as a synonym for \"b\"\n"
    },
    {
      "commit": "d561a0e0eeda7cef031056c199ee2ce5a0c05202",
      "tree": "3ed39c3185e4f7019f9d8d74542606aaaf338eaf",
      "parents": [
        "e79a44b8334dd9196105e26d446e44de7ef5d255"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 20:24:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 13:29:31 2025 -0700"
      },
      "message": "sketch: fix goreleaser homebrew config\n\nFix build failure.\nFix deprecations.\n"
    },
    {
      "commit": "e79a44b8334dd9196105e26d446e44de7ef5d255",
      "tree": "efb6536262c9d3b469fc8d21bc2287bcd63c1c93",
      "parents": [
        "0269340cb3925dd8c5f5ed8ad7ebcd743f66fe6c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 21:00:43 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 17 12:59:54 2025 -0700"
      },
      "message": "Updating Sketch\u0027s dear_llm\n"
    },
    {
      "commit": "0269340cb3925dd8c5f5ed8ad7ebcd743f66fe6c",
      "tree": "e57fb0d4f57ed29e3defc33e00350a941017ce33",
      "parents": [
        "2cc7563b105e381982b0732279609fde49c0ce2d"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 17:10:10 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 18:08:33 2025 +0000"
      },
      "message": "sketch: fix Timeline messages width overflow issue\n\nFix issue where Timeline messages don\u0027t fit within their designated width,\ncausing text to overflow beyond message bubble boundaries and overlap with\nother UI elements.\n\nRoot cause was that max-width constraints were not being applied properly:\n- max-w-[calc(100%-160px)] Tailwind class wasn\u0027t being computed correctly\n- markdown-content div was missing proper overflow-wrap and word-break CSS\n- message content div was missing max-width constraints\n\nChanges:\n- Add explicit style attributes for max-width constraints on bubble containers\n- Add proper word-break and overflow-wrap CSS properties to markdown content\n- Update global CSS to ensure consistent word breaking behavior\n- Add overflow: hidden to prevent content from overflowing containers\n- Create test page to verify fix works in normal and compact padding modes\n\nThe fix ensures messages wrap properly within their containers in both normal\nmode (with 160px margin) and compact padding mode (full width) while\nbreaking long URLs and unbreakable strings appropriately.\n\nFixes https://github.com/boldsoftware/sketch/issues/201\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7eaa3905ab8c4595k\n"
    },
    {
      "commit": "2cc7563b105e381982b0732279609fde49c0ce2d",
      "tree": "b648353d0e8027abcf9d8c0188f2ee621e9b7530",
      "parents": [
        "c5c3bea08ccfcd2e785bb4b13e9d8618e0f46364"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 17:10:17 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 17:42:00 2025 +0000"
      },
      "message": "webui: fix copy button in markdown code blocks\n\nThe copy button in markdown code blocks was not working because the click\nevent listener was attached to the .markdown-content div, but the copy\nbutton was rendered outside of that scope in the .code-block-header.\n\nMove the event listener to the message content container level so it can\nproperly handle clicks on copy buttons through event delegation.\n\nFixes https://github.com/boldsoftware/sketch/issues/203\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s888913f32dc41c3fk\n"
    },
    {
      "commit": "c5c3bea08ccfcd2e785bb4b13e9d8618e0f46364",
      "tree": "f365ebcbb0f7802f3c7c60469a024309e5673591",
      "parents": [
        "c314f0c95a5b10cb10904181a181c4ce0d8d1a4b"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 10:11:35 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 17:24:05 2025 +0000"
      },
      "message": "update web components DEAR_LLM.md\n"
    },
    {
      "commit": "c314f0c95a5b10cb10904181a181c4ce0d8d1a4b",
      "tree": "420df7effcd472dd86cb5b3d92bafe2ce35b65db",
      "parents": [
        "4f833b1678175fbc83c908fc347eae87a89a59db"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:48:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:48:46 2025 -0700"
      },
      "message": "github: set include-slow-tests\u003dfalse in queue-main and queue-dev workflows\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s732f68156ca2ab2ek\n"
    },
    {
      "commit": "4f833b1678175fbc83c908fc347eae87a89a59db",
      "tree": "e5cc3d356a290e38747f750413fd89904c094141",
      "parents": [
        "09b86f40dd7b2fd26b92dc49add2d8555785749c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:30:41 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:31:02 2025 -0700"
      },
      "message": "github: add main-cron workflow and include-slow-tests flag\n\nAdd main-cron workflow that runs every 6 hours with same test suite as\nqueue-main but with slow tests disabled for faster feedback. Also add\ninclude-slow-tests flag to go_test.yml workflow.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf1670b17c28d88e2k\n"
    },
    {
      "commit": "09b86f40dd7b2fd26b92dc49add2d8555785749c",
      "tree": "67302c7233854cc9e1318a6a4bb27d6a193fe146",
      "parents": [
        "fb56a5cb097451f5702372da7af8356e35806a73"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:23:03 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:23:03 2025 -0700"
      },
      "message": "webui: optimize npm ci caching for faster builds\n\nAdd caching for npm ci in webui build process by tracking\npackage-lock.json changes separately from other source files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sce58f3444bbcc029k\n"
    },
    {
      "commit": "fb56a5cb097451f5702372da7af8356e35806a73",
      "tree": "56bee60df451d595fce50e71f76fb8f8948027d9",
      "parents": [
        "cbf8c32b26ae73e4d3cf486a93a2bce5866195df"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 22:38:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:59:08 2025 -0700"
      },
      "message": "sketch: fix Discord notifications to show all commits in stack\n\nThe COMMITS_TO_NOTIFY command was only returning the top commit instead of\nall commits being pushed to main. This happened because in GitHub Actions\ncontext, the origin/main reference might not be current.\n\nFix by fetching the latest main branch reference and using the local main\nbranch as the base for the git log range calculation instead of origin/main.\n\nThis ensures all commits in the stack are properly included in Discord\nnotifications.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: seddc0c760b07e1adk\n"
    },
    {
      "commit": "cbf8c32b26ae73e4d3cf486a93a2bce5866195df",
      "tree": "8139bbc29ff5723bb2358eb9ee4762b19942ff91",
      "parents": [
        "390f847edb6fe450fc547938c2e806db693d9e61"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:25:39 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:25:39 2025 -0700"
      },
      "message": "Revert \"sketch: fix Discord notifications to show all commits in stack\"\n\nThis reverts commit af1e5d99704e3657fdf4b18ec0a68c2d7c22e3c6.\n"
    },
    {
      "commit": "390f847edb6fe450fc547938c2e806db693d9e61",
      "tree": "25ee5ba6832307d13801139fe0dc2329c0085421",
      "parents": [
        "a8561f70c1701376e88a5b63d78e7d09a7ae3ed8"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 16 20:09:45 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 16 20:09:45 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "a8561f70c1701376e88a5b63d78e7d09a7ae3ed8",
      "tree": "6093a6ba26567089bf33a70f74399eca2c149391",
      "parents": [
        "b58bbf30db0ced33cc110dd44d6c14995977737f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 23:47:59 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 13:08:59 2025 -0700"
      },
      "message": "sketch/webui: add untracked files notification to diff view\n\nAdd warning in diff view about untracked files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s45fbbdf5b3d703e4k\n"
    },
    {
      "commit": "b58bbf30db0ced33cc110dd44d6c14995977737f",
      "tree": "bc136bb11a4bc43f8b8679c06677de6601cb9e34",
      "parents": [
        "f3d739fcb7391c0a4413e79c69322129da9df5cc"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 18:33:34 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 12:00:26 2025 -0700"
      },
      "message": "goreleaser: add experimental homebrew tap support\n\nThink it\u0027s right, but not sure whether it\u0027ll actually work.\nTomorrow, if it functions, we\u0027ll declare it no longer experimental.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s5126ee115c362b2ck\n"
    },
    {
      "commit": "f3d739fcb7391c0a4413e79c69322129da9df5cc",
      "tree": "9dc6e1a4b4a9e8e8d97ea575fa9df3ca36a528f5",
      "parents": [
        "246132065e858778359e65250bc7f2e19d477710"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 18:06:38 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 12:00:26 2025 -0700"
      },
      "message": "readme: tweak installation instructions\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s53fd17542f72975ak"
    },
    {
      "commit": "246132065e858778359e65250bc7f2e19d477710",
      "tree": "a937884247db726e6c9d7e475334e77659b6a88f",
      "parents": [
        "183d114ef7f3b806b77ff6691bcadbbf5bdd805c"
      ],
      "author": {
        "name": "philz",
        "email": "philip.zeyliger@gmail.com",
        "time": "Tue Jul 15 20:56:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Jul 15 20:56:31 2025 -0700"
      },
      "message": "sketch: create empty commit on empty repo, both in innie and outtie\n\nLife\u0027s a bit too short to fail when the git repo exists but is empty.\nFor innie (e.g., using -unsafe on an empty repo), we just create the\nempty commit. For outtie, we do the same thing, since initializing an\nempty repo would be a weird different code path.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se0a9606cc9f43388k\n"
    },
    {
      "commit": "183d114ef7f3b806b77ff6691bcadbbf5bdd805c",
      "tree": "9da45eaa832a700e3f533712a2bcfe0acdec341b",
      "parents": [
        "3ad8c8d9847a3a6d2c69f8ef76e1af4758ff845e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 17:10:23 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 17:10:32 2025 -0700"
      },
      "message": "build: do the innie builds concurrently\n\nfor SPEED\n"
    },
    {
      "commit": "3ad8c8d9847a3a6d2c69f8ef76e1af4758ff845e",
      "tree": "71f39eb5c3c79c697ade4c930839b7aa122f866a",
      "parents": [
        "9022ae08d3483b711bc9bf6673e280aef633e8a0"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 15 21:05:23 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 15 21:05:23 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "9022ae08d3483b711bc9bf6673e280aef633e8a0",
      "tree": "f0d208ef1dc5ba47fa045e0aa0f51267398cae6e",
      "parents": [
        "0af5fbe505d9b3fb76e5d2cbd5a7ef964f9c06a8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 20:52:30 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Jul 15 13:53:41 2025 -0700"
      },
      "message": "sketch: dump message history to /tmp on conversation compaction and include filename in summary\n\nAdd dumpMessageHistoryToTmp method that dumps complete agent message history to timestamped JSON file during conversation compaction, returning filename for inclusion in compaction summary message.\n\nWhen conversation compaction occurs, the agent now:\n- Dumps entire a.history array to /tmp/sketch-messages-{sessionID}-{timestamp}.json as formatted JSON\n- Returns filename from dumpMessageHistoryToTmp for reference in summary message\n- Includes dump file location in compaction summary: \"The complete message history has been dumped to {filename} for your reference if needed\"\n- Continues compaction process even if dump fails to avoid blocking conversation flow\n\nImplementation:\n- Added dumpMessageHistoryToTmp method returning (filename, error)\n- Modified CompactConversation to call dump before generating summary\n- Enhanced summary message to conditionally include dump file reference\n- Uses 2-space JSON indentation for readability and 0644 file permissions\n- Creates timestamped filenames to avoid conflicts across multiple compactions\n\nThe implementation provides access to complete conversation history during epoch restarts while maintaining conversation compaction benefits.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s3784d6168585f9c4k\n"
    },
    {
      "commit": "0af5fbe505d9b3fb76e5d2cbd5a7ef964f9c06a8",
      "tree": "b449b249adcc1f08b61ac0d6f03961c9c625a317",
      "parents": [
        "369f2628fdc10ceb46a776d98c168d48ecd1f22b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 19:40:48 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 10:49:38 2025 -0700"
      },
      "message": "selfupdate: add -update\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s236be243dde9276dk\n"
    },
    {
      "commit": "369f2628fdc10ceb46a776d98c168d48ecd1f22b",
      "tree": "b2ff54d6b7ed6b194b417994f97d60e55f708bbb",
      "parents": [
        "2e967e55c5619e08b45a5a1e162774a0de859dab"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 00:02:59 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "sketch/loop: handle existing git repos in innie sketch\n\nCheck if /app/.git already exists before attempting to clone. If it exists\n(e.g., from skaband images or user images with existing git repos), configure\nthe origin remote and fetch instead of cloning.\n\nThis fixes compatibility with skaband dockerfiles that create images with\nexisting git repositories, and adapts to the object-only approach introduced\nin commit 9e8f5c78e8cef4c73e7b2629b2270ab572d530f8.\n\nThe implementation uses a helper function upsertRemoteOrigin that handles\nboth setting the URL for existing origin remotes and adding new ones.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9625bfa389b6b7dek\n"
    },
    {
      "commit": "2e967e55c5619e08b45a5a1e162774a0de859dab",
      "tree": "04122adf524dc7341eeb371577104d9a4ba7e0cc",
      "parents": [
        "2edd62e8a2f23331d936621f0f0e344fe41c21b3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 21:09:31 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "llm: make MustSchema validate minimum schema requirements\n\nSome OpenAI endpoints are fussy about these.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s74cb7cc9fd0e036dk\n"
    },
    {
      "commit": "2edd62e8a2f23331d936621f0f0e344fe41c21b3",
      "tree": "3c4c0cd8d3272d9d04553168f7fcb7156bf85ce7",
      "parents": [
        "327c1966f1949b922463f77384acc5bfa9492fd3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 12:44:51 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "llm/oai: add kimi-k2 configs\n\nDoesn\u0027t work yet, though.\n"
    },
    {
      "commit": "327c1966f1949b922463f77384acc5bfa9492fd3",
      "tree": "406bfeefe514762d79a4862baed994619b07f51f",
      "parents": [
        "5a3cd2a0d93e45bb551b1617a9ace281d5788b59"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 16:08:51 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 16:08:51 2025 -0700"
      },
      "message": "sketch: fix Discord notifications to show all commits in stack\n\nVibe-coding an improvement to the Discord notifications.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9b380343c76d40dck\n"
    },
    {
      "commit": "5a3cd2a0d93e45bb551b1617a9ace281d5788b59",
      "tree": "ebb7dcefee1bbd7b14deed7d596643837f246858",
      "parents": [
        "43a0bfc2227f07db26ff785470fbac35d309499a"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:16:06 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:16:06 2025 -0700"
      },
      "message": "ci: update GitHub workflows to use Go 1.24.5\n\nUpdate Go version references in GitHub workflow cache configurations to\nmatch the Go version specified in go.mod files across the repository.\n\nI\u0027m unclear whether putting the go version in here is necessary,\nbut not rocking that boat right now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf306dbc03d8b2709k\n"
    },
    {
      "commit": "43a0bfc2227f07db26ff785470fbac35d309499a",
      "tree": "e1900f7602fed9ac779181b59790f6b1e0b44a7f",
      "parents": [
        "d9acaa785a8cc8b3cc14d6efcdd7ce45ffe3737f"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 14:54:27 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:13:41 2025 -0700"
      },
      "message": "sketch: add debug handler to dump conversation history as JSON\n\nAdd HTTP debug endpoint /debug/conversation-history to dump agent conversation\nhistory as pretty-printed JSON for debugging purposes.\n\nSometimes, you just want to see what went on.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6c9e876db9b3aa5ck\n"
    },
    {
      "commit": "d9acaa785a8cc8b3cc14d6efcdd7ce45ffe3737f",
      "tree": "c3c615b10db1e8f9bd9c3d88c13f81f61c1a83b6",
      "parents": [
        "a50a3bf9e4b996498289df50744bdce09a59cc13"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 14:51:55 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:04:32 2025 -0700"
      },
      "message": "sketch: optimize code copy button performance\n\nThere was a setTimeout(..., 100) for no good reason.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1d721e710776c3eck\n"
    },
    {
      "commit": "a50a3bf9e4b996498289df50744bdce09a59cc13",
      "tree": "92194e1c19ef8805b1fc725cf74d54a919d99fb9",
      "parents": [
        "9b39aa66590f68f9039a8efc0c4e1917551016e6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 19:40:48 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 13:18:34 2025 -0700"
      },
      "message": ".goreleaser: simplify and harden signing\n\nPass envvar via stdin instead of writing to a file.\nRemove base64.\nRestrict secret to release-build environment.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: saf0aa2158a183abek\n"
    },
    {
      "commit": "9b39aa66590f68f9039a8efc0c4e1917551016e6",
      "tree": "6ac5e639d348bf2b2a3017abbc147411b79cf9bf",
      "parents": [
        "333aa67a4c1639f49c7ba03edab4ace3c6439e2b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 11:56:02 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 11:56:24 2025 -0700"
      },
      "message": "sketch: exclude internal processes (headless-chrome) from port monitoring\n\nAdd SKETCH_IGNORE_PORTS environment variable to headless-shell browser processes\nand modify port monitoring to exclude processes with this variable.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sff3b145df27ee3bek\n"
    },
    {
      "commit": "333aa67a4c1639f49c7ba03edab4ace3c6439e2b",
      "tree": "9bb97e108a92eaf51e4ad7f12b07042ec3b96e8b",
      "parents": [
        "dc27c395443e6d08de8cba3c9c4a85242f11ade6"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 13 19:49:21 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 14 02:44:44 2025 +0000"
      },
      "message": "sketch: remove shadowDOM dependency from tool card components\n\nReplace shadowDOM-based slot system with property-based composition in all\nsketch-tool-card-[TOOL_NAME] components to support shadowDOM-free architecture.\n\nProblem Analysis:\n- sketch-tool-card component relied on HTML5 template slots which require shadowDOM\n- 13 tool card components used sketch-tool-card as composition base via slots\n- shadowDOM dependency blocked broader effort to reduce shadowDOM usage\n- Need to preserve all existing functionality while removing slot dependency\n\nSolution Implementation:\n- Created sketch-tool-card-base component with property-based content injection\n- Replaced slot system with summaryContent, inputContent, resultContent properties\n- Maintained all existing styling, behavior, and expand/collapse functionality\n- Migrated all 13 existing tool card components to use new base component\n\nComponents Migrated:\n- sketch-tool-card-about-sketch\n- sketch-tool-card-browser-clear-console-logs\n- sketch-tool-card-browser-click\n- sketch-tool-card-browser-eval\n- sketch-tool-card-browser-get-text\n- sketch-tool-card-browser-navigate\n- sketch-tool-card-browser-recent-console-logs\n- sketch-tool-card-browser-resize\n- sketch-tool-card-browser-scroll-into-view\n- sketch-tool-card-browser-type\n- sketch-tool-card-browser-wait-for\n- sketch-tool-card-read-image\n- sketch-tool-card-take-screenshot\n\nMigration Pattern:\n- Changed from: \u003cslot name\u003d\"summary\"\u003econtent\u003c/slot\u003e\n- Changed to: .summaryContent\u003dhtml content\n- Preserved all component-specific styling and logic\n- Maintained existing API surface for parent components\n\nArchitecture Benefits:\n- Removes shadowDOM requirement from 13+ components\n- Enables future shadowDOM-free component development\n- Maintains backward compatibility during migration\n- Preserves all existing tool card functionality\n\nFiles Added:\n- sketch/webui/src/web-components/sketch-tool-card-base.ts (new shadowDOM-free base)\n\nFiles Modified:\n- All 13 sketch-tool-card-[TOOL_NAME].ts components migrated to use new base\n\nVerification:\n- TypeScript compilation passes without errors\n- Demo pages render correctly with consistent styling\n- Expand/collapse behavior preserved across all tool types\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa3288c1d986356e5k\n"
    },
    {
      "commit": "dc27c395443e6d08de8cba3c9c4a85242f11ade6",
      "tree": "0ed1fef06da72f23ff8d59b28ce3dee535b1ae30",
      "parents": [
        "b80db9c74081f89810ee13789345add0d6210297"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 11 18:36:14 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 11 18:36:26 2025 -0700"
      },
      "message": "fix clipped right edge of messages\n"
    },
    {
      "commit": "b80db9c74081f89810ee13789345add0d6210297",
      "tree": "00c40c65f93d3d3f91aa4ef7f2d311abdd59915f",
      "parents": [
        "ea5504c438ff5f61e51375e6229b3bfc003ef138"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jul 12 01:20:36 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jul 12 11:27:18 2025 +1000"
      },
      "message": "sketch: fix nightly releases being marked as pre-releases\n\nRemove the GitHub workflow step that was explicitly marking releases as pre-releases.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf9e8db3a7bac9e0dk\n"
    },
    {
      "commit": "ea5504c438ff5f61e51375e6229b3bfc003ef138",
      "tree": "c2886f3764fefc1cd5254843b7761c150c77f021",
      "parents": [
        "fa424f563e7f75c7ad07ad83def8fe928241f49d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:30:52 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:30:52 2025 -0700"
      },
      "message": "go.mod: bump to Go 1.24.5\n"
    },
    {
      "commit": "fa424f563e7f75c7ad07ad83def8fe928241f49d",
      "tree": "c2867a2150e9df6e233c97c537acc0f1740ecef0",
      "parents": [
        "784d5bd5d850f90359edc850484c01f15b6ce173"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 18:43:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:24:27 2025 -0700"
      },
      "message": "dockerimg: restore go mod download functionality\n\nRestore the go mod download functionality that was lost during the\ntransition to only copying git objects.\n\nThis pre-populates the Go module cache during image build time.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0941bfb3f9ba2251k\n"
    },
    {
      "commit": "784d5bd5d850f90359edc850484c01f15b6ce173",
      "tree": "fdc0467922309487f0d28988b2664c51fac99c68",
      "parents": [
        "eb91caaa81362c5528bd0e3a8ca0f2b61de43852"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 00:09:30 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:24:01 2025 -0700"
      },
      "message": "dockerimg: add only git objects to docker image\n\nInstead of copying the entire working directory\n(including uncommitted changes, hooks, and config files),\ncreate a bare git repository and use git clone --reference.\n\nThis approach:\n- Avoids copying uncommitted changes, hooks, and local config files\n- Works correctly with git worktrees and submodules\n- Reduces Docker image size substantially\n- Maintains all git history and functionality\n\nFixes boldsoftware/sketch#190\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6af36147e2c4df00k\n"
    },
    {
      "commit": "eb91caaa81362c5528bd0e3a8ca0f2b61de43852",
      "tree": "79e392448584cfcc64184365936fe8914a974437",
      "parents": [
        "5e97dfc62b2c26cd6f483b06c1f5b034307c9791"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 15:29:18 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 15:29:30 2025 -0700"
      },
      "message": "sketch/loop: minor cleanup\n\nSuggested by Ye Olde IDEe.\n"
    },
    {
      "commit": "5e97dfc62b2c26cd6f483b06c1f5b034307c9791",
      "tree": "459cd8afe14721c1aae4676c68aa225877c33e2d",
      "parents": [
        "61fa306b9a6e7677b63b66e3599f5fe5af2015a7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 18:14:07 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 14:56:19 2025 -0700"
      },
      "message": ".goreleaser.yml: add binary-only releases and ed25519 signatures\n\nThis lays the groundwork for future secure self-updates.\nThe corresponding public key is in selfupdate/ed25519.pem.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s5b7440b1a9e2c5e3k\n"
    },
    {
      "commit": "61fa306b9a6e7677b63b66e3599f5fe5af2015a7",
      "tree": "e17b3d13728ca3874a5f7992ff596bbf86038cc8",
      "parents": [
        "a96f9d2d783a04042352618087ec0a292e3d23e2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 10:21:13 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 10:21:13 2025 -0700"
      },
      "message": "sketch/embedded: embed webui in outie\n\nThis makes the web interface work with -unsafe.\n\nI hate to add a third copy of webui to outie.\n\nThere are any number of workarounds for this, including (but surely\nnot limited to):\n\n- copy webui into the container, like before\n- have innie forward all webui requests to outie\n- for releases, load content-addressable webui from a CDN\n- have outie parse and grab webui from an innie binary for -unsafe\n\nBut for now, let\u0027s keep things simple and straightforward.\n\nFixes #195\n"
    },
    {
      "commit": "a96f9d2d783a04042352618087ec0a292e3d23e2",
      "tree": "32c87ca9b3a0e11853028233d97c0bc8c1bf5531",
      "parents": [
        "17b2fd9b8ed388f341b380c88e7c4c6f88494573"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 02:47:33 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 20:08:20 2025 -0700"
      },
      "message": "sketch: set relpath at runtime, not build time\n\nPreviously, relpath was baked into the docker container at build time by setting\nthe working directory with \u0027docker create -w /app/relpath\u0027. This was incorrect\nbecause relpath can vary between different invocations of sketch.\n\nNow:\n- Remove -w flag from docker container creation\n- Pass relpath as -C flag to sketch binary at runtime\n- Container always starts with working directory /app (git root)\n- Inner sketch process changes to correct directory at startup\n\nThis ensures sketch works correctly regardless of which subdirectory it\u0027s\ninvoked from, without hardcoding paths into the container image.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2da1f8f867cd0e96k\n"
    },
    {
      "commit": "17b2fd9b8ed388f341b380c88e7c4c6f88494573",
      "tree": "1c1679f6ead6c587e8bf5add8ffcb978449c6703",
      "parents": [
        "39eb24f7dfb82c802dfe7b4caac500acde26a907"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 22:47:13 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 19:38:07 2025 -0700"
      },
      "message": "claudetool: replace timeout parameter with slow_ok boolean\n\nEmpirically, the agent doesn\u0027t set timeouts long enough,\nand doesn\u0027t retry on failure.\n\nGive it only one decision to make: Is this maybe a slow command?\n\nIf, horror of horrors, your project can\u0027t accomplish tasks within the\ndefault timeouts, there\u0027s a new command line flag to adjust them.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc26e3516f28c22d4k\n"
    },
    {
      "commit": "39eb24f7dfb82c802dfe7b4caac500acde26a907",
      "tree": "388f5ee8a5781513c339e5503409d8b1de9247d0",
      "parents": [
        "fadffe3cfb867760be035e72b7096946554255a1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 01:46:33 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 21:04:41 2025 -0700"
      },
      "message": "build: do simple content-based hashing of webui builds\n\nThis dramatically speeds up no-op rebuilds.\n\nIt does a full rebuild for any changes whatsoever\nin the webui directory.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa46a41c964391e31k\n"
    }
  ],
  "next": "fadffe3cfb867760be035e72b7096946554255a1"
}
