Skip to content

Contributing to Trinity ​

Thank you for considering contributing to Trinity! This document provides guidelines for development setup, code standards, and contribution workflow.

Development Setup ​

Prerequisites ​

  • Python >= 3.10 (3.12 recommended)
  • Poetry >= 1.6 for dependency management
  • Node.js >= 18 (for documentation site only)
  • Docker Desktop >= 24.0 (optional, for containerized development)
  • LM Studio >= 0.2.0 with Qwen 2.5 Coder model (optional, for LLM features)

Dependency Management ​

Trinity uses two separate dependency systems:

  1. Python (Poetry) - Core application and ML models

    • pyproject.toml - Source of truth for Python dependencies
    • requirements.txt - Generated from Poetry for Docker/CI compatibility
  2. Node.js (npm) - Documentation site only (VitePress)

    • package.json - Documentation tooling (build/preview docs/)
    • Not used for the core Trinity application

Why both? The Python app is the product. Node.js is only for building/previewing the VitePress documentation site.

Local Installation ​

bash
# Clone repository
git clone https://github.com/fabriziosalmi/trinity.git
cd trinity

# Install Python dependencies with Poetry
poetry install

# Activate virtual environment
poetry shell

# Verify installation
trinity --version

# (Optional) Install npm deps only if working on docs/
npm install  # Only needed for VitePress documentation

Environment Configuration ​

Create .env file in project root:

bash
# LLM Configuration (optional)
LM_STUDIO_URL=http://localhost:1234/v1
LM_STUDIO_MODEL=qwen2.5-coder-7b-instruct

# Logging
LOG_LEVEL=INFO

# Output paths (defaults shown)
OUTPUT_DIR=output
DATA_DIR=data
MODELS_DIR=models

Code Quality Standards ​

This project enforces Anti-Vibecoding Rules - a strict engineering discipline documented in the codebase. Key principles:

Rule Compliance ​

  • Rule #6: Security-first design (never load untrusted pickle files)
  • Rule #7: Explicit error handling (no silent failures)
  • Rule #8: No magic numbers (all constants named and documented)
  • Rule #13: Don't hack sys.path (use proper package structure)
  • Rule #18: Use proper package imports
  • Rule #28: Structured logging (JSON-compatible metadata)
  • Rule #30: Testable design (small, pure functions)

Code Style ​

bash
# Format code with Black (line length 100)
poetry run black src/ scripts/ --line-length 100

# Sort imports
poetry run isort src/ scripts/

# Type checking (optional but recommended)
poetry run mypy src/

Documentation Standards ​

  • Docstrings: Google style for all public functions/classes
  • Type Hints: Required for all function signatures
  • Comments: Explain "why", not "what" (code should be self-documenting)
  • No TODO comments: Move tasks to GitHub Issues instead

Example:

python
def predict_layout_risk(
    content_len: int,
    theme: str,
    active_strategy: str
) -> float:
    """
    Predict probability of layout breakage before rendering.
    
    Uses trained Random Forest classifier to estimate failure risk
    based on content metrics and CSS configuration. Risk > 0.7
    triggers pre-emptive healing strategies.
    
    Args:
        content_len: Character count of input content
        theme: Tailwind theme name (e.g., "brutalist", "enterprise")
        active_strategy: Current healing strategy being applied
        
    Returns:
        Probability of layout failure (0.0-1.0)
        
    Raises:
        ModelNotFoundError: If no trained model exists in models/
        
    Example:
        >>> risk = predict_layout_risk(500, "brutalist", "NONE")
        >>> if risk > 0.7:
        ...     apply_preventive_healing()
    """

Testing ​

Run Tests ​

bash
# Run full test suite (when implemented)
poetry run pytest

# Run specific test file
poetry run pytest tests/test_engine.py

# Run with coverage
poetry run pytest --cov=src --cov-report=html

Manual Testing ​

bash
# Test ML pipeline end-to-end
bash scripts/fast_training.sh

# Test theme generation
poetry run trinity theme-gen "Cyberpunk neon city" --name cyberpunk

# Test chaos mode (intentional failures)
poetry run trinity chaos --theme brutalist

Contribution Workflow ​

1. Create Feature Branch ​

bash
git checkout -b feature/your-feature-name
# or
git checkout -b fix/bug-description

2. Make Changes ​

  • Follow code quality standards above
  • Add tests for new features
  • Update documentation if changing behavior

3. Commit Standards ​

Use Conventional Commits:

bash
feat: Add ONNX export for ML models
fix: Resolve pickle security warning in trainer
docs: Update CLI reference for theme-gen command
refactor: Extract theme validation to separate module
test: Add unit tests for LayoutRiskPredictor

Commit message format:

<type>: <subject>

<body (optional)>

<footer (optional)>

Types: feat, fix, docs, refactor, test, chore, perf

4. Push and Create Pull Request ​

bash
git push origin feature/your-feature-name

Open PR on GitHub with:

  • Clear description of changes
  • Link to related issue (if applicable)
  • Screenshots/logs for visual changes
  • Checklist of completed items

5. Code Review ​

All PRs require:

  • Passing CI checks (when implemented)
  • Code review from maintainer
  • No merge conflicts with main
  • Updated documentation

Project Structure ​

trinity/
├── src/trinity/              # Core package
│   ├── components/           # ML models, builders, healers
│   ├── cli.py               # CLI entry point
│   ├── config.py            # Configuration management
│   └── engine.py            # Main orchestration logic
├── scripts/                  # Automation scripts
│   ├── mass_theme_generator.py
│   ├── fast_training.sh
│   └── nightly_training.sh
├── data/                     # Training datasets
├── models/                   # Trained ML models (.pkl)
├── output/                   # Generated HTML files
├── config/                   # Theme definitions (JSON/YAML)
├── library/                  # Jinja2 templates
│   ├── atoms/
│   ├── molecules/
│   ├── organisms/
│   └── templates/
├── docs/                     # Architecture documentation
├── tests/                    # Unit and integration tests
└── main.py                   # Legacy entry point (use CLI instead)

Release Process ​

Releases are managed by project maintainers:

  1. Update version in pyproject.toml
  2. Update CHANGELOG.md (Keep a Changelog format)
  3. Create git tag: git tag -a v0.5.0 -m "Release v0.5.0: Feature description"
  4. Push tag: git push origin v0.5.0
  5. GitHub Actions automatically builds and publishes (when configured)

Support and Communication ​

License ​

By contributing, you agree that your contributions will be licensed under the MIT License.


Bus Factor: Currently 1 (primary maintainer). Deployment and release knowledge is documented in this file to reduce risk.

Released under the MIT License.