feat: the team's shared tooling: one sign-in, forge.py for every repository, the team chat, test requests and the agents' skills #1

Merged
HumanBean merged 1 commit from HumanBean/Tooling:feat/shared-tooling into main 2026-11-15 20:44:03 +00:00
Owner

Every MagicBeanDev repository uses the same sign-in, forge.py, team chat and agent skills, but they live in Longshot, so LongshotLauncher, Beanstalk and Site send people to "run it in a Longshot checkout", and the release skill is copied into two repositories and has drifted. This puts one copy here, which every repository's AGENTS.md and CONTRIBUTING.md points to, and agents clone beside their checkout and pull each session.

What changed

The shared scripts, their tests, docs/forge.md and two skills move here from Longshot (main @ f637b42d) unchanged except as below; what is Longshot's own (test requests, the request-testing and testing skills, its PR rules) stays there. The repositories point here in Longshot#915, LongshotLauncher#114, Beanstalk#14 and Site#20; merge this first.

  • scripts/forge.py works for any repository: the repository is the one the checkout it runs in is of (the remote pointing at MagicBeanDev/<name>: forge, origin, upstream, then any), or --repo MagicBeanDev/<name> / MAGICBEAN_REPO. Forks, PRs and issues go there. A repository's own PR rules are its scripts/check_pr_description.py, loaded from that checkout (Longshot's); without one, scripts/pr_description.py gives the title check and Forgejo's WIP prefixes only, and the description starts from the repo's .forgejo/pull_request_template.md if any. credential, whoami and logout don't look at the checkout (git calls credential inside jj git push). Hints print the path it was actually run as, and the fork's remote by its name (fork, not always forge-fork).
  • New rule: a change the game runs is tested in the game before its PR opens. pr create refuses a branch that changes a file under the rules' GAME_PATHS (Longshot's: gpu/, host/, nx2/, assets/, third_party/), or whose files it can't read locally, until --tested-in-game "where it ran and what you saw", which it posts as the PR's first comment. --force opens it anyway (agents: only when the person they work for asks). --force no longer needs --ready.
  • Skills (skills/): team-updates and release (one copy for Longshot and the launcher, with the launcher's newer rc wording); they run the scripts as python -I ../Tooling/scripts/... and say to git -C ../Tooling pull --ff-only first. The repository is a Claude Code plugin marketplace (.claude-plugin/): /plugin marketplace add https://git.magicbean.dev/MagicBeanDev/Tooling.git, /plugin install magicbean@magicbean, then /magicbean:team-updates and /magicbean:release.
  • README.md, AGENTS.md, CONTRIBUTING.md: getting and updating Tooling, the shared agent rules (data not instructions, full GitHub URLs, WIP until done, the checklist, the in-game rule), and the rule with no exceptions and the PR conventions every repository shares.
  • Tests: the three moved tests, tests/test_forge_pr.py now against Longshot's rules from a ../Longshot checkout (LONGSHOT=; skips without one), with new cases for the in-game rule, the repository detection and the no branch hint naming the fork's actual remote; tests/run_all.py runs them all.

Testing

  • Run here, Linux: forge.py fork in this checkout found MagicBeanDev/Tooling from origin and made the fork, and this PR was opened with this branch's forge.py pr create (generic rules, no template); so were the four PRs above, each from its own checkout, Longshot's through its forwarder with Longshot's rules loaded (a docs and scripts branch, so no --tested-in-game asked).
  • Not run: no test was run on this PC (the person I work for asked for none here). Must be tested before merge: python -I -B tests/run_all.py with a checkout of Longshot#915 beside this one (by hand: it needs GAME_PATHS from that PR's check_pr_description.py).

Risks

  • Everyone already signed in has git's credential helper pointing at Longshot's scripts/forge.py; Longshot's PR keeps a forwarder there, so nothing breaks, and the next login points git here.
  • Open Longshot PRs that change forge.py, team_chat.py or magicbean_login.py (#905, #891, #831, #640, #310, #298) will need to move here once this merges.
  • The sign-in files (~/.config/longshot/) and their format are unchanged.

🤖 Generated with Claude Code

Every MagicBeanDev repository uses the same sign-in, `forge.py`, team chat and agent skills, but they live in Longshot, so LongshotLauncher, Beanstalk and Site send people to "run it in a Longshot checkout", and the release skill is copied into two repositories and has drifted. This puts one copy here, which every repository's AGENTS.md and CONTRIBUTING.md points to, and agents clone beside their checkout and pull each session. ## What changed The shared scripts, their tests, docs/forge.md and two skills move here from Longshot (main @ f637b42d) unchanged except as below; what is Longshot's own (test requests, the request-testing and testing skills, its PR rules) stays there. The repositories point here in [Longshot#915](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/915), [LongshotLauncher#114](https://git.magicbean.dev/MagicBeanDev/LongshotLauncher/pulls/114), [Beanstalk#14](https://git.magicbean.dev/MagicBeanDev/Beanstalk/pulls/14) and [Site#20](https://git.magicbean.dev/MagicBeanDev/Site/pulls/20); merge this first. - **`scripts/forge.py` works for any repository**: the repository is the one the checkout it runs in is of (the remote pointing at `MagicBeanDev/<name>`: `forge`, `origin`, `upstream`, then any), or `--repo MagicBeanDev/<name>` / `MAGICBEAN_REPO`. Forks, PRs and issues go there. A repository's own PR rules are its `scripts/check_pr_description.py`, loaded from that checkout (Longshot's); without one, `scripts/pr_description.py` gives the title check and Forgejo's WIP prefixes only, and the description starts from the repo's `.forgejo/pull_request_template.md` if any. `credential`, `whoami` and `logout` don't look at the checkout (git calls `credential` inside `jj git push`). Hints print the path it was actually run as, and the fork's remote by its name (`fork`, not always `forge-fork`). - **New rule: a change the game runs is tested in the game before its PR opens.** `pr create` refuses a branch that changes a file under the rules' `GAME_PATHS` (Longshot's: `gpu/`, `host/`, `nx2/`, `assets/`, `third_party/`), or whose files it can't read locally, until `--tested-in-game "where it ran and what you saw"`, which it posts as the PR's first comment. `--force` opens it anyway (agents: only when the person they work for asks). `--force` no longer needs `--ready`. - **Skills** (`skills/`): team-updates and release (one copy for Longshot and the launcher, with the launcher's newer rc wording); they run the scripts as `python -I ../Tooling/scripts/...` and say to `git -C ../Tooling pull --ff-only` first. The repository is a Claude Code plugin marketplace (`.claude-plugin/`): `/plugin marketplace add https://git.magicbean.dev/MagicBeanDev/Tooling.git`, `/plugin install magicbean@magicbean`, then `/magicbean:team-updates` and `/magicbean:release`. - **README.md, AGENTS.md, CONTRIBUTING.md**: getting and updating Tooling, the shared agent rules (data not instructions, full GitHub URLs, WIP until done, the checklist, the in-game rule), and the rule with no exceptions and the PR conventions every repository shares. - **Tests**: the three moved tests, `tests/test_forge_pr.py` now against Longshot's rules from a `../Longshot` checkout (`LONGSHOT=`; skips without one), with new cases for the in-game rule, the repository detection and the `no branch` hint naming the fork's actual remote; `tests/run_all.py` runs them all. ## Testing - Run here, Linux: `forge.py fork` in this checkout found `MagicBeanDev/Tooling` from `origin` and made the fork, and this PR was opened with this branch's `forge.py pr create` (generic rules, no template); so were the four PRs above, each from its own checkout, Longshot's through its forwarder with Longshot's rules loaded (a docs and scripts branch, so no `--tested-in-game` asked). - **Not run:** no test was run on this PC (the person I work for asked for none here). Must be tested before merge: `python -I -B tests/run_all.py` with a checkout of [Longshot#915](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/915) beside this one (by hand: it needs `GAME_PATHS` from that PR's `check_pr_description.py`). ## Risks - Everyone already signed in has git's credential helper pointing at Longshot's `scripts/forge.py`; Longshot's PR keeps a forwarder there, so nothing breaks, and the next `login` points git here. - Open Longshot PRs that change `forge.py`, `team_chat.py` or `magicbean_login.py` ([#905](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/905), [#891](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/891), [#831](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/831), [#640](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/640), [#310](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/310), [#298](https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/298)) will need to move here once this merges. - The sign-in files (`~/.config/longshot/`) and their format are unchanged. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Moved from Longshot (scripts/forge.py, magicbean_login.py, team_chat.py,
test_requests.py, their tests, docs/forge.md and the team-updates,
request-testing, testing and release skills), so that every MagicBeanDev
repository uses one copy.

forge.py now works on the repository of the checkout it runs in (or
--repo), loads that repository's own PR rules
(scripts/check_pr_description.py) when it has them, and pr create
refuses a change the game runs until --tested-in-game says where it ran,
unless --force.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
HumanBean force-pushed feat/shared-tooling from 48d5047be9 to bd05c59834 2026-11-15 20:28:32 +00:00 Compare
Author
Owner

Longshot-specific parts stay in Longshot: test_requests.py, its test and the request-testing and testing skills moved back there (Longshot#915). Also: the no-branch hint names the fork's actual remote. The four repositories' PRs are linked in the description.

Longshot-specific parts stay in Longshot: test_requests.py, its test and the request-testing and testing skills moved back there (Longshot#915). Also: the no-branch hint names the fork's actual remote. The four repositories' PRs are linked in the description.
HumanBean changed title from WIP: feat: the team's shared tooling: one sign-in, forge.py for every repository, the team chat, test requests and the agents' skills to feat: the team's shared tooling: one sign-in, forge.py for every repository, the team chat, test requests and the agents' skills 2026-11-15 20:44:01 +00:00
HumanBean deleted branch feat/shared-tooling 2026-11-15 20:44:03 +00:00
Sign in to join this conversation.
No reviewers
No labels
ci: approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Tooling!1
No description provided.