GIT-018 JS: build the wire push-pack in pure JS — drop the keeper spawn

The JS wire push does not build its own pack: shared/wire.js buildPushPack shells to the native keeper upload-pack <store>?/<proj>, driving a full upload-pack negotiation with a spawned keeper just to harvest the packfile. That makes every jab post/jab put over the wire depend on the native keeper binary at runtime (and blocks a push wherever it is absent). The pieces to do it in JS already exist — the git.pack writer bindings, the keeper-store reader (commitParents/readTree/getObject), and jab post's local pack build (fold-commit.writePack). Fix: replace the keeper spawn with a pure-JS thin push-pack — walk the reachability closure (want=tip MINUS have=remote tips) over the JS store and emit via git.pack, no subprocess. Reuse PACK-002's OFS writer for offset-only deltas; keep the packfile fsck-clean on the peer. JS only (be/, via jab). Method: work; sibling GIT-013/GIT-016.

Input

Context

Goals

Constraints

WIP

Design decisions

TODOs

Blockers and bummers

Outcome