diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
new file mode 100644
index 0000000..9f22a37
--- /dev/null
+++ b/.github/workflows/lint.yaml
@@ -0,0 +1,40 @@
+name: Lint
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - '**.go'
+ - 'go.mod'
+ - 'go.sum'
+ - '.golangci.yml'
+ pull_request:
+ paths:
+ - '**.go'
+ - 'go.mod'
+ - 'go.sum'
+ - '.golangci.yml'
+
+permissions:
+ contents: read
+
+jobs:
+ golangci:
+ name: golangci-lint
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: '1.25'
+ cache: true
+
+ - name: Run golangci-lint
+ uses: golangci/golangci-lint-action@v6
+ with:
+ version: latest
+ args: --timeout=5m
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index aba1bbf..fcb7143 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -18,6 +18,6 @@ jobs:
release:
uses: lukaszraczylo/shared-actions/.github/workflows/go-release-cgo.yaml@main
with:
- go-version: "1.24"
+ go-version: "1.25"
rolling-release-tag: "v1"
secrets: inherit
diff --git a/.github/workflows/security.yaml b/.github/workflows/security.yaml
new file mode 100644
index 0000000..e5b9ce5
--- /dev/null
+++ b/.github/workflows/security.yaml
@@ -0,0 +1,41 @@
+name: Security Scan
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - '**.go'
+ - 'go.mod'
+ - 'go.sum'
+ pull_request:
+ paths:
+ - '**.go'
+ - 'go.mod'
+ - 'go.sum'
+ schedule:
+ # Run weekly on Monday at 9:00 UTC
+ - cron: '0 9 * * 1'
+
+permissions:
+ contents: read
+
+jobs:
+ govulncheck:
+ name: Run govulncheck
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: '1.25'
+ cache: true
+
+ - name: Install govulncheck
+ run: go install golang.org/x/vuln/cmd/govulncheck@latest
+
+ - name: Run govulncheck
+ run: govulncheck ./...
diff --git a/.golangci.yml b/.golangci.yml
new file mode 100644
index 0000000..eda071a
--- /dev/null
+++ b/.golangci.yml
@@ -0,0 +1,44 @@
+version: "2"
+
+run:
+ timeout: 5m
+ go: '1.25'
+
+linters:
+ enable:
+ - errcheck # Check for unchecked errors
+ - govet # Vet examines Go source code
+ - ineffassign # Detect ineffectual assignments
+ - staticcheck # Advanced static analysis (includes gosimple)
+ - unused # Check for unused code
+ - gocyclo # Check cyclomatic complexity
+ - misspell # Check for misspelled words
+
+formatters:
+ enable:
+ - gofmt # Check formatting
+
+linters-settings:
+ gocyclo:
+ min-complexity: 15
+ errcheck:
+ check-blank: true
+ govet:
+ enable-all: true
+ staticcheck:
+ checks: ["all"]
+
+issues:
+ exclude-rules:
+ # Exclude some linters from running on tests
+ - path: _test\.go
+ linters:
+ - gocyclo
+ - errcheck
+ - gosec
+
+ max-issues-per-linter: 0
+ max-same-issues: 0
+
+output:
+ sort-results: true
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
index 6e41e8f..2c03516 100644
--- a/.goreleaser.yaml
+++ b/.goreleaser.yaml
@@ -11,7 +11,7 @@ before:
- go generate ./...
builds:
- - id: mcp-filepuff
+ - id: mcp-filepuff-cgo
main: ./cmd/mcp-filepuff
binary: mcp-filepuff
env:
@@ -38,6 +38,25 @@ builds:
- goos: windows
goarch: arm64
+ - id: mcp-filepuff-static
+ main: ./cmd/mcp-filepuff
+ binary: mcp-filepuff
+ env:
+ - CGO_ENABLED=0
+ flags:
+ - -trimpath
+ ldflags:
+ - -s -w
+ - -X main.version={{.Version}}
+ - -X main.commit={{.Commit}}
+ - -X main.date={{.Date}}
+ - -extldflags=-static
+ goos:
+ - linux
+ goarch:
+ - amd64
+ - arm64
+
archives:
- id: default
formats:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..18c1a56
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,52 @@
+# Pre-commit hooks configuration
+# See https://pre-commit.com for more information
+# Installation: pip install pre-commit && pre-commit install
+#
+# Note: These hooks are optional for contributors.
+# Run manually with: pre-commit run --all-files
+
+repos:
+ # Standard pre-commit hooks
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.5.0
+ hooks:
+ - id: trailing-whitespace
+ args: [--markdown-linebreak-ext=md]
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-json
+ - id: check-merge-conflict
+ - id: check-added-large-files
+ args: ['--maxkb=500']
+ - id: detect-private-key
+
+ # Go formatting
+ - repo: https://github.com/dnephin/pre-commit-golang
+ rev: v0.5.1
+ hooks:
+ - id: go-fmt
+ - id: go-imports
+ - id: go-vet
+ - id: go-mod-tidy
+
+ # golangci-lint
+ - repo: https://github.com/golangci/golangci-lint
+ rev: v1.56.2
+ hooks:
+ - id: golangci-lint
+ args: [--config=.golangci.yml]
+
+ # Markdown linting (optional)
+ - repo: https://github.com/igorshubovych/markdownlint-cli
+ rev: v0.39.0
+ hooks:
+ - id: markdownlint
+ args: ['--fix', '--disable', 'MD013', 'MD033', 'MD041', '--']
+
+# Configuration for specific hooks
+default_language_version:
+ golang: "1.22"
+
+# Don't run on CI by default (handled by GitHub Actions)
+ci:
+ skip: [golangci-lint, go-vet]
diff --git a/Makefile b/Makefile
index a828352..5fac414 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,4 @@
-.PHONY: build test lint clean install run deps
-
+.PHONY: build test lint clean install run deps docs
# Binary name
BINARY_NAME=mcp-filepuff
# Build directory
@@ -42,12 +41,29 @@ build-all:
# Run tests
test:
- $(GOTEST) -v -race -coverprofile=coverage.out ./...
+ $(GOTEST) -v -coverprofile=coverage.out ./...
+
+# Run tests with race detector on critical packages
+test-race:
+ @echo "Running race detector tests on critical packages..."
+ $(GOTEST) -v -race -timeout=5m ./internal/edit/...
+ $(GOTEST) -v -race -timeout=5m ./internal/lsp/...
+ $(GOTEST) -v -race -timeout=5m ./internal/parser/...
+ $(GOTEST) -v -race -timeout=5m ./internal/server/...
+ @echo "Race detector tests completed successfully"
# Run tests with short flag
test-short:
$(GOTEST) -v -short ./...
+# Run all tests including race detector
+test-all: test test-race
+
+# Run linters
+lint:
+ @which golangci-lint > /dev/null || (echo "Installing golangci-lint..." && go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest)
+ golangci-lint run ./...
+
# Clean build artifacts
clean:
rm -rf $(BUILD_DIR)
@@ -72,9 +88,18 @@ help:
@echo " build - Build the binary"
@echo " build-all - Build for all platforms"
@echo " test - Run tests with coverage"
+ @echo " test-race - Run tests with race detector on critical packages"
+ @echo " test-all - Run all tests including race detector"
@echo " test-short - Run short tests"
@echo " lint - Run linters"
@echo " clean - Clean build artifacts"
@echo " install - Install binary to GOPATH/bin"
@echo " run - Build and run the server"
@echo " run-workspace - Run with specific workspace (WORKSPACE=/path)"
+
+
+# Generate API documentation
+docs:
+ @echo "Generating API documentation..."
+ $(GOCMD) run ./cmd/docgen
+ @echo "Documentation generated in docs/API.md"
\ No newline at end of file
diff --git a/README.md b/README.md
index 619f4dd..17f7e3d 100644
--- a/README.md
+++ b/README.md
@@ -480,6 +480,8 @@ make clean
## Architecture
+### High-Level Overview
+
```
┌─────────────────────────────────────────────────────────┐
│ MCP Server │
@@ -495,6 +497,220 @@ make clean
└───────────┴─────────────┴────────────┴─────────────────┘
```
+### Detailed Sequence Diagrams
+
+#### LSP Integration Flow
+
+The following diagram shows how LSP requests (hover, definition, references) flow through the system:
+
+```mermaid
+sequenceDiagram
+ participant Client as MCP Client
+ participant Server as MCP Server
+ participant LSPMgr as LSP Manager
+ participant LSPSrv as LSP Server (gopls/etc)
+ participant FS as File System
+
+ Client->>Server: symbol_at(file, line, col)
+ activate Server
+
+ Server->>LSPMgr: GetServer(language)
+ activate LSPMgr
+
+ alt Server Not Running
+ LSPMgr->>LSPSrv: Start Process
+ LSPMgr->>LSPSrv: initialize request
+ LSPSrv-->>LSPMgr: capabilities
+ LSPMgr->>LSPSrv: initialized notification
+ end
+
+ LSPMgr-->>Server: ManagedServer
+ deactivate LSPMgr
+
+ Server->>LSPMgr: ensureDocumentOpen(file)
+ activate LSPMgr
+
+ alt Document Not Open
+ LSPMgr->>FS: ReadFile(path)
+ FS-->>LSPMgr: content
+ LSPMgr->>LSPSrv: textDocument/didOpen
+ end
+
+ LSPMgr-->>Server: ready
+ deactivate LSPMgr
+
+ Server->>LSPSrv: textDocument/hover
+ activate LSPSrv
+ LSPSrv-->>Server: HoverResult
+ deactivate LSPSrv
+
+ Server-->>Client: Symbol information
+ deactivate Server
+```
+
+#### Edit Operation Flow
+
+The edit engine uses atomic writes and validation to ensure safe file modifications:
+
+```mermaid
+sequenceDiagram
+ participant Client as MCP Client
+ participant Server as MCP Server
+ participant Edit as Edit Engine
+ participant Parser as Parser Registry
+ participant FS as File System
+
+ Client->>Server: edit_apply(file, operation, selector, content)
+ activate Server
+
+ Server->>Edit: Apply(ctx, edit)
+ activate Edit
+
+ Edit->>Edit: lockFile(path)
+ Note over Edit: Per-file mutex prevents
concurrent edits
+
+ Edit->>FS: ReadFile(path)
+ FS-->>Edit: original content
+
+ alt AST-Aware Mode (code files)
+ Edit->>Parser: Parse(ctx, path, content)
+ activate Parser
+ Parser-->>Edit: ParseResult with AST
+ deactivate Parser
+
+ Edit->>Edit: resolveSelector(selector, tree)
+ Note over Edit: Find target node by
kind, name, line, index
+
+ Edit->>Edit: applyEdit(operation, node, content)
+ Note over Edit: Apply replace/insert/delete
with indentation preservation
+
+ Edit->>Parser: Parse(ctx, path, newContent)
+ activate Parser
+ Parser-->>Edit: Validate syntax
+ deactivate Parser
+
+ alt Syntax Error
+ Edit-->>Server: ValidationError
+ Server-->>Client: Error: invalid syntax
+ end
+ else Text Mode (non-code files)
+ Edit->>Edit: resolveTextSelector(selector)
+ Note over Edit: Find by text, pattern,
or line range
+
+ Edit->>Edit: applyTextEditOperation
+ end
+
+ Edit->>Edit: generateDiff(original, new)
+
+ Edit->>FS: Stat(path) - get permissions
+ Edit->>FS: WriteFile(path, content, perm)
+ Note over Edit,FS: Atomic write preserves
original permissions
+
+ Edit->>Edit: unlockFile(path)
+
+ Edit-->>Server: EditResult{Success, Diff}
+ deactivate Edit
+
+ Server-->>Client: Success + Diff
+ deactivate Server
+```
+
+#### Parse and Cache Flow
+
+The parser uses content-based caching for efficient AST reuse:
+
+```mermaid
+sequenceDiagram
+ participant Client as MCP Client
+ participant Server as MCP Server
+ participant Parser as Parser Registry
+ participant Cache as LRU Cache
+ participant TS as Tree-sitter
+
+ Client->>Server: file_read(path, include_ast=true)
+ activate Server
+
+ Server->>Parser: Parse(ctx, path, content)
+ activate Parser
+
+ Parser->>Parser: contentHash(content)
+ Note over Parser: xxHash64 for fast
content fingerprinting
+
+ Parser->>Cache: Get(hash)
+ activate Cache
+
+ alt Cache Hit
+ Cache-->>Parser: CachedTree
+ Parser->>Parser: cacheHits++
+ Note over Parser: ~100x faster than parsing
+ else Cache Miss
+ Cache-->>Parser: nil
+ deactivate Cache
+ Parser->>Parser: cacheMisses++
+
+ Parser->>Parser: GetParser(language)
+ Note over Parser: One parser per language,
reused across requests
+
+ Parser->>TS: ParseCtx(ctx, content)
+ activate TS
+ Note over TS: Tree-sitter parsing
with timeout support
+ TS-->>Parser: *sitter.Tree
+ deactivate TS
+
+ Parser->>Cache: Add(hash, tree)
+ activate Cache
+ Note over Cache: LRU eviction when
capacity reached (100 entries)
+ Cache-->>Parser: stored
+ deactivate Cache
+ end
+
+ Parser->>Parser: extractErrors(tree)
+ Parser->>Parser: ExtractSymbols(tree)
+
+ Parser-->>Server: ParseResult{Tree, Language, Errors, Symbols}
+ deactivate Parser
+
+ Server->>Server: generateASTSummary()
+ Server-->>Client: File content + Symbol summary
+ deactivate Server
+```
+
+#### Request Flow Summary
+
+```mermaid
+flowchart TB
+ subgraph "MCP Protocol Layer"
+ A[MCP Client] --> B[MCP Server]
+ end
+
+ subgraph "Tool Handlers"
+ B --> C{Tool Type}
+ C -->|Search| D[file_search]
+ C -->|Read| E[file_read]
+ C -->|Query| F[ast_query]
+ C -->|LSP| G[symbol_at
find_definition
find_references]
+ C -->|Edit| H[edit_preview
edit_apply]
+ end
+
+ subgraph "Core Engines"
+ D --> I[Search Engine
ripgrep]
+ E --> J[Parser Registry]
+ F --> J
+ F --> K[Query Matcher]
+ G --> L[LSP Manager]
+ H --> M[Edit Engine]
+ M --> J
+ end
+
+ subgraph "External Systems"
+ I --> N[(File System)]
+ J --> O[Tree-sitter]
+ J --> P[(Parse Cache)]
+ L --> Q[gopls
typescript-language-server
pylsp
clangd]
+ M --> N
+ end
+```
+
## Troubleshooting
### Common Issues
diff --git a/cmd/docgen/main.go b/cmd/docgen/main.go
new file mode 100644
index 0000000..c2aa9fe
--- /dev/null
+++ b/cmd/docgen/main.go
@@ -0,0 +1,380 @@
+// Package main implements an API documentation generator for MCP tools.
+package main
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "time"
+)
+
+// ToolParameter represents a parameter for an MCP tool.
+type ToolParameter struct {
+ Name string
+ Type string
+ Description string
+ Required bool
+}
+
+// Tool represents an MCP tool with its documentation.
+type Tool struct {
+ Name string
+ Description string
+ Parameters []ToolParameter
+ Examples []string
+ Notes []string
+ ReadOnly bool
+ Category string
+}
+
+// AllTools returns the complete list of MCP tools with their documentation.
+func AllTools() []Tool {
+ return []Tool{
+ {
+ Name: "ping",
+ Description: "Health check - returns pong to verify the server is running",
+ Category: "System",
+ ReadOnly: true,
+ Parameters: []ToolParameter{},
+ Examples: []string{
+ `{"tool": "ping"}`,
+ },
+ Notes: []string{
+ "Returns: \"pong\"",
+ "Use to verify server connectivity",
+ },
+ },
+ {
+ Name: "file_search",
+ Description: "Search for text patterns in files using ripgrep. Supports regex patterns, file type filtering, and context lines.",
+ Category: "Search",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "pattern", Type: "string", Required: true, Description: "The search pattern (regex by default)"},
+ {Name: "paths", Type: "array[string]", Required: false, Description: "Paths to search in (defaults to workspace root)"},
+ {Name: "file_types", Type: "array[string]", Required: false, Description: "File types to search (e.g., ['go', 'ts', 'py'])"},
+ {Name: "ignore_case", Type: "boolean", Required: false, Description: "Case insensitive search"},
+ {Name: "regex", Type: "boolean", Required: false, Description: "Treat pattern as regex (default: true)"},
+ {Name: "context_lines", Type: "number", Required: false, Description: "Number of context lines around matches (default: 2)"},
+ {Name: "max_results", Type: "number", Required: false, Description: "Maximum number of results to return"},
+ },
+ Examples: []string{
+ `{"pattern": "func.*Error", "file_types": ["go"]}`,
+ `{"pattern": "TODO", "ignore_case": true, "context_lines": 3}`,
+ },
+ Notes: []string{
+ "Requires ripgrep (rg) to be installed",
+ "Respects .gitignore by default",
+ },
+ },
+ {
+ Name: "file_read",
+ Description: "Read a file's contents with optional line range and AST symbol summary",
+ Category: "File Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "path", Type: "string", Required: true, Description: "Path to the file to read"},
+ {Name: "line_start", Type: "number", Required: false, Description: "Starting line number (1-indexed)"},
+ {Name: "line_end", Type: "number", Required: false, Description: "Ending line number (inclusive)"},
+ {Name: "include_ast", Type: "boolean", Required: false, Description: "Include AST symbol summary (functions, classes, types, etc.)"},
+ {Name: "symbols_only", Type: "boolean", Required: false, Description: "Return only symbol summary without file content (token-efficient mode). Requires include_ast=true."},
+ {Name: "max_lines", Type: "number", Required: false, Description: "Maximum number of lines to return (for token efficiency). Applied after line_start/line_end."},
+ },
+ Examples: []string{
+ `{"path": "server.go", "include_ast": true}`,
+ `{"path": "server.go", "include_ast": true, "symbols_only": true}`,
+ `{"path": "server.go", "line_start": 10, "line_end": 50}`,
+ `{"path": "large_file.go", "max_lines": 100}`,
+ },
+ Notes: []string{
+ "symbols_only mode reduces token usage by ~90-98%",
+ "max_lines truncates output with notification",
+ "AST symbols show line numbers for quick navigation",
+ },
+ },
+ {
+ Name: "ast_query",
+ Description: "Search for AST patterns in code files. Use code patterns with $VAR placeholders to match and capture code structures like functions, classes, and types.",
+ Category: "AST Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "pattern", Type: "string", Required: true, Description: "Code pattern with placeholders: $NAME (single), $$$ARGS (multiple), $_ (wildcard). Examples: 'func $NAME($$$ARGS) error', 'class $NAME { $$$BODY }'"},
+ {Name: "language", Type: "string", Required: true, Description: "Target language: go, typescript, javascript, python, c, cpp"},
+ {Name: "paths", Type: "array[string]", Required: false, Description: "Paths to search in (defaults to workspace root)"},
+ {Name: "name_matches", Type: "string", Required: false, Description: "Regex pattern to filter by name"},
+ {Name: "name_exact", Type: "string", Required: false, Description: "Exact name to match"},
+ {Name: "kind_in", Type: "array[string]", Required: false, Description: "Node types to match (e.g., function_declaration, class_declaration)"},
+ {Name: "max_results", Type: "number", Required: false, Description: "Maximum number of results to return (default: 100)"},
+ },
+ Examples: []string{
+ `{"pattern": "func $NAME($$$ARGS) error", "language": "go"}`,
+ `{"pattern": "class $NAME: $$$BODY", "language": "python"}`,
+ `{"pattern": "function $NAME($PROPS) { $$$BODY }", "language": "javascript", "name_matches": "^[A-Z]"}`,
+ },
+ Notes: []string{
+ "$NAME captures identifiers",
+ "$$$ARGS captures multiple items (parameters, body, etc.)",
+ "$_ is a wildcard that matches but doesn't capture",
+ "Powered by Tree-sitter for accurate AST parsing",
+ },
+ },
+ {
+ Name: "symbol_at",
+ Description: "Get information about the symbol at a specific position in a file. Returns type, documentation, and definition location using LSP when available.",
+ Category: "LSP Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "file", Type: "string", Required: true, Description: "Path to the file"},
+ {Name: "line", Type: "number", Required: true, Description: "Line number (1-indexed)"},
+ {Name: "column", Type: "number", Required: true, Description: "Column number (1-indexed)"},
+ },
+ Examples: []string{
+ `{"file": "server.go", "line": 25, "column": 10}`,
+ },
+ Notes: []string{
+ "Requires LSP server for full type information",
+ "Falls back to AST-based info if LSP unavailable",
+ },
+ },
+ {
+ Name: "find_definition",
+ Description: "Find the definition of the symbol at a specific position. Uses LSP to locate where a function, variable, type, etc. is defined.",
+ Category: "LSP Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "file", Type: "string", Required: true, Description: "Path to the file"},
+ {Name: "line", Type: "number", Required: true, Description: "Line number (1-indexed)"},
+ {Name: "column", Type: "number", Required: true, Description: "Column number (1-indexed)"},
+ },
+ Examples: []string{
+ `{"file": "server.go", "line": 42, "column": 15}`,
+ },
+ Notes: []string{
+ "Requires language server for the file type",
+ "Returns file path, line, and column of definition",
+ "Shows code preview at definition location",
+ },
+ },
+ {
+ Name: "find_references",
+ Description: "Find all references to the symbol at a specific position. Uses LSP to locate all usages of a function, variable, type, etc.",
+ Category: "LSP Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "file", Type: "string", Required: true, Description: "Path to the file"},
+ {Name: "line", Type: "number", Required: true, Description: "Line number (1-indexed)"},
+ {Name: "column", Type: "number", Required: true, Description: "Column number (1-indexed)"},
+ {Name: "include_declaration", Type: "boolean", Required: false, Description: "Include the declaration in results (default: true)"},
+ },
+ Examples: []string{
+ `{"file": "server.go", "line": 42, "column": 15}`,
+ `{"file": "server.go", "line": 42, "column": 15, "include_declaration": false}`,
+ },
+ Notes: []string{
+ "Requires language server for the file type",
+ "Results grouped by file",
+ },
+ },
+ {
+ Name: "edit_preview",
+ Description: "Preview an edit without applying it. Uses AST-aware editing for code files (Go, TypeScript, JavaScript, Python, C, C++), and text-based editing for other files (Markdown, JSON, YAML, config files, etc.).",
+ Category: "Edit Operations",
+ ReadOnly: true,
+ Parameters: []ToolParameter{
+ {Name: "file", Type: "string", Required: true, Description: "Path to the file to edit"},
+ {Name: "operation", Type: "string", Required: true, Description: "Edit operation: replace, insert_before, insert_after, delete"},
+ {Name: "new_content", Type: "string", Required: false, Description: "New content (required for replace/insert operations)"},
+ {Name: "selector_kind", Type: "string", Required: false, Description: "AST node type to match (e.g., function_declaration, class_declaration). For code files only."},
+ {Name: "selector_name", Type: "string", Required: false, Description: "Name of the symbol to match. For code files only."},
+ {Name: "selector_line", Type: "number", Required: false, Description: "Line number (1-indexed). For AST mode: narrows search. For text mode: start of line range."},
+ {Name: "selector_index", Type: "number", Required: false, Description: "Index of the match to use if multiple matches found (default: 0)"},
+ {Name: "selector_line_end", Type: "number", Required: false, Description: "End line number for range selection (text mode). Used with selector_line."},
+ {Name: "selector_text", Type: "string", Required: false, Description: "Exact text to match (text mode). Must be unique or use selector_index."},
+ {Name: "selector_pattern", Type: "string", Required: false, Description: "Regex pattern to match (text mode). Must be unique or use selector_index."},
+ },
+ Examples: []string{
+ `{"file": "server.go", "operation": "replace", "selector_kind": "function_declaration", "selector_name": "Hello", "new_content": "func Hello() {\\n\\tprintln(\\"New Hello\\")\\n}"}`,
+ `{"file": "README.md", "operation": "replace", "selector_text": "## Installation", "new_content": "## Getting Started"}`,
+ `{"file": "package.json", "operation": "replace", "selector_pattern": "\\"version\\":\\\\s*\\"[^\\"]+\\"", "new_content": "\\"version\\": \\"2.0.0\\""}`,
+ },
+ Notes: []string{
+ "Returns a diff showing proposed changes",
+ "Does not modify the file",
+ "Use to validate changes before applying",
+ },
+ },
+ {
+ Name: "edit_apply",
+ Description: "Apply an edit to a file. Uses AST-aware editing for code files (Go, TypeScript, JavaScript, Python, C, C++) with syntax validation, and text-based editing for other files (Markdown, JSON, YAML, config files, etc.).",
+ Category: "Edit Operations",
+ ReadOnly: false,
+ Parameters: []ToolParameter{
+ {Name: "file", Type: "string", Required: true, Description: "Path to the file to edit"},
+ {Name: "operation", Type: "string", Required: true, Description: "Edit operation: replace, insert_before, insert_after, delete"},
+ {Name: "new_content", Type: "string", Required: false, Description: "New content (required for replace/insert operations)"},
+ {Name: "selector_kind", Type: "string", Required: false, Description: "AST node type to match (e.g., function_declaration, class_declaration). For code files only."},
+ {Name: "selector_name", Type: "string", Required: false, Description: "Name of the symbol to match. For code files only."},
+ {Name: "selector_line", Type: "number", Required: false, Description: "Line number (1-indexed). For AST mode: narrows search. For text mode: start of line range."},
+ {Name: "selector_index", Type: "number", Required: false, Description: "Index of the match to use if multiple matches found (default: 0)"},
+ {Name: "selector_line_end", Type: "number", Required: false, Description: "End line number for range selection (text mode). Used with selector_line."},
+ {Name: "selector_text", Type: "string", Required: false, Description: "Exact text to match (text mode). Must be unique or use selector_index."},
+ {Name: "selector_pattern", Type: "string", Required: false, Description: "Regex pattern to match (text mode). Must be unique or use selector_index."},
+ },
+ Examples: []string{
+ `{"file": "server.go", "operation": "replace", "selector_kind": "function_declaration", "selector_name": "Hello", "new_content": "func Hello() {\\n\\tprintln(\\"Updated\\")\\n}"}`,
+ `{"file": "config.yaml", "operation": "replace", "selector_line": 5, "selector_line_end": 10, "new_content": "database:\\n host: production.db.example.com\\n port: 5432"}`,
+ },
+ Notes: []string{
+ "For code files: validates syntax before and after edit",
+ "Preserves file permissions",
+ "Uses atomic writes for safety",
+ "File locking prevents concurrent edits",
+ },
+ },
+ }
+}
+
+// GenerateMarkdown generates the complete API documentation in Markdown format.
+func GenerateMarkdown() string {
+ var sb strings.Builder
+
+ sb.WriteString("# MCP Filepuff API Reference\n\n")
+ sb.WriteString(fmt.Sprintf("> Auto-generated on %s\n\n", time.Now().Format("2006-01-02")))
+ sb.WriteString("This document provides detailed API documentation for all MCP tools available in filepuff.\n\n")
+
+ // Table of Contents
+ sb.WriteString("## Table of Contents\n\n")
+ tools := AllTools()
+ categories := make(map[string][]Tool)
+ categoryOrder := []string{}
+
+ for _, tool := range tools {
+ if _, ok := categories[tool.Category]; !ok {
+ categoryOrder = append(categoryOrder, tool.Category)
+ }
+ categories[tool.Category] = append(categories[tool.Category], tool)
+ }
+
+ for _, cat := range categoryOrder {
+ sb.WriteString(fmt.Sprintf("### %s\n", cat))
+ for _, tool := range categories[cat] {
+ sb.WriteString(fmt.Sprintf("- [`%s`](#%s)\n", tool.Name, tool.Name))
+ }
+ sb.WriteString("\n")
+ }
+
+ // Tool Documentation
+ sb.WriteString("---\n\n")
+ sb.WriteString("## Tool Reference\n\n")
+
+ for _, cat := range categoryOrder {
+ sb.WriteString(fmt.Sprintf("### %s\n\n", cat))
+
+ for _, tool := range categories[cat] {
+ sb.WriteString(fmt.Sprintf("#### `%s`\n\n", tool.Name))
+ sb.WriteString(fmt.Sprintf("%s\n\n", tool.Description))
+
+ // Read-only indicator
+ if tool.ReadOnly {
+ sb.WriteString("🔒 **Read-only**: This tool does not modify files.\n\n")
+ } else {
+ sb.WriteString("⚠️ **Modifies files**: This tool writes to the filesystem.\n\n")
+ }
+
+ // Parameters
+ if len(tool.Parameters) > 0 {
+ sb.WriteString("**Parameters:**\n\n")
+ sb.WriteString("| Name | Type | Required | Description |\n")
+ sb.WriteString("|------|------|----------|-------------|\n")
+ for _, param := range tool.Parameters {
+ required := "No"
+ if param.Required {
+ required = "**Yes**"
+ }
+ sb.WriteString(fmt.Sprintf("| `%s` | `%s` | %s | %s |\n",
+ param.Name, param.Type, required, param.Description))
+ }
+ sb.WriteString("\n")
+ } else {
+ sb.WriteString("**Parameters:** None\n\n")
+ }
+
+ // Examples
+ if len(tool.Examples) > 0 {
+ sb.WriteString("**Examples:**\n\n")
+ for _, example := range tool.Examples {
+ sb.WriteString("```json\n")
+ sb.WriteString(example)
+ sb.WriteString("\n```\n\n")
+ }
+ }
+
+ // Notes
+ if len(tool.Notes) > 0 {
+ sb.WriteString("**Notes:**\n\n")
+ for _, note := range tool.Notes {
+ sb.WriteString(fmt.Sprintf("- %s\n", note))
+ }
+ sb.WriteString("\n")
+ }
+
+ sb.WriteString("---\n\n")
+ }
+ }
+
+ // Additional sections
+ sb.WriteString("## Supported Languages\n\n")
+ sb.WriteString("| Language | Extensions | Search | AST | LSP | Edit |\n")
+ sb.WriteString("|----------|-----------|--------|-----|-----|------|\n")
+ sb.WriteString("| Go | .go | ✅ | ✅ | gopls | ✅ |\n")
+ sb.WriteString("| TypeScript | .ts, .tsx | ✅ | ✅ | typescript-language-server | ✅ |\n")
+ sb.WriteString("| JavaScript | .js, .jsx, .mjs, .cjs | ✅ | ✅ | typescript-language-server | ✅ |\n")
+ sb.WriteString("| Python | .py, .pyw | ✅ | ✅ | pylsp | ✅ |\n")
+ sb.WriteString("| C | .c, .h | ✅ | ✅ | clangd | ✅ |\n")
+ sb.WriteString("| C++ | .cpp, .cc, .cxx, .hpp, .hxx | ✅ | ✅ | clangd | ✅ |\n")
+ sb.WriteString("| HTML | .html, .htm | ✅ | ✅ | - | ✅ |\n")
+ sb.WriteString("| Vue | .vue | ✅ | ✅* | - | ✅ |\n")
+ sb.WriteString("| React | .jsx, .tsx | ✅ | ✅ | typescript-language-server | ✅ |\n")
+ sb.WriteString("| Elixir | .ex, .exs | ✅ | ✅ | elixir-ls | ✅ |\n")
+ sb.WriteString("| JSON | .json | ✅ | ✅ | - | ✅ |\n")
+ sb.WriteString("| YAML | .yaml, .yml | ✅ | ✅ | - | ✅ |\n")
+ sb.WriteString("\n\\* Vue uses HTML parser for template sections\n\n")
+
+ sb.WriteString("## Error Handling\n\n")
+ sb.WriteString("All tools return structured errors with:\n")
+ sb.WriteString("- **Error code**: Numeric identifier for the error type\n")
+ sb.WriteString("- **Message**: Human-readable error description\n")
+ sb.WriteString("- **Context**: Additional information about the error\n")
+ sb.WriteString("- **Remediation**: Suggested fix for the error\n\n")
+ sb.WriteString("See [ERROR_CODES.md](ERROR_CODES.md) for a complete error reference.\n\n")
+
+ sb.WriteString("## See Also\n\n")
+ sb.WriteString("- [README.md](../README.md) - Project overview and installation\n")
+ sb.WriteString("- [ERROR_CODES.md](ERROR_CODES.md) - Error code reference\n")
+ sb.WriteString("- [PERFORMANCE.md](PERFORMANCE.md) - Performance tuning guide\n")
+
+ return sb.String()
+}
+
+func main() {
+ output := GenerateMarkdown()
+
+ // Default output path
+ outputPath := "docs/API.md"
+ if len(os.Args) > 1 {
+ outputPath = os.Args[1]
+ }
+
+ // Ensure docs directory exists
+ if err := os.MkdirAll("docs", 0o755); err != nil {
+ fmt.Fprintf(os.Stderr, "Error creating docs directory: %v\n", err)
+ os.Exit(1)
+ }
+
+ if err := os.WriteFile(outputPath, []byte(output), 0o644); err != nil {
+ fmt.Fprintf(os.Stderr, "Error writing file: %v\n", err)
+ os.Exit(1)
+ }
+
+ fmt.Printf("API documentation generated: %s\n", outputPath)
+}
diff --git a/coverage.out b/coverage.out
index 7f07957..17e7d6f 100644
--- a/coverage.out
+++ b/coverage.out
@@ -1,210 +1,1499 @@
-mode: atomic
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:37.24,50.2 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:54.50,58.25 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:58.25,60.17 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:60.17,62.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:63.3,63.30 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:64.8,64.47 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:64.47,66.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:69.2,70.54 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:70.54,71.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:71.51,73.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:77.2,79.17 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:82.32,83.51 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:83.51,84.50 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:84.50,86.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:89.2,89.48 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:89.48,90.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:90.50,92.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:95.2,95.51 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:95.51,96.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:96.50,98.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:101.2,101.64 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:101.64,103.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.2,105.69 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.69,107.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.2,109.71 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.71,111.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:116.50,119.16 2 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:119.16,121.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:124.2,125.16 2 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:125.16,127.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:130.2,131.20 2 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:131.20,133.3 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:136.2,137.20 2 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:137.20,140.3 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:140.8,146.50 3 7
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:146.50,148.22 2 9
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:148.22,151.10 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:154.4,155.21 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:155.21,157.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:159.4,160.16 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:165.2,166.16 2 14
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:166.16,168.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:173.2,173.52 1 14
+mode: set
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:25.34,29.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:32.68,33.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:33.17,35.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:37.2,40.39 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:40.39,47.25 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:47.25,49.53 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:49.53,50.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:56.3,67.5 4 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.2,71.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.42,73.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:75.2,75.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:79.97,83.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:83.24,85.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.2,88.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.41,90.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.2,93.44 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.44,95.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:98.2,104.14 4 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:109.45,110.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:110.14,112.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.2,113.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.18,115.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.2,116.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.18,118.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.2,121.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.23,123.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:126.2,136.29 7 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:136.29,138.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.2,141.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.29,144.30 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:144.30,146.26 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:146.26,148.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:150.4,154.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:158.3,158.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:161.2,161.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:166.52,167.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:167.14,169.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.2,170.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.18,172.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.2,173.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.18,175.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:177.2,184.19 6 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:184.19,186.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.2,189.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.29,191.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.2,192.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.29,194.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.2,197.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.29,198.30 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:198.30,200.26 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:200.26,202.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:204.4,211.66 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:211.66,213.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:217.2,217.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:222.51,223.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:223.14,225.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:227.2,230.34 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:230.34,232.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:235.2,239.53 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:239.53,240.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:240.21,242.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:242.9,243.9 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:248.2,249.47 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:253.44,259.19 4 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:259.19,261.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:263.2,270.22 5 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:270.22,274.32 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:274.32,275.37 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:275.37,276.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:278.4,281.9 4 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.2,285.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.18,287.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:290.2,291.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:291.22,292.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:292.19,293.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.3,295.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.20,297.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.3,298.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.21,300.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:301.3,301.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:304.2,306.60 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:310.52,315.15 4 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:315.15,317.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.2,320.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.14,322.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:325.2,326.63 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:326.63,328.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.2,331.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.32,334.53 3 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:334.53,336.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:339.2,339.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:344.29,345.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:345.22,347.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:348.2,349.31 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:349.31,350.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:350.12,352.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:354.2,354.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:357.29,358.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:358.22,360.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:361.2,362.31 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:362.31,363.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:363.12,365.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:367.2,367.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:370.21,371.11 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:371.11,373.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:374.2,374.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:9.72,10.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:10.17,12.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:14.2,15.17 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:15.17,17.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:20.2,25.37 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:29.74,30.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:30.17,32.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:34.2,38.48 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:38.48,40.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:43.2,43.46 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:43.46,45.19 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:45.19,46.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:48.3,48.61 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:48.61,50.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:54.2,54.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:58.56,60.86 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:60.86,62.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:64.2,64.81 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:64.81,66.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:67.2,67.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:71.68,72.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:72.17,74.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:76.2,77.21 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:77.21,78.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:78.29,80.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:81.3,81.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:83.2,83.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:87.60,88.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:88.17,90.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:92.2,95.59 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:95.59,97.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:99.2,99.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:104.62,105.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:105.17,107.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:109.2,109.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:109.15,111.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:113.2,113.46 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:113.46,115.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:119.69,122.43 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:122.43,123.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:123.23,125.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:126.3,126.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:129.2,129.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:133.58,134.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:134.17,136.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:138.2,139.51 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:139.51,140.48 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:140.48,142.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:144.2,144.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:148.76,149.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:149.17,151.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:152.2,152.41 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:156.73,157.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:157.17,159.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:161.2,166.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:170.67,171.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:171.17,173.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:175.2,189.3 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:35.92,36.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:36.14,38.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:40.2,40.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:41.23,42.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:43.56,44.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:45.27,46.45 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:47.40,48.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:49.27,50.45 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:51.10,52.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:58.70,60.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:60.24,62.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:64.2,69.29 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:69.29,73.22 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:73.22,75.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:76.3,79.20 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:79.20,81.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:84.2,84.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:84.21,86.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:88.2,95.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:99.70,101.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:101.24,103.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:106.2,107.42 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:107.42,109.56 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:109.56,111.9 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:115.2,115.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:115.25,126.3 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:129.2,134.29 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:134.29,138.22 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:138.22,140.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:141.3,144.20 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:144.20,146.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:149.2,149.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:149.21,151.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:153.2,160.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:165.74,168.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:168.17,170.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:173.2,173.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:173.32,175.61 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:175.61,176.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:176.35,178.47 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:178.47,189.6 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:195.2,196.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:196.24,198.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:200.2,205.29 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:205.29,209.22 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:209.22,211.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:212.3,216.20 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:216.20,218.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:221.2,221.21 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:221.21,223.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:225.2,232.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:236.69,238.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:238.24,240.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:243.2,244.42 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:244.42,247.114 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:247.114,249.9 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:253.2,253.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:253.24,264.3 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:267.2,272.29 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:272.29,276.22 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:276.22,278.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:279.3,282.20 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:282.20,284.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:287.2,287.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:287.21,289.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:291.2,298.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:302.95,309.18 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:309.18,312.35 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:312.35,313.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:313.22,315.10 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:319.3,319.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:319.17,320.9 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:323.3,326.41 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:326.41,327.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:330.3,332.28 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:335.2,335.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:339.54,341.39 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:341.39,343.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:344.2,344.76 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:344.76,346.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:347.2,347.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:347.38,349.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:350.2,350.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:350.38,352.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:353.2,353.37 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:353.37,355.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:356.2,356.76 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:356.76,358.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:359.2,359.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:363.44,367.61 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:367.61,369.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:372.2,372.74 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:372.74,376.3 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:378.2,378.35 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:382.44,384.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:387.43,389.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:392.47,396.29 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:396.29,402.3 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:405.2,405.43 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:405.43,407.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:408.2,408.56 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:408.56,410.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:412.2,412.36 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:416.61,430.29 8 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:430.29,435.69 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:435.69,438.41 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:438.41,440.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:440.10,442.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:443.9,443.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:443.24,445.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:448.2,448.44 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:452.63,470.29 10 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:470.29,475.69 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:475.69,478.41 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:478.41,480.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:480.10,482.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:483.9,483.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:483.24,485.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:488.2,488.44 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:492.47,493.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:493.34,495.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:497.2,500.23 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:500.23,507.38 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:507.38,508.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:508.40,509.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:509.51,511.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:516.3,516.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:516.39,517.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:517.40,519.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:523.3,524.32 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:524.32,526.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:527.3,527.33 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:527.33,529.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:531.3,531.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:531.38,532.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:532.25,534.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:538.2,538.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:542.46,552.2 6 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:556.74,560.18 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:560.18,562.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:562.38,567.86 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:567.86,570.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:570.22,579.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:584.3,584.31 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:584.31,586.25 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:586.25,592.32 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:592.32,596.25 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:596.25,598.7 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:599.6,603.23 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:603.23,605.7 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:608.5,608.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:608.23,617.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:619.4,619.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:622.3,622.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:625.2,625.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:629.68,643.50 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:643.50,646.57 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:646.57,648.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:649.8,649.55 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:649.55,652.55 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:652.55,654.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:657.2,657.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:84.30,86.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:90.56,93.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:93.16,95.60 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:98.2,98.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:98.23,100.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:102.2,106.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:110.68,111.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:112.23,113.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:114.31,115.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:116.31,117.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:118.27,119.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:120.22,121.30 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:122.24,123.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:124.25,125.33 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:126.24,128.33 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:129.27,130.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:131.10,134.105 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:139.78,141.34 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:141.34,144.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:145.2,152.34 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:152.34,154.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:156.2,157.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:157.16,159.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:161.2,165.20 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:169.102,171.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:171.42,173.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:176.2,176.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:176.23,180.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:183.2,184.34 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:184.34,188.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:191.2,191.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:192.25,193.45 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:194.25,195.45 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:199.2,200.68 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:200.68,209.3 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:210.2,214.16 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:214.16,216.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:221.2,232.16 9 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:232.16,234.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:237.2,250.8 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:254.54,256.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:259.58,267.15 7 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:267.15,269.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:271.2,272.20 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:272.20,274.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:276.2,285.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:289.33,295.2 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:299.63,303.30 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:303.30,304.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:304.15,306.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:308.3,308.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:308.35,311.21 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:311.21,313.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:315.4,322.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:325.3,325.44 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:325.44,327.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:330.2,331.15 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:336.41,339.2 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:342.36,346.26 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:346.26,347.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:347.22,349.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:351.2,351.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:355.28,359.30 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:359.30,361.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:362.2,365.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:9.115,10.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:10.17,12.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:14.2,15.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:15.17,17.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:19.2,19.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:20.23,21.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:22.56,23.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:24.27,25.55 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:26.40,27.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:28.27,29.55 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:30.10,31.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:36.93,39.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:39.43,42.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:43.31,44.52 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:45.29,46.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:47.27,48.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:49.47,52.15 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:55.3,55.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:55.20,56.73 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:56.73,58.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:59.4,59.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:62.3,62.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:65.2,65.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:68.90,70.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:70.21,72.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:74.2,78.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:81.88,83.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:83.21,85.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:88.2,90.21 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:90.21,92.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:92.51,93.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:93.40,96.5 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:97.4,97.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:101.2,102.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:102.24,104.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:106.2,110.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:113.86,115.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:115.48,117.50 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:117.50,119.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:119.23,120.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:123.4,125.23 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:125.23,126.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:127.24,128.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:129.27,130.37 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:134.4,138.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:141.2,141.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:144.91,147.37 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:147.37,149.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:151.2,151.43 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:151.43,152.63 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:152.63,154.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:154.23,160.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:162.3,162.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:165.2,165.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:169.93,172.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:172.43,175.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:176.31,177.52 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:178.28,179.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:180.28,181.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:182.54,185.15 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:186.32,187.53 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:188.33,189.53 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:192.3,192.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:192.20,193.81 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:193.81,195.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:196.4,196.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:199.3,199.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:202.2,202.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:205.90,207.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:207.21,209.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:211.2,215.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:218.87,220.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:220.21,222.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:224.2,228.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:231.88,233.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:233.21,235.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:237.2,241.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:244.91,247.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:247.43,248.43 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:248.43,250.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:250.23,256.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:258.3,258.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:261.2,261.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:264.91,266.21 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:266.21,268.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:270.2,274.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:277.91,279.21 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:279.21,281.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:283.2,287.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:291.97,294.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:294.43,297.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:298.30,299.56 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:300.27,301.53 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:304.3,304.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:304.20,305.77 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:305.77,307.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:308.4,308.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:311.3,311.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:314.2,314.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:317.94,319.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:319.21,321.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:324.2,326.47 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:326.47,328.69 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:328.69,330.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:333.2,337.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:340.91,342.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:342.21,344.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:346.2,350.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:354.92,357.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:357.43,360.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:361.30,362.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:363.27,364.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:365.26,366.50 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:367.22,369.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:369.32,371.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:374.3,374.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:374.20,375.72 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:375.72,377.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:378.4,378.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:381.3,381.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:384.2,384.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:387.89,389.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:389.23,391.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:394.2,395.52 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:395.52,396.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:396.34,399.4 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:400.3,400.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:403.2,403.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:403.16,405.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:407.2,411.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:414.87,416.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:416.21,418.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:420.2,424.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:427.88,429.21 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:429.21,431.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:433.2,437.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:440.93,442.23 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:442.23,444.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:446.2,447.52 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:447.52,448.34 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:448.34,451.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:452.3,452.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:455.2,455.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:455.16,457.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:459.2,463.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:466.49,468.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:468.43,469.43 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:469.43,472.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:473.3,473.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:475.2,475.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:480.97,483.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:483.43,486.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:487.15,488.52 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:491.3,491.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:491.20,492.77 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:492.77,494.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:495.4,495.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:498.3,498.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:501.2,501.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:505.90,507.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:507.29,509.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:511.2,512.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:512.19,514.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:516.2,518.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:519.19,520.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:521.21,522.75 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:523.31,524.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:525.19,526.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:527.21,528.53 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:529.17,530.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:533.2,533.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:537.92,541.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:541.17,543.31 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:543.31,545.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:547.2,547.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:547.17,549.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:552.2,553.46 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:553.46,554.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:554.29,557.4 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:558.3,558.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:561.2,561.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:561.22,563.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:565.2,569.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:573.110,576.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:576.29,578.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:581.2,582.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:582.20,584.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:586.2,591.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:592.14,594.37 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:594.37,596.23 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:596.23,598.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:600.20,601.43 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:602.25,605.50 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:605.50,606.60 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:606.60,608.59 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:608.59,611.6 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:613.4,613.53 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:613.53,616.5 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:617.4,617.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:621.2,621.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:621.20,623.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:625.2,626.15 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:626.15,628.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:630.2,634.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:638.91,640.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:640.29,642.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:644.2,645.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:645.20,647.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:649.2,651.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:652.14,653.37 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:653.37,655.23 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:655.23,657.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:659.20,660.44 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:663.2,663.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:663.21,665.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:667.2,671.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:675.92,683.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:686.94,688.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:688.29,690.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:692.2,693.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:693.17,695.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:697.2,698.46 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:698.46,699.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:699.29,702.4 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:703.3,703.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:706.2,706.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:706.24,708.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:710.2,714.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:718.90,720.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:720.29,722.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:724.2,725.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:725.17,727.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:729.2,730.46 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:730.46,731.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:731.29,732.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:732.22,734.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:734.10,737.5 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:739.3,739.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:742.2,742.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:742.20,744.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:746.2,750.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:32.106,34.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:34.32,36.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:39.2,40.55 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:40.55,42.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:45.2,54.8 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:58.106,60.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:60.32,62.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:65.2,66.59 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:66.59,68.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:71.2,76.8 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:80.40,85.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:88.58,89.30 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:89.30,91.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:93.2,93.37 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:93.37,95.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:99.46,100.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:100.17,102.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:104.2,104.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:105.25,106.28 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:106.28,108.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:109.3,109.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:110.24,111.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:112.25,113.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:114.23,115.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:116.22,117.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:118.10,119.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:124.61,125.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:125.17,127.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:129.2,132.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:137.68,139.55 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:139.55,141.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:145.2,147.45 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:147.45,148.47 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:148.47,150.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:151.3,151.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:154.2,154.21 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:158.61,160.55 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:160.55,162.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:165.2,170.21 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:174.41,176.55 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:176.55,178.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:179.2,179.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:183.41,185.55 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:185.55,187.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:188.2,188.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:193.49,195.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:113.70,116.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:116.16,118.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:120.2,124.8 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:128.86,129.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:129.23,132.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:135.2,154.16 11 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:154.16,155.44 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:155.44,157.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.3,159.74 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.74,161.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.3,163.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.23,168.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:169.3,171.94 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:175.2,175.47 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:179.53,183.26 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:183.26,185.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.2,188.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.35,190.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.2,193.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.20,195.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.2,198.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.16,200.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.2,203.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.48,205.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.2,208.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.23,210.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.2,213.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.29,215.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.2,218.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.24,220.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:223.2,226.24 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:226.24,227.31 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:227.31,229.30 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:229.30,231.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:233.8,235.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:237.2,237.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:241.94,251.21 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:251.21,253.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:253.21,254.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:257.3,258.52 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:258.52,260.12 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:263.3,263.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:264.16,266.59 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:266.59,267.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.4,271.60 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.60,273.13 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:276.4,284.33 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:284.33,286.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.4,289.53 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.53,292.5 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:294.4,295.33 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:297.18,299.57 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:299.57,300.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:303.4,306.32 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:306.32,308.77 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:308.77,311.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.11,311.65 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.65,314.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:315.10,318.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:320.18,322.61 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:322.61,323.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:325.4,325.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.2,329.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.38,331.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:333.2,333.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:337.65,338.31 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:338.31,340.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:342.2,347.36 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:347.36,348.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:348.48,350.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:351.3,351.55 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:355.2,358.23 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:358.23,360.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:361.2,364.33 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:364.33,367.53 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:367.53,368.107 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:368.107,370.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:373.3,375.39 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:375.39,377.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:377.41,379.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:382.4,385.40 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:385.40,387.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:389.3,389.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:392.2,392.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:396.48,397.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:397.22,399.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:400.2,400.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:68.47,70.13 2 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:71.13,72.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:73.21,74.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:75.37,76.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:77.21,78.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:79.18,80.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:81.45,82.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:83.23,84.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:85.14,86.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:87.15,88.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:89.23,90.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:91.21,92.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:93.10,94.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:98.43,99.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:99.42,100.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:100.25,102.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.3,103.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.48,104.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:107.2,107.11 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:67.51,72.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:76.51,82.2 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:85.83,87.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:91.81,95.2 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:98.99,102.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:102.17,104.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:105.2,105.43 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:109.56,111.65 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:111.65,113.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:116.2,117.87 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:117.87,119.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:122.2,123.37 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:127.102,129.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:129.48,131.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:134.2,135.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:135.16,138.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:141.2,142.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:142.16,144.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:147.2,148.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:148.16,150.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:153.2,154.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:154.16,156.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:159.2,160.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:160.16,166.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:169.2,180.11 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:180.11,184.17 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:184.17,186.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.3,188.67 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:188.67,194.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:195.3,195.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:198.2,198.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:202.101,204.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:204.49,206.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:209.2,210.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:210.16,213.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:216.2,217.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:217.16,219.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:222.2,223.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:223.16,225.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:228.2,239.11 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:239.11,243.17 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:243.17,245.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.3,247.67 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:247.67,253.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:254.3,254.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:257.2,257.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:261.56,262.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:262.21,264.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.2,266.26 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:266.26,268.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:271.2,271.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:272.54,273.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:273.28,275.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:276.18,276.18 0 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:278.10,279.90 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:282.2,282.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:286.55,287.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:287.49,289.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.2,292.118 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.118,294.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:296.2,296.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:300.56,301.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:301.49,303.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:306.2,310.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:310.22,312.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.2,315.37 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:315.37,316.73 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:316.73,318.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:321.2,321.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:325.108,326.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:326.17,328.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:330.2,331.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:331.17,333.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:335.2,337.50 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:337.50,338.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:338.41,340.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:341.3,341.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.2,344.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.23,347.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.2,351.38 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:351.38,353.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:356.2,357.40 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:357.40,359.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:361.2,361.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:367.61,368.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:368.21,370.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:373.2,376.37 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:376.37,377.40 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:377.40,378.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:378.42,380.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:384.2,384.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:388.43,392.27 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:392.27,394.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.2,395.27 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.27,397.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:401.2,407.25 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:407.25,409.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.2,410.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:410.25,412.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:415.2,415.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:419.46,426.46 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:426.46,427.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:427.42,429.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:431.2,431.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:435.88,437.44 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:437.44,439.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.2,442.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:442.20,444.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:444.22,447.50 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:447.50,449.53 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:449.53,450.56 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:450.56,452.12 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.4,456.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:456.14,458.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.9,459.63 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:459.63,461.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.2,465.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:465.20,468.53 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:468.53,470.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.2,474.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:474.23,476.47 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:476.47,478.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:481.2,481.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:485.94,495.24 6 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:496.19,499.48 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:501.24,505.50 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:507.23,511.48 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:513.18,515.48 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:517.10,518.95 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:521.2,521.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:525.63,528.52 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:528.52,530.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:533.2,534.64 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:534.64,536.28 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:536.28,538.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:538.9,539.9 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:543.2,543.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:547.58,548.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:548.18,550.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:552.2,553.29 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:553.29,554.26 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:554.26,556.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:559.2,559.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:564.63,578.29 8 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:578.29,580.30 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:580.30,582.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:582.39,583.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:586.4,586.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:587.35,588.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:589.35,590.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:591.34,593.14 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:598.2,598.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:602.99,603.9 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:604.22,605.55 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:606.29,607.65 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:608.22,609.59 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:610.10,611.99 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:616.100,617.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:617.16,619.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:621.2,626.6 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:626.6,628.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:628.16,629.9 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:631.3,635.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.2,638.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:638.23,640.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.2,643.36 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:643.36,648.29 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:648.29,649.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:649.14,651.10 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:653.4,654.63 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:656.3,657.65 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.2,660.27 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.27,662.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:664.2,664.54 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:668.106,670.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:670.16,672.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:674.2,675.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:675.23,677.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.2,680.36 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:680.36,682.29 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:682.29,683.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:683.14,685.10 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:687.4,688.63 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:690.3,691.65 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.2,694.27 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:694.27,696.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:698.2,698.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:702.100,703.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:703.18,705.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.2,707.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:707.19,709.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.2,711.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:711.25,713.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:715.2,722.28 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:722.28,724.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.2,725.26 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.26,727.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:730.2,731.32 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:731.32,733.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:735.2,736.38 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:736.38,738.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:738.23,740.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:743.2,743.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:747.126,754.12 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:755.19,758.44 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:760.24,764.46 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:766.23,770.44 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:772.18,774.44 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:776.10,777.83 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:780.2,780.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:784.66,787.52 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:787.52,789.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:792.2,793.59 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:793.59,795.28 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:795.28,797.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:797.9,798.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:802.2,802.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:806.50,807.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:807.22,809.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:810.2,810.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:814.37,816.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:821.46,823.34 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:823.34,825.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:826.2,826.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:40.24,54.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:58.50,62.25 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:62.25,64.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:64.17,66.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:67.3,67.30 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.8,68.47 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:68.47,70.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:73.2,74.54 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:74.54,75.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:75.51,77.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:81.2,83.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:86.32,87.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:87.51,88.50 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:88.50,90.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.2,93.48 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:93.48,94.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:94.50,96.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.2,99.51 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:99.51,100.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:100.50,102.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.2,105.64 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:105.64,107.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.2,109.69 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:109.69,111.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.2,113.71 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:113.71,115.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:120.50,123.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:123.16,125.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:128.2,129.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:129.16,131.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:134.2,135.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:135.20,137.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:140.2,141.20 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:141.20,144.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:144.8,150.50 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:150.50,152.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:152.22,155.10 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:158.4,159.21 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:159.21,161.10 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:163.4,164.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:169.2,170.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:170.16,172.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:177.2,177.52 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:185.35,187.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:187.24,189.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.2,192.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:192.25,194.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.2,197.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:197.23,199.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.2,202.27 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:202.27,204.17 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:204.17,205.26 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:205.26,207.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:208.4,208.62 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.3,210.20 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:210.20,212.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/config/config.go:215.2,215.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:40.68,52.16 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:52.16,54.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:55.2,58.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:58.19,60.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:63.2,73.15 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:77.34,88.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:88.23,120.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:123.2,185.25 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:185.25,251.3 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:254.2,336.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:340.108,342.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:345.114,347.15 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:347.15,351.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:353.2,353.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:353.23,355.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:358.2,359.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:359.16,361.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:363.2,375.16 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:375.16,377.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:379.2,387.43 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:391.112,393.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:393.16,395.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:398.2,398.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:398.32,400.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:403.2,404.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:404.16,405.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:405.25,407.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:408.3,408.27 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:408.27,410.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:411.3,411.81 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:415.2,415.45 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:415.45,417.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:420.2,425.19 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:425.19,427.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:428.2,428.26 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:428.26,430.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:431.2,431.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:431.25,433.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:435.2,443.32 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:443.32,445.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:447.2,447.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:447.16,449.23 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:449.23,451.20 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:451.20,453.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:458.2,458.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:458.18,461.55 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:461.55,463.30 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:463.30,465.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:465.18,467.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:472.3,472.67 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:472.67,474.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:477.2,477.52 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:481.94,484.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:484.16,486.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:489.2,491.23 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:491.23,493.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:495.2,499.52 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:499.52,500.106 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:500.106,502.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:505.2,508.30 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:508.30,511.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:513.2,513.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:517.54,518.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:519.31,520.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:521.29,522.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:523.28,524.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:525.29,526.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:527.32,528.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:529.31,530.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:531.31,532.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:533.27,534.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:535.28,536.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:537.31,538.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:539.29,540.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:541.30,542.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:543.10,544.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:548.36,553.33 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:553.33,557.22 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:557.22,559.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:561.3,561.40 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:561.40,563.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:564.3,564.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:568.2,568.31 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:572.112,574.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:574.16,576.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:578.2,579.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:579.16,581.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:584.2,598.21 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:598.21,600.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:603.2,604.15 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:604.15,606.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:608.2,611.35 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:611.35,613.39 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:613.39,614.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:617.3,617.89 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:617.89,619.11 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:620.22,621.21 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:622.12,622.12 0 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:625.4,625.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:625.18,627.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:629.4,629.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:629.20,631.44 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:631.44,633.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:634.5,634.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:638.4,638.37 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:638.37,640.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:643.4,644.18 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:644.18,646.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:649.4,649.47 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:649.47,651.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:654.4,655.18 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:655.18,657.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:660.4,661.18 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:661.18,663.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:665.4,668.55 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:668.55,670.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:672.4,672.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:674.3,674.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:674.17,676.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:680.2,681.43 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:685.50,686.35 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:687.12,688.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:689.20,690.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:691.20,692.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:693.16,694.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:695.11,696.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:697.20,698.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:699.16,700.15 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:701.10,702.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:707.112,709.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:709.16,711.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:713.2,714.15 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:714.15,716.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:718.2,719.14 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:719.14,721.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:724.2,724.32 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:724.32,726.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:729.2,730.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:730.16,733.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:735.2,735.18 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:735.18,737.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:739.2,743.52 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:747.119,749.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:749.16,751.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:753.2,754.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:754.16,756.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:758.2,759.17 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:759.17,761.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:763.2,768.52 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:772.118,774.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:774.16,776.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:778.2,779.15 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:779.15,781.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:783.2,784.14 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:784.14,786.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:789.2,789.32 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:789.32,791.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:793.2,794.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:794.16,796.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:798.2,798.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:798.25,800.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:802.2,805.32 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:805.32,811.20 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:811.20,815.4 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:816.3,816.27 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:819.2,819.52 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:823.118,825.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:825.16,827.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:829.2,830.15 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:830.15,832.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:834.2,835.14 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:835.14,837.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:839.2,842.32 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:842.32,844.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:846.2,847.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:847.16,849.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:851.2,851.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:851.25,853.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:855.2,860.32 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:860.32,863.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:865.2,865.41 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:865.41,867.28 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:867.28,869.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:870.3,870.27 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:873.2,873.52 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:877.66,879.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:879.16,881.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:883.2,888.61 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:888.61,890.26 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:890.26,892.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:893.3,894.18 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:894.18,896.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:897.3,897.73 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:900.2,900.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:904.115,906.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:909.113,911.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:914.120,916.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:916.16,918.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:920.2,921.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:921.16,923.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:926.2,926.32 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:926.32,928.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:934.2,953.11 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:953.11,955.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:955.8,957.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:959.2,959.16 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:959.16,961.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:963.2,963.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:963.21,965.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:968.2,969.11 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:969.11,971.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:971.8,973.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:975.2,979.52 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:983.49,996.12 7 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:996.12,1002.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1005.2,1005.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1006.24,1014.49 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1014.49,1017.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1019.3,1020.13 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1022.24,1024.13 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1026.20,1031.49 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1031.49,1033.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1035.3,1035.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1040.54,1044.25 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1044.25,1046.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1049.2,1049.21 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1049.21,1051.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:1053.2,1053.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:31.24,235.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:238.32,251.29 9 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:251.29,252.46 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:252.46,254.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:255.3,255.70 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.2,258.36 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:258.36,260.40 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:260.40,262.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:263.3,263.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:267.2,270.36 3 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:270.36,273.40 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:273.40,278.21 3 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:278.21,280.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:280.10,282.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.4,285.32 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:285.32,289.43 4 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:289.43,291.24 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:291.24,293.7 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:294.6,295.60 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:297.5,297.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:298.10,300.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.4,303.30 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:303.30,305.43 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:305.43,309.6 3 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.4,313.27 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:313.27,315.37 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:315.37,317.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:318.5,318.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:321.4,321.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:326.2,356.20 28 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:359.13,364.22 3 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:364.22,366.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.2,369.51 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:369.51,372.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.2,374.72 1 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:374.72,377.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/cmd/docgen/main.go:379.2,379.61 1 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:58.40,60.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:70.48,72.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:70.48,72.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:72.16,74.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:76.2,77.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:76.2,77.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:77.16,80.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:82.2,83.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:82.2,83.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:83.16,87.3 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.2,89.36 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.2,89.36 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:89.36,94.3 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:96.2,110.15 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:114.98,116.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:96.2,110.15 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:114.98,116.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:116.16,119.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:120.2,136.15 8 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:136.15,140.3 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.2,143.36 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:120.2,136.15 8 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:136.15,140.3 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.2,143.36 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:143.36,145.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:148.2,148.9 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:148.2,148.9 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:149.20,150.24 1 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:151.16,152.42 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:153.26,154.24 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:153.26,154.24 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:154.24,156.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:157.3,157.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:157.3,157.19 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:162.66,164.16 2 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:164.16,167.3 2 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:168.2,180.22 3 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:184.55,186.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:189.32,191.23 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:191.23,203.13 7 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:203.13,206.4 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:208.3,208.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:209.15,209.15 0 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:189.32,191.23 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:191.23,203.13 7 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:203.13,206.4 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:208.3,208.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:209.15,209.15 0 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:211.38,213.28 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:216.3,216.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:218.2,218.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:222.46,224.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:216.3,216.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:218.2,218.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:222.46,224.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:224.16,226.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:229.2,231.16 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:229.2,231.16 3 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:231.16,233.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:235.2,236.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:235.2,236.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:236.16,238.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:240.2,240.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:244.29,247.6 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:247.6,248.10 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:240.2,240.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:244.29,247.6 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:247.6,248.10 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:249.17,250.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:251.11,251.11 0 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:255.3,256.7 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:256.7,258.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:258.18,260.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:261.4,262.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:262.18,263.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.4,265.50 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.50,268.5 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.3,271.25 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:251.11,251.11 0 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:255.3,256.7 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:256.7,258.18 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:258.18,260.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:261.4,262.18 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:262.18,263.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.4,265.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:265.50,268.5 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.3,271.25 1 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:271.25,272.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:276.3,278.17 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:276.3,278.17 3 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:278.17,280.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:283.3,284.69 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:284.69,286.40 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:286.40,288.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:289.4,290.12 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:283.3,284.69 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:284.69,286.40 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:286.40,288.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:289.4,290.12 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:294.3,295.76 2 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:295.76,296.11 1 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:297.35,297.35 0 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:298.12,298.12 0 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/client.go:306.35,310.2 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:74.69,88.2 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:91.98,96.25 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:74.69,88.2 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:91.98,96.25 4 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:96.25,102.3 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:105.2,109.49 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:105.2,109.49 3 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:109.49,114.3 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:117.2,118.9 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:118.9,122.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:125.2,126.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:117.2,118.9 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:118.9,122.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:125.2,126.16 2 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:126.16,128.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:131.2,138.16 6 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:131.2,138.16 6 1
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:138.16,140.25 1 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:140.25,142.4 1 0
github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:143.3,146.97 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:149.2,157.56 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:157.56,160.25 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:160.25,162.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:163.3,167.70 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:170.2,174.20 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:178.83,204.16 6 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:204.16,206.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:209.2,210.61 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:210.61,212.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:213.2,216.69 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:216.69,218.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:220.2,220.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:224.96,227.16 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:227.16,229.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:232.2,233.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:233.16,235.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:237.2,253.16 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:253.16,255.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:257.2,257.57 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:257.57,259.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:261.2,262.61 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:262.61,264.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:266.2,266.21 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:270.99,273.16 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:273.16,275.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:278.2,279.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:279.16,281.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:283.2,299.16 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:299.16,301.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:303.2,303.57 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:303.57,305.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:308.2,309.64 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:309.64,312.62 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:312.62,314.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:317.2,317.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:321.124,324.16 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:324.16,326.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:329.2,330.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:330.16,332.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:334.2,353.16 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:353.16,355.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:357.2,357.57 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:357.57,359.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:361.2,362.64 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:362.64,364.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:366.2,366.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:370.98,374.36 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:374.36,377.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:378.2,382.16 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:382.16,384.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:387.2,398.74 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:398.74,400.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:402.2,406.12 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:410.95,415.23 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:415.23,417.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:419.2,422.37 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:422.37,425.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:426.2,435.59 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:439.37,443.6 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:443.6,444.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:445.23,446.10 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:447.19,449.37 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:449.37,455.13 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:455.13,459.6 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:461.4,461.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:467.33,475.35 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:475.35,483.3 6 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:485.2,486.12 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:490.60,492.9 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:492.9,494.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:496.2,497.19 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:501.36,503.16 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:503.16,505.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:506.2,506.28 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:510.35,511.42 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:511.42,513.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:514.2,514.12 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:518.53,519.14 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:520.23,521.14 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:522.31,523.22 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:524.31,525.22 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:526.27,527.18 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:528.22,529.13 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:530.24,531.15 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:532.10,533.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:149.2,158.15 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:158.15,159.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:159.19,162.26 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:162.26,164.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:169.2,169.56 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:169.56,175.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:178.2,184.20 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:188.83,214.16 6 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:214.16,216.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:219.2,220.61 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:220.61,222.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:223.2,226.69 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:226.69,228.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:230.2,230.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:234.96,237.16 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:237.16,239.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:242.2,243.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:243.16,245.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:247.2,263.16 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:263.16,265.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:267.2,267.57 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:267.57,269.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:271.2,272.61 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:272.61,274.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:276.2,276.21 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:280.99,283.16 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:283.16,285.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:288.2,289.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:289.16,291.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:293.2,309.16 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:309.16,311.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:313.2,313.57 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:313.57,315.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:318.2,319.64 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:319.64,322.62 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:322.62,324.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:327.2,327.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:331.124,334.16 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:334.16,336.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:339.2,340.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:340.16,342.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:344.2,363.16 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:363.16,365.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:367.2,367.57 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:367.57,369.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:371.2,372.64 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:372.64,374.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:376.2,376.23 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:380.98,384.36 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:384.36,387.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:388.2,392.16 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:392.16,394.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:397.2,408.74 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:408.74,410.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:412.2,416.12 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:420.95,425.23 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:425.23,427.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:429.2,432.37 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:432.37,435.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:436.2,445.59 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:449.37,453.6 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:453.6,454.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:455.23,456.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:457.19,459.37 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:459.37,465.13 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:465.13,469.6 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:471.4,471.17 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:477.33,485.35 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:485.35,493.3 6 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:495.2,496.12 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:500.60,502.9 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:502.9,504.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:506.2,507.19 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:511.36,513.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:513.16,515.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:516.2,516.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:520.35,521.42 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:521.42,523.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:524.2,524.12 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:528.53,529.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:530.23,531.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:532.31,533.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:534.31,535.22 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:536.27,537.18 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:538.22,539.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:540.24,541.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/lsp/manager.go:542.10,543.22 1 1
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:14.13,28.16 5 0
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:28.16,31.3 2 0
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:33.2,40.16 3 0
@@ -222,6 +1511,87 @@ github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:72.17,75.4 1 0
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:75.9,77.4 1 0
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:78.8,81.3 1 0
github.com/lukaszraczylo/mcp-filepuff/cmd/mcp-filepuff/main.go:83.2,83.26 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:23.71,29.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:32.25,34.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:37.36,39.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:42.33,44.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:47.27,49.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:60.67,66.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:69.32,71.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:74.23,76.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:79.23,81.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:84.34,86.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:89.31,91.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:111.94,112.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:112.20,114.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:116.2,127.10 5 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:131.42,137.34 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:137.34,138.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:138.19,141.4 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:144.2,144.33 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:148.54,150.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:153.35,155.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:158.35,160.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:171.30,177.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:180.82,183.34 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:183.34,186.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:187.2,193.34 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:193.34,195.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:197.2,199.10 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:203.78,206.32 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:206.32,209.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:210.2,215.32 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:215.32,217.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:219.2,221.10 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:225.105,228.36 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:228.36,231.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:232.2,237.36 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:237.36,239.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:241.2,243.10 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:247.62,248.22 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:248.22,250.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:251.2,252.27 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:252.27,254.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:255.2,256.52 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:260.52,261.22 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:261.22,263.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:264.2,265.27 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:265.27,267.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:268.2,269.45 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:273.36,280.31 4 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:280.31,281.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:281.19,283.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:284.3,285.91 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:289.2,289.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:289.29,290.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:290.19,292.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:293.3,294.91 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:298.2,298.33 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:298.33,299.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:299.19,301.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:302.3,306.35 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:306.35,309.22 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:309.22,311.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:311.10,315.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:318.3,320.21 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:320.21,322.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:322.9,325.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:328.3,329.97 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:332.2,332.20 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:336.28,340.31 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:340.31,342.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:343.2,343.29 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:343.29,345.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:371.40,423.2 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:426.41,428.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:431.46,433.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:436.74,439.16 3 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:439.16,441.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:445.72,447.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:447.16,449.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:453.42,455.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:458.43,460.2 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/metrics/metrics.go:463.58,465.2 1 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:76.42,83.24 3 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:83.24,85.31 2 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:85.31,87.4 1 0
@@ -268,1332 +1638,145 @@ github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:266.73,270.2 1 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:273.61,277.2 1 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:280.64,283.2 1 0
github.com/lukaszraczylo/mcp-filepuff/pkg/errors/errors.go:286.59,289.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:24.59,26.48 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:26.48,28.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:31.2,32.16 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:32.16,34.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:36.2,37.16 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:87.51,92.2 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:96.51,102.2 4 24
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:105.83,107.2 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:111.81,115.2 3 24
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:118.99,122.17 2 25
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:122.17,124.3 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:125.2,125.43 1 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:129.56,131.65 1 25
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:131.65,133.3 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:136.2,137.87 1 20
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:137.87,139.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:142.2,143.37 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:147.102,149.48 1 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:149.48,151.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:154.2,155.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:155.16,158.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:161.2,162.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:162.16,164.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:167.2,168.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:168.16,170.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:173.2,174.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:174.16,176.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:179.2,180.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:180.16,186.3 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:189.2,200.11 3 18
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:200.11,201.67 1 17
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:201.67,207.4 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:208.3,208.24 1 17
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:211.2,211.20 1 18
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:215.101,217.49 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:217.49,219.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:222.2,223.16 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:223.16,226.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:229.2,230.16 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:230.16,232.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:235.2,236.16 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:236.16,238.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:241.2,252.11 3 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:252.11,253.67 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:253.67,259.4 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:260.3,260.24 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:263.2,263.20 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:267.56,268.21 1 37
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:268.21,270.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:272.2,272.26 1 36
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:272.26,274.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:277.2,277.24 1 35
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:278.54,279.28 1 33
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:279.28,281.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:282.18,282.18 0 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:284.10,285.90 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:288.2,288.12 1 33
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:292.55,293.49 1 26
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:293.49,295.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:298.2,298.118 1 22
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:298.118,300.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:302.2,302.12 1 21
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:306.56,307.49 1 11
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:307.49,309.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:312.2,316.22 2 11
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:316.22,318.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:321.2,321.37 1 10
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:321.37,322.68 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:322.68,324.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:327.2,327.12 1 9
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:331.108,332.17 1 29
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:332.17,334.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:336.2,337.17 2 29
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:337.17,339.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:341.2,343.50 2 29
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:343.50,344.41 1 834
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:344.41,346.4 1 39
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:347.3,347.14 1 834
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:350.2,350.23 1 29
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:350.23,353.3 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:356.2,357.40 2 28
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:357.40,359.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:361.2,361.28 1 27
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:365.88,367.44 1 834
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:367.44,369.3 1 670
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:372.2,372.20 1 164
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:372.20,374.22 2 109
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:374.22,377.50 2 86
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:377.50,379.53 2 28
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:379.53,380.56 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:380.56,382.12 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:386.4,386.14 1 86
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:386.14,388.5 1 86
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:389.9,389.63 1 23
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:389.63,391.4 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.2,395.20 1 74
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:395.20,398.53 3 45
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:398.53,400.4 1 35
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:404.2,404.23 1 39
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:404.23,406.47 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:406.47,408.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:411.2,411.13 1 39
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:415.94,425.24 6 23
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:426.19,429.48 3 20
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:431.24,435.50 4 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:437.23,441.48 4 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:443.18,445.48 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:447.10,448.95 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:451.2,451.20 1 23
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:455.63,458.52 2 26
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:458.52,460.3 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:463.2,464.64 2 26
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:464.64,466.28 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:466.28,468.4 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:468.9,469.9 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:473.2,473.24 1 26
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:477.58,478.18 1 28
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:478.18,480.3 1 27
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:482.2,483.29 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:483.29,484.26 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:484.26,486.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:489.2,489.34 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:494.63,508.29 8 24
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:508.29,510.30 2 97
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:510.30,512.39 1 213
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:512.39,513.13 1 28
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:516.4,516.21 1 185
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:517.35,518.48 1 20
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:519.35,520.48 1 26
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:521.34,523.14 2 139
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:528.2,528.21 1 24
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:532.99,533.9 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:534.22,535.55 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:536.29,537.65 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:538.22,539.59 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:540.10,541.99 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:546.100,547.16 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:547.16,549.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:551.2,556.6 5 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:556.6,558.16 2 10
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:558.16,559.9 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:561.3,565.20 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:568.2,568.23 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:568.23,570.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:573.2,573.36 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:573.36,578.29 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:578.29,579.14 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:579.14,581.10 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:583.4,584.63 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:586.3,587.65 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:590.2,590.27 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:590.27,592.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:594.2,594.54 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:598.106,600.16 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:600.16,602.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:604.2,605.23 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:605.23,607.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:610.2,610.36 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:610.36,612.29 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:612.29,613.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:613.14,615.10 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:617.4,618.63 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:620.3,621.65 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:624.2,624.27 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:624.27,626.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:628.2,628.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:632.100,633.18 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:633.18,635.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:637.2,637.19 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:637.19,639.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:641.2,641.25 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:641.25,643.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:645.2,652.28 5 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:652.28,654.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:655.2,655.26 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:655.26,657.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:660.2,661.32 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:661.32,663.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:665.2,666.38 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:666.38,668.23 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:668.23,670.4 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:673.2,673.24 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:677.126,684.12 4 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:685.19,688.44 3 4
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:690.24,694.46 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:696.23,700.44 4 1
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:702.18,704.44 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:706.10,707.83 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:710.2,710.20 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:714.66,717.52 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:717.52,719.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:722.2,723.59 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:723.59,725.28 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:725.28,727.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:727.9,728.9 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:732.2,732.24 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:736.50,737.22 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:737.22,739.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:740.2,740.29 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:744.37,746.2 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:751.46,753.34 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:753.34,755.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/edit/edit.go:756.2,756.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:22.59,24.48 1 114
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:24.48,26.3 1 103
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:29.2,30.16 2 11
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:30.16,32.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:36.2,37.37 2 10
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:102.53,104.2 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:107.59,108.19 1 17
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:108.19,110.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:112.2,123.72 7 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:123.72,130.3 2 9
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:133.2,133.74 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:133.74,136.3 2 9
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:139.2,139.67 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:139.67,145.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:148.2,148.77 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:148.77,151.3 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:155.2,156.75 2 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:156.75,159.78 2 17
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:159.78,160.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:162.3,166.5 1 17
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:170.2,170.75 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:170.75,172.78 2 17
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:172.78,174.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:175.3,176.49 2 17
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:179.2,183.8 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.138,188.25 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:188.25,190.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:192.2,193.48 2 13
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:193.48,195.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:198.2,199.16 2 11
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:199.16,201.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:203.2,207.17 3 11
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:207.17,209.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:211.2,211.50 1 11
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:211.50,213.10 1 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:214.21,215.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:216.11,216.11 0 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:220.3,220.66 1 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:220.66,222.49 1 29
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:222.49,224.5 1 9
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:226.4,236.6 2 20
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:239.3,239.14 1 738
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:242.2,242.21 1 11
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:247.107,248.17 1 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:248.17,250.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:252.2,258.26 3 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:263.126,268.92 3 747
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:268.92,269.114 1 522
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:269.114,271.4 1 498
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:272.3,273.14 2 24
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:277.2,277.46 1 225
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:277.46,278.72 1 170
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:278.72,280.4 1 168
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:281.3,282.14 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:286.2,286.134 1 55
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:286.134,287.71 1 55
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:287.71,289.4 1 52
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:290.3,291.14 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:295.2,295.50 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:295.50,296.76 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:296.76,298.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:299.3,300.14 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:303.2,303.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:307.122,308.34 1 24
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:308.34,309.19 1 34
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:310.23,311.66 1 24
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:311.66,316.5 1 24
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:317.43,318.76 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:318.76,320.60 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:320.60,322.6 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:323.5,326.6 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:328.23,329.66 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:329.66,334.5 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:335.47,336.72 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:336.72,341.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:347.119,348.34 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:348.34,349.19 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:350.23,351.66 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:351.66,356.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:357.23,358.66 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:358.66,363.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:364.57,365.78 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:365.78,370.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:376.120,377.34 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:377.34,378.19 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:379.23,381.41 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:381.41,382.54 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:382.54,384.53 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:384.53,385.70 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:385.70,390.8 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:393.10,393.73 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:393.73,398.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:399.43,400.66 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:400.66,405.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:411.123,412.34 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:412.34,413.19 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:414.23,415.66 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:415.66,420.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.45,422.66 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:422.66,427.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:433.82,435.31 1 29
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:435.31,437.22 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:437.22,439.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:440.3,442.17 3 7
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:442.17,444.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:445.3,445.28 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:445.28,447.4 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:451.2,451.29 1 25
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:451.29,453.22 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:453.22,455.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:456.3,457.32 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:457.32,459.4 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:463.2,463.29 1 20
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:463.29,466.39 3 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:466.39,467.24 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:467.24,469.10 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.3,472.13 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.13,474.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:477.2,477.13 1 20
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:481.66,482.23 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:482.23,484.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:486.2,491.49 5 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:491.49,494.3 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:496.2,496.36 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:496.36,499.20 3 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:499.20,501.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:502.3,506.22 3 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:506.22,508.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.3,514.26 4 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:514.26,517.38 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:517.38,518.15 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:518.15,520.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:521.5,523.26 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:523.26,525.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:526.5,526.57 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:528.4,528.24 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:530.3,530.23 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:533.2,533.15 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:533.15,535.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:537.2,537.20 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:9.72,10.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:10.17,12.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:14.2,15.17 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:15.17,17.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:20.2,25.37 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:29.74,30.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:30.17,32.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:34.2,38.48 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:38.48,40.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:43.2,43.46 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:43.46,45.19 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:45.19,46.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:48.3,48.61 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:48.61,50.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:54.2,54.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:58.56,60.86 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:60.86,62.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:64.2,64.81 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:64.81,66.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:67.2,67.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:71.68,72.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:72.17,74.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:76.2,77.21 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:77.21,78.29 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:78.29,80.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:81.3,81.29 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:83.2,83.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:87.60,88.17 1 76
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:88.17,90.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:92.2,95.59 3 76
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:95.59,97.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:99.2,99.35 1 76
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:104.62,105.17 1 645
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:105.17,107.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:109.2,109.15 1 645
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:109.15,111.3 1 22
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:113.2,113.46 1 623
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:113.46,115.3 1 614
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:119.69,122.43 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:122.43,123.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:123.23,125.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:126.3,126.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:129.2,129.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:133.58,134.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:134.17,136.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:138.2,139.51 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:139.51,140.48 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:140.48,142.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:144.2,144.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:148.76,149.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:149.17,151.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:152.2,152.41 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:156.73,157.17 1 24
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:157.17,159.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:161.2,166.3 2 24
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:170.67,171.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:171.17,173.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/ast.go:175.2,189.3 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:35.92,36.14 1 35
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:36.14,38.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:40.2,40.14 1 35
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:41.23,42.41 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:43.56,44.41 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:45.27,46.45 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:47.40,48.40 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:49.27,50.45 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:51.10,52.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:58.70,60.24 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:60.24,62.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:64.2,69.29 5 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:69.29,73.22 3 9
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:73.22,75.4 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:76.3,79.20 3 9
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:79.20,81.4 1 9
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:84.2,84.21 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:84.21,86.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:88.2,95.3 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:99.70,101.24 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:101.24,103.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:106.2,107.42 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:107.42,109.56 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:109.56,111.9 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:115.2,115.25 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:115.25,126.3 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:129.2,134.29 5 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:134.29,138.22 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:138.22,140.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:141.3,144.20 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:144.20,146.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:149.2,149.21 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:149.21,151.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:153.2,160.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:165.74,168.17 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:168.17,170.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:173.2,173.32 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:173.32,175.61 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:175.61,176.35 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:176.35,178.47 2 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:178.47,189.6 3 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:195.2,196.24 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:196.24,198.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:200.2,205.29 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:205.29,209.22 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:209.22,211.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:212.3,216.20 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:216.20,218.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:221.2,221.21 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:221.21,223.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:225.2,232.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:236.69,238.24 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:238.24,240.3 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:243.2,244.42 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:244.42,247.114 3 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:247.114,249.9 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:253.2,253.24 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:253.24,264.3 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:267.2,272.29 5 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:272.29,276.22 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:276.22,278.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:279.3,282.20 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:282.20,284.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:287.2,287.21 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:287.21,289.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:291.2,298.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:302.95,309.18 4 25
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:309.18,312.35 3 31
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:312.35,313.22 1 31
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:313.22,315.10 2 15
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:319.3,319.17 1 31
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:319.17,320.9 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:323.3,326.41 2 15
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:326.41,327.9 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:330.3,332.28 3 15
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:335.2,335.17 1 25
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:339.54,341.39 2 17
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:341.39,343.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:344.2,344.76 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:344.76,346.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:347.2,347.38 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:347.38,349.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:350.2,350.38 1 10
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:350.38,352.3 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:353.2,353.37 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:353.37,355.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:356.2,356.76 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:356.76,358.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:359.2,359.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:363.44,367.61 2 12
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:367.61,369.3 1 9
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:372.2,372.74 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:372.74,376.3 3 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:378.2,378.35 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:382.44,384.2 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:387.43,389.2 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:392.47,396.29 3 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:396.29,402.3 4 17
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:405.2,405.43 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:405.43,407.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:408.2,408.56 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:408.56,410.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:412.2,412.36 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:416.61,430.29 8 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:430.29,435.69 4 18
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:435.69,438.41 3 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:438.41,440.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:440.10,442.5 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:443.9,443.24 1 11
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:443.24,445.4 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:448.2,448.44 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:452.63,470.29 10 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:470.29,475.69 4 17
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:475.69,478.41 3 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:478.41,480.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:480.10,482.5 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:483.9,483.24 1 10
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:483.24,485.4 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:488.2,488.44 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:492.47,493.34 1 10
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:493.34,495.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:497.2,500.23 3 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:500.23,507.38 4 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:507.38,508.40 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:508.40,509.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:509.51,511.6 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:516.3,516.39 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:516.39,517.40 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:517.40,519.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:523.3,524.32 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:524.32,526.4 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:527.3,527.33 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:527.33,529.4 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:531.3,531.38 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:531.38,532.25 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:532.25,534.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:538.2,538.39 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:542.46,552.2 6 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:556.74,560.18 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:560.18,562.38 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:562.38,567.86 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:567.86,570.22 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:570.22,579.6 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:584.3,584.31 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:584.31,586.25 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:586.25,592.32 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:592.32,596.25 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:596.25,598.7 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:599.6,603.23 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:603.23,605.7 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:608.5,608.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:608.23,617.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:619.4,619.9 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:622.3,622.28 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:625.2,625.12 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:629.68,643.50 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:643.50,646.57 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:646.57,648.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:649.8,649.55 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:649.55,652.55 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:652.55,654.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/docextract.go:657.2,657.38 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:58.30,61.16 2 19
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:61.16,63.60 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:66.2,69.3 1 19
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:73.68,74.14 1 28
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:75.23,76.35 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:77.31,78.39 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:79.31,80.39 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:81.27,82.35 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:83.22,84.30 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:85.24,86.32 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:87.25,88.33 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:89.24,91.33 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:92.27,93.35 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:94.10,97.105 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:102.78,104.34 2 140
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:104.34,107.3 2 112
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:108.2,115.34 4 28
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:115.34,117.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:119.2,120.16 2 28
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:120.16,122.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:124.2,128.20 4 27
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:132.102,134.32 1 137
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:134.32,136.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:139.2,139.23 1 137
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:139.23,143.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:146.2,147.34 2 137
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:147.34,151.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:154.2,154.14 1 136
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:155.25,156.45 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:157.25,158.45 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:162.2,163.68 2 133
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:163.68,171.3 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:174.2,175.16 2 131
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:175.16,177.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:181.2,185.16 4 131
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:185.16,187.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:190.2,203.8 3 131
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:207.63,211.30 3 133
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:211.30,212.15 1 2577
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:212.15,214.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:216.3,216.35 1 2577
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:216.35,219.21 3 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:219.21,221.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:223.4,230.6 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:233.3,233.44 1 2577
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:233.44,235.4 1 2444
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:238.2,239.15 2 133
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:244.41,247.2 2 142
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:250.36,254.26 2 140
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:254.26,255.22 1 6678
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:255.22,257.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:259.2,259.14 1 139
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:263.28,267.30 3 17
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:267.30,269.3 1 25
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/parser.go:270.2,273.17 2 17
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:9.115,10.17 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:10.17,12.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:14.2,15.17 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:15.17,17.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:19.2,19.14 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:20.23,21.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:22.56,23.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:24.27,25.55 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:26.40,27.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:28.27,29.55 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:30.10,31.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:36.93,39.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:39.43,42.19 2 84
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:43.31,44.52 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:45.29,46.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:47.27,48.48 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:49.47,52.15 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:55.3,55.20 1 82
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:55.20,56.73 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:56.73,58.5 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:59.4,59.38 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:62.3,62.14 1 82
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:65.2,65.16 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:68.90,70.21 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:70.21,72.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:74.2,78.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:81.88,83.21 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:83.21,85.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:88.2,90.21 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:90.21,92.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:92.51,93.40 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:93.40,96.5 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:97.4,97.15 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:101.2,102.24 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:102.24,104.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:106.2,110.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:113.86,115.48 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:115.48,117.50 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:117.50,119.23 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:119.23,120.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:123.4,125.23 3 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:125.23,126.28 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:127.24,128.34 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:129.27,130.37 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:134.4,138.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:141.2,141.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:144.91,147.37 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:147.37,149.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:151.2,151.43 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:151.43,152.63 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:152.63,154.23 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:154.23,160.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:162.3,162.14 1 16
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:165.2,165.16 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:169.93,172.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:172.43,175.19 2 81
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:176.31,177.52 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:178.28,179.49 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:180.28,181.50 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:182.54,185.15 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:186.32,187.53 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:188.33,189.53 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:192.3,192.20 1 79
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:192.20,193.81 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:193.81,195.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:196.4,196.38 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:199.3,199.14 1 79
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:202.2,202.16 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:205.90,207.21 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:207.21,209.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:211.2,215.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:218.87,220.21 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:220.21,222.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:224.2,228.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:231.88,233.21 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:233.21,235.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:237.2,241.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:244.91,247.43 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:247.43,248.43 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:248.43,250.23 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:250.23,256.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:258.3,258.14 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:261.2,261.16 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:264.91,266.21 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:266.21,268.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:270.2,274.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:277.91,279.21 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:279.21,281.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:283.2,287.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:291.97,294.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:294.43,297.19 2 73
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:298.30,299.56 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:300.27,301.53 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:304.3,304.20 1 73
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:304.20,305.77 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:305.77,307.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:308.4,308.38 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:311.3,311.14 1 73
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:314.2,314.16 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:317.94,319.21 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:319.21,321.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:324.2,326.47 3 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:326.47,328.69 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:328.69,330.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:333.2,337.3 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:340.91,342.21 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:342.21,344.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:346.2,350.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:354.92,357.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:357.43,360.19 2 92
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:361.30,362.51 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:363.27,364.49 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:365.26,366.50 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:367.22,369.32 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:369.32,371.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:374.3,374.20 1 92
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:374.20,375.72 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:375.72,377.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:378.4,378.38 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:381.3,381.14 1 92
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:384.2,384.16 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:387.89,389.23 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:389.23,391.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:394.2,395.52 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:395.52,396.34 1 15
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:396.34,399.4 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:400.3,400.14 1 12
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:403.2,403.16 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:403.16,405.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:407.2,411.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:414.87,416.21 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:416.21,418.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:420.2,424.3 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:427.88,429.21 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:429.21,431.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:433.2,437.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:440.93,442.23 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:442.23,444.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:446.2,447.52 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:447.52,448.34 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:448.34,451.4 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:452.3,452.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:455.2,455.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:455.16,457.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:459.2,463.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:466.49,468.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:468.43,469.43 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:469.43,472.4 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:473.3,473.14 1 14
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:475.2,475.14 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:480.97,483.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:483.43,486.19 2 170
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:487.15,488.52 1 21
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:491.3,491.20 1 170
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:491.20,492.77 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:492.77,494.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:495.4,495.38 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:498.3,498.14 1 170
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:501.2,501.16 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:505.90,507.29 1 21
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:507.29,509.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:511.2,512.19 2 21
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:512.19,514.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:516.2,518.20 2 21
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:519.19,520.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:521.21,522.75 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:523.31,524.50 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:525.19,526.51 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:527.21,528.53 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:529.17,530.49 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:533.2,533.12 1 12
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:537.92,541.17 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:541.17,543.31 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:543.31,545.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:547.2,547.17 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:547.17,549.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:552.2,553.46 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:553.46,554.29 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:554.29,557.4 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:558.3,558.14 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:561.2,561.22 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:561.22,563.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:565.2,569.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:573.110,576.29 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:576.29,578.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:581.2,582.20 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:582.20,584.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:586.2,591.24 2 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:592.14,594.37 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:594.37,596.23 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:596.23,598.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:600.20,601.43 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:602.25,605.50 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:605.50,606.60 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:606.60,608.59 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:608.59,611.6 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:613.4,613.53 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:613.53,616.5 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:617.4,617.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:621.2,621.20 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:621.20,623.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:625.2,626.15 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:626.15,628.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:630.2,634.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:638.91,640.29 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:640.29,642.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:644.2,645.20 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:645.20,647.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:649.2,651.24 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:652.14,653.37 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:653.37,655.23 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:655.23,657.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:659.20,660.44 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:663.2,663.21 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:663.21,665.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:667.2,671.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:675.92,683.2 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:686.94,688.29 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:688.29,690.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:692.2,693.17 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:693.17,695.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:697.2,698.46 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:698.46,699.29 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:699.29,702.4 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:703.3,703.14 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:706.2,706.24 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:706.24,708.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:710.2,714.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:718.90,720.29 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:720.29,722.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:724.2,725.17 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:725.17,727.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:729.2,730.46 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:730.46,731.29 1 7
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:731.29,732.22 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:732.22,734.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:734.10,737.5 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:739.3,739.14 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:742.2,742.20 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:742.20,744.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/symbols.go:746.2,750.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:32.106,34.32 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:34.32,36.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:39.2,40.55 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:40.55,42.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:45.2,54.8 2 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:58.106,60.32 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:60.32,62.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:65.2,66.59 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:66.59,68.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:71.2,76.8 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:80.40,85.2 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:88.58,89.30 1 12
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:89.30,91.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:93.2,93.37 1 12
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:93.37,95.3 1 11
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:99.46,100.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:100.17,102.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:104.2,104.19 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:105.25,106.28 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:106.28,108.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:109.3,109.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:110.24,111.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:112.25,113.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:114.23,115.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:116.22,117.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:118.10,119.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:124.61,125.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:125.17,127.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:129.2,132.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:137.68,139.55 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:139.55,141.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:145.2,147.45 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:147.45,148.47 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:148.47,150.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:151.3,151.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:154.2,154.21 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:158.61,160.55 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:160.55,162.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:165.2,170.21 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:174.41,176.55 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:176.55,178.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:179.2,179.12 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:183.41,185.55 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:185.55,187.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:188.2,188.12 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/parser/yaml_json.go:193.49,195.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:113.70,116.16 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:116.16,118.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:120.2,124.8 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:128.86,129.23 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:129.23,132.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:135.2,154.16 11 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:154.16,155.44 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:155.44,157.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.3,159.74 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:159.74,161.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.3,163.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:163.23,168.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:169.3,171.94 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:175.2,175.47 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:179.53,183.26 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:183.26,185.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.2,188.35 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:188.35,190.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.2,193.20 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:193.20,195.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.2,198.16 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:198.16,200.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.2,203.48 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:203.48,205.3 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.2,208.23 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:208.23,210.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.2,213.29 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:213.29,215.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.2,218.24 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:218.24,220.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:223.2,226.24 2 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:226.24,227.31 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:227.31,229.30 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:229.30,231.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:233.8,235.3 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:237.2,237.13 1 6
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:241.94,251.21 5 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:251.21,253.21 2 10
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:253.21,254.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:257.3,258.52 2 10
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:258.52,260.12 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:263.3,263.19 1 10
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:264.16,266.59 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:266.59,267.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.4,271.60 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:271.60,273.13 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:276.4,284.33 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:284.33,286.5 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.4,289.53 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:289.53,292.5 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:294.4,295.33 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:297.18,299.57 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:299.57,300.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:303.4,306.32 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:306.32,308.77 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:308.77,311.6 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.11,311.65 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:311.65,314.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:315.10,318.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:320.18,322.61 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:322.61,323.13 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:325.4,325.41 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.2,329.38 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:329.38,331.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:333.2,333.21 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:337.65,338.31 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:338.31,340.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:342.2,347.36 4 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:347.36,348.48 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:348.48,350.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:351.3,351.55 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:355.2,358.23 4 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:358.23,360.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:361.2,364.33 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:364.33,367.53 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:367.53,368.107 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:368.107,370.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:373.3,375.39 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:375.39,377.41 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:377.41,379.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:382.4,385.40 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:385.40,387.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:389.3,389.23 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:392.2,392.20 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:396.48,397.22 1 5
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:397.22,399.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/internal/search/search.go:400.2,400.29 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:39.68,51.16 4 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:51.16,53.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:54.2,57.19 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:57.19,59.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:62.2,72.15 4 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:76.34,87.23 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:87.23,119.3 1 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:122.2,184.25 3 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:184.25,250.3 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:253.2,335.3 2 8
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:339.108,341.2 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:344.114,346.15 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:346.15,350.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:352.2,352.23 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:352.23,354.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:357.2,358.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:358.16,360.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:362.2,374.16 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:374.16,376.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:378.2,386.43 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:390.112,392.16 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:392.16,394.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:397.2,397.32 1 3
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:397.32,399.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:402.2,403.16 2 3
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:403.16,404.25 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:404.25,406.4 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:407.3,407.27 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:407.27,409.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:410.3,410.81 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:414.2,414.45 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:414.45,416.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:419.2,424.19 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:424.19,426.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:427.2,427.26 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:427.26,429.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:430.2,430.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:430.25,432.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:434.2,442.32 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:442.32,444.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:446.2,446.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:446.16,448.23 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:448.23,450.20 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:450.20,452.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:457.2,457.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:457.18,460.55 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:460.55,462.30 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:462.30,464.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:464.18,466.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:471.3,471.67 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:471.67,473.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:476.2,476.52 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:480.94,483.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:483.16,485.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:488.2,490.23 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:490.23,492.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:494.2,498.52 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:498.52,499.106 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:499.106,501.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:504.2,507.30 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:507.30,510.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:512.2,512.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:516.54,517.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:518.31,519.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:520.29,521.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:522.28,523.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:524.29,525.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:526.32,527.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:528.31,529.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:530.31,531.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:532.27,533.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:534.28,535.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:536.31,537.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:538.29,539.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:540.30,541.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:542.10,543.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:547.36,550.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:553.112,555.16 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:555.16,557.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:559.2,560.16 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:560.16,562.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:565.2,579.21 4 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:579.21,581.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:584.2,585.15 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:585.15,587.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:589.2,592.35 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:592.35,594.39 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:594.39,595.12 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:598.3,598.89 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:598.89,599.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:599.18,601.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:603.4,603.20 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:603.20,605.44 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:605.44,607.6 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:608.5,608.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:612.4,612.37 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:612.37,614.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:617.4,618.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:618.18,620.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:623.4,623.47 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:623.47,625.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:628.4,629.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:629.18,631.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:634.4,635.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:635.18,637.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:639.4,642.55 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:642.55,644.5 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:646.4,646.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:648.3,648.17 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:648.17,650.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:654.2,655.43 2 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:659.50,660.35 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:661.12,662.15 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:663.20,664.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:665.20,666.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:667.16,668.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:669.11,670.14 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:671.20,672.16 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:673.16,674.15 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:675.10,676.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:681.112,683.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:683.16,685.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:687.2,688.15 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:688.15,690.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:692.2,693.14 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:693.14,695.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:698.2,698.32 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:698.32,700.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:703.2,704.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:704.16,707.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:709.2,709.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:709.18,711.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:713.2,717.52 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:721.119,723.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:723.16,725.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:727.2,728.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:728.16,730.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:732.2,733.17 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:733.17,735.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:737.2,742.52 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:746.118,748.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:748.16,750.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:752.2,753.15 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:753.15,755.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:757.2,758.14 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:758.14,760.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:763.2,763.32 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:763.32,765.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:767.2,768.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:768.16,770.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:772.2,772.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:772.25,774.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:776.2,779.32 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:779.32,785.20 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:785.20,789.4 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:790.3,790.27 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:793.2,793.52 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:797.118,799.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:799.16,801.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:803.2,804.15 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:804.15,806.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:808.2,809.14 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:809.14,811.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:813.2,816.32 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:816.32,818.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:820.2,821.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:821.16,823.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:825.2,825.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:825.25,827.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:829.2,834.32 4 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:834.32,837.3 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:839.2,839.41 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:839.41,841.28 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:841.28,843.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:844.3,844.27 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:847.2,847.52 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:851.66,853.16 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:853.16,855.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:857.2,862.61 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:862.61,864.26 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:864.26,866.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:867.3,868.18 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:868.18,870.4 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:871.3,871.73 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:874.2,874.25 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:878.115,880.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:883.113,885.2 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:888.120,890.16 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:890.16,892.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:894.2,895.16 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:895.16,897.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:900.2,900.32 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:900.32,902.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:908.2,927.11 3 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:927.11,929.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:929.8,931.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:933.2,933.16 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:933.16,935.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:937.2,937.21 1 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:937.21,939.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:942.2,943.11 2 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:943.11,945.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:945.8,947.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:949.2,953.52 4 2
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:957.49,965.12 5 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:965.12,969.3 3 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:971.2,977.33 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:981.54,985.25 2 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:985.25,987.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:990.2,990.21 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:990.21,992.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/internal/server/server.go:994.2,994.12 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:25.34,29.2 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:32.68,33.17 1 7
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:33.17,35.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:37.2,40.39 3 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:40.39,47.25 3 32
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:47.25,49.53 1 23
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:49.53,50.13 1 15
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:56.3,67.5 4 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.2,71.42 1 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:71.42,73.3 1 19
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:75.2,75.16 1 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:79.97,83.24 2 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:83.24,85.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.2,88.41 1 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:88.41,90.3 1 11
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.2,93.44 1 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:93.44,95.3 1 11
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:98.2,104.14 4 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:109.45,110.14 1 41
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:110.14,112.3 1 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.2,113.18 1 35
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:113.18,115.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.2,116.18 1 34
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:116.18,118.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.2,121.23 1 33
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:121.23,123.3 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:126.2,136.29 7 33
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:136.29,138.3 1 340
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.2,141.29 1 33
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:141.29,144.30 2 219
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:144.30,146.26 2 2190
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:146.26,148.5 1 274
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:150.4,154.5 1 2190
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:158.3,158.40 1 219
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:161.2,161.23 1 33
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:166.52,167.14 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:167.14,169.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.2,170.18 1 3
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:170.18,172.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.2,173.18 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:173.18,175.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:177.2,184.19 6 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:184.19,186.3 1 7
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.2,189.29 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:189.29,191.3 1 7
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.2,192.29 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:192.29,194.3 1 8
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.2,197.29 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:197.29,198.30 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:198.30,200.26 2 15
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:200.26,202.5 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:204.4,211.66 2 15
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:211.66,213.5 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:217.2,217.22 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:222.51,223.14 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:223.14,225.3 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:227.2,230.34 3 3
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:230.34,232.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:235.2,239.53 3 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:239.53,240.21 1 7
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:240.21,242.4 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:242.9,243.9 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:248.2,249.47 2 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:253.44,259.19 4 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:259.19,261.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:263.2,270.22 5 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:270.22,274.32 3 11
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:274.32,275.37 1 36
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:275.37,276.13 1 26
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:278.4,281.9 4 10
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.2,285.18 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:285.18,287.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:290.2,291.22 2 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:291.22,292.19 1 11
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:292.19,293.12 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.3,295.20 1 10
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:295.20,297.4 1 3
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.3,298.21 1 10
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:298.21,300.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:301.3,301.6 1 10
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:304.2,306.60 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:310.52,315.15 4 23
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:315.15,317.3 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.2,320.14 1 19
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:320.14,322.3 1 12
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:325.2,326.63 2 7
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:326.63,328.3 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.2,331.32 1 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:331.32,334.53 3 6
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:334.53,336.4 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:339.2,339.14 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:344.29,345.22 1 2231
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:345.22,347.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:348.2,349.31 2 2231
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:349.31,350.12 1 4436
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:350.12,352.4 1 1490
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:354.2,354.10 1 2231
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:357.29,358.22 1 30
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:358.22,360.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:361.2,362.31 2 30
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:362.31,363.12 1 30
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:363.12,365.4 1 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:367.2,367.10 1 30
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:370.21,371.11 1 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:371.11,373.3 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/fuzzy/fuzzy.go:374.2,374.10 1 17
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:68.47,70.13 2 30
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:71.13,72.16 1 3
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:73.21,74.24 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:75.37,76.24 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:77.21,78.20 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:79.18,80.15 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:81.45,82.17 1 5
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:83.23,84.18 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:85.14,86.17 1 1
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:87.15,88.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:89.23,90.18 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:91.21,92.20 1 4
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:93.10,94.21 1 2
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:98.43,99.42 1 36
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:99.42,100.25 1 137
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:100.25,102.4 1 34
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.3,103.48 1 103
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:103.48,104.9 1 0
-github.com/lukaszraczylo/mcp-filepuff/pkg/protocol/types.go:107.2,107.11 1 2
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:16.59,18.48 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:18.48,20.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:23.2,24.16 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:24.16,26.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:30.2,31.37 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:36.24,37.53 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/util/regex_cache.go:37.53,40.3 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:78.53,80.2 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:83.59,84.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:84.19,86.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:88.2,99.72 7 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:99.72,106.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.2,109.74 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:109.74,112.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.2,115.67 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:115.67,121.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.2,124.77 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:124.77,127.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:131.2,132.75 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:132.75,135.78 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:135.78,136.12 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:138.3,142.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.2,146.75 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:146.75,148.78 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:148.78,150.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:151.3,152.49 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:155.2,159.8 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:163.138,164.25 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:164.25,166.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:168.2,169.48 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:169.48,171.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:174.2,175.16 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:175.16,177.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:179.2,183.17 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:183.17,185.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.2,187.50 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:187.50,189.10 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:190.21,191.16 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:192.11,192.11 0 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.3,196.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:196.66,198.49 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:198.49,200.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:202.4,212.6 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:215.3,215.14 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:218.2,218.21 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:223.107,224.17 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:224.17,226.3 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:228.2,234.26 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:239.126,244.92 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:244.92,245.114 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:245.114,247.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:248.3,249.14 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.2,253.46 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:253.46,254.72 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:254.72,256.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:257.3,258.14 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.2,262.134 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:262.134,263.71 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:263.71,265.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:266.3,267.14 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.2,271.50 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:271.50,272.76 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:272.76,274.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:275.3,276.14 2 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:279.2,279.14 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:283.122,284.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:284.34,285.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:286.23,287.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:287.66,292.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:293.43,294.76 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:294.76,296.60 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:296.60,298.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:299.5,302.6 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:304.23,305.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:305.66,310.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:311.47,312.72 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:312.72,317.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:323.119,324.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:324.34,325.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:326.23,327.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:327.66,332.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:333.23,334.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:334.66,339.5 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:340.57,341.78 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:341.78,346.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:352.120,353.34 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:353.34,354.19 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:355.23,357.41 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:357.41,358.54 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:358.54,360.53 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:360.53,361.70 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:361.70,366.8 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.10,369.73 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:369.73,374.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:375.43,376.66 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:376.66,381.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:387.123,388.34 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:388.34,389.19 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:390.23,391.66 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:391.66,396.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:397.45,398.66 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:398.66,403.5 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:409.82,411.31 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:411.31,413.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:413.22,415.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:416.3,418.17 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:418.17,420.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.3,421.28 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:421.28,423.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.2,427.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:427.29,429.22 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:429.22,431.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:432.3,433.32 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:433.32,435.4 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.2,439.29 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:439.29,442.39 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:442.39,443.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:443.24,445.10 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.3,448.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:448.13,450.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:453.2,453.13 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:457.66,458.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:458.23,460.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:462.2,467.49 5 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:467.49,470.3 2 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.2,472.36 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:472.36,475.20 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:475.20,477.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:478.3,482.22 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:482.22,484.4 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:485.3,490.26 4 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:490.26,493.38 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:493.38,494.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:494.15,496.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:497.5,499.26 3 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:499.26,501.6 1 0
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:502.5,502.57 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:504.4,504.24 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:506.3,506.23 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.2,509.15 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:509.15,511.3 1 1
+github.com/lukaszraczylo/mcp-filepuff/internal/query/query.go:513.2,513.20 1 1
diff --git a/docs/API.md b/docs/API.md
new file mode 100644
index 0000000..8a35548
--- /dev/null
+++ b/docs/API.md
@@ -0,0 +1,389 @@
+# MCP Filepuff API Reference
+
+> Auto-generated on 2026-01-28
+
+This document provides detailed API documentation for all MCP tools available in filepuff.
+
+## Table of Contents
+
+### System
+- [`ping`](#ping)
+
+### Search
+- [`file_search`](#file_search)
+
+### File Operations
+- [`file_read`](#file_read)
+
+### AST Operations
+- [`ast_query`](#ast_query)
+
+### LSP Operations
+- [`symbol_at`](#symbol_at)
+- [`find_definition`](#find_definition)
+- [`find_references`](#find_references)
+
+### Edit Operations
+- [`edit_preview`](#edit_preview)
+- [`edit_apply`](#edit_apply)
+
+---
+
+## Tool Reference
+
+### System
+
+#### `ping`
+
+Health check - returns pong to verify the server is running
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:** None
+
+**Examples:**
+
+```json
+{"tool": "ping"}
+```
+
+**Notes:**
+
+- Returns: "pong"
+- Use to verify server connectivity
+
+---
+
+### Search
+
+#### `file_search`
+
+Search for text patterns in files using ripgrep. Supports regex patterns, file type filtering, and context lines.
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `pattern` | `string` | **Yes** | The search pattern (regex by default) |
+| `paths` | `array[string]` | No | Paths to search in (defaults to workspace root) |
+| `file_types` | `array[string]` | No | File types to search (e.g., ['go', 'ts', 'py']) |
+| `ignore_case` | `boolean` | No | Case insensitive search |
+| `regex` | `boolean` | No | Treat pattern as regex (default: true) |
+| `context_lines` | `number` | No | Number of context lines around matches (default: 2) |
+| `max_results` | `number` | No | Maximum number of results to return |
+
+**Examples:**
+
+```json
+{"pattern": "func.*Error", "file_types": ["go"]}
+```
+
+```json
+{"pattern": "TODO", "ignore_case": true, "context_lines": 3}
+```
+
+**Notes:**
+
+- Requires ripgrep (rg) to be installed
+- Respects .gitignore by default
+
+---
+
+### File Operations
+
+#### `file_read`
+
+Read a file's contents with optional line range and AST symbol summary
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `path` | `string` | **Yes** | Path to the file to read |
+| `line_start` | `number` | No | Starting line number (1-indexed) |
+| `line_end` | `number` | No | Ending line number (inclusive) |
+| `include_ast` | `boolean` | No | Include AST symbol summary (functions, classes, types, etc.) |
+| `symbols_only` | `boolean` | No | Return only symbol summary without file content (token-efficient mode). Requires include_ast=true. |
+| `max_lines` | `number` | No | Maximum number of lines to return (for token efficiency). Applied after line_start/line_end. |
+
+**Examples:**
+
+```json
+{"path": "server.go", "include_ast": true}
+```
+
+```json
+{"path": "server.go", "include_ast": true, "symbols_only": true}
+```
+
+```json
+{"path": "server.go", "line_start": 10, "line_end": 50}
+```
+
+```json
+{"path": "large_file.go", "max_lines": 100}
+```
+
+**Notes:**
+
+- symbols_only mode reduces token usage by ~90-98%
+- max_lines truncates output with notification
+- AST symbols show line numbers for quick navigation
+
+---
+
+### AST Operations
+
+#### `ast_query`
+
+Search for AST patterns in code files. Use code patterns with $VAR placeholders to match and capture code structures like functions, classes, and types.
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `pattern` | `string` | **Yes** | Code pattern with placeholders: $NAME (single), $$$ARGS (multiple), $_ (wildcard). Examples: 'func $NAME($$$ARGS) error', 'class $NAME { $$$BODY }' |
+| `language` | `string` | **Yes** | Target language: go, typescript, javascript, python, c, cpp |
+| `paths` | `array[string]` | No | Paths to search in (defaults to workspace root) |
+| `name_matches` | `string` | No | Regex pattern to filter by name |
+| `name_exact` | `string` | No | Exact name to match |
+| `kind_in` | `array[string]` | No | Node types to match (e.g., function_declaration, class_declaration) |
+| `max_results` | `number` | No | Maximum number of results to return (default: 100) |
+
+**Examples:**
+
+```json
+{"pattern": "func $NAME($$$ARGS) error", "language": "go"}
+```
+
+```json
+{"pattern": "class $NAME: $$$BODY", "language": "python"}
+```
+
+```json
+{"pattern": "function $NAME($PROPS) { $$$BODY }", "language": "javascript", "name_matches": "^[A-Z]"}
+```
+
+**Notes:**
+
+- $NAME captures identifiers
+- $$$ARGS captures multiple items (parameters, body, etc.)
+- $_ is a wildcard that matches but doesn't capture
+- Powered by Tree-sitter for accurate AST parsing
+
+---
+
+### LSP Operations
+
+#### `symbol_at`
+
+Get information about the symbol at a specific position in a file. Returns type, documentation, and definition location using LSP when available.
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `file` | `string` | **Yes** | Path to the file |
+| `line` | `number` | **Yes** | Line number (1-indexed) |
+| `column` | `number` | **Yes** | Column number (1-indexed) |
+
+**Examples:**
+
+```json
+{"file": "server.go", "line": 25, "column": 10}
+```
+
+**Notes:**
+
+- Requires LSP server for full type information
+- Falls back to AST-based info if LSP unavailable
+
+---
+
+#### `find_definition`
+
+Find the definition of the symbol at a specific position. Uses LSP to locate where a function, variable, type, etc. is defined.
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `file` | `string` | **Yes** | Path to the file |
+| `line` | `number` | **Yes** | Line number (1-indexed) |
+| `column` | `number` | **Yes** | Column number (1-indexed) |
+
+**Examples:**
+
+```json
+{"file": "server.go", "line": 42, "column": 15}
+```
+
+**Notes:**
+
+- Requires language server for the file type
+- Returns file path, line, and column of definition
+- Shows code preview at definition location
+
+---
+
+#### `find_references`
+
+Find all references to the symbol at a specific position. Uses LSP to locate all usages of a function, variable, type, etc.
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `file` | `string` | **Yes** | Path to the file |
+| `line` | `number` | **Yes** | Line number (1-indexed) |
+| `column` | `number` | **Yes** | Column number (1-indexed) |
+| `include_declaration` | `boolean` | No | Include the declaration in results (default: true) |
+
+**Examples:**
+
+```json
+{"file": "server.go", "line": 42, "column": 15}
+```
+
+```json
+{"file": "server.go", "line": 42, "column": 15, "include_declaration": false}
+```
+
+**Notes:**
+
+- Requires language server for the file type
+- Results grouped by file
+
+---
+
+### Edit Operations
+
+#### `edit_preview`
+
+Preview an edit without applying it. Uses AST-aware editing for code files (Go, TypeScript, JavaScript, Python, C, C++), and text-based editing for other files (Markdown, JSON, YAML, config files, etc.).
+
+🔒 **Read-only**: This tool does not modify files.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `file` | `string` | **Yes** | Path to the file to edit |
+| `operation` | `string` | **Yes** | Edit operation: replace, insert_before, insert_after, delete |
+| `new_content` | `string` | No | New content (required for replace/insert operations) |
+| `selector_kind` | `string` | No | AST node type to match (e.g., function_declaration, class_declaration). For code files only. |
+| `selector_name` | `string` | No | Name of the symbol to match. For code files only. |
+| `selector_line` | `number` | No | Line number (1-indexed). For AST mode: narrows search. For text mode: start of line range. |
+| `selector_index` | `number` | No | Index of the match to use if multiple matches found (default: 0) |
+| `selector_line_end` | `number` | No | End line number for range selection (text mode). Used with selector_line. |
+| `selector_text` | `string` | No | Exact text to match (text mode). Must be unique or use selector_index. |
+| `selector_pattern` | `string` | No | Regex pattern to match (text mode). Must be unique or use selector_index. |
+
+**Examples:**
+
+```json
+{"file": "server.go", "operation": "replace", "selector_kind": "function_declaration", "selector_name": "Hello", "new_content": "func Hello() {\\n\\tprintln(\\"New Hello\\")\\n}"}
+```
+
+```json
+{"file": "README.md", "operation": "replace", "selector_text": "## Installation", "new_content": "## Getting Started"}
+```
+
+```json
+{"file": "package.json", "operation": "replace", "selector_pattern": "\\"version\\":\\\\s*\\"[^\\"]+\\"", "new_content": "\\"version\\": \\"2.0.0\\""}
+```
+
+**Notes:**
+
+- Returns a diff showing proposed changes
+- Does not modify the file
+- Use to validate changes before applying
+
+---
+
+#### `edit_apply`
+
+Apply an edit to a file. Uses AST-aware editing for code files (Go, TypeScript, JavaScript, Python, C, C++) with syntax validation, and text-based editing for other files (Markdown, JSON, YAML, config files, etc.).
+
+⚠️ **Modifies files**: This tool writes to the filesystem.
+
+**Parameters:**
+
+| Name | Type | Required | Description |
+|------|------|----------|-------------|
+| `file` | `string` | **Yes** | Path to the file to edit |
+| `operation` | `string` | **Yes** | Edit operation: replace, insert_before, insert_after, delete |
+| `new_content` | `string` | No | New content (required for replace/insert operations) |
+| `selector_kind` | `string` | No | AST node type to match (e.g., function_declaration, class_declaration). For code files only. |
+| `selector_name` | `string` | No | Name of the symbol to match. For code files only. |
+| `selector_line` | `number` | No | Line number (1-indexed). For AST mode: narrows search. For text mode: start of line range. |
+| `selector_index` | `number` | No | Index of the match to use if multiple matches found (default: 0) |
+| `selector_line_end` | `number` | No | End line number for range selection (text mode). Used with selector_line. |
+| `selector_text` | `string` | No | Exact text to match (text mode). Must be unique or use selector_index. |
+| `selector_pattern` | `string` | No | Regex pattern to match (text mode). Must be unique or use selector_index. |
+
+**Examples:**
+
+```json
+{"file": "server.go", "operation": "replace", "selector_kind": "function_declaration", "selector_name": "Hello", "new_content": "func Hello() {\\n\\tprintln(\\"Updated\\")\\n}"}
+```
+
+```json
+{"file": "config.yaml", "operation": "replace", "selector_line": 5, "selector_line_end": 10, "new_content": "database:\\n host: production.db.example.com\\n port: 5432"}
+```
+
+**Notes:**
+
+- For code files: validates syntax before and after edit
+- Preserves file permissions
+- Uses atomic writes for safety
+- File locking prevents concurrent edits
+
+---
+
+## Supported Languages
+
+| Language | Extensions | Search | AST | LSP | Edit |
+|----------|-----------|--------|-----|-----|------|
+| Go | .go | ✅ | ✅ | gopls | ✅ |
+| TypeScript | .ts, .tsx | ✅ | ✅ | typescript-language-server | ✅ |
+| JavaScript | .js, .jsx, .mjs, .cjs | ✅ | ✅ | typescript-language-server | ✅ |
+| Python | .py, .pyw | ✅ | ✅ | pylsp | ✅ |
+| C | .c, .h | ✅ | ✅ | clangd | ✅ |
+| C++ | .cpp, .cc, .cxx, .hpp, .hxx | ✅ | ✅ | clangd | ✅ |
+| HTML | .html, .htm | ✅ | ✅ | - | ✅ |
+| Vue | .vue | ✅ | ✅* | - | ✅ |
+| React | .jsx, .tsx | ✅ | ✅ | typescript-language-server | ✅ |
+| Elixir | .ex, .exs | ✅ | ✅ | elixir-ls | ✅ |
+| JSON | .json | ✅ | ✅ | - | ✅ |
+| YAML | .yaml, .yml | ✅ | ✅ | - | ✅ |
+
+\* Vue uses HTML parser for template sections
+
+## Error Handling
+
+All tools return structured errors with:
+- **Error code**: Numeric identifier for the error type
+- **Message**: Human-readable error description
+- **Context**: Additional information about the error
+- **Remediation**: Suggested fix for the error
+
+See [ERROR_CODES.md](ERROR_CODES.md) for a complete error reference.
+
+## See Also
+
+- [README.md](../README.md) - Project overview and installation
+- [ERROR_CODES.md](ERROR_CODES.md) - Error code reference
+- [PERFORMANCE.md](PERFORMANCE.md) - Performance tuning guide
diff --git a/docs/ERROR_CODES.md b/docs/ERROR_CODES.md
new file mode 100644
index 0000000..4b54383
--- /dev/null
+++ b/docs/ERROR_CODES.md
@@ -0,0 +1,655 @@
+# MCP Filepuff Error Codes Reference
+
+This document provides a comprehensive reference for all error codes that can be returned by mcp-filepuff, along with descriptions and remediation steps.
+
+## Error Code Structure
+
+All errors in mcp-filepuff use structured error handling with the following components:
+
+- **Error Code**: A numeric identifier (1000-1999) for programmatic handling
+- **Message**: Human-readable description of the error
+- **Context**: Additional key-value pairs providing error context
+- **Remediation**: Suggested steps to resolve the error
+- **Cause**: Underlying error (if wrapping another error)
+
+## Error Categories
+
+| Range | Category | Description |
+|-------|----------|-------------|
+| 1000-1099 | Search Errors | File search and ripgrep operations |
+| 1100-1199 | Parser Errors | AST parsing and tree-sitter operations |
+| 1200-1299 | LSP Errors | Language server protocol operations |
+| 1300-1399 | Edit Errors | File editing operations |
+| 1400-1499 | Query Errors | AST pattern matching operations |
+| 1500-1599 | Config Errors | Configuration and validation |
+| 1900-1999 | Internal Errors | Internal server errors |
+
+---
+
+## Search Errors (1000-1099)
+
+### 1001 - ErrRipgrepNotFound
+
+**Description**: The ripgrep (`rg`) binary is not found in the system PATH.
+
+**Common Causes**:
+- ripgrep is not installed
+- ripgrep is not in PATH
+- PATH environment variable not properly set
+
+**Remediation**:
+
+```bash
+# macOS
+brew install ripgrep
+
+# Ubuntu/Debian
+sudo apt install ripgrep
+
+# Windows (Chocolatey)
+choco install ripgrep
+
+# Windows (Scoop)
+scoop install ripgrep
+```
+
+---
+
+### 1002 - ErrRipgrepTimeout
+
+**Description**: Search operation exceeded the configured timeout limit.
+
+**Context Fields**:
+- `pattern`: The search pattern that timed out
+- `duration`: How long the search ran before timing out
+
+**Common Causes**:
+- Search pattern too broad (e.g., `.` matching everything)
+- Searching a very large directory tree
+- Complex regex pattern causing backtracking
+
+**Remediation**:
+1. Use more specific search patterns
+2. Narrow the search scope with `paths` parameter
+3. Increase timeout via `MCP_SEARCH_TIMEOUT` environment variable:
+ ```bash
+ export MCP_SEARCH_TIMEOUT="2m"
+ ```
+
+---
+
+### 1003 - ErrInvalidPattern
+
+**Description**: The search pattern is invalid or malformed.
+
+**Context Fields**:
+- `pattern`: The invalid pattern
+- `error`: Specific parsing error
+
+**Common Causes**:
+- Invalid regex syntax
+- Unclosed brackets or parentheses
+- Invalid escape sequences
+
+**Remediation**:
+1. Validate regex syntax at [regex101.com](https://regex101.com)
+2. Escape special characters properly
+3. Use `regex: false` for literal string searches
+
+---
+
+### 1004 - ErrSearchFailed
+
+**Description**: General search operation failure.
+
+**Context Fields**:
+- `error`: Underlying error message
+
+**Common Causes**:
+- Permission denied on files/directories
+- I/O errors
+- ripgrep process crashed
+
+**Remediation**:
+1. Check file and directory permissions
+2. Verify workspace path is accessible
+3. Check system logs for I/O errors
+
+---
+
+### 1005 - ErrNoResults
+
+**Description**: Search completed but found no matches.
+
+**Note**: This is an informational code, not necessarily an error.
+
+---
+
+## Parser Errors (1100-1199)
+
+### 1101 - ErrParserNotFound
+
+**Description**: No Tree-sitter parser is available for the requested language.
+
+**Context Fields**:
+- `language`: The unsupported language
+
+**Supported Languages**:
+- Go, TypeScript, JavaScript, Python, C, C++, HTML, Vue, Elixir, JSON, YAML
+
+**Remediation**:
+1. Use a supported language
+2. Check file extension is correct
+
+---
+
+### 1102 - ErrParseFailed
+
+**Description**: Tree-sitter failed to parse the file.
+
+**Context Fields**:
+- `file`: Path to the file
+- `language`: Detected language
+- `error`: Specific parsing error
+
+**Common Causes**:
+- File has syntax errors
+- File encoding is not UTF-8
+- Binary file detected
+
+**Remediation**:
+1. Fix syntax errors in the source file
+2. Ensure file is valid UTF-8
+3. Check file is not a binary
+
+---
+
+### 1103 - ErrInvalidLanguage
+
+**Description**: The specified or detected language is not supported.
+
+**Context Fields**:
+- `language`: The unsupported language
+- `file`: File path (if detected from extension)
+
+**Remediation**:
+- Use a file with a supported extension
+- Supported: `.go`, `.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.c`, `.h`, `.cpp`, `.hpp`, `.html`, `.vue`, `.ex`, `.exs`, `.json`, `.yaml`, `.yml`
+
+---
+
+### 1104 - ErrFileTooBig
+
+**Description**: File exceeds the maximum size limit for parsing.
+
+**Context Fields**:
+- `file`: Path to the file
+- `size_bytes`: Actual file size
+- `limit_bytes`: Maximum allowed size
+
+**Default Limit**: 10 MB
+
+**Remediation**:
+1. Process smaller files
+2. Increase limit via configuration:
+ ```json
+ {
+ "max_parse_size": 20971520
+ }
+ ```
+
+---
+
+### 1105 - ErrInvalidSyntax
+
+**Description**: File contains syntax errors that prevent proper parsing.
+
+**Context Fields**:
+- `file`: Path to the file
+- `errors`: List of syntax errors with locations
+
+**Remediation**:
+1. Fix syntax errors in the source file
+2. Run language-specific linters/compilers to identify issues
+
+---
+
+## LSP Errors (1200-1299)
+
+### 1201 - ErrLSPServerNotFound
+
+**Description**: The LSP server for the requested language is not installed or not in PATH.
+
+**Context Fields**:
+- `language`: The language needing LSP
+- `server`: The expected server binary name
+
+**LSP Servers by Language**:
+| Language | Server | Installation |
+|----------|--------|--------------|
+| Go | `gopls` | `go install golang.org/x/tools/gopls@latest` |
+| TypeScript/JavaScript | `typescript-language-server` | `npm install -g typescript-language-server typescript` |
+| Python | `pylsp` | `pip install python-lsp-server` |
+| C/C++ | `clangd` | Install via system package manager |
+
+**Remediation**:
+Install the appropriate language server for your language.
+
+---
+
+### 1202 - ErrLSPInitFailed
+
+**Description**: LSP server failed to initialize.
+
+**Context Fields**:
+- `language`: The language
+- `command`: The server command
+- `error`: Specific initialization error
+
+**Common Causes**:
+- Workspace configuration issues
+- Missing dependencies for the project
+- LSP server crashed during startup
+
+**Remediation**:
+1. Check LSP server logs
+2. Verify workspace has proper configuration files (go.mod, package.json, etc.)
+3. Try running the LSP server manually to see errors
+
+---
+
+### 1203 - ErrLSPTimeout
+
+**Description**: LSP operation exceeded timeout.
+
+**Context Fields**:
+- `operation`: The LSP method that timed out
+- `duration`: How long the operation ran
+
+**Common Causes**:
+- LSP server indexing large project
+- Complex type analysis
+- Server deadlock
+
+**Remediation**:
+1. Wait for LSP server to complete initial indexing
+2. Increase timeout via `MCP_LSP_TIMEOUT`:
+ ```bash
+ export MCP_LSP_TIMEOUT="10m"
+ ```
+3. Restart the MCP server to restart LSP servers
+
+---
+
+### 1204 - ErrLSPCommunication
+
+**Description**: Communication error with LSP server.
+
+**Context Fields**:
+- `error`: Specific communication error
+
+**Common Causes**:
+- LSP server crashed
+- Broken pipe (server terminated)
+- Protocol version mismatch
+
+**Remediation**:
+1. Restart the MCP server
+2. Update LSP server to latest version
+3. Check for known issues with your LSP server version
+
+---
+
+### 1205 - ErrNoHoverInfo
+
+**Description**: No hover information available at the requested position.
+
+**Note**: Not all positions have hover information (e.g., whitespace, keywords).
+
+---
+
+### 1206 - ErrNoDefinition
+
+**Description**: No definition found for the symbol at the requested position.
+
+**Common Causes**:
+- Position is not on a symbol
+- Symbol is a built-in
+- External dependency without source
+
+---
+
+### 1207 - ErrNoReferences
+
+**Description**: No references found for the symbol.
+
+**Note**: A symbol may have no references if unused.
+
+---
+
+## Edit Errors (1300-1399)
+
+### 1301 - ErrEditFailed
+
+**Description**: General edit operation failure.
+
+**Context Fields**:
+- `file`: Path to the file
+- `operation`: The edit operation attempted
+- `error`: Specific error details
+
+---
+
+### 1302 - ErrInvalidEdit
+
+**Description**: The edit request is malformed or invalid.
+
+**Context Fields**:
+- `message`: Specific validation failure
+
+**Common Causes**:
+- Missing required fields
+- Invalid operation type
+- Missing `new_content` for replace/insert
+
+**Valid Operations**:
+- `replace` - Replace selected content
+- `insert_before` - Insert before selection
+- `insert_after` - Insert after selection
+- `delete` - Delete selected content
+
+**Remediation**:
+Review the edit request and ensure all required fields are provided.
+
+---
+
+### 1303 - ErrFileNotFound
+
+**Description**: The target file does not exist.
+
+**Context Fields**:
+- `file`: Path that was not found
+
+**Remediation**:
+1. Verify the file path is correct
+2. Check for typos in the path
+3. Ensure the file exists in the workspace
+
+---
+
+### 1304 - ErrFileNotReadable
+
+**Description**: The file exists but cannot be read.
+
+**Context Fields**:
+- `file`: Path to the file
+- `error`: System error details
+
+**Common Causes**:
+- Permission denied
+- File locked by another process
+- File is a directory
+
+**Remediation**:
+1. Check file permissions
+2. Close other programs using the file
+3. On macOS, ensure terminal has disk access
+
+---
+
+### 1305 - ErrFileNotWritable
+
+**Description**: Cannot write to the file.
+
+**Context Fields**:
+- `file`: Path to the file
+- `error`: System error details
+
+**Common Causes**:
+- Permission denied
+- Read-only filesystem
+- Disk full
+- File locked
+
+**Remediation**:
+1. Check file and directory permissions
+2. Verify disk space
+3. Close other programs using the file
+
+---
+
+### 1306 - ErrNodeNotFound
+
+**Description**: No AST node matches the selector criteria.
+
+**Context Fields**:
+- `selector`: Description of the selector criteria
+
+**Common Causes**:
+- Selector doesn't match any code
+- Wrong node kind specified
+- Name doesn't exist in file
+
+**Remediation**:
+1. Use `file_read` with `include_ast: true` to see available symbols
+2. Verify selector criteria (kind, name, pattern, line)
+3. Check spelling of symbol names
+
+---
+
+### 1307 - ErrValidationFailed
+
+**Description**: Edit would produce invalid syntax.
+
+**Context Fields**:
+- `file`: Path to the file
+- `error`: Syntax error details
+
+**Common Causes**:
+- `new_content` has syntax errors
+- Edit breaks surrounding code structure
+
+**Remediation**:
+1. Validate `new_content` syntax independently
+2. Use `edit_preview` to see the proposed changes
+3. Ensure the edit maintains valid syntax
+
+---
+
+### 1308 - ErrInvalidSelection
+
+**Description**: Selector matches multiple nodes or is ambiguous.
+
+**Context Fields**:
+- `message`: Details about the ambiguity
+
+**Common Causes**:
+- Text/pattern matches multiple locations
+- Multiple functions with same name
+
+**Remediation**:
+1. Add `selector_index` to choose specific match
+2. Add more selector criteria (kind, name, line)
+3. Use line number to narrow selection
+
+---
+
+## Query Errors (1400-1499)
+
+### 1401 - ErrInvalidQuery
+
+**Description**: The AST query is malformed.
+
+**Context Fields**:
+- `query`: The invalid query
+- `error`: Specific parsing error
+
+**Remediation**:
+Review query syntax. Valid patterns use:
+- `$NAME` for single captures
+- `$$$ARGS` for multiple items
+- `$_` for wildcards
+
+---
+
+### 1402 - ErrQueryTimeout
+
+**Description**: AST query exceeded timeout.
+
+**Context Fields**:
+- `query`: The query that timed out
+- `duration`: How long it ran
+
+**Remediation**:
+1. Use more specific patterns
+2. Narrow search paths
+3. Reduce `max_results`
+
+---
+
+### 1403 - ErrNoMatches
+
+**Description**: Query executed successfully but found no matches.
+
+**Note**: Informational, not necessarily an error.
+
+---
+
+### 1404 - ErrQueryCompile
+
+**Description**: Failed to compile the query pattern.
+
+**Context Fields**:
+- `pattern`: The invalid pattern
+- `error`: Compilation error
+
+---
+
+## Config Errors (1500-1599)
+
+### 1501 - ErrInvalidConfig
+
+**Description**: Configuration file or value is invalid.
+
+**Context Fields**:
+- `field`: The invalid field
+- `value`: The invalid value
+- `error`: Specific validation error
+
+**Remediation**:
+Review `.mcp-filepuff.json` configuration file syntax and values.
+
+---
+
+### 1502 - ErrPathNotAllowed
+
+**Description**: Requested path is outside the workspace root.
+
+**Context Fields**:
+- `path`: The requested path
+- `workspace`: The workspace root
+
+**Security Note**: This prevents path traversal attacks.
+
+**Remediation**:
+1. Ensure all paths are within workspace
+2. Don't use `..` to escape workspace
+3. Configure workspace root appropriately
+
+---
+
+### 1503 - ErrWorkspaceNotSet
+
+**Description**: Workspace root is not configured.
+
+**Remediation**:
+Start the server with `-workspace` flag:
+```bash
+mcp-filepuff -workspace /path/to/workspace
+```
+
+---
+
+## Internal Errors (1900-1999)
+
+### 1900 - ErrInternal
+
+**Description**: Unexpected internal error.
+
+**Context Fields**:
+- `error`: Error details
+- `stack`: Stack trace (in debug mode)
+
+**Remediation**:
+1. Check server logs
+2. Report issue if reproducible
+
+---
+
+### 1901 - ErrCacheFailed
+
+**Description**: Cache operation failed.
+
+**Context Fields**:
+- `operation`: Cache operation that failed
+- `error`: Specific error
+
+---
+
+### 1902 - ErrConcurrency
+
+**Description**: Concurrency-related error (race condition, deadlock).
+
+**Context Fields**:
+- `operation`: Operation that failed
+- `error`: Specific error
+
+---
+
+## Common Error Scenarios
+
+### Scenario 1: New Project Setup
+
+**Symptoms**: LSP features not working, errors like "LSP server not found"
+
+**Solution**:
+1. Install required language servers
+2. Initialize project (e.g., `go mod init`, `npm init`)
+3. Restart MCP server
+
+### Scenario 2: Edit Fails with Validation Error
+
+**Symptoms**: Edit operation rejected with syntax error
+
+**Solution**:
+1. Use `edit_preview` first to see proposed changes
+2. Validate `new_content` is syntactically correct
+3. Check that surrounding code structure is maintained
+
+### Scenario 3: Search Returns Too Many Results
+
+**Symptoms**: Search timeout or truncated results
+
+**Solution**:
+1. Use more specific patterns
+2. Add file type filters: `"file_types": ["go"]`
+3. Limit search paths
+4. Set `max_results` limit
+
+### Scenario 4: File Access Errors
+
+**Symptoms**: Permission denied, file not readable
+
+**Solution**:
+1. Check file permissions: `ls -la `
+2. On macOS, grant disk access to terminal
+3. Close programs locking the file
+4. Run server with appropriate user permissions
+
+---
+
+## See Also
+
+- [API.md](API.md) - Complete API reference
+- [PERFORMANCE.md](PERFORMANCE.md) - Performance tuning guide
+- [README.md](../README.md) - Getting started
diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md
new file mode 100644
index 0000000..19158fd
--- /dev/null
+++ b/docs/PERFORMANCE.md
@@ -0,0 +1,404 @@
+# MCP Filepuff Performance Tuning Guide
+
+This guide provides detailed information on optimizing mcp-filepuff performance, understanding resource usage, and configuring the server for your workload.
+
+## Table of Contents
+
+- [Parser Cache Configuration](#parser-cache-configuration)
+- [File Size Limits](#file-size-limits)
+- [LSP Configuration](#lsp-configuration)
+- [Memory Usage Patterns](#memory-usage-patterns)
+- [Benchmarking](#benchmarking)
+- [Production Recommendations](#production-recommendations)
+
+---
+
+## Parser Cache Configuration
+
+The parser cache is critical for performance as it avoids re-parsing files that haven't changed.
+
+### How the Cache Works
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ Parse Request │
+│ (file, content) │
+└─────────────────────────┬───────────────────────────────────┘
+ │
+ ▼
+ ┌──────────────────────┐
+ │ Content Hash Check │
+ │ (xxHash64) │
+ └──────────┬───────────┘
+ │
+ ┌───────────┴───────────┐
+ │ │
+ ▼ ▼
+ Cache Hit Cache Miss
+ │ │
+ ▼ ▼
+ Return cached tree Parse with Tree-sitter
+ │ │
+ │ ▼
+ │ Store in LRU cache
+ │ │
+ └───────────┬───────────┘
+ │
+ ▼
+ Return ParseResult
+```
+
+### Cache Statistics
+
+The parser tracks detailed statistics:
+
+```go
+type CacheStatsResult struct {
+ Hits int64 // Number of cache hits
+ Misses int64 // Number of cache misses
+ HitRate float64 // Ratio of hits to total requests
+ Size int // Current number of cached items
+ TotalParseTime int64 // Total time spent parsing (nanoseconds)
+ ParseCount int64 // Number of parse operations
+ AvgParseTime int64 // Average parse time (nanoseconds)
+ LastParseTime int64 // Most recent parse duration
+}
+```
+
+### Cache Configuration
+
+The LRU cache holds up to **100 parsed AST trees** by default. This is sufficient for most development workflows where you interact with a subset of files.
+
+**Cache Key**: xxHash64 of file content (extremely fast, ~5GB/s)
+
+**Eviction Policy**: Least Recently Used (LRU) - when the cache is full, the least recently accessed entry is evicted.
+
+### Optimizing Cache Performance
+
+1. **Batch Related Operations**: When working on related files, perform all operations on one file before moving to the next. This maximizes cache hits.
+
+2. **Monitor Hit Rate**: A healthy cache has >80% hit rate. Lower rates suggest:
+ - Working with too many files simultaneously
+ - Files changing frequently between operations
+
+3. **Cache Invalidation**: The cache is content-based (hash), so modified files automatically get re-parsed.
+
+---
+
+## File Size Limits
+
+### Default Limits
+
+| Limit | Default Value | Environment Variable |
+|-------|---------------|---------------------|
+| Max File Size | 10 MB | - |
+| Max Parse Size | 10 MB | - |
+| Max Edit Size | 100 KB | - |
+| Max Search Results | 1000 | - |
+
+### Configuration
+
+Configure via `.mcp-filepuff.json` in workspace root:
+
+```json
+{
+ "max_file_size": 10485760,
+ "max_parse_size": 10485760,
+ "max_search_results": 1000,
+ "max_edit_size": 102400
+}
+```
+
+### Understanding Limits
+
+**Max File Size (10 MB)**
+- Maximum file size that can be read via `file_read`
+- Prevents memory exhaustion with large files
+- Increase for codebases with large generated files
+
+**Max Parse Size (10 MB)**
+- Maximum file size for AST parsing
+- Tree-sitter parsing memory usage is ~3-5x file size
+- A 10 MB file needs ~30-50 MB RAM for parsing
+
+**Max Edit Size (100 KB)**
+- Maximum size for files being edited
+- Keeps diff generation fast
+- Prevents accidental edits to large generated files
+
+### Token-Efficient Reading
+
+For large files, use token-efficient options:
+
+```json
+// Get only symbol summary (~90-98% token reduction)
+{"path": "large_file.go", "include_ast": true, "symbols_only": true}
+
+// Limit output lines
+{"path": "large_file.go", "max_lines": 50}
+
+// Read specific line range
+{"path": "large_file.go", "line_start": 100, "line_end": 150}
+```
+
+---
+
+## LSP Configuration
+
+### Timeout Configuration
+
+```bash
+# LSP operation timeout (default: 5 minutes)
+export MCP_LSP_TIMEOUT="5m"
+
+# Search timeout (default: 30 seconds)
+export MCP_SEARCH_TIMEOUT="30s"
+```
+
+### LSP Server Lifecycle
+
+```
+┌─────────────────────────────────────────────────────────────┐
+│ LSP Request │
+│ (hover, definition, references) │
+└─────────────────────────┬───────────────────────────────────┘
+ │
+ ▼
+ ┌──────────────────────┐
+ │ Check Server Pool │
+ │ (by language) │
+ └──────────┬───────────┘
+ │
+ ┌───────────┴───────────┐
+ │ │
+ ▼ ▼
+ Server Exists No Server
+ │ │
+ ▼ ▼
+ Update lastUsed Start New Server
+ │ │
+ │ ▼
+ │ Initialize (handshake)
+ │ │
+ └───────────┬───────────┘
+ │
+ ▼
+ ┌─────────────────┐
+ │ Open Document │
+ │ (if not open) │
+ └────────┬────────┘
+ │
+ ▼
+ ┌─────────────────┐
+ │ Execute LSP │
+ │ Request │
+ └────────┬────────┘
+ │
+ ▼
+ Return Result
+```
+
+### Server Pool Management
+
+- **Idle Timeout**: 5 minutes (servers closed after inactivity)
+- **Pool Reaper**: Checks every 60 seconds for idle servers
+- **One Server Per Language**: Efficient resource usage
+
+### Optimizing LSP Performance
+
+1. **First Request Latency**: Initial LSP requests are slow due to server startup and project indexing. Subsequent requests are fast.
+
+2. **gopls Optimization**: For Go projects, gopls performance depends on module cache:
+ ```bash
+ # Pre-populate module cache
+ go mod download
+ ```
+
+3. **typescript-language-server**: Ensure `node_modules` is populated:
+ ```bash
+ npm install
+ ```
+
+4. **clangd**: Requires `compile_commands.json` for best results:
+ ```bash
+ # Generate with CMake
+ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
+ ```
+
+---
+
+## Memory Usage Patterns
+
+### Component Memory Usage
+
+| Component | Memory Pattern | Notes |
+|-----------|---------------|-------|
+| Parser Registry | Per-language parsers | ~5-10 MB per language |
+| AST Cache | LRU, 100 entries max | ~50-200 MB typically |
+| LSP Servers | External processes | ~100-500 MB per server |
+| Search (ripgrep) | Streaming | Minimal memory |
+| Edit Engine | Per-operation | Proportional to file size |
+
+### Memory Calculation Example
+
+For a typical Go project:
+
+```
+Base Server: ~20 MB
+Go Parser: ~10 MB
+AST Cache (50 files): ~100 MB
+gopls: ~300 MB
+────────────────────────────────
+Total: ~430 MB
+```
+
+### Reducing Memory Usage
+
+1. **Disable LSP**: If you don't need go-to-definition/references:
+ ```bash
+ export MCP_ENABLE_LSP="false"
+ ```
+ This saves ~100-500 MB per language server.
+
+2. **Reduce Cache Size**: For memory-constrained environments, you can recompile with a smaller cache size (requires code change).
+
+3. **Close Idle Servers**: LSP servers are automatically closed after 5 minutes of inactivity.
+
+---
+
+## Benchmarking
+
+### Running Benchmarks
+
+The project includes comprehensive benchmarks:
+
+```bash
+# Run all benchmarks
+go test -bench=. ./...
+
+# Run parser benchmarks with memory stats
+go test -bench=. -benchmem ./internal/parser/...
+
+# Run with specific count for stability
+go test -bench=. -count=5 ./internal/parser/...
+```
+
+### Available Benchmarks
+
+**Parser Benchmarks** (`internal/parser/parser_bench_test.go`):
+- `BenchmarkParseGo` - Go file parsing
+- `BenchmarkParseTypeScript` - TypeScript file parsing
+- `BenchmarkParsePython` - Python file parsing
+- `BenchmarkParseC` - C file parsing
+- `BenchmarkParseCpp` - C++ file parsing
+- `BenchmarkCacheHit` - Cache hit performance
+- `BenchmarkCacheMiss` - Cache miss performance
+- `BenchmarkContentHash` - xxHash performance
+- `BenchmarkExtractSymbols` - Symbol extraction
+
+### Expected Performance
+
+Typical benchmark results (M1 Mac):
+
+```
+BenchmarkParseGo-8 5000 220000 ns/op 45000 B/op 850 allocs/op
+BenchmarkParseTypeScript-8 3000 380000 ns/op 62000 B/op 1200 allocs/op
+BenchmarkCacheHit-8 500000 2400 ns/op 128 B/op 3 allocs/op
+BenchmarkContentHash-8 2000000 600 ns/op 0 B/op 0 allocs/op
+```
+
+Key observations:
+- Cache hits are **~100x faster** than cache misses
+- Content hashing is extremely fast (xxHash64)
+- Parsing speed varies by language complexity
+
+### Profiling
+
+```bash
+# CPU profiling
+go test -bench=BenchmarkParseGo -cpuprofile=cpu.prof ./internal/parser/...
+go tool pprof cpu.prof
+
+# Memory profiling
+go test -bench=BenchmarkParseGo -memprofile=mem.prof ./internal/parser/...
+go tool pprof mem.prof
+
+# Generate flame graph (requires pprof)
+go tool pprof -http=:8080 cpu.prof
+```
+
+---
+
+## Production Recommendations
+
+### Environment Variables
+
+```bash
+# Essential configuration
+export MCP_WORKSPACE_ROOT="/path/to/workspace"
+export MCP_LSP_TIMEOUT="5m"
+export MCP_SEARCH_TIMEOUT="30s"
+export MCP_ENABLE_LSP="true"
+
+# Optional optimizations
+export MCP_FOLLOW_SYMLINKS="true"
+export MCP_RESPECT_GITIGNORE="true"
+```
+
+### Logging Configuration
+
+```bash
+# Development
+./mcp-filepuff -log-level debug -log-file /tmp/mcp-filepuff.log
+
+# Production (minimal logging)
+./mcp-filepuff -log-level warn
+```
+
+### Health Monitoring
+
+Use the `ping` tool to verify server health:
+
+```json
+{"tool": "ping"}
+```
+
+Expected response: `"pong"`
+
+### Performance Checklist
+
+- [ ] Language servers installed and in PATH
+- [ ] Project initialized (go.mod, package.json, etc.)
+- [ ] Reasonable file size limits for your codebase
+- [ ] LSP timeout appropriate for project size
+- [ ] Adequate system memory (recommend 2+ GB free)
+
+### Troubleshooting Slow Performance
+
+1. **Slow Initial Operations**
+ - LSP servers need to index project
+ - Wait for initial indexing to complete
+ - Check LSP server logs for progress
+
+2. **Slow Search**
+ - Check for overly broad patterns
+ - Exclude large directories (node_modules, vendor)
+ - Verify .gitignore is respected
+
+3. **High Memory Usage**
+ - Disable unused LSP servers
+ - Check for memory leaks in language servers
+ - Monitor cache size
+
+4. **Timeouts**
+ - Increase timeout values
+ - Check for I/O bottlenecks
+ - Verify network filesystems are responsive
+
+---
+
+## See Also
+
+- [API.md](API.md) - Complete API reference
+- [ERROR_CODES.md](ERROR_CODES.md) - Error code reference
+- [README.md](../README.md) - Getting started
diff --git a/internal/config/config.go b/internal/config/config.go
index 2df3070..904d7e9 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -2,6 +2,7 @@
package config
import (
+ "fmt"
"os"
"path/filepath"
"strings"
@@ -17,6 +18,7 @@ type Config struct {
LSPTimeout time.Duration `json:"lsp_timeout"`
SearchTimeout time.Duration `json:"search_timeout"`
MaxFileSize int64 `json:"max_file_size"`
+ MaxParseSize int64 `json:"max_parse_size"`
MaxSearchResults int `json:"max_search_results"`
MaxEditSize int64 `json:"max_edit_size"`
EnableLSP bool `json:"enable_lsp"`
@@ -29,6 +31,7 @@ const (
DefaultLSPTimeout = 5 * time.Minute
DefaultSearchTimeout = 30 * time.Second
DefaultMaxFileSize = 10 * 1024 * 1024 // 10 MB
+ DefaultMaxParseSize = 10 * 1024 * 1024 // 10 MB
DefaultMaxSearchResults = 1000
DefaultMaxEditSize = 100 * 1024 // 100 KB
)
@@ -40,6 +43,7 @@ func Default() *Config {
LSPTimeout: DefaultLSPTimeout,
SearchTimeout: DefaultSearchTimeout,
MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: DefaultMaxParseSize,
MaxSearchResults: DefaultMaxSearchResults,
MaxEditSize: DefaultMaxEditSize,
EnableLSP: true,
@@ -172,3 +176,41 @@ func (c *Config) IsPathAllowed(path string) bool {
// Also reject empty relative path (which means it's the workspace root itself)
return rel != "." && !strings.HasPrefix(rel, "..")
}
+
+// Validate validates the configuration and returns an error if invalid.
+// Checks include:
+// - MaxFileSize and MaxParseSize must be positive
+// - LSPTimeout must be positive
+// - WorkspaceRoot must exist (when not empty)
+func (c *Config) Validate() error {
+ // Validate MaxFileSize
+ if c.MaxFileSize <= 0 {
+ return fmt.Errorf("max_file_size must be positive, got %d", c.MaxFileSize)
+ }
+
+ // Validate MaxParseSize
+ if c.MaxParseSize <= 0 {
+ return fmt.Errorf("max_parse_size must be positive, got %d", c.MaxParseSize)
+ }
+
+ // Validate LSPTimeout
+ if c.LSPTimeout <= 0 {
+ return fmt.Errorf("lsp_timeout must be positive, got %v", c.LSPTimeout)
+ }
+
+ // Validate WorkspaceRoot exists
+ if c.WorkspaceRoot != "" {
+ info, err := os.Stat(c.WorkspaceRoot)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return fmt.Errorf("workspace_root does not exist: %s", c.WorkspaceRoot)
+ }
+ return fmt.Errorf("cannot access workspace_root: %w", err)
+ }
+ if !info.IsDir() {
+ return fmt.Errorf("workspace_root is not a directory: %s", c.WorkspaceRoot)
+ }
+ }
+
+ return nil
+}
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index 26e2aa9..592b931 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -45,7 +45,7 @@ func TestLoad(t *testing.T) {
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
- defer os.RemoveAll(tmpDir)
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
cfg, err := Load(tmpDir)
if err != nil {
@@ -108,7 +108,7 @@ func TestIsPathAllowed(t *testing.T) {
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
- defer os.RemoveAll(tmpDir)
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
cfg := Default()
cfg.WorkspaceRoot = tmpDir
@@ -156,7 +156,7 @@ func TestLoadWithConfigFile(t *testing.T) {
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
- defer os.RemoveAll(tmpDir)
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
// Write config file
configPath := filepath.Join(tmpDir, ".mcp-filepuff.json")
@@ -164,7 +164,7 @@ func TestLoadWithConfigFile(t *testing.T) {
"enable_lsp": false,
"follow_symlinks": false
}`
- err = os.WriteFile(configPath, []byte(configContent), 0600)
+ err = os.WriteFile(configPath, []byte(configContent), 0o600)
if err != nil {
t.Fatalf("failed to write config file: %v", err)
}
@@ -182,3 +182,381 @@ func TestLoadWithConfigFile(t *testing.T) {
t.Error("expected FollowSymlinks to be false from config file")
}
}
+
+// TestValidate tests the Validate method with various inputs.
+func TestValidate(t *testing.T) {
+ tests := []struct {
+ name string
+ cfg *Config
+ expectErr bool
+ errMsg string
+ }{
+ {
+ name: "valid_config",
+ cfg: Default(),
+ expectErr: false,
+ },
+ {
+ name: "invalid_max_file_size",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: -1,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: DefaultLSPTimeout,
+ },
+ expectErr: true,
+ errMsg: "max_file_size must be positive",
+ },
+ {
+ name: "zero_max_file_size",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: 0,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: DefaultLSPTimeout,
+ },
+ expectErr: true,
+ errMsg: "max_file_size must be positive",
+ },
+ {
+ name: "invalid_max_parse_size",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: -1,
+ LSPTimeout: DefaultLSPTimeout,
+ },
+ expectErr: true,
+ errMsg: "max_parse_size must be positive",
+ },
+ {
+ name: "zero_max_parse_size",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: 0,
+ LSPTimeout: DefaultLSPTimeout,
+ },
+ expectErr: true,
+ errMsg: "max_parse_size must be positive",
+ },
+ {
+ name: "invalid_lsp_timeout",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: -1 * time.Second,
+ },
+ expectErr: true,
+ errMsg: "lsp_timeout must be positive",
+ },
+ {
+ name: "zero_lsp_timeout",
+ cfg: &Config{
+ WorkspaceRoot: ".",
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: 0,
+ },
+ expectErr: true,
+ errMsg: "lsp_timeout must be positive",
+ },
+ {
+ name: "nonexistent_workspace",
+ cfg: &Config{
+ WorkspaceRoot: "/nonexistent/path/that/does/not/exist",
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: DefaultLSPTimeout,
+ },
+ expectErr: true,
+ errMsg: "workspace_root does not exist",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := tt.cfg.Validate()
+ if tt.expectErr {
+ if err == nil {
+ t.Errorf("expected error containing %q, got nil", tt.errMsg)
+ } else if !contains(err.Error(), tt.errMsg) {
+ t.Errorf("expected error containing %q, got %q", tt.errMsg, err.Error())
+ }
+ } else {
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ }
+ })
+ }
+}
+
+// TestValidateWithFile tests validation with an actual file as workspace root.
+func TestValidateWithFile(t *testing.T) {
+ // Create a temporary file
+ tmpFile, err := os.CreateTemp("", "test-file-*.txt")
+ if err != nil {
+ t.Fatalf("failed to create temp file: %v", err)
+ }
+ _ = tmpFile.Close()
+ t.Cleanup(func() { _ = os.Remove(tmpFile.Name()) })
+
+ cfg := &Config{
+ WorkspaceRoot: tmpFile.Name(),
+ MaxFileSize: DefaultMaxFileSize,
+ MaxParseSize: DefaultMaxParseSize,
+ LSPTimeout: DefaultLSPTimeout,
+ }
+
+ err = cfg.Validate()
+ if err == nil {
+ t.Error("expected error when workspace_root is a file, got nil")
+ } else if !contains(err.Error(), "is not a directory") {
+ t.Errorf("expected error about not being a directory, got: %v", err)
+ }
+}
+
+// TestLoadEnvironmentPrecedence tests environment variable precedence.
+func TestLoadEnvironmentPrecedence(t *testing.T) {
+ tmpDir, err := os.MkdirTemp("", "mcp-filepuff-test")
+ if err != nil {
+ t.Fatalf("failed to create temp dir: %v", err)
+ }
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
+
+ // Write a config file with specific values
+ configPath := filepath.Join(tmpDir, ".mcp-filepuff.json")
+ configContent := `{
+ "enable_lsp": false,
+ "follow_symlinks": false,
+ "lsp_timeout": 60000000000
+ }`
+ if err := os.WriteFile(configPath, []byte(configContent), 0o600); err != nil {
+ t.Fatalf("failed to write config file: %v", err)
+ }
+
+ // Save and restore environment variables
+ origEnableLSP := os.Getenv("MCP_ENABLE_LSP")
+ origLSPTimeout := os.Getenv("MCP_LSP_TIMEOUT")
+ t.Cleanup(func() {
+ _ = os.Setenv("MCP_ENABLE_LSP", origEnableLSP)
+ _ = os.Setenv("MCP_LSP_TIMEOUT", origLSPTimeout)
+ })
+
+ // Set environment variables that should override config file
+ _ = os.Setenv("MCP_ENABLE_LSP", "false")
+ _ = os.Setenv("MCP_LSP_TIMEOUT", "2m")
+
+ cfg, err := Load(tmpDir)
+ if err != nil {
+ t.Fatalf("Load failed: %v", err)
+ }
+
+ // Environment variable should override config file
+ if cfg.LSPTimeout != 2*time.Minute {
+ t.Errorf("expected LSP timeout 2m from env, got %v", cfg.LSPTimeout)
+ }
+
+ if cfg.EnableLSP {
+ t.Error("expected EnableLSP to be false from env")
+ }
+
+ // Value from config file (not overridden by env)
+ if cfg.FollowSymlinks {
+ t.Error("expected FollowSymlinks to be false from config file")
+ }
+}
+
+// TestIsPathAllowedEdgeCases tests edge cases in path validation.
+func TestIsPathAllowedEdgeCases(t *testing.T) {
+ tmpDir, err := os.MkdirTemp("", "mcp-filepuff-test")
+ if err != nil {
+ t.Fatalf("failed to create temp dir: %v", err)
+ }
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
+
+ cfg := Default()
+ cfg.WorkspaceRoot = tmpDir
+
+ tests := []struct {
+ name string
+ path string
+ allowed bool
+ desc string
+ }{
+ {
+ name: "workspace_root_itself",
+ path: tmpDir,
+ allowed: false,
+ desc: "workspace root itself should not be allowed",
+ },
+ {
+ name: "dot_relative",
+ path: ".",
+ allowed: false,
+ desc: "current directory should not be allowed",
+ },
+ {
+ name: "empty_path",
+ path: "",
+ allowed: false,
+ desc: "empty path should not be allowed",
+ },
+ {
+ name: "path_with_double_dots",
+ path: filepath.Join(tmpDir, "..", filepath.Base(tmpDir), "file.txt"),
+ allowed: true,
+ desc: "path with .. that resolves back inside workspace should be allowed",
+ },
+ {
+ name: "deeply_nested_valid",
+ path: filepath.Join(tmpDir, "a", "b", "c", "file.txt"),
+ allowed: true,
+ desc: "deeply nested path should be allowed",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ result := cfg.IsPathAllowed(tt.path)
+ if result != tt.allowed {
+ t.Errorf("%s: IsPathAllowed(%q) = %v, want %v", tt.desc, tt.path, result, tt.allowed)
+ }
+ })
+ }
+}
+
+// TestIsPathAllowedWithSymlinks tests path validation with symbolic links.
+func TestIsPathAllowedWithSymlinks(t *testing.T) {
+ // Create temporary directories
+ tmpDir, err := os.MkdirTemp("", "mcp-filepuff-test")
+ if err != nil {
+ t.Fatalf("failed to create temp dir: %v", err)
+ }
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
+
+ realDir := filepath.Join(tmpDir, "real")
+ if err := os.MkdirAll(realDir, 0o755); err != nil {
+ t.Fatalf("failed to create real dir: %v", err)
+ }
+
+ // Create a symlink inside workspace
+ symlinkPath := filepath.Join(tmpDir, "link")
+ if err := os.Symlink(realDir, symlinkPath); err != nil {
+ t.Skip("symlink creation not supported on this system")
+ }
+
+ cfg := Default()
+ cfg.WorkspaceRoot = tmpDir
+
+ // File accessed through symlink should be allowed
+ fileViaSymlink := filepath.Join(symlinkPath, "test.txt")
+ if !cfg.IsPathAllowed(fileViaSymlink) {
+ t.Error("file accessed through symlink inside workspace should be allowed")
+ }
+
+ // Direct access should also work
+ fileDirect := filepath.Join(realDir, "test.txt")
+ if !cfg.IsPathAllowed(fileDirect) {
+ t.Error("file accessed directly should be allowed")
+ }
+}
+
+// TestLoadDefaultValues tests that default values are properly set.
+func TestLoadDefaultValues(t *testing.T) {
+ tmpDir, err := os.MkdirTemp("", "mcp-filepuff-test")
+ if err != nil {
+ t.Fatalf("failed to create temp dir: %v", err)
+ }
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
+
+ // Clear any environment variables that might affect defaults
+ origVars := []struct{ key, val string }{
+ {"MCP_ENABLE_LSP", os.Getenv("MCP_ENABLE_LSP")},
+ {"MCP_FOLLOW_SYMLINKS", os.Getenv("MCP_FOLLOW_SYMLINKS")},
+ {"MCP_RESPECT_GITIGNORE", os.Getenv("MCP_RESPECT_GITIGNORE")},
+ }
+ t.Cleanup(func() {
+ for _, v := range origVars {
+ _ = os.Setenv(v.key, v.val)
+ }
+ })
+ for _, v := range origVars {
+ _ = os.Unsetenv(v.key)
+ }
+
+ cfg, err := Load(tmpDir)
+ if err != nil {
+ t.Fatalf("Load failed: %v", err)
+ }
+
+ // Verify all default values
+ if cfg.LSPTimeout != DefaultLSPTimeout {
+ t.Errorf("expected LSPTimeout %v, got %v", DefaultLSPTimeout, cfg.LSPTimeout)
+ }
+ if cfg.SearchTimeout != DefaultSearchTimeout {
+ t.Errorf("expected SearchTimeout %v, got %v", DefaultSearchTimeout, cfg.SearchTimeout)
+ }
+ if cfg.MaxFileSize != DefaultMaxFileSize {
+ t.Errorf("expected MaxFileSize %d, got %d", DefaultMaxFileSize, cfg.MaxFileSize)
+ }
+ if cfg.MaxParseSize != DefaultMaxParseSize {
+ t.Errorf("expected MaxParseSize %d, got %d", DefaultMaxParseSize, cfg.MaxParseSize)
+ }
+ if cfg.MaxSearchResults != DefaultMaxSearchResults {
+ t.Errorf("expected MaxSearchResults %d, got %d", DefaultMaxSearchResults, cfg.MaxSearchResults)
+ }
+ if cfg.MaxEditSize != DefaultMaxEditSize {
+ t.Errorf("expected MaxEditSize %d, got %d", DefaultMaxEditSize, cfg.MaxEditSize)
+ }
+ if !cfg.EnableLSP {
+ t.Error("expected EnableLSP to be true by default")
+ }
+ if !cfg.FollowSymlinks {
+ t.Error("expected FollowSymlinks to be true by default")
+ }
+ if !cfg.RespectGitignore {
+ t.Error("expected RespectGitignore to be true by default")
+ }
+ if cfg.Formatters == nil {
+ t.Error("expected Formatters map to be initialized")
+ }
+}
+
+// TestConfigFileLoadingErrors tests error handling during config file loading.
+func TestConfigFileLoadingErrors(t *testing.T) {
+ tmpDir, err := os.MkdirTemp("", "mcp-filepuff-test")
+ if err != nil {
+ t.Fatalf("failed to create temp dir: %v", err)
+ }
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
+
+ // Write invalid JSON
+ configPath := filepath.Join(tmpDir, ".mcp-filepuff.json")
+ invalidJSON := `{"enable_lsp": invalid_value}`
+ if err := os.WriteFile(configPath, []byte(invalidJSON), 0o600); err != nil {
+ t.Fatalf("failed to write config file: %v", err)
+ }
+
+ _, err = Load(tmpDir)
+ if err == nil {
+ t.Error("expected error when loading invalid JSON config file")
+ }
+}
+
+// Helper function to check if a string contains a substring.
+func contains(s, substr string) bool {
+ return len(s) >= len(substr) && (s == substr || len(substr) == 0 ||
+ (len(s) > 0 && len(substr) > 0 && containsHelper(s, substr)))
+}
+
+func containsHelper(s, substr string) bool {
+ for i := 0; i <= len(s)-len(substr); i++ {
+ if s[i:i+len(substr)] == substr {
+ return true
+ }
+ }
+ return false
+}
diff --git a/internal/edit/edit.go b/internal/edit/edit.go
index fcfe74d..cf4dd27 100644
--- a/internal/edit/edit.go
+++ b/internal/edit/edit.go
@@ -6,37 +6,17 @@ import (
"context"
"fmt"
"os"
- "regexp"
"strings"
"sync"
"github.com/lukaszraczylo/mcp-filepuff/internal/parser"
+ "github.com/lukaszraczylo/mcp-filepuff/internal/util"
"github.com/lukaszraczylo/mcp-filepuff/pkg/errors"
"github.com/lukaszraczylo/mcp-filepuff/pkg/protocol"
"github.com/sergi/go-diff/diffmatchpatch"
sitter "github.com/smacker/go-tree-sitter"
)
-// Global regex cache for compiled patterns (thread-safe)
-var regexCache sync.Map // string -> *regexp.Regexp
-
-// compileRegex compiles a regex pattern with caching for performance.
-func compileRegex(pattern string) (*regexp.Regexp, error) {
- // Check cache first
- if cached, ok := regexCache.Load(pattern); ok {
- return cached.(*regexp.Regexp), nil
- }
-
- // Compile and cache
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
-
- regexCache.Store(pattern, re)
- return re, nil
-}
-
// EditOperation defines the type of edit operation.
type EditOperation string
@@ -198,7 +178,14 @@ func (e *Engine) performASTEdit(ctx context.Context, edit *ASTEdit, apply bool)
// Apply changes if requested
if apply {
- if err := os.WriteFile(edit.File, newContent, 0600); err != nil {
+ // Preserve original file permissions
+ fileInfo, err := os.Stat(edit.File)
+ perm := os.FileMode(0o600) // default fallback
+ if err == nil {
+ perm = fileInfo.Mode().Perm()
+ }
+
+ if err := os.WriteFile(edit.File, newContent, perm); err != nil {
structuredErr := errors.NewFileNotWritableError(edit.File, err)
return &EditResult{
Success: false,
@@ -250,7 +237,14 @@ func (e *Engine) performTextEdit(_ context.Context, edit *ASTEdit, apply bool) (
// Apply changes if requested
if apply {
- if err := os.WriteFile(edit.File, newContent, 0600); err != nil {
+ // Preserve original file permissions
+ fileInfo, err := os.Stat(edit.File)
+ perm := os.FileMode(0o600) // default fallback
+ if err == nil {
+ perm = fileInfo.Mode().Perm()
+ }
+
+ if err := os.WriteFile(edit.File, newContent, perm); err != nil {
structuredErr := errors.NewFileNotWritableError(edit.File, err)
return &EditResult{
Success: false,
@@ -319,7 +313,7 @@ func (e *Engine) validateTextEdit(edit *ASTEdit) error {
// Validate regex pattern if provided (uses cached compilation)
if edit.Selector.TextPattern != "" {
- if _, err := compileRegex(edit.Selector.TextPattern); err != nil {
+ if _, err := util.CompileRegex(edit.Selector.TextPattern); err != nil {
return errors.Wrap(errors.ErrInvalidEdit, "invalid text_pattern regex", err)
}
}
@@ -672,7 +666,7 @@ func (e *Engine) findExactText(content []byte, text string, index int) (start, e
// findRegexPattern finds a regex pattern match in content.
func (e *Engine) findRegexPattern(content []byte, pattern string, index int) (start, end int, err error) {
- re, err := compileRegex(pattern)
+ re, err := util.CompileRegex(pattern)
if err != nil {
return 0, 0, errors.Wrap(errors.ErrInvalidEdit, "invalid regex pattern", err)
}
diff --git a/internal/lsp/manager.go b/internal/lsp/manager.go
index 3963820..713d2b3 100644
--- a/internal/lsp/manager.go
+++ b/internal/lsp/manager.go
@@ -153,13 +153,20 @@ func (m *Manager) GetServer(ctx context.Context, lang protocol.Language) (*Manag
openDocs: make(map[string]int),
}
+ // Setup cleanup on failure - ensures resources are freed if initialization fails
+ var initialized bool
+ defer func() {
+ if !initialized {
+ _ = client.Close()
+ // Ensure process is killed on initialization failure
+ if cmd.Process != nil {
+ _ = cmd.Process.Kill()
+ }
+ }
+ }()
+
// Initialize server
if err := m.initializeServer(ctx, newSrv); err != nil {
- _ = client.Close()
- // Ensure process is killed on initialization failure
- if cmd.Process != nil {
- _ = cmd.Process.Kill()
- }
newSrv.initErr = err
return nil, errors.Wrap(errors.ErrLSPInitFailed, "LSP server initialization failed", err).
WithContext("language", string(lang)).
@@ -167,6 +174,9 @@ func (m *Manager) GetServer(ctx context.Context, lang protocol.Language) (*Manag
WithRemediation("Check LSP server logs for initialization errors")
}
+ // Mark as successfully initialized to prevent cleanup
+ initialized = true
+
newSrv.ready = true
m.servers[lang] = newSrv
m.logger.Info("started LSP server", "language", lang, "command", config.Command[0])
diff --git a/internal/lsp/manager_test.go b/internal/lsp/manager_test.go
index 916afee..d2c68d5 100644
--- a/internal/lsp/manager_test.go
+++ b/internal/lsp/manager_test.go
@@ -1,7 +1,11 @@
package lsp
import (
+ "context"
+ "log/slog"
+ "os"
"testing"
+ "time"
"github.com/lukaszraczylo/mcp-filepuff/pkg/protocol"
)
@@ -110,3 +114,230 @@ func TestDefaultServerConfigs(t *testing.T) {
}
}
}
+
+// TestManagerTimeout tests timeout handling in LSP operations.
+func TestManagerTimeout(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ // Verify timeout is set
+ if manager.timeout == 0 {
+ t.Error("manager timeout should not be zero")
+ }
+
+ // Verify default timeout is reasonable
+ if manager.timeout != 10*time.Second {
+ t.Errorf("expected default timeout of 10s, got %v", manager.timeout)
+ }
+
+ // Test that manager can handle short timeouts
+ manager.timeout = 1 * time.Millisecond
+
+ // Create a context that will timeout
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+ defer cancel()
+
+ // Try to get a server with very short timeout - this should fail quickly
+ // Use a language that doesn't have an LSP server installed
+ _, err := manager.GetServer(ctx, "invalid_language")
+ if err == nil {
+ t.Log("GetServer with invalid language succeeded (LSP server may be installed)")
+ }
+}
+
+// TestManagerConnectionFailure tests handling of LSP connection failures.
+func TestManagerConnectionFailure(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ ctx := context.Background()
+
+ // Test 1: Invalid language
+ _, err := manager.GetServer(ctx, "nonexistent_language")
+ if err == nil {
+ t.Error("expected error for nonexistent language")
+ }
+
+ // Test 2: Try to use LSP features without a valid server
+ // This should fail gracefully
+ _, err = manager.Hover(ctx, "/tmp/test.fake", 1, 1)
+ if err == nil {
+ t.Error("expected error for hover on unsupported language")
+ }
+}
+
+// TestManagerGracefulShutdown tests graceful shutdown of LSP servers.
+func TestManagerGracefulShutdown(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+
+ // Close should not panic even with no servers started
+ err := manager.Close()
+ if err != nil {
+ t.Errorf("Close() returned error: %v", err)
+ }
+
+ // Verify manager is stopped
+ if !manager.stopped {
+ t.Error("manager should be marked as stopped after Close()")
+ }
+
+ // Note: We don't test multiple Close() calls because the implementation
+ // closes the stopReaper channel which can't be closed twice.
+ // In production, Close() should only be called once during shutdown.
+}
+
+// TestManagerIdleReaper tests the idle server cleanup mechanism.
+func TestManagerIdleReaper(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+
+ // Set a very short idle timeout for testing
+ manager.idleTimeout = 100 * time.Millisecond
+
+ // Verify idle timeout is set correctly
+ if manager.idleTimeout != 100*time.Millisecond {
+ t.Errorf("expected idle timeout of 100ms, got %v", manager.idleTimeout)
+ }
+
+ // The reaper goroutine should be running
+ // We can't easily test it without actually starting LSP servers,
+ // but we can verify it doesn't panic on close
+ time.Sleep(150 * time.Millisecond)
+
+ err := manager.Close()
+ if err != nil {
+ t.Errorf("Close() with active reaper returned error: %v", err)
+ }
+}
+
+// TestManagerDocumentManagement tests document open/close operations.
+func TestManagerDocumentManagement(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ ctx := context.Background()
+
+ // Test closing a document for a non-existent server
+ err := manager.CloseDocument(ctx, protocol.LangGo, "/tmp/test.go")
+ if err != nil {
+ t.Errorf("CloseDocument on non-existent server should not error: %v", err)
+ }
+
+ // Test closing a document that was never opened
+ err = manager.CloseDocument(ctx, protocol.LangGo, "/tmp/test.go")
+ if err != nil {
+ t.Errorf("CloseDocument on unopened document should not error: %v", err)
+ }
+}
+
+// TestManagerConcurrentAccess tests concurrent access to the manager.
+func TestManagerConcurrentAccess(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ // Test concurrent IsAvailable calls
+ const numGoroutines = 10
+ done := make(chan bool, numGoroutines)
+
+ for i := 0; i < numGoroutines; i++ {
+ go func() {
+ defer func() {
+ if r := recover(); r != nil {
+ t.Errorf("panic in concurrent IsAvailable: %v", r)
+ }
+ done <- true
+ }()
+
+ // Call IsAvailable multiple times
+ for j := 0; j < 5; j++ {
+ _ = manager.IsAvailable(protocol.LangGo)
+ _ = manager.IsAvailable(protocol.LangPython)
+ _ = manager.IsAvailable(protocol.LangTypeScript)
+ }
+ }()
+ }
+
+ // Wait for all goroutines
+ for i := 0; i < numGoroutines; i++ {
+ <-done
+ }
+}
+
+// TestManagerErrorHandling tests various error conditions.
+func TestManagerErrorHandling(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ ctx := context.Background()
+
+ tests := []struct {
+ name string
+ testFunc func() error
+ }{
+ {
+ name: "hover_on_nonexistent_file",
+ testFunc: func() error {
+ _, err := manager.Hover(ctx, "/nonexistent/file.go", 1, 1)
+ return err
+ },
+ },
+ {
+ name: "definition_on_nonexistent_file",
+ testFunc: func() error {
+ _, err := manager.Definition(ctx, "/nonexistent/file.go", 1, 1)
+ return err
+ },
+ },
+ {
+ name: "references_on_nonexistent_file",
+ testFunc: func() error {
+ _, err := manager.References(ctx, "/nonexistent/file.go", 1, 1, true)
+ return err
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ err := tt.testFunc()
+ if err == nil {
+ t.Log("operation succeeded (LSP server may be handling gracefully)")
+ }
+ // We don't require an error because behavior depends on whether
+ // the LSP server is installed and how it handles missing files
+ })
+ }
+}
+
+// TestManagerWorkspaceRoot tests workspace root handling.
+func TestManagerWorkspaceRoot(t *testing.T) {
+ tmpDir := t.TempDir()
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ manager := NewManager(tmpDir, logger)
+ t.Cleanup(func() { _ = manager.Close() })
+
+ if manager.workspaceRoot != tmpDir {
+ t.Errorf("expected workspace root %s, got %s", tmpDir, manager.workspaceRoot)
+ }
+}
diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go
new file mode 100644
index 0000000..650ed5a
--- /dev/null
+++ b/internal/metrics/metrics.go
@@ -0,0 +1,464 @@
+// Package metrics provides Prometheus-style metrics collection for the MCP server.
+// It offers low-overhead, thread-safe metric types suitable for observability.
+package metrics
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+ "sync"
+ "sync/atomic"
+ "time"
+)
+
+// Counter is a monotonically increasing metric.
+type Counter struct {
+ name string
+ help string
+ labels map[string]string
+ value atomic.Int64
+}
+
+// NewCounter creates a new counter metric.
+func NewCounter(name, help string, labels map[string]string) *Counter {
+ return &Counter{
+ name: name,
+ help: help,
+ labels: labels,
+ }
+}
+
+// Inc increments the counter by 1.
+func (c *Counter) Inc() {
+ c.value.Add(1)
+}
+
+// Add adds the given value to the counter.
+func (c *Counter) Add(delta int64) {
+ c.value.Add(delta)
+}
+
+// Value returns the current counter value.
+func (c *Counter) Value() int64 {
+ return c.value.Load()
+}
+
+// Reset resets the counter to 0.
+func (c *Counter) Reset() {
+ c.value.Store(0)
+}
+
+// Gauge is a metric that can go up or down.
+type Gauge struct {
+ name string
+ help string
+ labels map[string]string
+ value atomic.Int64
+}
+
+// NewGauge creates a new gauge metric.
+func NewGauge(name, help string, labels map[string]string) *Gauge {
+ return &Gauge{
+ name: name,
+ help: help,
+ labels: labels,
+ }
+}
+
+// Set sets the gauge to the given value.
+func (g *Gauge) Set(val int64) {
+ g.value.Store(val)
+}
+
+// Inc increments the gauge by 1.
+func (g *Gauge) Inc() {
+ g.value.Add(1)
+}
+
+// Dec decrements the gauge by 1.
+func (g *Gauge) Dec() {
+ g.value.Add(-1)
+}
+
+// Add adds the given value to the gauge.
+func (g *Gauge) Add(delta int64) {
+ g.value.Add(delta)
+}
+
+// Value returns the current gauge value.
+func (g *Gauge) Value() int64 {
+ return g.value.Load()
+}
+
+// Histogram tracks the distribution of values in predefined buckets.
+type Histogram struct {
+ name string
+ help string
+ labels map[string]string
+ buckets []float64
+ counts []atomic.Int64
+ sum atomic.Int64 // sum of all observed values (in nanoseconds for durations)
+ count atomic.Int64 // total count of observations
+}
+
+// DefaultDurationBuckets are default buckets for request durations (in seconds).
+var DefaultDurationBuckets = []float64{
+ 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0,
+}
+
+// NewHistogram creates a new histogram with the given buckets.
+func NewHistogram(name, help string, labels map[string]string, buckets []float64) *Histogram {
+ if buckets == nil {
+ buckets = DefaultDurationBuckets
+ }
+ // Ensure buckets are sorted
+ sorted := make([]float64, len(buckets))
+ copy(sorted, buckets)
+ sort.Float64s(sorted)
+
+ h := &Histogram{
+ name: name,
+ help: help,
+ labels: labels,
+ buckets: sorted,
+ counts: make([]atomic.Int64, len(sorted)+1), // +1 for +Inf bucket
+ }
+ return h
+}
+
+// Observe records a value in the histogram.
+func (h *Histogram) Observe(val float64) {
+ h.count.Add(1)
+ // Store sum in nanoseconds for precision with durations
+ h.sum.Add(int64(val * 1e9))
+
+ // Find bucket and increment
+ for i, bound := range h.buckets {
+ if val <= bound {
+ h.counts[i].Add(1)
+ return
+ }
+ }
+ // Value exceeds all buckets, add to +Inf
+ h.counts[len(h.buckets)].Add(1)
+}
+
+// ObserveDuration records a duration in seconds.
+func (h *Histogram) ObserveDuration(d time.Duration) {
+ h.Observe(d.Seconds())
+}
+
+// Count returns the total number of observations.
+func (h *Histogram) Count() int64 {
+ return h.count.Load()
+}
+
+// Sum returns the sum of all observations.
+func (h *Histogram) Sum() float64 {
+ return float64(h.sum.Load()) / 1e9
+}
+
+// Registry holds all registered metrics.
+type Registry struct {
+ mu sync.RWMutex
+ counters map[string]*Counter
+ gauges map[string]*Gauge
+ histograms map[string]*Histogram
+}
+
+// NewRegistry creates a new metrics registry.
+func NewRegistry() *Registry {
+ return &Registry{
+ counters: make(map[string]*Counter),
+ gauges: make(map[string]*Gauge),
+ histograms: make(map[string]*Histogram),
+ }
+}
+
+// Counter returns or creates a counter with the given name.
+func (r *Registry) Counter(name, help string, labels map[string]string) *Counter {
+ key := metricKey(name, labels)
+ r.mu.RLock()
+ if c, ok := r.counters[key]; ok {
+ r.mu.RUnlock()
+ return c
+ }
+ r.mu.RUnlock()
+
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ // Double-check after acquiring write lock
+ if c, ok := r.counters[key]; ok {
+ return c
+ }
+
+ c := NewCounter(name, help, labels)
+ r.counters[key] = c
+ return c
+}
+
+// Gauge returns or creates a gauge with the given name.
+func (r *Registry) Gauge(name, help string, labels map[string]string) *Gauge {
+ key := metricKey(name, labels)
+ r.mu.RLock()
+ if g, ok := r.gauges[key]; ok {
+ r.mu.RUnlock()
+ return g
+ }
+ r.mu.RUnlock()
+
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ if g, ok := r.gauges[key]; ok {
+ return g
+ }
+
+ g := NewGauge(name, help, labels)
+ r.gauges[key] = g
+ return g
+}
+
+// Histogram returns or creates a histogram with the given name.
+func (r *Registry) Histogram(name, help string, labels map[string]string, buckets []float64) *Histogram {
+ key := metricKey(name, labels)
+ r.mu.RLock()
+ if h, ok := r.histograms[key]; ok {
+ r.mu.RUnlock()
+ return h
+ }
+ r.mu.RUnlock()
+
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ if h, ok := r.histograms[key]; ok {
+ return h
+ }
+
+ h := NewHistogram(name, help, labels, buckets)
+ r.histograms[key] = h
+ return h
+}
+
+// metricKey creates a unique key for a metric based on name and labels.
+func metricKey(name string, labels map[string]string) string {
+ if len(labels) == 0 {
+ return name
+ }
+ var parts []string
+ for k, v := range labels {
+ parts = append(parts, fmt.Sprintf("%s=%q", k, v))
+ }
+ sort.Strings(parts)
+ return name + "{" + strings.Join(parts, ",") + "}"
+}
+
+// formatLabels formats labels for Prometheus output.
+func formatLabels(labels map[string]string) string {
+ if len(labels) == 0 {
+ return ""
+ }
+ var parts []string
+ for k, v := range labels {
+ parts = append(parts, fmt.Sprintf("%s=%q", k, v))
+ }
+ sort.Strings(parts)
+ return "{" + strings.Join(parts, ",") + "}"
+}
+
+// Expose returns all metrics in Prometheus text format.
+func (r *Registry) Expose() string {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
+ var sb strings.Builder
+
+ // Export counters
+ for _, c := range r.counters {
+ if c.help != "" {
+ sb.WriteString(fmt.Sprintf("# HELP %s %s\n", c.name, c.help))
+ }
+ sb.WriteString(fmt.Sprintf("# TYPE %s counter\n", c.name))
+ sb.WriteString(fmt.Sprintf("%s%s %d\n", c.name, formatLabels(c.labels), c.value.Load()))
+ }
+
+ // Export gauges
+ for _, g := range r.gauges {
+ if g.help != "" {
+ sb.WriteString(fmt.Sprintf("# HELP %s %s\n", g.name, g.help))
+ }
+ sb.WriteString(fmt.Sprintf("# TYPE %s gauge\n", g.name))
+ sb.WriteString(fmt.Sprintf("%s%s %d\n", g.name, formatLabels(g.labels), g.value.Load()))
+ }
+
+ // Export histograms
+ for _, h := range r.histograms {
+ if h.help != "" {
+ sb.WriteString(fmt.Sprintf("# HELP %s %s\n", h.name, h.help))
+ }
+ sb.WriteString(fmt.Sprintf("# TYPE %s histogram\n", h.name))
+
+ // Cumulative bucket counts
+ var cumulative int64
+ for i, bound := range h.buckets {
+ cumulative += h.counts[i].Load()
+ labelStr := formatLabels(h.labels)
+ if labelStr == "" {
+ sb.WriteString(fmt.Sprintf("%s_bucket{le=\"%g\"} %d\n", h.name, bound, cumulative))
+ } else {
+ // Insert le label into existing labels
+ sb.WriteString(fmt.Sprintf("%s_bucket%s %d\n", h.name,
+ strings.Replace(labelStr, "}", fmt.Sprintf(",le=\"%g\"}", bound), 1), cumulative))
+ }
+ }
+ // +Inf bucket
+ cumulative += h.counts[len(h.buckets)].Load()
+ labelStr := formatLabels(h.labels)
+ if labelStr == "" {
+ sb.WriteString(fmt.Sprintf("%s_bucket{le=\"+Inf\"} %d\n", h.name, cumulative))
+ } else {
+ sb.WriteString(fmt.Sprintf("%s_bucket%s %d\n", h.name,
+ strings.Replace(labelStr, "}", ",le=\"+Inf\"}", 1), cumulative))
+ }
+
+ // Sum and count
+ sb.WriteString(fmt.Sprintf("%s_sum%s %g\n", h.name, formatLabels(h.labels), h.Sum()))
+ sb.WriteString(fmt.Sprintf("%s_count%s %d\n", h.name, formatLabels(h.labels), h.count.Load()))
+ }
+
+ return sb.String()
+}
+
+// Reset resets all metrics to zero.
+func (r *Registry) Reset() {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ for _, c := range r.counters {
+ c.Reset()
+ }
+ for _, g := range r.gauges {
+ g.Set(0)
+ }
+ // Note: Histograms don't have a simple reset due to atomic bucket counts
+}
+
+// ServerMetrics provides pre-defined metrics for the MCP server.
+type ServerMetrics struct {
+ registry *Registry
+
+ // Request metrics
+ RequestsTotal *Counter
+ RequestErrors *Counter
+ RequestDuration *Histogram
+
+ // Cache metrics
+ CacheHits *Counter
+ CacheMisses *Counter
+
+ // LSP metrics
+ ActiveLSPServers *Gauge
+
+ // Parse metrics
+ ParseDuration *Histogram
+ ParseErrors *Counter
+}
+
+// NewServerMetrics creates a new set of server metrics.
+func NewServerMetrics() *ServerMetrics {
+ r := NewRegistry()
+
+ return &ServerMetrics{
+ registry: r,
+
+ RequestsTotal: r.Counter(
+ "mcp_requests_total",
+ "Total number of MCP requests processed",
+ nil,
+ ),
+ RequestErrors: r.Counter(
+ "mcp_request_errors_total",
+ "Total number of MCP request errors",
+ nil,
+ ),
+ RequestDuration: r.Histogram(
+ "mcp_request_duration_seconds",
+ "Request duration in seconds",
+ nil,
+ DefaultDurationBuckets,
+ ),
+
+ CacheHits: r.Counter(
+ "mcp_cache_hits_total",
+ "Total number of cache hits",
+ nil,
+ ),
+ CacheMisses: r.Counter(
+ "mcp_cache_misses_total",
+ "Total number of cache misses",
+ nil,
+ ),
+
+ ActiveLSPServers: r.Gauge(
+ "mcp_lsp_servers_active",
+ "Number of active LSP server connections",
+ nil,
+ ),
+
+ ParseDuration: r.Histogram(
+ "mcp_parse_duration_seconds",
+ "Parse duration in seconds",
+ nil,
+ []float64{0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0},
+ ),
+ ParseErrors: r.Counter(
+ "mcp_parse_errors_total",
+ "Total number of parse errors",
+ nil,
+ ),
+ }
+}
+
+// Expose returns all metrics in Prometheus text format.
+func (m *ServerMetrics) Expose() string {
+ return m.registry.Expose()
+}
+
+// Registry returns the underlying metrics registry.
+func (m *ServerMetrics) Registry() *Registry {
+ return m.registry
+}
+
+// RecordRequest records a request with its duration and error status.
+func (m *ServerMetrics) RecordRequest(duration time.Duration, err error) {
+ m.RequestsTotal.Inc()
+ m.RequestDuration.ObserveDuration(duration)
+ if err != nil {
+ m.RequestErrors.Inc()
+ }
+}
+
+// RecordParse records a parse operation with its duration and error status.
+func (m *ServerMetrics) RecordParse(duration time.Duration, err error) {
+ m.ParseDuration.ObserveDuration(duration)
+ if err != nil {
+ m.ParseErrors.Inc()
+ }
+}
+
+// RecordCacheHit records a cache hit.
+func (m *ServerMetrics) RecordCacheHit() {
+ m.CacheHits.Inc()
+}
+
+// RecordCacheMiss records a cache miss.
+func (m *ServerMetrics) RecordCacheMiss() {
+ m.CacheMisses.Inc()
+}
+
+// SetActiveLSPServers sets the number of active LSP servers.
+func (m *ServerMetrics) SetActiveLSPServers(count int64) {
+ m.ActiveLSPServers.Set(count)
+}
diff --git a/internal/parser/parser.go b/internal/parser/parser.go
index b527bbf..4ba5a78 100644
--- a/internal/parser/parser.go
+++ b/internal/parser/parser.go
@@ -5,6 +5,8 @@ import (
"context"
"fmt"
"sync"
+ "sync/atomic"
+ "time"
"github.com/cespare/xxhash/v2"
lru "github.com/hashicorp/golang-lru/v2"
@@ -22,14 +24,25 @@ import (
"github.com/lukaszraczylo/mcp-filepuff/pkg/protocol"
)
-// MaxFileSize is the maximum file size we'll parse (10MB).
+// MaxFileSize is the default maximum file size we'll parse (10MB).
+// Deprecated: Use Registry.maxParseSize instead.
const MaxFileSize = 10 * 1024 * 1024
// Registry manages Tree-sitter parsers for different languages.
type Registry struct {
- parsers map[protocol.Language]*sitter.Parser
- cache *lru.Cache[string, *CachedTree]
- mu sync.RWMutex
+ parsers map[protocol.Language]*sitter.Parser
+ cache *lru.Cache[string, *CachedTree]
+ maxParseSize int64
+ mu sync.RWMutex
+
+ // Cache metrics (atomic for thread-safety)
+ cacheHits atomic.Int64
+ cacheMisses atomic.Int64
+
+ // Parse duration tracking
+ totalParseTime atomic.Int64 // nanoseconds
+ parseCount atomic.Int64
+ lastParseDuration atomic.Int64 // nanoseconds
}
// CachedTree stores a parsed tree with its metadata.
@@ -54,8 +67,27 @@ type SyntaxError struct {
Location protocol.Location
}
-// NewRegistry creates a new parser registry.
+// CacheStatsResult contains cache statistics.
+type CacheStatsResult struct {
+ Hits int64 `json:"hits"`
+ Misses int64 `json:"misses"`
+ HitRate float64 `json:"hit_rate"`
+ Size int `json:"size"`
+ TotalParseTime int64 `json:"total_parse_time_ns"`
+ ParseCount int64 `json:"parse_count"`
+ AvgParseTime int64 `json:"avg_parse_time_ns"`
+ LastParseTime int64 `json:"last_parse_time_ns"`
+}
+
+// NewRegistry creates a new parser registry with the default max parse size.
+// For custom max parse size, use NewRegistryWithSize.
func NewRegistry() *Registry {
+ return NewRegistryWithSize(0)
+}
+
+// NewRegistryWithSize creates a new parser registry with the specified max parse size.
+// If maxParseSize is 0 or negative, uses the default MaxFileSize constant.
+func NewRegistryWithSize(maxParseSize int64) *Registry {
// Create LRU cache with capacity of 100 trees
cache, err := lru.New[string, *CachedTree](100)
if err != nil {
@@ -63,9 +95,14 @@ func NewRegistry() *Registry {
panic(fmt.Sprintf("failed to create LRU cache: %v", err))
}
+ if maxParseSize <= 0 {
+ maxParseSize = MaxFileSize
+ }
+
return &Registry{
- parsers: make(map[protocol.Language]*sitter.Parser),
- cache: cache,
+ parsers: make(map[protocol.Language]*sitter.Parser),
+ cache: cache,
+ maxParseSize: maxParseSize,
}
}
@@ -130,9 +167,9 @@ func (r *Registry) GetParser(lang protocol.Language) (*sitter.Parser, error) {
// Parse parses the given content for the specified language.
func (r *Registry) Parse(ctx context.Context, filename string, content []byte) (*ParseResult, error) {
- // Check file size
- if len(content) > MaxFileSize {
- return nil, errors.NewFileTooLarge(filename, int64(len(content)), MaxFileSize)
+ // Check file size against configured limit
+ if int64(len(content)) > r.maxParseSize {
+ return nil, errors.NewFileTooLarge(filename, int64(len(content)), r.maxParseSize)
}
// Detect binary files
@@ -161,6 +198,7 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) (
// Check cache (LRU cache is thread-safe)
hash := contentHash(content)
if cached, ok := r.cache.Get(hash); ok && cached.Language == lang {
+ r.cacheHits.Add(1)
errors := extractErrors(cached.Tree.RootNode(), content)
return &ParseResult{
Tree: cached.Tree,
@@ -169,6 +207,7 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) (
Content: content,
}, nil
}
+ r.cacheMisses.Add(1)
// Get parser
parser, err := r.GetParser(lang)
@@ -178,9 +217,17 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) (
// Parse content - tree-sitter parsers are not thread-safe,
// so we need to hold the lock during parsing
+ // Track parse duration
+ start := time.Now()
r.mu.Lock()
tree, err := parser.ParseCtx(ctx, nil, content)
r.mu.Unlock()
+ duration := time.Since(start)
+
+ // Update duration metrics
+ r.totalParseTime.Add(duration.Nanoseconds())
+ r.parseCount.Add(1)
+ r.lastParseDuration.Store(duration.Nanoseconds())
if err != nil {
return nil, errors.NewParseError(string(lang), filename, err)
@@ -203,6 +250,50 @@ func (r *Registry) Parse(ctx context.Context, filename string, content []byte) (
}, nil
}
+// CacheStats returns cache hit/miss statistics.
+func (r *Registry) CacheStats() (hits, misses int64) {
+ return r.cacheHits.Load(), r.cacheMisses.Load()
+}
+
+// CacheStatsDetailed returns detailed cache and parse statistics.
+func (r *Registry) CacheStatsDetailed() CacheStatsResult {
+ hits := r.cacheHits.Load()
+ misses := r.cacheMisses.Load()
+ totalParseTime := r.totalParseTime.Load()
+ parseCount := r.parseCount.Load()
+
+ var hitRate float64
+ total := hits + misses
+ if total > 0 {
+ hitRate = float64(hits) / float64(total)
+ }
+
+ var avgParseTime int64
+ if parseCount > 0 {
+ avgParseTime = totalParseTime / parseCount
+ }
+
+ return CacheStatsResult{
+ Hits: hits,
+ Misses: misses,
+ HitRate: hitRate,
+ Size: r.cache.Len(),
+ TotalParseTime: totalParseTime,
+ ParseCount: parseCount,
+ AvgParseTime: avgParseTime,
+ LastParseTime: r.lastParseDuration.Load(),
+ }
+}
+
+// ResetStats resets all cache and parse statistics.
+func (r *Registry) ResetStats() {
+ r.cacheHits.Store(0)
+ r.cacheMisses.Store(0)
+ r.totalParseTime.Store(0)
+ r.parseCount.Store(0)
+ r.lastParseDuration.Store(0)
+}
+
// extractErrors finds all error nodes in the tree.
func extractErrors(node *sitter.Node, _ []byte) []SyntaxError {
var errors []SyntaxError
diff --git a/internal/parser/parser_bench_test.go b/internal/parser/parser_bench_test.go
new file mode 100644
index 0000000..cf9ece9
--- /dev/null
+++ b/internal/parser/parser_bench_test.go
@@ -0,0 +1,459 @@
+package parser
+
+import (
+ "context"
+ "strings"
+ "testing"
+)
+
+// BenchmarkParse benchmarks parsing files of various sizes.
+func BenchmarkParse(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ benchmarks := []struct {
+ name string
+ content string
+ }{
+ {
+ name: "small_file_100_lines",
+ content: generateGoCode(100),
+ },
+ {
+ name: "medium_file_1000_lines",
+ content: generateGoCode(1000),
+ },
+ {
+ name: "large_file_5000_lines",
+ content: generateGoCode(5000),
+ },
+ {
+ name: "very_large_file_10000_lines",
+ content: generateGoCode(10000),
+ },
+ }
+
+ for _, bm := range benchmarks {
+ b.Run(bm.name, func(b *testing.B) {
+ content := []byte(bm.content)
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+ })
+ }
+}
+
+// BenchmarkParseCacheHit benchmarks cache hit performance.
+func BenchmarkParseCacheHit(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ content := []byte(generateGoCode(1000))
+
+ // Warm up the cache
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("initial parse failed: %v", err)
+ }
+
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+}
+
+// BenchmarkParseCacheMiss benchmarks cache miss performance.
+func BenchmarkParseCacheMiss(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ // Use different content each time to force cache miss
+ content := []byte(generateGoCodeWithSuffix(1000, i))
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+}
+
+// BenchmarkParseLanguages benchmarks parsing different language files.
+func BenchmarkParseLanguages(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ languages := []struct {
+ name string
+ filename string
+ content string
+ }{
+ {
+ name: "go",
+ filename: "test.go",
+ content: generateGoCode(500),
+ },
+ {
+ name: "typescript",
+ filename: "test.ts",
+ content: generateTypeScriptCode(500),
+ },
+ {
+ name: "python",
+ filename: "test.py",
+ content: generatePythonCode(500),
+ },
+ {
+ name: "javascript",
+ filename: "test.js",
+ content: generateJavaScriptCode(500),
+ },
+ }
+
+ for _, lang := range languages {
+ b.Run(lang.name, func(b *testing.B) {
+ content := []byte(lang.content)
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _, err := registry.Parse(ctx, lang.filename, content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+ })
+ }
+}
+
+// BenchmarkParseComplexity benchmarks parsing files with varying complexity.
+func BenchmarkParseComplexity(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ benchmarks := []struct {
+ name string
+ content string
+ }{
+ {
+ name: "simple_functions",
+ content: generateSimpleFunctions(100),
+ },
+ {
+ name: "nested_structures",
+ content: generateNestedStructures(50),
+ },
+ {
+ name: "complex_types",
+ content: generateComplexTypes(50),
+ },
+ }
+
+ for _, bm := range benchmarks {
+ b.Run(bm.name, func(b *testing.B) {
+ content := []byte(bm.content)
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+ })
+ }
+}
+
+// BenchmarkContentHash benchmarks the content hashing function.
+func BenchmarkContentHash(b *testing.B) {
+ sizes := []int{100, 1000, 10000, 100000}
+
+ for _, size := range sizes {
+ b.Run(formatSize(size), func(b *testing.B) {
+ content := []byte(strings.Repeat("a", size))
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _ = contentHash(content)
+ }
+ })
+ }
+}
+
+// BenchmarkIsBinary benchmarks the binary detection function.
+func BenchmarkIsBinary(b *testing.B) {
+ sizes := []int{100, 1000, 8000, 10000}
+
+ for _, size := range sizes {
+ b.Run(formatSize(size)+"_text", func(b *testing.B) {
+ content := []byte(strings.Repeat("Hello, World!\n", size/14))
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _ = isBinary(content)
+ }
+ })
+
+ b.Run(formatSize(size)+"_binary", func(b *testing.B) {
+ content := make([]byte, size)
+ for j := 0; j < size; j++ {
+ content[j] = byte(j % 256)
+ }
+ content[size/2] = 0 // Add null byte
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _ = isBinary(content)
+ }
+ })
+ }
+}
+
+// BenchmarkParseWithMaxSize benchmarks parsing with different max size limits.
+func BenchmarkParseWithMaxSize(b *testing.B) {
+ ctx := context.Background()
+
+ limits := []int64{
+ 10 * 1024, // 10KB
+ 100 * 1024, // 100KB
+ 1024 * 1024, // 1MB
+ 10 * 1024 * 1024, // 10MB
+ }
+
+ content := []byte(generateGoCode(500))
+
+ for _, limit := range limits {
+ b.Run(formatBytes(limit), func(b *testing.B) {
+ // Skip if content is larger than limit
+ if int64(len(content)) > limit {
+ b.Skipf("content size %d exceeds limit %d", len(content), limit)
+ }
+
+ registry := NewRegistryWithSize(limit)
+ defer registry.Close()
+
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ for i := 0; i < b.N; i++ {
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+ })
+ }
+}
+
+// BenchmarkConcurrentParse benchmarks concurrent parsing operations.
+func BenchmarkConcurrentParse(b *testing.B) {
+ registry := NewRegistry()
+ defer registry.Close()
+ ctx := context.Background()
+
+ content := []byte(generateGoCode(500))
+
+ b.ResetTimer()
+ b.ReportAllocs()
+
+ b.RunParallel(func(pb *testing.PB) {
+ for pb.Next() {
+ _, err := registry.Parse(ctx, "test.go", content)
+ if err != nil {
+ b.Fatalf("Parse failed: %v", err)
+ }
+ }
+ })
+}
+
+// Helper functions to generate test code
+
+func generateGoCode(lines int) string {
+ var sb strings.Builder
+ sb.WriteString("package main\n\n")
+
+ for i := 0; i < lines/10; i++ {
+ sb.WriteString("func Function")
+ sb.WriteString(itoa(i))
+ sb.WriteString("(a, b int) int {\n")
+ sb.WriteString("\tif a > b {\n")
+ sb.WriteString("\t\treturn a + b\n")
+ sb.WriteString("\t}\n")
+ sb.WriteString("\treturn a - b\n")
+ sb.WriteString("}\n\n")
+ }
+
+ return sb.String()
+}
+
+func generateGoCodeWithSuffix(lines int, suffix int) string {
+ code := generateGoCode(lines)
+ return code + "// Suffix: " + itoa(suffix) + "\n"
+}
+
+func generateTypeScriptCode(lines int) string {
+ var sb strings.Builder
+
+ for i := 0; i < lines/8; i++ {
+ sb.WriteString("function function")
+ sb.WriteString(itoa(i))
+ sb.WriteString("(a: number, b: number): number {\n")
+ sb.WriteString(" if (a > b) {\n")
+ sb.WriteString(" return a + b;\n")
+ sb.WriteString(" }\n")
+ sb.WriteString(" return a - b;\n")
+ sb.WriteString("}\n\n")
+ }
+
+ return sb.String()
+}
+
+func generatePythonCode(lines int) string {
+ var sb strings.Builder
+
+ for i := 0; i < lines/6; i++ {
+ sb.WriteString("def function")
+ sb.WriteString(itoa(i))
+ sb.WriteString("(a, b):\n")
+ sb.WriteString(" if a > b:\n")
+ sb.WriteString(" return a + b\n")
+ sb.WriteString(" return a - b\n\n")
+ }
+
+ return sb.String()
+}
+
+func generateJavaScriptCode(lines int) string {
+ var sb strings.Builder
+
+ for i := 0; i < lines/8; i++ {
+ sb.WriteString("function function")
+ sb.WriteString(itoa(i))
+ sb.WriteString("(a, b) {\n")
+ sb.WriteString(" if (a > b) {\n")
+ sb.WriteString(" return a + b;\n")
+ sb.WriteString(" }\n")
+ sb.WriteString(" return a - b;\n")
+ sb.WriteString("}\n\n")
+ }
+
+ return sb.String()
+}
+
+func generateSimpleFunctions(count int) string {
+ var sb strings.Builder
+ sb.WriteString("package main\n\n")
+
+ for i := 0; i < count; i++ {
+ sb.WriteString("func Func")
+ sb.WriteString(itoa(i))
+ sb.WriteString("() { }\n\n")
+ }
+
+ return sb.String()
+}
+
+func generateNestedStructures(depth int) string {
+ var sb strings.Builder
+ sb.WriteString("package main\n\n")
+
+ for i := 0; i < depth; i++ {
+ sb.WriteString("type Struct")
+ sb.WriteString(itoa(i))
+ sb.WriteString(" struct {\n")
+ sb.WriteString("\tField1 int\n")
+ sb.WriteString("\tField2 string\n")
+ if i > 0 {
+ sb.WriteString("\tNested Struct")
+ sb.WriteString(itoa(i - 1))
+ sb.WriteString("\n")
+ }
+ sb.WriteString("}\n\n")
+ }
+
+ return sb.String()
+}
+
+func generateComplexTypes(count int) string {
+ var sb strings.Builder
+ sb.WriteString("package main\n\n")
+
+ for i := 0; i < count; i++ {
+ sb.WriteString("type Type")
+ sb.WriteString(itoa(i))
+ sb.WriteString(" interface {\n")
+ sb.WriteString("\tMethod1() error\n")
+ sb.WriteString("\tMethod2(a int, b string) (int, error)\n")
+ sb.WriteString("\tMethod3() chan interface{}\n")
+ sb.WriteString("}\n\n")
+ }
+
+ return sb.String()
+}
+
+func formatSize(size int) string {
+ if size < 1000 {
+ return itoa(size) + "B"
+ }
+ return itoa(size/1000) + "KB"
+}
+
+func formatBytes(bytes int64) string {
+ if bytes < 1024 {
+ return itoa(int(bytes)) + "B"
+ }
+ if bytes < 1024*1024 {
+ return itoa(int(bytes/1024)) + "KB"
+ }
+ return itoa(int(bytes/(1024*1024))) + "MB"
+}
+
+// Simple integer to string conversion without importing strconv
+func itoa(n int) string {
+ if n == 0 {
+ return "0"
+ }
+
+ negative := n < 0
+ if negative {
+ n = -n
+ }
+
+ var buf [20]byte
+ i := len(buf) - 1
+
+ for n > 0 {
+ buf[i] = byte('0' + n%10)
+ n /= 10
+ i--
+ }
+
+ if negative {
+ buf[i] = '-'
+ i--
+ }
+
+ return string(buf[i+1:])
+}
diff --git a/internal/query/query.go b/internal/query/query.go
index f710e1b..bbdca27 100644
--- a/internal/query/query.go
+++ b/internal/query/query.go
@@ -6,37 +6,13 @@ import (
"fmt"
"regexp"
"strings"
- "sync"
"github.com/lukaszraczylo/mcp-filepuff/internal/parser"
+ "github.com/lukaszraczylo/mcp-filepuff/internal/util"
"github.com/lukaszraczylo/mcp-filepuff/pkg/protocol"
sitter "github.com/smacker/go-tree-sitter"
)
-// Global regex cache for compiled patterns (thread-safe)
-var regexCache sync.Map // string -> *regexp.Regexp
-
-// compileRegex compiles a regex pattern with caching for performance.
-// Cached patterns avoid repeated compilation overhead (10-50x speedup).
-// Thread-safe: uses LoadOrStore to prevent race conditions.
-func compileRegex(pattern string) (*regexp.Regexp, error) {
- // Check cache first
- if cached, ok := regexCache.Load(pattern); ok {
- return cached.(*regexp.Regexp), nil
- }
-
- // Compile regex
- re, err := regexp.Compile(pattern)
- if err != nil {
- return nil, err
- }
-
- // Try to store - if another goroutine already stored it, use theirs
- // This prevents race conditions where multiple goroutines compile the same pattern
- actual, _ := regexCache.LoadOrStore(pattern, re)
- return actual.(*regexp.Regexp), nil
-}
-
// ASTQuery defines a query for matching AST patterns.
type ASTQuery struct {
Pattern string `json:"pattern"` // code pattern with $VAR placeholders
@@ -438,7 +414,7 @@ func passesFilters(node *sitter.Node, filters QueryFilters, content []byte) bool
return false
}
name := parser.GetNodeText(nameNode, content)
- re, err := compileRegex(filters.NameMatches)
+ re, err := util.CompileRegex(filters.NameMatches)
if err != nil {
return false
}
diff --git a/internal/query/regex_cache_test.go b/internal/query/regex_cache_test.go
index 638a4d9..ed7c585 100644
--- a/internal/query/regex_cache_test.go
+++ b/internal/query/regex_cache_test.go
@@ -4,23 +4,25 @@ import (
"regexp"
"sync"
"testing"
+
+ "github.com/lukaszraczylo/mcp-filepuff/internal/util"
)
// TestCompileRegexCaching tests that regex compilation is cached.
func TestCompileRegexCaching(t *testing.T) {
// Clear cache before test
- regexCache = sync.Map{}
+ util.ClearRegexCache()
pattern := `^test_\w+$`
// First compilation
- re1, err := compileRegex(pattern)
+ re1, err := util.CompileRegex(pattern)
if err != nil {
t.Fatalf("First compile failed: %v", err)
}
// Second compilation should return cached version
- re2, err := compileRegex(pattern)
+ re2, err := util.CompileRegex(pattern)
if err != nil {
t.Fatalf("Second compile failed: %v", err)
}
@@ -29,22 +31,12 @@ func TestCompileRegexCaching(t *testing.T) {
if re1 != re2 {
t.Error("Expected cached regex to be reused, got different objects")
}
-
- // Verify it's in the cache
- cached, ok := regexCache.Load(pattern)
- if !ok {
- t.Error("Pattern not found in cache")
- }
-
- if cached.(*regexp.Regexp) != re1 {
- t.Error("Cached regex doesn't match returned regex")
- }
}
// TestCompileRegexConcurrent tests concurrent regex compilation.
func TestCompileRegexConcurrent(t *testing.T) {
// Clear cache before test
- regexCache = sync.Map{}
+ util.ClearRegexCache()
pattern := `[a-z]+_\d+`
const numGoroutines = 100
@@ -60,7 +52,7 @@ func TestCompileRegexConcurrent(t *testing.T) {
go func() {
defer wg.Done()
- re, err := compileRegex(pattern)
+ re, err := util.CompileRegex(pattern)
if err != nil {
errors <- err
return
@@ -89,26 +81,30 @@ func TestCompileRegexConcurrent(t *testing.T) {
// TestCompileRegexInvalidPattern tests error handling for invalid patterns.
func TestCompileRegexInvalidPattern(t *testing.T) {
// Clear cache before test
- regexCache = sync.Map{}
+ util.ClearRegexCache()
invalidPattern := `[invalid(`
- _, err := compileRegex(invalidPattern)
+ _, err := util.CompileRegex(invalidPattern)
if err == nil {
t.Error("Expected error for invalid pattern, got nil")
}
- // Invalid patterns should not be cached
- _, ok := regexCache.Load(invalidPattern)
- if ok {
- t.Error("Invalid pattern should not be cached")
+ // Verify that a valid pattern still works after an invalid one
+ validPattern := `^valid$`
+ re, err := util.CompileRegex(validPattern)
+ if err != nil {
+ t.Errorf("Expected valid pattern to compile, got error: %v", err)
+ }
+ if re == nil {
+ t.Error("Expected non-nil regex for valid pattern")
}
}
// TestCompileRegexMultiplePatterns tests that different patterns are cached separately.
func TestCompileRegexMultiplePatterns(t *testing.T) {
// Clear cache before test
- regexCache = sync.Map{}
+ util.ClearRegexCache()
patterns := []string{
`^test_\w+$`,
@@ -121,26 +117,14 @@ func TestCompileRegexMultiplePatterns(t *testing.T) {
// Compile all patterns
for i, pattern := range patterns {
- re, err := compileRegex(pattern)
+ re, err := util.CompileRegex(pattern)
if err != nil {
t.Fatalf("Compile failed for pattern %s: %v", pattern, err)
}
compiled[i] = re
}
- // Verify all are cached
- for i, pattern := range patterns {
- cached, ok := regexCache.Load(pattern)
- if !ok {
- t.Errorf("Pattern %s not in cache", pattern)
- }
-
- if cached.(*regexp.Regexp) != compiled[i] {
- t.Errorf("Cached regex for %s doesn't match compiled version", pattern)
- }
- }
-
- // All should be different objects
+ // All should be different objects (different patterns)
for i := 0; i < len(compiled); i++ {
for j := i + 1; j < len(compiled); j++ {
if compiled[i] == compiled[j] {
@@ -148,6 +132,17 @@ func TestCompileRegexMultiplePatterns(t *testing.T) {
}
}
}
+
+ // Re-compile should return cached versions
+ for i, pattern := range patterns {
+ re, err := util.CompileRegex(pattern)
+ if err != nil {
+ t.Fatalf("Re-compile failed for pattern %s: %v", pattern, err)
+ }
+ if re != compiled[i] {
+ t.Errorf("Pattern %s was not cached properly", pattern)
+ }
+ }
}
// BenchmarkCompileRegex_Uncached benchmarks regex compilation without caching.
@@ -163,23 +158,23 @@ func BenchmarkCompileRegex_Uncached(b *testing.B) {
// BenchmarkCompileRegex_Cached benchmarks regex compilation with caching.
func BenchmarkCompileRegex_Cached(b *testing.B) {
// Clear cache
- regexCache = sync.Map{}
+ util.ClearRegexCache()
pattern := `^\w+_[0-9]{3,5}_[a-zA-Z]+$`
// Pre-populate cache
- _, _ = compileRegex(pattern)
+ _, _ = util.CompileRegex(pattern)
b.ResetTimer()
for i := 0; i < b.N; i++ {
- _, _ = compileRegex(pattern)
+ _, _ = util.CompileRegex(pattern)
}
}
// BenchmarkCompileRegex_MixedPatterns benchmarks realistic workload with multiple patterns.
func BenchmarkCompileRegex_MixedPatterns(b *testing.B) {
// Clear cache
- regexCache = sync.Map{}
+ util.ClearRegexCache()
patterns := []string{
`^test_\w+$`,
@@ -193,6 +188,6 @@ func BenchmarkCompileRegex_MixedPatterns(b *testing.B) {
for i := 0; i < b.N; i++ {
// Simulate realistic access pattern
pattern := patterns[i%len(patterns)]
- _, _ = compileRegex(pattern)
+ _, _ = util.CompileRegex(pattern)
}
}
diff --git a/internal/search/search_test.go b/internal/search/search_test.go
index fbdef7a..4bf89a9 100644
--- a/internal/search/search_test.go
+++ b/internal/search/search_test.go
@@ -259,7 +259,7 @@ func TestSearchIntegration(t *testing.T) {
if err != nil {
t.Fatalf("failed to create temp dir: %v", err)
}
- defer os.RemoveAll(tmpDir)
+ t.Cleanup(func() { _ = os.RemoveAll(tmpDir) })
// Create test files
testFile := filepath.Join(tmpDir, "test.go")
@@ -269,7 +269,7 @@ func main() {
println("Hello, World!")
}
`
- err = os.WriteFile(testFile, []byte(content), 0600)
+ err = os.WriteFile(testFile, []byte(content), 0o600)
if err != nil {
t.Fatalf("failed to write test file: %v", err)
}
diff --git a/internal/server/integration_test.go b/internal/server/integration_test.go
new file mode 100644
index 0000000..dc78c70
--- /dev/null
+++ b/internal/server/integration_test.go
@@ -0,0 +1,510 @@
+package server
+
+import (
+ "context"
+ "log/slog"
+ "os"
+ "path/filepath"
+ "testing"
+ "time"
+
+ "github.com/lukaszraczylo/mcp-filepuff/internal/config"
+ "github.com/mark3labs/mcp-go/mcp"
+)
+
+// TestMCPProtocolEndToEnd tests the complete MCP protocol communication flow.
+func TestMCPProtocolEndToEnd(t *testing.T) {
+ tmpDir := t.TempDir()
+
+ // Create test files
+ testFile := filepath.Join(tmpDir, "test.go")
+ content := `package main
+
+func Hello() string {
+ return "hello"
+}
+`
+ if err := os.WriteFile(testFile, []byte(content), 0o600); err != nil {
+ t.Fatalf("failed to write test file: %v", err)
+ }
+
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ MaxFileSize: config.DefaultMaxFileSize,
+ MaxParseSize: config.DefaultMaxParseSize,
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ ctx := context.Background()
+
+ // Test 1: Ping tool (health check)
+ t.Run("ping", func(t *testing.T) {
+ req := mcp.CallToolRequest{}
+ result, err := srv.handlePing(ctx, req)
+ if err != nil {
+ t.Errorf("handlePing() error = %v", err)
+ }
+ if result == nil {
+ t.Fatal("handlePing() returned nil")
+ }
+ if len(result.Content) == 0 {
+ t.Fatal("handlePing() returned empty content")
+ }
+ })
+
+ // Test 2: File read
+ t.Run("file_read", func(t *testing.T) {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "path": testFile,
+ }
+ result, err := srv.handleFileRead(ctx, req)
+ if err != nil {
+ t.Errorf("handleFileRead() error = %v", err)
+ }
+ if result == nil {
+ t.Fatal("handleFileRead() returned nil")
+ }
+ if len(result.Content) == 0 {
+ t.Fatal("handleFileRead() returned empty content")
+ }
+ })
+
+ // Test 3: AST query
+ t.Run("ast_query", func(t *testing.T) {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME() string",
+ "language": "go",
+ "paths": []interface{}{tmpDir},
+ }
+ result, err := srv.handleASTQuery(ctx, req)
+ if err != nil {
+ t.Errorf("handleASTQuery() error = %v", err)
+ }
+ if result == nil {
+ t.Fatal("handleASTQuery() returned nil")
+ }
+ })
+
+ // Test 4: Edit preview and apply
+ t.Run("edit_workflow", func(t *testing.T) {
+ // Preview edit
+ previewReq := mcp.CallToolRequest{}
+ previewReq.Params.Arguments = map[string]interface{}{
+ "file": testFile,
+ "operation": "replace",
+ "selector_kind": "function_declaration",
+ "selector_name": "Hello",
+ "new_content": "func Hello() string {\n\treturn \"goodbye\"\n}",
+ }
+ previewResult, err := srv.handleEditPreview(ctx, previewReq)
+ if err != nil {
+ t.Errorf("handleEditPreview() error = %v", err)
+ }
+ if previewResult == nil {
+ t.Fatal("handleEditPreview() returned nil")
+ }
+
+ // Verify file unchanged after preview
+ originalContent, _ := os.ReadFile(testFile)
+ if string(originalContent) != content {
+ t.Error("preview should not modify file")
+ }
+
+ // Apply edit
+ applyReq := mcp.CallToolRequest{}
+ applyReq.Params.Arguments = previewReq.Params.Arguments
+ applyResult, err := srv.handleEditApply(ctx, applyReq)
+ if err != nil {
+ t.Errorf("handleEditApply() error = %v", err)
+ }
+ if applyResult == nil {
+ t.Fatal("handleEditApply() returned nil")
+ }
+
+ // Verify file changed after apply
+ modifiedContent, _ := os.ReadFile(testFile)
+ if string(modifiedContent) == content {
+ t.Error("apply should modify file")
+ }
+ })
+}
+
+// TestMCPToolDiscovery tests that all expected tools are registered.
+func TestMCPToolDiscovery(t *testing.T) {
+ tmpDir := t.TempDir()
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ // Note: The MCP server doesn't expose a method to list tools directly,
+ // but we can verify the server was created successfully
+ if srv.mcp == nil {
+ t.Fatal("MCP server not initialized")
+ }
+
+ // Verify each expected tool works
+ ctx := context.Background()
+
+ // Test ping tool
+ pingReq := mcp.CallToolRequest{}
+ if _, err := srv.handlePing(ctx, pingReq); err != nil {
+ t.Errorf("ping tool failed: %v", err)
+ }
+}
+
+// TestMCPErrorResponses tests error handling following MCP spec.
+func TestMCPErrorResponses(t *testing.T) {
+ tmpDir := t.TempDir()
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ MaxFileSize: 1024, // Small size to trigger errors
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ ctx := context.Background()
+
+ tests := []struct {
+ name string
+ handler func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error)
+ setupReq func() mcp.CallToolRequest
+ expectError bool
+ }{
+ {
+ name: "file_read_missing_path",
+ handler: srv.handleFileRead,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{}
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "file_read_nonexistent",
+ handler: srv.handleFileRead,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "path": filepath.Join(tmpDir, "nonexistent.txt"),
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "file_read_outside_workspace",
+ handler: srv.handleFileRead,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "path": "/etc/passwd",
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "ast_query_missing_pattern",
+ handler: srv.handleASTQuery,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "language": "go",
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "ast_query_missing_language",
+ handler: srv.handleASTQuery,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME()",
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "ast_query_unsupported_language",
+ handler: srv.handleASTQuery,
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME()",
+ "language": "cobol",
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "edit_missing_file",
+ handler: func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
+ return srv.handleEdit(ctx, req, false)
+ },
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "operation": "replace",
+ }
+ return req
+ },
+ expectError: true,
+ },
+ {
+ name: "edit_missing_operation",
+ handler: func(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
+ return srv.handleEdit(ctx, req, false)
+ },
+ setupReq: func() mcp.CallToolRequest {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "file": filepath.Join(tmpDir, "test.go"),
+ }
+ return req
+ },
+ expectError: true,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ request := tt.setupReq()
+ result, err := tt.handler(ctx, request)
+
+ // Check for error - MCP tools return errors as nil error with error in result content
+ hasError := err != nil || (result != nil && len(result.Content) > 0)
+
+ if tt.expectError && !hasError {
+ t.Errorf("expected error but got none")
+ }
+ // Note: We don't check for unexpected success because some operations
+ // might legitimately return empty results
+ })
+ }
+}
+
+// TestMCPRequestResponseFlow tests the complete request/response flow.
+func TestMCPRequestResponseFlow(t *testing.T) {
+ tmpDir := t.TempDir()
+
+ // Create test file
+ testFile := filepath.Join(tmpDir, "flow.go")
+ content := `package main
+
+func Add(a, b int) int {
+ return a + b
+}
+`
+ if err := os.WriteFile(testFile, []byte(content), 0o600); err != nil {
+ t.Fatalf("failed to write test file: %v", err)
+ }
+
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ MaxFileSize: config.DefaultMaxFileSize,
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
+ defer cancel()
+
+ // Test sequential operations
+ t.Run("sequential_operations", func(t *testing.T) {
+ // 1. Read file
+ readReq := mcp.CallToolRequest{}
+ readReq.Params.Arguments = map[string]interface{}{
+ "path": testFile,
+ }
+ readResult, err := srv.handleFileRead(ctx, readReq)
+ if err != nil {
+ t.Fatalf("handleFileRead() error = %v", err)
+ }
+ if readResult == nil {
+ t.Fatal("handleFileRead() returned nil")
+ }
+
+ // 2. Query AST
+ queryReq := mcp.CallToolRequest{}
+ queryReq.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME($$$ARGS) int",
+ "language": "go",
+ "paths": []interface{}{tmpDir},
+ }
+ queryResult, err := srv.handleASTQuery(ctx, queryReq)
+ if err != nil {
+ t.Fatalf("handleASTQuery() error = %v", err)
+ }
+ if queryResult == nil {
+ t.Fatal("handleASTQuery() returned nil")
+ }
+
+ // 3. Preview edit
+ editReq := mcp.CallToolRequest{}
+ editReq.Params.Arguments = map[string]interface{}{
+ "file": testFile,
+ "operation": "replace",
+ "selector_kind": "function_declaration",
+ "selector_name": "Add",
+ "new_content": "func Add(a, b int) int {\n\treturn a + b + 1\n}",
+ }
+ editResult, err := srv.handleEditPreview(ctx, editReq)
+ if err != nil {
+ t.Fatalf("handleEditPreview() error = %v", err)
+ }
+ if editResult == nil {
+ t.Fatal("handleEditPreview() returned nil")
+ }
+ })
+}
+
+// TestMCPConcurrentRequests tests handling of concurrent requests.
+func TestMCPConcurrentRequests(t *testing.T) {
+ tmpDir := t.TempDir()
+
+ // Create multiple test files
+ for i := 0; i < 5; i++ {
+ testFile := filepath.Join(tmpDir, "test"+string(rune(i+48))+".go")
+ content := `package main
+
+func Test() {
+ println("test")
+}
+`
+ if err := os.WriteFile(testFile, []byte(content), 0o600); err != nil {
+ t.Fatalf("failed to write test file: %v", err)
+ }
+ }
+
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ MaxFileSize: config.DefaultMaxFileSize,
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ ctx := context.Background()
+
+ // Run multiple concurrent requests
+ const numRequests = 10
+ done := make(chan bool, numRequests)
+ errors := make(chan error, numRequests)
+
+ for i := 0; i < numRequests; i++ {
+ go func(index int) {
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME()",
+ "language": "go",
+ "paths": []interface{}{tmpDir},
+ }
+ _, err := srv.handleASTQuery(ctx, req)
+ if err != nil {
+ errors <- err
+ }
+ done <- true
+ }(i)
+ }
+
+ // Wait for all requests to complete
+ for i := 0; i < numRequests; i++ {
+ <-done
+ }
+
+ // Check for errors
+ close(errors)
+ for err := range errors {
+ t.Errorf("concurrent request failed: %v", err)
+ }
+}
+
+// TestMCPContextCancellation tests handling of context cancellation.
+func TestMCPContextCancellation(t *testing.T) {
+ tmpDir := t.TempDir()
+
+ // Create a large directory structure to ensure operation takes time
+ for i := 0; i < 10; i++ {
+ subdir := filepath.Join(tmpDir, "subdir"+string(rune(i+48)))
+ if err := os.MkdirAll(subdir, 0o755); err != nil {
+ t.Fatalf("failed to create subdir: %v", err)
+ }
+ for j := 0; j < 10; j++ {
+ testFile := filepath.Join(subdir, "test"+string(rune(j+48))+".go")
+ content := `package main
+
+func Test() {
+ println("test")
+}
+`
+ if err := os.WriteFile(testFile, []byte(content), 0o600); err != nil {
+ t.Fatalf("failed to write test file: %v", err)
+ }
+ }
+ }
+
+ cfg := &config.Config{
+ WorkspaceRoot: tmpDir,
+ EnableLSP: false,
+ MaxFileSize: config.DefaultMaxFileSize,
+ }
+ logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: slog.LevelError}))
+
+ srv, err := New(cfg, logger)
+ if err != nil {
+ t.Fatalf("New() error = %v", err)
+ }
+
+ // Create a context with a very short timeout
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond)
+ defer cancel()
+
+ req := mcp.CallToolRequest{}
+ req.Params.Arguments = map[string]interface{}{
+ "pattern": "func $NAME()",
+ "language": "go",
+ "paths": []interface{}{tmpDir},
+ }
+
+ // This should either complete quickly or handle cancellation gracefully
+ _, err = srv.handleASTQuery(ctx, req)
+ // We don't check for specific error as it might complete before timeout
+ // The important thing is it doesn't panic or hang
+ if err != nil {
+ t.Logf("handleASTQuery with cancelled context: %v", err)
+ }
+}
diff --git a/internal/server/server.go b/internal/server/server.go
index 3ec5117..700c8a9 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -2,6 +2,7 @@
package server
import (
+ "bufio"
"context"
"fmt"
"log/slog"
@@ -37,7 +38,7 @@ type Server struct {
// New creates a new MCP server instance.
func New(cfg *config.Config, logger *slog.Logger) (*Server, error) {
- parserRegistry := parser.NewRegistry()
+ parserRegistry := parser.NewRegistryWithSize(cfg.MaxParseSize)
s := &Server{
cfg: cfg,
logger: logger,
@@ -545,7 +546,25 @@ func symbolKindIcon(kind protocol.SymbolKind) string {
}
func splitLines(s string) []string {
- // Use optimized stdlib implementation (2-3x faster than manual loop)
+ // For large files (> 1MB), use bufio.Scanner which is more memory efficient
+ // For smaller files, use simple string split which is faster
+ const largeSizeThreshold = 1024 * 1024 // 1MB
+
+ if len(s) > largeSizeThreshold {
+ // Use scanner for large files
+ scanner := bufio.NewScanner(strings.NewReader(s))
+ var lines []string
+ for scanner.Scan() {
+ lines = append(lines, scanner.Text())
+ }
+ // Handle potential error and add empty line if string ended with newline
+ if len(s) > 0 && s[len(s)-1] == '\n' {
+ lines = append(lines, "")
+ }
+ return lines
+ }
+
+ // Use optimized stdlib implementation for smaller files (2-3x faster than manual loop)
return strings.Split(s, "\n")
}
@@ -596,6 +615,13 @@ func (s *Server) handleASTQuery(ctx context.Context, request mcp.CallToolRequest
}
err := filepath.Walk(searchPath, func(path string, info os.FileInfo, err error) error {
+ // Check for context cancellation
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ }
+
if err != nil {
return nil // Skip files with errors
}
@@ -956,25 +982,58 @@ func (s *Server) handleEdit(ctx context.Context, request mcp.CallToolRequest, ap
// Run starts the MCP server and blocks until shutdown.
func (s *Server) Run(ctx context.Context) error {
// Set up signal handling for graceful shutdown
- _, cancel := context.WithCancel(ctx)
+ ctx, cancel := context.WithCancel(ctx)
defer cancel()
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+ defer signal.Stop(sigChan)
+ // Channel to communicate server errors
+ errChan := make(chan error, 1)
+
+ // Start server in goroutine
go func() {
- sig := <-sigChan
- s.logger.Info("received shutdown signal", "signal", sig)
- cancel()
+ s.logger.Info("starting MCP server",
+ "workspace", s.cfg.WorkspaceRoot,
+ "lsp_enabled", s.cfg.EnableLSP,
+ )
+ errChan <- server.ServeStdio(s.mcp)
}()
- s.logger.Info("starting MCP server",
- "workspace", s.cfg.WorkspaceRoot,
- "lsp_enabled", s.cfg.EnableLSP,
- )
+ // Wait for either signal or server error
+ select {
+ case sig := <-sigChan:
+ s.logger.Info("received shutdown signal", "signal", sig)
- // Start the MCP server with stdio transport
- return server.ServeStdio(s.mcp)
+ // Create timeout context for shutdown
+ shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer shutdownCancel()
+
+ // Call graceful shutdown
+ if err := s.Shutdown(shutdownCtx); err != nil {
+ s.logger.Error("error during shutdown", "error", err)
+ return err
+ }
+
+ s.logger.Info("server shutdown complete")
+ return nil
+
+ case err := <-errChan:
+ // Server stopped on its own
+ return err
+
+ case <-ctx.Done():
+ // Context cancelled externally
+ shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second)
+ defer shutdownCancel()
+
+ if err := s.Shutdown(shutdownCtx); err != nil {
+ s.logger.Error("error during shutdown", "error", err)
+ }
+
+ return ctx.Err()
+ }
}
// Shutdown gracefully shuts down the server.
diff --git a/internal/util/regex_cache.go b/internal/util/regex_cache.go
new file mode 100644
index 0000000..1953737
--- /dev/null
+++ b/internal/util/regex_cache.go
@@ -0,0 +1,41 @@
+// Package util provides shared utility functions and caches.
+package util
+
+import (
+ "regexp"
+ "sync"
+)
+
+// regexCache is a global thread-safe cache for compiled regular expressions.
+// Caching regex compilation provides 10-50x speedup for repeated patterns.
+var regexCache sync.Map // string -> *regexp.Regexp
+
+// CompileRegex compiles a regex pattern with caching for performance.
+// Thread-safe: uses LoadOrStore to prevent race conditions.
+// Returns the compiled regex or an error if the pattern is invalid.
+func CompileRegex(pattern string) (*regexp.Regexp, error) {
+ // Check cache first
+ if cached, ok := regexCache.Load(pattern); ok {
+ return cached.(*regexp.Regexp), nil
+ }
+
+ // Compile regex
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
+ }
+
+ // Try to store - if another goroutine already stored it, use theirs
+ // This prevents race conditions where multiple goroutines compile the same pattern
+ actual, _ := regexCache.LoadOrStore(pattern, re)
+ return actual.(*regexp.Regexp), nil
+}
+
+// ClearRegexCache clears all cached compiled regular expressions.
+// Useful for testing or when memory usage needs to be reduced.
+func ClearRegexCache() {
+ regexCache.Range(func(key, value interface{}) bool {
+ regexCache.Delete(key)
+ return true
+ })
+}