| name | gitignore-pattern-matching |
| description | .gitignore-compatible pattern matching for agent file access control. Ignore rule parsing, negative patterns, per-directory scope, and building file access gates from gitignore-style rules. Sources: kaelzhang/node-ignore. |
/gitignore-pattern-matching
When to Use
- Agent needs to skip files matching
.gitignore patterns (avoid reading secrets/node_modules)
- Building an access-control gate: which files an agent is allowed to read
- Parsing
.claudeignore or custom ignore files for sandbox boundaries
- Filtering output of file listings before passing to LLM context
Do NOT use for
- Security-critical access control alone (filesystem permissions are ground truth)
- Glob matching without gitignore semantics (use [[glob-minimatch-patterns]])
Basic ignore check
import ignore from 'ignore'
import { readFileSync, readdirSync } from 'fs'
const ig = ignore()
ig.add(readFileSync('/workspaces/yana-ai/.gitignore', 'utf8'))
ig.add([
'releases/logs/',
'*.env',
'**/.env*',
'node_modules/',
'**/__pycache__/',
])
ig.ignores('releases/logs/tool-proxy.log')
ig.ignores('core/rules/foo.md')
Filter file list
function listAgentReadableFiles(projectRoot: string): string[] {
const ig = ignore()
try {
ig.add(readFileSync(`${projectRoot}/.gitignore`, 'utf8'))
} catch { }
ig.add(['*.secret','**/*.key','**/*.pem','*.env*','.claude/settings*'])
const allFiles = getAllFiles(projectRoot)
const relative = allFiles.map(f => f.replace(projectRoot + '/', ''))
return ig.filter(relative)
}
Parse custom .claudeignore
import { existsSync, readFileSync } from 'fs'
function loadClaudeIgnore(root: string): ReturnType<typeof ignore> {
const ig = ignore()
const claudeignorePath = `${root}/.claudeignore`
if (existsSync(claudeignorePath)) {
ig.add(readFileSync(claudeignorePath, 'utf8'))
}
ig.add(['**/*.env','**/*.key','**/*.pem','**/*.p12','**/*.pfx','**/.aws/'])
return ig
}
Bash equivalent
git -C /workspaces/yana-ai ls-files --cached --others --exclude-standard \
| grep -v '^releases/logs/'
git check-ignore -v releases/logs/session.log
Anti-Fake-Pass Checklist
❌ Absolute paths passed to ig.ignores() → always returns false (must be relative)
❌ Leading slash in pattern → matches root only, not subdirectories
❌ Trailing slash on file rule → only matches directories, not files
❌ .gitignore negation (!pattern) not loaded in order → later negations override
❌ node_modules/ not ignored → agent reads 50k+ files, floods LLM context
❌ .env files not explicitly blocked → secrets leak into agent context