# Contributing

How to contribute to StackPatch

## Getting Started

### Setup

1. **Fork the repository** on GitHub  
2. **Clone your fork**:
   
   ```
   git clone https://github.com/your-username/StackPatch.git
   cd StackPatch
   ```

3. **Install dependencies**:
   
   ```
   pnpm install
   ```

4. **Set up git hooks**:
   
   ```
   pnpm prepare
   ```

> **Important:** After adding new dependencies, always run `pnpm install` and commit the updated `pnpm-lock.yaml`. Pre-commit hooks will catch outdated lockfiles.

## Development Workflow

### 1. Create a Branch

Never commit directly to `main`. Always use feature branches:

```
git checkout -b feature/your-feature-name
```

### 2. Make Your Changes

- Write clean, readable code
- Follow existing code style
- Add comments for complex logic
- Update documentation if needed

### 3. Write Tests

All new features need tests. Place them in `__tests__/` directories:

```
# Run tests
pnpm test

# Watch mode
pnpm test:watch

# Coverage
pnpm test:coverage
```

### 4. Run Linter

```
pnpm lint
```

### 5. Commit Your Changes

Pre-commit hooks will automatically:

- Lint your code
- Run related tests
- Format with Prettier

If hooks fail, fix the issues and commit again.

### 6. Push and Create PR

```
git push origin feature/your-feature-name
```

Then create a Pull Request on GitHub.

## Adding a New Patch

### 1. Create Patch Directory

Create a new folder in `packages/cli/boilerplate/`:

```
mkdir packages/cli/boilerplate/your-patch-name
```

### 2. Add Boilerplate Files

Add your patch files to the directory:

```
packages/cli/boilerplate/your-patch-name/
├── app/
│   └── your-feature/
│       └── page.tsx
└── components/
    └── your-component.tsx
```

### 3. Register the Patch

Add your patch to the `PATCHES` object in `packages/cli/bin/stackpatch.ts`:

```
const PATCHES: Record<
  string,
  { path: string; dependencies: string[] }
> = {
  // ... existing patches
  "your-patch-name": {
    path: "your-patch-name",
    dependencies: ["package1", "package2"],
  },
};
```

### 4. Add Tests

Create tests in `packages/cli/__tests__/`:

```
describe("your-patch-name", () => {
  it("should add files correctly", () => {
    // Your test
  });
});
```

### 5. Update Documentation

- Add your patch to the documentation in `content/docs/guides.mdx`
- Update any relevant documentation

## Pull Request Guidelines

### Before Submitting

- ✅ All tests pass
- ✅ Code is linted and formatted
- ✅ Documentation is updated
- ✅ Changes are focused and small
- ✅ Commit messages are clear

### PR Description

Include:

- What changes you made
- Why you made them
- How to test the changes
- Screenshots (if UI changes)

### Review Process

- All PRs require review before merging
- CI checks must pass
- Address review comments promptly
- Keep PRs focused and small

## Branch Protection

The `main` branch is protected:

- ✅ All changes via Pull Request
- ✅ Tests must pass
- ✅ No direct commits (except merges)

This is enforced by GitHub Actions and git hooks.

## Code Style

- Use TypeScript for all new code
- Follow existing patterns and conventions
- Keep functions small and focused
- Add JSDoc comments for public APIs
- Use meaningful variable and function names

## Testing

### Writing Tests

- Test happy paths and edge cases
- Use descriptive test names
- Keep tests isolated and independent
- Mock external dependencies

### Running Tests

```
# Run all tests
pnpm test

# Watch mode
pnpm test:watch

# Coverage report
pnpm test:coverage
```

## Questions?

- **GitHub Issues** - Ask questions or report bugs
- **Discussions** - Join the conversation
- **Discord** - Chat with the community

## Thank You!

Your contributions make StackPatch better for everyone. We appreciate your time and effort!
