Contribute a tool¶
This page shows you how to propose a tool for the project registry, which every APRScaching instance bundles. It is for tool authors with a working, tested tool. At the end your pull request is open and holds everything the review checks.
Before you start¶
- A tool that works and is tested (Write your first tool, Test a tool).
- Your own author key (Sign a tool), and a way for a reviewer to confirm it is yours: your callsign's QRZ page, or a post on a channel you control.
- A GitHub account and a fork of apachler/aprscaching-tools.
Steps¶
-
Cut a branch from
devin your fork, named after the change's Conventional Commit type, such asfeat/cw-trainer: -
Check that your computer has what the build and the tests need:
It prints a
pass,warnorFAILline for Node, pnpm through corepack,gh, the remote and its branches, the libraries invendor/and the lockfile. The key-file lines are for the maintainer; a warning there is fine. -
Start the tool:
node scripts/new-tool.mjs cw-trainer --title "CW trainer" --description "Sends practice groups at your speed."new-tool.mjswrites everything the review and the documentation build check, as a working/cw-trainercommand that asks only forcommand:tools/<name>/tool.json, with"entry": "tool.js","api": "1.0"and version1.0.0(The manifest); the MIT licence is in the script's SPDX line and the README's Licence section;tools/<name>/src/index.js, the source, and the builttool.js(Build with the shared libraries);tools/<name>/README.md, with a Permissions table and a Licence section;test/<name>.test.mjs, a test of the command;docs/catalogue/<name>.md, the catalogue page, with a row in the catalogue index's Utilities table and an entry inmkdocs.yml.
The new tool builds and passes
pnpm test,verify.mjsandmkdocs build --strictas it is. Make it do its job: editsrc/index.jsand rebuild withnode scripts/build.mjs <name>; add each permission it uses totool.jsonand to both Permissions tables, with why it needs it; give a tool withtxorbeacona What it transmits section; extend the test; move the catalogue row and the nav entry to the group that fits.--author <callsign>sets the author, which is OE8APR by default. In Claude Code,/new-tool <name>takes you through these steps to the pull request (.claude/skills/new-tool/SKILL.md). A tool you built with Write your first tool has all of this already; bring its files onto the branch and go on with the next step. -
Sign the manifest with your author key. The signature covers the script through
entrySha256; sign again after every change: -
Run the checks:
verify.mjsshows your tool assigned by <your key>, not listed in the registry. Leaveregistry.jsonas it is: the maintainer adds the entry. Until thenpnpm testprints a warning that your tool has no registry entry, and passes. -
Add a line under
## [Unreleased]inCHANGELOG.mdthat says what your change gives a player or a tool author, such as- **New tool.** CW trainer: …or- Grid & bearing 1.0.1: bearing in mils.. The release dates that section as it is. -
Commit with a sign-off and a Conventional Commit message, push, and open a pull request into
dev:State your public key in the pull request's description, and how a reviewer can confirm it is yours.
A tool you host yourself works the same way, with one difference: put its absolute https:// address in the pull
request instead of the files. The server must send Access-Control-Allow-Origin: *.
Sign off your commits¶
Every commit carries a Developer Certificate of Origin sign-off (developercertificate.org).
git commit -s adds Signed-off-by: Your Name <you@example.org>, which certifies that you wrote the change or have
the right to submit it under the stated licence. The DCO check fails a pull request with a commit that lacks it;
git rebase --signoff <base> adds it to commits you made without.
Commit messages and the pull request's title are Conventional Commits, such
as feat(tools): add cw-trainer, and carry no tool attribution lines.
What the review checks¶
- The manifest validates and its signature verifies with the key you stated, confirmed through the channel you named.
- The least permissions needed. Every permission in
permissionsis used, and the README says why. - A declared licence, the same in the script's SPDX line and the README.
- No
networkwithout a reason.connectlists only the origins the tool reaches, and the README names each one and what the tool sends there. - No
txorbeaconwithout a clear purpose. A tool that transmits says what, when and how often, and never transmits without the operator asking. - Readable code that does what it says. No obfuscated or minified code and no code loaded at run time. A built
tool.jsmust match a fresh build of its sources; CI checks it. - Nothing pretends to be the app. Panels and command output say they come from the tool.
- The tests pass, and cover the tool's commands and events.
The pull request is squash-merged into dev. Your tool is signed into the registry with the next release, and
reaches instances when an APRScaching release bundles that tag, or when a sysop adds the tag by address.
A new version is a new pull request with the signed tool.json and script. A new author key needs the same proof as
the first.
Check that it worked¶
The pull request's checks are green, with a warning that your tool has no registry entry yet, and its description names your key and how to confirm it.
Next¶
- Maintain the registry: what happens to your tool after the merge.
- Tool catalogue: the tools already listed.