Thank you for your interest in contributing to Ambient Code Platform (formerly known as vTeam)! This document provides guidelines and instructions for contributing to the project.
- Code of Conduct
- Ways to Contribute
- Getting Started
- Development Workflow
- Code Standards
- Testing Requirements
- Pull Request Process
- Local Development Setup
- Troubleshooting
- Getting Help
- License
By participating in this project, you agree to maintain a respectful and inclusive environment for all contributors. We expect:
- Respectful and constructive communication
- Welcoming and inclusive behavior
- Focus on what is best for the community
- Showing empathy towards other community members
There are many ways to contribute to Ambient Code Platform:
If you find a bug, please create an issue with:
- Clear, descriptive title
- Steps to reproduce the problem
- Expected vs actual behavior
- Environment details (OS, cluster version, etc.)
- Relevant logs or screenshots
We welcome feature suggestions! Please:
- Check if the feature has already been suggested
- Provide a clear use case and rationale
- Consider implementation approaches
- Be open to discussion and feedback
Documentation improvements are always appreciated:
- Fix typos or clarify unclear sections
- Add examples or tutorials
- Document undocumented features
- Improve error messages
Code contributions should:
- Follow our code standards (see below)
- Include tests where applicable
- Update documentation as needed
- Pass all CI/CD checks
Before contributing, ensure you have:
- Go 1.24+ (for backend/operator development)
- Node.js 20+ and npm (for frontend development)
- Python 3.11+ (for runner development)
- Podman or Docker (for building containers)
- Minikube and kubectl (for local development)
- Git for version control
- Fork the repository on GitHub
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/vTeam.git cd vTeam - Add the upstream repository:
git remote add upstream https://github.com/ambient-code/vTeam.git
To prevent accidental commits to protected branches (main, master, production), install our git hooks:
make setup-hooksOr run the installation script directly:
./scripts/install-git-hooks.shWhat the hooks do:
- pre-commit - Blocks commits to
main/master/productionbranches - pre-push - Blocks pushes to
main/master/productionbranches
Hooks are automatically installed when you run make dev-start.
If you need to override the hooks (e.g., for hotfixes):
git commit --no-verify -m "hotfix: critical fix"
git push --no-verify origin mainSee scripts/git-hooks/README.md for more details.
Always work on a feature branch, not main:
git checkout main
git pull upstream main
git checkout -b feature/your-feature-nameBranch naming conventions:
feature/- New featuresfix/- Bug fixesdocs/- Documentation changesrefactor/- Code refactoringtest/- Test improvements
- Follow the existing code patterns and style
- Write clear, descriptive commit messages
- Keep commits focused and atomic
- Test your changes locally
Use conventional commit messages:
git commit -m "feat: add multi-repo session support"
git commit -m "fix: resolve PVC mounting issue in minikube"
git commit -m "docs: update minikube setup instructions"
git commit -m "test: add integration tests for operator"Commit message prefixes:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style changes (formatting, etc.)refactor:- Code refactoringtest:- Adding or updating testschore:- Maintenance tasks
Regularly sync with upstream:
git fetch upstream
git rebase upstream/maingit push origin feature/your-feature-nameThen create a Pull Request on GitHub.
Formatting:
# Auto-format your code
gofmt -w components/backend components/operatorQuality Checks:
# Backend
cd components/backend
gofmt -l . # Check formatting (should output nothing)
go vet ./... # Detect suspicious constructs
golangci-lint run # Run comprehensive linting
# Operator
cd components/operator
gofmt -l .
go vet ./...
golangci-lint runInstall golangci-lint:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latestBest Practices:
- Use explicit error handling, never
panic()in production code - Always use user-scoped Kubernetes clients for API operations
- Implement proper RBAC checks before resource access
- Never log sensitive data (tokens, API keys)
- Use
unstructured.Nested*helpers for type-safe CR access - Set OwnerReferences on child resources for automatic cleanup
See CLAUDE.md for comprehensive backend/operator development standards.
cd components/frontend
npm run lint # ESLint checks
npm run build # Ensure builds without errors/warningsBest Practices:
- Zero
anytypes (use proper TypeScript types) - Use Shadcn UI components only (no custom UI from scratch)
- Use React Query for ALL data operations (no manual
fetch()) - Use
typeoverinterface - Colocate single-use components with their pages
- All buttons must show loading states
- All lists must have empty states
- All nested pages must have breadcrumbs
See components/frontend/DESIGN_GUIDELINES.md for complete frontend standards.
cd components/runners/claude-code-runner
# Format code
black .
isort .
# Lint
flake8Standards:
- Use
blackformatting (88 char line length) - Use
isortfor import sorting - Follow PEP 8 conventions
- Add type hints where appropriate
cd components/backend
make test # All tests
make test-unit # Unit tests only
make test-contract # Contract tests only
make test-integration # Integration tests (requires k8s cluster)
make test-coverage # Generate coverage reportcd components/operator
go test ./... -vcd components/frontend
npm testTesting Guidelines:
- Add tests for new features
- Ensure tests pass locally before pushing
- Aim for meaningful test coverage
- Write clear test descriptions
- Use table-driven tests in Go
- Run all quality checks for the components you modified
- Run tests and ensure they pass
- Update documentation if you changed functionality
- Rebase on latest main to avoid merge conflicts
- Test locally with Minikube if possible
Your PR should include:
- Clear title describing the change
- Description of what changed and why
- Related issues (use "Fixes #123" or "Relates to #123")
- Testing performed - how you verified the changes
- Screenshots (if UI changes)
- Breaking changes (if any)
- All PRs require at least one approval
- GitHub Actions will automatically run:
- Go linting checks (gofmt, go vet, golangci-lint)
- Component builds
- Tests
- Address review feedback promptly
- Keep discussions focused and professional
- Be open to suggestions and alternative approaches
- Squash commits will happen automatically on merge
- Your PR will be merged to
main - Delete your feature branch after merge
The recommended way to develop and test Ambient Code Platform locally is using Minikube. This provides a lightweight Kubernetes environment on your local machine with no authentication requirements, making development fast and easy.
# Install using Homebrew
brew install minikube kubectl# Install Podman
sudo apt-get update
sudo apt-get install podman
# Install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# Install Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube# Install Podman
sudo dnf install podman
# Install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# Install Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikubeOnce Minikube and prerequisites are installed, you can start the complete development environment with a single command:
make local-upThis command will:
- Start Minikube with appropriate resources
- Enable required addons (ingress, storage)
- Build container images
- Deploy all components (backend, frontend, operator)
- Set up networking
The setup takes 2-3 minutes on first run.
Get the access URL:
make local-urlThis will display the frontend and backend URLs, typically:
- Frontend:
http://192.168.64.4:30030 - Backend:
http://192.168.64.4:30080
Or manually construct the URL:
# Get Minikube IP
minikube ip
# Access at http://<minikube-ip>:30030Authentication:
Authentication is completely disabled for local development:
- ✅ No login required
- ✅ Automatic login as "developer"
- ✅ Full access to all features
- ✅ Backend uses service account for Kubernetes API
Stop the application (keeps Minikube running):
make local-stopRestart the application:
make local-upDelete the entire Minikube cluster:
make local-deleteCheck status:
make local-status # View pod status and deployment infoView logs:
make local-logs # Backend logs
make local-logs-frontend # Frontend logs (if available)
make local-logs-operator # Operator logs (if available)Cleanup:
make local-stop # Stop deployment, keep Minikube running
make local-delete # Delete entire Minikube clusterAccess Kubernetes:
kubectl get pods -n ambient-code # View pods
kubectl logs <pod-name> -n ambient-code # View specific pod logs
kubectl describe pod <pod-name> -n ambient-code # Debug pod issuesIf Minikube or the platform won't start, you may need to allocate more resources:
# Stop Minikube
minikube stop
# Delete the existing cluster
minikube delete
# Start with more resources
minikube start --memory=8192 --cpus=4 --disk-size=50g
# Then deploy the application
make local-upIf Minikube fails to start, try these steps:
# Check status
minikube status
# View logs
minikube logs
# Try with a specific driver
minikube start --driver=podman
# or
minikube start --driver=dockerIf Minikube is completely broken, you can fully reset it:
# Stop and delete cluster
minikube stop
minikube delete
# Clear cache (optional)
rm -rf ~/.minikube/cache
# Start fresh
minikube start --memory=4096 --cpus=2
make local-upThe fastest way to view logs:
make local-logs # Backend logs
kubectl logs -n ambient-code -l app=backend --tail=100 -f
kubectl logs -n ambient-code -l app=frontend --tail=100 -f
kubectl logs -n ambient-code -l app=operator --tail=100 -fFor detailed debugging through the Kubernetes dashboard:
# Open Kubernetes dashboard
minikube dashboardThis will open a web interface where you can:
- Navigate to Workloads > Pods
- Select the
ambient-codenamespace - Click on a pod to view details and logs
Pods not starting:
kubectl get pods -n ambient-code
kubectl describe pod <pod-name> -n ambient-codeImage pull errors:
kubectl get events -n ambient-code --sort-by='.lastTimestamp'Check if images are loaded:
minikube ssh docker images | grep ambient-codePVC issues:
kubectl get pvc -n ambient-code
kubectl describe pvc <pvc-name> -n ambient-codeService not accessible:
# Check services
kubectl get services -n ambient-code
# Check NodePort assignments
kubectl get service backend -n ambient-code -o jsonpath='{.spec.ports[0].nodePort}'
kubectl get service frontend -n ambient-code -o jsonpath='{.spec.ports[0].nodePort}'
# Get Minikube IP
minikube ipNetworking issues:
# Verify ingress addon is enabled
minikube addons list | grep ingress
# Enable if disabled
minikube addons enable ingressIf you're stuck or have questions:
-
Check existing documentation:
-
Search existing issues:
- Check if your issue has already been reported
- Look for solutions in closed issues
-
Create a new issue:
- Provide clear description and reproduction steps
- Include relevant logs and error messages
- Tag with appropriate labels
By contributing to Ambient Code Platform, you agree that your contributions will be licensed under the same license as the project (MIT License).