)]}'
{
  "log": [
    {
      "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": "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": "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": "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": "222bf413a2ab02a430d92961cb3eef05dcf5ff89",
      "tree": "e5096166ffe7ed487def369ac9f2981e745d2edf",
      "parents": [
        "c898abf9973147658cb90862c071759b0a82259e"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 04 16:42:58 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 04 16:46:40 2025 +0000"
      },
      "message": "loop: replace sketch-host remote with origin remote in agent.Init()\n\nChange git remote handling in agent initialization to replace any existing\norigin remote with the provided git remote URL instead of creating a\nsketch-host remote.\n\nProblem Analysis:\nPreviously, when a git remote URL was provided to the agent, it would:\n1. Add a new remote called \u0027sketch-host\u0027 pointing to the provided URL\n2. Configure additional fetch refs for feature branches\n3. Use \u0027sketch-host\u0027 for all fetch operations\n\nThis created confusion and inconsistency since most git workflows expect\nto interact with \u0027origin\u0027 as the primary remote, not a custom \u0027sketch-host\u0027\nremote.\n\nImplementation Changes:\n\n1. Git Remote Setup Logic:\n   - Remove existing \u0027origin\u0027 remote if it exists (ignoring errors if not present)\n   - Add the provided remote URL as the new \u0027origin\u0027 remote\n   - Update fetch operations to use \u0027origin\u0027 instead of \u0027sketch-host\u0027\n\n2. Branch Detection Logic:\n   - Updated branchExists() function to remove \u0027refs/remotes/sketch-host/\u0027 reference\n   - Now only checks \u0027refs/heads/\u0027 and \u0027refs/remotes/origin/\u0027 for branch existence\n\n3. Comment Updates:\n   - Updated git debugging comment in dockerimg/githttp.go to reference \u0027origin\u0027 instead of \u0027sketch-host\u0027\n\nTechnical Details:\n- The \u0027git remote remove origin\u0027 command gracefully handles the case where\n  origin doesn\u0027t exist by logging and continuing\n- All existing git operations (fetch, checkout, commit tracking) continue\n  to work seamlessly with the origin remote\n- branchExists() function correctly identifies branches in origin remotes\n\nBenefits:\n- Consistent with standard git workflows that use \u0027origin\u0027 as primary remote\n- Eliminates confusion about which remote to use for git operations\n- Maintains all existing functionality while using standard git conventions\n- Simplifies git operations by using the expected \u0027origin\u0027 remote name\n- Better integration with external git tools and workflows\n\nTesting:\n- All existing loop package tests continue to pass\n- Verified git fetch, config, and branch detection work correctly\n- Integration testing confirms seamless operation with origin remote\n\nThis change provides a more intuitive and standard git remote configuration\nwhile preserving all agent functionality and improving compatibility with\nstandard git workflows.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9edcdfe5bae3ef4ek\n"
    },
    {
      "commit": "c898abf9973147658cb90862c071759b0a82259e",
      "tree": "b6c8e1e076ee3ad8555995dd6e7898a276b327db",
      "parents": [
        "a347b1750551dd2d95e478eb0cf2b27f8c547379"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 04 16:33:57 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jun 04 16:33:57 2025 +0000"
      },
      "message": "dockerimg: restrict git fetch to upload-pack service requests only\n\nMake automatic git fetch origin more specific by only triggering on GET requests\nto .git/info/refs with service\u003dgit-upload-pack query parameter.\n\nPreviously, any request containing \u0027.git/info/refs\u0027 in the path would trigger\nan automatic git fetch origin operation. This was overly broad and could cause\nunnecessary fetch operations during git push or other git HTTP operations.\n\nThe change restricts the automatic fetch to occur only when:\n1. HTTP method is GET\n2. URL path contains \u0027.git/info/refs\u0027\n3. Query parameter \u0027service\u0027 equals \u0027git-upload-pack\u0027\n\nThis specifically targets git fetch operations (which use git-upload-pack service)\nwhile avoiding triggering during git push operations (which use git-receive-pack)\nor other git HTTP requests that don\u0027t need an automatic fetch.\n\nBenefits:\n- Reduces unnecessary git fetch operations during push and other operations\n- More precise triggering logic aligned with actual fetch behavior\n- Improved performance by avoiding redundant network operations\n- Better separation of fetch vs push operation handling\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4c1aaa5cf80c7dc7k\n"
    },
    {
      "commit": "51e8e2b0c970ef488094a33b3c259583fe142dc5",
      "tree": "6ecd15e35a40aece2c24231a0540466c7117292d",
      "parents": [
        "d03318d51ca1e707698f1aab8d18ed83fc159cbe"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 21:41:12 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "dockerimg: Run git fetch when .git/info/refs is requested\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sca37f0dfd43f13e9k\n"
    },
    {
      "commit": "995704692a260e7792a6116d19882bc1943e08b4",
      "tree": "54d2b592cb77cf09cc462da3df92849a7095ea37",
      "parents": [
        "50608b1df40053cb18d91a8493872a7ce9243655"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:14 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:21 2025 -0700"
      },
      "message": "dockerimg: remove configurability from open browser request\n\nInnie is untrusted, so we can\u0027t let it provide a url to open (duh).\nThere\u0027s a chicken-and-egg problem here: we need to start the git\nserver before launching the container, but we need the container\nport information to store the ps1URL on the git server.\nSolve it with a little sync/atomic. There\u0027s a logical race here,\nbut if we lose the race, the behavior is that nothing happens,\nat which point the user tries again and it works.\nGood enough for now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "3e2111b1e18a39a4eba4a0afa0327b6a67acf802",
      "tree": "6add6c3a0583877f173f1f2baf6ceeb8c39b3f69",
      "parents": [
        "e54b00af5cf711c2171a26ed0f29a8ce83d50fb4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:53:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:13:18 2025 -0700"
      },
      "message": "all: support popping a browser from termui\n\n- Add \u0027browser\u0027, \u0027open\u0027, and \u0027b\u0027 command aliases to termui\n- Open the current conversation URL in default browser\n- Add help documentation for the new command\n\nAdd browser launch endpoint to Git server for Docker support.\n\nWe\u0027ll probably want to set up a proper mux for the no-longer-just-git\nserver pretty soon.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "9f6a998f9ac9eda8a5ef6e3bc468b21ec741455a",
      "tree": "2c6986c6a07d002bdbed888a6e47777a9a6819b5",
      "parents": [
        "5cef9db41207acbe29b6d265c5ecd08acce2941a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 17:34:15 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 17:34:15 2025 -0700"
      },
      "message": "dockerimg: clean up password matching code\n\nMinor fixes:\n\n* use crypto/rand.Text instead of hand-rolling one\n* avoid converting the password during checking, that\u0027s not constant time\n* don\u0027t use constant time comparisons against a constant string, there\u0027s no point\n"
    },
    {
      "commit": "5e227dd8f494194284b4b545c02e09bc79909d41",
      "tree": "cbe3fb6cb160fea4379e822fcca2cfcbe5bc51cf",
      "parents": [
        "e8d6b80c8804353641c0d999d1897e29b068bbdc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:55:29 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 20:04:53 2025 -0700"
      },
      "message": "sketch: Linux support\n\nTogether with 8a89e1cbd3e7c9bbe1c561e88141527a0c894e06, this\nshould resolve https://github.com/boldsoftware/sketch/issues/3,\nin supporting Linux.\n\nTo test on a Mac, run \"limactl shell default go run ./cmd/sketch -verbose\", assuming\nyou have a lima default VM with sketch\u0027s dependencies already prepped.\n\nThe issues we encountered were:\n\n1. Explicit checks for \"is Colima installed\", \"is docker installed\",\n   etc. Easy enough to fix these.\n\n2. When go\u0027s toolchain builds, it puts the output in different places\n   depending whether it\u0027s cross-compiled or not. Fine, we adapt.\n   Note that os.Rename() doesn\u0027t always work, and we fall back to\n   copy/delete. Mode has to be set appropriately to, to make the\n   /bin/sketch executable executable.\n\n   Re-building is kind of silly: we could use /proc/self/exe, for\n   example, or cross-mount the binary into the container, or any\n   number of other things. That said, here we keep the paths the same.\n\n3. Docker networking setup for the git server. The host git repo\n   is served with git\u0027s cgi-bin wrapper. host.docker.internal\n   seems to work different in colima vs Ubuntu\u0027s docker.io, so\n   an extra command line flag to docker was added. Then,\n   it turns out that our git server checks that the remote is\n   127.0.0.1, which seems to be how Colima does its networking,\n   but isn\u0027t the case for Docker in general. To handle this, we\n   use HTTP Basic Auth with a random password. (Git also has\n   an \"http.extraHeader\" configuration, but basic auth seems just\n   as good and more obvious.)\n\nIncidentally, I\u0027m also adding the git remote as a git remote\nnamed \"sketch-host\" to make it easier to work with in the terminal,\nif necessary.\n"
    },
    {
      "commit": "2e463fb649fcff14d4025ddb91f630a98e7da526",
      "tree": "0e86854d80d2759a913870655f13226c31f9d30c",
      "parents": [],
      "author": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:22:22 2025 -0700"
      },
      "committer": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:35:33 2025 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
