home / skills / plurigrid / asi / uv-discohy

uv-discohy skill

/skills/uv-discohy

This skill streamlines Python toolchain usage for DiscoHy by managing dependencies, linting, formatting, and one-shot tooling with uv, uvx, and ruff.

npx playbooks add skill plurigrid/asi --skill uv-discohy

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
7.1 KB
---
name: uv-discohy
description: UV/UVX/Ruff toolchain for DiscoHy Thread Operad with Python packaging and linting
trit: 0
---

# UV-DiscoHy Skill: Modern Python Tooling for Thread Operads

**Status**: ✅ Production Ready
**Trit**: 0 (ERGODIC - toolchain neutral)
**Toolchain**: uv + uvx + ruff
**Package**: music-topos with discohy_thread_operad

---

## Overview

This skill provides the **uv/uvx/ruff** toolchain integration for the DiscoHy Thread Operad system. It enables:

1. **Fast dependency management** via uv (10-100x faster than pip)
2. **One-shot tool execution** via uvx (no install required)
3. **Modern linting/formatting** via ruff (replaces black, isort, flake8)
4. **Python packaging** via pyproject.toml with hatchling

## Quick Start

```bash
# Initialize the environment
just uv-init

# Run the DiscoHy operad demo
just uv-discohy

# Lint and format
just uv-lint
just uv-format

# Run with specific variant
just uv-discohy-variant 2-transducer
```

## UV Commands

### Package Management

```bash
# Create virtual environment and install dependencies
uv venv
uv pip install -e ".[dev]"

# Add a dependency
uv pip install discopy>=1.1.0

# Sync all dependencies from pyproject.toml
uv pip sync pyproject.toml

# Show dependency tree
uv pip tree
```

### UVX: One-Shot Tool Execution

```bash
# Run ruff without installing
uvx ruff check src/

# Run pytest without installing
uvx pytest tests/

# Run a specific version
uvx --python 3.12 ruff check src/
```

## Ruff Configuration

From `pyproject.toml`:

```toml
[tool.ruff]
target-version = "py311"
line-length = 100
indent-width = 4

[tool.ruff.lint]
select = [
    "E",      # pycodestyle errors
    "W",      # pycodestyle warnings
    "F",      # Pyflakes
    "I",      # isort
    "B",      # flake8-bugbear
    "C4",     # flake8-comprehensions
    "UP",     # pyupgrade
    "ARG",    # flake8-unused-arguments
    "SIM",    # flake8-simplify
]

[tool.ruff.format]
quote-style = "double"
indent-style = "space"
```

### Ruff Commands

```bash
# Check for issues
ruff check src/ lib/

# Auto-fix issues
ruff check --fix src/

# Format code
ruff format src/

# Check and format in one pass
ruff check --fix src/ && ruff format src/
```

## DiscoHy Thread Operad Integration

### Python API

```python
from discohy_thread_operad import (
    RootedColorOperad,
    ThreadOperadNode,
    OPERAD_VARIANTS,
    build_operad_from_threads,
    operad_to_mermaid,
)

# Build operad from thread list
threads = [
    {"id": "T-root", "title": "Root Thread", "created": 0},
    {"id": "T-child", "title": "Child Thread", "created": 1},
]
operad = build_operad_from_threads(threads, variant="dendroidal")

# Switch variant dynamically
operad.set_variant("2-transducer")

# Check GF(3) conservation
gf3 = operad.gf3_conservation()
print(f"Conserved: {gf3['conserved']}")

# Generate Mermaid diagram
mermaid = operad_to_mermaid(operad)
print(mermaid)
```

### Operad Variants

| Variant | Trit | UV Package | Description |
|---------|------|------------|-------------|
| `dendroidal` | 0 | discopy | Tree grafting (Ω(T)) |
| `colored-symmetric` | -1 | discopy | Σ-colored with permutations |
| `actegory` | 0 | discopy | Monoidal action |
| `2-transducer` | +1 | discopy | Day convolution on state |

### 3 Parallel Color Streams

Each thread has 3 deterministic color streams:

```python
node = ThreadOperadNode("T-123", "My Thread")

# Access streams
live_color = node.get_color("LIVE")      # +1 trit
verify_color = node.get_color("VERIFY")  # 0 trit
backfill_color = node.get_color("BACKFILL")  # -1 trit

# Get trit from hue
trit = live_color.to_trit()  # -1, 0, or +1
```

## Project Structure

```
music-topos/
├── pyproject.toml          # UV/Ruff/Hatch configuration
├── src/
│   └── discohy_thread_operad.py  # Python implementation
├── lib/
│   └── discohy_thread_operad.hy  # Hy implementation
├── db/
│   └── thread_operad_schema.sql  # DuckDB materialization
└── tests/
    └── test_discohy_operad.py    # Pytest tests
```

## GF(3) Conservation

The system verifies that sibling triplets satisfy:

```
sum(trits) ≡ 0 (mod 3)
```

Where:
- `+1` (LIVE) = warm hues (0-60°, 300-360°)
- `0` (VERIFY) = neutral hues (60-180°)
- `-1` (BACKFILL) = cool hues (180-300°)

## Justfile Commands

```bash
# ═══════════════════════════════════════════════════════════════════════════════
# UV/UVX/RUFF TOOLCHAIN
# ═══════════════════════════════════════════════════════════════════════════════

# Initialize uv environment
uv-init:
    uv venv
    uv pip install -e ".[dev]"

# Run DiscoHy operad demo
uv-discohy:
    uv run python src/discohy_thread_operad.py

# Run with specific variant
uv-discohy-variant variant:
    uv run python -c "from discohy_thread_operad import *; demo_variant('{{variant}}')"

# Lint with ruff
uv-lint:
    uvx ruff check src/ lib/

# Format with ruff
uv-format:
    uvx ruff format src/

# Fix and format
uv-fix:
    uvx ruff check --fix src/ && uvx ruff format src/

# Run tests
uv-test:
    uvx pytest tests/ -v

# Type check
uv-typecheck:
    uvx mypy src/

# Full check (lint + format + test)
uv-check:
    uvx ruff check src/
    uvx ruff format --check src/
    uvx pytest tests/ -v
```

## Integration with Other Skills

### Triad: uv-discohy + acsets + gay-mcp = 0 ✓

| Skill | Trit | Role |
|-------|------|------|
| `uv-discohy` | 0 | Coordinator (toolchain) |
| `acsets` | 0 | Coordinator (schema) |
| `gay-mcp` | +1 | Generator (colors) |
| → Need `-1` | | Add `three-match` or `slime-lisp` |

### With DiscoHy Streams

```python
# From discohy-streams skill
color_url = f"color://{thread_id}/LIVE"
# Get color at index via MCP
```

### With ACSets

```julia
# Thread operad as ACSet
@present SchThreadOperad(FreeSchema) begin
  Thread::Ob
  continuation::Hom(Thread, Thread)
  Trit::AttrType
  trit::Attr(Thread, Trit)
end
```

## Environment Variables

```bash
# UV cache directory (optional)
export UV_CACHE_DIR=~/.cache/uv

# Ruff cache (optional)
export RUFF_CACHE_DIR=~/.cache/ruff

# Python version (optional)
export UV_PYTHON=3.12
```

## Troubleshooting

### UV Not Found

```bash
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Or via pip
pip install uv
```

### Ruff Errors

```bash
# Show all available rules
uvx ruff linter

# Ignore specific rule
uvx ruff check --ignore E501 src/
```

### Hy Not Found

```bash
# Install hy via uv
uv pip install hy>=1.0.0

# Run hy file
uv run hy lib/discohy_thread_operad.hy
```

## References

- [UV Documentation](https://docs.astral.sh/uv/)
- [Ruff Documentation](https://docs.astral.sh/ruff/)
- [DisCoPy](https://discopy.readthedocs.io/)
- [Hy Language](https://docs.hylang.org/)
- [DuckDB](https://duckdb.org/docs/)

---

**Skill Name**: uv-discohy
**Type**: Python Toolchain / DiscoHy Integration
**Trit**: 0 (ERGODIC)
**Toolchain**: uv + uvx + ruff
**Package Format**: pyproject.toml + hatchling

Overview

This skill integrates the uv/uvx/ruff toolchain with the DiscoHy Thread Operad Python package to provide fast dependency management, one-shot tool execution, linting/formatting, and packaging. It streamlines development workflows for the music-topos/discohy_thread_operad project using pyproject.toml and hatchling. The bundle is production-ready and optimized for repeatable demos, tests, and CI tasks.

How this skill works

The skill supplies Justfile targets and examples that run uv to create virtual environments, install dependencies, and execute project scripts. uvx is used to run tools like ruff and pytest without installing them into the environment. Ruff configuration is embedded in pyproject.toml so linting and formatting follow a single source of truth. The Python API exposes utilities to build operads from thread lists, switch operad variants, inspect GF(3) conservation, and emit Mermaid diagrams.

When to use it

  • Setting up a reproducible development environment quickly with uv
  • Running one-off tools (ruff, pytest) without permanent installs using uvx
  • Automating lint, format, test, and packaging steps in CI or locally
  • Working with DiscoHy Thread Operad Python APIs and demos
  • Packaging the project via pyproject.toml and hatchling

Best practices

  • Use uv venv and uv pip sync pyproject.toml to keep deps deterministic
  • Run uvx ruff check --fix and uvx ruff format in pre-commit or CI for consistent style
  • Prefer uvx for tool execution in CI to avoid global installs
  • Keep line-length and lint rules in pyproject.toml to ensure uniform behavior across environments
  • Test operad variants with small thread lists before running full demos

Example use cases

  • Initialize the project environment and run the DiscoHy demo with just uv-init and just uv-discohy
  • Add or sync dependencies quickly with uv pip install and uv pip sync
  • Run linting and auto-fixes: just uv-lint, just uv-format, or just uv-fix
  • Execute tests with uvx pytest through just uv-test in CI
  • Build operad visuals by calling build_operad_from_threads and operad_to_mermaid in scripts

FAQ

Do I need to install uv and uvx globally?

You only need uv installed once on the machine; uvx is provided by the uv tool. Use the provided install script or pip install uv if needed.

How do I run ruff without modifying the environment?

Use uvx ruff check src/ or uvx ruff format src/ to run ruff in one-shot mode without installing it into the venv.