Contributing to OpenPets 🐾
Welcome to the OpenPets pet shelter! We're thrilled you want to help us breed new pets and improve our ecosystem. This guide will help you get started contributing to our friendly community.
Our Pet-Themed Philosophy
At OpenPets, we believe in making developer tools feel like companions rather than infrastructure. Our terminology reflects this:
- Plugins → Pets (they're our friends!)
- Installing → Adopting (give a pet a home)
- Creating → Breeding (bring new pets to life)
- Registry → Pet Shelter (where pets find families)
- Configuring → Training (teach your pet new tricks)
- Errors → Pet needs attention (gentle reminders)
Ways to Contribute 🏆
🐕 Breed New Pets
Create integrations for services you love! Check out the _TEMPLATE_ folder to get started.
# Start with our template
cd pets/
cp -r _TEMPLATE_ my-awesome-pet
cd my-awesome-pet
# Follow the setup guide in AGENTS.md🐾 Improve Existing Pets
Help train our current pets to be better companions:
- Fix bugs and improve reliability
- Add new features and capabilities
- Update documentation and examples
🏠 Improve the Pet Shelter
Enhance the core OpenPets experience:
- CLI improvements and new commands
- Desktop app features
- Documentation and guides
- Testing and validation tools
🎨 Design & Branding
Help us make OpenPets more delightful:
- Visual design and mascots
- Website improvements
- Community features like "Pet of the Month"
Getting Started 🚀
1. Set Up Your Environment
# Clone the repository
git clone https://github.com/your-org/openpets.git
cd openpets
# Install dependencies
bun install
# Install the CLI globally for development
npm link2. Explore the Codebase
pets/- Individual pet implementationssrc/core/- Core OpenPets frameworksrc/core/cli.ts- Primary CLI entrypointapps/desktop/- Tauri desktop applicationAGENTS.md- Detailed development guide
3. Run Tests
# Validate all pets
pets validate
# Test a specific pet
cd pets/my-pet
pets run my-pet
# Run scenarios
bun run test:scenarios my-petMaintenance and Recovery
Use the safe maintenance scripts first:
# Remove build artifacts only (safe default)
bun run clean
# Clean artifacts and re-sync dependencies
bun run resetIf you need a full dependency wipe (for lockfile corruption or deep workspace issues), use the explicit hard variants:
# Destructive cleanup (deletes all node_modules + lockfile)
bun run clean:hard
# Destructive cleanup plus reinstall
bun run reset:hardTips:
- Use
bun scripts/maintenance.ts <mode> --dry-runto preview affected paths. - Prefer
resetbeforereset:hard; hard mode is intended for recovery only. - If a hard reset fails mid-install, run
bun installagain from repo root.
Breeding New Pets 🐱
Pet Requirements
Every good pet needs:
- Health Check -
{pet-name}-test-connectiontool - Graceful Degradation - Work when not fully configured
- Proper Training - Clear error messages and logging
- Good Documentation - README, queries, and scenarios
Pet Anatomy
pets/my-pet/
├── index.ts # Main pet implementation
├── package.json # Pet metadata and configuration
├── README.md # Pet care guide
└── src/ # Additional pet logicNaming Conventions
- Use kebab-case for pet names:
my-awesome-pet - Tool names:
{pet-name}-{action}(e.g.,jira-list-issues) - Environment variables:
{PET_NAME}_API_KEY
Submitting Changes 📝
Commit Message Format
We use Conventional Commits enforced by commitlint:
<type>(<scope>): <subject>
[optional body]
[optional footer]Types:
| Type | Description |
|---|---|
feat | New feature |
fix | Bug fix |
docs | Documentation only |
style | Formatting, missing semicolons, etc. |
refactor | Code change that neither fixes nor adds |
perf | Performance improvement |
test | Adding or correcting tests |
chore | Maintenance tasks |
ci | CI/CD changes |
build | Build system changes |
pet | Pet-specific changes |
release | Release commits |
Examples:
# New feature for a pet
feat(jira): add bulk issue creation tool
# Bug fix in core
fix(core): resolve type export conflicts
# Documentation update
docs: add commit message guidelines
# Pet-specific change
pet(stripe): add subscription management
# CI/CD update
ci: switch all workflows to bunScope (optional but encouraged):
- Pet name:
jira,github,stripe - Package:
core,sdk,cli - Infrastructure:
ci,deps,scripts
Pull Request Process
- Fork the repository
- Create a descriptive branch:
feat/add-github-pet - Make your changes following our patterns
- Test thoroughly:bash
pets validate bun run lint bun run typecheck - Commit with conventional commit messages (enforced by hooks)
- Open a pull request with:
- A conventional PR title such as
feat(github): add issue search - A linked issue for non-docs work:
Closes #123orRelates to #123 - Clear testing or verification steps
- A conventional PR title such as
Issue First Policy
For most behavior changes, new features, and pet work, start with an issue first.
- Link the issue in your PR with
Fixes #123,Closes #123, orRelates to #123 - Small docs-only changes can usually skip the issue
- If you are unsure whether something belongs in OpenPets, open an issue before building it
PR Titles
PR titles should follow conventional commit style so they are easy to triage and easy to scan in changelogs.
feat:new functionalityfix:bug fixespet:pet-specific workdocs:documentation onlyrefactor:internal improvement without behavior changetest:new or updated testsci:workflow or automation changesperf:performance improvements
Scopes are optional but encouraged when they add clarity:
feat(jira): add bulk issue lookupfix(core): handle missing env loadingdocs(contributing): simplify issue policy
Good PR Descriptions
Keep PR descriptions short, specific, and written in your own words.
- Explain the problem and the change
- Explain how you verified it
- Include screenshots for UI or docs visuals when helpful
- Avoid long AI-generated walls of text
PR Template
Use our PR template (.github/pull_request_template.md) to keep PRs reviewable and searchable. If you are adding a brand new pet scaffold, use .github/PULL_REQUEST_TEMPLATE/new-pet-scaffold.md instead.
Code Style 🐾
TypeScript Guidelines
- Use
openpets-sdkimports, not direct dependencies - Follow existing patterns in similar pets
- Include proper error handling and logging
- Return JSON strings from all tools
Schema Requirements
Only use these Zod types (runtime compatibility limit):
- ✅
z.string(),z.number(),z.boolean() - ✅
z.array(z.string()),z.array(z.number()) - ✅
z.object({ field: z.string() }) - ✅
z.enum(["value1", "value2"]) - ❌ Nested objects in arrays
- ❌ Complex unions or records
For complex data, use JSON string serialization:
schema: z.object({
dataJson: z.string().describe("JSON string of complex data")
}),
execute(args) {
const data = JSON.parse(args.dataJson)
}Community Guidelines 🤝
Be Friendly and Welcoming
- Use pet-themed language when appropriate
- Help newcomers feel at home in our shelter
- Assume good intent and be patient
Communication
- Use GitHub Discussions for questions and conversations
- Use GitHub Issues for bug reports and feature requests
- Share your pet creations and success stories!
Recognition
- Contributors get special recognition in our releases
- Outstanding pet creators may be featured as "Pet of the Month"
- Help build the most delightful developer ecosystem
Getting Help 🆘
- Documentation: Check
AGENTS.mdfor detailed guides - Examples: Browse existing pets in the
pets/directory - Issues: Search existing issues before creating new ones
- Discussions: Use GitHub Discussions for questions
Release Process 📦
Pets are published by the scheduled/manual publish workflow after changes land on main:
- Merge pet changes to
main - Scheduled or manual publish workflow validation and testing
- Publication to npm as
@openpets/pet-name - npm visibility verification and registry update
Thank you for helping us make OpenPets the most delightful developer ecosystem! 🎉
Remember: In OpenPets, every contribution helps make our pet shelter a better home for developers and their digital companions.