---
name: scaffold-python
description: Scaffold a new Python project with a src layout, linting, and tests. Prefer uv-based setup and packaging; if uv is unavailable, warn the user, request approval, and use a fallback bootstrap path.
metadata:
  author: "GhostWorks"
---

# Scaffold Python

Create a new Python project scaffold with consistent structure and tooling.

## Input Parsing

Accept input as: `PROJECT_NAME`

Examples:
- `$scaffold-python my-tool`

If no project name is provided, ask the user for one before proceeding.

## Preference Policy

- Prefer `uv` for initialization and environment management.
- If `uv` is missing:
  - warn the user that `uv` is preferred,
  - remind them to install `uv`,
  - ask for approval before using a fallback bootstrap path.
- Fallback only after explicit user approval.

Recommended install reminder:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```

## Steps (Preferred: uv)

1. Create the project directory in the current working directory.
2. Run:
   ```bash
   uv init --name <project_name> --package
   ```
3. Ensure structure exists:
   ```text
   <project_name>/
     src/
       <package_name>/
         __init__.py
         main.py
     tests/
       __init__.py
       conftest.py
     .gitignore
     README.md
     pyproject.toml
   ```
4. Ensure `pyproject.toml` includes:
   - Python `>=3.11`
   - dev dependencies: `pytest`, `ruff`, `mypy`
   - Ruff config (line length 88, 4-space indent)
   - mypy strict mode
5. Write `src/<package_name>/__init__.py` with:
   ```python
   __version__ = "0.1.0"
   ```
6. Write `src/<package_name>/main.py` with a minimal `main()` entry point.
7. Write test stubs (`tests/__init__.py`, `tests/conftest.py`).
8. Write `.gitignore` for Python artifacts.
9. Write `README.md` with basic usage:
   ```bash
   uv run python -m <package_name>
   ```
10. Run:
    ```bash
    uv sync
    ```
11. Report created files and next commands.

## Fallback Steps (Only If Approved)

Use only when `uv` is unavailable and user explicitly approves fallback.

1. Create the same project structure.
2. Write/adjust `pyproject.toml` with the same project and tool configuration.
3. Initialize a virtual environment:
   ```bash
   python3 -m venv .venv
   .venv/bin/python -m pip install --upgrade pip
   ```
4. Install developer tools:
   ```bash
   .venv/bin/pip install pytest ruff mypy
   ```
5. Report fallback usage and remind user to install `uv` for future scaffolds.

## Output Requirements

- Report final directory tree.
- Report whether preferred (`uv`) or fallback path was used.
- If fallback was used, include the `uv` install reminder at the end.
