{"_id":"@billthegoatnotme/driftcheck","_rev":"2-b21691b0271b7a80a2c1f172b97d333f","name":"@billthegoatnotme/driftcheck","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@billthegoatnotme/driftcheck","version":"1.0.0","keywords":["cli","drift","git","documentation","verification"],"author":{"url":"https://github.com/billthegoatnotme","name":"The Artchitect"},"license":"MIT","_id":"@billthegoatnotme/driftcheck@1.0.0","maintainers":[{"name":"billthegoatnotme","email":"billthegoatnotme@gmail.com"}],"homepage":"https://github.com/billthegoatnotme/driftcheck#readme","bugs":{"url":"https://github.com/billthegoatnotme/driftcheck/issues"},"bin":{"driftcheck":"bin/driftcheck.mjs"},"dist":{"shasum":"442ae395b326b4ef158e18d7da973107c8c072f9","tarball":"https://registry.npmjs.org/@billthegoatnotme/driftcheck/-/driftcheck-1.0.0.tgz","fileCount":11,"integrity":"sha512-xRtxjFYGqXGoQcGCsPPu7XDmP50odaxSLMH/F43SQaGOuD6fIkWjc7ETvySe2FBbBFqVqWE740WJDUI2yKoTkw==","signatures":[{"sig":"MEYCIQC0cjKeIiegIv5OiV5AMl5J7DFKncPKjFTGOhWBiqfOnAIhALlfnYAWMYRH3UTLDVltQXqLA/vZH8AGgYlqjqeIfylM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65310},"type":"module","engines":{"node":">=18"},"gitHead":"badb52de172f47c272f0c0de9f162bf71cef94b0","scripts":{"test":"node --test"},"_npmUser":{"name":"billthegoatnotme","email":"billthegoatnotme@gmail.com"},"repository":{"url":"git+https://github.com/billthegoatnotme/driftcheck.git","type":"git"},"_npmVersion":"11.13.0","description":"A truth instrument for three kinds of drift: repo state, reference docs, and thread-to-thread continuity.","directories":{},"_nodeVersion":"26.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/driftcheck_1.0.0_1788451628438_0.9903306305381112","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"_id":"@billthegoatnotme/driftcheck@1.1.0","bin":{"driftcheck":"bin/driftcheck.mjs"},"bugs":{"url":"https://github.com/billthegoatnotme/driftcheck/issues"},"dist":{"shasum":"ff4ec8d08a130b8396b4928ce304521a131e2a31","tarball":"https://registry.npmjs.org/@billthegoatnotme/driftcheck/-/driftcheck-1.1.0.tgz","fileCount":11,"integrity":"sha512-5C6ff1vZfKvm3FrxFTTzvb5kdo2BzxtFga49UgxI+NNSM1G2YVVW5AQwUuaoGjO24+oj35x+nwtln7ZbuxEpEA==","signatures":[{"sig":"MEUCIQC+hfi4CtRTgKW8jeChnVE7edmeRJftPwhCCQq2Hatx0wIgW8aEaQiL4ayLCBG69SDeRdE9z88hWi5UBJ5MYtmradQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCALeuU3i3nOPbKniQTtQRJJ1e5iKtrZBjblRQJTbxn3QIgdmtyn8g21AIg8NhNZw5zhPTGR38KaK3yDDqNLgb6PWc="}],"unpackedSize":84956},"name":"@billthegoatnotme/driftcheck","type":"module","author":{"url":"https://github.com/billthegoatnotme","name":"The Artchitect"},"engines":{"node":">=18"},"gitHead":"34ada635a17b6eb3d07ce4e4e318da93f32112ba","license":"MIT","scripts":{"test":"node --test"},"version":"1.1.0","_npmUser":{"name":"billthegoatnotme","email":"billthegoatnotme@gmail.com"},"homepage":"https://github.com/billthegoatnotme/driftcheck#readme","keywords":["cli","drift","git","documentation","verification"],"repository":{"url":"git+https://github.com/billthegoatnotme/driftcheck.git","type":"git"},"_npmVersion":"11.13.0","description":"A truth instrument for three kinds of drift: repo state, reference docs, and thread-to-thread continuity.","directories":{},"maintainers":[{"name":"billthegoatnotme","email":"billthegoatnotme@gmail.com"}],"_nodeVersion":"26.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/driftcheck_1.1.0_1790625129049_0.7033157201185192"}}},"time":{"created":"2026-09-03T16:07:08.226Z","modified":"2026-09-28T19:52:09.288Z","1.0.0":"2026-09-03T16:07:08.584Z","1.1.0":"2026-09-28T19:52:09.143Z"},"bugs":{"url":"https://github.com/billthegoatnotme/driftcheck/issues"},"author":{"url":"https://github.com/billthegoatnotme","name":"The Artchitect"},"license":"MIT","homepage":"https://github.com/billthegoatnotme/driftcheck#readme","keywords":["cli","drift","git","documentation","verification"],"repository":{"url":"git+https://github.com/billthegoatnotme/driftcheck.git","type":"git"},"description":"A truth instrument for three kinds of drift: repo state, reference docs, and thread-to-thread continuity.","maintainers":[{"name":"billthegoatnotme","email":"billthegoatnotme@gmail.com"}],"readme":"# driftcheck\r\n\r\nA truth instrument for three kinds of drift: repo *state* that's moved\r\nsince you last checked it, reference *documentation* that no longer\r\ndescribes the code it names, and *continuity* — whether a new working\r\nthread has what it needs to pick up cleanly, or loses everything the\r\nlast one learned.\r\n\r\nAll three failure modes have the same shape — a claim was true once,\r\nand nobody told it that it stopped being true. `driftcheck` exists to\r\ncatch that before you act on it.\r\n\r\n```\r\ndriftcheck repo [path] [--tests] [--build]\r\ndriftcheck docs [path] [--file <path>]...\r\ndriftcheck spec [path]\r\ndriftcheck spec close [path]\r\ndriftcheck vitest [path] [--file <path>]...\r\n```\r\n\r\n## Why\r\n\r\nTrusting a stale claim is expensive. \"The PR is merged,\" \"the tests\r\npass,\" \"the DB is up to date,\" \"this function still lives where the\r\ndocs say it does\" — each one is cheap to assume and costly to have been\r\nwrong about, especially for an AI agent or CI job re-deriving context\r\nevery session with no memory of what it checked last time.\r\n\r\n`driftcheck` interrogates a repo and reports verdict-first, instead of\r\nletting a stale assumption stand unchallenged.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install -g @billthegoatnotme/driftcheck\r\ndriftcheck --help\r\n```\r\n\r\nOr clone and link it locally instead:\r\n\r\n```bash\r\ngit clone https://github.com/billthegoatnotme/driftcheck.git\r\ncd driftcheck\r\nnpm link\r\ndriftcheck --help\r\n```\r\n\r\nRun the test suite with `npm test` (Node's built-in test runner —\r\nno extra dependencies).\r\n\r\n## `driftcheck repo`\r\n\r\nChecks whether your picture of the repo's *state* is current:\r\n\r\n```bash\r\ndriftcheck repo                    # git / open PRs / DB migrations (fast)\r\ndriftcheck repo --tests            # + test suite, with flake-vs-real triage\r\ndriftcheck repo /path/to/other/repo --tests --build\r\n```\r\n\r\n- **GIT** — HEAD vs. a fresh fetch of `origin/main`: ahead/behind counts,\r\n  a dirty tree, stale local branches already merged upstream, any local\r\n  branch with real commits *not* in `origin/main` whose own PR already\r\n  shows `MERGED`/`CLOSED` on GitHub (work pushed after the merge\r\n  happened, invisible to both the sync check above and the PRS check\r\n  below — see the note after this list), and any agent worktrees under\r\n  `.claude/worktrees` that can silently pollute test or build globs,\r\n  and any spec or handoff file outside the gitignored `agendas/` that\r\n  git would commit (say, a handoff copied up to the root to paste\r\n  somewhere).\r\n- **PRS** — open pull requests via the `gh` CLI. If a PR you believed\r\n  was merged still shows up here, it isn't merged yet.\r\n- **DB** — checks a `\"driftcheck:db\"` script in the target's\r\n  `package.json` if one exists, so any ORM can plug in: exit `0` means\r\n  no drift, exit `1` means it found some, anything else (unreachable\r\n  DB, missing command, a script bug, a timeout) is reported\r\n  inconclusive (`??`) rather than assumed to be drift. No output\r\n  parsing happens beyond the exit code; that convention is the whole\r\n  interface, and it takes priority over the Prisma fallback below if\r\n  both are present. Without that script,\r\n  falls back to Prisma migration drift via `prisma migrate status`\r\n  loaded through `.env.local`: skipped cleanly (verdict `—`) on any\r\n  repo without `prisma/schema.prisma`; skipped as inconclusive (`??`)\r\n  if Prisma is present but `.env.local` isn't.\r\n- **TESTS** (`--tests`) — runs the `test` script from the target repo's\r\n  own `package.json`. When that script uses Vitest, failures are\r\n  re-run in isolation and classified: fails again in isolation = REAL;\r\n  passes in isolation = FLAKY (a known class under full-suite load, not\r\n  a regression). For any other test runner, only pass/fail is reported\r\n  — per-file flake classification depends on Vitest's own output format\r\n  and file-targeting convention, and doesn't generalize safely.\r\n- **BUILD** (`--build`) — runs `npm run build`.\r\n\r\nA merged PR only means the commits it had *at merge time* made it into\r\n`origin/main` — if a branch gets pushed to again afterward, those new\r\ncommits aren't included, even though the PR itself still shows\r\n`MERGED`. That's invisible to the ahead/behind check above (it only\r\nlooks at your current branch) and to the PRS check (it only lists\r\n*open* PRs), so GIT checks every other local branch for exactly this:\r\nreal commits absent from `origin/main` whose own PR is already closed.\r\n\r\nEvery run appends a line to `<repo>/.driftcheck/repo-history.jsonl` —\r\nyour own longitudinal log of that repo's health, run over run. Consider\r\nadding `.driftcheck/` to the repo's `.gitignore` if you don't want it\r\ncommitted.\r\n\r\n## `driftcheck docs`\r\n\r\nChecks whether a project's own reference document — `CLAUDE.md`,\r\n`AGENTS.md`, a README's own checklist, or anything else that names\r\nfiles and functions by exact identifier — still accurately describes\r\nthe code it points at:\r\n\r\n```bash\r\ndriftcheck docs                              # checks whichever of the defaults exist\r\ndriftcheck docs --file CONTRIBUTING.md       # check a specific file instead\r\ndriftcheck docs --file CLAUDE.md --file docs/API.md   # check several\r\n```\r\n\r\nBy default it looks for `CLAUDE.md`, `AGENTS.md`, and `README.md` in\r\nthe target repo's root and checks whichever of those actually exist.\r\nPass one or more `--file <path>` flags to check specific files instead.\r\n\r\nIt extracts and verifies exactly two reference shapes from every\r\nbacktick span in the document:\r\n\r\n- **`file → function()`** (the arrow may be written as `→` or `->`) —\r\n  verifies the file exists, then that the named function/const/class is\r\n  still declared there. If it's not there but is declared somewhere\r\n  else in the repo, it says so — probably moved or renamed, not\r\n  deleted.\r\n- **Bare `path/to/file.ext`** — any backtick-quoted path with a real\r\n  directory component and a source-like extension. Verified with a\r\n  plain existence check.\r\n\r\nThis is deliberately narrow. It does **not** try to check every\r\nbacktick span — bare filenames with no directory component (prose\r\nshorthand, not a path claim), identifiers with no file context, enum\r\nvalues, JSON keys. Guessing at those trades precision for coverage, and\r\na checker that cries wolf on ordinary prose gets ignored — an ignored\r\ntruth instrument is worse than no instrument at all. If your docs use a\r\ndifferent reference convention entirely, this tool will find nothing to\r\ncheck and say so plainly, rather than guess.\r\n\r\nEvery run appends a line to `<repo>/.driftcheck/docs-history.jsonl`.\r\n\r\n## `driftcheck spec`\r\n\r\nScaffolds a versioned project spec — a fixed governance document (how\r\nAI and human collaborators work together on this repo, read fresh each\r\nrun from [`templates/drift_check_manifesto.md`](templates/drift_check_manifesto.md)\r\nso it can never drift from what actually gets generated) plus a \"What We're\r\nBuilding\" section populated from a live `driftcheck repo`/`docs` scan,\r\nand a Checkpoint Log for tracking what happened over time:\r\n\r\n```bash\r\ndriftcheck spec              # creates agendas/<repo>_spec_v0_01.md — no-op if one already exists\r\ndriftcheck spec close        # checkpoints forward: writes v0_0N + a paired thread-handoff doc\r\n```\r\n\r\nEverything `spec` writes lives in one folder, `agendas/` — see\r\n[Agendas](#agendas) below for the layout, plans, and privacy.\r\n\r\n`driftcheck spec` is idempotent — safe to run any time, it only ever\r\ncreates the file once. `driftcheck spec close` is deliberate: it writes\r\nthe next `<repo>_spec_v0_0N.md` (state re-scanned, prior Checkpoint Log\r\nentries carried forward, a new entry stubbed in) and a\r\n`<repo>_thread_handoff_v0_0N.md` meant to be pasted at the start of the\r\nnext working thread.\r\n\r\nThe reflective sections — the current checkpoint's \"what happened,\" the\r\nhandoff's \"what to do next\" — are left as explicit prompts, not\r\nauto-written. Narrating a working session is a language-generation\r\ntask, not a verification one; a deterministic script guessing at *why*\r\nsomething happened is exactly the kind of unearned confidence this\r\ntool exists to avoid elsewhere. Fill those in yourself, or have your AI\r\ncollaborator do it before closing out — the same way this project's\r\nown spec and handoff docs were actually written.\r\n\r\nThe thread handoff is the actual continuity mechanism this subcommand\r\nexists to automate: a short document meant to be pasted at the start of\r\nthe *next* working session so it doesn't start cold. It points back at\r\nthe spec's latest Checkpoint Log entry rather than repeating it, and\r\ncarries only what a fresh session actually needs — what to do next, and\r\nany open questions left deliberately unresolved rather than\r\nre-litigated. This project uses `driftcheck spec` on itself, privately,\r\nin its own gitignored `agendas/`; [`examples/agendas/`](https://github.com/billthegoatnotme/driftcheck/tree/main/examples/agendas)\r\nis a public, made-up sample of what a filled-in checkpoint looks like.\r\n\r\n`<repo>` in the generated filenames is the target's own name (from\r\n`package.json`'s `name` field, falling back to the directory name), not\r\na literal string.\r\n\r\n`close` patches the existing spec in place rather than regenerating it\r\nfrom the template — only the \"Detected\" scan snapshot gets refreshed\r\nand a new Checkpoint Log entry gets prepended; everything else,\r\nincluding any hand-edits to the governance sections or \"Purpose,\"\r\ncarries forward untouched. (An earlier version of this feature\r\nregenerated the whole document from the template on every close, which\r\nsilently destroyed any real customization — filling in the Pipeline\r\nArchitecture table, writing real Purpose content — the moment the next\r\ncheckpoint ran. That's a real data-loss risk for anyone actually using\r\nthis file, not a cosmetic one, so it was corrected rather than left as\r\na documented limitation.) If a spec file has been edited enough that\r\n`close` can't find one of the section markers it patches against, it\r\nstill checkpoints — it just reports which marker it couldn't find\r\ninstead of silently skipping the update.\r\n\r\n`spec`/`spec close` also detect a subtler failure: the repo name that\r\ndrives the filename comes from `package.json`'s `name` field, and if\r\nthat field changes (or the file disappears) between runs, the detected\r\nname changes too — silently starting a second, orphaned version\r\nsequence under the new name instead of continuing the first. Both\r\ncommands scan `agendas/` and the repo root for any other `*_spec_v0_NN.md` under a different\r\nname on every run and report it, rather than letting that happen\r\nquietly. Nothing is lost either way — it's just easy to miss without\r\nthe warning.\r\n\r\n### Agendas\r\n\r\n`agendas/` is where continuity lives — the current checkpoint, the plans\r\nmade on the way to the next one, and everything that came before:\r\n\r\n```\r\nagendas/\r\n  <repo>_spec_v0_NN.md              the current spec\r\n  <repo>_thread_handoff_v0_NN.md    the current handoff\r\n  planning/                         plans for the next checkpoint\r\n  previous/\r\n    <repo>_spec_previous/\r\n    <repo>_thread_handoff_previous/\r\n    <repo>_plan_previous/\r\n```\r\n\r\nOnly the current spec and handoff ever sit loose in `agendas/`, so\r\nthere's never a question of which one is live. `spec`/`spec close` warn\r\nabout anything else found there, without moving it.\r\n\r\n**Plans.** Mid-work plans — the ones a thread produces for the *next*\r\ncheckpoint to address — go in `agendas/planning/`, named\r\n`<repo>_<plan_name>.<ext>`. Any file type works: markdown, a PDF, a\r\nsketch, a spreadsheet. driftcheck doesn't template them or track their\r\nstatus. At `spec close`, the new handoff lists every plan from the\r\ncycle, oldest first, each with its last-edited date written in as plain\r\ntext (file timestamps don't survive copying, syncing, or being pasted\r\ninto a new thread; that line does). Then `<repo>_` plans move to\r\n`previous/<repo>_plan_previous/`, so `planning/` starts each cycle\r\nempty. Files without the prefix are listed but left where they are —\r\ndriftcheck only moves files it can tell are its own.\r\n\r\n**Nothing is overwritten or deleted.** Every older spec, handoff, and\r\nplan is moved, never removed. If a name is already taken in an archive\r\nfolder, the newcomer gets `_2`, `_3`, … before its extension and the\r\noriginal keeps its plain name. The output line reports everything that\r\nmoved.\r\n\r\n**Private by default.** The first `spec` run adds a bare `/agendas/`\r\nline to `.gitignore` — specs, handoffs, and plans are a working record,\r\nnot necessarily something to publish. Remove that line if you want them\r\ncommitted. Because they aren't in git, they aren't in git's history\r\neither: back `agendas/` up the way you back up anything else local.\r\n`driftcheck repo` separately warns about any spec or handoff file sitting\r\noutside `agendas/` where git would pick it up.\r\n\r\n**Upgrading.** A repo using the older layout — spec and handoff files\r\nand their `_previous/` folders in the repo root — is moved into\r\n`agendas/` automatically on the next `spec` or `spec close`, with each\r\nmove reported. Only driftcheck's own zero-padded filenames move; a\r\nhand-written look-alike such as `<repo>_spec_v0_1.md` is left alone.\r\n\r\n### With or without AI\r\n\r\nAgendas are plain files in a predictable place, so they work the same\r\nfor a person as for an AI. Any AI that can run commands in your local\r\nrepo (Claude Code, Codex, Cursor, and the like) can run driftcheck and\r\nread `agendas/` directly. A chat-only AI can't see a gitignored folder\r\nthrough a GitHub connection — paste it the current handoff, which is\r\nwhat the handoff is written for.\r\n\r\n## `driftcheck vitest`\r\n\r\nNot a fourth drift check — a scaffolding companion. Wires up Vitest for\r\na project that doesn't have it yet, and optionally generates stub test\r\nfiles:\r\n\r\n```bash\r\ndriftcheck vitest                        # config + scripts.test, no stub files\r\ndriftcheck vitest --file src/lib.js      # + a stub test file for that source file\r\n```\r\n\r\nCreates `vitest.config.mjs` if no Vitest or Vite config already exists\r\n(a `vite.config.*` with its own `test: {...}` block counts), and adds\r\n`\"test\": \"vitest run\"` to `package.json` if `scripts.test` isn't already\r\nset — both idempotent, both leave anything already there alone rather\r\nthan overwriting it.\r\n\r\n`--file <path>` (repeatable) additionally scaffolds `<file>.test.<ext>`\r\nnext to that source file — one `describe`/`test()` stub per exported\r\n`function`/`class`/`const`/`let`, plus plain `export { a, b }` lists,\r\nfound via the same precise, un-guessed patterns `driftcheck docs`\r\nalready uses. Aliases (`export { a as b }`) and re-exports\r\n(`export { x } from './y'`, naming something from a different file)\r\nare still left alone — genuinely ambiguous, not just unhandled. Never\r\noverwrites an existing test file.\r\n\r\n**It does not write real assertions, on purpose.** Every stub throws\r\nimmediately with a \"not yet implemented\" message — deciding what\r\ncorrect behavior looks like requires actually understanding the code,\r\nwhich is a reasoning task, not something this tool should guess at.\r\nGuessing here would manufacture false confidence, the exact failure\r\n`driftcheck docs` and `driftcheck repo` both exist to catch elsewhere.\r\nThe stubs are a real, verified starting point — install Vitest and run\r\nthem and they genuinely fail — meant for a human or an AI collaborator\r\nto fill in with real assertions, not something to leave as-is.\r\n\r\n## Verdict legend\r\n\r\n| Mark | Meaning |\r\n|------|---------|\r\n| `OK` | checked, matches |\r\n| `⚠️` | checked, drifted — read the detail line |\r\n| `❌` | checked, failed |\r\n| `??` | inconclusive — couldn't verify, check by hand |\r\n| `—`  | not applicable, cleanly skipped |\r\n\r\n## Limitations\r\n\r\n- `driftcheck repo`'s DB check has no built-in ORM-specific knowledge\r\n  beyond the Prisma fallback; every other ORM needs a `\"driftcheck:db\"`\r\n  script wired up in `package.json`, using the exit-code convention\r\n  above (`0`/`1`/anything else). It surfaces up to 3 lines of the\r\n  script's own output on drift, but still can't parse migration-level\r\n  detail out of arbitrary formats the way the Prisma path does — that\r\n  detail is only as good as what the script itself prints.\r\n- `driftcheck repo`'s flake-vs-real test triage is Vitest-specific;\r\n  other runners get pass/fail only.\r\n- `driftcheck repo`/`driftcheck vitest` operate on one target directory\r\n  — they don't auto-discover a monorepo's separate `package.json`\r\n  files. Point them at each package individually (e.g.\r\n  `driftcheck repo client --tests`, `driftcheck repo server --tests`\r\n  for a client/server split with no root-level `package.json`).\r\n- `driftcheck docs`'s reference matching supports the arrow-pair and\r\n  bare-path conventions described above and nothing else out of the\r\n  box. Extending it to other conventions means editing the two regexes\r\n  in `src/docs.mjs` for now.\r\n- `driftcheck docs`'s declaration check strips `//` and `/* */`\r\n  comments and quoted-string contents before matching, so a removed\r\n  function only mentioned in a comment or a string isn't misread as\r\n  still declared — but it's a heuristic scan, not a real JS/TS parser.\r\n  A template literal with an embedded `${...}` expression, or a regex\r\n  literal containing `//`, can still evade it in either direction.\r\n- The \"moved/renamed?\" search in `driftcheck docs` reads the repo's own\r\n  `.gitignore` for simple top-level directory names to skip, on top of\r\n  a hardcoded list of common ones — not a full gitignore parser.\r\n  Wildcards, negations, and nested paths (anything with a `/` other\r\n  than one trailing slash) aren't handled, and are walked as normal.\r\n- `driftcheck spec`'s Pipeline Architecture table ships as a fill-in\r\n  placeholder, not auto-detected roles — it's a governance template,\r\n  not something inferable from repo state. Edit the wording for all\r\n  future specs by editing `templates/drift_check_manifesto.md` directly; it's read\r\n  fresh on every run, not baked into the code.\r\n- `driftcheck spec close` only patches the \"Detected\" section and the\r\n  Checkpoint Log — if you restructure a spec file heavily enough that\r\n  those markers can't be found, it reports that plainly rather than\r\n  silently failing to update, but it also won't guess where to patch.\r\n- `driftcheck vitest`'s export detection covers `export function`/\r\n  `class`/`const`/`let NAME` and plain `export { a, b }` lists. Aliased\r\n  entries (`export { a as b }`) and re-exports (`export { x } from\r\n  './y'`) still aren't extracted — genuinely ambiguous which name a\r\n  stub should import under, not just unhandled.\r\n- `driftcheck vitest --file` scaffolds one file at a time, on purpose —\r\n  it never scans and stubs an entire repo unprompted.\r\n\r\n## Support\r\n\r\nIf driftcheck saves you time, sending something this way is appreciated\r\nbut never required:\r\n\r\n| Network | Address |\r\n|---|---|\r\n| Solana | `2iPLEu3duHcaieLPaoVfrrk6UPurmdeT4qobtiFNd2SZ` |\r\n| Bitcoin (Taproot) | `bc1p6puaec5q4gvl7fd64aefrekq4fdkh9a0rtxugdd2q4exrqswkggqzaxf42` |\r\n| Ethereum | `0x1155F41781b0edc9F26a28438E841B3e64c31509` |\r\n| HyperEVM | `0x1155F41781b0edc9F26a28438E841B3e64c31509` (same address — EVM-compatible) |\r\n| Robinhood Chain | `0x1155F41781b0edc9F26a28438E841B3e64c31509` (same address — EVM-compatible) |\r\n\r\nDouble-check the network before sending. The Bitcoin address above is a\r\nTaproot (`bc1p...`) address — some older wallets/exchanges can't send\r\nto it.\r\n\r\n## Author\r\n\r\nBuilt by [The Artchitect](https://github.com/billthegoatnotme). hand written - disclaimer: I directed how this got built and verified the results, the actual implementation happened through real back-and-forth with Claude, not word-for-word dictation. The tool itself has zero AI dependency at runtime; I checked. AI made the building faster and more disciplined. It didn't do the thinking for me. I hope that clears up some of the confusion i'm seeing. i don't want to obfuscate the truth.\r\n\r\n## License\r\n\r\nMIT. See [LICENSE](LICENSE).\r\n","readmeFilename":"README.md"}