Knowledge Hub.
Comprehensive guides and references for the OpenFrame platform
Comprehensive guides and references for the OpenFrame platform
We're excited that you're interested in contributing to OpenFrame CLI! This guide will help you get started with contributing to the project.
Before you begin, ensure you have:
# Fork the repo on GitHub, then clone your fork
git clone https://github.com/YOUR_USERNAME/openframe-cli.git
cd openframe-cli
# Add upstream remote
git remote add upstream https://github.com/flamingo-stack/openframe-cli.git
Follow the Development Environment Setup guide for detailed IDE configuration, tools, and environment variables.
# Install essential Go development tools
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install github.com/rakyll/gotest@latest
# Build the project
go build -o openframe main.go
# Run tests
go test ./...
# Run linter
golangci-lint run
git checkout -b feature/your-feature-name
git fetch upstream
git rebase upstream/main
gofmt and goimports for formattingopenframe-cli/
├── cmd/ # CLI command definitions
├── internal/
│ ├── cluster/ # Cluster management logic
│ ├── chart/ # Chart and ArgoCD management
│ ├── dev/ # Development tools
│ ├── bootstrap/ # Environment bootstrapping
│ └── shared/ # Common utilities
├── docs/ # Documentation
├── scripts/ # Build and utility scripts
└── main.go # Application entry point
Example test structure:
func TestClusterCreate(t *testing.T) {
tests := []struct {
name string
input ClusterConfig
expected error
}{
{
name: "valid cluster creation",
input: ClusterConfig{
Name: "test-cluster",
Nodes: 3,
},
expected: nil,
},
// Add more test cases...
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := CreateCluster(tt.input)
assert.Equal(t, tt.expected, err)
})
}
}
Follow conventional commit format:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Types:
feat: New featurefix: Bug fixdocs: Documentation changesstyle: Code style changes (formatting, etc.)refactor: Code refactoringtest: Adding or updating testschore: Build process or auxiliary tool changesExamples:
git commit -m "feat(cluster): add support for custom node configurations"
git commit -m "fix(bootstrap): resolve ArgoCD installation timeout"
git commit -m "docs: update prerequisites and installation guide"
# Ensure your branch is up to date
git fetch upstream
git rebase upstream/main
# Run all checks
go fmt ./...
goimports -w .
golangci-lint run
go test ./...
## Description
Brief description of the changes and their purpose.
## Type of Change
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] Documentation update
## Testing
- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] Manual testing completed
## Checklist
- [ ] My code follows the project's style guidelines
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
# Run all tests
go test ./...
# Run tests with coverage
go test -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
# Run specific package tests
go test ./internal/cluster/...
# Run integration tests (requires Docker)
go test -tags=integration ./...
We use semantic versioning (SemVer):
main.goCHANGELOG.mdWhen reporting bugs or requesting features:
Need assistance? Here's how to get help:
This repository contains OpenFrame CLI code. The main OpenFrame application code is maintained separately:
When contributing CLI-related changes, coordinate with the main repository team through Slack.
Thank you for contributing to OpenFrame CLI! Your efforts help make IT operations more accessible and cost-effective for MSPs worldwide.
Questions? Join our OpenMSP Slack community - we're here to help!