Convert documentation to MkDocs with Material theme for GitHub Pages hosting. Includes comprehensive guides for API, CLI, desktop app, and development. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
570 lines
11 KiB
Markdown
570 lines
11 KiB
Markdown
# Development Guide
|
|
|
|
Welcome to the Mining Platform development guide. This documentation will help you set up your development environment and contribute to the project.
|
|
|
|
## Prerequisites
|
|
|
|
### Required Tools
|
|
|
|
- **Go**: Version 1.24 or higher
|
|
- **Node.js**: Version 20 or higher (for UI development)
|
|
- **npm**: Version 10 or higher
|
|
- **Make**: For build automation
|
|
- **Git**: For version control
|
|
|
|
### Optional Tools
|
|
|
|
- **CMake**: Version 3.21+ (for building miner core with GPU support)
|
|
- **OpenCL SDK**: For AMD GPU development
|
|
- **CUDA Toolkit**: For NVIDIA GPU development
|
|
- **golangci-lint**: For code linting
|
|
- **swag**: For generating Swagger documentation
|
|
|
|
### Install Development Tools
|
|
|
|
**Go Tools:**
|
|
```bash
|
|
# Install swag for Swagger generation
|
|
go install github.com/swaggo/swag/cmd/swag@latest
|
|
|
|
# Install golangci-lint
|
|
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
```
|
|
|
|
**Node.js Tools:**
|
|
```bash
|
|
cd ui
|
|
npm install
|
|
```
|
|
|
|
## Getting the Source Code
|
|
|
|
Clone the repository:
|
|
|
|
```bash
|
|
git clone https://github.com/Snider/Mining.git
|
|
cd Mining
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
Mining/
|
|
├── cmd/
|
|
│ ├── mining/ # CLI application
|
|
│ │ ├── main.go # Entry point
|
|
│ │ └── cmd/ # Cobra commands
|
|
│ └── desktop/ # Desktop application
|
|
│ └── mining-desktop/ # Wails app
|
|
├── pkg/mining/ # Core Go package
|
|
│ ├── mining.go # Interfaces and types
|
|
│ ├── manager.go # Miner lifecycle management
|
|
│ ├── service.go # REST API (Gin)
|
|
│ ├── xmrig.go # XMRig implementation
|
|
│ ├── xmrig_start.go # XMRig startup logic
|
|
│ ├── xmrig_stats.go # XMRig statistics parsing
|
|
│ ├── profile_manager.go # Profile persistence
|
|
│ └── config_manager.go # Config management
|
|
├── miner/core/ # Modified XMRig
|
|
│ └── src/
|
|
│ ├── backend/ # Mining backends
|
|
│ │ ├── opencl/ # OpenCL (AMD/NVIDIA)
|
|
│ │ └── cuda/ # CUDA (NVIDIA)
|
|
│ └── crypto/ # Algorithm implementations
|
|
│ ├── etchash/ # Ethereum Classic
|
|
│ └── progpowz/ # Zano
|
|
├── ui/ # Angular web dashboard
|
|
│ ├── src/
|
|
│ │ ├── app/
|
|
│ │ │ ├── components/ # Reusable components
|
|
│ │ │ ├── pages/ # Route pages
|
|
│ │ │ └── services/ # API services
|
|
│ │ └── environments/ # Environment configs
|
|
│ ├── e2e/ # Playwright E2E tests
|
|
│ └── package.json
|
|
├── docs/ # Documentation
|
|
├── Makefile # Build automation
|
|
└── README.md
|
|
```
|
|
|
|
## Building the Project
|
|
|
|
### Backend (Go)
|
|
|
|
Build the CLI binary:
|
|
|
|
```bash
|
|
make build
|
|
```
|
|
|
|
The binary will be created as `miner-ctrl` in the current directory.
|
|
|
|
For cross-platform builds:
|
|
|
|
```bash
|
|
make build-all
|
|
```
|
|
|
|
Binaries will be in `dist/` directory for Linux, macOS, and Windows.
|
|
|
|
### Frontend (Angular)
|
|
|
|
Build the web dashboard:
|
|
|
|
```bash
|
|
cd ui
|
|
npm install
|
|
npm run build
|
|
```
|
|
|
|
Output will be in `ui/dist/browser/` as `mbe-mining-dashboard.js`.
|
|
|
|
For development with hot reload:
|
|
|
|
```bash
|
|
cd ui
|
|
npm run start
|
|
```
|
|
|
|
This starts a development server on `http://localhost:4200`.
|
|
|
|
### Desktop Application
|
|
|
|
Build the Wails desktop app:
|
|
|
|
```bash
|
|
cd cmd/desktop/mining-desktop
|
|
npm install
|
|
wails3 build
|
|
```
|
|
|
|
Binary will be in `cmd/desktop/mining-desktop/bin/`.
|
|
|
|
For development mode with hot reload:
|
|
|
|
```bash
|
|
cd cmd/desktop/mining-desktop
|
|
wails3 dev
|
|
```
|
|
|
|
### Miner Core (with GPU support)
|
|
|
|
Build the modified XMRig with GPU support:
|
|
|
|
```bash
|
|
cd miner/core
|
|
mkdir build && cd build
|
|
|
|
# Configure with OpenCL and CUDA
|
|
cmake .. -DWITH_OPENCL=ON -DWITH_CUDA=ON
|
|
|
|
# Build
|
|
make -j$(nproc)
|
|
```
|
|
|
|
Binary will be in `miner/core/build/xmrig`.
|
|
|
|
## Running Tests
|
|
|
|
### Go Tests
|
|
|
|
Run all tests:
|
|
|
|
```bash
|
|
make test
|
|
```
|
|
|
|
Run with race detection and coverage:
|
|
|
|
```bash
|
|
make test-release
|
|
```
|
|
|
|
Generate coverage report:
|
|
|
|
```bash
|
|
make coverage
|
|
```
|
|
|
|
Opens an HTML coverage report in your browser.
|
|
|
|
Run specific tests:
|
|
|
|
```bash
|
|
go test -v ./pkg/mining/... -run TestName
|
|
```
|
|
|
|
### Frontend Tests
|
|
|
|
Run Angular unit tests:
|
|
|
|
```bash
|
|
cd ui
|
|
npm test
|
|
```
|
|
|
|
This runs Karma/Jasmine tests (36 specs).
|
|
|
|
Run E2E tests with Playwright:
|
|
|
|
```bash
|
|
cd ui
|
|
npm run e2e
|
|
```
|
|
|
|
Or run specific test suites:
|
|
|
|
```bash
|
|
# API tests only (no browser)
|
|
make e2e-api
|
|
|
|
# UI tests only
|
|
make e2e-ui
|
|
|
|
# Interactive UI mode
|
|
make e2e
|
|
```
|
|
|
|
## Code Quality
|
|
|
|
### Linting
|
|
|
|
Format Go code:
|
|
|
|
```bash
|
|
make fmt
|
|
```
|
|
|
|
Run Go linters:
|
|
|
|
```bash
|
|
make lint
|
|
```
|
|
|
|
Format TypeScript/Angular code:
|
|
|
|
```bash
|
|
cd ui
|
|
npm run lint
|
|
npm run lint:fix
|
|
```
|
|
|
|
### Code Style
|
|
|
|
**Go:**
|
|
- Follow [Effective Go](https://golang.org/doc/effective_go)
|
|
- Use `gofmt` for formatting
|
|
- Keep functions focused and small
|
|
- Write descriptive variable names
|
|
- Add comments for exported functions
|
|
|
|
**TypeScript/Angular:**
|
|
- Follow [Angular Style Guide](https://angular.io/guide/styleguide)
|
|
- Use TypeScript strict mode
|
|
- Prefer composition over inheritance
|
|
- Write unit tests for components and services
|
|
|
|
## Generating Documentation
|
|
|
|
### Swagger API Docs
|
|
|
|
Generate Swagger documentation:
|
|
|
|
```bash
|
|
make docs
|
|
```
|
|
|
|
This runs `swag init` and updates `docs/swagger.json` and `docs/swagger.yaml`.
|
|
|
|
Swagger annotations are in `pkg/mining/service.go`.
|
|
|
|
### mkdocs Documentation
|
|
|
|
This documentation is built with mkdocs. To preview locally:
|
|
|
|
```bash
|
|
# Install mkdocs
|
|
pip install mkdocs mkdocs-material
|
|
|
|
# Serve docs locally
|
|
mkdocs serve
|
|
```
|
|
|
|
Open `http://127.0.0.1:8000` to view the documentation.
|
|
|
|
## Development Workflow
|
|
|
|
### Starting Development Server
|
|
|
|
Run the full development stack:
|
|
|
|
```bash
|
|
# Terminal 1: Start Go backend
|
|
make dev
|
|
|
|
# Terminal 2: Start Angular dev server
|
|
cd ui && npm run start
|
|
|
|
# Terminal 3: Watch for changes
|
|
make watch
|
|
```
|
|
|
|
This provides:
|
|
- Backend API on `http://localhost:9090`
|
|
- Frontend dev server on `http://localhost:4200`
|
|
- Auto-reload on file changes
|
|
|
|
### Making Changes
|
|
|
|
1. **Create a branch:**
|
|
```bash
|
|
git checkout -b feature/my-feature
|
|
```
|
|
|
|
2. **Make your changes**
|
|
- Edit source files
|
|
- Add tests
|
|
- Update documentation
|
|
|
|
3. **Test your changes:**
|
|
```bash
|
|
make test
|
|
cd ui && npm test
|
|
```
|
|
|
|
4. **Lint your code:**
|
|
```bash
|
|
make lint
|
|
cd ui && npm run lint
|
|
```
|
|
|
|
5. **Commit:**
|
|
```bash
|
|
git add .
|
|
git commit -m "feat: Add my feature"
|
|
```
|
|
|
|
6. **Push and create PR:**
|
|
```bash
|
|
git push origin feature/my-feature
|
|
```
|
|
|
|
### Commit Message Format
|
|
|
|
Follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
|
|
```
|
|
type(scope): description
|
|
|
|
[optional body]
|
|
|
|
[optional footer]
|
|
```
|
|
|
|
**Types:**
|
|
- `feat`: New feature
|
|
- `fix`: Bug fix
|
|
- `docs`: Documentation changes
|
|
- `style`: Code style changes (formatting)
|
|
- `refactor`: Code refactoring
|
|
- `test`: Adding or updating tests
|
|
- `chore`: Maintenance tasks
|
|
|
|
**Examples:**
|
|
```
|
|
feat(api): Add endpoint for profile management
|
|
fix(miner): Fix XMRig hashrate calculation
|
|
docs(readme): Update installation instructions
|
|
```
|
|
|
|
## Debugging
|
|
|
|
### Go Backend
|
|
|
|
Debug with Delve:
|
|
|
|
```bash
|
|
# Install delve
|
|
go install github.com/go-delve/delve/cmd/dlv@latest
|
|
|
|
# Start debugging
|
|
dlv debug ./cmd/mining -- serve --port 9090
|
|
```
|
|
|
|
Or use your IDE's debugger (VS Code, GoLand, etc.).
|
|
|
|
### Angular Frontend
|
|
|
|
Debug in browser:
|
|
|
|
1. Start dev server: `npm run start`
|
|
2. Open browser DevTools (F12)
|
|
3. Use Sources tab for breakpoints
|
|
4. Console for logs and errors
|
|
|
|
### Desktop App
|
|
|
|
Debug Wails app:
|
|
|
|
```bash
|
|
cd cmd/desktop/mining-desktop
|
|
wails3 dev --devtools
|
|
```
|
|
|
|
This opens the app with Chrome DevTools enabled.
|
|
|
|
## Testing Guidelines
|
|
|
|
### Writing Go Tests
|
|
|
|
```go
|
|
func TestStartMiner(t *testing.T) {
|
|
// Arrange
|
|
manager := NewManager()
|
|
config := &Config{
|
|
Pool: "stratum+tcp://pool.test:3333",
|
|
Wallet: "test_wallet",
|
|
}
|
|
|
|
// Act
|
|
miner, err := manager.StartMiner("xmrig", config)
|
|
|
|
// Assert
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, miner)
|
|
assert.Equal(t, "xmrig", miner.GetName())
|
|
}
|
|
```
|
|
|
|
### Writing Angular Tests
|
|
|
|
```typescript
|
|
describe('DashboardComponent', () => {
|
|
let component: DashboardComponent;
|
|
let fixture: ComponentFixture<DashboardComponent>;
|
|
|
|
beforeEach(() => {
|
|
TestBed.configureTestingModule({
|
|
imports: [DashboardComponent],
|
|
});
|
|
fixture = TestBed.createComponent(DashboardComponent);
|
|
component = fixture.componentInstance;
|
|
});
|
|
|
|
it('should create', () => {
|
|
expect(component).toBeTruthy();
|
|
});
|
|
|
|
it('should fetch miners on init', () => {
|
|
spyOn(component.minerService, 'getMiners').and.returnValue(of([]));
|
|
component.ngOnInit();
|
|
expect(component.minerService.getMiners).toHaveBeenCalled();
|
|
});
|
|
});
|
|
```
|
|
|
|
## Continuous Integration
|
|
|
|
The project uses GitHub Actions for CI/CD:
|
|
|
|
- **Build**: Builds for all platforms on every push
|
|
- **Test**: Runs all tests on every PR
|
|
- **Lint**: Checks code quality
|
|
- **E2E**: Runs Playwright tests
|
|
- **Release**: Creates releases on tags
|
|
|
|
CI configuration is in `.github/workflows/`.
|
|
|
|
## Common Development Tasks
|
|
|
|
### Adding a New API Endpoint
|
|
|
|
1. Add route in `pkg/mining/service.go`:
|
|
```go
|
|
router.GET("/my-endpoint", s.handleMyEndpoint)
|
|
```
|
|
|
|
2. Implement handler:
|
|
```go
|
|
// @Summary My endpoint
|
|
// @Description Description of what it does
|
|
// @Tags miners
|
|
// @Produce json
|
|
// @Success 200 {object} Response
|
|
// @Router /my-endpoint [get]
|
|
func (s *Service) handleMyEndpoint(c *gin.Context) {
|
|
// Implementation
|
|
}
|
|
```
|
|
|
|
3. Generate Swagger docs:
|
|
```bash
|
|
make docs
|
|
```
|
|
|
|
4. Add tests:
|
|
```go
|
|
func TestHandleMyEndpoint(t *testing.T) {
|
|
// Test implementation
|
|
}
|
|
```
|
|
|
|
### Adding a New Angular Component
|
|
|
|
1. Generate component:
|
|
```bash
|
|
cd ui
|
|
ng generate component components/my-component
|
|
```
|
|
|
|
2. Implement component logic
|
|
3. Add styles
|
|
4. Write tests
|
|
5. Export from module if needed
|
|
|
|
### Adding a New Miner Implementation
|
|
|
|
1. Create new file: `pkg/mining/myminer.go`
|
|
2. Implement the `Miner` interface
|
|
3. Register in manager
|
|
4. Add tests
|
|
5. Update documentation
|
|
|
|
See [Architecture Guide](architecture.md) for details.
|
|
|
|
## Release Process
|
|
|
|
Releases are handled by GoReleaser:
|
|
|
|
1. Update `CHANGELOG.md`
|
|
2. Tag the release:
|
|
```bash
|
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
|
git push origin v1.0.0
|
|
```
|
|
3. GitHub Actions will automatically:
|
|
- Build for all platforms
|
|
- Create release artifacts
|
|
- Publish to GitHub Releases
|
|
|
|
For local testing:
|
|
|
|
```bash
|
|
make package
|
|
```
|
|
|
|
This creates a snapshot release in `dist/`.
|
|
|
|
## Getting Help
|
|
|
|
- **Documentation**: Check the docs/ folder
|
|
- **API Reference**: Use the Swagger UI
|
|
- **Issues**: [GitHub Issues](https://github.com/Snider/Mining/issues)
|
|
- **Discussions**: [GitHub Discussions](https://github.com/Snider/Mining/discussions)
|
|
|
|
## Next Steps
|
|
|
|
- Read the [Architecture Guide](architecture.md)
|
|
- Review the [Contributing Guidelines](contributing.md)
|
|
- Explore the [API Documentation](../api/index.md)
|
|
- See example code in the test files
|