)]}'
{
  "log": [
    {
      "commit": "3cde282e7b12d14ec27400a2c0f9b167001ed60e",
      "tree": "ae7df9f0552e87ae7aa1c06ceb3210bf7343efcc",
      "parents": [
        "d1832847e9d6566971088d7b1a255487b0ed0e0b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 21 09:32:38 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jun 21 16:35:56 2025 +0000"
      },
      "message": "webui: improve comment functionality for Monaco diff editor by using gutter\n\nThis was a bit of a journey. To me, the correct functionality is like\nthe breakpoint setting in VSCode. I had o3 find the relevant code and\ntried to feed it back into Sketch, but it turned out I had to break it\ndown into pieces. (Asking it for the whole thing failed several times.)\nIn the end, I asked Sketch first to add a comment icon in the gutters.\nThis required just the right \"glyphMargin\" settings and finally worked.\nIn the next session, it worked on showing/hiding them depending on where\nyou were hovering. In the one after that, it deleted the old comment box\nfunctionality, and then in the one after that, added that functionality\nback in. And now we\u0027re here, and it seems to work.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd81ff0507f3398a8k\n"
    },
    {
      "commit": "1f8fe9c0531de311dc3847f766f748da28fc3368",
      "tree": "7301725c9d9270c286371790ef399edb0c670d16",
      "parents": [
        "ffa94c65f4b7b3aabb0ecb50dbd9d8c2bfd40da3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jun 20 02:56:28 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jun 20 03:04:47 2025 +0000"
      },
      "message": "webui: fix Monaco editor initialization parentNode errors in diff view\n\nAdd proper Lit component lifecycle validation to ensure Monaco editor container\nis connected to the document before initialization, preventing \u0027undefined parentNode\u0027\nerrors during diff view loading.\n\nThe fix uses await this.updateComplete and validates both component and container\nconnection state, eliminating race conditions between component rendering and\nMonaco API calls without using timeouts or retries.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s85d1738b85a64745k\n"
    },
    {
      "commit": "e08609352271d61acb57774cdbfa91f1d35b1931",
      "tree": "d2d0609057422a33579552a8a191c179158a0050",
      "parents": [
        "963ae4b514ed20fc84c63c4cc6de028a99964448"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 18 13:01:17 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 18 13:01:17 2025 -0700"
      },
      "message": "Re-enable monaco horizontal scroll bars.\n\nLike all things LLM and Monaco, the key here is to delete things\nthat aren\u0027t default until things get better. The scrollbars don\u0027t\nshow up because they aren\u0027t necessary, and, when the horizontal\nones are necessary, they now show up.\n\nI\u0027m still seeing two bugs:\n\n1. If you click into the diff the first time on some line, especially\nif it\u0027s the second diff block, Monaco jumps to a different area. This\nis kind of terrible and annoying.\n\n2. My touchpad should let me scroll right/left as well as vertical, but\nI\u0027m only getting vertical scrolling in this mode.\n"
    },
    {
      "commit": "6b8b7660f2e2e964453ebace40dda7122f6d9eca",
      "tree": "dcb6ba6d5a2d18fcffe8d44d6960bd41fd29121c",
      "parents": [
        "7c1a687d03341b94b4a3c71706c47e3e14927707"
      ],
      "author": {
        "name": "philip.zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Jun 16 03:06:30 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jun 16 21:30:06 2025 -0700"
      },
      "message": "webui: add mobile diff view with Monaco inline diffing\n\nThanks, Sketch. There are still some rough edges, but it\u0027s not bad.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se4f6567dc0dabd31k\n"
    },
    {
      "commit": "2f8464cc1f0f25ec209ec5f710f6794a36700a5b",
      "tree": "94a96915ba9a6f22dd031f0a77c99a06d8a090d7",
      "parents": [
        "29c481c8d3bbe6124d3b273d2a154081d8472f08"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jun 16 04:27:05 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jun 16 04:27:05 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "c0a4459e3f5c8e68649bb45f2c309f6f01928ab7",
      "tree": "3e239adc18145cac2f8cd920b7c6c63bf0a4def1",
      "parents": [
        "38499cc1970fadc688567ec10ea92bfca187b929"
      ],
      "author": {
        "name": "philip.zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sun Jun 15 21:24:57 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sun Jun 15 21:24:57 2025 -0700"
      },
      "message": "webui: implement Monaco code splitting with external bundle loading\n\nSplit Monaco editor into separate bundle with content-based hashing, achieving\n99% size reduction in Monaco components (3.9MB to 42KB).\n\n- Enable minification in esbuild configuration\n- Create standalone Monaco bundle with content hash for optimal caching\n- Implement external Monaco loading with proper TypeScript types\n- Apply external Monaco to all TypeScript bundles for consistency\n\nBundle results:\n- sketch-monaco-view.js: 3.9MB → 42KB (99% reduction)\n- sketch-app-shell.js: 6.8MB → 3.0MB (Monaco external, still large due to mermaid/cytoscape/katex)\n- monaco-standalone-{hash}.js: 3.8MB cached separately\n\nApp shell remains large (3MB) due to mermaid dependencies - likely next optimization target.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc84907cb0ec24197k\n"
    },
    {
      "commit": "dba26b57dbdf09c006a84314b2b919e8256d0089",
      "tree": "c792f5452fe9a84abeaa0b6c421cf9c586fe8fcd",
      "parents": [
        "ad15b6cc1ec990e139cbd0d462df301179a46f5e"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 00:33:45 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 17:57:26 2025 -0700"
      },
      "message": "webui: fix Monaco editor horizontal scrollbar from border width overflow\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s555d4a157e574e32k\n"
    },
    {
      "commit": "ad15b6cc1ec990e139cbd0d462df301179a46f5e",
      "tree": "7d45f57934a1ade6f21833d536219bcb847d1398",
      "parents": [
        "f00c7b19133ee3e2d60bfb4eef117c0870c0bbc0"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun Jun 15 00:29:26 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun Jun 15 00:29:26 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "f00c7b19133ee3e2d60bfb4eef117c0870c0bbc0",
      "tree": "acf2ac1953209027628f60c99fd4b41faec2de5f",
      "parents": [
        "e2954ce9c186576151b5e0da05de1b37bb99afea"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 00:24:46 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 17:27:04 2025 -0700"
      },
      "message": "webui: disable Monaco diff editor overview ruler\n\nRemove the overview ruler from Monaco diff editor by adding renderOverviewRuler: false\nto the editor configuration, providing a cleaner diff viewing experience.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc99558fc19a79a66k\n"
    },
    {
      "commit": "e2954ce9c186576151b5e0da05de1b37bb99afea",
      "tree": "ef54edfec55171ff3faf8428e0f0e274b49e1ea5",
      "parents": [
        "dbca8975c4616c02f284359fed07d4a2c1477301"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 00:06:34 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 17:12:58 2025 -0700"
      },
      "message": "webui: fix diff view scrollbar visibility and resize handling\n\nFix Monaco editor scrollbar display issues and improve browser window resize\nresponsiveness in the diff view, providing a cleaner interface and better\nuser experience across different screen sizes.\n\nProblem Analysis:\nThe diff view had two significant issues affecting usability:\n\n1. Monaco Scrollbar Visibility: Despite setting scrollbar configuration to\n   \u0027hidden\u0027, a large gray scrollbar remained visible on the right side of\n   the Monaco diff editor. This was caused by insufficient CSS targeting\n   of Monaco\u0027s complex DOM structure and scrollbar element hierarchy.\n\n2. Resize Handling: The diff view did not properly adapt when users resized\n   their browser window. While the editor had automaticLayout: false and\n   manual sizing, there was no window resize listener to trigger layout\n   recalculation, causing the editor to maintain its original dimensions.\n\n3. Refresh Button Layout: At certain screen widths, the refresh button would\n   wrap to its own line prematurely due to inflexible sizing constraints.\n\nImplementation Changes:\n\n1. Monaco Scrollbar Removal (sketch-diff2-view.ts):\n   - Added comprehensive global CSS rules targeting all Monaco scrollbar elements\n   - Targeted .monaco-editor, .monaco-diff-editor, and .monaco-scrollable-element\n   - Applied multiple hiding techniques: display: none, visibility: hidden,\n     width/height: 0, opacity: 0 for maximum coverage\n   - Added padding/margin removal to prevent scrollbar space reservation\n   - Ensured diff content takes full width without scrollbar spacing\n\n2. Window Resize Handler (sketch-monaco-view.ts):\n   - Added setupWindowResizeHandler() method with debounced resize logic\n   - Implemented 100ms debounce to prevent excessive layout calls\n   - Added window \u0027resize\u0027 event listener that triggers fitEditorToContent()\n   - Fallback layout call with current container dimensions if fit function unavailable\n   - Proper cleanup in disconnectedCallback() to prevent memory leaks\n\n3. Layout Improvements (sketch-diff2-view.ts):\n   - Set minimum width (400px) for sketch-diff-range-picker component\n   - Added minimum width (120px) for file-count display\n   - Ensured flex layout provides adequate space for all controls\n   - Improved responsive behavior at various screen widths\n\n4. Enhanced Scrollbar Configuration (sketch-monaco-view.ts):\n   - Extended scrollbar options with additional Monaco-specific settings:\n     - useShadows: false to disable scrollbar shadows\n     - verticalHasArrows: false / horizontalHasArrows: false to remove arrows\n     - verticalScrollbarSize: 0 / horizontalScrollbarSize: 0 for zero track size\n   - Combined configuration-based and CSS-based hiding for complete coverage\n\nTechnical Details:\n- Global CSS injection occurs once per diff view instance in constructor\n- Window resize handler uses setTimeout debouncing to avoid performance issues\n- Monaco editor layout() called with explicit dimensions during resize\n- CSS targeting covers all known Monaco scrollbar element patterns\n- Minimum width constraints prevent layout collapse at small screen sizes\n- Cleanup handlers prevent memory leaks when components are destroyed\n\nBenefits:\n- Clean, professional diff view appearance without distracting scrollbars\n- Smooth responsive behavior when browser window is resized\n- Improved layout stability for controls at various screen widths\n- Better user experience across desktop and mobile viewport sizes\n- Maintained full Monaco editor functionality (editing, syntax highlighting, etc.)\n\nTesting:\n- Verified scrollbar completely hidden at all screen sizes\n- Tested resize responsiveness from 600px to 1400px+ widths\n- Confirmed smooth transitions during window resize operations\n- Validated refresh button layout behavior at different breakpoints\n- Ensured Monaco editor features remain fully functional\n- Tested both horizontal and vertical window resize scenarios\n\nThis implementation provides a polished, responsive diff view experience\nthat properly adapts to user browser configurations while maintaining\nall advanced Monaco editor capabilities.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf19d359b4fcbcbdek\n"
    },
    {
      "commit": "9abf803eeedd49261dc4e4c5b75dcb4d21cc6a0d",
      "tree": "abebff284ab5674aeacf125237619c26f998d1cb",
      "parents": [
        "26f3f34c25e21717001f0230d1abe7debbc5e0c0"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jun 14 23:24:08 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jun 14 23:24:08 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "26f3f34c25e21717001f0230d1abe7debbc5e0c0",
      "tree": "0ba518a643b4d165dd871b4a2cd28e5f096a017f",
      "parents": [
        "938d2dcde4aaea8119e1c09ffa453de48560dd57"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 19:58:32 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 16:20:07 2025 -0700"
      },
      "message": "webui: implement multi-file diff view with continuous scrolling\n\nReplace file selector with GitHub PR-style continuous scrolling through\nmultiple files in a single view, improving diff navigation experience\nwhile maintaining all Monaco editor features.\n\nProblem Analysis:\nThe existing diff view required users to navigate between files using a\ndropdown selector and Previous/Next buttons. This created friction when\nreviewing multi-file changes and broke the natural scrolling flow that\nusers expect from GitHub PR views or other modern diff interfaces.\n\nThe limitation was that Monaco doesn\u0027t provide a built-in multi-file diff\nwidget, requiring custom implementation with multiple IStandaloneDiffEditor\ninstances properly configured for stacking and auto-sizing.\n\nImplementation Changes:\n\n1. Multi-File Layout (sketch-diff2-view.ts):\n   - Replaced sketch-diff-file-picker with simple file count display\n   - Implemented renderFileDiff() to create separate diff sections per file\n   - Added renderFileHeader() with status badges and path information\n   - Created multi-file-diff-container with vertical stacking layout\n   - Added loadAllFileContents() for parallel content loading\n   - Replaced single originalCode/modifiedCode with Map\u003cstring, FileContent\u003e\n\n2. Monaco Auto-Sizing (sketch-monaco-view.ts):\n   - Configured diff editors with hidden scrollbars per Monaco ≥0.49 pattern\n   - Added setupAutoSizing() with content height calculation\n   - Implemented fitEditorToContent() using getContentHeight() callbacks\n   - Set automaticLayout: false for manual size control\n   - Added scrollbar: { vertical: \u0027hidden\u0027, horizontal: \u0027hidden\u0027, handleMouseWheel: false }\n   - Enabled minimap: false and scrollBeyondLastLine: false\n\n3. CSS Styling (sketch-diff2-view.ts):\n   - Added file-diff-section with bottom borders for visual separation\n   - Implemented sticky file headers with proper z-index\n   - Created status badges (added, modified, deleted, renamed) with color coding\n   - Added file-count display replacing old file picker interface\n   - Configured diff-container with overflow: auto for outer scrolling\n\n4. Content Management:\n   - Parallel loading of all file contents with error handling\n   - Maintains editability detection per file based on commit range\n   - Preserves comment and save functionality for individual files\n   - Updated toggleHideUnchangedRegions to apply to all editors\n\nTechnical Details:\n- Uses Monaco\u0027s getContentHeight() and onDidContentSizeChange() for auto-sizing\n- Each diff editor sized to Math.max(originalHeight, modifiedHeight) + 18px padding\n- Outer container handles all scrolling while inner editors are sized to content\n- File headers show status (Added/Modified/Deleted/Renamed) with appropriate styling\n- Sticky positioning keeps file context visible during scrolling\n- Maintains all existing features: editing, commenting, expand/collapse toggles\n\nBenefits:\n- Natural scrolling workflow similar to GitHub PR reviews\n- Eliminates need for dropdown navigation between files\n- Better visual context with file headers and status indicators\n- Continuous viewing experience for multi-file changes\n- Preserves all advanced Monaco features (editing, commenting, etc.)\n- Improved performance with parallel content loading\n\nTesting:\n- Verified multi-file diff display with various commit ranges\n- Tested scrolling behavior between files works smoothly\n- Confirmed auto-sizing works correctly for different file sizes\n- Validated file headers show correct status and change counts\n- Ensured editing and commenting functionality preserved\n- Tested expand/collapse toggles apply to all editors\n\nThis implementation follows the Monaco ≥0.49 multi-file diff pattern with\ndisabled inner scrollbars, auto-sizing to content, and outer scroll container,\nproviding a modern diff experience while maintaining full editor functionality.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0724a00944669c80k\n"
    },
    {
      "commit": "7351cd9b711db0e828d22d995fe56c7f9f6ddb07",
      "tree": "2c4014fb50f2ae0ea3c8922d89c4029846da240d",
      "parents": [
        "a35de5f73d31756c8ac972a54bdb370bb26eed5a"
      ],
      "author": {
        "name": "philip.zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sat Jun 14 12:25:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 14 12:25:31 2025 -0700"
      },
      "message": "webui: fix Monaco fonts\n\nIn Chrome, if you selectected a line in the diff view, it wouldn\u0027t\nselect the whole line, because Monaco was somehow confused about the\nfont widths or something. Turns out we had customized our fonts. We\ndon\u0027t need to do that!\n\nAlso adding a sketchDebug idea so that it\u0027s easier to poke at things.\n"
    },
    {
      "commit": "57893c274ca6d7936580b8bd97af9e5a4b4dcd51",
      "tree": "bcb821ad46e0197c71979dbefbac597c33f0b9c1",
      "parents": [
        "4d90f34a3acf65e369cddd0f6838e2ec1d23dfcf"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 29 13:49:53 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 29 13:49:53 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "4d90f34a3acf65e369cddd0f6838e2ec1d23dfcf",
      "tree": "01a1b5df4228299a4fac2f95830bd72f9856336c",
      "parents": [
        "d9b1eb4d5342d6be3b4f975463a3831abb581f7f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 02:18:38 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 06:39:30 2025 -0700"
      },
      "message": "webui: add cmd+s keyboard shortcut to Monaco diff editor\n\nAdd Cmd+S (Ctrl+S on Windows/Linux) keyboard shortcut to trigger save\nin Monaco diff editor instead of browser save dialog.\n\nThis prevents people with cmd+s-in-editor habits from constantly\nhaving to dismiss browser save pop-up dialogs.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd86641652ae6f54ak"
    },
    {
      "commit": "e89b3080f934a4bc70a0cfa85ffff49ac78d6f2b",
      "tree": "f3bcf44b2907c5c18f555b31df923488bb5efdc7",
      "parents": [
        "7ad1c7a4b759f4ba110d092a0fbbed0b95fc80a9"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 29 03:16:06 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 29 03:20:15 2025 +0000"
      },
      "message": "webui: comprehensive diff view improvements\n\nImplement multiple enhancements to the diff view interface for better\nusability and visual consistency with file change statistics and\nimproved navigation controls.\n\nBackend Changes:\n1. Enhanced git diff endpoint with --numstat support:\n   - Modified GitRawDiff to execute both --raw and --numstat commands\n   - Added Additions/Deletions fields to DiffFile struct\n   - Parse numstat output to show line change statistics (+X, -Y)\n   - Handle binary files and edge cases properly\n\nFrontend UI Improvements:\n2. File picker enhancements:\n   - Display (+X, -Y) change indicators next to file names\n   - Move file position indicator (\"X of Y\") between navigation buttons\n   - Simplified file info to show only status (Modified/Added/Deleted)\n   - Better visual grouping of navigation-related information\n\n3. Commit range picker refresh functionality:\n   - Added refresh button with subtle styling (gray background)\n   - 🔄 icon with \"Refresh commit list\" tooltip\n   - Reloads git log to get updated branch and commit information\n   - Proper disabled state during loading operations\n\n4. Editable file indicator improvements:\n   - Moved \"Editable\" indicator to Monaco editor save indicator area\n   - Shows \"Editable\" when file is editable but unchanged\n   - Consistent styling with \"Modified\", \"Saving\", \"Saved\" states\n   - Added proper CSS styling with gray background for idle state\n\n5. Expand/collapse button redesign:\n   - Custom SVG icons replacing text buttons\n   - Expand All: dotted line with arrows pointing away (outward)\n   - Collapse: dotted line with arrows pointing inward (toward line)\n   - Intuitive visual metaphor for show/hide functionality\n   - Enhanced tooltips with full action descriptions\n   - Renamed \"Hide Unchanged\" to \"Collapse Expanded Lines\"\n\nTechnical Improvements:\n6. TypeScript compatibility fixes:\n   - Updated mock data service with new DiffFile fields\n   - Fixed MSW handler type compatibility with proper type assertion\n   - Maintained full TypeScript checking without exclusions\n   - Added realistic mock data for testing change indicators\n\nInterface Consistency:\n- All buttons use consistent styling and hover effects\n- Better separation between navigation controls and file information\n- Improved logical grouping of related UI elements\n- Enhanced accessibility with descriptive tooltips\n\nThese changes significantly improve the diff view experience by providing\nclear visual indicators of file changes, intuitive navigation controls,\nand better organization of interface elements according to their function.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nChange-ID: s738289d132773bc3k\n"
    },
    {
      "commit": "7ad1c7a4b759f4ba110d092a0fbbed0b95fc80a9",
      "tree": "a8d2543ec9c660b69289a2233442208d29ba29b2",
      "parents": [
        "444f7f00ff439e79b65cf3d2efd4ad66a698af2c"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 29 02:00:19 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 29 02:00:19 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "444f7f00ff439e79b65cf3d2efd4ad66a698af2c",
      "tree": "7271aaf5cbf3ba074b732c3d264bd47082fa9d2a",
      "parents": [
        "b34b8b307e8d804b6ea3f2596388708839f30e58"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 21:16:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 18:59:10 2025 -0700"
      },
      "message": "webui: expand Monaco comment selections to full lines for better context\n\nEnhances the Monaco diff editor comment functionality to automatically\nexpand any text selection to include complete lines, providing better\ncontext for LLM analysis and code review discussions.\n\nChanges include:\n\n1. Modified handleSelectionChange method in sketch-monaco-view.ts:\n   - Automatically expands selection start to column 1 (beginning of line)\n   - Expands selection end to the maximum column of the end line\n   - Updates both selectedText and selectionRange to reflect full lines\n   - Maintains existing line number calculation for comment headers\n\n2. Enhanced selection behavior:\n   - Partial line selections now include the entire line(s)\n   - Multi-line partial selections expand to include complete first and last lines\n   - Already full-line selections remain unchanged\n   - Preserves line number information for accurate comment context\n\nThe expansion logic uses Monaco\u0027s getLineMaxColumn() method to determine\nproper line boundaries and getValueInRange() to extract the complete\ntext. This ensures that comments always include meaningful, complete\ncode segments rather than partial fragments.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7a8b9c2d3e4f5g6k\n"
    },
    {
      "commit": "b34b8b307e8d804b6ea3f2596388708839f30e58",
      "tree": "d11dfa24942aae9784b18cfa0a3e47758ffb57f5",
      "parents": [
        "efa8f436182a310f7c5eaaf0f9f4787ba4fd3693"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 21:00:56 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 28 18:58:56 2025 -0700"
      },
      "message": "webui: add line numbers to Monaco diff view comment auto-inserted text\n\nEnhances the Monaco diff editor comment functionality to include line\nnumbers in the auto-inserted context text when users add comments to\nselected code. The comments now show specific line information along\nwith the filename and editor type.\n\nChanges include:\n\n1. Modified sketch-monaco-view.ts submitComment method:\n   - Added line number calculation logic using this.selectionRange\n   - Single line selections show \u0027(line N)\u0027 format\n   - Multi-line selections show \u0027(lines N-M)\u0027 format\n   - No line info added when selectionRange is unavailable\n   - Line info is appended to the existing fileContext and editorLabel\n\n2. Enhanced comment format from:\n   \u0027filename [Modified]:\u0027\n   to:\n   \u0027filename [Modified] (line 42):\u0027\n   or:\n   \u0027filename [Modified] (lines 10-15):\u0027\n\n3. Line number extraction uses Monaco\u0027s selection tracking:\n   - Leverages existing selectionRange state from handleSelectionChange\n   - Works for both original and modified editors in diff view\n   - Maintains backwards compatibility when selectionRange is null\n\nThe auto-inserted comment text now provides precise line context,\nmaking comments more useful for code review and collaboration by\nclearly indicating which specific lines are being referenced.\nThis addresses the issue where comments lacked line number context,\nmaking it difficult to locate the referenced code.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2b4c8f9a1e6d7e3k\n"
    },
    {
      "commit": "7027307b381e2b8421c95ebb2f872b8e3c567f3e",
      "tree": "7f9027f4ba1f57b305ebfba47d3b0d920093de95",
      "parents": [
        "837699bf55d27975e9e5b881b8794683bb1b10c8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 18:26:14 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed May 28 22:47:10 2025 +0000"
      },
      "message": "webui: replace hardcoded Monaco language map with dynamic detection\n\nReplace the static language mapping in the Monaco diff editor with\nMonaco\u0027s built-in language registry for automatic language detection.\n\nChanges:\n1. Remove hardcoded langMap that only supported 8 languages (js, ts, py,\n   html, css, json, md, go)\n2. Implement dynamic language detection using monaco.languages.getLanguages()\n3. Cache language list for performance since it doesn\u0027t change at runtime\n4. Maintain exact extension matching including the dot prefix (.js, .ts, etc.)\n5. Preserve fallback to \u0027plaintext\u0027 for unknown extensions\n\nBenefits:\n- Automatically supports all languages Monaco knows about (40+ languages)\n- No maintenance burden when Monaco adds new language support\n- Removes duplication between Monaco\u0027s registry and our hardcoded map\n- Better future-proofing as Monaco language support evolves\n\nThe implementation uses Monaco\u0027s ILanguageExtensionPoint interface which\nprovides language.extensions arrays for each registered language. This\nis more reliable than maintaining our own mapping and ensures consistency\nwith Monaco\u0027s actual language support.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nChange-ID: sca31f0ae899ae54dk\n"
    },
    {
      "commit": "d85e97d97d2e88415bf1a87557278afd14f6d202",
      "tree": "88e36c41930314fc74901b9de9794ad8ac49c2ba",
      "parents": [
        "a442ce32ac95d7e8337fba0a82f94cbd60be1296"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 17:59:08 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 28 11:17:24 2025 -0700"
      },
      "message": "webui: remove unused language property from Monaco editor\n\nRemove dead code - the language property was never set when the component\nis used, so it always defaulted to \u0027javascript\u0027 and was never meaningful.\n\nThe getLanguageForFile method now uses a simpler fallback:\nlangMap[extension] || \u0027plaintext\u0027\n\nSince filenames always have extensions in practice, this removes an\nunnecessary intermediate fallback that was never actually used.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s16c137c6267b58a5k\n"
    },
    {
      "commit": "afeafea91f20db4e5b99620df98baa1628bfeaf1",
      "tree": "7ba3f14d663cbc73bf78f8986bb5d3afe332e7b2",
      "parents": [
        "4c7865b4763552f4294e7a3738b796ea918a7c3d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 20:27:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 14:25:55 2025 -0700"
      },
      "message": "webui: change Monaco editor comment submit button from Submit to Add\n\nUpdates the Monaco editor\u0027s comment submission button text from \u0027Submit\u0027\nto \u0027Add\u0027 for better consistency with the UI and more concise labeling.\n\nThe button functionality remains unchanged - it still submits comments\non selected code sections in the Monaco editor view.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: seca3827c274ff3cdk\n"
    },
    {
      "commit": "8c4636270be67625cc27ce356f6da1a11e245069",
      "tree": "f6a4db58f1eb71033410150daa7290d4e41aca0a",
      "parents": [
        "5e3570280bf3bb0f84482ff9556739d34eb08093"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "272a90ee1a74bda5618d4866e03f4b7067947784",
      "tree": "9baf4f84ce80b1c7073a95b6959f6dd11ab3b48b",
      "parents": [
        "d3ac112a45111abf0e57c327d55e2cc66a136abb"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:49:51 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:51:40 2025 -0700"
      },
      "message": "Add Monaco diff-view, the saga ...\n\nI set out to use Monaco to support the diff view. diff2html is lovely,\nbut there were a ton of usability improvements I wanted to make (line\nnumbers not making things double spaced, choosing which diff, editing\nthe right-hand side), and it seemed a dead end. Furthermore, Phabricator\nand Gerrit\u0027s experience is that diffs should be shown file by file,\nbecause you\u0027ll inevitably see a diff with a file that\u0027s too large, and\nthe GitHub PR view often breaks on big changes... so I wanted to show\nfiles diff-by-diff, with \"infinite\" context when unchanged sections are\nexpanded. So...\n\nUltimately, all of this was sketch-coded over maybe 30 Sketch sessions.\nI threw away a lot of branches. My git reflog is a superfund site.\n\nPrompting whole-hog didn\u0027t work. Or, rather, it made significant\nprogress, but something very serious wouldn\u0027t work, and I couldn\u0027t\nfigure out what, and nor could Sketch.\n\nInstead, I started by adding a new webcomponent that was just a\nplaceholder. Then, using https://rodydavis.com/posts/lit-monaco-editor,\nI nudged Sketch into adding Monaco to it. Sketch pulled out:\n\n   You\u0027re right, I should properly read the blog post before implementing the\n   solution. Let me check the referenced blog post.\n\nI worked heavily in the demo environment at first, but here I ran into\nthe issue that we have two different esbuild systems: one is vite and\none is esbuild.go, and they\u0027re configured differently enough.\n\nMonaco is unusable and confusingly so when its CSS isn\u0027t loaded. The right\nway to load it, I\u0027ve found, is via\n\n  @import url(\u0027./static/monaco/min/vs/editor/editor.main.css\u0027);\n\nI spent more time than I care to admit noticing that originally\nthis wasn\u0027t relative, and when we use a skaband setting, the\npaths need to be relative-aware.\n\nThe paths to the various workers need to be similarly correctly placed.\n\nGetting Sketch to build demo data but not put testing code into production\ncode was tricky. (I threw away a lot of efforts and factories and singletons...)\n\nWhen I set out to do the git commit selection, I wanted to do a bunch of\nbackend /git/* handlers. These were easy enough to code in sketch. I had\nto convince Sketch to put them in git_tools.go and not in the agent.\nIt doesn\u0027t really matter: these functions to parse git are pretty stateless,\nbut it\u0027s less work to have them separate. Sketch was mediocre at writing\ntests for them. Did you know that our container has an older version\nof git that doesn\u0027t have the same options to decorate ref names? Yeah, nor did\nI.\n\nHandling unstaged changes was fun. git diff --raw shows unstaged files\nas having identity 0000. Ideally we\u0027d be using jj and there\u0027d be\na synthetic commit, but instead uncommitted-possible files are read\nby content.\n\nA real big challenge was getting the Monaco view to use the right vertical and\nhorizontal space. I did this many, many times. I don\u0027t claim to understand flex\nand the virtual dom, and :host, and all the interactions. It would fix one\nthing and break another. The chat window would shrink. The terminal would\nshrink.\n\nScreenshot support was excellent. I eventually added paste support just so\nthat I could expedite my workflow, and Sketch coded that easily on the first\npass with minor feedback.\n\nI learned the hard way that Safari\u0027s support for WebComponents/shadow\ndom in its web inspector is rough. See https://fediverse.zachleat.com/@zachleat/114518629612122858\n\nI also learned the hard way that Chrome doesn\u0027t use fonts loaded in CSS\nin a shadow dom. That\u0027s why the codicon font had to be in the global\nstyle sheet.\n\nKudos to John Reese who kindly allowed me, a long time ago, to adapt a\nshell script he had at work to look over diffs into https://github.com/philz/git-vimdiff.\nThat\u0027s the inspiration for having the \"new code\" be editable when you\u0027re\nreviewing it; why shouldn\u0027t it be!?!\n\nThere are a handful of follow up tasks:\n\n* We lose state when we switch to the Chat view and back.\n* Need URL-based support for where we are.\n* Maybe need shortcut keys to move between diffs and changes.\n* Maybe need caching or look-ahead for downloading the next or previous\n  file.\n* We spend too much vertical real estate on all the diff selections;\n  could we scroll it out of the way, collapse it, tighten it, etc.\n* The workers sometimes throw errors into the console. I think they\u0027re\n  harmless and merely need to be caught and suppressed.\n* Needing to commit changes when things are saved is weird. Should we\n  commit automatically? Amend the previous commit? Have a button for\n  that? Show the git dirty state?\n* Our JS bundle is big. We could maybe delay loading the monaco bundle\n  to help.\n\nThanks for coming to my TED talk.\n"
    }
  ]
}
