Skip to content

feat: rewrite spawnpoint in Go, ship as a single binary - #9

Merged
mihirgupta0900 merged 6 commits into
mainfrom
feat/go-rewrite
Sep 29, 2026
Merged

mihirgupta0900 merged 6 commits into
mainfrom
feat/go-rewrite

Conversation

@mihirgupta0900

@mihirgupta0900 mihirgupta0900 commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Summary

Rewrites Spawnpoint in Go so it ships as one native binary instead of needing Python and pipx, and reworks the README messaging and overview video.

  • Go port: a feature-for-feature rewrite built on cobra and fang, huh prompts, lipgloss styling, and a custom Bubble Tea fuzzy repo picker.
    • --json and --no-input output match the Python version, which I checked against real workspaces.
    • Config, template and version-cache files stay in the same format, so nothing needs migrating.
  • Performance: startup is about 20 ms, down from about 90 ms. sp list on 40 workspaces / 133 worktrees takes 446 ms, down from 913 ms, because the scan now runs in parallel.
  • Install: Homebrew cask, curl … | sh (with checksum verification), go install, and PyPI binary wheels, so pipx install / uv tool install keep working.
  • sp update: detects how it was installed and runs the matching upgrade (brew, pipx, uv, pip or go). Otherwise it replaces its own binary in place after checking the checksum. It also prints a background notice when a new release is out, which is skipped in --json / --no-input mode.
  • Upgrading from the Python version: existing pipx users can run pipx upgrade spawnpoint or the old sp update and they get the Go binary. I verified this end to end with locally built wheels.
  • Bug fixes carried over from the Python version:
    • progress bars and wrapped paths no longer leak into --json stdout;
    • add now uses --no-track;
    • single-repo workspaces get the right name;
    • scan_depth is no longer capped at 2.
  • Release: GoReleaser v2 plus a wheel builder, still using publish.yml so PyPI trusted publishing keeps working. CI runs the unit tests and the e2e suite.
  • Docs and video:
    • the README now leads with multi-repo workspaces for agents, and has install, update, "coming from Python" and uninstall sections;
    • a new 30-second overview video (Remotion) replays the real sp create flow;
    • the video's music and sound effects are synthesized in video/scripts/make_audio.py, so there are no licensing issues.
  • The Python implementation (src/, tests/, pyproject.toml, uv.lock) is removed.

Before releasing

  • Create the mihirgupta0900/homebrew-tap repo.
  • Add a write deploy key to the tap and store its private key as the HOMEBREW_TAP_DEPLOY_KEY secret on this repo.
  • Release as a major version bump (1.0.0).
  • Optional: upload assets/spawnpoint.mp4 as a GitHub attachment so the README can play it inline with sound. The GIF is silent.

Test plan

  • go vet ./... and go test ./... pass, including the e2e suite covering repos, create, add, list/cd, restructure, templates, file compatibility, cleanup, light-cleanup and headless first run.
  • Upgrade paths tested locally: the old Python sp update → Go, pipx upgrade, uv tool, pip venv, install.sh, self-update 0.9.0 → 1.0.0, and the install.sh pipx guard.
  • Smoke-tested in Alpine and Debian containers.
  • Not tested yet: a real Homebrew cask install, running on Windows, and a real GitHub/PyPI release.

🤖 Generated with Claude Code

mihir-seg and others added 6 commits September 29, 2026 18:01
…ew video

- New README hero ("One branch. Every repo. Ready to code."), Why section,
  and a "Built for coding agents" section near the top
- 46s motion-graphics overview video (mp4 + gif) and new social preview,
  built with Remotion in video/
- PyPI description/keywords updated; video assets excluded from sdist

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A single static binary built on cobra + fang (styled help, errors,
completions, man pages), huh prompts, lipgloss output and a bubbletea
fuzzy repo picker. Config, templates, workspace layout and the
--no-input/--json contract are unchanged.

- ~20ms startup (vs ~90ms), parallel fetch, `list` ~2x faster
- human output always on stderr, so --json stdout is valid JSON (the
  Python release mixed progress bars into it for create/add/cleanup)
- `sp update` upgrades via brew/pipx/uv/pip/go install when that's how
  it was installed, and self-updates curl installs with checksum checks
- releases via GoReleaser: GitHub binaries, Homebrew cask, install.sh,
  and PyPI wheels carrying the binary so `pipx upgrade` moves existing
  Python users over
- e2e suite against real git repos pins the agent-facing JSON contract

Fixes carried over from the Python version: new branches created by
`add` no longer track the base branch, single-repo workspaces are keyed
by repo name (so `add` doesn't re-offer that repo), and scan_depth
honours values above 2.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The Go binary replaces it. Existing pipx/pip users are moved over by
their next `sp update` / `pipx upgrade` (PyPI now ships the binary as
platform wheels). README covers the new install options, how `sp update`
works per install method, and what changes for 0.11 users. Fixes the
action/status values in the agent skill's JSON reference.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ffects

The demo now replays the Go 'sp create' flow (fuzzy picker, huh prompts,
spinner), a new scene covers install and 'sp update', and the outro points
at Homebrew. Music and SFX are synthesized by video/scripts/make_audio.py
and cued per scene in src/audio.tsx.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Keep the problem, the sp create demo, agents, and install. Drop the
workspace tree, feature grid and update scenes; the outro now carries the
install line and the single-binary/startup/update points.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@mihirgupta0900
mihirgupta0900 merged commit 8dac476 into main Sep 29, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants