Repository navigation
v0.35.4 — native invocation A+B
The hook, moved to where npm can actually reach it, installed only after asking — plus a hook-ownership defect found by running the gates on Linux for the first time.
The hook reaches the published package now
tools/ ships in neither artifact: npm pack packs from runtime-ts/, the wheel packs runtime-py/src/bantamkit. So every hook adapter under tools/hooks/ was unreachable from the only way bantamkit is installed. --hook now lives inside both runtimes. tools/hooks/bantamkit-hook.mjs remains as a 33-line shim on purpose — it is the command already registered in existing settings.json files, and deleting it would unhook those machines silently.
Hooks are never a side effect
New paired --install-hooks / --remove-hooks in both runtimes, each behind a three-state gate: a TTY answer, or --yes, or refuse with exit 2. Removal asks too: it rewrites your settings file exactly as installation does. A dated backup is written either way.
Fixed: hooks that could not be removed
Ownership was decided by asking whether a hook entry's JSON happened to contain the literal bantamkit — and the Node command carries that word only if the directory it was installed into does. Measured from an install path that does not:
| launch path | 3x --install-hooks |
--remove-hooks |
|---|---|---|
contains bantamkit |
7 entries, idempotent | removes them |
| does not | 21 entries, +7 per run | "no bantamkit hooks are installed" |
Both runtimes gave that same answer over that same file, so hook entries could accumulate in a user's settings that neither runtime could ever take back out. It reaches an npm install under another name, a Docker image copying dist/ elsewhere, and any vendored build. Ownership is now decided from the entry alone, with legacy arms so entries already written by earlier versions still remove cleanly.
Also
- One-way export of fact names into the host's own auto-memory — writes only when absent, never rewrites or deletes, and exports nothing rather than guessing when the directory is unknown.
- The MCP argument pre-parse the TypeScript port never had: 16 shapes across 7 tools.
checked_atper registry entry, closing a starvation in--updatethat affected every successful run, not just partial failures.- npm and PyPI READMEs split apart and gated so they cannot drift back together.
- The PowerShell BOM claim, asserted in a docstring for months and never run, is now measured: false of PowerShell 6+ on every platform. Windows PowerShell 5.1 is left explicitly UNMEASURED rather than assumed, and what still needs a real Windows kernel is registered in git with what would settle each row.
Gates
conformance --all 8906 cases, 161 ruled-different, 0 failures
pytest 3205 passed, 57 skipped, 2 deselected, 3 xfailed
npm test 1259 tests, fail 0, 47 skipped
hook probes 18 pass, 0 fail
ruff All checks passed!
Full changelog: v0.35.3...v0.35.4