Status header: Analyze -> Plan.
Baseline findings folded into the design sections:
§1 (highlighter pillar) gains B4: tree-sitter absent on every
probed host; :highlight on emits install-hint when missing.
§4 (highlighter sketch) revised per B3: io.popen():close() doesn't
expose exit codes in LuaJIT. Route via executor.exec("cat tmp |
tree-sitter ...") which uses pty.spawn+waitpid and returns code
reliably. Tmpfile design retained (avoids ARGMAX + shell-escape).
§5 (:diff impl + @<r1>..<r2> retry) revised per B1: every git
invocation must use `--no-pager -c color.ui=never` to suppress
the color/keypad/line-clear escapes forkpty triggers. Factored
recommendation: helper `_git_clean_cmd(subcmd)` shared by :diff
and the @-mention diff retry.
New §12 Implementation Plan — 6 commits, bottom-up:
1. context.lua: ctx.project + compose_project + composition order
2. repl.lua: _scan_project_tree helper + :tree meta
3. repl.lua: :diff meta + _git_clean_cmd helper (B1)
4. repl.lua: expand_mentions tiered resolution (@<r1>..<r2> per A6)
5. renderer.lua + repl.lua: tree-sitter detect + fence filter +
:highlight meta (B3-revised tmpfile dispatch)
6. config.lua project example + status -> Implement
Per-commit risk index + smoke criteria. Highlighter (commit 5) is
the largest experimental surface — placed last so the rest of Phase 6
ships even if highlighter slips. Order is independent enough that
swapping 3<->4 or 5<->6 doesn't break anything; bottom-up keeps each
commit individually green.
Things deliberately not split: _shq reuse, lang map duplication for
v1, streaming-rehydration order (rehydrate -> highlight -> emit
inherits naturally from existing chunk pipeline).
Two items open at plan time, resolve at implement: _scan_project_tree
dir-arg vs hardcoded getcwd; :highlight status probing
tree-sitter --print-langs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Analyze pass against tree at f596743. All 6 formulate-time questions
resolved without structural changes; pillar shapes intact.
A1. renderer.lua surface clean — assistant_delta/flush accumulate via
stream_buf; fence-aware filter slots in between chunk receipt and
emit without touching anything else.
A2. executor.exec via pty.spawn already handles git diff / find;
cwd-aware (inherits from libc.chdir). No new IO model.
A3. context composition order locked: base + [background] + [earlier
summary] + NORRIS. [project] inserts between [background] and
[earlier summary]; Norris-suppression guard inherited.
A4. Q-H1 RESOLVED: tmpfile roundtrip for tree-sitter popen3
(io.popen("w") + redirect stdout to tmp file; io.open reads back).
Avoids ARGMAX + shell-escape complexity. Cost ~one syscall per
code block.
A5. Q-D1 RESOLVED: no confirm gate on :diff. git diff is read-only;
matches :history / :sessions / :safety check.
A6. Q-D2 RESOLVED: tiered @<token> resolution — file lookup first,
then ref-range retry when path fails AND token contains "..".
@origin/main..feature works naturally; @../sibling.txt unaffected.
A7. Q-H2 RESOLVED: highlighter is assistant-output only in v1.
@-mention echo via readline is a different code path; deferred
to v2 (added to §8 out-of-scope).
A8. Q-T1 RESOLVED: project tree captured at scan time, not auto-
refreshed on cd. v1 verb is :tree refresh; cd-intercept auto-
refresh deferred to v2.
A9. Q-T2 RESOLVED: .gitignore via `git ls-files --exclude-standard`
in repos; find fallback outside. Custom globs deferred to v2.
A10. expand_mentions punct-peel doesn't strip "/", so HEAD~1..HEAD,
peels comma cleanly and the diff retry catches the cleaned token.
A11. Auto-injection ordering: memory load → tree scan → first ask_ai.
Composition reads memory facts before file tree.
A12. [project] Norris-suppressed (parity with R-C1/R-C4).
§3 module-changes table: context.lua row updated (project string +
compose_project + ordering note + Norris suppression). §4 highlighter
code sample replaced with the tmpfile-roundtrip resolved form. §5
@-mention section rewritten as tiered-resolution with worked examples.
§8 out-of-scope gained three v2-polish items (echo highlight, cd-
intercept auto-refresh, custom globs) so they're tracked. §10 Open
Questions table now shows all 6 Qs with their resolutions inline.
§9 Risks row for @-mention collision updated to point at A6.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Phase 6 formulate manifest. Three pillars per PHASE0 §11 row 6:
1. Tree-sitter syntax highlighting hooks
External `tree-sitter` CLI when present, no-op otherwise.
Honors PHASE0 §3 (no compiled extensions). Toggleable
at runtime; off by default so existing UX is unchanged.
2. Diff-aware code injection
:diff [args] meta + @<ref1>..<ref2> @-mention extension.
Shells out to `git diff`; output flows through the existing
exec-output context channel.
3. Project-level file-tree context
:tree meta + optional cfg.project.auto_tree startup inject.
git ls-files in a repo, find fallback otherwise. Composed
into the system prompt as a new [project] block between
[background] and [earlier summary]. Suppressed under Norris
(R-C1 / R-C4 parity).
Module changes: renderer.lua (fence-aware highlight filter), context.lua
(compose_project), repl.lua (3 new metas, 3 new helpers, expand_mentions
extension). No new module files in v1.
Doc covers: scope + done-when criteria, tech decisions table, module
changes table, per-pillar deep dive with example code, UX surface
summary, out-of-scope list, risks, and 6 open questions to resolve
in analyze (Q-H1/Q-H2 highlighter, Q-D1/Q-D2 diff, Q-T1/Q-T2 tree).
Scope confirmed via AskUserQuestion: all three subsurfaces in scope;
tree-sitter approach is external CLI w/ no-op fallback.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>