| 📦 Turbo JS 91999d1 k33g 15h ago | 1 | # Handoff — 2026-09-16 — Turbo JS, first build |
| 2 | |
| 3 | ## State |
| 4 | |
| 5 | The editor is complete and green. `make check` passes with `typescript-language-server` 6.0.0 + `typescript` 6.0.3 on PATH (the nine real-server tests skip themselves without them, and under `-short`), the quality gate passes (0/0/0, complexity 108), the documentation is complete in both languages (37 pages each), the root `README.md` is written, `demos/greeter` runs, and the tutorial has been driven through a pty and read back as SGR codes. Nothing is in flight. |
| 6 | |
| 7 | The working tree is **uncommitted**: the repository has no commits at all; everything is untracked on `main`. No commit, tag or push was asked for. |
| 8 | |
| 9 | ## What was touched outside this repository |
| 10 | |
| 11 | Each with its own history entry and handoff, each needing its own commit: |
| 12 | |
| 13 | - **turbo-core** — `README.md`, `docs/{en,fr}/README.md`, `docs/{en,fr}/how-to/test-without-publishing.md`, `profile/profile.go` (comment only), `.memory/summary.md` (six editors; two new "Not yet established" bullets), `.memory/history.md`, `.memory/handoffs/2026-09-16-sixth-editor.md`. **No code change.** Its tree also carries the still-uncommitted ACP trace work of 2026-09-16 that predates this session. |
| 14 | - **turbo-python**, **turbo-moonbit** — `docs/{en,fr}/explanation/architecture.md`: "all five editors" → six. |
| 15 | - **turbo-golo** — the same two pages plus `docs/fr/explanation/design-decisions.md`. |
| 16 | - **The kit**: `kits/dev-toolkit/files/home/.claude/skills/turbo-new-editor/SKILL.md` and its installed copy `~/.claude/skills/turbo-new-editor/SKILL.md` (kept byte-identical), with this cycle's lessons. |
| 17 | - **`agent-memory/`** was copied back into the live `~/.claude/projects/…/memory/`, which had lost twelve of its thirteen entries. |
| 18 | |
| 19 | ## Next steps |
| 20 | |
| 21 | 1. **Review the decisions** in `summary.md` — none was approved by the user: the name `Turbo JS`, the `~J~avaScript` menu, `typescript-language-server` + `typescript@6` rather than TypeScript 7's own server, `package.json` as the only root marker, the seven starter tools, replacing turbo-core's JavaScript scanner, registering JSON here. |
| 22 | 2. **Commit** — this repository (everything), then turbo-core, turbo-python, turbo-moonbit, turbo-golo, then the kit. |
| 23 | 3. **Add a `LICENSE`** if wanted; the siblings are MIT, `Copyright (c) 2026 turbo-editors`. The root README says the file is the owner's to add. |
| 24 | 4. **Tag `v0.1.0`** when ready: `release.env` already says so; `01-release.tag.sh` runs `make check` and refuses a live `replace`. Create `turbo-js.token.env` first (gitignored by `*.env`). |
| 25 | 5. **Open an agent window from this editor once**, on the Mac — `Alt-A` ▸ Create agents file, point it at `mini-me` or `docker agent`, and check a ```js fence in an answer comes out coloured. Nobody has. |
| 26 | 6. **Two turbo-core cycles this editor exposed**, when wanted: `languageId` from the profile in `lsp.Client.DidOpen`, and pull diagnostics (`textDocument/diagnostic`) — which would let this editor run on TypeScript 7's server from one `npm install -g typescript`. `internal/jslang/editor_test.go` is the harness: point `ServerCommand` at a `node_modules/.bin/tsc` with `--lsp --stdio` and the diagnostics test is the one that fails. |
| 27 | |
| 28 | ## Watch out for |
| 29 | |
| 30 | - **`typescript@6`, never bare `typescript`.** The current `typescript` is 7 and has no `tsserver.js`; the server then fails at `initialize`, after `--version` succeeded. The hint, the installer, the tutorial and the docs all pin `@6`; `profile_test.go` holds the hint to it. |
| 31 | - **`Language` is `syntax.LanguageJavaScript`, on purpose.** A private constant would register a second JavaScript beside the library's instead of replacing it, and `.js` files would then be claimed by whichever registration sorts last. `TestRegisterReplacesTheLibrarysOwnJavaScriptScanner` and `TestTheEditorColoursJavaScriptItOpens` both prove the override by finding a coloured regex. |
| 32 | - **`Enter` repeats the previous line's indentation** in turbo-core's editor. Any driver that types an indented listing must type only the change, or the buffer doubles its indents. `/tmp/tj/tut_script.json` does it right; the tutorial says so. |
| 33 | - **`docs/*/reference/languages.md` is read by `reference_test.go`**; changing a JavaScript or JSON row means changing the test, and the FR page by hand. |
| 34 | - **The pty drivers live in `/tmp/tj/`** (`pty_run.py`, `screen.py`, `tut_script.json`, `FACTS.md`, the `.raw` captures) and will not survive the sandbox. `screen.py` replays a whole capture per query, so a 3 MB capture takes ~10 s per frame — batch the queries. |
| 35 | - **The sandbox is Linux, the user is on macOS**: `/tmp/tj/turbo-js` is an ELF outside the tree; `bin/` is empty and must stay so. |
| 36 | - **`cp` on this sandbox has produced NUL-filled files before**; every copy this session was done from Python with a byte comparison afterwards. |
| 37 | - **`npm install -g` in the sandbox writes to `/usr/local/share/npm-global`**; the user's Mac will have it elsewhere — the editor searches nvm, npm-prefix, pnpm, Volta, `/usr/local/bin` and `/opt/homebrew/bin`, and the docs list them. |