{
  "slug": "glob-filter",
  "name": "gizza-ai/glob-filter",
  "version": "0.1.0",
  "title": "Glob Filter — test include and exclude patterns against path lists — gizza.ai",
  "description": "Filter a pasted path list with glob or gitignore-style include and exclude patterns, then preview matched, unmatched, or annotated results.",
  "tags": [
    "glob filter",
    "glob tester",
    "gitignore tester",
    "path matcher",
    "file pattern",
    "include exclude",
    "pattern preview",
    "wildcard match"
  ],
  "category": "utilities",
  "urls": {
    "page": "https://gizza.ai/tools/glob-filter/",
    "markdown": "https://gizza.ai/tools/glob-filter/index.md",
    "descriptor": "https://gizza.ai/tools/glob-filter/tool.json",
    "deep_link_example": "https://gizza.ai/tools/glob-filter/?paths=src%2Fmain.rs%0Asrc%2Flib.rs%0Atests%2Fapp.test.ts%0Atarget%2Fdebug%2Fapp%0AREADME.md&include=%2A.rs%0A%2A.md&exclude=target%2F%0A%21target%2Fkeep.txt&syntax=gitignore&case_sensitive=true&output=matched"
  },
  "cli": "gizza tool glob-filter \"src/main.rs\nsrc/lib.rs\ntests/app.test.ts\ntarget/debug/app\nREADME.md\"",
  "tool": {
    "description": "Filter a list of file paths (one per line) by glob and gitignore-style include/exclude patterns, and preview exactly which paths match. Set syntax='gitignore' (default) for git's .gitignore rules (any-depth matching, '/' anchoring, directory contents, '#' comments) or syntax='glob' for whole-path glob (use '**/' for any depth). include keeps only matching paths; exclude drops matching paths (exclude wins); a pattern line starting with '!' re-includes, last match winning. case_sensitive defaults true. output='matched' (default) returns kept paths, 'unmatched' the dropped ones, 'annotated' every path prefixed ✓/✗. Also returns total/matched/dropped counts. Runs locally.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "case_sensitive": {
          "default": true,
          "description": "Match case-sensitively (default true). Set false to ignore case, e.g. on case-insensitive filesystems.",
          "type": "boolean"
        },
        "exclude": {
          "description": "Exclude patterns, one per line. A path matching an exclude pattern is dropped (exclude overrides include). A line starting with '!' re-includes; the last matching line wins.",
          "type": "string"
        },
        "include": {
          "description": "Include patterns, one per line. A path is kept only if it matches an include pattern (leave empty to include everything). A line starting with '!' re-includes; the last matching line wins.",
          "type": "string"
        },
        "output": {
          "default": "matched",
          "description": "What to return. 'matched' (default): only the kept paths. 'unmatched': only the dropped paths. 'annotated': every path prefixed with ✓ (kept) or ✗ (dropped).",
          "enum": [
            "matched",
            "unmatched",
            "annotated"
          ],
          "type": "string"
        },
        "paths": {
          "description": "The list of paths to test, one per line (e.g. the output of `git ls-files` or `find`).",
          "type": "string"
        },
        "syntax": {
          "default": "gitignore",
          "description": "Pattern dialect. 'gitignore' (default): git's .gitignore rules — a pattern with no '/' matches at any depth, a leading/embedded '/' anchors to the root, a match also covers a directory's contents, and '#' lines are comments. 'glob': each pattern must match the whole path ('*'/'?' stay within a segment, '**' spans them — use '**/' for any depth).",
          "enum": [
            "gitignore",
            "glob"
          ],
          "type": "string"
        }
      },
      "required": [
        "paths"
      ],
      "type": "object"
    }
  }
}