A command-line interface for [Forgejo](https://forgejo.org/), built with [Commander.js](https://github.com/tj/commander.js/). It targets the instance at `https://forgejo.heavyduty.builders` and is designed so that every real operation performed against Forgejo becomes a new CLI command.
Transfer a repository to a new owner (a user or an organization). The authenticated user must have admin rights on the repository and permission to create repositories under the new owner (e.g. be an organization owner), in which case the transfer completes immediately.
```text
Options:
-o, --owner <owner> current repository owner (required)
-r, --repo <repo> repository name (required)
--to <new-owner> new owner: username or organization name (required)
```
Example used to move the heavy-duty repositories into the `heavy-duty` organization:
```bash
stoke repo transfer -o kimi-reviewer-andresmgsl -r box --to heavy-duty
--website https://heavyduty.builders --visibility public
```
Calls `POST /api/v1/orgs`.
### `stoke org repos`
List repositories owned by an organization.
```text
Options:
-o, --org <org> organization name (required)
-l, --limit <number> maximum repositories to display (default: 50; use 0 for all)
```
```bash
stoke org repos -o heavy-duty -l 0
```
Calls `GET /api/v1/orgs/{org}/repos` and auto-paginates.
### `stoke org avatar`
Set the avatar (logo) of an organization from a local image file. The image is read, base64-encoded and uploaded; the caller must be an owner of the organization.
```text
Options:
-o, --org <org> organization name (required)
-f, --file <path> path to the image file (png, jpeg, gif, ...) (required)
```
Example used to set the Heavy Duty Builders logo (sourced from the official GitHub organization avatar at `https://github.com/heavy-duty.png`):
stoke org team create -o heavy-duty --name members --permission write --all-repos
```
Calls `POST /api/v1/orgs/{org}/teams`.
### `stoke org team member-list`
List members of a team. Requires being a member of that team (or an instance admin).
```bash
stoke org team member-list --team-id 2
```
Calls `GET /api/v1/teams/{id}/members` and auto-paginates.
### `stoke org team member-add`
Add a user to a team. Adding a user to any team also makes them a member of the organization; membership in the `Owners` team is what makes a user an organization admin.
```text
Options:
--team-id <id> team id, see `stoke org team list` (required)
-u, --user <username> username to add (required)
```
Example used to make Dan and Andres organization admins:
The heavy-duty repositories were imported into Forgejo under `https://forgejo.heavyduty.builders/kimi-reviewer-andresmgsl` and later transferred to the `heavy-duty` organization (`https://forgejo.heavyduty.builders/heavy-duty`) using `stoke repo transfer`.
Counts match GitHub for all repositories. Git history, issues, pull requests, labels, milestones and releases are included. Discussions are not enabled on any of the source repositories. The `cast` wiki is enabled on GitHub but contains no pages, so nothing was migrated.
The CLI is authenticated and the first full repository import is complete. Every subsequent Forgejo task you need will be added as a new command under `stoke`.
The heavy-duty handbook defines a strict naming style for tools:
- **one syllable**, plain concrete English — industrial: the shop floor and the site
- **a repurposed common word**, never coined jargon
- **a verb⇄noun with a double meaning** that hints at the job
Existing tools follow this exactly: `cast` pours a part and is the part; `rig` sets up and is the setup; `jig` holds work and is the fixture; `boss` runs the site and is the supervisor; `hand` works and is the worker; `gig` is a one-off job and the job itself; `gauge` measures and is the instrument.
The handbook calls the Forgejo instance **"the forge"** — the coordination home where issues, PRs, reviews, and git state live. A forge only stays useful if someone feeds it fuel and air. *To stoke* a fire is to tend it and keep it burning. This CLI does the same thing programmatically: it creates repos, opens issues, imports projects, adds collaborators — it keeps the forge active.
`stoke` also fits the operator relationship. While `jig`, `boss`, `hand`, and `gauge` are autonomous or daemon-like, this tool is the operator's hand on the forge. You don't forge by accident; you stoke on purpose.
Other names were considered and rejected:
-`forge` — too literal; the forge is the platform, not the tool.
-`tap` — machining term, but "tapping" is about threading holes, not tending a forge.
-`weld` / `braze` — join-metal verbs, but the CLI is not primarily joining things.
-`die` / `mold` / `stamp` — shaping tools, but `die` carries a strong negative meaning and `mold` has the fungus connotation.
-`quench` — forge-related, but quenching cools/finishes; the CLI starts and feeds work.
-`draft` / `blast` — air-feeding the forge, but feel like background services, not an operator CLI.
-`flux` — nice metaphor for flow, but reads as chemistry rather than the forge shop.
`stoke` was the only candidate that was clearly forge-specific, operator-facing, one syllable, and already a common verb/noun.