node_modules/
dist/
dist-test/
logs/

# Dashboard SPA (#340) — `dashboard/dist/` holds Vite build output, fully
# gitignored. The directory is preserved with a `.gitkeep` because the
# tarball ships `dashboard/dist/` via root `package.json#files[]`; the real
# bundle is regenerated by `npm run build:dashboard` (CI, prepublish,
# local dev). The `dashboard-handler.test.ts` suite uses its own fixture
# dir, so no committed placeholder index.html is needed post-PR-2.
!dashboard/dist/
dashboard/dist/*
!dashboard/dist/.gitkeep

.env
.mcp.json
*.js
*.js.map
*.d.ts
!jest.config.js
# Compiled scripts go to dist/scripts/ (gitignored via dist/). Source in scripts/*.ts.
# Exception: plain CommonJS scripts that run without a build step.
!scripts/lint-skip-reasons.js
!scripts/gh-app-token.js
!scripts/check-surface-drift.js
!scripts/check-no-stale-scaffold.js
!scripts/check-pi-drift.js
!scripts/strip-mock-adapter.js
!scripts/verify-tarball.js
!scripts/check-bundle-present.js
# Dashboard ESLint flat config — JS module, intentionally committed.
!dashboard/eslint.config.js
temporal-data.db

# Debug artifacts from `temporal workflow show > foo-history.json` (#207).
*-history.json

# Temporary design handoff extraction directories.
.tmp-design-handoff/

# Heap-snapshot harness output (scripts/dev/heap-snapshot-336.sh, dev-only).
scripts/dev/.out/

# Never commit secrets. Private keys, GitHub App .pem files, etc.
secrets/
*.pem
*.p12
*.pfx
*.key

pnpm-lock.yaml

.wolf/
.claude/settings.json
.claude/settings.local.json
.claude/worktrees/
.claude/rules/openwolf.md
.claude/
pnpm-workspace.yaml
