How to Configure .understandignore to Exclude Files from Analysis

The .understandignore file uses standard .gitignore syntax to exclude files from analysis, supporting patterns like dist/, *.log, and negation rules like !src/keep, and can be placed either at the project root or inside .understand-anything/.

The Understand-Anything project from Egonex-AI provides a flexible mechanism to exclude files from automated analysis using .understandignore files. This configuration system mirrors Git's ignore patterns, allowing you to filter out build artifacts, dependencies, and test fixtures before they enter the knowledge graph. Learning how to configure .understandignore effectively ensures that only relevant source code contributes to your project's analysis metrics.

How the Two-Step Ignore System Works

The analysis pipeline in packages/core/src/ignore-filter.ts implements a two-step filter through the createIgnoreFilter function. This constructor builds an IgnoreFilter object by layering three distinct sources of exclusion patterns.

First, the system loads hard-coded defaults (such as node_modules/, *.lock, and *.min.js) that protect against analyzing common non-source files. Second, it checks for .understand-anything/.understandignore inside the generated output directory. Third, it reads .understandignore from the project root if present. The ignore library merges these patterns sequentially, meaning later entries can override earlier ones using negation syntax.

When the scanner runs in skills/understand/scan-project.mjs, it applies this combined filter to every file discovered via git ls-files or the fallback directory walk. The script also tracks how many files were excluded specifically by user-defined patterns (as opposed to defaults) by comparing the full filter against a defaults-only baseline, incrementing the filteredByIgnore counter for exclusivity analysis.

Where to Place Your Configuration Files

You can define exclusion rules in two locations, with the system checking both during project scan:

Location Relative Path Priority
Generated Output .understand-anything/.understandignore Loaded second (can be overridden by root)
Project Root .understandignore Loaded last (highest precedence)

Place temporary exclusions in .understand-anything/.understandignore if you version-control the output folder and want to share settings across teams. Use the root .understandignore for developer-specific overrides that should not be committed to the analysis directory.

Supported Pattern Syntax

The .understandignore file uses identical syntax to .gitignore, processed by the standard ignore npm package. All patterns support glob-style matching and directory-specific rules.

  • Directory exclusion: Append a trailing slash to match only directories (e.g., dist/ excludes the directory but not a file named dist).
  • Wildcard patterns: Use * to match any file extension (e.g., *.log excludes all log files).
  • Negation: Prefix with ! to re-include files that would otherwise be ignored (e.g., !dist/keep/README.md after dist/).
  • Comments: Lines starting with # are ignored by the parser.

Negation patterns are particularly powerful because they allow you to exclude an entire directory while preserving specific subdirectories or files for analysis.

Generating a Starter Configuration

Rather than writing patterns from scratch, you can invoke the generateStarterIgnoreFile function from packages/core/src/ignore-generator.ts. This utility scans your project for common directories (like test/, docs/, coverage/) and cross-references existing .gitignore entries to suggest relevant exclusions.

The generator creates a commented template, placing all suggestions behind # characters so you can selectively uncomment only the patterns you need. This prevents accidental exclusion of critical source files while providing a discoverable starting point for new projects.

Implementation Examples

Basic Root Configuration

Create a file named .understandignore at your project root with the following patterns:


# Exclude generated build artifacts

dist/
build/

# Ignore test fixtures

test/
fixtures/

# Exclude log files

*.log

# Re-include a specific file that would otherwise be ignored

!dist/keep/README.md

When the scanner runs, all dist/ and build/ directories are skipped, as are any .log files. However, dist/keep/README.md remains in the analysis set due to the negation rule.

Programmatic File Generation

To generate a starter file during your build process or CLI tooling:

import { generateStarterIgnoreFile } from "./packages/core/src/ignore-generator.js";
import { writeFileSync, join } from "node:fs";

const projectRoot = process.cwd();
const starter = generateStarterIgnoreFile(projectRoot);
writeFileSync(join(projectRoot, ".understand-anything", ".understandignore"), starter);

This script creates a commented-out template at .understand-anything/.understandignore based on detected directories and existing .gitignore content.

Testing Patterns with the Filter API

Verify your patterns before running a full scan by testing the filter directly in a Node.js REPL:

import { createIgnoreFilter } from "./understand-anything-plugin/packages/core/dist/index.js";

const filter = createIgnoreFilter(process.cwd());

// Test some paths
console.log(filter.isIgnored("node_modules/foo/bar.js")); // true (default)
console.log(filter.isIgnored("src/main.ts"));            // false
console.log(filter.isIgnored("dist/bundle.js"));        // true if “dist/” is in .understandignore

This approach validates that your custom patterns in createIgnoreFilter correctly identify intended files without executing a full project scan.

Summary

  • The createIgnoreFilter function in packages/core/src/ignore-filter.ts combines hard-coded defaults with user-defined patterns from .understandignore files.
  • Configuration files can reside at the project root or inside .understand-anything/, with root patterns taking precedence.
  • Syntax supports standard .gitignore features including glob patterns, negation (!), and directory-specific trailing slashes.
  • Use generateStarterIgnoreFile from packages/core/src/ignore-generator.ts to bootstrap configurations based on existing project structure.
  • The scanner in skills/understand/scan-project.mjs reports how many files were excluded specifically by user patterns via the filteredByIgnore metric.

Frequently Asked Questions

What is the difference between .understandignore and .gitignore?

While both files use identical syntax, .gitignore controls what Git tracks in version control, whereas .understandignore controls what the Understand-Anything analyzer includes in its knowledge graph. You may want to analyze files that Git ignores (like generated documentation) or exclude files that Git tracks (like large JSON fixtures), making separate configuration necessary for fine-grained analysis control.

Why are my custom patterns not excluding files from the analysis?

Ensure your .understandignore file is located either at the project root or inside .understand-anything/, and verify that patterns use forward slashes and proper trailing slashes for directories. Because hard-coded defaults are loaded first, check that your pattern is not being inadvertently re-included by a later negation rule in the same file or in the root file when using the generated output location.

Can I use negation patterns to re-include specific files?

Yes. Prefix any pattern with ! to negate a previous exclusion. For example, if you exclude dist/ but want to keep dist/important.json for analysis, add !dist/important.json on a new line after the exclusion. The ignore library processes patterns in order, so place negations after the exclusions they modify.

How do I see which files were excluded by my custom patterns versus defaults?

The CLI output from scan-project.mjs displays a filteredByIgnore count that specifically tracks files dropped due to user-provided patterns in .understandignore. This metric is calculated by comparing the full filter (defaults + user patterns) against a defaults-only filter; any file ignored by the full filter but not the defaults-only filter increments this counter, distinguishing your custom exclusions from built-in rules.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →