feat: add safe cross-platform upstream updater (#98)

* feat: add safe upstream update scripts

* fix(updater): use portable PowerShell temp path

---------

Co-authored-by: Wibias <37517432+Wibias@users.noreply.github.com>
This commit is contained in:
Joseph MaglyandWibias authored and GitHub committed 2026-07-15 19:56:25 -04:00
1 parent 266655abcf
commit 916c260fd8
8 files changed
+1710 -2

No files matched your search

+55 -1
View File
@@ -34,7 +34,7 @@ Three things set it apart:
2. **Keyless.** The AI coding agent already on your machine is the backbone. No API keys, no second bill, no gatekeeper.
3. **Honest about scope.** The [status table](#what-ships-today) marks exactly what's stable, experimental, or roadmap — because red-teaming shouldn't be a priesthood, and it damn sure shouldn't run on vibes.
**Jump to** → [Quick start](#quick-start) · [What it hunts](#what-it-hunts) · [What ships today](#what-ships-today) · [Benchmarks](#benchmarks) · [Architecture](#architecture) · [Docs](#documentation)
**Jump to** → [Quick start](#quick-start) · [Updating](#updating-from-upstream) · [What it hunts](#what-it-hunts) · [What ships today](#what-ships-today) · [Benchmarks](#benchmarks) · [Architecture](#architecture) · [Docs](#documentation)
## ⚠️ Authorized use only
@@ -101,6 +101,60 @@ npm run verify-claims # re-derives every headline from committed JSO
Library/SDK usage, the full HTTP API, and MCP setup live in [docs/](docs/).
## Updating from upstream
If you installed from a release tarball or copied the tree instead of tracking `git pull`, use the built-in updater to sync with [github.com/elder-plinius/T3MP3ST](https://github.com/elder-plinius/T3MP3ST) without losing local secrets or bench output. It shows a numbered plan, asks **y/N** before changing anything, then runs `npm install`.
```bash
npm run update # interactive sync from upstream main
npm run update:dry # preview only — no git or npm changes
npm run update:hard # hard reset to upstream/main (still restores protected paths)
```
Works on Windows (PowerShell), macOS, Linux, and WSL. Requires **git** and **npm** on your PATH.
### Safety modes
The updater is destructive **only when explicitly requested**:
| Command | What it does | Local changes |
|---|---|---|
| `npm run update` | Default interactive sync | `git merge upstream/main`; protected paths backed up and restored |
| `npm run update:dry` | Read-only preview | No git init, fetch, merge, reset, or `npm install`; safe on tarball installs |
| `npm run update:hard` | Opt-in hard reset | `git reset --hard upstream/main`; protected paths still restored |
All non-dry-run modes ask **y/N** before changing anything. Pass `--force` only in trusted automation. On the first-time path (no commits yet), the updater replaces the working tree with the upstream snapshot, but protected paths are backed up first and restored afterward.
### Protected paths (inside the repo)
Before replacing files, the updater backs up anything on disk that matches [`scripts/update-protected.txt`](scripts/update-protected.txt), then restores it after sync. **Only paths that exist locally are affected** — if you never created them, nothing happens.
| Path | Why it's protected |
|---|---|
| `.env`, `.env.*` | API keys and local env overrides. `!.env.example` is an exception — the template is **not** protected so upstream can update it. |
| `.keys.local` | One-off key paste file loaded by bench scripts (e.g. `VENICE_API_KEY`) without touching `.env`. |
| `.keys.bounty.json` | HackerOne / Bugcrowd / similar platform credentials. |
| `bench/cybench/corpus-stage/` | Large cloned Cybench corpus (not redistributed; expensive to re-download). |
| `bench/cybench/service-stage/`, `bench/cybench/challenges/` | Per-run Cybench Docker staging and challenge trees (regenerable, but slow to rebuild). |
| `bench/xbow/stage/`, `bench/xbow/challenges/` | XBOW/XBEN challenge staging (large third-party trees). |
| `bench/wild-hunt/` | Cold-hunt findings, PoCs, disclosure drafts, and campaign results — pre-coordination vuln material. |
| `bench/decomposition-results/` | White-box decomposition run JSON (may contain unreported analysis). |
| `bench/refusal-frontier/` | Refusal-boundary probe artifacts (raw model responses). |
| `bench/nyu/` | Staged NYU CTF content from `nyu-prep.mjs`. |
| `docs/disclosures/` | Generated vendor disclosure packages (`disclosure-gen` output). |
| `reports/` | Engagement and hunt reports (persistent output; same tree as Docker volume mounts in deployment setups). |
| `evidence/` | PoCs, screenshots, and other finding evidence kept across updates. |
Add your own patterns in `scripts/update-protected.local.txt` (optional local overlay; same glob syntax as the main manifest).
### Never touched (outside the repo)
These live outside the project tree — an update never reads or writes them:
- `%APPDATA%\t3mp3st-nodejs\Config\config.json` (or the macOS/Linux `conf` store path) — saved by `npm run setup`
- War Room browser **localStorage** on the War Room origin
- Local agent auth (`~/.codex`, `%LOCALAPPDATA%\hermes`, etc.)
## What ships today
The framework is an 8-operator kill chain, and this table won't blow smoke about it. **Recon is a live, tool-backed engine** — and the teeth are already real: 90.1% pass@1 on XBEN, 8/10 held-out post-cutoff CVEs pinned to exact file/line/CWE, and a coordinated-disclosure pipeline that's live enough to have drafts held for vendor coordination right now. What's *not* proven is the swarm. Each downstream operator — Exploiter, Infiltrator, Exfiltrator, Ghost — runs the **same real, tool-backed ReAct loop as recon** (real exploit tools, not stubs), but the headline numbers came from a single agent, not the coordinated 8-operator cell, and end-to-end swarm exploitation is unbenchmarked and still unreliable. The engine is real; the swarm is the part still earning its stripes. Loud where we've earned it, blunt about the rest.