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/mod for 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.