turbo-editors/turbo-rustpublic Fork 0
9c61a67
Commits
Clone
git clone https://git.rickub.com/turbo-editors/turbo-rust.git
git clone ssh://git@rickub.com/turbo-editors/turbo-rust.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

🛟 Updated.

k33g committed 2026-09-20T09:38:59+02:00 Browse files
9c61a67 parent: f69efbe
modified .github/workflows/release.yml +3 -2
@@ -60,8 +60,9 @@ jobs:
6060 run: go test ./... -count=1
6161
6262 - name: Build the release
63- # release.env is git-ignored, so the tag is passed explicitly and the
64- # script falls back to "Turbo Rust <tag>" for the description.
63+ # The tag is passed explicitly — the one just pushed — so release.env, which
64+ # is committed, cannot make the build disagree with it. ABOUT is still read
65+ # from the file for the description, "Turbo Rust <tag>" being the fallback.
6566 run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}"
6667
6768 - name: Release notes
@@ -60,8 +60,9 @@ jobs:
60 run: go test ./... -count=160 run: go test ./... -count=1
61 61
62 - name: Build the release62 - name: Build the release
63- # release.env is git-ignored, so the tag is passed explicitly and the63+ # The tag is passed explicitly — the one just pushed — so release.env, which
64- # script falls back to "Turbo Rust <tag>" for the description.64+ # is committed, cannot make the build disagree with it. ABOUT is still read
65+ # from the file for the description, "Turbo Rust <tag>" being the fallback.
65 run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}"66 run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}"
66 67
67 - name: Release notes68 - name: Release notes
modified .gitignore +4 -0
@@ -1,6 +1,10 @@
11 bin/
22 kits
33 *.env
4+# release.env is the one .env that is committed: it carries the version being
5+# published and its one-line description, which are part of the project's
6+# record. Token files (*.token.env) stay under the rule above.
7+!release.env
48 release
59
610 # A go.work pointing at the checkout beside this one is how you build against an
@@ -1,6 +1,10 @@
1 bin/1 bin/
2 kits2 kits
3 *.env3 *.env
4+# release.env is the one .env that is committed: it carries the version being
5+# published and its one-line description, which are part of the project's
6+# record. Token files (*.token.env) stay under the rule above.
7+!release.env
4 release8 release
5 9
6 # A go.work pointing at the checkout beside this one is how you build against an10 # A go.work pointing at the checkout beside this one is how you build against an
modified .memory/handoffs/2026-09-20-load-config.md +9 -0
@@ -15,3 +15,12 @@
1515
1616 - The sample configs repository is `rickub.com/turbo-editors/configs`; its git address is `git.rickub.com`, which `configrepo` tries second. A wrong first candidate costs one `ls-remote`, not the load.
1717 - The editor refuses when `.turbo-rust` already exists (`configrepo.ErrExists`); there is deliberately no `--force`.
18+
19+## Also
20+
21+`release.env` is committed from now on (`!release.env` in `.gitignore`). `01-release.tag.sh` does `git add .`, so the next release commits it by itself.
22+
23+## Update, end of session
24+
25+turbo-core v1.0.3 is published and `go.mod` pins it (done from the host, with a commit, during the session). Step 1 of "Next steps" is done; the two release-script tests are expected green again — see the history entry for the run that confirmed it.
26+
@@ -15,3 +15,12 @@
15 15
16 - The sample configs repository is `rickub.com/turbo-editors/configs`; its git address is `git.rickub.com`, which `configrepo` tries second. A wrong first candidate costs one `ls-remote`, not the load.16 - The sample configs repository is `rickub.com/turbo-editors/configs`; its git address is `git.rickub.com`, which `configrepo` tries second. A wrong first candidate costs one `ls-remote`, not the load.
17 - The editor refuses when `.turbo-rust` already exists (`configrepo.ErrExists`); there is deliberately no `--force`.17 - The editor refuses when `.turbo-rust` already exists (`configrepo.ErrExists`); there is deliberately no `--force`.
18+
19+## Also
20+
21+`release.env` is committed from now on (`!release.env` in `.gitignore`). `01-release.tag.sh` does `git add .`, so the next release commits it by itself.
22+
23+## Update, end of session
24+
25+turbo-core v1.0.3 is published and `go.mod` pins it (done from the host, with a commit, during the session). Step 1 of "Next steps" is done; the two release-script tests are expected green again — see the history entry for the run that confirmed it.
26+
modified .memory/history.md +2 -0
@@ -162,4 +162,6 @@
162162 - **Depends on turbo-core v1.0.3**, not yet tagged: `go.mod` still pins v1.0.2, so this builds only under the umbrella `go.work` (`turbo-editors/README.md` explains) until `go get rickub.com/turbo-editors/turbo-core@v1.0.3 && go mod tidy`. Verified with `make check` under that workspace.
163163 - **Not done**: not committed; go.mod not re-pinned; not run against a real terminal.
164164 - **Correction, same session**: under the workspace everything passes **except `TestTheTagScriptTagsAndPushesForReal` and `TestTheTagScriptRefusesATagItAlreadyPublished`** — they copy the module elsewhere and run `make check` there, outside the workspace, where turbo-core v1.0.2 from the proxy has no `configrepo`. They go green the moment `go.mod` is re-pinned to v1.0.3. The package diagram (`docs/diagrams/packages.drawio`, where the module has one) gained a `configrepo` box and a `main → configrepo` arrow, which its own test demanded.
165+- **Later, same session**: `release.env` is now **committed** — `.gitignore` gained `!release.env` under `*.env`, with a comment; `*.token.env` files stay ignored (verified with `git check-ignore` in every repository). The comments that said it was ignored were reworded to match: `02-build-releases.sh`, `.github/workflows/release.yml`, the release how-to (EN+FR), and this summary. Asked by the user so the version and its description travel with the repository.
166+- **End of session**: turbo-core v1.0.3 having been published and `go.mod` re-pinned to it from the host, `GOWORK=off go test ./... -count=1` is entirely green here, the two release-script tests included.
165167
@@ -162,4 +162,6 @@
162 - **Depends on turbo-core v1.0.3**, not yet tagged: `go.mod` still pins v1.0.2, so this builds only under the umbrella `go.work` (`turbo-editors/README.md` explains) until `go get rickub.com/turbo-editors/turbo-core@v1.0.3 && go mod tidy`. Verified with `make check` under that workspace.162 - **Depends on turbo-core v1.0.3**, not yet tagged: `go.mod` still pins v1.0.2, so this builds only under the umbrella `go.work` (`turbo-editors/README.md` explains) until `go get rickub.com/turbo-editors/turbo-core@v1.0.3 && go mod tidy`. Verified with `make check` under that workspace.
163 - **Not done**: not committed; go.mod not re-pinned; not run against a real terminal.163 - **Not done**: not committed; go.mod not re-pinned; not run against a real terminal.
164 - **Correction, same session**: under the workspace everything passes **except `TestTheTagScriptTagsAndPushesForReal` and `TestTheTagScriptRefusesATagItAlreadyPublished`** — they copy the module elsewhere and run `make check` there, outside the workspace, where turbo-core v1.0.2 from the proxy has no `configrepo`. They go green the moment `go.mod` is re-pinned to v1.0.3. The package diagram (`docs/diagrams/packages.drawio`, where the module has one) gained a `configrepo` box and a `main → configrepo` arrow, which its own test demanded.164 - **Correction, same session**: under the workspace everything passes **except `TestTheTagScriptTagsAndPushesForReal` and `TestTheTagScriptRefusesATagItAlreadyPublished`** — they copy the module elsewhere and run `make check` there, outside the workspace, where turbo-core v1.0.2 from the proxy has no `configrepo`. They go green the moment `go.mod` is re-pinned to v1.0.3. The package diagram (`docs/diagrams/packages.drawio`, where the module has one) gained a `configrepo` box and a `main → configrepo` arrow, which its own test demanded.
165+- **Later, same session**: `release.env` is now **committed** — `.gitignore` gained `!release.env` under `*.env`, with a comment; `*.token.env` files stay ignored (verified with `git check-ignore` in every repository). The comments that said it was ignored were reworded to match: `02-build-releases.sh`, `.github/workflows/release.yml`, the release how-to (EN+FR), and this summary. Asked by the user so the version and its description travel with the repository.
166+- **End of session**: turbo-core v1.0.3 having been published and `go.mod` re-pinned to it from the host, `GOWORK=off go test ./... -count=1` is entirely green here, the two release-script tests included.
165 167
modified .memory/summary.md +1 -1
@@ -102,5 +102,5 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace .
102102
103103 ## State as of 2026-09-20
104104
105-- **`-load-config <url>` is wired** (`main.go`: `loadConfig`, `describeLoad`), on top of turbo-core's `configrepo`. It needs **turbo-core v1.0.3**, which is not tagged yet; `go.mod` pins v1.0.2, so the editor builds only under the umbrella `go.work` until re-pinned. A project with a `.turbo-rust` already is refused, not overwritten.
105+- **`-load-config <url>` is wired** (`main.go`: `loadConfig`, `describeLoad`), on top of turbo-core's `configrepo`. `go.mod` pins **turbo-core v1.0.3**, which is published (re-pinned from the host on 2026-09-20), so it builds on its own again. A project with a `.turbo-rust` already is refused, not overwritten.
106106
@@ -102,5 +102,5 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace .
102 102
103 ## State as of 2026-09-20103 ## State as of 2026-09-20
104 104
105-- **`-load-config <url>` is wired** (`main.go`: `loadConfig`, `describeLoad`), on top of turbo-core's `configrepo`. It needs **turbo-core v1.0.3**, which is not tagged yet; `go.mod` pins v1.0.2, so the editor builds only under the umbrella `go.work` until re-pinned. A project with a `.turbo-rust` already is refused, not overwritten.105+- **`-load-config <url>` is wired** (`main.go`: `loadConfig`, `describeLoad`), on top of turbo-core's `configrepo`. `go.mod` pins **turbo-core v1.0.3**, which is published (re-pinned from the host on 2026-09-20), so it builds on its own again. A project with a `.turbo-rust` already is refused, not overwritten.
106 106
modified 02-build-releases.sh +5 -4
@@ -23,10 +23,11 @@ COMMENT
2323 set -euo pipefail
2424
2525 # release.env carries TAG ("v1.0.0") and ABOUT (the one-line description). It
26-# is git-ignored (*.env), so a CI job does not have it: there the tag comes
27-# from the command line and ABOUT from the environment, or defaults to the
28-# tag. A tag given on the command line always wins, so a test build never
29-# edits the file.
26+# is committed — the one .env that is — so a CI job has it too and reads ABOUT
27+# from it; there the tag still comes from the command line, the tag that was
28+# pushed, so the file cannot make a build disagree with the tag it is on. With
29+# no ABOUT anywhere it defaults to the tag. A tag given on the command line
30+# always wins, so a test build never edits the file.
3031 if [ -f release.env ]; then
3132 # shellcheck source=/dev/null
3233 source release.env
@@ -23,10 +23,11 @@ COMMENT
23 set -euo pipefail23 set -euo pipefail
24 24
25 # release.env carries TAG ("v1.0.0") and ABOUT (the one-line description). It25 # release.env carries TAG ("v1.0.0") and ABOUT (the one-line description). It
26-# is git-ignored (*.env), so a CI job does not have it: there the tag comes26+# is committed — the one .env that is — so a CI job has it too and reads ABOUT
27-# from the command line and ABOUT from the environment, or defaults to the27+# from it; there the tag still comes from the command line, the tag that was
28-# tag. A tag given on the command line always wins, so a test build never28+# pushed, so the file cannot make a build disagree with the tag it is on. With
29-# edits the file.29+# no ABOUT anywhere it defaults to the tag. A tag given on the command line
30+# always wins, so a test build never edits the file.
30 if [ -f release.env ]; then31 if [ -f release.env ]; then
31 # shellcheck source=/dev/null32 # shellcheck source=/dev/null
32 source release.env33 source release.env
modified docs/en/how-to/make-a-release.md +1 -1
@@ -53,7 +53,7 @@ Theme: Turbo Classic
5353
5454 ## Or use the scripts and let the workflow publish
5555
56-That is the way a release is actually cut. Put the version and its one-line description in `release.env` — it is gitignored, so CI never sees it:
56+That is the way a release is actually cut. Put the version and its one-line description in `release.env` — it is committed with the release, and CI takes the tag from the push rather than from it:
5757
5858 ```sh
5959 TAG="v1.0.0"
@@ -53,7 +53,7 @@ Theme: Turbo Classic
53 53
54 ## Or use the scripts and let the workflow publish54 ## Or use the scripts and let the workflow publish
55 55
56-That is the way a release is actually cut. Put the version and its one-line description in `release.env` — it is gitignored, so CI never sees it:56+That is the way a release is actually cut. Put the version and its one-line description in `release.env` — it is committed with the release, and CI takes the tag from the push rather than from it:
57 57
58 ```sh58 ```sh
59 TAG="v1.0.0"59 TAG="v1.0.0"
modified docs/fr/how-to/make-a-release.md +1 -1
@@ -53,7 +53,7 @@ Theme: Turbo Classic
5353
5454 ## Ou utiliser les scripts et laisser le workflow publier
5555
56-C'est ainsi qu'une release est réellement faite. Mettez la version et sa description d'une ligne dans `release.env` — il est ignoré par git, donc la CI ne le voit jamais :
56+C'est ainsi qu'une release est réellement faite. Mettez la version et sa description d'une ligne dans `release.env` — il est versionné avec la release, et la CI prend le tag du push plutôt que dans ce fichier :
5757
5858 ```sh
5959 TAG="v1.0.0"
@@ -53,7 +53,7 @@ Theme: Turbo Classic
53 53
54 ## Ou utiliser les scripts et laisser le workflow publier54 ## Ou utiliser les scripts et laisser le workflow publier
55 55
56-C'est ainsi qu'une release est réellement faite. Mettez la version et sa description d'une ligne dans `release.env` — il est ignoré par git, donc la CI ne le voit jamais :56+C'est ainsi qu'une release est réellement faite. Mettez la version et sa description d'une ligne dans `release.env` — il est versionné avec la release, et la CI prend le tag du push plutôt que dans ce fichier :
57 57
58 ```sh58 ```sh
59 TAG="v1.0.0"59 TAG="v1.0.0"
added release.env +10 -0
new file mode 100644
@@ -0,0 +1,10 @@
1+# Edited before every release, then:
2+# ./01-release.tag.sh make check, commit, push, tag, push the tag
3+# (pushing the tag starts .github/workflows/release.yml, which builds the
4+# binaries with ./02-build-releases.sh and publishes the release with them —
5+# no personal token is needed, and nothing else has to be run)
6+#
7+# ./02-build-releases.sh v1.0.0 to build the binaries by hand and see what
8+# the CI will publish, without publishing anything
9+TAG="v1.0.3"
10+ABOUT="Turbo Rust"
new file mode 100644
@@ -0,0 +1,10 @@
1+# Edited before every release, then:
2+# ./01-release.tag.sh make check, commit, push, tag, push the tag
3+# (pushing the tag starts .github/workflows/release.yml, which builds the
4+# binaries with ./02-build-releases.sh and publishes the release with them —
5+# no personal token is needed, and nothing else has to be run)
6+#
7+# ./02-build-releases.sh v1.0.0 to build the binaries by hand and see what
8+# the CI will publish, without publishing anything
9+TAG="v1.0.3"
10+ABOUT="Turbo Rust"
modified release_test.go +4 -3
@@ -469,9 +469,10 @@ func writeTestFile(t *testing.T, path, contents string) {
469469 }
470470
471471 func TestTheBuildScriptTakesTheTagFromTheCommandLine(t *testing.T) {
472- // release.env is git-ignored, so the workflow has none: it passes the tag
473- // it was started by. A script that only reads the file builds nothing in
474- // CI, or builds whatever version the file last named.
472+ // The workflow passes the tag it was started by. release.env is committed
473+ // now, so CI does have one — but a script that read only the file would
474+ // build whatever version the file last named, tag or no tag, and the file
475+ // and the pushed tag are two things that can disagree. The argument wins.
475476 script := readReleaseScript(t)
476477
477478 if !strings.Contains(script, `TAG="${1:-${TAG:-}}"`) {
@@ -469,9 +469,10 @@ func writeTestFile(t *testing.T, path, contents string) {
469 }469 }
470 470
471 func TestTheBuildScriptTakesTheTagFromTheCommandLine(t *testing.T) {471 func TestTheBuildScriptTakesTheTagFromTheCommandLine(t *testing.T) {
472- // release.env is git-ignored, so the workflow has none: it passes the tag472+ // The workflow passes the tag it was started by. release.env is committed
473- // it was started by. A script that only reads the file builds nothing in473+ // now, so CI does have one — but a script that read only the file would
474- // CI, or builds whatever version the file last named.474+ // build whatever version the file last named, tag or no tag, and the file
475+ // and the pushed tag are two things that can disagree. The argument wins.
475 script := readReleaseScript(t)476 script := readReleaseScript(t)
476 477
477 if !strings.Contains(script, `TAG="${1:-${TAG:-}}"`) {478 if !strings.Contains(script, `TAG="${1:-${TAG:-}}"`) {