bin/lib/pkt.js + wire.js — git fetch conversation
The pure-JS git-wire CLIENT (fetch direction): pkt-line framing + transport spawn + refs-advert parse + want/have/done negotiate + side-band-64k demux, yielding the received packfile bytes. Mirrors keeper/WIRECLI.c (unlinkable). Part of JS-038.
be get over the wire spawns a peer (ssh host keeper upload-pack, file:// local exec, be:///git:// TCP) and runs the v0/v1 upload-pack convo. JABC already has the transport: io.spawn → {pid,stdin,stdout} + io.reap; net.connect + pol for TCP. The convo logic is pure JS.pkt.js: drain/feed/flush pkt-lines (4-hex len + payload); pure JS over hex (no native leaf — trivial, like status.js text parsing).wire.js: fetch(remoteUri, wantRef?) -> {pack:Uint8Array, refs:[...]} — spawn, drain advert (sha SP refname 0caps), send want/have/done, NAK, demux side-band band1 pack / band2,3 → stderr.abc ONLY. Transport classify like WIRECLI.c::wcli_spawn (file/ssh/be/git). No ingest here (→ JS-040); return raw pack bytes.io.spawn (ssh/exec) or net.connect (be/git TCP); avoid write/read deadlock with pol non-blocking interleave (WIRECLI poll loop).WIREClassify-equivalent line tokenizer in JS (want/have/advert/ack lines).test/js/get/wire.js (helpers test/js/lib/): against a local keeper upload-pack (file://) + a real git file://x.git, fetch trunk → assert advert parsed, pack header (PACK,count) parses via git.pack.bin/lib/pkt.js + bin/lib/wire.js; smoke ssh + be transports.