# Dependencies
node_modules/
.pnpm-store/

# Build output
dist/
build/
*.tsbuildinfo

# Demo bundle — generated by `npm run demo:build` (see scripts/build-demo-dataset.js
# + scripts/patch-demo-mode.js). The deployed site at skill-map.ai/demo/ is
# built fresh from `ui/` + `fixtures/demo/` on every site:build run.
web/demo/

# Private-workspace changelogs. `changeset version` regenerates a CHANGELOG.md
# for every bumped package, but ui/ and web/ are private (never published), so
# theirs is generated noise we keep out of the repo. The file still exists on
# disk transiently during `release:version` so changesets/action can read it
# for the "Version Packages" PR body; the broad `git add` it commits with skips
# ignored paths, so it never lands in a commit.
ui/CHANGELOG.md
web/CHANGELOG.md

# Test / coverage
coverage/
.nyc_output/

# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Environment
.env
.env.local
.env.*.local

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

# Project-local temp
.tmp/

# skill-map runtime artifacts (local cache, shouldn't be committed).
# Exception: conformance fixtures intentionally ship a `.skill-map/`
# subtree as source (drop-in plugin layouts, etc.) — those MUST be
# tracked so CI's `spec:check` sees the same files the local runner
# does.
.skill-map/
!spec/conformance/fixtures/**/.skill-map/
!spec/conformance/fixtures/**/.skill-map/**
# Built-in Provider conformance fixtures (src/plugins/<id>/providers/<id>/
# conformance/fixtures/) ship the same kind of `.skill-map/` source subtree
# as the spec fixtures, e.g. a committed settings.json that enables an
# experimental provider and pins its lens so the conformance scope exercises
# the provider under its own lens. Track them for the same reason.
!src/plugins/**/conformance/fixtures/**/.skill-map/
!src/plugins/**/conformance/fixtures/**/.skill-map/**
# fixtures/demo, fixtures/codex, fixtures/antigravity and fixtures/opencode
# pin their active lens in a committed `.skill-map/settings.json` so dev
# scopes (and the public demo build, web/scripts/build-demo-dataset.js) scan
# deterministically without relying on auto-detect. Only settings.json is
# tracked; db / settings.local / backups stay ignored.
!fixtures/demo/.skill-map/
!fixtures/demo/.skill-map/settings.json
!fixtures/codex/.skill-map/
!fixtures/codex/.skill-map/settings.json
!fixtures/antigravity/.skill-map/
!fixtures/antigravity/.skill-map/settings.json
!fixtures/opencode/.skill-map/
!fixtures/opencode/.skill-map/settings.json
# fixtures/claude is a tracked manual demo scope, but the Claude
# activity-bridge hook config inside it is machine-generated by the
# activity installer (per-machine wiring, regenerable on install); keep
# it out of the tree.
fixtures/claude/.claude/settings.json

# `.codex/` (OpenAI Codex's directory) is ignored everywhere by default:
# the repo itself may carry one we don't want tracked. The codex dev
# fixture (fixtures/codex) is the deliberate exception, its `.codex/`
# subtree (agents/*.toml, config.toml, hooks.json) IS the fixture, so
# re-include it. Conformance fixtures (spec-owned and built-in-Provider-
# owned) ship the same `.codex/` source subtree, mirror the `.skill-map/`
# negation above so those fixtures are tracked too.
.codex
!fixtures/codex/.codex/
!fixtures/codex/.codex/**
!spec/conformance/fixtures/**/.codex/
!spec/conformance/fixtures/**/.codex/**
!src/plugins/**/conformance/fixtures/**/.codex/
!src/plugins/**/conformance/fixtures/**/.codex/**
!.claude/skills/sm-tutorial/fixtures-data/**/.codex/
!.claude/skills/sm-tutorial/fixtures-data/**/.codex/**

# Dev-fixture lock files. The `fixtures/*/` portfolios declare a narrative
# `express` dependency (pinned exact in package.json), but skill-map only
# SCANS them, no pipeline (web demo, tutorial, CI) ever installs them, so a
# lock file is an incidental artifact of a local `npm`/`pnpm install`. Keep
# the fixtures as pure source (package.json only, like fixtures/demo),
# package-manager-agnostic. Conformance fixtures live elsewhere and are
# unaffected.
fixtures/*/package-lock.json
fixtures/*/pnpm-lock.yaml

# Claude Code / sandbox dotfile mounts. The sandbox virtualises certain
# host dotfiles as /dev/null character devices in the repo root so the
# tool's process cannot read user-level config (shell rc, git identity,
# MCP servers, ripgrep config). They surface as untracked entries in
# `git status` forever; ignoring them keeps the working tree clean.
.bashrc
.bash_profile
.profile
.zshrc
.zprofile
.gitconfig
.gitmodules
.mcp.json
.ripgreprc
.vscode
.claude/commands
.claude/settings.json
.claude/scheduled_tasks.lock
.antigravitycli
.skill-map/settings.local.json
.skill-map/skill-map.db
.skill-map/serve.json

# Generated dev-server index (ui/scripts/stamp-dev-index.mjs)
ui/src/index.dev.html

# Private campaign/communication repo (nested git repo, never published)
/other/
