# Contributing to RelSpec

Thank you for your interest in contributing to RelSpec.

## Development Setup

### Prerequisites
- Go 1.21 or higher
- Git
- (Optional) golangci-lint for linting
- (Optional) Docker for database testing

### Getting Started

1. Clone the repository:
```bash
git clone https://github.com/wdevs/relspecgo.git
cd relspecgo
```

2. Install dependencies:
```bash
go mod download
```

3. Run tests:
```bash
go test ./...
```

4. Build the project:
```bash
go build -o relspec ./cmd/relspec
```

## Project Structure

```
relspecgo/
├── cmd/              # CLI application entry point
├── pkg/
│   ├── readers/      # Input format readers (XML, JSON, DCTX, DB, GORM, Bun)
│   ├── writers/      # Output format writers (GORM, Bun, JSON, YAML)
│   ├── models/       # Internal data models for relations
│   └── transform/    # Transformation and validation logic
├── examples/         # Usage examples and sample files
├── tests/            # Integration tests
└── .claude/          # Claude Code configuration and commands
```

## Adding New Readers

To add a new input format reader:

1. Create a new file in `pkg/readers/` (e.g., `myformat_reader.go`)
2. Implement the `Reader` interface:
```go
type Reader interface {
    Read(source string) (*models.Schema, error)
}
```
3. Add tests in `pkg/readers/myformat_reader_test.go`
4. Register the reader in the CLI

## Adding New Writers

To add a new output format writer:

1. Create a new file in `pkg/writers/` (e.g., `myformat_writer.go`)
2. Implement the `Writer` interface:
```go
type Writer interface {
    Write(schema *models.Schema, destination string) error
}
```
3. Add tests in `pkg/writers/myformat_writer_test.go`
4. Register the writer in the CLI

## Code Style

- Follow standard Go conventions
- Use `gofmt` for formatting
- Run `go vet` to check for issues
- Use meaningful variable and function names
- Add comments for exported functions and types

## Testing

- Write unit tests for all new functionality
- Aim for >80% code coverage
- Use table-driven tests where appropriate
- Include both positive and negative test cases

### Running Tests

```bash
# All tests
go test ./...

# With coverage
go test -cover ./...

# Verbose output
go test -v ./...

# Specific package
go test ./pkg/readers/...
```

## Committing Changes

- Write clear, descriptive commit messages
- Follow conventional commits format: `type(scope): description`
  - Types: feat, fix, docs, test, refactor, chore
  - Example: `feat(readers): add PostgreSQL support`
- Keep commits focused and atomic
- Reference issues in commit messages when applicable

## Pull Request Process

1. Create a feature branch from `master`
2. Make your changes
3. Add tests for new functionality
4. Ensure all tests pass
5. Update documentation if needed
6. Submit a pull request with a clear description

## Claude Code Commands

This project includes Claude Code slash commands for common tasks:

- `/test` - Run all tests
- `/build` - Build the binary
- `/lint` - Run linters
- `/coverage` - Generate coverage report

## Questions or Issues?

- Open an issue for bugs or feature requests
- Start a discussion for questions or ideas
- Check existing issues before creating new ones

## License

By contributing to RelSpec, you agree that your contributions will be licensed under the Apache License 2.0.
