Initial commit
This commit is contained in:
14
.claude-plugin/plugin.json
Normal file
14
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "concat-glob-tool",
|
||||||
|
"description": "concat-glob-tool-plugin",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"author": {
|
||||||
|
"name": "Dennis Vriend"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills"
|
||||||
|
],
|
||||||
|
"commands": [
|
||||||
|
"./commands"
|
||||||
|
]
|
||||||
|
}
|
||||||
39
commands/concat.md
Normal file
39
commands/concat.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
---
|
||||||
|
description: Concatenate files matching glob patterns
|
||||||
|
argument-hint: patterns
|
||||||
|
---
|
||||||
|
|
||||||
|
Concatenate files matching PATTERNS to output file with separators.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
concat-glob-tool PATTERNS... --output-file FILE [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Arguments
|
||||||
|
|
||||||
|
- `PATTERNS...`: Glob patterns (e.g., `*.py`, `src/**/*.md`)
|
||||||
|
- `-o, --output-file FILE`: Output file path (required)
|
||||||
|
- `--separator TEXT`: Separator text (default: `---`)
|
||||||
|
- `-n, --dry-run`: Preview (default, enabled)
|
||||||
|
- `--no-dry-run`: Execute concatenation
|
||||||
|
- `-f, --force`: Overwrite existing file
|
||||||
|
- `-v/-vv/-vvv`: Verbosity (INFO/DEBUG/TRACE)
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Preview concatenation (dry-run)
|
||||||
|
concat-glob-tool '*.py' -o output.txt
|
||||||
|
|
||||||
|
# Execute concatenation
|
||||||
|
concat-glob-tool '*.py' '*.md' -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Custom separator
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator '===' --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Files concatenated with format: `\n---\n# FILENAME\n---\n`
|
||||||
34
commands/help.md
Normal file
34
commands/help.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
description: Show help and examples
|
||||||
|
argument-hint: --help
|
||||||
|
---
|
||||||
|
|
||||||
|
Display help information with examples.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
concat-glob-tool --help
|
||||||
|
concat-glob-tool --version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Show full help
|
||||||
|
concat-glob-tool --help
|
||||||
|
|
||||||
|
# Show version
|
||||||
|
concat-glob-tool --version
|
||||||
|
|
||||||
|
# Verbose help with examples
|
||||||
|
concat-glob-tool --help | less
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Comprehensive help with:
|
||||||
|
- Command syntax
|
||||||
|
- All options and flags
|
||||||
|
- Working examples
|
||||||
|
- Output format description
|
||||||
37
commands/stdin.md
Normal file
37
commands/stdin.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
description: Concatenate files from stdin input
|
||||||
|
argument-hint: --stdin
|
||||||
|
---
|
||||||
|
|
||||||
|
Read file paths from stdin and concatenate them.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
find ... | concat-glob-tool --stdin --output-file FILE [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Arguments
|
||||||
|
|
||||||
|
- `-s, --stdin`: Read paths from stdin (required)
|
||||||
|
- `-o, --output-file FILE`: Output file path (required)
|
||||||
|
- `--separator TEXT`: Separator text (default: `---`)
|
||||||
|
- `--no-dry-run`: Execute concatenation
|
||||||
|
- `-f, --force`: Overwrite existing file
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From find command
|
||||||
|
find . -name '*.py' | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# From fd command
|
||||||
|
fd -e py | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Filtered with grep
|
||||||
|
find . -name '*.py' | grep -v test | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output
|
||||||
|
|
||||||
|
Files concatenated with separators including filenames.
|
||||||
57
plugin.lock.json
Normal file
57
plugin.lock.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:dnvriend/concat-glob-tool:plugins/concat-glob-tool",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "c58f0ec353802d360ccff821e6910d800a509458",
|
||||||
|
"treeHash": "ecf6c6f8c6c3ba660bfc7be43403235996bf24b8d4b625f9d07e47673a07079e",
|
||||||
|
"generatedAt": "2025-11-28T10:16:34.790356Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "concat-glob-tool",
|
||||||
|
"description": "concat-glob-tool-plugin",
|
||||||
|
"version": "0.1.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "05ce2d28a144fe8e8eb8a84dba06e5bf8d49d3ee532eb39f4c6133fde0993cf6"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "7d4b0b56568faf7a03e5bc43489014b2ecb407bae67962218b8fdcc3f5ffd795"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/stdin.md",
|
||||||
|
"sha256": "9ffb3dc65e625be23e6b9043217d0a8e44ee22e5461fe7ed17c1266103023e5c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/help.md",
|
||||||
|
"sha256": "ae52d284cbb7ffbd42ae91e60fe53e7d3d6a7b65a0c361f757779a3c2fcf4106"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "commands/concat.md",
|
||||||
|
"sha256": "c3515b7e69b40e0d273ba4a4de2b0a159f65e77c9c7039179926c4ebd6e4116f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/concat-glob-tool/SKILL.md",
|
||||||
|
"sha256": "c9f75834f045e4c84ab09af8a3a597aca9119b478d55775fe7472bbcb4362977"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "ecf6c6f8c6c3ba660bfc7be43403235996bf24b8d4b625f9d07e47673a07079e"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
494
skills/concat-glob-tool/SKILL.md
Normal file
494
skills/concat-glob-tool/SKILL.md
Normal file
@@ -0,0 +1,494 @@
|
|||||||
|
---
|
||||||
|
name: skill-concat-glob-tool
|
||||||
|
description: File concatenation with glob patterns guide
|
||||||
|
---
|
||||||
|
|
||||||
|
# When to use
|
||||||
|
- Need to concatenate multiple files matching patterns
|
||||||
|
- Creating LLM context files from source code
|
||||||
|
- Merging documentation or configuration files
|
||||||
|
- Building single-file distributions
|
||||||
|
|
||||||
|
# concat-glob-tool Skill
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
Master file concatenation with glob patterns for efficient file merging, documentation bundling, and LLM context generation. This skill covers CLI usage, library integration, and advanced patterns.
|
||||||
|
|
||||||
|
## When to Use This Skill
|
||||||
|
|
||||||
|
**Use this skill when:**
|
||||||
|
- Concatenating files matching glob patterns (*.py, src/**/*.md)
|
||||||
|
- Creating context files for Large Language Models
|
||||||
|
- Merging multiple source files for documentation
|
||||||
|
- Building single-file distributions with separators
|
||||||
|
- Integrating file concatenation into Python scripts
|
||||||
|
|
||||||
|
**Do NOT use this skill for:**
|
||||||
|
- Single file operations (use `cat` or `cp`)
|
||||||
|
- Binary file concatenation (use specialized tools)
|
||||||
|
- Real-time streaming (this is batch processing)
|
||||||
|
|
||||||
|
## CLI Tool: concat-glob-tool
|
||||||
|
|
||||||
|
A production-ready CLI utility that concatenates files matching glob patterns with intelligent separators. Features dry-run mode, stdin support, and both CLI and library modes.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# From source
|
||||||
|
git clone https://github.com/dnvriend/concat-glob-tool.git
|
||||||
|
cd concat-glob-tool
|
||||||
|
uv tool install .
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
concat-glob-tool --version
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Python 3.14+
|
||||||
|
- uv package manager
|
||||||
|
- Access to file system
|
||||||
|
|
||||||
|
### Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Preview (dry-run, default)
|
||||||
|
concat-glob-tool '*.py' -o output.txt
|
||||||
|
|
||||||
|
# Execute
|
||||||
|
concat-glob-tool '*.py' '*.md' -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Stdin mode
|
||||||
|
find . -name '*.py' | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Progressive Disclosure
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>📖 Core Commands (Click to expand)</strong></summary>
|
||||||
|
|
||||||
|
### concat - Concatenate Files with Glob Patterns
|
||||||
|
|
||||||
|
Concatenate files matching glob patterns to a single output file with intelligent separators.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
concat-glob-tool PATTERNS... --output-file FILE [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Arguments:**
|
||||||
|
- `PATTERNS...`: One or more glob patterns (e.g., `*.py`, `src/**/*.md`)
|
||||||
|
- `-o, --output-file FILE`: Output file path (required)
|
||||||
|
- `--separator TEXT`: Separator text between files (default: `---`)
|
||||||
|
- `-n, --dry-run`: Preview without writing (enabled by default)
|
||||||
|
- `--no-dry-run`: Actually execute the concatenation
|
||||||
|
- `-f, --force`: Overwrite existing output file
|
||||||
|
- `-v, --verbose`: Enable verbose output (repeatable: -v, -vv, -vvv)
|
||||||
|
- `--version`: Show version
|
||||||
|
- `--help`: Show help message with examples
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```bash
|
||||||
|
# Basic concatenation - preview mode (dry-run)
|
||||||
|
concat-glob-tool '*.py' -o output.txt
|
||||||
|
|
||||||
|
# Execute concatenation
|
||||||
|
concat-glob-tool '*.py' -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Multiple patterns
|
||||||
|
concat-glob-tool '*.py' '*.md' '*.txt' -o combined.txt --no-dry-run
|
||||||
|
|
||||||
|
# Recursive patterns
|
||||||
|
concat-glob-tool 'src/**/*.py' -o all-code.txt --no-dry-run
|
||||||
|
|
||||||
|
# Multiple recursive patterns
|
||||||
|
concat-glob-tool 'src/**/*.py' 'tests/**/*.py' -o codebase.txt --no-dry-run
|
||||||
|
|
||||||
|
# Custom separator
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator '===' --no-dry-run
|
||||||
|
|
||||||
|
# Force overwrite existing file
|
||||||
|
concat-glob-tool '*.py' -o existing.txt --force --no-dry-run
|
||||||
|
|
||||||
|
# Verbose output
|
||||||
|
concat-glob-tool '*.py' -o output.txt -vv --no-dry-run
|
||||||
|
|
||||||
|
# LLM context generation
|
||||||
|
concat-glob-tool 'src/**/*.py' 'tests/**/*.py' '*.md' \
|
||||||
|
-o llm-context.txt \
|
||||||
|
--separator '---' \
|
||||||
|
--no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output Format:**
|
||||||
|
Files are concatenated with this separator format between each file:
|
||||||
|
```
|
||||||
|
---
|
||||||
|
# /path/to/file.py
|
||||||
|
---
|
||||||
|
[file contents]
|
||||||
|
```
|
||||||
|
|
||||||
|
The separator includes:
|
||||||
|
- Blank line before separator
|
||||||
|
- Separator line (configurable, default: `---`)
|
||||||
|
- Comment line with full file path
|
||||||
|
- Separator line
|
||||||
|
- Blank line before file contents
|
||||||
|
|
||||||
|
**Dry-Run Mode (Default):**
|
||||||
|
By default, the tool runs in preview mode showing:
|
||||||
|
- Number of files that would be concatenated
|
||||||
|
- List of files to process
|
||||||
|
- Separator format
|
||||||
|
- Reminder to use `--no-dry-run` to execute
|
||||||
|
|
||||||
|
This prevents accidental overwrites and lets you verify operations first.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### stdin - Concatenate from Stdin
|
||||||
|
|
||||||
|
Read file paths from stdin and concatenate them. Useful for integration with `find`, `fd`, `grep`, and other tools.
|
||||||
|
|
||||||
|
**Usage:**
|
||||||
|
```bash
|
||||||
|
find ... | concat-glob-tool --stdin --output-file FILE [OPTIONS]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Arguments:**
|
||||||
|
- `-s, --stdin`: Read file paths from stdin (one per line)
|
||||||
|
- `-o, --output-file FILE`: Output file path (required)
|
||||||
|
- `--separator TEXT`: Separator text (default: `---`)
|
||||||
|
- `--no-dry-run`: Execute the concatenation
|
||||||
|
- `-f, --force`: Overwrite existing output file
|
||||||
|
- `-v, --verbose`: Verbose output
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```bash
|
||||||
|
# From find command
|
||||||
|
find . -name '*.py' -type f | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# From fd (faster find alternative)
|
||||||
|
fd -e py | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Filter with grep
|
||||||
|
find . -name '*.py' | grep -v test | concat-glob-tool --stdin -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Complex pipeline
|
||||||
|
find . -name '*.py' -type f | \
|
||||||
|
grep -v __pycache__ | \
|
||||||
|
grep -v .venv | \
|
||||||
|
concat-glob-tool --stdin -o filtered.txt --no-dry-run
|
||||||
|
|
||||||
|
# With custom separator
|
||||||
|
find . -name '*.md' | concat-glob-tool --stdin -o docs.txt --separator '===' --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
- Cannot use both `--stdin` and glob patterns in the same command
|
||||||
|
- Each line from stdin should be a valid file path
|
||||||
|
- Invalid paths will cause clear error messages with solutions
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>⚙️ Advanced Features (Click to expand)</strong></summary>
|
||||||
|
|
||||||
|
### Environment Variable Expansion
|
||||||
|
|
||||||
|
Glob patterns support environment variable expansion and home directory shortcuts.
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```bash
|
||||||
|
# Home directory expansion
|
||||||
|
concat-glob-tool '~/projects/*.py' -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
concat-glob-tool '$HOME/src/**/*.py' -o output.txt --no-dry-run
|
||||||
|
|
||||||
|
# Mixed
|
||||||
|
concat-glob-tool '~/.config/*.conf' '$PROJECT_DIR/**/*.md' -o output.txt --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Library Integration
|
||||||
|
|
||||||
|
Use concat-glob-tool as a Python library for programmatic integration.
|
||||||
|
|
||||||
|
**Installation:**
|
||||||
|
```bash
|
||||||
|
pip install concat-glob-tool
|
||||||
|
# or
|
||||||
|
uv add concat-glob-tool
|
||||||
|
```
|
||||||
|
|
||||||
|
**Core API:**
|
||||||
|
```python
|
||||||
|
from concat_glob_tool import (
|
||||||
|
expand_glob_patterns,
|
||||||
|
concatenate_files,
|
||||||
|
format_separator,
|
||||||
|
ConcatError,
|
||||||
|
NoMatchesError,
|
||||||
|
OutputExistsError,
|
||||||
|
)
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Expand glob patterns
|
||||||
|
files = expand_glob_patterns(["*.py", "src/**/*.md"])
|
||||||
|
print(f"Found {len(files)} files")
|
||||||
|
|
||||||
|
# Concatenate files
|
||||||
|
result = concatenate_files(
|
||||||
|
files=files,
|
||||||
|
output_file=Path("output.txt"),
|
||||||
|
separator="---",
|
||||||
|
force=False,
|
||||||
|
dry_run=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"Concatenated {result['files_count']} files")
|
||||||
|
print(f"Wrote {result['bytes_written']} bytes to {result['output_file']}")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Exception Handling:**
|
||||||
|
```python
|
||||||
|
from pathlib import Path
|
||||||
|
from concat_glob_tool import (
|
||||||
|
concatenate_files,
|
||||||
|
expand_glob_patterns,
|
||||||
|
NoMatchesError,
|
||||||
|
OutputExistsError,
|
||||||
|
ConcatError,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
files = expand_glob_patterns(["*.py"])
|
||||||
|
result = concatenate_files(
|
||||||
|
files=files,
|
||||||
|
output_file=Path("output.txt"),
|
||||||
|
force=False,
|
||||||
|
dry_run=False,
|
||||||
|
)
|
||||||
|
print(f"Success: {result}")
|
||||||
|
|
||||||
|
except NoMatchesError as e:
|
||||||
|
print(f"No files found: {e}")
|
||||||
|
except OutputExistsError as e:
|
||||||
|
print(f"Output exists: {e}")
|
||||||
|
except ConcatError as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
```
|
||||||
|
|
||||||
|
**Integration Example:**
|
||||||
|
```python
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Example: Concatenate Python files with custom logic."""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from concat_glob_tool import expand_glob_patterns, concatenate_files
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Find all Python files
|
||||||
|
files = expand_glob_patterns(["src/**/*.py", "tests/**/*.py"])
|
||||||
|
|
||||||
|
# Filter files (e.g., exclude __init__.py)
|
||||||
|
filtered_files = [f for f in files if f.name != "__init__.py"]
|
||||||
|
|
||||||
|
# Concatenate
|
||||||
|
result = concatenate_files(
|
||||||
|
files=filtered_files,
|
||||||
|
output_file=Path("codebase.txt"),
|
||||||
|
separator="===",
|
||||||
|
force=True,
|
||||||
|
dry_run=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"✅ Concatenated {result['files_count']} files")
|
||||||
|
print(f"📝 Output: {result['output_file']}")
|
||||||
|
print(f"💾 Size: {result['bytes_written']} bytes")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Custom Separators
|
||||||
|
|
||||||
|
Customize the separator text while maintaining the format structure.
|
||||||
|
|
||||||
|
**Examples:**
|
||||||
|
```bash
|
||||||
|
# Simple separator
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator '---' --no-dry-run
|
||||||
|
|
||||||
|
# Equals signs
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator '===' --no-dry-run
|
||||||
|
|
||||||
|
# Hash separator
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator '###' --no-dry-run
|
||||||
|
|
||||||
|
# Custom text
|
||||||
|
concat-glob-tool '*.py' -o output.txt --separator 'FILE' --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
**Separator Format:**
|
||||||
|
The separator structure is always: `\n{separator}\n# {filename}\n{separator}\n`
|
||||||
|
|
||||||
|
Example with `--separator '==='`:
|
||||||
|
```
|
||||||
|
===
|
||||||
|
# /path/to/file.py
|
||||||
|
===
|
||||||
|
[file contents]
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary><strong>🔧 Troubleshooting (Click to expand)</strong></summary>
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**Issue: No files matched the patterns**
|
||||||
|
```bash
|
||||||
|
$ concat-glob-tool '*.nonexistent' -o out.txt --no-dry-run
|
||||||
|
Error: No files matched the patterns: *.nonexistent
|
||||||
|
|
||||||
|
Solution: Verify glob patterns are correct. Examples:
|
||||||
|
- '*.py' for Python files in current directory
|
||||||
|
- '**/*.py' for Python files recursively
|
||||||
|
- 'src/**/*.{py,md}' for multiple extensions
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- Check glob pattern syntax
|
||||||
|
- Verify files exist in specified locations
|
||||||
|
- Use `--verbose` to see detailed logging
|
||||||
|
- Test pattern with `ls` first: `ls *.py`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Issue: Output file already exists**
|
||||||
|
```bash
|
||||||
|
$ concat-glob-tool '*.py' -o existing.txt --no-dry-run
|
||||||
|
Error: Output file already exists: existing.txt
|
||||||
|
|
||||||
|
Solution: Use --force to overwrite or choose a different output file.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- Use `--force` flag to overwrite: `concat-glob-tool '*.py' -o existing.txt --force --no-dry-run`
|
||||||
|
- Choose different output filename
|
||||||
|
- Remove existing file first
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Issue: Cannot use both --stdin and glob patterns**
|
||||||
|
```bash
|
||||||
|
$ concat-glob-tool '*.py' --stdin -o out.txt
|
||||||
|
Error: Cannot use both --stdin and glob patterns.
|
||||||
|
|
||||||
|
Solution: Use either --stdin OR provide glob patterns, not both.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- Use glob patterns: `concat-glob-tool '*.py' -o out.txt --no-dry-run`
|
||||||
|
- OR use stdin: `find . -name '*.py' | concat-glob-tool --stdin -o out.txt --no-dry-run`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Issue: Forgot --no-dry-run flag**
|
||||||
|
```bash
|
||||||
|
$ concat-glob-tool '*.py' -o output.txt
|
||||||
|
[DRY-RUN] Would concatenate 10 files to: output.txt
|
||||||
|
...
|
||||||
|
To execute, add --no-dry-run flag.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- This is expected behavior (dry-run is default)
|
||||||
|
- Add `--no-dry-run` to actually execute
|
||||||
|
- Dry-run mode prevents accidental overwrites
|
||||||
|
|
||||||
|
### Getting Help
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Full help with examples
|
||||||
|
concat-glob-tool --help
|
||||||
|
|
||||||
|
# Version information
|
||||||
|
concat-glob-tool --version
|
||||||
|
|
||||||
|
# Verbose output for debugging
|
||||||
|
concat-glob-tool '*.py' -o output.txt -vv --no-dry-run
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verbose Logging Levels
|
||||||
|
|
||||||
|
- No flag (default): WARNING only
|
||||||
|
- `-v`: INFO level (operations and progress)
|
||||||
|
- `-vv`: DEBUG level (detailed information)
|
||||||
|
- `-vvv`: TRACE level (library internals)
|
||||||
|
|
||||||
|
All logs go to stderr, keeping stdout clean for piping.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Exit Codes
|
||||||
|
|
||||||
|
- `0`: Success
|
||||||
|
- `1`: Error (NoMatchesError, OutputExistsError, ConcatError, validation errors)
|
||||||
|
|
||||||
|
## Output Formats
|
||||||
|
|
||||||
|
**Separator Format:**
|
||||||
|
```
|
||||||
|
\n---\n# /path/to/filename\n---\n
|
||||||
|
```
|
||||||
|
|
||||||
|
Components:
|
||||||
|
- Blank line before separator
|
||||||
|
- Separator line (customizable via `--separator`)
|
||||||
|
- Comment line with full file path
|
||||||
|
- Separator line
|
||||||
|
- Blank line before file contents
|
||||||
|
|
||||||
|
**Dry-Run Output:**
|
||||||
|
- Number of files to concatenate
|
||||||
|
- List of file paths
|
||||||
|
- Separator format preview
|
||||||
|
- Instructions to execute
|
||||||
|
|
||||||
|
**Execution Output:**
|
||||||
|
```
|
||||||
|
Successfully concatenated 10 files to output.txt (52482 bytes)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Always Preview First**: Use default dry-run mode to verify operations before executing with `--no-dry-run`
|
||||||
|
|
||||||
|
2. **Use Descriptive Output Names**: Name output files clearly indicating contents (e.g., `llm-context.txt`, `all-python-code.txt`)
|
||||||
|
|
||||||
|
3. **Leverage Verbose Mode**: Use `-v` or `-vv` when troubleshooting or learning the tool's behavior
|
||||||
|
|
||||||
|
4. **Quote Glob Patterns**: Always quote patterns in shell to prevent premature expansion: `'*.py'` not `*.py`
|
||||||
|
|
||||||
|
5. **Test Patterns with ls**: Verify glob patterns work with `ls` before using in concat-glob-tool
|
||||||
|
|
||||||
|
6. **Use stdin for Complex Filtering**: Combine with `find`, `fd`, `grep` for advanced file selection
|
||||||
|
|
||||||
|
7. **Custom Separators for Context**: Use meaningful separators when creating context files for specific purposes
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- **GitHub**: https://github.com/dnvriend/concat-glob-tool
|
||||||
|
- **Documentation**: README.md in repository
|
||||||
|
- **Python Package**: Available via pip/uv
|
||||||
|
- **License**: MIT
|
||||||
Reference in New Issue
Block a user