Handoff — 2026-08-31 — project tree window
State
Ticket 0003 is done and green, on branch feature/treeview-window, uncommitted.
F9, or Window ▸ Project tree, opens a window listing the project's files. Arrows walk it, →/← open and close branches, Enter opens a file, F5/Ctrl-R re-reads.
╔═[x]════════════ turbo-go ════════════2═[■]╗
║ ▶ .turbo-go ║
║ ▼ internal ║
║ ▶ app ║
║ go.mod ║
╚══════════════════════════════════════════╝
- New
internal/filetree(94.7 %, 41 tests), 10 more ininternal/app. - Four
tree.*theme keys, set in all three shipped themes and enforced by the existing completeness test. - Whole suite green under
-race. Quality gate PASS first time: 0/0/0, complexity 1228. - Docs complete in EN and FR — three new pages each, six existing pages updated each.
docs/diagrams/packages.drawiogainedfiletree; re-checked againstgo list, 31 edges each side. - Verified by rendering the real binary through the project's own VT emulator:
F9lists with.githidden,→nests two levels,Enteropens a file into a third window.
Earlier the same day, PR #3 merged the window frame boxes and the Open-dialog OK fix.
In flight
Nothing. Finished through Phase 8.
Next steps
- Commit and open the PR.
feature/treeview-windowis the branch. - Drive the tree with a real mouse. Everything went through code and the emulator; clicking a row, the second-click-to-open rule and the wheel have never been exercised by hand.
- Tickets. 0002, 0003 and 0007 are all implemented and all still
state: open.
Open questions / blockers
.gitignoreis not respected. The tree showsbin/,release/and anything else git ignores. Hiding them would be genuinely nicer and costs a gitignore pattern engine — negation,**, anchoring — which is a feature to decide on rather than a detail to slip in. Recorded in the explanation page as turned down for now.- The root is the working directory, not the module root. Start the editor from
internal/appand the tree shows only that. This was the user's choice, for one rule across the whole editor; if it turns out to annoy in practice,main.moduleRootis already there and already tested. - A docked side panel was turned down, not rejected forever. If it is wanted, it is a
uifeature —Desktopneeds reserved edges thatfitInto, the grow modes, maximise, tile and cascade all respect — and should be designed on its own terms rather than arriving with a file browser.
Watch out for
- The tree's theme keys are not decoration.
list.selectedis coloured against a dialog: turbo-classic makes it white on navy, andwindow.bodyis navy. Borrowing it would make the selected row invisible in the editor's default theme.TestTheHighlightIsVisibleInEveryShippedThemefails at 0 channel values if anyone "simplifies"tree.selectedback to the list colours — I checked by doing exactly that. testDirectoryininternal/appdoes not create intermediate directories.testDirectory(t, "internal/app.go")fails; use"internal/"and a separate file.makeTreeininternal/filetreedoes nest, which is easy to confuse when moving a fixture between the two packages.- Refresh must not walk the project.
Node.refreshreturns immediately for a directory that was never loaded, andTestRefreshLeavesUnopenedDirectoriesUnreadis what stops that being lost. Removing the guard would turn every save into a full-tree walk. lefton a row has two meanings and both matter. On an open directory it collapses; on anything else it moves to the parent — found as the nearest row above with a smaller depth, which needs no parent pointer. Making it only collapse turns it into a no-op on every file, which is most rows.- Collapsing can leave the highlight past the last row.
keepSelectionInRangeafter every toggle is what prevents it;TestCollapsingABranchKeepsTheHighlightOnARowcovers it. a.treeWindowmust be cleared when the window closes, orF9tries to focus a window that is no longer on the desktop.closeWindowhas a branch for it beside the terminal one.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|