Files
stack/skills/mosaic-jarvis/SKILL.md
Jason Woltje 2ee7206c3a
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
feat: mosaic-* skill naming, new board/forge/prdy skills, doctor --fix auto-wiring
Skills:
- Rename all repo skills to mosaic-<name> convention (jarvis -> mosaic-jarvis, etc.)
- Update frontmatter name: fields to match directory names
- New mosaic-board skill: standalone Board of Directors multi-persona review
- New mosaic-forge skill: standalone Forge specialist pipeline
- New mosaic-prdy skill: PRD lifecycle (init/update/validate/status)

Wizard (packages/mosaic):
- Add mosaic-board, mosaic-forge, mosaic-prdy, mosaic-standards, mosaic-macp
  to RECOMMENDED_SKILLS
- Add new skills to SKILL_CATEGORIES for categorized browsing

Framework scripts (~/.config/mosaic/bin):
- mosaic (launcher): load skills from both skills/ and skills-local/ for Pi
- mosaic-doctor: add --fix flag for auto-wiring skills into all harnesses,
  Pi skill dir checks, Pi settings.json validation, mosaic-* presence checks
- mosaic-sync-skills: add Pi as 4th link target, fix find to follow symlinks
  in skills-local/, harden is_mosaic_skill_name() with -L fallback
- mosaic-link-runtime-assets: add Pi settings.json skills path patching,
  remove duplicate extension copy (launcher --extension is single source)
- mosaic-migrate-local-skills: add Pi to skill_roots, fix find for symlinks

YAML fixes:
- Quote description values containing colons in mosaic-deploy and
  mosaic-woodpecker SKILL.md frontmatter (fixes Pi parse errors)
2026-04-01 12:28:36 -05:00

4.5 KiB

name, description
name description
mosaic-jarvis Jarvis Platform development context. Use when working on the jetrich/jarvis repository. Provides architecture knowledge, coding patterns, and component locations.

Jarvis Platform Development

Project Overview

Jarvis is a self-hosted AI assistant platform built with:

  • Backend: FastAPI (Python 3.11+)
  • Frontend: Next.js 14+ (App Router)
  • Database: PostgreSQL with pgvector
  • Plugins: Modular LLM providers and integrations

Repository: jetrich/jarvis


Architecture

jarvis/
├── apps/
│   ├── api/                 # FastAPI backend
│   │   └── src/
│   │       ├── routes/      # API endpoints
│   │       ├── services/    # Business logic
│   │       ├── models/      # SQLAlchemy models
│   │       └── core/        # Config, deps, security
│   └── web/                 # Next.js frontend
│       └── src/
│           ├── app/         # App router pages
│           ├── components/  # React components
│           └── lib/         # Utilities
├── packages/
│   └── plugins/             # jarvis_plugins package
│       └── jarvis_plugins/
│           ├── llm/         # LLM providers (ollama, claude, etc.)
│           └── integrations/# External integrations
├── docs/
│   └── scratchpads/         # Agent working docs
└── scripts/                 # Utility scripts

Key Patterns

LLM Provider Pattern

All LLM providers implement BaseLLMProvider:

# packages/plugins/jarvis_plugins/llm/base.py
class BaseLLMProvider(ABC):
    @abstractmethod
    async def generate(self, prompt: str, **kwargs) -> str: ...

    @abstractmethod
    async def stream(self, prompt: str, **kwargs) -> AsyncIterator[str]: ...

Integration Pattern

External integrations (GitHub, Calendar, etc.) follow:

# packages/plugins/jarvis_plugins/integrations/base.py
class BaseIntegration(ABC):
    @abstractmethod
    async def authenticate(self, credentials: dict) -> bool: ...

    @abstractmethod
    async def execute(self, action: str, params: dict) -> dict: ...

API Route Pattern

FastAPI routes use dependency injection:

@router.get("/items")
async def list_items(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
    service: ItemService = Depends(get_item_service)
):
    return await service.list(db, current_user.id)

Frontend Component Pattern

Use shadcn/ui + server components by default:

// Server component (default)
export default async function DashboardPage() {
  const data = await fetchData();
  return <Dashboard data={data} />;
}

// Client component (when needed)
('use client');
export function InteractiveWidget() {
  const [state, setState] = useState();
  // ...
}

Database

  • ORM: SQLAlchemy 2.0+
  • Migrations: Alembic
  • Vector Store: pgvector extension

Creating Migrations

cd apps/api
alembic revision --autogenerate -m "description"
alembic upgrade head

Testing

Backend

cd apps/api
pytest
pytest --cov=src

Frontend

cd apps/web
npm test
npm run test:e2e

Quality Commands

# Backend
cd apps/api
ruff check .
ruff format .
mypy src/

# Frontend
cd apps/web
npm run lint
npm run typecheck
npm run format

Active Development Areas

Issue Feature Priority
#84 Per-function LLM routing High
#85 Embedded E2E autonomous delivery loop High
#86 Thinking models (CoT UI) Medium
#87 Local image generation Medium
#88 Deep research mode Medium
#89 Uncensored models + alignment Medium
#90 OCR capabilities Medium
#91 Authentik SSO Medium
#40 Claude Max + Claude Code High

Environment Setup

# Backend
cd apps/api
cp .env.example .env
pip install -e ".[dev]"

# Frontend
cd apps/web
cp .env.example .env.local
npm install

# Database
docker-compose up -d postgres
alembic upgrade head

Commit Convention

<type>(#issue): Brief description

Detailed explanation if needed.

Fixes #123

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