🛟 Updated.
b1c5e36 parent: fe23288 modified
.github/workflows/release.yml +3 -2 | @@ -59,8 +59,9 @@ jobs: | ||
| 59 | 59 | run: go test ./... -count=1 |
| 60 | 60 | |
| 61 | 61 | - name: Stage the release |
| 62 | - # release.env is git-ignored, so the tag is passed explicitly and the | |
| 63 | - # script falls back to "Turbo Core <tag>" for the description. | |
| 62 | + # The tag is passed explicitly — the one just pushed — so release.env, which | |
| 63 | + # is committed, cannot make the build disagree with it. ABOUT is still read | |
| 64 | + # from the file for the description, "Turbo Core <tag>" being the fallback. | |
| 64 | 65 | run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}" |
| 65 | 66 | |
| 66 | 67 | - name: Release notes |
| @@ -59,8 +59,9 @@ jobs: | |||
| 59 | run: go test ./... -count=1 | 59 | run: go test ./... -count=1 |
| 60 | 60 | ||
| 61 | - name: Stage the release | 61 | - name: Stage the release |
| 62 | - # release.env is git-ignored, so the tag is passed explicitly and the | 62 | + # The tag is passed explicitly — the one just pushed — so release.env, which |
| 63 | - # script falls back to "Turbo Core <tag>" for the description. | 63 | + # is committed, cannot make the build disagree with it. ABOUT is still read |
| 64 | + # from the file for the description, "Turbo Core <tag>" being the fallback. | ||
| 64 | run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}" | 65 | run: bash ./02-build-releases.sh "${GITHUB_REF_NAME}" |
| 65 | 66 | ||
| 66 | - name: Release notes | 67 | - name: Release notes |
modified
.gitignore +4 -0 | @@ -1,6 +1,10 @@ | ||
| 1 | 1 | bin/ |
| 2 | 2 | kits |
| 3 | 3 | *.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 | 8 | release |
| 5 | 9 | |
| 6 | 10 | # 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 | kits | 2 | kits |
| 3 | *.env | 3 | *.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 | release | 8 | release |
| 5 | 9 | ||
| 6 | # A go.work pointing at the checkout beside this one is how you build against an | 10 | # A go.work pointing at the checkout beside this one is how you build against an |
modified
.memory/handoffs/2026-09-20-reload-on-disk-change.md +8 -0 | @@ -49,3 +49,11 @@ The umbrella `turbo-editors/README.md` (one directory up, its own git repository | ||
| 49 | 49 | - **Note on the workspace**: turbo-go already carries its own `go.work` (`.` + `../turbo-core`, dated 2026-09-19, gitignored), so it builds against this checkout on its own; the root workspace is only needed for the five others. Final verification was done that way: root `go.work` over `turbo-core` and the five, removed afterwards. |
| 50 | 50 | - **Observed, not caused by this session as far as can be told**: during the last test passes the tracked files `turbo-go/demo/{README.md,go.mod,index.html,index.js,main.go}` disappeared from the working tree (git shows `D`; dotfiles in `demo/` survived; no git operation in the reflog; the tree is a kDrive-synced folder on which the user was active — tickets changed at the same time). A 6.9 MB `turbo-go/demo-golang` binary appeared at the same moment. **Nothing was restored**: `git checkout -- demo` in turbo-go puts the files back if the deletion was not deliberate. |
| 51 | 51 | |
| 52 | +## Also | |
| 53 | + | |
| 54 | +`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. | |
| 55 | + | |
| 56 | +## Update, end of session | |
| 57 | + | |
| 58 | +turbo-core **v1.0.3 is tagged and published** (commit `fe23288`; the proxy served it to turbo-go), and every editor's `go.mod` now pins it — all done from the host during the session. Steps 1–2 of "Next steps" above are therefore done. What is left uncommitted is the `release.env` un-ignoring and `release.env` itself; `01-release.tag.sh` will commit them with the next release, or commit them by hand. | |
| 59 | + | |
| @@ -49,3 +49,11 @@ The umbrella `turbo-editors/README.md` (one directory up, its own git repository | |||
| 49 | - **Note on the workspace**: turbo-go already carries its own `go.work` (`.` + `../turbo-core`, dated 2026-09-19, gitignored), so it builds against this checkout on its own; the root workspace is only needed for the five others. Final verification was done that way: root `go.work` over `turbo-core` and the five, removed afterwards. | 49 | - **Note on the workspace**: turbo-go already carries its own `go.work` (`.` + `../turbo-core`, dated 2026-09-19, gitignored), so it builds against this checkout on its own; the root workspace is only needed for the five others. Final verification was done that way: root `go.work` over `turbo-core` and the five, removed afterwards. |
| 50 | - **Observed, not caused by this session as far as can be told**: during the last test passes the tracked files `turbo-go/demo/{README.md,go.mod,index.html,index.js,main.go}` disappeared from the working tree (git shows `D`; dotfiles in `demo/` survived; no git operation in the reflog; the tree is a kDrive-synced folder on which the user was active — tickets changed at the same time). A 6.9 MB `turbo-go/demo-golang` binary appeared at the same moment. **Nothing was restored**: `git checkout -- demo` in turbo-go puts the files back if the deletion was not deliberate. | 50 | - **Observed, not caused by this session as far as can be told**: during the last test passes the tracked files `turbo-go/demo/{README.md,go.mod,index.html,index.js,main.go}` disappeared from the working tree (git shows `D`; dotfiles in `demo/` survived; no git operation in the reflog; the tree is a kDrive-synced folder on which the user was active — tickets changed at the same time). A 6.9 MB `turbo-go/demo-golang` binary appeared at the same moment. **Nothing was restored**: `git checkout -- demo` in turbo-go puts the files back if the deletion was not deliberate. |
| 51 | 51 | ||
| 52 | +## Also | ||
| 53 | + | ||
| 54 | +`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. | ||
| 55 | + | ||
| 56 | +## Update, end of session | ||
| 57 | + | ||
| 58 | +turbo-core **v1.0.3 is tagged and published** (commit `fe23288`; the proxy served it to turbo-go), and every editor's `go.mod` now pins it — all done from the host during the session. Steps 1–2 of "Next steps" above are therefore done. What is left uncommitted is the `release.env` un-ignoring and `release.env` itself; `01-release.tag.sh` will commit them with the next release, or commit them by hand. | ||
| 59 | + | ||
modified
.memory/history.md +2 -0 | @@ -303,4 +303,6 @@ | ||
| 303 | 303 | - **Later again, same session — ticket #28, pastes into the agent window**: asked to implement `.tickets/issues/28.yaml` (a long paste becomes `[Pasted #1 · 6 lines · 700 chars]` in the box; the model gets the text). Found bracketed paste was never enabled anywhere — a terminal paste arrived as keystrokes, so each newline *sent* a prompt — and the agent view had no way to read the editor's clipboard. Added `acp/paste.go` (+ `Paste` type, `View.Paste`, `OnPaste`, token editing, `expandPastes`), `Session.PromptWith` with `pending.pastes`, `drawInputRow`, `app/paste.go` (`handlePaste`, `pastedText`), `screen.EnablePaste()` in `New`, `handleKey` collecting during a paste, `App.Paste` routing to the agent box, `view.OnPaste = a.clipboard.Text`. Tests: 16 in `acp/paste_test.go`, 5 in `app/paste_test.go`; two of mine had the trace's length wrong (151, not 140) and were corrected. `make check` green, race green, quality #33 FAIL (file complexity of `app/app.go` at 50) → paste handling moved to `app/paste.go` → #34 PASS, 0 smells. Docs: `acp/README.md`, `app/README.md`. Ticket left `open` for the user to close after trying it. Still not committed. |
| 304 | 304 | - **Correction to the #28 entry above**: bracketed paste *was* enabled — by each editor's own `newScreen` (`screen.EnablePaste()` in `main.go`) — but `app.handle` ignored the `EventPaste` marks, so the keys still streamed through and every Enter sent. What was missing was the handling, not the enabling; `app.New` now enables it too so the library needs nothing from the command. |
| 305 | 305 | - **Later again, same session — ticket #25, `-load-config <url>`**: the user created `rickub.com/turbo-editors/configs` (directories `golang-init`, `golang-init-with-agents`, each with a `.turbo-go`) and asked that `turbo-go --load-config <tree URL>` copy that `.turbo-go` into the working directory, `.turbo-rust` for turbo-rust, etc.; mid-way, that the URL may be GitHub, GitLab or Codeberg too. Probed rickub from the sandbox: `raw/<ref>/<path>` works, `/api/v1/…/contents` is 401 without a token, no archive endpoint, git smart HTTP on `git.rickub.com` only. Chose git. New `configrepo` package (`configrepo.go`, `git.go`, `copy.go`, README), 15 tests incl. a gated network one that passed. Wired into all six editors by one script (main.go flag + `loadConfig`/`describeLoad`, 3 tests each, `cli.md` EN/FR rows + example + files + errors, `configure-a-project.md` EN/FR new section, each `.memory` history/handoff/summary). Docs here: `README.md`, `docs/{en,fr}/reference/packages.md` (nineteen packages), summary table. Ticket #25 set to `closed` with a "Done" note in its body. Editors verified with `make check` under a root `go.work` listing the six editors and `turbo-go/demo`, `turbo-go/bin` (nested modules); the workspace was removed afterwards. Still nothing committed anywhere. |
| 306 | +- **Later, same session**: the header comments of `release.env` in all seven repositories (this one and the six editors) were translated from French to English, at the user's request — they had asked for `01-release.tag.sh`, whose comments were already English; the French was in the file beside it. `TAG`/`ABOUT` untouched. These files are gitignored (`*.env`), so this changes nothing in any repository's history. | |
| 307 | +- **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. | |
| 306 | 308 | |
| @@ -303,4 +303,6 @@ | |||
| 303 | - **Later again, same session — ticket #28, pastes into the agent window**: asked to implement `.tickets/issues/28.yaml` (a long paste becomes `[Pasted #1 · 6 lines · 700 chars]` in the box; the model gets the text). Found bracketed paste was never enabled anywhere — a terminal paste arrived as keystrokes, so each newline *sent* a prompt — and the agent view had no way to read the editor's clipboard. Added `acp/paste.go` (+ `Paste` type, `View.Paste`, `OnPaste`, token editing, `expandPastes`), `Session.PromptWith` with `pending.pastes`, `drawInputRow`, `app/paste.go` (`handlePaste`, `pastedText`), `screen.EnablePaste()` in `New`, `handleKey` collecting during a paste, `App.Paste` routing to the agent box, `view.OnPaste = a.clipboard.Text`. Tests: 16 in `acp/paste_test.go`, 5 in `app/paste_test.go`; two of mine had the trace's length wrong (151, not 140) and were corrected. `make check` green, race green, quality #33 FAIL (file complexity of `app/app.go` at 50) → paste handling moved to `app/paste.go` → #34 PASS, 0 smells. Docs: `acp/README.md`, `app/README.md`. Ticket left `open` for the user to close after trying it. Still not committed. | 303 | - **Later again, same session — ticket #28, pastes into the agent window**: asked to implement `.tickets/issues/28.yaml` (a long paste becomes `[Pasted #1 · 6 lines · 700 chars]` in the box; the model gets the text). Found bracketed paste was never enabled anywhere — a terminal paste arrived as keystrokes, so each newline *sent* a prompt — and the agent view had no way to read the editor's clipboard. Added `acp/paste.go` (+ `Paste` type, `View.Paste`, `OnPaste`, token editing, `expandPastes`), `Session.PromptWith` with `pending.pastes`, `drawInputRow`, `app/paste.go` (`handlePaste`, `pastedText`), `screen.EnablePaste()` in `New`, `handleKey` collecting during a paste, `App.Paste` routing to the agent box, `view.OnPaste = a.clipboard.Text`. Tests: 16 in `acp/paste_test.go`, 5 in `app/paste_test.go`; two of mine had the trace's length wrong (151, not 140) and were corrected. `make check` green, race green, quality #33 FAIL (file complexity of `app/app.go` at 50) → paste handling moved to `app/paste.go` → #34 PASS, 0 smells. Docs: `acp/README.md`, `app/README.md`. Ticket left `open` for the user to close after trying it. Still not committed. |
| 304 | - **Correction to the #28 entry above**: bracketed paste *was* enabled — by each editor's own `newScreen` (`screen.EnablePaste()` in `main.go`) — but `app.handle` ignored the `EventPaste` marks, so the keys still streamed through and every Enter sent. What was missing was the handling, not the enabling; `app.New` now enables it too so the library needs nothing from the command. | 304 | - **Correction to the #28 entry above**: bracketed paste *was* enabled — by each editor's own `newScreen` (`screen.EnablePaste()` in `main.go`) — but `app.handle` ignored the `EventPaste` marks, so the keys still streamed through and every Enter sent. What was missing was the handling, not the enabling; `app.New` now enables it too so the library needs nothing from the command. |
| 305 | - **Later again, same session — ticket #25, `-load-config <url>`**: the user created `rickub.com/turbo-editors/configs` (directories `golang-init`, `golang-init-with-agents`, each with a `.turbo-go`) and asked that `turbo-go --load-config <tree URL>` copy that `.turbo-go` into the working directory, `.turbo-rust` for turbo-rust, etc.; mid-way, that the URL may be GitHub, GitLab or Codeberg too. Probed rickub from the sandbox: `raw/<ref>/<path>` works, `/api/v1/…/contents` is 401 without a token, no archive endpoint, git smart HTTP on `git.rickub.com` only. Chose git. New `configrepo` package (`configrepo.go`, `git.go`, `copy.go`, README), 15 tests incl. a gated network one that passed. Wired into all six editors by one script (main.go flag + `loadConfig`/`describeLoad`, 3 tests each, `cli.md` EN/FR rows + example + files + errors, `configure-a-project.md` EN/FR new section, each `.memory` history/handoff/summary). Docs here: `README.md`, `docs/{en,fr}/reference/packages.md` (nineteen packages), summary table. Ticket #25 set to `closed` with a "Done" note in its body. Editors verified with `make check` under a root `go.work` listing the six editors and `turbo-go/demo`, `turbo-go/bin` (nested modules); the workspace was removed afterwards. Still nothing committed anywhere. | 305 | - **Later again, same session — ticket #25, `-load-config <url>`**: the user created `rickub.com/turbo-editors/configs` (directories `golang-init`, `golang-init-with-agents`, each with a `.turbo-go`) and asked that `turbo-go --load-config <tree URL>` copy that `.turbo-go` into the working directory, `.turbo-rust` for turbo-rust, etc.; mid-way, that the URL may be GitHub, GitLab or Codeberg too. Probed rickub from the sandbox: `raw/<ref>/<path>` works, `/api/v1/…/contents` is 401 without a token, no archive endpoint, git smart HTTP on `git.rickub.com` only. Chose git. New `configrepo` package (`configrepo.go`, `git.go`, `copy.go`, README), 15 tests incl. a gated network one that passed. Wired into all six editors by one script (main.go flag + `loadConfig`/`describeLoad`, 3 tests each, `cli.md` EN/FR rows + example + files + errors, `configure-a-project.md` EN/FR new section, each `.memory` history/handoff/summary). Docs here: `README.md`, `docs/{en,fr}/reference/packages.md` (nineteen packages), summary table. Ticket #25 set to `closed` with a "Done" note in its body. Editors verified with `make check` under a root `go.work` listing the six editors and `turbo-go/demo`, `turbo-go/bin` (nested modules); the workspace was removed afterwards. Still nothing committed anywhere. |
| 306 | +- **Later, same session**: the header comments of `release.env` in all seven repositories (this one and the six editors) were translated from French to English, at the user's request — they had asked for `01-release.tag.sh`, whose comments were already English; the French was in the file beside it. `TAG`/`ABOUT` untouched. These files are gitignored (`*.env`), so this changes nothing in any repository's history. | ||
| 307 | +- **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. | ||
| 306 | 308 | ||
modified
.memory/summary.md +2 -2 | @@ -161,7 +161,7 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace . | ||
| 161 | 161 | - **Tool parameters implemented.** A `{{label}}` in a tools command opens a box before the command runs. `tools/placeholder.go` parses and fills; `app`'s `ParametersDialog` asks. Verified in a real pty against both editors. |
| 162 | 162 | - **v0.1.0 is released.** The tag is on `main` at `f1f0375`, the release page is at `https://rickub.com/turbo-editors/turbo-core/releases/tag/v0.1.0`, and `go get rickub.com/turbo-editors/turbo-core@v0.1.0` works from the module proxy. Both editors `require` it with **no active `replace`**, verified by running their suites against the real published module. |
| 163 | 163 | - **HEAD is one commit past the tag.** `bc4a464` holds `02-release.publish.sh`, its eight tests, and the release how-to's rewrite — so **none of that is in v0.1.0**. It changes no API, so nothing depending on the library is affected; the only visible consequence is that the v0.1.0 release page's documentation links, which are pinned to the tag, show the how-to as it was before the publish script existed. Fold it into the next tag rather than moving v0.1.0. |
| 164 | -- **Two release scripts.** `01-release.tag.sh` runs `make check`, refuses a tag taken locally or on origin, refuses a `go.mod` with a `replace`, and tags only after pushing. `02-release.publish.sh` creates the Rickub release page for a tag that is already there, building its JSON with jq, telling the HTTP statuses apart, and taking `--dry-run`. There is deliberately no 03 or 04: those build and attach binaries, and a library has none. `release.env` and `turbo-core.token.env` are gitignored by `*.env`. | |
| 164 | +- **Two release scripts.** `01-release.tag.sh` runs `make check`, refuses a tag taken locally or on origin, refuses a `go.mod` with a `replace`, and tags only after pushing. `02-release.publish.sh` creates the Rickub release page for a tag that is already there, building its JSON with jq, telling the HTTP statuses apart, and taking `--dry-run`. There is deliberately no 03 or 04: those build and attach binaries, and a library has none. `turbo-core.token.env` is gitignored by `*.env`; `release.env` is **committed** (`!release.env`, since 2026-09-20), so the version and its description travel with the repository. | |
| 165 | 165 | - **Extracted and green.** Sixteen packages, whole suite passing, and passing under `-race`. |
| 166 | 166 | - **Eight languages are coloured.** YAML, XML and Dockerfiles were added on 2026-09-01, and `Definition` grew a `Filenames` field so a file with no extension and no shebang — a `Dockerfile` — can be recognised. `LanguageOf` now looks at the extension, then the name, then the first line. |
| 167 | 167 | - **Quality gate: PASS.** 0 errors, 0 warnings, 0 smells, total complexity 2306 (run 29, 2026-09-17). |
| @@ -178,7 +178,7 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace . | ||
| 178 | 178 | |
| 179 | 179 | ## State as of 2026-09-20 |
| 180 | 180 | |
| 181 | -- **v1.0.3 is ready to tag** (`release.env` says so): files changed on disk reload into their open windows, the agent window's box wraps, a long paste into it is kept aside as a token (ticket #28), and `configrepo` fetches a shared configuration from a forge URL (ticket #25) — all above. **All six editors already carry `-load-config`** against this checkout; each still pins v1.0.2 and builds only under the umbrella `go.work` until re-pinned. `make check` green, `go test -race ./acp ./app` green, quality gate run #34 PASS with zero smells (run #33 failed on `app/app.go` file complexity; moving the paste handling into `app/paste.go` cleared it). **Not committed, not tagged.** Every editor should re-pin to pick both up; their user docs do not yet mention either behaviour (the agent-window docs — turbo-go's `reference/acp.md`, `how-to/talk-to-an-agent.md` — list the box's keys and could say it wraps and that `↑↓` move by row). | |
| 181 | +- **v1.0.3 is tagged** (commit `fe23288`, tag present locally, and the module proxy served it to turbo-go on 2026-09-20 — so it is pushed and published): files changed on disk reload into their open windows, the agent window's box wraps, a long paste into it is kept aside as a token (ticket #28), and `configrepo` fetches a shared configuration from a forge URL (ticket #25). **All six editors pin v1.0.3** and carry `-load-config`. The commit and tag were made from the host, not from the sandbox session. Uncommitted here as of the end of that session: only the `release.env` un-ignoring (`.gitignore`, comments in `02-build-releases.sh` and the workflow, the release how-to, this memory) and `release.env` itself. | |
| 182 | 182 | |
| 183 | 183 | ## Not yet established |
| 184 | 184 | |
| @@ -161,7 +161,7 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace . | |||
| 161 | - **Tool parameters implemented.** A `{{label}}` in a tools command opens a box before the command runs. `tools/placeholder.go` parses and fills; `app`'s `ParametersDialog` asks. Verified in a real pty against both editors. | 161 | - **Tool parameters implemented.** A `{{label}}` in a tools command opens a box before the command runs. `tools/placeholder.go` parses and fills; `app`'s `ParametersDialog` asks. Verified in a real pty against both editors. |
| 162 | - **v0.1.0 is released.** The tag is on `main` at `f1f0375`, the release page is at `https://rickub.com/turbo-editors/turbo-core/releases/tag/v0.1.0`, and `go get rickub.com/turbo-editors/turbo-core@v0.1.0` works from the module proxy. Both editors `require` it with **no active `replace`**, verified by running their suites against the real published module. | 162 | - **v0.1.0 is released.** The tag is on `main` at `f1f0375`, the release page is at `https://rickub.com/turbo-editors/turbo-core/releases/tag/v0.1.0`, and `go get rickub.com/turbo-editors/turbo-core@v0.1.0` works from the module proxy. Both editors `require` it with **no active `replace`**, verified by running their suites against the real published module. |
| 163 | - **HEAD is one commit past the tag.** `bc4a464` holds `02-release.publish.sh`, its eight tests, and the release how-to's rewrite — so **none of that is in v0.1.0**. It changes no API, so nothing depending on the library is affected; the only visible consequence is that the v0.1.0 release page's documentation links, which are pinned to the tag, show the how-to as it was before the publish script existed. Fold it into the next tag rather than moving v0.1.0. | 163 | - **HEAD is one commit past the tag.** `bc4a464` holds `02-release.publish.sh`, its eight tests, and the release how-to's rewrite — so **none of that is in v0.1.0**. It changes no API, so nothing depending on the library is affected; the only visible consequence is that the v0.1.0 release page's documentation links, which are pinned to the tag, show the how-to as it was before the publish script existed. Fold it into the next tag rather than moving v0.1.0. |
| 164 | -- **Two release scripts.** `01-release.tag.sh` runs `make check`, refuses a tag taken locally or on origin, refuses a `go.mod` with a `replace`, and tags only after pushing. `02-release.publish.sh` creates the Rickub release page for a tag that is already there, building its JSON with jq, telling the HTTP statuses apart, and taking `--dry-run`. There is deliberately no 03 or 04: those build and attach binaries, and a library has none. `release.env` and `turbo-core.token.env` are gitignored by `*.env`. | 164 | +- **Two release scripts.** `01-release.tag.sh` runs `make check`, refuses a tag taken locally or on origin, refuses a `go.mod` with a `replace`, and tags only after pushing. `02-release.publish.sh` creates the Rickub release page for a tag that is already there, building its JSON with jq, telling the HTTP statuses apart, and taking `--dry-run`. There is deliberately no 03 or 04: those build and attach binaries, and a library has none. `turbo-core.token.env` is gitignored by `*.env`; `release.env` is **committed** (`!release.env`, since 2026-09-20), so the version and its description travel with the repository. |
| 165 | - **Extracted and green.** Sixteen packages, whole suite passing, and passing under `-race`. | 165 | - **Extracted and green.** Sixteen packages, whole suite passing, and passing under `-race`. |
| 166 | - **Eight languages are coloured.** YAML, XML and Dockerfiles were added on 2026-09-01, and `Definition` grew a `Filenames` field so a file with no extension and no shebang — a `Dockerfile` — can be recognised. `LanguageOf` now looks at the extension, then the name, then the first line. | 166 | - **Eight languages are coloured.** YAML, XML and Dockerfiles were added on 2026-09-01, and `Definition` grew a `Filenames` field so a file with no extension and no shebang — a `Dockerfile` — can be recognised. `LanguageOf` now looks at the extension, then the name, then the first line. |
| 167 | - **Quality gate: PASS.** 0 errors, 0 warnings, 0 smells, total complexity 2306 (run 29, 2026-09-17). | 167 | - **Quality gate: PASS.** 0 errors, 0 warnings, 0 smells, total complexity 2306 (run 29, 2026-09-17). |
| @@ -178,7 +178,7 @@ python3 ~/.claude/skills/quality/scripts/quality_report.py --workspace . | |||
| 178 | 178 | ||
| 179 | ## State as of 2026-09-20 | 179 | ## State as of 2026-09-20 |
| 180 | 180 | ||
| 181 | -- **v1.0.3 is ready to tag** (`release.env` says so): files changed on disk reload into their open windows, the agent window's box wraps, a long paste into it is kept aside as a token (ticket #28), and `configrepo` fetches a shared configuration from a forge URL (ticket #25) — all above. **All six editors already carry `-load-config`** against this checkout; each still pins v1.0.2 and builds only under the umbrella `go.work` until re-pinned. `make check` green, `go test -race ./acp ./app` green, quality gate run #34 PASS with zero smells (run #33 failed on `app/app.go` file complexity; moving the paste handling into `app/paste.go` cleared it). **Not committed, not tagged.** Every editor should re-pin to pick both up; their user docs do not yet mention either behaviour (the agent-window docs — turbo-go's `reference/acp.md`, `how-to/talk-to-an-agent.md` — list the box's keys and could say it wraps and that `↑↓` move by row). | 181 | +- **v1.0.3 is tagged** (commit `fe23288`, tag present locally, and the module proxy served it to turbo-go on 2026-09-20 — so it is pushed and published): files changed on disk reload into their open windows, the agent window's box wraps, a long paste into it is kept aside as a token (ticket #28), and `configrepo` fetches a shared configuration from a forge URL (ticket #25). **All six editors pin v1.0.3** and carry `-load-config`. The commit and tag were made from the host, not from the sandbox session. Uncommitted here as of the end of that session: only the `release.env` un-ignoring (`.gitignore`, comments in `02-build-releases.sh` and the workflow, the release how-to, this memory) and `release.env` itself. |
| 182 | 182 | ||
| 183 | ## Not yet established | 183 | ## Not yet established |
| 184 | 184 | ||
modified
02-build-releases.sh +5 -4 | @@ -25,10 +25,11 @@ COMMENT | ||
| 25 | 25 | set -euo pipefail |
| 26 | 26 | |
| 27 | 27 | # release.env carries TAG ("v0.2.0") and ABOUT (the one-line description). It |
| 28 | -# is git-ignored (*.env), so a CI job does not have it: there the tag comes | |
| 29 | -# from the command line and ABOUT from the environment, or defaults to the | |
| 30 | -# tag. A tag given on the command line always wins, so a test build never | |
| 31 | -# edits the file. | |
| 28 | +# is committed — the one .env that is — so a CI job has it too and reads ABOUT | |
| 29 | +# from it; there the tag still comes from the command line, the tag that was | |
| 30 | +# pushed, so the file cannot make a build disagree with the tag it is on. With | |
| 31 | +# no ABOUT anywhere it defaults to the tag. A tag given on the command line | |
| 32 | +# always wins, so a test build never edits the file. | |
| 32 | 33 | if [ -f release.env ]; then |
| 33 | 34 | # shellcheck source=/dev/null |
| 34 | 35 | source release.env |
| @@ -25,10 +25,11 @@ COMMENT | |||
| 25 | set -euo pipefail | 25 | set -euo pipefail |
| 26 | 26 | ||
| 27 | # release.env carries TAG ("v0.2.0") and ABOUT (the one-line description). It | 27 | # release.env carries TAG ("v0.2.0") and ABOUT (the one-line description). It |
| 28 | -# is git-ignored (*.env), so a CI job does not have it: there the tag comes | 28 | +# is committed — the one .env that is — so a CI job has it too and reads ABOUT |
| 29 | -# from the command line and ABOUT from the environment, or defaults to the | 29 | +# from it; there the tag still comes from the command line, the tag that was |
| 30 | -# tag. A tag given on the command line always wins, so a test build never | 30 | +# pushed, so the file cannot make a build disagree with the tag it is on. With |
| 31 | -# edits the file. | 31 | +# no ABOUT anywhere it defaults to the tag. A tag given on the command line |
| 32 | +# always wins, so a test build never edits the file. | ||
| 32 | if [ -f release.env ]; then | 33 | if [ -f release.env ]; then |
| 33 | # shellcheck source=/dev/null | 34 | # shellcheck source=/dev/null |
| 34 | source release.env | 35 | source release.env |
modified
docs/en/how-to/release-the-library.md +1 -1 | @@ -8,7 +8,7 @@ turbo-core is a Go module with no binary: publishing it is tagging it, and the m | ||
| 8 | 8 | |
| 9 | 9 | ### 1. Say which version |
| 10 | 10 | |
| 11 | -Create `release.env` — it is gitignored, so CI never sees it: | |
| 11 | +Create or edit `release.env` — it is committed with the release, and CI takes the tag from the push rather than from it: | |
| 12 | 12 | |
| 13 | 13 | ```sh |
| 14 | 14 | TAG="v0.1.0" |
| @@ -8,7 +8,7 @@ turbo-core is a Go module with no binary: publishing it is tagging it, and the m | |||
| 8 | 8 | ||
| 9 | ### 1. Say which version | 9 | ### 1. Say which version |
| 10 | 10 | ||
| 11 | -Create `release.env` — it is gitignored, so CI never sees it: | 11 | +Create or edit `release.env` — it is committed with the release, and CI takes the tag from the push rather than from it: |
| 12 | 12 | ||
| 13 | ```sh | 13 | ```sh |
| 14 | TAG="v0.1.0" | 14 | TAG="v0.1.0" |
modified
docs/fr/how-to/release-the-library.md +1 -1 | @@ -8,7 +8,7 @@ turbo-core est un module Go sans binaire : le publier, c'est le taguer, et le pr | ||
| 8 | 8 | |
| 9 | 9 | ### 1. Dire quelle version |
| 10 | 10 | |
| 11 | -Créez `release.env` — il est ignoré par git, la CI ne le voit donc jamais : | |
| 11 | +Créez ou modifiez `release.env` — il est versionné avec la release, et la CI prend le tag du push plutôt que dans ce fichier : | |
| 12 | 12 | |
| 13 | 13 | ```sh |
| 14 | 14 | TAG="v0.1.0" |
| @@ -8,7 +8,7 @@ turbo-core est un module Go sans binaire : le publier, c'est le taguer, et le pr | |||
| 8 | 8 | ||
| 9 | ### 1. Dire quelle version | 9 | ### 1. Dire quelle version |
| 10 | 10 | ||
| 11 | -Créez `release.env` — il est ignoré par git, la CI ne le voit donc jamais : | 11 | +Créez ou modifiez `release.env` — il est versionné avec la release, et la CI prend le tag du push plutôt que dans ce fichier : |
| 12 | 12 | ||
| 13 | ```sh | 13 | ```sh |
| 14 | TAG="v0.1.0" | 14 | TAG="v0.1.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 stages the | |
| 4 | +# archive with ./02-build-releases.sh and publishes the release with it — | |
| 5 | +# no personal token is needed, and nothing else has to be run) | |
| 6 | +# | |
| 7 | +# ./02-build-releases.sh v1.0.3 to see what the CI will stage, without | |
| 8 | +# publishing anything | |
| 9 | +TAG="v1.0.3" | |
| 10 | +ABOUT="Turbo Core — files rewritten outside reload into their windows; the agent window wraps what you type and keeps a long paste aside as a token (#28); configrepo fetches a shared .turbo-<slug> from a forge URL (#25)" | |
| 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 stages the | ||
| 4 | +# archive with ./02-build-releases.sh and publishes the release with it — | ||
| 5 | +# no personal token is needed, and nothing else has to be run) | ||
| 6 | +# | ||
| 7 | +# ./02-build-releases.sh v1.0.3 to see what the CI will stage, without | ||
| 8 | +# publishing anything | ||
| 9 | +TAG="v1.0.3" | ||
| 10 | +ABOUT="Turbo Core — files rewritten outside reload into their windows; the agent window wraps what you type and keeps a long paste aside as a token (#28); configrepo fetches a shared .turbo-<slug> from a forge URL (#25)" | ||