The repository is owned by the organisation `public`, not by the user `igor`. Gitea forwards the old address for anything a browser or git does, so the install command and the clone lines kept working and the wrong address went unnoticed. An API call is the exception. A POST to `/api/v1/repos/igor/supaspin/...` is answered with a redirect that curl does not follow for a POST, so the command returns an empty body and no error - which reads as a rejected token. Creating the v1.2.0 tag and opening its pull request both failed this way first. - CLAUDE.md: the tagging rule now names `public` and says why an API address cannot use the forwarded one. - README.md, install.sh: the install, token and clone commands now use the address the server actually serves. Version 1.2.0 -> 1.2.1. No change to what the program does. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2.3 KiB
supaspin - rules for AI agents
Read and follow the global rules first. They are in Igor's global CLAUDE.md, which in turn pulls in
~/.agents/AGENTS.md:
@~/.claude/CLAUDE.md
The rules below are specific to this repository and add to the global ones.
Versioning
The number is MAJOR.MINOR.PATCH (semantic versioning: 1.1.1 is major 1, minor 1, patch 1).
-
Pick the number. A bug fix or wording fix raises PATCH (1.1.0 -> 1.1.1). A new feature raises MINOR and resets PATCH (1.1.1 -> 1.2.0). MAJOR is Igor's decision only: never raise it, never write
!after the commit type (feat!:) and never write aBREAKING CHANGE:line without asking him first (see the global rules). -
Write it in all three places, in the same commit as the change. The file
VERSION, theVERSION = "x.y.z"line near the top ofsupaspin, and the lineVersion x.y.zat the top ofREADME.md. A unit test (tests/test_supaspin.py, classVersion) fails if they differ.supaspin --versionprintssupaspin x.y.z. -
One plan = one branch = one commit = one pull request. The version bump is part of that one commit.
-
Tag every release. After the pull request is merged, create the git tag
vX.Y.Z(for examplev1.1.1) on the commit onmainthat contains that number inVERSION. The tag name must equalVERSIONwith avin front. A version without a tag is not released. Never move or delete a tag that was already published; if a release is wrong, ship a new PATCH instead. With the Gitea API:POST /api/v1/repos/public/supaspin/tagswithtag_name,target(the commit) andmessage.The owner in an API address must be
public. The repository used to sit under the userigorand Gitea still forwards the old address for anything a browser or git does, but it answers an API call to/api/v1/repos/igor/supaspin/...with a redirect that curl does not follow for a POST: the command returns an empty body and no error, which looks exactly like a rejected token. Opening or merging a pull request needs the samepublicowner. -
Check the result. Reinstall from the merged
main(sudo bash install.sh), then runsupaspin --versionand compare it withVERSIONand the tag. -
If you find a version in
VERSIONthat has no tag, or a tag that does not matchVERSION, tell Igor before doing anything else.