)]}'
{
  "log": [
    {
      "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"
    },
    {
      "commit": "fadffe3cfb867760be035e72b7096946554255a1",
      "tree": "eb66acbe6f8d6f9825a1da92a3b9df0b3b7f0901",
      "parents": [
        "e3c0f4d054cc7ec2859cffd3f61383d8a122a53c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 00:08:38 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 19:23:57 2025 -0700"
      },
      "message": "sketch/loop: fuss more with /git/cat and 204s\n\nFor unknown reasons, switching to 204s made the diff view noticeably slower.\nBe more explicit about things in the hope that it helps.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s52c5ab6557e1f9dbk\n"
    },
    {
      "commit": "e3c0f4d054cc7ec2859cffd3f61383d8a122a53c",
      "tree": "9366347855084fb5690b257e99bf02f27d197d08",
      "parents": [
        "6ae637a035e22fcc375bd522d24d9c22f281fec5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 15:22:07 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 15:22:07 2025 -0700"
      },
      "message": "sketch: add missing tag to goreleaser config\n\nIt got lost during some git undo shenanigans.\n"
    },
    {
      "commit": "6ae637a035e22fcc375bd522d24d9c22f281fec5",
      "tree": "adfbe68d9bce24daf42bce1a52055430df221718",
      "parents": [
        "a002a23a60dcc21353681a887a90cd12867e7f44"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 12:41:56 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 14:55:56 2025 -0700"
      },
      "message": "all: re-organize build/release\n\n- extract steps into shell files\n- fix GoReleaser builds (I hope)\n- rely more on the toolchain for version information\n- allow non-standard builds, but print a warning\n\nSuggested-by: Marc-Antoine Ruel \u003cmaruel@gmail.com\u003e\n"
    },
    {
      "commit": "a002a23a60dcc21353681a887a90cd12867e7f44",
      "tree": "e554f73faa6681dec2cbee396f30b03b972ab66b",
      "parents": [
        "5ab8fb8dc17299df5d134d7a95f33d41b170f102"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 19:38:03 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 14:37:14 2025 -0700"
      },
      "message": "webui: delete non-gzip\u0027d assets\n\nReduces webui assets from 83M to 16M.\nAlmost all browsers support gzip.\nFor those that don\u0027t, we provide on-the-fly decompression.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sbc10790564044d6bk\n"
    },
    {
      "commit": "5ab8fb8dc17299df5d134d7a95f33d41b170f102",
      "tree": "bbc6f1a77e2eeffc2ab759270711e0fbe6a9118a",
      "parents": [
        "b7ec9c837a549abd9bbbc1230e6d96090c98af52"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 12:34:55 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 12:42:12 2025 -0700"
      },
      "message": "webui: display context window size in info box\n"
    },
    {
      "commit": "b7ec9c837a549abd9bbbc1230e6d96090c98af52",
      "tree": "c4dc6e6b0d159b0ae8a21456c591cb2e12dc3e63",
      "parents": [
        "973413b1c24f1d2ab5f56729ae236892c4221fdf"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 10:16:39 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 09 17:17:12 2025 +0000"
      },
      "message": "add link to gh user page under chat msg\n"
    },
    {
      "commit": "973413b1c24f1d2ab5f56729ae236892c4221fdf",
      "tree": "22aeb8d11f7198e1bbe2530f725c763a0ca8ff1f",
      "parents": [
        "b843146dd360f53c2feb2942d4a6ef4ccc9109fb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 19:35:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 21:53:37 2025 -0700"
      },
      "message": ".goreleaser.yml: use make in GoReleaser\n\nTeach GoReleaser to use make for our nightly releases.\n\nUntested--we\u0027ll know better tomorrow whether this works.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4d8aed2fbf3aae3fk\n"
    },
    {
      "commit": "b843146dd360f53c2feb2942d4a6ef4ccc9109fb",
      "tree": "1be327ecc49991def691d5fd19ba0486dc678654",
      "parents": [
        "e7ca73df4b61cff1847c4f63feac89c580e998c7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jul 09 13:10:32 2025 +1000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jul 09 13:14:12 2025 +1000"
      },
      "message": "server: Wait on terminal process for cleanup\n\nThe bash shell for the termianl is an exec.Cmd that is Start()ed\nin the github.com/creack/pty package. We do a lot of cleanup\nwhen that shell exits, but we never Wait() on it (and neither\ndoes the pty package), so the bash process gets left behind\nas a zombie.\n\nFixes boldsoftware/sketch#181\n"
    },
    {
      "commit": "e7ca73df4b61cff1847c4f63feac89c580e998c7",
      "tree": "2e76b9f8b9751578c7daeeaa8d274e0f9d64d0e6",
      "parents": [
        "5ae245bd47becaf2aaa862b5c7e9bcec71e17831"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 16:37:09 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 19:49:34 2025 -0700"
      },
      "message": "all: cull dead code\n\nMostly from moving builds to use make.\n"
    },
    {
      "commit": "5ae245bd47becaf2aaa862b5c7e9bcec71e17831",
      "tree": "36438abd1d864685384a3b2a4e9f25e7bccbe0d1",
      "parents": [
        "c9898fd814de9bb9cf75a953336439241e7e900c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 22:00:24 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 15:02:23 2025 -0700"
      },
      "message": "sketch: add multi-architecture binary support\n\nBuild both amd64 and arm64 Linux binaries and embed them both.\nSimplify API to use single LinuxBinary(arch) function for architecture\nselection. Update copyEmbeddedLinuxBinaryToContainer to detect Docker\nserver architecture using \u0027docker version --format\u0027 and automatically\nuse the correct binary.\n\nThis enables sketch to work correctly on both x86_64 and ARM64\nDocker environments without requiring architecture-specific builds.\nUnsupported architectures return nil instead of panicking.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd498605bf58e984ek\n"
    },
    {
      "commit": "c9898fd814de9bb9cf75a953336439241e7e900c",
      "tree": "66a13bd9f437520bf193fcb16cf4b64e68b447d3",
      "parents": [
        "5c29b3e17fa526aa912d3ba400cf8a1a9c83fd80"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 21:09:18 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 14:24:05 2025 -0700"
      },
      "message": "dockerimg: stream tar to docker cp\n\nStop writing a temp file.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7f35a450897c1efek\n"
    },
    {
      "commit": "5c29b3e17fa526aa912d3ba400cf8a1a9c83fd80",
      "tree": "a57a2cf6f5420e866c4cd86d8184d0d2dd8b87ad",
      "parents": [
        "1c18ec94b0d2edcc6d69d1b96f89e3c6e630fc11"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 18:07:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 13:44:11 2025 -0700"
      },
      "message": "sketch/loop: return 204 for not-found files in /git/cat\n\nThis isn\u0027t actually an error; no reason to return a 500.\nThe front-end handles this identically,\nbut without js console log spam,\nwhich is the motivation for this change.\n"
    },
    {
      "commit": "1c18ec94b0d2edcc6d69d1b96f89e3c6e630fc11",
      "tree": "994dbcf813d9c772da320ccccfc2e2f5fe826155",
      "parents": [
        "e1a6e1b25d1cf7f3aec4b98e155be7cf3701a1b0"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 10:55:54 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 13:06:43 2025 -0700"
      },
      "message": "all: use make to build\n\nThis overhauls the build system.\nWe used to use a just-in-time clever build system\nso that \u0027go run\u0027 and \u0027go install\u0027 Just Worked.\n\nThis was really nice, except that it make it\nall but impossible to ship a single binary.\nIt also required our uses to install npm,\nwhich some folks have an understandably negative reaction to.\n\nThis migrates to a makefile for building.\nThe core typescript building logic is mostly still in Go,\nand untouched (boy did I learn that lesson the hard way).\n\nThe output is a single file that includes the webui, innie, and outie.\n\n(There are still very mild shenanigans in which we write outie\nout to a temp file and then \u0027docker cp\u0027 it into the docker container.\nBut this is pretty manageable.)\n\nThere are some significant follow-ups left after this commit:\n\n- convert the nightly release builds to use the makefile\n- lots of dead code removal\n- maybe add -race support using a dockerfile for the cgo compilation\n- maybe use \u0027docker cp\u0027 stdin reading with tar to avoid the temp outtie file\n- all the rest of the \"better release\" todos (brew install, etc.)"
    },
    {
      "commit": "e1a6e1b25d1cf7f3aec4b98e155be7cf3701a1b0",
      "tree": "b4088c64ed5e09c4e8d68143dc4a5a959653d1e5",
      "parents": [
        "39ee05a289740544030b5a2f83cd673839efd08f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 04 03:10:24 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 12:02:47 2025 -0700"
      },
      "message": "cmd/sketch: combine (and alphabetize) imports"
    },
    {
      "commit": "39ee05a289740544030b5a2f83cd673839efd08f",
      "tree": "ef2e09c6519775586475648d9279468cf662a9f4",
      "parents": [
        "454f8864b1830ff13f19a49dd53d91b5a201baf7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 11:20:01 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 12:02:47 2025 -0700"
      },
      "message": "webui: bump esbuild version"
    },
    {
      "commit": "454f8864b1830ff13f19a49dd53d91b5a201baf7",
      "tree": "d52cec3d8a26fe8f6f0883008aaef86b425e55cb",
      "parents": [
        "289525bcecca82247e0908c5ff1f213213d9c9a4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 04:12:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:14:34 2025 -0700"
      },
      "message": "sketch/loop: remove flaky TestPortMonitor_IntegrationDemo test\n\nDelete the integration test that was still flaky despite previous fixes.\n\nRoot Cause:\n- Test suffered from inherent race condition with system-wide port resources\n- After closing test ports, other processes could immediately bind to same port numbers\n- Race condition window existed between port closure and PortMonitor detection\n- Cannot be made truly hermetic because port numbers are OS-managed system resources\n\nTest Coverage Analysis:\n- Integration test added minimal unique value over existing unit tests\n- Agent.pushToOutbox already tested in agent_test.go\n- Port detection logic thoroughly tested in port_monitor_test.go\n- TCP filtering, sorting, added/removed detection all covered by unit tests\n- Core functionality has excellent test coverage without the integration test\n\nThe Fix:\n- Remove the flaky integration test entirely\n- Preserve all existing unit tests which provide reliable coverage\n- Eliminate CI/CD reliability issues caused by environmental dependencies\n- Remove maintenance burden of debugging false test failures\n\nThis removes the flaky test while maintaining comprehensive test coverage\nthrough the existing unit test suite.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8bd05f43558fc5c4k\n"
    },
    {
      "commit": "289525bcecca82247e0908c5ff1f213213d9c9a4",
      "tree": "ffdc00894b39af359cba7f481c05e9a5b7b405f7",
      "parents": [
        "828161b106396bf87a4c481895781f1d1d732e0a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 04:03:02 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:13:27 2025 -0700"
      },
      "message": "sketch/termui: handle PortMessageType messages more\n\n- Added case for loop.PortMessageType in termui message handling switch\n- Port messages now display with 🔌 emoji and clean formatting\n- Follows same pattern as other message types (ErrorMessageType, BudgetMessageType, etc.)\n\n- Added loop.PortMessageType to AddMultipleUnion call in go2ts.go\n- Regenerated TypeScript types to include \u0027port\u0027 in CodingAgentMessageType union\n- Webui components now have proper type safety for port messages\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7e1f4b705a66a9d5k\n"
    },
    {
      "commit": "828161b106396bf87a4c481895781f1d1d732e0a",
      "tree": "9ced21ca57a202fc44456c7cbd53a8a113435c51",
      "parents": [
        "c7a98d8360cf03f977625a65e8dd637d6b2ab18b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 03:44:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:06:38 2025 -0700"
      },
      "message": "sketch/loop: fix flaky TestPortMonitor_IntegrationDemo test\n\nRemove assumptions about system-wide port state that made the test flaky.\n\nRoot Cause:\n- Test assumed it was the only process creating/destroying ports\n- Made brittle assertions about total port counts before/after test servers\n- Failed when other processes (tests, services, containers) modified ports\n\nThe Fix:\n- Focus only on the specific test ports created by the test\n- Use polling with timeout to detect port creation/removal\n- Remove assertions about total port counts\n- Test only verifies its own test ports are detected and removed\n\nChanges:\n- Replace fixed sleeps with polling loops with timeouts\n- Remove port count comparisons that depended on system state\n- Keep track of test ports separately from system port scanning\n- Add proper timeout handling to prevent hanging tests\n\nTest Results:\n- Before: Flaky failures when other processes modified ports\n- After: 5 consecutive runs all passed, focusing only on test-specific behavior\n\nThis preserves the test\u0027s usefulness as an integration test while making it\ndeterministic and isolated from system-wide port changes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s58312d8275959960k\n"
    },
    {
      "commit": "c7a98d8360cf03f977625a65e8dd637d6b2ab18b",
      "tree": "043d571f69c08cc1211dbd9d85821ca488160a38",
      "parents": [
        "553cc842a3fea3594158c8314a577c2b916bf45d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:12:53 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:13:43 2025 -0700"
      },
      "message": "sketch/loop: fix concurrency handling in port monitor shutdown\n\nThe graceful shutdown code assumes it can take the pm.mu lock.\nMake the Stop code oblige.\n\nThis fixes the issue at hand, but the remaining code still gives\nme the heebie jeebies--for example, after calling Stop, there could\nstill be notifications that come in.\n\nSketch really shouldn\u0027t write concurrent code.\n\nThis will work well enough, I guess, until it doesn\u0027t,\nat which point we\u0027ll have to carefully fix up the rats nest.\n\n\nBefore:\n\n2m10s: 1157 runs so far, 36 failures (3.11%)\n\nAfter:\n\n16m45s: 12484 runs so far, 0 failures\n\n\nFixes boldsoftware/bold#446 enough for now\n"
    }
  ],
  "next": "553cc842a3fea3594158c8314a577c2b916bf45d"
}
