# prj-tree
Инструмент для извлечения структуры проекта (или отдельной директории) с учётом игноров и гибкими правилами включения файлов. Рендеры: HTML / Markdown / JSON / ASCII.
## Установка
```bash
pip install prj-tree
```
## CLI
```bash
prj-tree [ROOT] [--renderer html|md|json|ascii] \
[--no-git-root] [--no-gitignore] \
[--extra-ignore PATTERNS...] \
[--tree-include PATTERNS...] [--tree-exclude PATTERNS...] \
[--content-include PATTERNS...] \
[--content-exclude PATTERNS...] \
[--max-file-chars N] [--no-truncate] \
[--title TEXT] \
[--output OUTFILE]
```
- **ROOT**: корень проекта (по умолчанию — git root или CWD)
- **--tree-include/--tree-exclude**: фильтрация дерева по путям/именам/wildcard
- **--content-include**: какие файлы показывать с содержимым (имя, путь, расширение `.py`, или wildcard `**/*.py`)
- **--content-exclude**: исключить содержимое для совпадающих паттернов (файл останется в дереве)
- **--no-gitignore**: не учитывать `.gitignore`
- По умолчанию обрезка содержимого отключена. Включить можно `--max-file-chars N`.
- Также учитывается `.prjtreeignore` (если есть) в корне
Примеры:
```bash
# HTML отчёт со всеми .py файлами
prj-tree --renderer html --content-include .py --output structure.html
# Markdown по папке src, исключая node_modules
prj-tree src --renderer md --tree-exclude node_modules --output tree.md
# JSON (можно парсить программно)
prj-tree --renderer json --content-include "src/**/*.ts" --output tree.json
# ASCII в stdout
prj-tree --renderer ascii
```
## Python API
```python
from prj_tree import generate, GenerateOptions
opts = GenerateOptions(
root_path="/path/to/project",
content_include=[".py", "README.md", "src/**/main.ts"],
tree_exclude=["node_modules", "dist"],
renderer="html",
title="Мой проект",
)
html = generate(opts)
```
## Игноры
- Встроенные дефолтные игноры (например, `.git`, `node_modules`, `__pycache__` и т.д.)
- Паттерны из `.gitignore` (если не отключено)
- Паттерны из `.prjtreeignore` (если файл существует)
- Параметр `--extra-ignore` для явных добавлений
## Лицензия
MIT
Raw data
{
"_id": null,
"home_page": "https://pypi.org/project/prj-tree/",
"name": "prj-tree",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "tree, project, structure, tools, cli, html, markdown, json",
"author": "Anton Larin",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/11/ff/bbded137aa073dc3161c39acd44f27e0843dc6182cb9805672c9ec1c46c7/prj_tree-0.1.2.tar.gz",
"platform": null,
"description": "# prj-tree\n\n\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438) \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0438\u0433\u043d\u043e\u0440\u043e\u0432 \u0438 \u0433\u0438\u0431\u043a\u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432. \u0420\u0435\u043d\u0434\u0435\u0440\u044b: HTML / Markdown / JSON / ASCII.\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\npip install prj-tree\n```\n\n## CLI\n\n```bash\nprj-tree [ROOT] [--renderer html|md|json|ascii] \\\n [--no-git-root] [--no-gitignore] \\\n [--extra-ignore PATTERNS...] \\\n [--tree-include PATTERNS...] [--tree-exclude PATTERNS...] \\\n [--content-include PATTERNS...] \\\n [--content-exclude PATTERNS...] \\\n [--max-file-chars N] [--no-truncate] \\\n [--title TEXT] \\\n [--output OUTFILE]\n```\n\n- **ROOT**: \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 git root \u0438\u043b\u0438 CWD)\n- **--tree-include/--tree-exclude**: \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u043e \u043f\u0443\u0442\u044f\u043c/\u0438\u043c\u0435\u043d\u0430\u043c/wildcard\n- **--content-include**: \u043a\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c (\u0438\u043c\u044f, \u043f\u0443\u0442\u044c, \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 `.py`, \u0438\u043b\u0438 wildcard `**/*.py`)\n- **--content-exclude**: \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 (\u0444\u0430\u0439\u043b \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u0435)\n- **--no-gitignore**: \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c `.gitignore`\n- \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0431\u0440\u0435\u0437\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430. \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e `--max-file-chars N`.\n- \u0422\u0430\u043a\u0436\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f `.prjtreeignore` (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c) \u0432 \u043a\u043e\u0440\u043d\u0435\n\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b:\n\n```bash\n# HTML \u043e\u0442\u0447\u0451\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 .py \u0444\u0430\u0439\u043b\u0430\u043c\u0438\nprj-tree --renderer html --content-include .py --output structure.html\n\n# Markdown \u043f\u043e \u043f\u0430\u043f\u043a\u0435 src, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f node_modules\nprj-tree src --renderer md --tree-exclude node_modules --output tree.md\n\n# JSON (\u043c\u043e\u0436\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e)\nprj-tree --renderer json --content-include \"src/**/*.ts\" --output tree.json\n\n# ASCII \u0432 stdout\nprj-tree --renderer ascii\n```\n\n## Python API\n\n```python\nfrom prj_tree import generate, GenerateOptions\n\nopts = GenerateOptions(\n root_path=\"/path/to/project\",\n content_include=[\".py\", \"README.md\", \"src/**/main.ts\"],\n tree_exclude=[\"node_modules\", \"dist\"],\n renderer=\"html\",\n title=\"\u041c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\",\n)\nhtml = generate(opts)\n```\n\n## \u0418\u0433\u043d\u043e\u0440\u044b\n- \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0438\u0433\u043d\u043e\u0440\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, `.git`, `node_modules`, `__pycache__` \u0438 \u0442.\u0434.)\n- \u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0438\u0437 `.gitignore` (\u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e)\n- \u041f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0438\u0437 `.prjtreeignore` (\u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442)\n- \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 `--extra-ignore` \u0434\u043b\u044f \u044f\u0432\u043d\u044b\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0439\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\nMIT\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Project tree extractor with ignore support, flexible includes, and multiple renderers (HTML/MD/JSON/ASCII).",
"version": "0.1.2",
"project_urls": {
"Homepage": "https://pypi.org/project/prj-tree/",
"Repository": "https://github.com/his-name-anton/prj-tree"
},
"split_keywords": [
"tree",
" project",
" structure",
" tools",
" cli",
" html",
" markdown",
" json"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dd82cbb9ed5db58b81cc7b393c64de377e56dd612cf51e09e07bddce0aa3024b",
"md5": "95454c7b4da97dca3be4cf3b6ce22ce6",
"sha256": "34cae75b9170da9b107346443940f10774e611ccc9796f0ab4788389cf8270d8"
},
"downloads": -1,
"filename": "prj_tree-0.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "95454c7b4da97dca3be4cf3b6ce22ce6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 14280,
"upload_time": "2025-08-08T12:05:34",
"upload_time_iso_8601": "2025-08-08T12:05:34.796080Z",
"url": "https://files.pythonhosted.org/packages/dd/82/cbb9ed5db58b81cc7b393c64de377e56dd612cf51e09e07bddce0aa3024b/prj_tree-0.1.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "11ffbbded137aa073dc3161c39acd44f27e0843dc6182cb9805672c9ec1c46c7",
"md5": "54aaa62d143fe116d939199776b923a8",
"sha256": "920e917cb9843b5b5bd9b2abca805020859458535742d412582abcbe8cc990a7"
},
"downloads": -1,
"filename": "prj_tree-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "54aaa62d143fe116d939199776b923a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 18784,
"upload_time": "2025-08-08T12:05:36",
"upload_time_iso_8601": "2025-08-08T12:05:36.192409Z",
"url": "https://files.pythonhosted.org/packages/11/ff/bbded137aa073dc3161c39acd44f27e0843dc6182cb9805672c9ec1c46c7/prj_tree-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-08 12:05:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "his-name-anton",
"github_project": "prj-tree",
"github_not_found": true,
"lcname": "prj-tree"
}