Files
docs/MONOREPO_GOVERNANCE.md
2026-02-09 21:51:46 -08:00

255 lines
6.5 KiB
Markdown

# Monorepo Governance
**Last Updated**: 2025-01-27
**Purpose**: Guidelines for managing monorepositories in the workspace
---
## Overview
This document establishes governance guidelines for creating, managing, and maintaining monorepositories in the workspace.
---
## Decision Criteria
### When to Create a Monorepo
Create a monorepo when you have:
-**Multiple Related Projects**: Projects that share code, dependencies, or infrastructure
-**Shared Code Dependencies**: Common utilities, types, or libraries used across projects
-**Coordinated Releases**: Projects that need to be released together
-**Common Infrastructure**: Shared infrastructure, tooling, or configuration
-**Unified Development Workflow**: Team working across multiple related projects
**Do NOT create a monorepo for:**
- ❌ Unrelated projects with no shared code
- ❌ Projects with independent release cycles
- ❌ Projects with different technology stacks (unless using workspaces)
- ❌ Projects that will be open-sourced independently
---
## Monorepo Structure
### Standard Structure
```
monorepo-name/
├── .gitmodules # Git submodules (if using submodules)
├── packages/ # Shared packages
│ ├── shared/ # Common utilities
│ ├── types/ # TypeScript types
│ └── config/ # Configuration
├── apps/ # Applications
│ └── [app-name]/
├── tools/ # Development tools
│ └── [tool-name]/
├── docs/ # Monorepo documentation
├── infrastructure/ # Infrastructure as Code
├── scripts/ # Monorepo scripts
├── package.json # Root package.json
├── pnpm-workspace.yaml # pnpm workspace config
└── turbo.json # Turborepo config
```
---
## Submodules vs Packages
### Use Git Submodules When:
- ✅ External repositories need to be included
- ✅ Independent versioning is required
- ✅ Projects are maintained separately
- ✅ External contributors need access to individual repos
### Use Packages (Workspaces) When:
- ✅ Internal code that should be versioned together
- ✅ Unified versioning and releases
- ✅ Shared code that changes frequently
- ✅ Simplified dependency management
### Hybrid Approach
- Use submodules for external/existing projects
- Use packages for new shared code
- Migrate from submodules to packages over time
---
## Versioning Strategy
### Option 1: Independent Versioning
- Each package/submodule has its own version
- Useful for submodules
- Allows independent releases
### Option 2: Unified Versioning
- Single version for entire monorepo
- All packages versioned together
- Easier for coordinated releases
**Recommendation**: Start with independent, move to unified if needed.
---
## Package Manager & Tooling
### Standard Stack
- **Package Manager**: pnpm workspaces (recommended) or npm/yarn
- **Build Tool**: Turborepo (recommended) or Nx
- **Testing**: Vitest (TS/JS), Foundry (Solidity)
- **Linting**: ESLint + Prettier
### Configuration Files
- `pnpm-workspace.yaml` - Workspace configuration
- `turbo.json` - Turborepo pipeline configuration
- `package.json` - Root package.json with workspace scripts
---
## Release Process
### Release Workflow
1. **Plan**: Identify packages to release
2. **Version**: Update version numbers
3. **Test**: Run all tests
4. **Build**: Build all packages
5. **Release**: Publish packages
6. **Tag**: Create git tags
7. **Document**: Update changelogs
### Release Frequency
- **Major Releases**: Quarterly or as needed
- **Minor Releases**: Monthly or as needed
- **Patch Releases**: As needed for bug fixes
---
## Code Sharing Guidelines
### Shared Packages
- Create packages for code used by 2+ projects
- Keep packages focused and single-purpose
- Document package APIs
- Version packages independently (if using independent versioning)
### Package Dependencies
- Use workspace protocol (`workspace:*`) for internal dependencies
- Hoist common dependencies to root
- Document dependency graph
- Avoid circular dependencies
---
## CI/CD Guidelines
### Pipeline Stages
1. **Lint & Format**: Code quality checks
2. **Type Check**: TypeScript/Solidity type checking
3. **Test**: Unit and integration tests
4. **Build**: Compile and build artifacts
5. **Security Scan**: Dependency and code scanning
6. **Deploy**: Deployment to environments
### Caching Strategy
- Use Turborepo caching for builds
- Cache test results
- Cache dependency installation
---
## Documentation Requirements
### Monorepo-Level Documentation
- README.md with overview
- Architecture documentation
- Development setup guide
- Contribution guidelines
- Release process documentation
### Package-Level Documentation
- Each package should have README.md
- API documentation
- Usage examples
- Changelog
---
## Best Practices
### Development Workflow
1. Create feature branch
2. Work on affected packages
3. Run tests for all packages
4. Update documentation
5. Submit PR
### Dependency Management
1. Add dependencies at package level when possible
2. Hoist common dependencies to root
3. Keep dependencies up-to-date
4. Audit dependencies regularly
### Testing
1. Test affected packages
2. Run integration tests
3. Check test coverage
4. Ensure all tests pass before merge
### Code Quality
1. Follow code style guidelines
2. Use pre-commit hooks
3. Review code changes
4. Maintain test coverage
---
## Migration Strategy
### Migrating Existing Projects
1. Create monorepo structure
2. Add projects as submodules initially
3. Extract shared code to packages
4. Migrate projects to packages (optional)
5. Update documentation
### Adding New Projects
1. Evaluate if project belongs in existing monorepo
2. Create new monorepo if needed
3. Follow standard structure
4. Update documentation
---
## Troubleshooting
### Common Issues
**Issue**: Build failures
- **Solution**: Check dependency graph, ensure all dependencies are installed
**Issue**: Test failures
- **Solution**: Run tests in affected packages, check for dependency issues
**Issue**: Version conflicts
- **Solution**: Use workspace protocol, hoist common dependencies
**Issue**: Circular dependencies
- **Solution**: Refactor to break circular dependency, use dependency injection
---
## Review and Updates
This governance document should be reviewed:
- Quarterly
- When adding new monorepos
- When changing monorepo structure
- Based on team feedback
---
**Last Updated**: 2025-01-27
**Next Review**: Q2 2025