| 🛟 Updated. 28d5985 k33g 20h ago | 1 | # Handoff — 2026-09-01 — Dockerfile, compose, YAML and XML colouring (ticket 8) |
| 2 | |
| 3 | ## State |
| 4 | |
| 5 | Ticket 8 is **implemented and verified**, in all three repositories, on the branch `feature/more-syntaxes`. Nothing is committed. |
| 6 | |
| 7 | turbo-core now colours **eight** languages. Three scanners were added: |
| 8 | |
| 9 | - `syntax/yaml.go`, `syntax/yaml_block.go`, `syntax/yaml_key.go` — one YAML scanner serving compose files, Kubernetes manifests and CI workflows alike. |
| 10 | - `syntax/dockerfile.go` — instructions matched in any case, `--flags`, `$VAR`/`${VAR}`, the trailing `\`, and the parser directives as comments. |
| 11 | - `syntax/xml.go` — its own scanner rather than HTML's, because of CDATA. |
| 12 | |
| 13 | `Definition` gained `Filenames []string`, and `LanguageOf` a name step between the extension and the shebang. That is the only change to an existing API, and it is additive. |
| 14 | |
| 15 | Suite green in all three; quality gate **PASS 0/0/0** in all three (turbo-core complexity 1718, turbo-go 37, turbo-rust 98). Documentation is complete in EN and FR in all three, and `syntax/README.md` is in sync. |
| 16 | |
| 17 | ## In flight |
| 18 | |
| 19 | Nothing half-done. The work stops at the commit. |
| 20 | |
| 21 | ## Next steps |
| 22 | |
| 23 | 1. Review and commit on `feature/more-syntaxes` in all three repositories, merge to `main`. |
| 24 | 2. **Release turbo-core v0.2.0** — `Definition.Filenames` and the three new `Language` constants are new public API, so it is a minor bump: |
| 25 | ```sh |
| 26 | TAG=v0.2.0 ./01-release.tag.sh |
| 27 | TAG=v0.2.0 ./02-release.publish.sh |
| 28 | ``` |
| 29 | 3. In each editor, `go mod tidy` to write the v0.2.0 checksum into `go.sum`, then `make check`. **Until step 2 is done, neither editor builds** — their `go.mod` already requires v0.2.0 and `go.sum` has no entry for it. The error names it exactly: `missing go.sum entry for module providing package codeberg.org/turbo-editors/turbo-core/app`. |
| 30 | |
| 31 | ## Open questions / blockers |
| 32 | |
| 33 | - Only the release. Nothing is waiting on a decision. |
| 34 | |
| 35 | ## Watch out for |
| 36 | |
| 37 | - **A YAML colon is a separator only when a space or the end of the line follows it.** Anybody "simplifying" that rule will put every `image: nginx:1.27` and every URL back into three colours. There is a test that walks every column of the span; do not weaken it into a spot check. |
| 38 | - **The Dockerfile scanner keeps `:` in a word** for the same reason — `golang:1.26-alpine` is one thing. `dockerfileWordRunes` is where that lives. |
| 39 | - **A YAML block scalar has no closing delimiter.** Its extent is the indentation the first content line set, and a blank line inside one stays inside it. Ending at the first blank line looks reasonable and cuts a shell script in a CI file in half. |
| 40 | - **XML carries *which* construct is open, not a flag.** A single boolean closes a CDATA section on a `-->` that happens to be inside it. |
| 41 | - **An empty stem must match nothing.** `.gitignore` is all extension; if the stem rule accepts an empty stem it becomes a wildcard and every dotfile becomes a Dockerfile. |
| 42 | - **The quality gate found four smells in the first version** of these scanners — three `qlty:boolean-logic` from inline rune comparisons, one `qlty:file-complexity` on `yaml.go`. The fix was named constants and three files; keep new scanners in that shape rather than one long switch. |
| 43 | - `release.env` and `turbo-core.token.env` hold live Codeberg tokens and are covered by `*.env` in `.gitignore`. Keep it that way. |