<!-- Canonical page: https://docs.radforge.dev/reference/language-support/ -->

# Language support

Go, TypeScript/JavaScript, and Python support the same Radforge product
workflows. Their mutation operators, test selectors, and native runner options
differ.

| Capability                    | Go        | TypeScript/JavaScript | Python |
| ----------------------------- | --------- | --------------------- | ------ |
| `rad file` and `rad plan`     | Yes       | Yes                   | Yes    |
| `rad changed` and `rad scope` | Yes       | Yes                   | Yes    |
| `rad verify`                  | Yes       | Yes                   | Yes    |
| Hosted execution              | `go test` | Vitest                | pytest |
| GitHub pull-request analysis  | Yes       | Yes                   | Yes    |
| Setup detection and doctor    | Yes       | Yes                   | Yes    |

## Supported project shapes

- Go uses a root `go.mod` or `go.work` and a supported Go toolchain. See
  [Go support](/reference/go-support/).
- TypeScript/JavaScript uses Vitest, `package.json`, and exactly one supported
  npm, pnpm, or Bun lockfile at the repository root.
- Python uses pytest, `pyproject.toml`, and `uv.lock`. Hosted dependency setup
  creates the `.venv/bin/python` environment recorded in the plan.

## Test selection differences

Go selects packages and anchored test patterns. TypeScript/JavaScript selects
related Vitest files and the owning configuration. Python selects pytest files
or explicit node IDs. `--allow-broad-tests` is required when CLI planning can
only use a test set beyond the broad-fallback safety limit.

## One language per run

One plan and run target one language. Radforge rejects mixed-language Git
diffs, scope files, explicit source paths, and pull requests instead of
silently selecting one language. Split mixed work into one run or pull request
per language.
