- Create ~/.config/mosaic/AGENTS.md as the canonical universal agent config - Runtime adapters (CLAUDE.md, opencode/AGENTS.md, codex/instructions.md) are now thin pointers that say "READ ~/.config/mosaic/AGENTS.md" - mosaic claude: injects AGENTS.md via --append-system-prompt - mosaic opencode/codex: copies AGENTS.md to runtime config path before launch - mosaic-link-runtime-assets: pushes thin pointers for direct launch fallback AGENTS.md is runtime-agnostic. All runtimes get the same standards. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
22 KiB
Mosaic Global Agent Standards
This is the universal agent configuration file for the Mosaic framework. It applies to ALL agent sessions regardless of runtime (Claude, Codex, OpenCode, etc.).
Canonical location: ~/.config/mosaic/AGENTS.md
MANDATORY — Read Before Any Response
BEFORE responding to any user message, READ these files in order:
~/.config/mosaic/SOUL.md(identity and behavioral contract)~/.config/mosaic/STANDARDS.md(machine-wide standards)- Project-local
AGENTS.md(project operations and workflows)
Do NOT respond to the user until you have loaded all three.
Universal Development Standards
Core Principles
- Think critically. Don't just agree—suggest better approaches when appropriate.
- Quality over speed. No workarounds; implement proper solutions.
- No deprecated or unsupported packages.
Skills System
Skills are available in ~/.config/mosaic/skills/. Skills are instruction packages that provide domain expertise from mosaic/agent-skills plus local Mosaic skills.
Load a skill by reading its SKILL.md:
Read ~/.config/mosaic/skills/<skill-name>/SKILL.md
Skill Dispatch Table — Load the right skills for your task
| Task Type | Skills to Load | Notes |
|---|---|---|
| NestJS development | nestjs-best-practices |
40 rules, 10 categories |
| Next.js / React | next-best-practices, vercel-react-best-practices |
RSC, async, performance |
| React components | vercel-composition-patterns, shadcn-ui |
shadcn note: uses Tailwind v4 |
| Vue / Nuxt | vue-best-practices, nuxt, pinia, vue-router-best-practices |
antfu conventions |
| Vite / Vitest | vite, vitest |
Build + test tooling |
| FastAPI / Python | fastapi, python-performance-optimization |
Pydantic v2, async SQLAlchemy |
| Architecture | architecture-patterns |
Clean, Hexagonal, DDD |
| Authentication | better-auth-best-practices, email-and-password-best-practices, two-factor-authentication-best-practices |
Better-Auth patterns |
| UI / Styling | tailwind-design-system, ui-animation, web-design-guidelines |
Tailwind v4 |
| Frontend design | frontend-design, brand-guidelines, canvas-design |
Design principles |
| TDD / Testing | test-driven-development, webapp-testing, vue-testing-best-practices |
Red-Green-Refactor |
| Linting | lint |
Zero-tolerance — detect linter, fix ALL violations, never disable rules |
| Code review | pr-reviewer, code-review-excellence, verification-before-completion |
Platform-aware (Gitea/GitHub) |
| Debugging | systematic-debugging |
Structured methodology |
| Git workflow | finishing-a-development-branch, using-git-worktrees |
Branch + worktree patterns |
| Document generation | pdf, docx, pptx, xlsx |
LibreOffice-based |
| Writing / Comms | doc-coauthoring, internal-comms, copywriting, copy-editing |
|
| Marketing | marketing-ideas, content-strategy, social-content, email-sequence |
139 ideas across 14 categories |
| SEO | seo-audit, programmatic-seo, schema-markup |
Technical + content SEO |
| CRO / Conversion | page-cro, form-cro, signup-flow-cro, onboarding-cro |
Conversion optimization |
| Pricing / Business | pricing-strategy, launch-strategy, competitor-alternatives |
SaaS focus |
| Ads / Growth | paid-ads, analytics-tracking, ab-test-setup, referral-program |
|
| Agent building | create-agent, ai-sdk, proactive-agent, dispatching-parallel-agents |
WAL Protocol, parallel workers |
| Agent workflow | executing-plans, writing-plans, brainstorming |
Plan → execute |
| Skill authoring | writing-skills, skill-creator |
TDD-based skill creation |
| MCP servers | mcp-builder |
Model Context Protocol |
| Generative art | algorithmic-art, theme-factory, slack-gif-creator |
|
| Web artifacts | web-artifacts-builder |
Self-contained HTML |
| CI/CD setup | setup-cicd |
Docker build/push pipeline |
| Jarvis Brain | jarvis |
Brain repo context |
| PRD creation | prd |
Generate PRDs |
| Ralph development | ralph |
Autonomous dev agent |
| Orchestration | kickstart |
/kickstart [milestone|issue|task] — launches orchestrator |
For Orchestrator / Programmatic Workers
When spawning workers, include skill loading in the kickstart:
claude -p "Read ~/.config/mosaic/skills/nestjs-best-practices/SKILL.md then implement..."
codex exec "Read ~/.config/mosaic/skills/nestjs-best-practices/SKILL.md then implement..."
For Ralph prd.json stories, add a skills field:
{ "id": "US-001", "skills": ["nestjs-best-practices", "test-driven-development"], ... }
Fresh Machine Setup
npx skills add https://git.mosaicstack.dev/mosaic/agent-skills.git --agent claude-code
Ralph Autonomous Development
For autonomous feature development, use the Ralph pattern. Each iteration is a fresh context with persistent memory.
The Ralph Loop
1. Read prd.json → Find highest priority story where passes: false
2. Read progress.txt → Check "Codebase Patterns" section first
3. Read AGENTS.md files → Check directory-specific patterns
4. Implement ONLY the single assigned story
5. Run quality checks (typecheck, lint, test)
6. Commit ONLY if all checks pass
7. Update prd.json → Set passes: true for completed story
8. Append learnings to progress.txt
9. Update AGENTS.md if reusable patterns discovered
10. Loop → Next story
Memory Files
| File | Purpose | Location |
|---|---|---|
prd.json |
Task list with passes: true/false | Project root or scripts/ralph/ |
progress.txt |
Learnings between iterations | Same as prd.json |
AGENTS.md |
Directory-specific patterns | Any directory in repo |
Running Ralph
# Automated loop
./scripts/ralph/ralph.sh 10
# Manual single story
claude -p "Implement US-001 from prd.json following Ralph pattern"
Creating New Features
- Create PRD:
Load the prd skill and create a PRD for [feature] - Convert to Ralph:
Load the ralph skill and convert tasks/prd-[name].md to prd.json - Run Ralph:
./scripts/ralph/ralph.sh
For full Ralph guide: ~/.config/mosaic/guides/ralph-autonomous.md
Project-Local AGENTS.md Pattern
Each directory can have an AGENTS.md file containing patterns specific to that area of the codebase. Always check for and read AGENTS.md files in directories you're working in.
# Example AGENTS.md
## Codebase Patterns
- Use `httpx.AsyncClient` for external HTTP calls
- All routes require authentication via `Depends(get_current_user)`
## Common Gotchas
- Remember to run migrations after schema changes
- Frontend env vars need NEXT_PUBLIC_ prefix
Update AGENTS.md when you discover:
- Reusable patterns
- Non-obvious requirements
- Gotchas that would trip up future agents
- Testing approaches for that area
Project Bootstrapping
When starting work on a new project that lacks an AGENTS.md, bootstrap it:
# Automated (recommended)
~/.config/mosaic/rails/bootstrap/init-project.sh --name "Project Name" --type auto
# Or manually with templates
export PROJECT_NAME="Project Name" PROJECT_DESCRIPTION="What it does" TASK_PREFIX="PN"
envsubst < ~/.config/mosaic/templates/agent/AGENTS.md.template > AGENTS.md
Available project types: nestjs-nextjs, django, typescript, python-fastapi, python-library, generic (auto-detected from project files).
Templates: ~/.config/mosaic/templates/agent/ (generic) and ~/.config/mosaic/templates/agent/projects/<type>/ (tech-stack specific).
Fragments: ~/.config/mosaic/templates/agent/fragments/ — Reusable sections (conditional-loading, commit-format, secrets, multi-agent, code-review).
Full guide: ~/.config/mosaic/guides/bootstrap.md
Agent Configuration Health
# Audit all projects for missing AGENTS.md, agent-guide references
~/.config/mosaic/rails/bootstrap/agent-lint.sh
# Audit with fix suggestions
~/.config/mosaic/rails/bootstrap/agent-lint.sh --verbose --fix-hint
# Non-destructively upgrade existing projects (inject missing sections)
~/.config/mosaic/rails/bootstrap/agent-upgrade.sh --all --dry-run # Preview
~/.config/mosaic/rails/bootstrap/agent-upgrade.sh --all # Apply
# Upgrade a single project
~/.config/mosaic/rails/bootstrap/agent-upgrade.sh ~/src/my-project
Spec: ~/.config/mosaic/templates/agent/SPEC.md — Defines Tier 1/2/3 requirements for well-configured projects.
Issue Tracking (Git-Based)
All work is tracked as issues in the project's git repository (Gitea or GitHub).
Workflow
- Check for assigned issues before starting work
- Create scratchpad:
docs/scratchpads/{issue-number}-{short-name}.md - Reference issues in commits:
Fixes #123orRefs #123 - Close issues only after successful testing
Labels
Use consistent labels across projects:
epic- Large feature spanning multiple issuesfeature- New functionalitybug- Defect fixtask- General work itemdocumentation- Docs updatessecurity- Security-relatedbreaking- Breaking change
Milestones & Versioning
- Each feature gets a dedicated milestone
- MVP starts at
0.1.0 - Pre-release:
0.X.0for breaking changes,0.X.Yfor patches - Post-release:
X.0.0for breaking changes
Git Scripts (PREFERRED for Gitea/GitHub operations)
Cross-platform helpers at ~/.config/mosaic/rails/git/ (work with both Gitea and GitHub):
Why use these scripts?
- Auto-detect platform (Gitea vs GitHub)
- Abstract CLI syntax differences (tea vs gh)
- Handle milestone name filtering for Gitea
- Consistent interface across all repos
Issues:
~/.config/mosaic/rails/git/issue-create.sh -t "Title" -l "label" -m "0.2.0"
~/.config/mosaic/rails/git/issue-list.sh -s open -l "bug"
~/.config/mosaic/rails/git/issue-list.sh -m "M6-AgentOrchestration"
~/.config/mosaic/rails/git/issue-view.sh -i 42
~/.config/mosaic/rails/git/issue-edit.sh -i 42 -t "New Title" -l "labels"
~/.config/mosaic/rails/git/issue-assign.sh -i 42 -a "username"
~/.config/mosaic/rails/git/issue-comment.sh -i 42 -c "Comment text"
~/.config/mosaic/rails/git/issue-close.sh -i 42 [-c "Closing comment"]
~/.config/mosaic/rails/git/issue-reopen.sh -i 42 [-c "Reopening reason"]
Pull Requests:
~/.config/mosaic/rails/git/pr-create.sh -t "Title" -b "Description" -i 42
~/.config/mosaic/rails/git/pr-create.sh -t "Title" -B main -H feature-branch
~/.config/mosaic/rails/git/pr-list.sh -s open
~/.config/mosaic/rails/git/pr-view.sh -n 42
~/.config/mosaic/rails/git/pr-review.sh -n 42 -a approve [-c "LGTM"]
~/.config/mosaic/rails/git/pr-review.sh -n 42 -a request-changes -c "Fix X"
~/.config/mosaic/rails/git/pr-merge.sh -n 42 -m squash -d
~/.config/mosaic/rails/git/pr-close.sh -n 42 [-c "Closing reason"]
~/.config/mosaic/rails/git/pr-diff.sh -n 42 [-o diff.patch]
~/.config/mosaic/rails/git/pr-metadata.sh -n 42 [-o metadata.json]
Milestones:
~/.config/mosaic/rails/git/milestone-create.sh -t "0.2.0" -d "Description"
~/.config/mosaic/rails/git/milestone-create.sh --list
~/.config/mosaic/rails/git/milestone-list.sh [-s open|closed|all]
~/.config/mosaic/rails/git/milestone-close.sh -t "0.2.0"
NOTE: These scripts handle the Gitea --milestones (plural) syntax automatically. Always prefer these over raw tea or gh commands.
Woodpecker CI CLI
Official CLI for interacting with Woodpecker CI at ci.mosaicstack.dev.
Setup:
# Install (Arch)
paru -S woodpecker
# Configure
export WOODPECKER_SERVER="https://ci.mosaicstack.dev"
export WOODPECKER_TOKEN="your-token" # Get from ci.mosaicstack.dev/user
Pipelines:
woodpecker pipeline ls <owner/repo> # List pipelines
woodpecker pipeline info <owner/repo> <num> # Pipeline details
woodpecker pipeline create <owner/repo> # Trigger pipeline
woodpecker pipeline stop <owner/repo> <num> # Cancel pipeline
woodpecker pipeline start <owner/repo> <num> # Restart pipeline
woodpecker pipeline approve <owner/repo> <num> # Approve blocked
Logs:
woodpecker log show <owner/repo> <num> # View logs
woodpecker log show <owner/repo> <num> <step> # Specific step
Repositories:
woodpecker repo ls # List repos
woodpecker repo add <owner/repo> # Activate for CI
woodpecker repo rm <owner/repo> # Deactivate
woodpecker repo repair <owner/repo> # Repair webhooks
Secrets:
woodpecker secret ls <owner/repo> # List secrets
woodpecker secret add <owner/repo> -n KEY -v val # Add secret
woodpecker secret rm <owner/repo> -n KEY # Delete secret
Full reference: jarvis-brain/docs/reference/woodpecker/WOODPECKER-CLI.md
Setup command: woodpecker setup --server https://ci.mosaicstack.dev --token "YOUR_TOKEN"
Portainer Scripts
CLI tools for managing Portainer stacks at ~/.config/mosaic/rails/portainer/.
Setup:
export PORTAINER_URL="https://portainer.example.com:9443"
export PORTAINER_API_KEY="your-api-key-here"
Create an API key in Portainer: My account → Access tokens → Add access token.
Stack Management:
stack-list.sh # List all stacks
stack-list.sh -f json # JSON format
stack-list.sh -e 1 # Filter by endpoint
stack-status.sh -n mystack # Show stack status
stack-status.sh -n mystack -f json # JSON format
stack-redeploy.sh -n mystack # Redeploy stack
stack-redeploy.sh -n mystack -p # Pull latest images
stack-start.sh -n mystack # Start inactive stack
stack-stop.sh -n mystack # Stop running stack
Logs:
stack-logs.sh -n mystack # List services
stack-logs.sh -n mystack -s webapp # View service logs
stack-logs.sh -n mystack -s webapp -t 200 # Last 200 lines
stack-logs.sh -n mystack -s webapp -f # Follow logs
Endpoints:
endpoint-list.sh # List all endpoints
endpoint-list.sh -f json # JSON format
Common Workflow (CI/CD redeploy):
~/.config/mosaic/rails/portainer/stack-redeploy.sh -n myapp -p && \
~/.config/mosaic/rails/portainer/stack-status.sh -n myapp && \
~/.config/mosaic/rails/portainer/stack-logs.sh -n myapp -s api -t 50
Git Worktrees
Use worktrees for parallel work on multiple issues without branch switching.
Structure:
{project_name}_worktrees/{issue-name}/
Example:
~/src/my-app/ # Main repository
~/src/my-app_worktrees/
├── 42-fix-login/ # Worktree for issue #42
├── 57-add-dashboard/ # Worktree for issue #57
└── 89-refactor-auth/ # Worktree for issue #89
Commands:
# Create worktree for an issue
git worktree add ../my-app_worktrees/42-fix-login -b issue-42-fix-login
# List active worktrees
git worktree list
# Remove worktree after merge
git worktree remove ../my-app_worktrees/42-fix-login
When to use worktrees:
- Working on multiple issues simultaneously
- Long-running feature branches that need isolation
- Code reviews while continuing other work
- Comparing implementations across branches
Development Requirements
Test-Driven Development (TDD)
- Write tests BEFORE implementation
- Minimum 85% coverage
- Build and test after EVERY change
- Task completion requires passing tests
Linting (MANDATORY)
Run the project linter after every code change. Fix ALL violations. Zero tolerance.
- Never disable lint rules (
eslint-disable,noqa,nolint) - Never leave warnings — warnings are errors you haven't fixed yet
- If you touched a file, you own its lint violations (Campsite Rule)
- If unsure what linter the project uses, read the
lintskill:~/.config/mosaic/skills/lint/SKILL.md
Code Style
Follow Google Style Guides for all languages.
Commits
<type>(#issue): Brief description
Detailed explanation if needed.
Fixes #123
Types: feat, fix, docs, test, refactor, chore
Scratchpad Format
When working on issue #N, create docs/scratchpads/N-short-name.md:
# Issue #N: Title
## Objective
[What this issue accomplishes]
## Approach
[Implementation plan]
## Progress
- [ ] Step 1
- [ ] Step 2
## Testing
[Test plan and results]
## Notes
[Findings, blockers, decisions]
Conditional Context
Read the relevant guide before starting work:
| Task Type | Guide |
|---|---|
| Bootstrapping a new project | ~/.config/mosaic/guides/bootstrap.md |
| Orchestrating autonomous task completion | ~/.config/mosaic/guides/orchestrator.md |
| Ralph autonomous development | ~/.config/mosaic/guides/ralph-autonomous.md |
| Frontend development | ~/.config/mosaic/guides/frontend.md |
| Backend/API development | ~/.config/mosaic/guides/backend.md |
| Code review | ~/.config/mosaic/guides/code-review.md |
| Authentication/Authorization | ~/.config/mosaic/guides/authentication.md |
| CI/CD pipelines & Docker builds | ~/.config/mosaic/guides/ci-cd-pipelines.md |
| Infrastructure/DevOps | ~/.config/mosaic/guides/infrastructure.md |
| QA/Testing | ~/.config/mosaic/guides/qa-testing.md |
| Secrets management | See section below |
Project-specific skills:
| Project | Skill |
|---|---|
| jetrich/jarvis | ~/.config/mosaic/skills/jarvis/SKILL.md |
Secrets Management
NEVER hardcode secrets in the codebase. Choose the appropriate method based on your environment.
If Using Vault
See ~/.config/mosaic/guides/vault-secrets.md for the canonical structure and rules.
Quick reference:
{mount}/{service}/{component}/{secret-name}
Example: secret-prod/postgres/database/app
If NOT Using Vault (Use .env Files)
Structure:
project-root/
├── .env.example # Template with placeholder values (committed)
├── .env # Local secrets (NEVER committed)
├── .env.development # Dev overrides (optional, not committed)
├── .env.test # Test environment (optional, not committed)
└── .gitignore # Must include .env*
Rules:
- ALWAYS add
.env*to.gitignore(except.env.example) - Create
.env.examplewith all required variables and placeholder values - Use descriptive variable names:
DATABASE_URL,API_SECRET_KEY - Document required variables in README
- Load via
dotenvor framework-native methods
.env.example template:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
DATABASE_POOL_SIZE=10
# Authentication
JWT_SECRET_KEY=your-secret-key-here
JWT_EXPIRY_SECONDS=3600
# External APIs
STRIPE_API_KEY=sk_test_xxx
SENDGRID_API_KEY=SG.xxx
# App Config
APP_ENV=development
DEBUG=false
Loading secrets:
# Python
from dotenv import load_dotenv
load_dotenv()
# Node.js
import 'dotenv/config';
# Or use framework-native (Next.js, NestJS, etc.)
Security Rules (All Environments)
- Never commit secrets - Use .env or Vault
- Never log secrets - Mask in logs if needed
- Rotate compromised secrets immediately
- Use different secrets per environment
- Validate secrets exist at startup - Fail fast if missing
Multi-Agent Coordination
When launching concurrent agents:
nohup claude -p "<instruction>" > logs/agent-{name}.log 2>&1 &
- Maximum 10 simultaneous agents
- Monitor for errors and permission issues
- Restart failed agents after fixing issues
For Ralph multi-agent:
- Use worktrees for isolation
- Each agent works on different story
- Coordinate via git (frequent pulls)
Dev Server Infrastructure (web1.corp.uscllc.local)
Shared Traefik Reverse Proxy
A shared Traefik instance handles routing for all dev/test services on this server.
Location: ~/src/traefik
Start Traefik:
cd ~/src/traefik
docker compose up -d
Dashboard: http://localhost:8080
Connecting Services to Traefik
Add to your service's docker-compose.yml:
services:
app:
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.uscllc.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls=true"
- "traefik.http.services.myapp.loadbalancer.server.port=3000"
networks:
- internal
- traefik-public
networks:
internal:
driver: bridge
traefik-public:
external: true
Note: Uses self-signed wildcard cert - browsers will show security warning.
Active Dev Services
| Service | Domain | Repository |
|---|---|---|
| Inventory Stickers | inventory.uscllc.com | ~/src/sticker-app |
Project Structure
project-root/
├── AGENTS.md # Codebase patterns for AI agents
├── docs/
│ └── scratchpads/ # Agent working documents
│ └── {issue#}-{name}.md
├── scripts/
│ └── ralph/ # Ralph autonomous development
│ ├── ralph.sh # Loop script
│ ├── prd.json # Current feature tasks
│ └── progress.txt # Memory between iterations
├── tasks/ # PRD documents
│ └── prd-{feature}.md
├── logs/ # Log files
└── tests/ # Test files