# Build
node_modules/
dist/
*.tsbuildinfo

# Grammar WASM files, fetched from pinned npm packages by scripts/build-grammars.ts.
# Published through package.json "files"; never committed.
grammars/

# Alternate package managers — we standardize on npm (package-lock.json is canonical)
bun.lock
yarn.lock
pnpm-lock.yaml

# OS
.DS_Store

# IDE / Agent local state
.claude/
.bravos/

# GuardLink runtime config (API keys - do not commit)
.guardlink/config.json

# Generated outputs at repo root (canonical samples live in docs/examples/).
# Running `guardlink dashboard .` or `guardlink report .` from the repo root
# writes here by default — those local copies should never be committed.
/threat-dashboard.html
/threat-model.md
/threat-model.json
/guardlink-pentest.html
/guardlink-pentest.json
/guardlink-pentest.sarif

# Debug / internal
_debug.ts

# Local scratch at the repo root. Paper drafts, renders and one-off exports
# land here while writing; none of it is source, and some of it is large
# binary. Anchored to the root so a legitimate output/ or tmp/ deeper in the
# tree is still tracked.
/output/
/tmp/

# Throwaway probes. A one-off script written to watch a fix behave is not a
# test — nothing includes, typechecks or lints a path like this, so a committed
# one is invisible until someone six months from now assumes it is load-bearing.
# Anything worth keeping belongs in tests/ where the suite runs it.
/.tmp-probe/
/.tmp-*/

# Packing artifacts. `npm pack` / `npm pack --dry-run` write the tarball into
# the repo root, and a stray guardlink-<version>.tgz committed alongside the
# source is both noise and a stale copy of a published artifact.
*.tgz
