For the last month or so, I have been experimenting with using Claude Code to tackle the backlog of issues on the Forge gnome extension. My strategy was to fix bugs and add features on one branch while simultaneously developing comprehensive unit tests on another branch. I have since merged these branches and forged ahead on my fork.

More bug fixes

Having already addressed a substantial number of bugs, I wanted to explore what was left. My original strategy was to keep the output from gh issue list --json in issues.json and have Claude delete from it as issues were fixed. I then moved to two JSONs – bugs.json and features.json which was a bit easier for Claude to manage but I found that during planning phases, it kept rehashing the same information, wasting tokens. This week, I evolved my approach again, splitting all issues into their own file (in .issues/). I then had Claude review and organize them into subdirectories based on whether the issue was complex, needed investigating, or was out-of-scope. After sorting, this made it significantly easier to point Claude at a directory and ask it to iterate on issues that still need fixing.

This led to another batch of 10 “fixed” issues and the identification of another five that had already been addressed by other commits. After that, I cleaned up a few things that I had started last week, addressing another four issues (including making configs portable, improving the formatting for the cheatsheet, and addressing a bug where windows would “travel” during resizing).

Upgraded Toolset

I read a post from HN about Running Claude Code dangerously (safely) and wanted to give it a try. Until now, I had not installed npm on my system so I was running all tests and formatting via a Docker container which was a huge pain. Instead of using VirtualBox, I went with libvirt/KVM:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"

  config.vm.provider :libvirt do |libvirt|
    libvirt.memory = 4096
    libvirt.cpus = 2
  end

  config.vm.synced_folder ".", "/vagrant", disabled: true

  config.vm.provision "shell", inline: <<-SHELL
    export DEBIAN_FRONTEND=noninteractive

    apt-get update
    apt-get install -y docker.io nodejs npm git unzip gh
    npm install -g @anthropic-ai/claude-code --no-audit

    usermod -aG docker vagrant
  SHELL
end

I also opted not to copy this into every project folder and instead made use of the pre-installed gh binary to clone repos, iterate with Claude, and then commit changes. Even without using YOLO mode, it feels much better to work inside a VM without access to my host filesystem.

What’s Next?

With these changes, there are two “needs investigation”, 39 “complex”, and 18 “out-of-scope” issues left from the original 140. I have started to use the extension on a daily basis and things feel quite stable. I expect to continue to squash bugs that affect my use of the extension but otherwise plan to move on to other projects (more on that next week). I will continue to try to merge these changes upstream to benefit the community. However, that is getting increasingly challenging. The lib/ directory changes are quite substantial: 21 files changed, 3678 insertions(+), 636 deletions(-). The tests/ directory is almost 12k LoC. This is a substantial amount of code for anyone to review and everything is on the same branch, making it even more challenging. There is an opportunity to explore “backporting” individual fixes/features from my fork (ignoring the history in the middle) but I am not sure how long that will take. It is also interesting because it costs me substantially fewer tokens (and time) to maintain my fork instead of working to merge it upstream. I do not know how we address this tragedy of the commons.