# 🗂️ prepdir
[](https://github.com/eyecantell/prepdir/actions/runs/17572447827)
[](https://badge.fury.io/py/prepdir)
[](https://www.python.org/downloads/)
[](https://pepy.tech/project/prepdir)
[](https://opensource.org/licenses/MIT)
A lightweight directory traversal utility designed to prepare project contents for AI code review and analysis. Quickly gather all your project files into a single, well-formatted document that's perfect for sharing with AI assistants.
## 🚀 Quick Start
Get up and running in 30 seconds:
```bash
# Install
pip install prepdir
# Navigate to your project
cd /path/to/your/project
# Generate a file with all your code
prepdir
# Share prepped_dir.txt with your AI assistant
```
That's it! You now have a `prepped_dir.txt` file containing all your project files with clear delimiters, ready for AI review.
### Python Integration
```python
from prepdir import run
# Generate content for Python files
outputs = run(directory="/path/to/project", extensions=["py"])
for output in outputs:
    print(output.content)  # Use the content directly
```
## 🎯 Why Use prepdir?
**Save hours of manual work** when sharing code with AI assistants:
- ✅ **Instant Context**: Combines all relevant files into one structured document
- ✅ **Smart Filtering**: Automatically excludes cache files, build artifacts, and other noise
- ✅ **Privacy Protection**: Scrubs UUIDs and sensitive identifiers by default
- ✅ **AI-Optimized**: Uses clear separators and formatting that AI models love
- ✅ **Flexible**: CLI tool + Python library for any workflow
## 📦 Installation
```bash
pip install prepdir
```
**Alternative methods:**
```bash
# From GitHub
pip install git+https://github.com/eyecantell/prepdir.git
# Development install
git clone https://github.com/eyecantell/prepdir.git
cd prepdir
pip install -e .
```
## 💡 Usage Examples
### Command Line Interface
```bash
# Basic usage - all files
prepdir
# Only Python files
prepdir -e py
# Multiple file types
prepdir -e py js html css
# Custom output file
prepdir -o my_review.txt
# Specific directory
prepdir /path/to/project
# Include everything (ignore exclusions)
prepdir --all
# Disable UUID scrubbing
prepdir --no-scrub-uuids
# Split output if over 1M characters (useful for large projects)
prepdir -m 1000000
# Initialize default configuration
prepdir --init
```
### Programmatic Use
Use `prepdir` as a library to process directories programmatically:
```python
from prepdir import run, PrepdirOutputFile, PrepdirProcessor
# Run and get PrepdirOutputFile objects
outputs: List[PrepdirOutputFile] = run(directory="my_project", extensions=["py", "md"], use_unique_placeholders=True, max_chars=1000000)
# Access processed files
for output in outputs:
    for abs_path, file_entry in output.files.items():
        print(f"File: {file_entry.relative_path}, Content: {file_entry.content}")
# Save to files
for output in outputs:
    output.save(output.path)
```
### Sample Output
```plaintext
File listing generated 2025-09-08T12:00:00.000000 by prepdir version 0.18.0
Base directory is '/path/to/project'
Note: Valid (hyphenated) UUIDs in file contents will be scrubbed and replaced with '00000000-0000-0000-0000-000000000000'.
Note: Valid hyphen-less UUIDs in file contents will be scrubbed and replaced with '00000000000000000000000000000000'.
=-=-=-=-=-=-=-= Begin File: 'src/main.py' =-=-=-=-=-=-=-=
print("Hello, World!")
=-=-=-=-=-=-=-= End File: 'src/main.py' =-=-=-=-=-=-=-=
=-=-=-=-=-=-=-= Begin File: 'README.md' =-=-=-=-=-=-=-=
# My Project
This is a sample project.
=-=-=-=-=-=-=-= End File: 'README.md' =-=-=-=-=-=-=-=
```
For large outputs with `--max-chars`, files are split (e.g., `prepped_dir_part1of3.txt`, `prepped_dir_part2of3.txt`, etc.), each with a "Part X of Y" note.
## 🔍 Common Use Cases
### 1. **Code Review with AI**
```bash
prepdir -e py -o code_review.txt
# Ask AI: "Review my Python code for bugs and improvements"
```
### 2. **Debugging Help**
```bash
prepdir -e py log -o debug_context.txt
# Ask AI: "Help me debug errors in these logs and Python files"
```
### 3. **Documentation Generation**
```bash
prepdir -e py md rst -o docs_context.txt
# Ask AI: "Generate detailed documentation for this project"
```
### 4. **Architecture Analysis**
```bash
prepdir -e py js ts -o architecture.txt -m 1000000
# Ask AI: "Analyze the architecture and suggest improvements"
```
## ⚙️ Configuration
### Configuration Files
prepdir looks for configuration in this order:
1. Custom config (via `--config`)
2. Local: `.prepdir/config.yaml`
3. Global: `~/.prepdir/config.yaml`
4. Built-in defaults
### Create Configuration
```bash
# Initialize local config at .prepdir/config.yaml
prepdir --init
# Or create manually
mkdir .prepdir
cat > .prepdir/config.yaml << EOF
# Configuration file for prepdir
EXCLUDE:
  DIRECTORIES:
    - __pycache__
    - .applydir
    - .cache
    - .eggs
    - .git
    - .idea
    - .mypy_cache
    - .pdm-build
    - .prepdir
    - .pytest_cache
    - .ruff_cache
    - .tox
    - .venv
    - .vibedir
    - '*.egg-info'
    - build
    - dist
    - node_modules
    - venv
  FILES:
    - .gitignore
    - .prepdir/config.yaml
    - ~/.prepdir/config.yaml
    - LICENSE
    - .DS_Store
    - Thumbs.db
    - .env
    - .env.production
    - .coverage
    - coverage.xml
    - .pdm-python
    - pdm.lock
    - "*.pyc"
    - "*.pyo"
    - "*.log"
    - "*.bak"
    - "*.swp"
    - "**/*.log"
SCRUB_HYPHENATED_UUIDS: true
SCRUB_HYPHENLESS_UUIDS: true
REPLACEMENT_UUID: "00000000-0000-0000-0000-000000000000"
DEFAULT_EXTENSIONS: []
DEFAULT_OUTPUT_FILE: "prepped_dir.txt"
USE_UNIQUE_PLACEHOLDERS: false
INCLUDE_PREPDIR_FILES: false
MAX_CHARS:  # Maximum characters per output file (optional, default: unlimited)
EOF
```
### Default Exclusions
- **Version control**: `.git`
- **Cache files**: `__pycache__`, `.cache`, `.mypy_cache`, `.pytest_cache`, `.ruff_cache`
- **Build artifacts**: `build`, `dist`, `*.egg-info`, `.pdm-build`
- **IDE files**: `.idea`
- **Virtual environments**: `.venv`, `venv`
- **Dependencies**: `node_modules`
- **Configuration**: `.applydir`, `.prepdir`, `.vibedir`, `.tox`
- **Temporary files**: `*.pyc`, `*.pyo`, `*.log`, `*.bak`, `*.swp`, `**/*.log`
- **System files**: `.DS_Store`, `Thumbs.db`
- **Project files**: `.gitignore`, `.env`, `.env.production`, `.coverage`, `coverage.xml`, `.pdm-python`, `pdm.lock`, `LICENSE`, `.prepdir/config.yaml`, `~/.prepdir/config.yaml`
- **prepdir outputs**: `prepped_dir.txt` (unless `--include-prepdir-files`)
## 🔒 Privacy & Security
### UUID Scrubbing
By default, prepdir protects your privacy by replacing UUIDs with placeholder values:
```python
# Original
user_id = "123e4567-e89b-12d3-a456-426614174000"
# After scrubbing  
user_id = "00000000-0000-0000-0000-000000000000"
```
**Control UUID scrubbing:**
- CLI: `--no-scrub-uuids`, `--no-scrub-hyphenated-uuids`, `--no-scrub-hyphenless-uuids`, or `--replacement-uuid <uuid>`
- Python: `scrub_hyphenated_uuids=False`, `scrub_hyphenless_uuids=False`, or `replacement_uuid="custom-uuid"`
- Config: Set `SCRUB_HYPHENATED_UUIDS: false`, `SCRUB_HYPHENLESS_UUIDS: false`, or `REPLACEMENT_UUID: "custom-uuid"`
### Unique Placeholders
Generate unique placeholders for each UUID to maintain relationships:
```python
from prepdir import run
outputs = run(directory="/path/to/project", use_unique_placeholders=True)
for output in outputs:
    print("UUID Mapping:", output.uuid_mapping)
# Output: {'PREPDIR_UUID_PLACEHOLDER_1': 'original-uuid-1', ...}
```
## 🔧 Advanced Features
### Command Line Options
```bash
prepdir --help
# Key options:
-e, --extensions          File extensions to include
-o, --output              Output file name
-m, --max-chars           Maximum characters per output file; split into parts if exceeded
--init                    Initialize local config at .prepdir/config.yaml
--config                  Custom config file
--force                   Overwrite existing config file with --init
--all                     Include all files (ignore exclusions)
--include-prepdir-files   Include prepdir-generated files (e.g., prepped_dir.txt)
--no-scrub-uuids          Disable all UUID scrubbing
--no-scrub-hyphenated-uuids  Disable hyphenated UUID scrubbing
--no-scrub-hyphenless-uuids  Disable hyphen-less UUID scrubbing
--replacement-uuid        Custom replacement UUID
--use-unique-placeholders Replace UUIDs with unique placeholders
-v, --verbose             Verbose output
-q, --quiet               Suppress user-facing output
```
### Python API Reference
```python
from prepdir import run, PrepdirProcessor
# Full API
outputs = run(
    directory="/path/to/project",           # Target directory
    extensions=["py", "js"],                # File extensions
    specific_files=["file1.py"],            # Specific files
    output_file="output.txt",               # Save to file
    config_path="custom.yaml",              # Custom config
    scrub_hyphenated_uuids=True,            # Scrub hyphenated UUIDs
    scrub_hyphenless_uuids=True,            # Scrub hyphenless UUIDs
    replacement_uuid="custom-uuid",         # Custom replacement
    use_unique_placeholders=False,          # Unique placeholders
    ignore_exclusions=False,                # Ignore exclusions
    include_prepdir_files=False,            # Include prepdir outputs
    quiet=False,                           # Suppress output
    max_chars=1000000                      # Max chars per file; split if exceeded
)
# Validate output
processor = PrepdirProcessor(directory="/path/to/project")
output = processor.validate_output(file_path="output.txt")
# Returns: PrepdirOutputFile object
```
## 📊 Logging & Debugging
Control verbosity with environment variables:
```bash
LOGLEVEL=DEBUG prepdir -v
```
Valid levels: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`
## 📈 What's New
### Version 0.18.0 (Latest)
- Added `--max-chars` option to split large outputs into multiple files for handling bigger projects.
- Fixed UUID scrubbing configuration not being respected when no CLI flags are provided.
- Updated Python `run()` API to return a list of `PrepdirOutputFile` objects to support split outputs.
- Enhanced test coverage, including new traversal tests.
- Minor development environment updates (e.g., `pdm install --dev`).
### Version 0.17.2
- Fixed issue that caused running verbose to be no change. 
### Version 0.17.1
- Fixed issue that caused error when running `prepdir --init`
### Version 0.17.0
- Improved performance and recursive glob handling
[View complete changelog](docs/CHANGELOG.md)
## 🤔 FAQ
<details>
<summary><strong>Q: What project sizes can prepdir handle?</strong></summary>
A: Effective for small to moderate projects (thousands of files). Use file extension filters and `--max-chars` to split outputs for larger projects or LLM token limits.
</details>
<details>
<summary><strong>Q: Why are my prepdir output files missing?</strong></summary>
A: prepdir excludes its own generated files (e.g., `prepped_dir.txt`) by default. Use `--include-prepdir-files` to include them.
</details>
<details>
<summary><strong>Q: Why are UUIDs replaced in my output?</strong></summary>
A: Privacy protection! prepdir scrubs UUIDs by default (configurable via CLI or config.yaml). Use `--no-scrub-uuids` or configure .prepdir/config.yaml (with prepdir --init and setting SCRUB_HYPHENATED_UUIDS and/or SCRUB_HYPHENLESS_UUIDS to false) to disable.
</details>
<details>
<summary><strong>Q: Can I use prepdir with non-code files?</strong></summary>
A: Yes! It works with any text files. Use `-e txt md` for specific types.
</details>
<details>
<summary><strong>Q: How do I upgrade from older versions?</strong></summary>
A: Configuration files are now loaded from `.prepdir/config.yaml` (local) or `~/.prepdir/config.yaml` (global) by default. Most upgrades are seamless.
</details>
## 🛠️ Development
```bash
git clone https://github.com/eyecantell/prepdir.git
cd prepdir
pdm install --dev     # Install dependencies with dev extras
pdm run prepdir      # Run development version
pdm run pytest       # Run tests
pdm publish          # Publish to PyPI
```
## 📄 License
MIT License - see [LICENSE](LICENSE) for details.
---
**Love prepdir?** Give it a ⭐ on [GitHub](https://github.com/eyecantell/prepdir)!
            
         
        Raw data
        
            {
    "_id": null,
    "home_page": null,
    "name": "prepdir",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "ai, artificial intelligence, code review, directory traversal, file content, project documentation, code sharing, developer tools, large language models, llm, project structure",
    "author": null,
    "author_email": "eyecantell <paul@pneuma.solutions>",
    "download_url": "https://files.pythonhosted.org/packages/ca/26/e17aebda32977f4cc5504406f1ad021c9534b26a56fa186baf8e6e741e3b/prepdir-0.18.0.tar.gz",
    "platform": null,
    "description": "# \ud83d\uddc2\ufe0f prepdir\n\n[](https://github.com/eyecantell/prepdir/actions/runs/17572447827)\n[](https://badge.fury.io/py/prepdir)\n[](https://www.python.org/downloads/)\n[](https://pepy.tech/project/prepdir)\n[](https://opensource.org/licenses/MIT)\n\nA lightweight directory traversal utility designed to prepare project contents for AI code review and analysis. Quickly gather all your project files into a single, well-formatted document that's perfect for sharing with AI assistants.\n\n## \ud83d\ude80 Quick Start\n\nGet up and running in 30 seconds:\n\n```bash\n# Install\npip install prepdir\n\n# Navigate to your project\ncd /path/to/your/project\n\n# Generate a file with all your code\nprepdir\n\n# Share prepped_dir.txt with your AI assistant\n```\n\nThat's it! You now have a `prepped_dir.txt` file containing all your project files with clear delimiters, ready for AI review.\n\n### Python Integration\n```python\nfrom prepdir import run\n\n# Generate content for Python files\noutputs = run(directory=\"/path/to/project\", extensions=[\"py\"])\nfor output in outputs:\n    print(output.content)  # Use the content directly\n```\n\n## \ud83c\udfaf Why Use prepdir?\n\n**Save hours of manual work** when sharing code with AI assistants:\n- \u2705 **Instant Context**: Combines all relevant files into one structured document\n- \u2705 **Smart Filtering**: Automatically excludes cache files, build artifacts, and other noise\n- \u2705 **Privacy Protection**: Scrubs UUIDs and sensitive identifiers by default\n- \u2705 **AI-Optimized**: Uses clear separators and formatting that AI models love\n- \u2705 **Flexible**: CLI tool + Python library for any workflow\n\n## \ud83d\udce6 Installation\n\n```bash\npip install prepdir\n```\n\n**Alternative methods:**\n```bash\n# From GitHub\npip install git+https://github.com/eyecantell/prepdir.git\n\n# Development install\ngit clone https://github.com/eyecantell/prepdir.git\ncd prepdir\npip install -e .\n```\n\n## \ud83d\udca1 Usage Examples\n\n### Command Line Interface\n\n```bash\n# Basic usage - all files\nprepdir\n\n# Only Python files\nprepdir -e py\n\n# Multiple file types\nprepdir -e py js html css\n\n# Custom output file\nprepdir -o my_review.txt\n\n# Specific directory\nprepdir /path/to/project\n\n# Include everything (ignore exclusions)\nprepdir --all\n\n# Disable UUID scrubbing\nprepdir --no-scrub-uuids\n\n# Split output if over 1M characters (useful for large projects)\nprepdir -m 1000000\n\n# Initialize default configuration\nprepdir --init\n```\n\n### Programmatic Use\n\nUse `prepdir` as a library to process directories programmatically:\n\n```python\nfrom prepdir import run, PrepdirOutputFile, PrepdirProcessor\n\n# Run and get PrepdirOutputFile objects\noutputs: List[PrepdirOutputFile] = run(directory=\"my_project\", extensions=[\"py\", \"md\"], use_unique_placeholders=True, max_chars=1000000)\n\n# Access processed files\nfor output in outputs:\n    for abs_path, file_entry in output.files.items():\n        print(f\"File: {file_entry.relative_path}, Content: {file_entry.content}\")\n\n# Save to files\nfor output in outputs:\n    output.save(output.path)\n```\n\n### Sample Output\n\n```plaintext\nFile listing generated 2025-09-08T12:00:00.000000 by prepdir version 0.18.0\nBase directory is '/path/to/project'\nNote: Valid (hyphenated) UUIDs in file contents will be scrubbed and replaced with '00000000-0000-0000-0000-000000000000'.\nNote: Valid hyphen-less UUIDs in file contents will be scrubbed and replaced with '00000000000000000000000000000000'.\n=-=-=-=-=-=-=-= Begin File: 'src/main.py' =-=-=-=-=-=-=-=\nprint(\"Hello, World!\")\n=-=-=-=-=-=-=-= End File: 'src/main.py' =-=-=-=-=-=-=-=\n=-=-=-=-=-=-=-= Begin File: 'README.md' =-=-=-=-=-=-=-=\n# My Project\nThis is a sample project.\n=-=-=-=-=-=-=-= End File: 'README.md' =-=-=-=-=-=-=-=\n```\n\nFor large outputs with `--max-chars`, files are split (e.g., `prepped_dir_part1of3.txt`, `prepped_dir_part2of3.txt`, etc.), each with a \"Part X of Y\" note.\n\n## \ud83d\udd0d Common Use Cases\n\n### 1. **Code Review with AI**\n```bash\nprepdir -e py -o code_review.txt\n# Ask AI: \"Review my Python code for bugs and improvements\"\n```\n\n### 2. **Debugging Help**\n```bash\nprepdir -e py log -o debug_context.txt\n# Ask AI: \"Help me debug errors in these logs and Python files\"\n```\n\n### 3. **Documentation Generation**\n```bash\nprepdir -e py md rst -o docs_context.txt\n# Ask AI: \"Generate detailed documentation for this project\"\n```\n\n### 4. **Architecture Analysis**\n```bash\nprepdir -e py js ts -o architecture.txt -m 1000000\n# Ask AI: \"Analyze the architecture and suggest improvements\"\n```\n\n## \u2699\ufe0f Configuration\n\n### Configuration Files\nprepdir looks for configuration in this order:\n1. Custom config (via `--config`)\n2. Local: `.prepdir/config.yaml`\n3. Global: `~/.prepdir/config.yaml`\n4. Built-in defaults\n\n### Create Configuration\n```bash\n# Initialize local config at .prepdir/config.yaml\nprepdir --init\n\n# Or create manually\nmkdir .prepdir\ncat > .prepdir/config.yaml << EOF\n# Configuration file for prepdir\nEXCLUDE:\n  DIRECTORIES:\n    - __pycache__\n    - .applydir\n    - .cache\n    - .eggs\n    - .git\n    - .idea\n    - .mypy_cache\n    - .pdm-build\n    - .prepdir\n    - .pytest_cache\n    - .ruff_cache\n    - .tox\n    - .venv\n    - .vibedir\n    - '*.egg-info'\n    - build\n    - dist\n    - node_modules\n    - venv\n  FILES:\n    - .gitignore\n    - .prepdir/config.yaml\n    - ~/.prepdir/config.yaml\n    - LICENSE\n    - .DS_Store\n    - Thumbs.db\n    - .env\n    - .env.production\n    - .coverage\n    - coverage.xml\n    - .pdm-python\n    - pdm.lock\n    - \"*.pyc\"\n    - \"*.pyo\"\n    - \"*.log\"\n    - \"*.bak\"\n    - \"*.swp\"\n    - \"**/*.log\"\nSCRUB_HYPHENATED_UUIDS: true\nSCRUB_HYPHENLESS_UUIDS: true\nREPLACEMENT_UUID: \"00000000-0000-0000-0000-000000000000\"\nDEFAULT_EXTENSIONS: []\nDEFAULT_OUTPUT_FILE: \"prepped_dir.txt\"\nUSE_UNIQUE_PLACEHOLDERS: false\nINCLUDE_PREPDIR_FILES: false\nMAX_CHARS:  # Maximum characters per output file (optional, default: unlimited)\nEOF\n```\n\n### Default Exclusions\n- **Version control**: `.git`\n- **Cache files**: `__pycache__`, `.cache`, `.mypy_cache`, `.pytest_cache`, `.ruff_cache`\n- **Build artifacts**: `build`, `dist`, `*.egg-info`, `.pdm-build`\n- **IDE files**: `.idea`\n- **Virtual environments**: `.venv`, `venv`\n- **Dependencies**: `node_modules`\n- **Configuration**: `.applydir`, `.prepdir`, `.vibedir`, `.tox`\n- **Temporary files**: `*.pyc`, `*.pyo`, `*.log`, `*.bak`, `*.swp`, `**/*.log`\n- **System files**: `.DS_Store`, `Thumbs.db`\n- **Project files**: `.gitignore`, `.env`, `.env.production`, `.coverage`, `coverage.xml`, `.pdm-python`, `pdm.lock`, `LICENSE`, `.prepdir/config.yaml`, `~/.prepdir/config.yaml`\n- **prepdir outputs**: `prepped_dir.txt` (unless `--include-prepdir-files`)\n\n## \ud83d\udd12 Privacy & Security\n\n### UUID Scrubbing\nBy default, prepdir protects your privacy by replacing UUIDs with placeholder values:\n\n```python\n# Original\nuser_id = \"123e4567-e89b-12d3-a456-426614174000\"\n\n# After scrubbing  \nuser_id = \"00000000-0000-0000-0000-000000000000\"\n```\n\n**Control UUID scrubbing:**\n- CLI: `--no-scrub-uuids`, `--no-scrub-hyphenated-uuids`, `--no-scrub-hyphenless-uuids`, or `--replacement-uuid <uuid>`\n- Python: `scrub_hyphenated_uuids=False`, `scrub_hyphenless_uuids=False`, or `replacement_uuid=\"custom-uuid\"`\n- Config: Set `SCRUB_HYPHENATED_UUIDS: false`, `SCRUB_HYPHENLESS_UUIDS: false`, or `REPLACEMENT_UUID: \"custom-uuid\"`\n\n### Unique Placeholders\nGenerate unique placeholders for each UUID to maintain relationships:\n\n```python\nfrom prepdir import run\n\noutputs = run(directory=\"/path/to/project\", use_unique_placeholders=True)\nfor output in outputs:\n    print(\"UUID Mapping:\", output.uuid_mapping)\n# Output: {'PREPDIR_UUID_PLACEHOLDER_1': 'original-uuid-1', ...}\n```\n\n## \ud83d\udd27 Advanced Features\n\n### Command Line Options\n```bash\nprepdir --help\n\n# Key options:\n-e, --extensions          File extensions to include\n-o, --output              Output file name\n-m, --max-chars           Maximum characters per output file; split into parts if exceeded\n--init                    Initialize local config at .prepdir/config.yaml\n--config                  Custom config file\n--force                   Overwrite existing config file with --init\n--all                     Include all files (ignore exclusions)\n--include-prepdir-files   Include prepdir-generated files (e.g., prepped_dir.txt)\n--no-scrub-uuids          Disable all UUID scrubbing\n--no-scrub-hyphenated-uuids  Disable hyphenated UUID scrubbing\n--no-scrub-hyphenless-uuids  Disable hyphen-less UUID scrubbing\n--replacement-uuid        Custom replacement UUID\n--use-unique-placeholders Replace UUIDs with unique placeholders\n-v, --verbose             Verbose output\n-q, --quiet               Suppress user-facing output\n```\n\n### Python API Reference\n```python\nfrom prepdir import run, PrepdirProcessor\n\n# Full API\noutputs = run(\n    directory=\"/path/to/project\",           # Target directory\n    extensions=[\"py\", \"js\"],                # File extensions\n    specific_files=[\"file1.py\"],            # Specific files\n    output_file=\"output.txt\",               # Save to file\n    config_path=\"custom.yaml\",              # Custom config\n    scrub_hyphenated_uuids=True,            # Scrub hyphenated UUIDs\n    scrub_hyphenless_uuids=True,            # Scrub hyphenless UUIDs\n    replacement_uuid=\"custom-uuid\",         # Custom replacement\n    use_unique_placeholders=False,          # Unique placeholders\n    ignore_exclusions=False,                # Ignore exclusions\n    include_prepdir_files=False,            # Include prepdir outputs\n    quiet=False,                           # Suppress output\n    max_chars=1000000                      # Max chars per file; split if exceeded\n)\n\n# Validate output\nprocessor = PrepdirProcessor(directory=\"/path/to/project\")\noutput = processor.validate_output(file_path=\"output.txt\")\n# Returns: PrepdirOutputFile object\n```\n\n## \ud83d\udcca Logging & Debugging\n\nControl verbosity with environment variables:\n```bash\nLOGLEVEL=DEBUG prepdir -v\n```\n\nValid levels: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`\n\n## \ud83d\udcc8 What's New\n\n### Version 0.18.0 (Latest)\n- Added `--max-chars` option to split large outputs into multiple files for handling bigger projects.\n- Fixed UUID scrubbing configuration not being respected when no CLI flags are provided.\n- Updated Python `run()` API to return a list of `PrepdirOutputFile` objects to support split outputs.\n- Enhanced test coverage, including new traversal tests.\n- Minor development environment updates (e.g., `pdm install --dev`).\n\n### Version 0.17.2\n- Fixed issue that caused running verbose to be no change. \n\n### Version 0.17.1\n- Fixed issue that caused error when running `prepdir --init`\n\n### Version 0.17.0\n- Improved performance and recursive glob handling\n\n[View complete changelog](docs/CHANGELOG.md)\n\n## \ud83e\udd14 FAQ\n\n<details>\n<summary><strong>Q: What project sizes can prepdir handle?</strong></summary>\nA: Effective for small to moderate projects (thousands of files). Use file extension filters and `--max-chars` to split outputs for larger projects or LLM token limits.\n</details>\n\n<details>\n<summary><strong>Q: Why are my prepdir output files missing?</strong></summary>\nA: prepdir excludes its own generated files (e.g., `prepped_dir.txt`) by default. Use `--include-prepdir-files` to include them.\n</details>\n\n<details>\n<summary><strong>Q: Why are UUIDs replaced in my output?</strong></summary>\nA: Privacy protection! prepdir scrubs UUIDs by default (configurable via CLI or config.yaml). Use `--no-scrub-uuids` or configure .prepdir/config.yaml (with prepdir --init and setting SCRUB_HYPHENATED_UUIDS and/or SCRUB_HYPHENLESS_UUIDS to false) to disable.\n</details>\n\n<details>\n<summary><strong>Q: Can I use prepdir with non-code files?</strong></summary>\nA: Yes! It works with any text files. Use `-e txt md` for specific types.\n</details>\n\n<details>\n<summary><strong>Q: How do I upgrade from older versions?</strong></summary>\nA: Configuration files are now loaded from `.prepdir/config.yaml` (local) or `~/.prepdir/config.yaml` (global) by default. Most upgrades are seamless.\n</details>\n\n## \ud83d\udee0\ufe0f Development\n\n```bash\ngit clone https://github.com/eyecantell/prepdir.git\ncd prepdir\npdm install --dev     # Install dependencies with dev extras\npdm run prepdir      # Run development version\npdm run pytest       # Run tests\npdm publish          # Publish to PyPI\n```\n\n## \ud83d\udcc4 License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\n**Love prepdir?** Give it a \u2b50 on [GitHub](https://github.com/eyecantell/prepdir)!",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Directory traversal utility to prepare project contents for review",
    "version": "0.18.0",
    "project_urls": {
        "Documentation": "https://github.com/eyecantell/prepdir#readme",
        "Issues": "https://github.com/eyecantell/prepdir/issues",
        "Repository": "https://github.com/eyecantell/prepdir"
    },
    "split_keywords": [
        "ai",
        " artificial intelligence",
        " code review",
        " directory traversal",
        " file content",
        " project documentation",
        " code sharing",
        " developer tools",
        " large language models",
        " llm",
        " project structure"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "680422a131a346f2c0827e71c748438343a54c4e7a41e5a535828d0d37441b95",
                "md5": "6171f082e3f0798224d856509def3a15",
                "sha256": "b13f5a48d8cf3de8775e14194538966acdabddf7f4fda8d993da4dc81fd3a2cf"
            },
            "downloads": -1,
            "filename": "prepdir-0.18.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6171f082e3f0798224d856509def3a15",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 32698,
            "upload_time": "2025-09-09T05:15:09",
            "upload_time_iso_8601": "2025-09-09T05:15:09.315001Z",
            "url": "https://files.pythonhosted.org/packages/68/04/22a131a346f2c0827e71c748438343a54c4e7a41e5a535828d0d37441b95/prepdir-0.18.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ca26e17aebda32977f4cc5504406f1ad021c9534b26a56fa186baf8e6e741e3b",
                "md5": "ef30830e53e4b89edda3a83caf97fd68",
                "sha256": "3e5b850520b8c27e9f9c948ebeace12f05ad03559b93136630c412cce658026a"
            },
            "downloads": -1,
            "filename": "prepdir-0.18.0.tar.gz",
            "has_sig": false,
            "md5_digest": "ef30830e53e4b89edda3a83caf97fd68",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 55777,
            "upload_time": "2025-09-09T05:15:10",
            "upload_time_iso_8601": "2025-09-09T05:15:10.597121Z",
            "url": "https://files.pythonhosted.org/packages/ca/26/e17aebda32977f4cc5504406f1ad021c9534b26a56fa186baf8e6e741e3b/prepdir-0.18.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-09 05:15:10",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "eyecantell",
    "github_project": "prepdir#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "prepdir"
}