# 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/` + `ui/fixtures/demo-scope/` 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-scope and fixtures/codex 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-scope/.skill-map/
!fixtures/demo-scope/.skill-map/settings.json
!fixtures/codex/.skill-map/
!fixtures/codex/.skill-map/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 is the deliberate exception, its `.codex/agents/*.toml` sub-agents
# ARE the fixture, so re-include that subtree. 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/**

# 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
