core/ and shared/ depend UPWARD on view/ (relocate shQuote, emit)
The dispatch loop and the git wire client import the rendering layer — an upward dependency that makes view/ un-droppable from a headless or server build and couples the transport to the UI. Worst: wire.js, a git transport client, pulls the POSIX-quoting primitive shQuote from view/render.js. emit.js (the output sink in core/) requires view/render.js + view/theme.js at module top. Method: Issues.
const shq = require("../view/render.js").shQuote;— a transport module reaching into the renderer for a shell quoter.
function shQuote(s){…} — pure POSIX single-quote, zero render dependency; exported at render.js:35.
view/render.js + view/theme.js at top— core/ depending on view/ for the columniser/theme.
require(_here+"/view/bro.js") — the dispatch loopreaches into view/ for the edge renderHunkLog.
shQuote to shared/util/shell.js; wire.js + render.js +status.js consume it from there (no view/ import in wire.js).
have core depend only on the injected ctx.out/ctx.sink seam.
shared/ and the transport import NOTHING from view/.moved shQuote keeps existing render call sites unchanged.
shared/util/shell.js::shQuote is the canonical home (a siblingof util/path.js + util/sha.js, JSQUE-016 layering); render.js re-exports for back-compat.
the ONLY one; the goal is to make it the single arrow, not many.
quoted path render byte-identical before/after the move.
shared/wire.js:22 still require("../view/render.js").shQuote;
core/emit.js:14-15 still require view/render.js+view/theme.js; no shared/util/shell.js exists (shared/util/ holds only ignore/path/sha).