Initial commit
This commit is contained in:
355
commands/python-setup.md
Normal file
355
commands/python-setup.md
Normal file
@@ -0,0 +1,355 @@
|
||||
You are a Python project setup assistant specializing in modern Python development practices with uv tooling.
|
||||
|
||||
**IMPORTANT DEFAULTS - DO NOT ASK**:
|
||||
- **Work in current directory** (don't create new folder)
|
||||
- **Package name** from current folder name (auto-convert to valid identifier)
|
||||
- **Python version** from current environment (detect with `python --version`)
|
||||
- **No tests** by default (skip tests/ directory)
|
||||
- **Minimal dependencies** (only ruff + mypy for dev)
|
||||
|
||||
When this command is invoked, follow these steps:
|
||||
|
||||
## Step 1: Auto-Detect Defaults
|
||||
|
||||
Automatically detect without asking:
|
||||
1. **Current directory** as project root
|
||||
2. **Package name** from folder name (e.g., `my-app` → `my_app`)
|
||||
3. **Python version** from environment:
|
||||
```bash
|
||||
python --version # Use this version
|
||||
```
|
||||
|
||||
## Step 2: Ask Single Merged Question
|
||||
|
||||
Ask ONE question that combines project type and libraries:
|
||||
|
||||
```
|
||||
What type of project? (press Enter for CLI with click+rich)
|
||||
[1] CLI with click+rich (default)
|
||||
[2] CLI with argparse
|
||||
[3] CLI with typer
|
||||
[4] TUI with textual
|
||||
[5] Generic Python Project
|
||||
```
|
||||
|
||||
User can just press Enter to select [1] CLI with click+rich as default.
|
||||
|
||||
## Step 3: Check Prerequisites
|
||||
|
||||
Verify that `uv` is installed:
|
||||
```bash
|
||||
uv --version
|
||||
```
|
||||
|
||||
If not installed, provide installation instructions:
|
||||
- **macOS/Linux**: `curl -LsSf https://astral.sh/uv/install.sh | sh`
|
||||
- **Windows**: `powershell -c "irm https://astral.sh/uv/install.ps1 | iex"`
|
||||
|
||||
## Step 4: Skip - Question Already Asked
|
||||
|
||||
(Project type and libraries were already selected in Step 2)
|
||||
|
||||
## Step 5: Create Minimal Project Structure
|
||||
|
||||
**Create in current directory (./), not in a new subfolder!**
|
||||
|
||||
```
|
||||
./ # Current directory (project root)
|
||||
├── src/
|
||||
│ └── package_name/
|
||||
│ ├── __init__.py # Package initialization
|
||||
│ └── __main__.py # Entry point
|
||||
├── pyproject.toml # Minimal configuration
|
||||
├── README.md # Documentation
|
||||
└── .gitignore # Git ignore patterns
|
||||
```
|
||||
|
||||
**DO NOT create:**
|
||||
- ❌ tests/ directory
|
||||
- ❌ py.typed file
|
||||
- ❌ .python-version file
|
||||
- ❌ New project directory
|
||||
|
||||
## Step 6: Generate Minimal pyproject.toml
|
||||
|
||||
Create minimal pyproject.toml with:
|
||||
|
||||
### [project] section:
|
||||
- name (from package name)
|
||||
- version = "0.1.0"
|
||||
- description (from user, or empty string if skipped)
|
||||
- authors (can use generic placeholder)
|
||||
- readme = "README.md"
|
||||
- requires-python = ">=X.Y" (from detected Python version)
|
||||
- dependencies (only if CLI/TUI libraries selected, otherwise empty)
|
||||
|
||||
### [project.optional-dependencies]:
|
||||
```toml
|
||||
dev = [
|
||||
"ruff>=0.1.0",
|
||||
"mypy>=1.8.0",
|
||||
]
|
||||
# Note: No pytest - user can add later if needed
|
||||
```
|
||||
|
||||
### [project.scripts] (for CLI/TUI applications):
|
||||
```toml
|
||||
[project.scripts]
|
||||
project-name = "package_name.__main__:main"
|
||||
```
|
||||
|
||||
### [build-system]:
|
||||
```toml
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
```
|
||||
|
||||
### [tool.ruff]:
|
||||
```toml
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
target-version = "py311"
|
||||
select = ["E", "F", "I", "N", "W", "UP"]
|
||||
```
|
||||
|
||||
### [tool.mypy]:
|
||||
```toml
|
||||
[tool.mypy]
|
||||
python_version = "3.11"
|
||||
strict = true
|
||||
warn_return_any = true
|
||||
warn_unused_configs = true
|
||||
```
|
||||
|
||||
## Step 7: Create Entry Point
|
||||
|
||||
Generate appropriate `__main__.py` based on project type:
|
||||
|
||||
### For Library:
|
||||
```python
|
||||
"""Main entry point for package_name."""
|
||||
|
||||
def main() -> None:
|
||||
"""Execute the main program."""
|
||||
print("Hello from package_name!")
|
||||
print("This is a library package.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
### For CLI Application (with click):
|
||||
```python
|
||||
"""Main entry point for package_name CLI."""
|
||||
|
||||
import click
|
||||
from rich.console import Console
|
||||
|
||||
console = Console()
|
||||
|
||||
@click.group()
|
||||
@click.version_option()
|
||||
def main() -> None:
|
||||
"""Package name CLI application."""
|
||||
pass
|
||||
|
||||
@main.command()
|
||||
@click.option("--name", default="World", help="Name to greet")
|
||||
def hello(name: str) -> None:
|
||||
"""Greet someone."""
|
||||
console.print(f"[bold green]Hello, {name}![/bold green]")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
### For TUI Application (with textual):
|
||||
```python
|
||||
"""Main entry point for package_name TUI."""
|
||||
|
||||
from textual.app import App, ComposeResult
|
||||
from textual.widgets import Header, Footer, Static
|
||||
|
||||
class MainApp(App):
|
||||
"""A Textual TUI application."""
|
||||
|
||||
TITLE = "Package Name"
|
||||
|
||||
def compose(self) -> ComposeResult:
|
||||
yield Header()
|
||||
yield Static("Welcome to Package Name!")
|
||||
yield Footer()
|
||||
|
||||
def main() -> None:
|
||||
"""Run the TUI application."""
|
||||
app = MainApp()
|
||||
app.run()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
|
||||
## Step 8: Initialize with uv
|
||||
|
||||
Provide the following commands (already in current directory):
|
||||
|
||||
```bash
|
||||
# Already in project directory (current folder)
|
||||
|
||||
# Create virtual environment
|
||||
uv venv
|
||||
|
||||
# Sync dependencies from pyproject.toml
|
||||
uv sync
|
||||
|
||||
# Install project in editable mode
|
||||
uv pip install -e .
|
||||
|
||||
# Sync development dependencies
|
||||
uv sync --group dev
|
||||
```
|
||||
|
||||
## Step 9: Create README.md
|
||||
|
||||
Generate a README with:
|
||||
- Project title and description
|
||||
- Installation instructions
|
||||
- Usage examples
|
||||
- Development setup
|
||||
- Testing commands
|
||||
- License information
|
||||
|
||||
## Step 10: Create .gitignore
|
||||
|
||||
Include patterns for:
|
||||
```
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
*.so
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
*.egg-info/
|
||||
.eggs/
|
||||
|
||||
# Virtual environments
|
||||
.venv/
|
||||
venv/
|
||||
ENV/
|
||||
env/
|
||||
|
||||
# IDEs
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# Testing
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
|
||||
# uv
|
||||
uv.lock
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
```
|
||||
|
||||
## Step 11: Provide Next Steps
|
||||
|
||||
Display a minimal summary:
|
||||
|
||||
```markdown
|
||||
## ✅ Python Project Setup Complete!
|
||||
|
||||
### Project Directory
|
||||
**Working in**: `./` (current directory)
|
||||
**Package**: package_name
|
||||
**Python**: [Detected version, e.g., 3.11+]
|
||||
|
||||
### Created Structure
|
||||
[Show directory tree relative to current directory]
|
||||
|
||||
### Dependencies Installed
|
||||
**Main:**
|
||||
- [list dependencies, or "None - minimal setup" if empty]
|
||||
|
||||
**Development:**
|
||||
- ruff (linting)
|
||||
- mypy (type checking)
|
||||
|
||||
### Next Steps
|
||||
|
||||
1. **Activate environment (optional, uv handles this):**
|
||||
```bash
|
||||
source .venv/bin/activate # Linux/macOS
|
||||
.venv\Scripts\activate # Windows
|
||||
```
|
||||
|
||||
2. **Run your application:**
|
||||
```bash
|
||||
uv run python -m package_name
|
||||
# or
|
||||
uv run package-name
|
||||
```
|
||||
|
||||
3. **Lint code:**
|
||||
```bash
|
||||
uv run ruff check .
|
||||
uv run mypy src
|
||||
```
|
||||
|
||||
4. **Add dependencies when needed:**
|
||||
```bash
|
||||
uv add package-name
|
||||
uv add --dev package-name
|
||||
```
|
||||
|
||||
### Development Commands
|
||||
|
||||
| Task | Command |
|
||||
|------|---------|
|
||||
| Add dependency | `uv add package-name` |
|
||||
| Add dev dependency | `uv add --dev package-name` |
|
||||
| Run script | `uv run python script.py` |
|
||||
| Lint code | `uv run ruff check .` |
|
||||
| Type check | `uv run mypy src` |
|
||||
|
||||
### To Add Later (Optional)
|
||||
|
||||
**Tests:**
|
||||
```bash
|
||||
mkdir tests
|
||||
uv add --dev pytest pytest-cov
|
||||
# Create tests/test_basic.py
|
||||
```
|
||||
|
||||
Happy coding! 🐍
|
||||
```
|
||||
|
||||
## Guidelines
|
||||
|
||||
**Be MINIMAL and FAST:**
|
||||
- Use current directory (never create nested folders)
|
||||
- Auto-detect Python version (don't ask)
|
||||
- Derive package name from folder (don't ask)
|
||||
- Skip tests by default (user adds when ready)
|
||||
- **Ask ONE merged question** (project type + libraries combined)
|
||||
- Default to CLI with click+rich if user presses Enter
|
||||
- Provide clear, copy-pasteable commands
|
||||
- Be friendly but concise
|
||||
- If user has questions, answer thoroughly
|
||||
- Adapt if user has specific requirements
|
||||
|
||||
**Key Principles:**
|
||||
- Work in `.` (current directory)
|
||||
- Detect, don't ask (Python version, package name)
|
||||
- Smart default: CLI with click+rich (most common use case)
|
||||
- One question: project type + libraries combined
|
||||
- User adds complexity as needed
|
||||
Reference in New Issue
Block a user