bin/lib/checkout.js + bin/get.js — apply tree + entry
Materialise a fetched baseline tree into the worktree (new/del/mod, files+dirs), append the wtlog/REFS rows, print the be get op-summary, and wire the bin/get.js entry + transport dispatch. The orchestration tying JS-039 fetch + JS-040 ingest into output-equivalent be get. Part of JS-038.
be get checks out its tree into the
wt — create dirs, write new/changed files (right mode), delete removed ones — then records the get in .be/wtlog + refs, and prints what moved.
keeper.readTreeRecursive (leaf set) + classify.js (current wt state) +
wtlog.js already exist (read side); this adds the WRITE/apply side.
checkout(repo, keeper, tipSha): diff baseline-tree vs wt, apply new/del/modfor files and dirs (mkdir -p, io.write, io.unlink, mode bits), atomic-ish.
bin/get.js: parse args/URI, dispatch transport (JS-039), ingest(JS-040), checkout, append wtlog+REFS, emit the summary native emits.
abc ONLY. Summary + wt state byte-equivalent to native be get(the JS-038 parity matrix). No keeper/sniff dog.
classify.js to compute the apply set (baseline⊕wt) so del/mod/dir
handling matches status semantics; honour .gitignore via ignore.js.
test/js/get/* (helpers test/js/lib/, borrow fixtures
from test/get/): {file,ssh,be} × {new,del,mod} × {file,dir} — JS get vs native be get: same stdout summary AND same resulting wt tree.
bin/lib/checkout.js + write helpers + bin/get.js.