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.