A command-line utility to pack Python codebases into a single text file for AI context, with clipboard support.
Project description
py-ai ๐
py-ai is a lightweight, zero-configuration command-line interface (CLI) tool designed for developers. It recursively scans your local Python codebase, filters out unnecessary files, and compiles your entire projectโcomplete with a beautiful ASCII directory tree and LLM-ready statistics (lines & estimated tokens)โinto a single text or Markdown file while automatically copying it to your clipboard.
Perfect for instantly feeding your codebase context into Large Language Models (LLMs) like ChatGPT, Claude, and Gemini.
โจ Features
- LLM-ready statistics: every pack ends with the total line count and an estimated token count (accurate
cl100k_basecounting whentiktokenis installed, ~4 chars/token heuristic otherwise), printed in the output header and in the CLI summary. - Two output formats: classic plain text (
--- START OF FILE: ... ---) and Markdown (--format markdown) with language-aware fenced code blocks โ paste straight into a chat and get syntax highlighting. - Smart Filtering: automatically ignores VCS folders (
.git,.github), virtual environments (.venv,venv), IDE settings (.vscode,.idea), build artifacts (dist,build,*.egg-info), caches (__pycache__,.pytest_cache), binary files (images, archives, databases, executables โ plus a NUL-byte content heuristic) and hidden files (except explicitly allowed configs like.gitignore,.env.example,.editorconfig,.dockerignore). .gitignore/.pyaiignoresupport: honored automatically when the optionalpathspecdependency is installed (pip install py-for-ai[gitignore]).- Custom exclusions: additional glob patterns via
--exclude(repeatable) and a per-file size cap via--max-file-size. - Output control:
--quiet/-qfor CI-friendly silent runs (errors still go to stderr),--verbose/-vfor extra details,--no-treeto drop the directory tree section, and--no-token-countto skip token estimation on large projects. - Symlink-Safe: symlinks pointing outside the project root are never followed or packed; directory symlinks are never traversed, so cycles and aliased duplicates are impossible. Suspicious links stay visible in the directory tree with an explanatory note.
- Deep-Project-Proof: iterative (stack-based) directory traversal โ no
RecursionErroron very deeply nested projects. - Encoding-Aware: reads UTF-8, UTF-8-BOM, UTF-16/32 (via BOM), legacy Cyrillic
cp1251and other 8-bit encodings automatically; true binary files are skipped with a clear warning and marked in the tree. - ASCII Directory Tree: a clean, sorted representation of your project layout, consistent with the packed content (skipped files are annotated).
- Clipboard Integration: automatically copies the packed content; gracefully falls back with a warning in headless/SSH environments.
๐ Project Layout
py_ai_project/
โโโ pyproject.toml
โโโ README.md
โโโ CHANGELOG.md
โโโ .github/workflows/tests.yml # CI: pytest on 3 OS ร 6 Python versions
โโโ tests/ # pytest suite
โโโ src/py_ai/
โโโ __init__.py # version (read from installed metadata)
โโโ __main__.py # python -m py_ai
โโโ cli.py # argument parsing & user interaction
โโโ core.py # traversal orchestration + tree builder
โโโ filters.py # ignore rules, --exclude, .gitignore support
โโโ readers.py # encoding/binary-aware file reading
โโโ tokens.py # line & token statistics
โโโ formatting.py # text / markdown output assembly
๐ Quick Start
Installation
Install the utility directly from PyPI (note: the distribution name is py-for-ai):
pip install py-for-ai
Optional extras:
pip install "py-for-ai[tokens]" # accurate token counting via tiktoken
pip install "py-for-ai[gitignore]" # respect .gitignore / .pyaiignore files
pip install "py-for-ai[all]" # everything above
(Or install it locally for development):
git clone https://github.com/Maksum867/py-ai.git
cd py-ai
pip install -e ".[dev]"
pytest
Full pre-release verification (one command)
Run everything โ tests, lint, CLI smoke checks, git hygiene, build, wheel smoke โ from the repo root:
powershell -ExecutionPolicy Bypass -File verify_all.ps1 # full check
.\verify_all.ps1 -SkipBuild # quick check (no build)
The script exits 0 when every check passes and 1 when anything fails.
Usage
Run the utility from any terminal session โ both pyai and the py-ai alias are available:
# 1. Pack current directory and copy to clipboard:
pyai
# 2. Pack a specific directory:
pyai /path/to/your/project
# 3. Save the results to a custom file:
pyai . -o custom_output.txt
# 4. Run without clipboard copy (ideal for remote servers or CI/CD):
pyai --no-clipboard
# 5. Markdown output with syntax-aware code fences:
pyai --format markdown -o context.md
# 6. Skip large files and extra paths:
pyai --max-file-size 200KB --exclude '*.log' --exclude 'docs/*'
# 7. Same via the alias or as a module; show the installed version:
py-ai --no-clipboard
python -m py_ai --version
# 8. CI-friendly: no informational output, no clipboard, no tree:
pyai --quiet --no-clipboard --no-tree -o context.txt
# 9. Skip token estimation (faster on big repos) or show extra details:
pyai --no-token-count
pyai --verbose
๐ Output Format Examples
Plain text (default)
================================================================================
PROJECT CONTEXT PACK: my_project
Generated on: 2026-07-31 12:00:00
Total files packed: 2
Total lines: 33
Estimated tokens: ~410 (heuristic (~4 chars/token))
================================================================================
================================================================================
DIRECTORY TREE
================================================================================
my_project/
โโโ src/
โ โโโ main.py
โโโ pyproject.toml
================================================================================
FILES CONTENT
================================================================================
--- START OF FILE: pyproject.toml ---
[project]
name = "my_project"
version = "0.1.0"
--- END OF FILE: pyproject.toml ---
--- START OF FILE: src/main.py ---
def main():
print("Hello, AI!")
--- END OF FILE: src/main.py ---
Markdown (--format markdown)
# Project Context Pack
- Project: my_project
- Generated on: 2026-07-31 12:00:00
- Total files packed: 1
- Total lines: 15
- Estimated tokens: ~120 (cl100k_base (tiktoken))
## Directory Tree
```text
my_project/
โโโ src/
โโโ main.py
```
## Files Content
### `src/main.py`
```python
def main():
print("Hello, AI!")
```
Files that exist in the project but were not packed (binaries, oversized files, unsafe symlinks) remain visible in the tree with an explanatory note, e.g.:
โโโ data/
โ โโโ dump.bin [skipped: binary file]
โ โโโ huge.log [skipped: exceeds size limit (200.0 KB)]
โ โโโ notes.txt -> /etc/hostname [symlink outside project root โ not followed, not packed]
โ๏ธ Filtering Behavior (what exactly is excluded)
- Directories/files by name:
.git,.github,.gitlab,.svn,.hg,node_modules,__pycache__,.venv,venv,env,.env,.pytest_cache,.mypy_cache,.ruff_cache,.tox,.nox,build,dist,.idea,.vscode,.settings,.DS_Store,Thumbs.db,desktop.ini(matched case-insensitively), any path component ending in.egg-info. - Binary extensions: compiled artifacts, archives, images, audio/video, fonts, databases, office documents, ML artifacts (
.pkl,.npy,.onnx, โฆ) and executables (.exe,.msi,.bin,.dll,.so, โฆ). Files of any other type that contain NUL bytes are treated as binary too and skipped with a warning. - Hidden files (starting with
.) are ignored, except:.gitignore,.gitattributes,.gitmodules,.env.example,.env.template,.pylintrc,.flake8,.coveragerc,.dockerignore,.editorconfig,.pre-commit-config.yaml,.python-version,.readthedocs.yaml,.readthedocs.yml,.codecov.yml. .gitignore/.pyaiignorerules (whenpy-for-ai[gitignore]is installed; disable with--no-gitignore).- User patterns from
--exclude(matched against the relative POSIX path and the file name). Git-style directory patterns work too:--exclude 'build/'excludes thebuild/directory and everything under it. Note: patterns use Python'sfnmatch, where*also matches across/(sodocs/*excludesdocs/deep/file.pyas well). - Oversized files when
--max-file-sizeis given. - Symlinks resolving outside the project root and directory symlinks are never followed or packed (shown in the tree with a note).
- The output file itself is never included in its own pack.
๐ช Token Estimation
- With
pip install py-for-ai[tokens], tokens are counted precisely withtiktokenusing thecl100k_baseencoding (used by GPT-3.5/4 families and a reasonable approximation for other models). - Without it, a widely used heuristic of ~4 characters per token is applied, and the CLI tells you which method was used.
๐ ๏ธ Requirements & Dependencies
- Python
3.8or higher (verified in CI on 3.8โ3.14, Linux/Windows/macOS). pyperclip(for clipboard operations; requiresxclip/xselon X11 orwl-clipboardon Wayland for Linux desktops โ otherwise a warning is shown and the output file is still produced).
๐ค Contributing
git clone https://github.com/Maksum867/py-ai.git
cd py-ai
pip install -e ".[dev]"
pytest
Please make sure the whole pytest suite passes and add tests for new features.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_for_ai-0.3.0.tar.gz.
File metadata
- Download URL: py_for_ai-0.3.0.tar.gz
- Upload date:
- Size: 38.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de466eab1c82d2d3571ff56dbe4ebbf1130e91f737514663211c7afa17103e58
|
|
| MD5 |
bf2d05daa75d5e04766f7effb44ffc1d
|
|
| BLAKE2b-256 |
bef42264f23e8c7c248abf9fd64c645bc079f12051bc5ed6ec26e8de91b9f1e4
|
File details
Details for the file py_for_ai-0.3.0-py3-none-any.whl.
File metadata
- Download URL: py_for_ai-0.3.0-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61071b3fc6379c32fa7b8f6a0286979fce676ae7086584f26ce6bd592f42a11b
|
|
| MD5 |
c8cb853768751dbc87c7976f259c5654
|
|
| BLAKE2b-256 |
cb10d380621e11bfc612cdf32ab805f5fe3d93de421008b4c00405ff43339a4b
|