)]}'
{
  "log": [
    {
      "commit": "26bc659f8f7e8864a6fb0a71dcbee7d3742d3763",
      "tree": "5429b19391d26f2cf8a82253237a52d2d33543e6",
      "parents": [
        "a14b0183208df257a43748b51666043db7e62138"
      ],
      "author": {
        "name": "philip.zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Jun 30 20:15:30 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 01 03:20:42 2025 +0000"
      },
      "message": "webui: add ESLint and eslint-typescript\n\nI\u0027ve historically found this stuff worthwhile, so let\u0027s swallow the pill.\n\nFortunately, sketch was happy to oblige.\n\n- Install ESLint, @eslint/js, and typescript-eslint packages\n- Configure eslint.config.mjs with recommended TypeScript ESLint rules\n- Add browser globals support for DOM and web APIs\n- Integrate ESLint into npm test workflow via package.json scripts\n- Update Makefile to run lint checks as part of test suite\n- Fix 249+ linting issues including:\n  * Remove unused imports and variables (with _ prefix convention)\n  * Fix case declaration issues with eslint-disable blocks\n  * Remove unnecessary escape characters\n  * Address prefer-const violations\n  * Handle unused function parameters appropriately\n- Configure ignore patterns to exclude dist/ and node_modules/\n- Set rules to allow explicit \u0027any\u0027 types temporarily\n- Convert warnings for ts-ignore, async promise executors, and unsafe optional chaining\n\nResults:\n- ESLint now runs successfully with 0 errors and only 6 warnings\n- TypeScript compilation continues to work correctly\n- Linting integrated into test workflow for continuous quality enforcement\n- Codebase follows consistent ESLint TypeScript recommended practices\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd7b538be0a28d294k\n"
    },
    {
      "commit": "364b35a411afadef2531d600ca5b0da5d1b25d7f",
      "tree": "6feb28f2bee414abc51e62ef2ad67ddf94bee44e",
      "parents": [
        "61a0f6758240d318e8d0ae778e2a93ef45a867cf"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat Jun 21 16:39:04 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jun 21 23:39:39 2025 +0000"
      },
      "message": "webui: improve/simplify commit selector in Monaco diff view\n\nThe HTML select\u0027s cant be formatted to show tags nicely, so\ndid a \"custom\" select thing.\n\nFurthermore, I never use the \"to\" thing, so let\u0027s just get rid of\nit, and we\u0027re always going from someplace to someplace.\n\nI don\u0027t love the overflow behavior, but we\u0027ll see how it goes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9f70e9aef1fb08c4k\n"
    },
    {
      "commit": "38499cc1970fadc688567ec10ea92bfca187b929",
      "tree": "fcfdced525ed5818887872ffdab7666989bb6d95",
      "parents": [
        "8a290e5a3df2ec7ba8de8ffbf52081e44b2d636f"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sun Jun 15 21:17:05 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jun 16 04:17:53 2025 +0000"
      },
      "message": "webui: restructure diff header layout for improved usability\n\nReorganize diff view header to show commits section always expanded on left\nand move file selector to right side, with expand/collapse button in header\nwhen single file is selected.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s904ee76a60c89e75k\n"
    },
    {
      "commit": "6255411d3c2bd8cfe9a25c261e1c9a28e549441c",
      "tree": "063eb2f7ec0793176b9b3528d7279d6c42fedc53",
      "parents": [
        "5c6d82996aab8c390e43ee6d2b3f81f7f26de629"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun Jun 15 19:23:33 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun Jun 15 19:23:33 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "5c6d82996aab8c390e43ee6d2b3f81f7f26de629",
      "tree": "769af94e9c5b73db806df2b019fed0fba1bcea7f",
      "parents": [
        "4cd0129069c668cdd72f4d5b941e8d328c5d3caf"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 19:09:19 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 12:23:00 2025 -0700"
      },
      "message": "webui: invert diff view layout and improve file selector behavior\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s5b7c42b431634f10k\n"
    },
    {
      "commit": "216d2fc77e55ca2e435f4d3d50a7a3a055b3545e",
      "tree": "1425cab92b3c209221b9e1f8cb2de2620f658827",
      "parents": [
        "d4be7a2d950cbc637e324210ce2e9904b736b701"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 18:45:53 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jun 15 12:20:57 2025 -0700"
      },
      "message": "webui: clean up diff view interface by removing unused features\n\nRemove refresh button, file count display, single commit mode, and hide\ncommit range controls behind collapsible Commits dropdown to streamline\nthe diff view interface.\n\nThis streamlined interface focuses attention on the actual diff content while\nkeeping advanced controls easily accessible through progressive disclosure,\ncreating a cleaner and more professional diff viewing experience.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se64b0db10984cba9k\n"
    },
    {
      "commit": "dbca8975c4616c02f284359fed07d4a2c1477301",
      "tree": "1752a1f4f1c16441d43f4f9b69e4120927d25bb3",
      "parents": [
        "9abf803eeedd49261dc4e4c5b75dcb4d21cc6a0d"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 23:46:58 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sat Jun 14 23:50:10 2025 +0000"
      },
      "message": "webui: improve diff view header layout and compactness\n\nConsolidate diff view header layout for better space efficiency and improved\nvisual organization of commit range selectors and file count display.\n\nChanges:\n1. Move file count to same line as commit range selectors\n2. Reduce per-file header padding from 12px to 8px\n3. Shorten commit selector entries to prevent overflow\n4. Change file count text from \u0027N files changed\u0027 to \u0027N files\u0027\n5. Prevent file count text from wrapping with white-space: nowrap\n\nLayout improvements create more compact header while maintaining usability.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s54d391a2d5128fd4k\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": "938d2dcde4aaea8119e1c09ffa453de48560dd57",
      "tree": "fe917e628d4ce1a671a15d1430668e92983289c4",
      "parents": [
        "7351cd9b711db0e828d22d995fe56c7f9f6ddb07"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 22:17:33 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 16:20:07 2025 -0700"
      },
      "message": "webui: add URL parameters for diff view from/to commit selection\n\nEnable direct linking to specific diff ranges by adding URL parameters that\nsync with the diff range picker controls, allowing users to bookmark and\nshare specific diff views.\n\nProblem Analysis:\nUsers couldn\u0027t link directly to specific diff ranges in the sketch diff view.\nThe from/to commit selectors would reset to defaults on page load, making it\nimpossible to bookmark or share links to specific commit comparisons. This\ncreated friction when collaborating or returning to specific diff views.\n\nImplementation Changes:\n\n1. URL Parameter Synchronization (sketch-diff-range-picker.ts):\n   - Added updateUrlParams() to write from/to/commit parameters to URL\n   - Integrated URL updates into dispatchRangeEvent() for automatic sync\n   - Used history.replaceState() to update URL without page reload\n   - Clear unused parameters when switching between range/single modes\n\n2. URL Parameter Initialization:\n   - Added initializeFromUrlParams() to read URL parameters on load\n   - Parse \u0027from\u0027/\u0027to\u0027 parameters for range mode initialization\n   - Parse \u0027commit\u0027 parameter for single commit mode initialization\n   - Return flag indicating successful URL-based initialization\n\n3. Load Flow Enhancement:\n   - Modified loadCommits() to check URL parameters before setting defaults\n   - Skip default commit selection when URL parameters are present\n   - Always dispatch range event to ensure diff view updates correctly\n\n4. Browser Navigation Support:\n   - Added popstate event listener for browser back/forward navigation\n   - Implemented handlePopState() to re-initialize from URL parameters\n   - Force component re-render and event dispatch on navigation\n\n5. Mode Switching Improvements:\n   - Enhanced setRangeType() with better default handling\n   - Auto-populate missing commits when switching between modes\n   - Maintain proper URL state during mode transitions\n\nTechnical Details:\n- URL parameters: \u0027from\u0027, \u0027to\u0027 for range mode; \u0027commit\u0027 for single mode\n- Empty \u0027to\u0027 parameter represents uncommitted changes (working directory)\n- Parameters removed from URL when switching to incompatible modes\n- Browser history updated without triggering page reloads\n- Component lifecycle properly manages event listeners\n\nURL Format Examples:\n- Range mode: ?view\u003ddiff2\u0026from\u003dabc123\u0026to\u003ddef456\n- Uncommitted: ?view\u003ddiff2\u0026from\u003dabc123 (no \u0027to\u0027 parameter)\n- Single commit: ?view\u003ddiff2\u0026commit\u003dabc123\n\nBenefits:\n- Direct linking to specific diff ranges via URL\n- Bookmarkable diff views for easy return navigation\n- Shareable links for collaboration and code review\n- Browser back/forward navigation works correctly\n- URL reflects current diff state at all times\n- Seamless integration with existing diff view functionality\n\nTesting:\n- Verified URL updates when changing from/to commit selectors\n- Confirmed URL initialization on page load with parameters\n- Tested browser back/forward navigation updates UI correctly\n- Validated mode switching (range ↔ single) updates URL appropriately\n- Ensured uncommitted changes mode removes \u0027to\u0027 parameter\n- Confirmed sharing URLs loads correct diff view state\n\nThis enhancement enables direct linking and improved navigation for the\nsketch diff view while maintaining all existing functionality and providing\nseamless URL-based state management.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sbf02a6a8bb4db673k\n"
    },
    {
      "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": "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"
    }
  ]
}
