🧙 TreeMancer
TreeMancer is a mystical CLI tool that conjures real directory structures from both ASCII tree diagrams and its own enchanted domain-specific language. Like a true wizard of the filesystem, it transforms your project ideas into reality with just a few magical incantations.
You probably do not need it, but it was very fun to build!
🎭 About
TreeMancer is a personal quest to master the ancient arts of language design. Armed with nothing but mana and curiosity, I crafted this spellbinding tool while exploring fundamental computer science concepts like tokenizers, lexers, and parsers from scratch. Every line of code is handwritten – no magic frameworks, just pure wizardry!
🚀 Magical Features
- 🗣️ Enchanted DSL: TreeMancer's own mystical domain-specific language for conjuring directory structures
- 🎯 Dual Sorcery: Cast spells with tree diagrams OR the native TreeMancer syntax
- 📋 Grimoire System: Reusable
.treespell scrolls for common incantations - 🛠️ Simple Commands: Just
createandpreviewwith automatic spell detection - ⚡ Lightning Fast: Built with modern Python and battle-tested spells
- 🔮 Crystal Ball: Automatic file vs directory divination
- ✅ Spell Checker: Syntax validation with detailed mystical error reports
- 🧠 Apprentice-Friendly: Hand-crafted from scratch with tokenizers, lexers, and parsers
📦 Installation
uv add treemancer # or pip install treemancer
🎯 Quick Start
# Cast a simple project structure spell
treemancer create "myapp > README.md main.py src > utils.py"
# Consult the crystal ball before creating
treemancer preview "myapp > src > main.py | tests > test.py"
# Use a pre-written spell scroll
treemancer create samples/webapp.tree --output ./my-webapp
# Transmute tree diagrams from ancient texts
treemancer create samples/multiple-trees.md --all-trees
# Transcribe ancient texts
treemancer convert samples/ecommerce-platform.md --to-syntax
# Write spells using ancient runes
treemancer convert "myapp > README.md main.py src > utils.py" --to-diagram
🎯 Simple & Powerful Commands
TreeMancer features a streamlined CLI with just three main commands:
create- Main command that auto-detects syntax vs files and creates structurespreview- Validates syntax and shows structure preview without creating filesconvert- Round-trip conversion between structured TreeMancer language and tree diagrams
Both commands automatically detect input type and handle:
- 📝 TreeMancer syntax (direct command line input)
- 📄 Template files (.tree files with syntax)
- 📋 Markdown files (with tree diagrams)
- 📚 Multiple trees (with --all-trees flag)
🎪 Real-World Examples
Web Application
# Full-stack web app structure
treemancer create "webapp > d(frontend) d(backend) f(docker-compose.yml) | frontend > d(src) d(public) f(package.json) | src > d(components) d(pages) | backend > d(models) d(routes) f(app.py)"
Python Project
# Complete Python project
treemancer create "my_project > f(__init__.py) f(main.py) d(tests) d(docs) f(requirements.txt) f(README.md) | tests > f(__init__.py) f(test_main.py)"
Microservice
# Microservice with Docker
treemancer create "microservice > f(Dockerfile) f(docker-compose.yml) d(app) d(tests) | app > f(main.py) f(config.py) d(models) d(routes)"
📚 The TreeMancer Grimoire
🎯 Fundamental Incantations
TreeMancer's mystical syntax uses just a few powerful operators to weave directory spells:
> - Go Deeper (Parent → Child)
Creates a parent-child relationship. The next item becomes a child of the current item.
# Creates: project/src/main.py
treemancer create "project > src > main.py"
| - Cascade Reset (Go Back One Level)
Goes back to the parent level, allowing you to create siblings.
# Creates: project/src/file1.py + project/file2.py
treemancer create "project > src > file1.py | file2.py"
Space - Sibling Separator
Creates items at the same level (siblings).
# Creates: app/file1.py + app/file2.py + app/file3.py
treemancer create "app > file1.py file2.py file3.py"
🏷️ Type Hints (Optional)
Force specific types when automatic inference isn't enough:
d(name) - Force Directory
treemancer create "d(utils) > helper.py" # utils/ is definitely a directory
f(name) - Force File
treemancer create "f(Dockerfile) > commands" # Dockerfile is definitely a file
🔄 Conversion Examples
Tree Diagram → TreeMancer Syntax
Input (Tree Diagram):
webapp/
├── package.json
├── src/
│ ├── components/
│ │ ├── Header.js
│ │ └── Footer.js
│ └── pages/
│ └── Home.js
└── tests/
└── app.test.js
Output (TreeMancer Syntax):
webapp > package.json src > components > Header.js Footer.js | pages > Home.js | tests > app.test.js
TreeMancer Syntax → Tree Diagram
Input (TreeMancer Syntax):
treemancer preview "project > README.md src > main.py utils.py | tests > test_main.py"
Output (Tree Diagram):
└── project/
├── README.md
├── src/
│ ├── main.py
│ └── utils.py
└── tests/
└── test_main.py
📋 Template System Examples
Create reusable samples in .tree files:
samples/fastapi.tree:
fastapi_project > f(main.py) f(requirements.txt) d(app) d(tests) | app > f(__init__.py) d(routers) d(models) d(database) | routers > f(__init__.py) f(users.py) f(auth.py) | models > f(__init__.py) f(user.py) | database > f(__init__.py) f(connection.py) | tests > f(__init__.py) f(test_main.py)
Usage:
# Use the template
treemancer create samples/fastapi.tree
# Preview before creating
treemancer preview samples/fastapi.tree
🎨 Complex Example Breakdown
Let's break down a complex microservices structure:
# Full command
treemancer create "microservices > f(docker-compose.yml) d(user-service) d(product-service) d(api-gateway) | user-service > f(Dockerfile) f(requirements.txt) d(app) | app > f(main.py) d(models) d(routes) | product-service > f(Dockerfile) f(go.mod) d(handlers) d(models) | api-gateway > f(package.json) d(src) d(config)"
Step by step:
microservices >- Create root directoryf(docker-compose.yml) d(user-service) d(product-service) d(api-gateway)- Add siblings at root level| user-service >- Reset to root, then go into user-servicef(Dockerfile) f(requirements.txt) d(app)- Add files and app directory| app >- Reset to user-service, then go into appf(main.py) d(models) d(routes)- Add app contents| product-service >- Reset to root, go to product-service- And so on...
Result:
microservices/
├── docker-compose.yml
├── user-service/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app/
│ ├── main.py
│ ├── models/
│ └── routes/
├── product-service/
│ ├── Dockerfile
│ ├── go.mod
│ ├── handlers/
│ └── models/
└── api-gateway/
├── package.json
├── src/
└── config/
🎯 Pro Tips
- Start Simple: Begin with basic
>and|operators - Use Spaces: Create siblings with spaces:
parent > child1 child2 child3 - Reset Wisely: Use
|to go back one level when you need to create siblings of parent directories - Type Hints: Use
d()andf()when file extensions aren't clear (likeDockerfile,Makefile) - samples: Save complex structures as
.treefiles for reuse - Preview First: Always use
previewto validate syntax and see structure before creating - Auto-Validation:
previewautomatically validates syntax and shows helpful errors
✅ Built-in Validation & Error Reporting
TreeMancer's preview command now includes comprehensive syntax validation:
# Valid syntax - shows node count + preview
treemancer preview "project > src > main.py | tests > test.py"
# Output: ✓ Syntax is valid! (4 nodes) + structure preview
# Invalid syntax - shows detailed errors + help
treemancer preview "invalid > > missing_name"
# Output: ✗ Syntax is invalid! + error details + syntax guide
Error Features:
- 🔍 Detailed Error Messages: Specific information about what went wrong
- 📚 Syntax Help: Automatic display of syntax guide with examples
- 🎯 Quick Reference: Table of operators and their usage
- 🚀 Works with All Inputs: Syntax validation for direct syntax, .tree files, and .md files
🛠️ Command Reference
Create
Create directory structures from inline syntax, tree diagram (from .md or .txt files) or from .tree TreeMancer syntax files.
# enjoy the auto-detection
treemancer create "project > src > main.py"
treemancer create samples/ecommerce-platform.md
treemancer create samples/fastapi.tree
Preview
Preview & validate structure without creating it
treemancer preview "project > src > main.py" # Shows preview if valid
treemancer preview "invalid > > syntax" # Shows errors + help if invalid
treemancer preview samples/datascience.tree
treemancer preview samples/react.tree --all-trees
Convert
Round-trip conversion between its syntax and ASCII tree diagrams:
# Convert TreeMancer syntax to ASCII diagram
treemancer convert "project > src > main.py | tests > test.py" --to-diagram
treemancer convert samples/react.tree --to-diagram --output diagram.md
# Convert ASCII tree diagram to TreeMancer syntax
treemancer convert samples/ecommerce-platform.md --to-syntax --output result.tree
# Multi-tree conversion (creates separate files with _{n} suffix)
# Creates: project_1.tree, project_2.tree, project_3.tree, ...
treemancer convert samples/multiple-trees.md --to-syntax --all-trees --output multiple-trees.tree
# Display multiple trees in terminal
treemancer convert samples/multiple-trees.md --to-syntax --all-trees
Useful Options
# Dry run (show what would be created)
treemancer create "..." --dry-run
# Create only directories (skip files)
treemancer create "..." --no-files
# Specify output directory
treemancer create "..." --output /path/to/output
# Parse all trees from file
treemancer create document.md --all-trees
treemancer preview document.md --all-trees
# Convert operations
treemancer convert "..." --to-diagram # Convert to ASCII tree
treemancer convert "..." --to-syntax # Convert to TreeMancer syntax
treemancer convert file.md --all-trees --to-syntax # Convert all trees from file
Template Workflow
# Create a template
echo "webapp > src > App.js | public > index.html" > webapp.tree
# Use the template
treemancer create webapp.tree
# Preview template (with automatic validation)
treemancer preview webapp.tree
🧪 Apprentice Development
# Setup development environment
git clone https://github.com/ericmiguel/treemancer
cd treemancer
uv sync --dev
# Code quality
uv run ruff format . # Format code
uv run ruff check . # Lint code
uv run pytest # Run tests
# Test locally
uv run treemancer --help
🤝 Join the Magic Circle
TreeMancer welcomes fellow wizards and apprentices! Enchanted with modern Python practices:
- 🏗️ Clean Architecture: Modular design with clear separation
- 🧪 Comprehensive Tests: Full test coverage with pytest
- 🎨 Code Quality: Ruff formatting and type checking
- 📚 Clear Documentation: Examples and helpful error messages
Happy directory conjuring! 🧙♂️✨
Metadata
Release files for treemancer 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| treemancer-0.2.0.tar.gz | 112.3 kB | Without provenance | Details for treemancer-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| treemancer-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for treemancer-0.2.0-py3-none-any.whl |
Total release size: 182.6 kB
Release files / treemancer-0.2.0.tar.gz
| Download URL | treemancer-0.2.0.tar.gz |
|---|---|
| Size | 112.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e1925f969b7ccaf9419fb6e11eff38be3770433a8e590db69998d3cdb22d2440
|
|
BLAKE2b-256 checksum How to use checksums |
41e2b2aef2cba2a34828363965091f9fcb31fea829ece3239ef4f49e496a3773
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.3
|
Release files / treemancer-0.2.0-py3-none-any.whl
| Download URL | treemancer-0.2.0-py3-none-any.whl |
|---|---|
| Size | 70.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b6fe38af2b78748a2ace8760c2dba29979eac7f792ea882c4441cb7c3f1214ee
|
|
BLAKE2b-256 checksum How to use checksums |
6dc88e74b559c05caf497d3964441b27a7c2a5cac7d2bbbf0a95f5e1213a2d03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.3
|
Security for treemancer 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.