border-customs 0.8.3 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -608,38 +608,10 @@ dropped file to stderr with the sha256 of its original bytes
608
608
  (`border scan: crates envelope normalized: <file> sha256=<hex>`); the rebuild regenerates
609
609
  them from the normalized manifest, so no scanned byte is silently lost.
610
610
 
611
- ### Engines in consumer installs
612
-
613
- `dist/index.js` is one self-contained esbuild bundle and every runtime asset (vendored
614
- gitleaks rules, prompt template, the secretlint fingerprint snapshot) ships inside `dist/`,
615
- so after `npm i -D border-customs` (or `-g`) the engine surface is:
616
-
617
- - **publint** — installed automatically: it is an exact-pinned runtime dependency of the
618
- package, invoked via bin resolution (package-local `node_modules/.bin`, the hoisted
619
- project-level `node_modules/.bin`, then `PATH`, then `~/.local/bin`). The
620
- `publint-fail` leg of the npm artifact stage works out of the box in a consumer install.
621
- - **secretlint** — no consumer action, ever: the default lint runs **in-process** with the
622
- `@secretlint/*` rule modules already declared as border's own runtime dependencies
623
- (`src/engines/secretlint.ts` header). The `mode: "cli"` fallback that spawns a
624
- `secretlint` binary is border-internal (test transport); it is not reachable from
625
- `border.yaml` or any flag, so installing `secretlint` into your project changes nothing
626
- for border. If the engine probe cannot read the bundled lock snapshot
627
- (`dist/assets/package-lock.json`), the run fails closed as `DEGRADED-ENGINE` exit 2 —
628
- never a silent pass.
629
- - **gitleaks** — stays external, same posture as `git`: border vendors the 8.30.1 rule
630
- config but the binary is yours (on `PATH` or `~/.local/bin/gitleaks`; see the
631
- requirements paragraph at the top and `src/engines/ADAPTER-CONTRACT.md`). Missing
632
- gitleaks means `border check` records a CRITICAL `DEGRADED-ENGINE` finding and exits 2,
633
- and `border scan` exits 2 with `engine binary 'gitleaks' not found; border fails
634
- closed`. Neither command degrades to a skip.
635
- - **trufflehog** — optional third engine, external binary, same posture as gitleaks once
636
- enabled: `engines.trufflehog: true` puts it in the required set, and an absent binary
637
- degrades the run to exit 2 exactly like a missing gitleaks.
638
-
639
- There is no "engine absent ⇒ leg silently skipped" state anywhere: missing required
640
- engines are exit 2 (`2` = the gate could not answer, see
641
- [Exit codes](#exit-codes-the-contract)), and the ledger refuses to write a PASS for a
642
- degraded run.
611
+ ## Engines
612
+
613
+ Engine posture per scanner — vendored vs external, version matrices,
614
+ consumer-install behavior: [docs/engines.md](docs/engines.md).
643
615
 
644
616
  ## Configuration
645
617
 
@@ -839,7 +811,7 @@ plugin entry ships as `exports["./server"]`):
839
811
  ```jsonc
840
812
  {
841
813
  // pin the exact version — an @latest channel hits the registry on every cold start
842
- "plugin": ["border-customs@0.8.3"]
814
+ "plugin": ["border-customs@0.8.4"]
843
815
  }
844
816
  ```
845
817
 
@@ -969,271 +941,9 @@ and every pull request, plus version single-source, typecheck, build, and audit
969
941
 
970
942
  ## Changelog
971
943
 
972
- ### 0.8.3 (2026-11-02)
973
- - Fix: `exfil-cred-location` is now syntax-aware in JS/TS sources (handoff b61b42a) —
974
- `.env` tokens count only inside string-literal spans (TypeScript compiler API, shipped
975
- as a runtime dependency, bundle stays external-pinned); member accesses (`opts.env`),
976
- short receivers and comment text are no longer reported. Markdown/text keep the
977
- bare-mention behavior; every other rule is untouched. All tree faces (check, history,
978
- tip lens) share the guard; parse failure ⇒ old behavior + one stderr note, exit codes
979
- unchanged. Rules fingerprint rotated (cached PASSes re-verify once).
980
-
981
- ### 0.8.2 (2026-11-01)
982
- - Production dependency graph now measures ZERO advisories (`npm audit --omit=dev`): the
983
- pattern rule is vendored (`src/engines/borderPatternRule.ts`, MIT attribution; drops the
984
- unpatchable braces/micromatch + fast-uri chain) and `tool` — an identity function — is
985
- vendored in `plugin/border.ts`, moving `@opencode-ai/plugin` (and its effect-beta → toml
986
- chain) to devDependencies; live-host probe tests keep the activation proof. The CI audit
987
- gate tightens from critical to HIGH so this cannot rot.
988
- - `border sandbox init|pin|status|unpin` — the opt-in pin helper from the Q1 ruling
989
- (machine store only, 0600 atomic writes, §3 self-verification with rollback of its own
990
- writes; deliberately absent from the plugin's agent-reachable command set).
991
- - Security tier for execution-deciding keys (`src/tier.ts`, sibyl §3⁗/§3⁖/§3‡):
992
- `sandboxImage`/`allowBuilds` honor only from fd-chain-qualified machine-store or out-of-repo
993
- `--config` sources; repo declarations, lax-mode files, and hijacked `XDG_CONFIG_HOME` are
994
- named refusals (`sandbox-config-shadowed`/`sandbox-config-unqualified`); the
995
- `BORDER_ALLOW_BUILDS` environment channel is REMOVED (never released, so no migration);
996
- passwd-derived canonical store root — `$HOME` spoofing cannot move it.
997
- - Sandboxed artifact builds: optional `targets.<ch>.sandboxImage` (digest-pinned, tags fail
998
- closed at load) runs consented npm/pypi/crates/rubygems builds — and freshness re-packs —
999
- inside `docker run` with `--network none` proved by an in-container DNS+TCP probe, a
1000
- read-only repo mount, tmpfs build, `--cap-drop ALL`, scrubbed env, and the ledger record
1001
- bound to the exact image digest (a rotated image invalidates cached PASS). Missing docker
1002
- with an image configured is a named exit 2, never a host fallback. New `test/sandbox.test.ts`
1003
- pins the docker argv contract token by token.
1004
- - Hardened the npm pack-phase guard (sibyl must_fix): ALL package.json manifests in the tree
1005
- are scanned, not just the root (a workspaces child's `prepare` is now refused on npm < 11),
1006
- and unreadable manifests or a walk-cap hit count as a hook — unknown is never assumed safe.
1007
- - Machine-side config (HR decoupling handoff 2026-10-23): resolution chain is now
1008
- `--config > $BORDER_CONFIG (fail-closed) > machine store (XDG/border/machines, keyed by
1009
- canonical remote URL) > ./border.yaml > git-remote inference`, so gate config and waiver
1010
- lists live on the checking machine and never need to be committed into a product repo.
1011
- Allow entries gained `values` (fixture-set waivers that never cover a new value), `until`
1012
- (UTC sunset, expired entries echoed never silently honored), `\!` archive-member escaping,
1013
- and `rules.aliases` (rule renames no longer strand waivers). Border state was already
1014
- porcelain-invisible (`.border/.gitignore` self-ignore; verified 2026-10-23).
1015
- - Provenance: every check and push record carries `engineBuild`
1016
- (`<version>+<commit>[.dirty]`, the string `border --version` prints), so a verdict names
1017
- the exact border build that produced it. Motivated by a machine where every gate ran off
1018
- an unpinned worktree bundle and no record said so; worktree use is now visible on the
1019
- record face (see "Pinned consumption"). Bundles are stamped by `tools/build.mjs`.
1020
- - Security (breaking): artifact build stages now require operator consent. A hostile clone can
1021
- ship its own border.yaml declaring pypi/rubygems targets, and `border check` built them —
1022
- PEP 517 backends and gemspecs ARE code (`python3 -m build --no-isolation` and `gem build`
1023
- markers reproduced 2026-10-23). Default runs are now scan-only (zero build spawns, pinned by
1024
- `test/build.execMarkers.test.ts`); consent comes only from outside the audited tree:
1025
- `--allow-builds` or `BORDER_ALLOW_BUILDS=1`. A scan-only PASS records no artifact digests and
1026
- therefore can never back a registry publish; `border scan` of third-party artifacts requires
1027
- the same consent (named exit 2 without it).
1028
- - Security: refuse npm < 11 packages that declare `prepack`/`prepare`/`postpack` before
1029
- spawning `npm pack`. npm 10 executes `prepare` even with `--ignore-scripts` (reproduced on
1030
- 10.9.7; npm 11.19.1 is clean), so the old defense could execute code from the audited repo.
1031
- The probe also runs before freshness re-packs. New regression tests pin the refusal and the
1032
- never-fires hook marker.
1033
- - Fix: the Windows drive-letter path pattern no longer fires on JS escapes in prose
1034
- (`raw-repoPath:\n`); the UNC pattern no longer spans newlines.
1035
- - Docs: the `--json` findings schema is stated explicitly (`path`, no `file` alias);
1036
- npm-target prerequisites now name the npm 11 boundary.
1037
-
1038
- ### 0.8.1 (2026-10-06)
1039
- - Maintenance release: certificate-chain rebuild off the scrubbed lineage (INCIDENT-20261006
1040
- identity-exposure cleanup). No functional change vs 0.8.0; 0.8.0's tarball is byte-intact but
1041
- its OIDC provenance pin moved with the history rewrite, so a fresh tag + publish restores a
1042
- verifiable chain. Rotation: package.json + lock roots + plugin marker + scan UA + README pins +
1043
- this entry.
1044
-
1045
- ### 0.8.0 (2026-09-30)
1046
- - Add: **`border opencode inspect [--json]`** — the load-surface self-audit becomes a gate-owned
1047
- surface: six read-only aspects (cache self-consistency, spec freshness vs pin/registry, identity
1048
- handshake replay, Route A byte parity, Route A∧B dual-route collision, scope declaration),
1049
- fail-closed aggregation FAIL 1 > CANNOT 2 > PASS 0. `--json` pins `scope:"v1"` — V2 load surfaces
1050
- are a declared blind spot, not silently covered. Zero writes; `--purge` stays in the cron shell.
1051
- - Change: **`exfil` joins the plugin's closed command list** (owner ruling R1 under the four-question
1052
- eligibility gate — no mutation, no credentials, no foreign-byte execution, no local egress;
1053
- packet: `.omo/evidence/F-EXFIL-ALLOWLIST-RULING-2026-09-30.md`). `border opencode …` verbs stay
1054
- terminal-only: they mutate `$XDG_CONFIG_HOME` and fail the gate's first question.
1055
- - Change: `tools/plugin-drift-watch.mjs` retires to a thin shell over `border opencode inspect --json`
1056
- (single source of verdicts); the cron rc contract is byte-stable — FRESH 0, DRIFT 1, NOT-CACHED 0
1057
- (special-cased per ruling B2), CANNOT 2 — and the crontab line is unchanged.
1058
-
1059
- ### 0.7.1 (2026-09-30)
1060
- - Fix: **release-gate test ruler race** (`test/push.integration.test.ts` I4) — the
1061
- "dry-run made ZERO verdaccio requests" invariant counted lines in verdaccio's stdout
1062
- log, an eventually-consistent view: on a saturated CI runner the gate-leg probe lines
1063
- of an earlier phase land after the snapshot, inflating the dry-run delta (v0.7.0 CI
1064
- run 36671401844 failed `6 !== 2` while the identical bytes pass locally). The suite
1065
- now takes every snapshot through a FIFO drain barrier (sentinel request whose log line
1066
- must be visible before counting; sentinel traffic is excluded from the count). The
1067
- zero-network dry-run contract itself is unchanged — verified request-free on both sides
1068
- of the barrier; only the measuring instrument was repaired.
1069
-
1070
- ### 0.7.0 (2026-09-28)
1071
- - Add: **OpenCode 2 (beta) plugin compatibility** — the plugin module is dual-shaped
1072
- (`{id, setup}` for V2 hosts, frozen V1 `server()`), sharing the pre-spawn
1073
- allowlist/`--yes` gates and the 0.5.1 identity handshake across both shapes;
1074
- refusal/handshake/rendering byte-parity between edges is pinned by
1075
- `test/opencode.v2shape.test.ts` while the V1 path stays 16/16 on unmodified
1076
- tests. Root `index.ts` re-export shipped for V2 directory discovery (which
1077
- bypasses the exports map; live-proven on `@opencode-ai/cli` beta-19271).
1078
- - Fix: the live V1 probe is anti-vacuous — opting in (`BORDER_OPENCODE_PROBE=1`)
1079
- without a resolvable binary or built dist now FAILS naming the remedy instead
1080
- of skipping green-adjacent (`BORDER_OPENCODE_BIN` override added).
1081
- - Docs: support matrix (V1 object entry ≥ 1.18.29; V2 project-local verified;
1082
- `/border` command V1-only pending the V2 delivery API).
1083
-
1084
- ### 0.6.0 (2026-09-25)
1085
- - Add: **the exfil lens** — five rules (`exfil-rfc1918`, `exfil-ssh-target`,
1086
- `exfil-home-path`, `exfil-cred-location`, `exfil-host-profile`, `exfil-machine-binding`) that flag
1087
- exfil-shaped literals on about-to-be-public surfaces, the gap classic secret
1088
- scanners leave open because an internal IP is not a credential. The observed
1089
- severity of every (rule × facet × channel) cell lives in one machine-readable
1090
- home, `src/exfil/severity.ts`, rendered — never re-decided — by the check
1091
- pipeline, the new read-only `border exfil <rev|url>` CLI (tip tree by default,
1092
- `--deep` history, URL modes into a destroyed temp clone) and the README table,
1093
- each cell pinned by a docs guard. The tree HIGH family ships as vendored
1094
- twins (gitleaks TOML + secretlint patterns, ids byte-equal, verdict parity
1095
- tested); the commit-message facet is native-exclusive with a `:message` id
1096
- family so allow-list waivers can never cross facets; tag notes stay with the
1097
- pre-existing `tag-message-secret` engine leg. All exfil sources are
1098
- fingerprinted into `rulesHash`.
1099
- - Add: **post-push landing verification** — after git legs move, the remote tip
1100
- is re-observed and scanned with the same machinery; clean appends an
1101
- append-only `t:"landing"` record and preserves the exit, a blocking hit exits
1102
- 1 ("ALREADY PUBLIC; border detects, never erases"), an unobservable tip exits
1103
- 2 with no record minted. Executed-push rows are never mutated; DRY-RUN lands
1104
- nothing.
1105
- - Add: **fixture band + assembly doctrine** — 10.200.0.0/16 is reserved as the
1106
- always-exempt-on-tree test range (exemption mirrored natively in both twins,
1107
- message facet deliberately not exempt), and the test corpus assembles every
1108
- other leak shape at runtime (`assembleOctet`/`assembleHost`) so checked-out
1109
- bytes carry no complete leak tokens: border's own lens is green against
1110
- border's own corpus. Golden-suite coverage includes an opt-in truth lane
1111
- (`BORDER_EXFIL_TRUTH=1`) with a documented red-anchor lifetime clause.
1112
- - Note: this release line traces to the 0.5.1 impersonation-wave audit; that
1113
- wave's H-3 follow-up — scrubbing this repo's own historical tip surfaces —
1114
- landed here as byte edits with the extracted values withheld from public
1115
- records by design (see the sanitized `.omo/evidence/` trail, not this log).
1116
-
1117
- ### 0.5.1 (2026-09-24)
1118
- - Fix: **plugin impersonation — the `border` tool could spawn the host binary instead of the
1119
- gate.** On Route B the 0.5.0 adapter resolved its packaged CLI as `process.execPath +
1120
- dist/index.js`, but inside the opencode plugin host `process.execPath` is the opencode
1121
- (bun-compiled) binary — sessions saw opencode's banner for `--help` and opencode usage
1122
- errors for every other command, while the tool's schema still promised border's
1123
- fail-closed contract. The resolution order is now: `BORDER_BIN` (wins alone; a broken
1124
- override never silently falls back) → packaged `dist/index.js` exec'd directly via its
1125
- shebang, else under `PATH` `node` → `border` on `PATH`. `process.execPath` is removed from
1126
- the adapter, pinned by a source-level regression test, and **every candidate must pass an
1127
- identity handshake** (`--help` answering with border's banner + `usage: border`, exit 0,
1128
- 20 s cap) before any user argv is spawned — failure reports `cannot-answer` at exit 2 and
1129
- runs nothing else (spawn failures now map to 2, not 127, aligning the tool with the CLI's
1130
- exit-code contract). Regression tests cover the unspawnable-override and the
1131
- opencode-style-impostor fixtures; the impostor logs prove user argv never reaches it.
1132
- Honest boundary: the handshake catches mistaken identity (host binaries, PATH accidents),
1133
- not a deliberately forged banner.
1134
-
1135
- ### 0.5.0 (2026-09-12)
1136
- - Add: OpenCode plugin adapter (`exports["./server"]` + `/border` + `border` tool) loadable
1137
- two ways with zero manual install — config-declared `"plugin": ["border-customs@0.5.0"]`
1138
- (opencode downloads the package; the plugin spawns its own packaged CLI via a
1139
- package-relative `dist/index.js` resolution, `BORDER_BIN` override, PATH fallback) or
1140
- `border opencode install` (marker-identified idempotent file drop, foreign files refused,
1141
- never overwritten). Trigger: an agent session drives the gate without a shell-out or an
1142
- install ritual; `push --yes` stays terminal-only by design — the tool refuses it.
1143
-
1144
- ### 0.4.2 (2026-09-12)
1145
- - Fix: `npm publish` no longer prints the misleading "bin[border] script name
1146
- dist/index.js was invalid and removed" warning — package.json now carries the
1147
- canonical bare-relative bin form npm normalizes to anyway (mechanism traced to
1148
- @npmcli/package-json publish-side; artifacts were never broken; an always-on
1149
- test locks the form).
1150
- - Change: RubyGems freshness (skip-ledger) parity compares a normalized CONTENT
1151
- digest instead of raw file bytes — `gem build` stamps the building toolchain
1152
- (RubyGems <3.6 embeds the build second in gzip headers), so raw-sha repack
1153
- parity could never be honored on those machines. The ledger digest and the
1154
- publish-time same-bytes re-hash stay RAW: what gets uploaded is still exactly
1155
- the certified bytes, and any unparseable artifact fails closed to a full
1156
- re-check.
1157
-
1158
- ### 0.4.1 (2026-09-11)
1159
- - Add: release-coherence rule family — every version source inside a published artifact
1160
- must agree (pyproject vs MODULE vs filename, gemspec vs gem metadata, Cargo.toml vs
1161
- crate filename, package.json self-consistency; the git-tag half is a publish-workflow
1162
- hard gate). Trigger: the aihr incident where a wheel labeled 0.2.2 shipped modules
1163
- self-reporting 0.2.1 — every pinned consumer silently got old behavior.
1164
- - Add: `border roundtrip` local-artifact input — an argument resolving to an existing
1165
- file (.whl/.tgz/.crate/.gem, closed table) proves unpublished bytes end-to-end; the
1166
- streaming sha256 of those exact bytes is the ledger identity and the report carries
1167
- `source:local:<abs>` provenance. Honest boundary documented: the local PyPI-wheel lane
1168
- is residue-INERT by construction (pip fully tracks and prunes; verified live on pip
1169
- 24.0 AND 25.0.1) — planted-detection demos belong to the hook-executing lanes
1170
- (npm postinstall, gem extconf, crates build.rs).
1171
- - Change: pypi roundtrip lane dep-closure calibration — pip's resolver report demotes
1172
- dependency-storm files to LOW `dep-owned` rows, so genuine orphans stand alone; the
1173
- demotion requires a legitimate claimant dist-info (pin Name+Version match, canonical
1174
- dirname, unique, own site-packages root, not the target) after an independent verifier
1175
- proved a shadow `*-9.9.9.dist-info` could otherwise launder hostile writes.
1176
-
1177
- ### 0.4.0 (2026-09-10)
1178
- - Add: `border roundtrip <[ecosystem:]name@version>` — fact-proof valve. Installs the
1179
- package inside a throwaway Docker container, content-hashes the whole filesystem before
1180
- and after uninstall, and reports exactly what the uninstaller left behind. Persistence
1181
- surfaces (rc/profile mutations) => CRITICAL; orphan files => HIGH. Verdicts record to
1182
- the ledger by default (`--no-record` opts out); Docker absent => fail-closed, never clean.
1183
- - Add: `residue.requireProof` — when on, a residue-capable artifact only passes `border
1184
- check` with a fresh recorded roundtrip proof (bound to rulesHash; flipping the config
1185
- invalidates cached verdicts). Missing proof => CRITICAL `roundtrip-proof-missing`.
1186
- - Opt-in test legs: BORDER_ROUNDTRIP_DOCKER=1 (8 real container legs, 4 ecosystems).
1187
-
1188
- ### 0.3.2 (2026-09-10)
1189
- - Fix: CLI invoked through the npm `.bin` shim silently exited 0 without running
1190
- (entrypoint detection now realpath-canonicalizes both sides). Regression-locked by a
1191
- pack -> install -> shim-invocation test (`BORDER_PACK_TEST=1`, wired into CI).
1192
- - Fix: `publint` is an exact-pinned runtime dependency, so `border scan`/npm checks work
1193
- out of the box in consumer installs; README documents the engine posture truthfully.
1194
- - Add: release-coherence seed test pinning the scan User-Agent version to package.json.
1195
-
1196
- ### 0.3.1 (2026-09-10)
1197
- - Add: `border scan [ecosystem:]name@version` — static residue inspection of third-party
1198
- registry packages (npm/PyPI/crates.io/RubyGems), ledger-free by design.
1199
- - Docs: README scan section; crates envelope normalization now logs scrubbed-file hashes.
1200
-
1201
- ### 0.3.0 (2026-09-09)
1202
-
1203
- - **Residue gate (artifact stage).** The blanket install-hook CRITICAL becomes a classified
1204
- family of seven closed `residue-*` rules across tiers T1–T4 plus cross-manager, pairing,
1205
- and gem-unmatched lanes (see "The residue scan"): a hook matching the closed T1 safe-shape
1206
- signature drops to MEDIUM; every unknown shape keeps the original CRITICAL row verbatim.
1207
- Pairing (`# BEGIN <id>` marker blocks) is **detected only** — `residue-pairing-missing`
1208
- fires on the orphaned WRITE, a verified pair still pays its T3 HIGH; the waiver downgrade
1209
- path is the 0.4.0 roundtrip valve. Detection classes: C5 pairing discipline, C9 indirection
1210
- spellings, C10 comment/quote boundaries — evidence frozen in `src/artifacts/RESIDUE-CONTRACT.md`.
1211
- - New `residue: { enabled }` config key (default on; strict; the ONLY skip path for the family,
1212
- and flipping it invalidates cached PASS rows because the toggle rides the fingerprint). The
1213
- residue rule table and classifier sources are now part of the ledger `rulesHash`: editing a
1214
- signature forces a re-check even at an unchanged commit and tree.
1215
- - Boundary stated plainly: static analysis proves *capability*, not *fact*; border is not a
1216
- malware sandbox and never executes what it reads.
1217
-
1218
- ### 0.2.0 (2026-09-05)
1219
-
1220
- - Two new push channels, same doctrine end to end: **crates** (public crates.io only;
1221
- literal `Cargo.toml` coordinates; pre-publish repackage digest-assert) and **rubygems**
1222
- (rubygems.org or any `targets.rubygems.host` gemcutter-compatible host; literal-only
1223
- gemspecs; `s.date` rejection).
1224
- - Platforms are now descriptors in a channel registry: each channel owns its config schema,
1225
- env expansion, coordinate reading, probe, artifact stage, publish argv, and ledger fields
1226
- in one file. The git/npm/pypi legs share the same publish core they already used; their
1227
- behavior is unchanged.
1228
- - Ledger `confirmedVia` gained `crates-json` and `rubygems-json`; 0.1.x ledgers parse
1229
- unchanged.
1230
- - New prerequisites when those targets are configured: `cargo` on `PATH` (measured against
1231
- 1.93.1 via rustup) and `gem` (measured against RubyGems 3.6.7 on ruby 3.3.8); other
1232
- versions are untested by the gate's same-bytes proofs.
1233
-
1234
- ### 0.1.0
1235
-
1236
- - Initial release: git, npm, and PyPI push channels behind the fingerprint PASS gate.
944
+ Full per-version history with the motivating incident for each release:
945
+ [CHANGELOG.md](CHANGELOG.md). Release receipts (build provenance, gate transcripts):
946
+ [docs/release/](docs/release/).
1237
947
 
1238
948
  ## License
1239
949
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "border-customs",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "border-customs",
9
- "version": "0.8.3",
9
+ "version": "0.8.4",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@secretlint/core": "13.0.5",
package/dist/index.js CHANGED
@@ -44,7 +44,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
44
44
  var define_BORDER_BUILD_default;
45
45
  var init_define_BORDER_BUILD = __esm({
46
46
  "<define:__BORDER_BUILD__>"() {
47
- define_BORDER_BUILD_default = { version: "0.8.3", commit: "5f2f4c31d43916bed00a3c5b3448b3f377af4c23", dirty: false, builtAt: "2026-11-02T05:02:18.524Z" };
47
+ define_BORDER_BUILD_default = { version: "0.8.4", commit: "bc8bb704aa17da327ab8c710e458f6ae4b2f368c", dirty: false, builtAt: "2026-11-04T15:24:46.596Z" };
48
48
  }
49
49
  });
50
50
 
@@ -44972,7 +44972,7 @@ import { createHash as createHash20 } from "node:crypto";
44972
44972
  import { basename as basename5 } from "node:path";
44973
44973
  var SCAN_MAX_ARTIFACT_BYTES = 200 * 1024 * 1024;
44974
44974
  var SCAN_REQUEST_TIMEOUT_MS = 6e4;
44975
- var SCAN_USER_AGENT = "border-customs/0.8.3 (+https://github.com/TachikomaGundam/Border-Customs; border scan)";
44975
+ var SCAN_USER_AGENT = "border-customs/0.8.4 (+https://github.com/TachikomaGundam/Border-Customs; border scan)";
44976
44976
  var CRATES_DOWNLOAD_HOST = "https://static.crates.io";
44977
44977
  var defaultScanFetcher = async (url2, init) => {
44978
44978
  if (!/^https?:\/\//.test(url2)) throw new EngineRunError(`border scan refuses non-http(s) URL: ${url2}`, null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "border-customs",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "//": "publint is a runtime dep (exact pin): the npm-stage engine is invoked via bin resolution against the installed layout, so consumers get the publint-fail leg out of the box; the dev suite resolves the same node_modules/.bin/publint — no devDependencies entry is needed for it to stay green.",
5
5
  "description": "Fail-closed git push gate: secret scanning + supply-chain checks before any remote leaves the machine",
6
6
  "type": "module",
package/plugin/border.ts CHANGED
@@ -1,4 +1,4 @@
1
- // border-opencode-plugin v0.8.3
1
+ // border-opencode-plugin v0.8.4
2
2
  // Official opencode plugin adapter for the border fail-closed push gate.
3
3
  // Registers ONE agent tool, `border`, that drives the border CLI — argv-only
4
4
  // (node:child_process execFile, never a shell), top-level commands restricted