Py2go
Migrate Python projects to idiomatic Go end-to-end. Branches into 6 project-type playbooks (CLI, TUI, HTTP backend, data pipeline, async worker, library) with the right stack defaults (Gin, pgx, sqlc, slog, etc.) and pinned library versions. Default strategy: LLM module-by-module rewrite with golden-file parity tests; --strangler for live-traffic gradual cutover; --spec-first for OpenAPI/proto-driven regeneration. Use when porting a Python codebase to Go, when scaffolding a Go rewrite of a Python service, or when generating CLAUDE.md/MIGRATION.md for an AI-driven migration.From its SKILL.md
npx -y skills add vanducng/skills --skill py2goAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.9 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
py2go
End-to-end Python → Go migration. Discover the source, lock the design, scaffold the Go module, translate file-by-file with TDD, validate behavioral parity against real data, cut over, then sweep dead code.
The skill is opinionated. It enforces idiomatic Go output over Python-shaped Go, rejects dead toolchains (Grumpy/py2go transpilers), defaults to sqlc over GORM, defaults to pgx over lib/pq, defaults to Gin for HTTP, prefers stdlib slog over zap/zerolog, and treats real-data parity validation as non-optional.
When to load which reference
| Task | Open |
|---|---|
| Decide which Python pattern maps to which Go idiom | references/translation-rules.md |
| Pick the right Go stack per project type | (playbooks - extend as needed) |
| Configure strangler-fig gateway / traffic shadow | (extend as needed) |
| Drive from an existing OpenAPI/proto spec | (extend as needed) |
The 7 phases
discover → design → scaffold → translate → validate → cutover → cleanup
- Discover - two-pass: 7 discovery prompts individually → synthesize to
notes/ - Design - emit
CLAUDE.md(translation rules) +MIGRATION.md(ordered file map + checkboxes) - Scaffold -
go mod init, layout, lint (golangci-lint), CI, Makefile, smoke target - Translate - per-file loop: Python source → Go test first → Go impl →
go build && vet && test -race && lint→ commit - Validate - golden-file parity on real production data + integration tests + dead-code sweep
- Cutover - hard cutover (default) or strangler-fig (
--strangler) - Cleanup - orphan sweep, dependency audit, retro
Project-type playbooks (auto-detected in discover)
| Type | Detected from | Go stack |
|---|---|---|
| CLI | Click/Typer imports, entry_points console_scripts | Cobra + Viper + lipgloss |
| TUI | Textual / Rich.live / prompt_toolkit | Bubble Tea + Bubbles + Lipgloss |
| HTTP | FastAPI/Flask/Django/Starlette | Gin (default) / chi / Echo / Fiber |
| Pipeline | pandas/polars/Airflow/Prefect/Dagster | streaming []T + channels; qframe; STOP if NumPy/SciPy heavy |
| Worker | Celery/RQ/Dramatiq/Arq/Taskiq | asynq (Redis) or river (Postgres) |
| Library | __init__.py exports | pkg/ layout with forced public-API decision |
Hard guardrails (skill enforces)
- No 1:1 syntax port - Go function signatures must not mirror Python verbatim across >50% of lines.
- TDD-or-bust under
--strict-tdd- Go test mtime must precede Go impl mtime per commit. - No
lib/pq- usepgx/v5. lib/pq is in maintenance mode. - No
golang/mock- usego.uber.org/mock(Google archived original). - No GORM by default -
sqlcis default; GORM requires explicit--orm=gormflag. - No
panicfor business errors - return errors. - No blind
internal/- design phase must produce an explicit public-API decision. - No synthetic-only validation - validate phase refuses to mark complete without a real-data fixture path.
- NumPy/SciPy refusal - if discovery detects them load-bearing, STOP with gRPC-wrap recommendation instead.
Cross-refs into the rest of the skill ecosystem
- gostack - Sam Berthe's Go libraries (lo, oops, do, mo, slog, hot, ro). See
references/translation-rules.mdfor where each library is the right answer. vd:cook- once a plan + MIGRATION.md is in place, drive execution phase-by-phasevd:debug- for the on-call storyoops/slogenables in the migrated servicevd:ship- for the final cutover commit + PR
Versions snapshot (verified 2026-05-23)
Locked defaults - change requires explicit flag.
| Concern | Pinned default | Cite |
|---|---|---|
| HTTP framework | gin v1.x | Go Survey 2025: 48% adoption |
| Postgres driver | pgx/v5 | lib/pq in maintenance |
| DB access | sqlc | 2× faster than GORM on 15k-row reads |
| Migrations | golang-migrate | Multi-DB, CI-friendly |
| Config | viper | Cobra ecosystem alignment |
| Logger | log/slog (stdlib) | Survey 2025 default for new code |
| Validation | go-playground/validator | Default with Gin |
| Mocking | go.uber.org/mock | Google archived golang/mock |
| OpenAPI codegen | oapi-codegen | Supports Gin/chi/Fiber |
| Queue | asynq (Redis) or river (Postgres) | Celery-shaped or PG-native |
| Cache | ristretto or gostack@hot | See gostack/hot |
| Auth | golang-jwt/v5 + argon2 | OWASP 2025 recommendation |
| Observability | OpenTelemetry + Prometheus | Industry standard |
| Build/release | goreleaser + ko | Container without Dockerfile |
Adding a new project-type playbook
- Detect signal in discover phase (imports, file conventions)
- Drop
references/playbook-<type>.mdwith the canonical Go stack for that shape - Add a row to the "Project-type playbooks" table above
- Update translation rules where the playbook diverges from defaults
What ships with it: 1 file
16.5 KB alongside SKILL.md
references/
- translation-rules.md16.5 KB