# History One dated entry per session, appended. Never rewritten. ## 2026-09-03 — Turbo Python built, from an empty repository to a complete editor - **Goal**: `/turbo-new-editor Python ./turbo-python` — a third editor in the family, on turbo-core v0.4.0, without forking anything. - **Shape**: Python has no Go lexer worth using, so this followed `turbo-rust/internal/rustlang` — a hand-written scanner against `syntax.LineScanner`, a line at a time, rather than turbo-go's byte-offset conversion. - **Decisions put to the user**: the menu label `~P~ython` over `P~y~thon`/`Py~t~hon`; `pylsp` over pyright and ruff-lsp; `pyproject.toml` then `setup.py` then `setup.cfg` as root markers; and the six starter commands, all through `uv`. - **Changes**: `main.go`; `internal/pythonlang/` (profile, `scan.go`, `literals.go`, `words.go`, three embedded `.tmpl` starter files); `Makefile`, `scripts/install.sh`, `scripts/check-version.sh` and the four numbered release scripts; 33 documentation pages in each of EN and FR; a root `README.md`. - **Scanner decisions**: a name wholly in capitals is a **constant**, any other capitalised name a **type** — Turbo Rust has only the second rule and documents `SCREAMING_SNAKE_CASE` as a known wrong answer, and PEP 8 separates the conventions well enough that the wrong answer was worth removing rather than inheriting. A capitalised name is a type **even when it is called**, which is the one rule the two editors deliberately order differently. `self` and `cls` are builtins although the language does not name them. An f-string is **one span**, braces included. - **The `[all]` in the install hint is not cosmetic**: installed bare, pylsp starts, completes and jumps, and publishes an *empty* diagnostics list for a file that does not parse, because the linters that produce them are extras. A gutter blank for want of a linter and a gutter blank for want of a bug look identical. - **Four server directories besides `PATH`** — the active virtualenv, `~/.local/bin`, pyenv's shims, and every `~/Library/Python//bin` that exists. `Profile()` is a function rather than a variable because of the first: a variable would freeze whatever `VIRTUAL_ENV` said at link time. - **Tests**: 129, including one entry per line, spans in order and non-overlapping, broken source still colouring, one per construct and one per thing the scanner deliberately refuses; the templates' formatting contract counted and filled; and five that drive a **real pylsp** end to end — completion typed into the buffer rather than read off disk, references, the file's symbols, diagnostics on a file that does not parse, and an assertion that pylsp answers neither implementations nor project-wide symbols. - **Quality**: PASS 0/0/0, total complexity 91. One smell in the first run, gone in the second. - **The documentation was adapted from Turbo Rust's, and adapting is not substituting.** A mechanical pass left, invisibly to every test: a package diagram still labelled `internal/rustlang` and "the Rust scanner" with `host="turbo-rust"`; a tutorial that had the reader type **Rust code** into a Python file and claimed Rust's colours for it; `crate`/`caisse` in five pages; `golangci-lint` and `go vet` in the tools how-to and in the *French* tools explanation, whose English twin had been rewritten properly; `switch` and `if err != nil` in the snippets explanation; and — the mirror image of the defect the skill warns about — the **English** menus reference saying project menus appear "between Go and Help" while the French one said Python. All fixed in both languages. - **Three claims were stale because the library moved**, not because of the copy: the menu bar listing omitted the **Code** menu in both languages and in the tutorial, and the tutorial's "press → four times to reach Options" was one press short for the same reason. - **Two commands in the docs did not exist**: `uv update` and `uv init --bin`. Replaced with `uv lock --upgrade` and `uv init --app`, checked against `uv 0.9.26`. - **The tutorial was rewritten and then run**, verbatim, in a pty against a real `uv init` project: every colour claim read back off the terminal as an SGR code, every key count re-counted, `uv run main.py`'s real first-run output pasted in, and a new paragraph explaining the `!` the language server puts in the gutter for `E305`. - **A Python-specific fact the copied text hid**: `Enter` copies the current line's indentation and does **not** add a level after a colon. In a language whose blocks *are* indentation, that is worth a sentence in the tutorial and a rewritten paragraph in the snippets explanation, where re-indenting is a correctness matter rather than a nicety. - **`diagram_test.go` is new**, and holds the drawio to `go list`: the boxes are exactly the packages the module imports, every arrow out of our two packages is a real import, the `host` attribute names this project, and no label names another editor's language. All four falsified against the four ways the copied diagram was wrong. - **Verified in a real pty**, beyond the tests: the Python menu under `Alt-P` with `Create tools file` at `30;42` and `Open tools file` greyed at `90;47`; the About box reading "A Turbo C-style editor for **Python**"; a triple-quoted f-string carried across a line break; `Ctrl-Y` deleting a line; the theme dialog opening on the current theme; the server found in `~/.local/bin` with `PATH` stripped, and the install hint on the status bar when it is not findable at all. And **a file that does not parse, opened by a relative path**, showing `×` in the gutter and `⚠ invalid syntax` on the status bar — the failure mode Turbo Go shipped with for months. - **Registered in the family**: turbo-core's `README.md`, `docs/{en,fr}/README.md`, `profile/profile.go`'s package comment, `how-to/release-the-library.md`, `how-to/test-without-publishing.md`, `how-to/write-the-starter-files.md`, `explanation/architecture.md` and `.memory/summary.md`; plus the "both editors" claims in turbo-go's and turbo-rust's architecture explanations. History in those repositories was left alone: "wrong the moment there were two editors" is a true sentence about the past. - **turbo-core's `.go` strings were swept** for hardcoded language names. Every hit was a false positive (`Go to definition`), a doc-comment example of the seam, or a true statement about the implementation (`written in Go.`). Nothing to fix — the About box's language had already been moved into the profile. - **The adaptation found defects in the editor it was adapted from.** turbo-rust's English `reference/menus.md` said project menus appear "between **Go** and Help", twice; both siblings' tutorials listed a menu bar without the Code menu and told the reader to press `→` four times to reach Options, which has been five since that menu shipped; turbo-go's listing was missing Snippets and its own Go menu as well. All fixed in both languages, in both repositories, each with its own history entry and handoff. - **Left for the user**: nothing is committed, here or in the three repositories beside it. This tree is untracked on `main` at `efb533c`. ## 2026-09-03 (later) — released as v0.1.0, and re-verified against turbo-core v0.4.1 - The user committed, tagged and pushed all four repositories between sessions: turbo-python **v0.1.0** (`bccbb0b`), turbo-core **v0.4.1** (`4f93fb0`), turbo-go **v0.4.2**, turbo-rust **v0.4.2**. Everything written in the entry above is in those tags. - **turbo-core v0.4.1 changes one `.go` file and it is a comment** — `profile/profile.go`'s package doc, which counted the editors. No behaviour change, so nothing in this editor's documentation is affected by the bump. - **Re-verified at the new HEAD**: `go.mod` now requires `v0.4.1` with no active `replace`; `gofmt -l` clean, `go build ./...` clean, `go test ./...` green in both packages against the freshly downloaded module. - `.memory/summary.md` corrected in place: the pinned version, and the two claims that had become false — "nothing is committed" and "no release". The handoff was left alone, because a handoff records what was true when it was written. ## 2026-09-09 — a documentation defect a fourth editor exposed - **Goal**: none of its own. This repository was the worked example for turbo-moonbit, and adapting it surfaced a defect here. - **Changes**: `Alt-T` → `Alt-P` in ten files across both languages — `reference/python-tools.md`, `reference/menus.md`, `reference/keyboard.md` and `how-to/run-uv-commands.md`. The Python menu is `~P~ython` and answers to `Alt-P`; `Alt-T` is Turbo Rust's, from `Rus~t~`, and it survived the mechanical substitution that produced these pages because it is not an identifier. A sentence about custom-menu hot keys ("`Format` gets `Alt-M`") was wrong for the same reason and was rewritten. "all three editors" → "all four" in the architecture explanation, both languages. - **Decisions**: fixed here rather than left, because it is a two-line-per-file correction in somebody else's repository — exactly the kind of change that is invisible afterwards if it is not written down. - **Tests**: none added here. turbo-moonbit gained `TestTheToolsReferenceMatchesTheStarterFile`, which reads the tools table out of its own reference pages and holds it to the file the editor writes, hot key included. **Copying that test across is the way to stop this recurring**, and it is perhaps twenty minutes. - **Not done**: nothing else in this repository was touched, and its suite was not re-run. ## 2026-09-09 (later) — the theme list gained three entries - **Goal**: none of its own. turbo-core gained `monochrome-light`, `darcula` and `intellij-light`, and renamed `monochrome` to `monochrome-dark`; this repository's documentation had to follow. Eleven themes ship now. - **Changes**: `docs/{en,fr}/reference/themes.md` — the embedded list, three new table rows, and a new "a name a theme used to answer to" section saying `monochrome` still loads; `docs/{en,fr}/how-to/write-a-theme.md` — the inherit-from advice and the shipped-theme count; `README.md`'s themes bullet. No code change. - **History was left alone**: "comments were the dimmest colour in six of the eight shipped themes" in `write-a-theme.md` is a true sentence about when that rule was written. - **Not yet true of the binary.** This repository pins turbo-core v0.4.2, which ships eight themes. The documentation is ahead until turbo-core is tagged and the `go.mod` here is bumped — see turbo-core's handoff of the same date. ## 2026-09-14 — the family count moved from four to five - **Asked**: nothing of this repository. Turbo Golo was built beside it, and `docs/{en,fr}/explanation/architecture.md` said the library's packages are used unchanged by "all four editors". - **Changes**: that one sentence, in both languages — four → five. No code touched; no tests run. ## 2026-09-15 — ACP agent windows, ported from turbo-go - **Goal**: carry the Agent Client Protocol support to this editor. The feature itself is turbo-core's — the protocol client, the conversation model, the window widget, the `Agent` menu and the permission dialog all live there. See turbo-core's history for the same date. - **Changes**: `internal/*/acp.toml.tmpl`, embedded in `templates.go` and wired into `profile.Templates.Agents`. That is the entire code change — one file and one line. Plus six documentation pages (EN + FR: how-to, reference, explanation) and their index entries. - **Decisions**: the example agent is `docker agent`, as in every other editor, because the protocol is the point and the agent is the user's choice; the one sentence in the starter file that is about **this** editor names its own fence, and a test holds it to that — a starter file copied from another editor and left naming that editor's language is the obvious way to get this port wrong. - **Tests**: 5 new in `internal/*`: both blanks filled with no `%!` marker, the file loads back as exactly one agent, it explains its keys, it names this editor's own language, and creating it twice leaves the first alone. - **Quality**: PASS 0/0/0. - **Docs**: adapted rather than copied — the slug, the language, the fence, the build command and the language server all differ from turbo-go's, and each was replaced. - Not committed. ## 2026-09-15 (night) — slash commands and `@` mentions, documented - **Documentation and the starter file only in this repository**; the code is turbo-core's (see its `.memory/` of the same date). The user asked for the ACP changes that let an agent's commands be discovered the way Zed discovers them, then for `@` as a file selector. - **Changes**: `docs/{en,fr}/reference/acp.md` — seven key rows for the list, a **Commands and mentions** section, the `session/prompt` and `available_commands_update` rows, the Limits bullet; `docs/{en,fr}/how-to/talk-to-an-agent.md` — "Use the agent's own commands" and "Point the agent at a file"; `docs/{en,fr}/explanation/agent-windows.md` — the "left out" bullet narrowed to images, two sections appended; the embedded `acp.toml.tmpl` — two key lines. Applied by one script across the five editors with an exactly-once anchor check. - **Tests**: `go test ./...` green (the template change is a comment; the tests that read the created file still pass). - **Ahead of the binary**: this repository pins turbo-core v0.7.0, which has none of this. The pages are true once turbo-core is tagged and the pin moved. - Not committed. ## 2026-09-16 — the trace variable and a troubleshooting bullet, documented - turbo-core gained `TURBO_ACP_TRACE=` and an "update this editor could not read" line in Agent status, because the user saw no `/` commands from their own agent and nothing on screen could say why. Documented here EN + FR: a bullet in the how-to's Variants, a section in `reference/acp.md`. Docs only; not committed. - **Later on 2026-09-16**: `.turbo-python/acp.toml` (and `agent.yaml`, docker agent's config copied from turbo-go) now hold two agents — **Bob (llama.cpp)** via `docker agent serve acp`, and the user's **mini-me (llama.cpp)** (`mm -acp`, `AGENT_CONFIG` env) — placed where this repository's demo project already keeps its settings. Verified to load as two agents with this editor's own `Profile()`; not opened, `mm` and `docker` are on the user's Mac. Working files for trying the `/` picker, not part of the feature. ## 2026-09-16 — family count: a sixth editor, Turbo JS - **Asked**: nothing of this repository directly. Turbo JS was built beside it, and the sentences here that count the family went false the moment it existed. - **Changes**: `docs/en/explanation/architecture.md`, `docs/fr/explanation/architecture.md` — "five editors" → six. Nothing else touched; history left as it was. - **Tests**: none affected — documentation only. ## 2026-09-17 — documentation: terminal windows and tools on Windows - **Asked**: nothing of this repository directly. turbo-core gained pseudo-console (ConPTY) terminal windows and a per-platform tools shell (cmd.exe on Windows); the pages here that said "Linux and macOS" or `/bin/sh -c` went false the moment that landed. - **Changes** (EN + FR): `README.md` (terminal windows: Linux, macOS and Windows), `docs/*/reference/terminal.md` (shell row, controlling-terminal row, platform table, error row), `docs/*/explanation/terminal-windows.md` (the Windows section rewritten: a pseudo-console and why it is a file of its own, built and vetted but not yet run), `docs/*/how-to/use-a-terminal.md` (`%COMSPEC%`, the five things to try first on Windows), `docs/*/reference/python-tools.md` (shell row, cmd.exe's globs and `;`, error row), `docs/*/explanation/python-tools.md` (`cmd.exe /S /C`). Applied by one script across the six editors, one anchor per file. - **Not changed**: code, `go.mod`. **The documentation is ahead of the binary** until turbo-core is tagged (v0.9.0) and re-pinned here; the feature has never been run on Windows by anyone. - **Tests**: none affected — documentation only. ## 2026-09-18 — the "Untitled window has no LSP" fix: docs variant added, fix is turbo-core's - **Asked**: propagate to every editor the fix made in turbo-core the same day — saving now announces a document the server does not know (a window that started Untitled gets LSP from its first save), and Save As under a new name closes the old document. See turbo-core's `.memory/history.md` of 2026-09-18 for the defect and the fix. - **Changes here**: `docs/{en,fr}/how-to/enable-completion.md` gain one variant — completion in a window that started without a name works from its first save, no relaunch needed. No code in this repository is involved. - **Quality**: gate not re-run — a Markdown-only change; the gate measures the Go code. - **Docs ahead of the binary**: the behaviour arrives only when turbo-core is tagged and this editor re-pinned. Not committed. ## 2026-09-19 — moved to Rickub: turbo-core v1.0.0 re-pinned, releases published by a workflow - **Asked**: the same migration turbo-go received the same day, for all five remaining editors — turbo-core moved to `rickub.com` and was published as v1.0.0 with a Release workflow. - **Changes, module**: `codeberg.org/turbo-editors` → `rickub.com/turbo-editors` in `go.mod`, every `.go` file, `Makefile`, `scripts/install.sh`, `README.md`, `docs/{en,fr}`, `.memory/summary.md` (turbo-core deep links also from Codeberg's `src/branch/main/` to `blob/main/`). `require rickub.com/turbo-editors/turbo-core v1.0.0`; `go mod tidy` with `GOWORK=off` rewrote `go.sum` from the proxy. - **Changes, release tooling**: `.github/workflows/release.yml` (new), `01-release.tag.sh` (rewritten), `03-build-releases.sh` → `02-build-releases.sh` (tag from `$1`, validation, `replace` check, fresh `release/${TAG}/`, `go install` line in the README, no hand-off to 04), `02-release.publish.sh` and `04-release.upload-binaries.sh` deleted, `release.env` rewritten (`TAG="v1.0.0"`, `ABOUT="Turbo Python"`). All generated from turbo-go's final files with the names substituted; the README paragraph naming this editor's language server and the example file (`main.py`) kept from the old 03. Docs: the release section and the wrong-commit variant of `docs/{en,fr}/how-to/make-a-release.md` rewritten. - **Tests**: `release_test.go` regenerated from turbo-go's — see `summary.md`. The file-writing helper is `writeTestFile` because turbo-python's `main_test.go` owns `writeFile`, and the command helper `runOrFail` because `main.go` owns `run`. - **Not done**: nothing committed or pushed — no commit exists yet and `origin` is unreachable from the sandbox. The workflow has not run on Rickub for this editor; turbo-go's identical one has, and published.