Thank you for your interest in contributing to the AI Interview Simulator! This document provides guidelines and instructions for contributing.
- Code of Conduct
- How Can I Contribute?
- Development Setup
- Code Style Guidelines
- Commit Message Guidelines
- Pull Request Process
- Testing Guidelines
This project adheres to a code of conduct. By participating, you are expected to:
- Be respectful - Treat everyone with respect and consideration
- Be constructive - Provide helpful feedback, not criticism
- Be inclusive - Welcome newcomers and help them learn
- Be professional - Keep discussions focused and productive
Before creating a bug report, please check existing issues to avoid duplicates.
To report a bug:
- Go to Issues
- Click "New Issue"
- Use this template:
**Describe the bug**
A clear description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '...'
3. See error
**Expected behavior**
What you expected to happen.
**Screenshots**
If applicable, add screenshots.
**Environment:**
- OS: [e.g., Windows 11, macOS 14, Ubuntu 22.04]
- Browser: [e.g., Chrome 120, Firefox 121]
- Java Version: [e.g., 21.0.1]We welcome feature suggestions! Please:
- Check if the feature already exists or is planned
- Create an issue with the "Feature Request" label
- Describe:
- The problem you're trying to solve
- Your proposed solution
- Alternatives you've considered
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes following our code style
- Write or update tests as needed
- Commit with a good message
- Push and create a Pull Request
- Java 21+
- Maven 3.9+
- PostgreSQL 14+
- Git
# Clone your fork
git clone https://github.com/YOUR_USERNAME/interviewSimulator.git
cd interviewSimulator
# Add upstream remote
git remote add upstream https://github.com/dkirichev/interviewSimulator.git
# Create .env file
cp .env.example .env
# Edit .env with your configuration
# Load environment variables
source .env
# Run the application
./mvnw spring-boot:runIntelliJ IDEA (Recommended):
- Open the project folder
- Enable annotation processing: Settings → Build → Compiler → Annotation Processors
- Install Lombok plugin if prompted
VS Code:
- Install "Extension Pack for Java"
- Install "Spring Boot Extension Pack"
- Open the project folder
We maintain strict code formatting standards. These are non-negotiable.
| Rule | Example |
|---|---|
| File ends with empty line | All files must end with a newline |
| Two empty lines between methods | Includes before first method |
| One empty line between fields | Each field declaration separated |
| Closing brace comments | }//methodName and }//ClassName |
| Tab indentation | Use tabs, not spaces |
| Same-line braces | if (x) { not if (x)\n{ |
@Slf4j
@RequiredArgsConstructor
@Service
public class MyService {
private final MyRepository repository;
private final OtherService otherService;
public void doWork() {
log.info("Working");
}//doWork
public void doOtherWork() {
log.info("Other work");
}//doOtherWork
}//MyService| Annotation | Use Case |
|---|---|
@Slf4j |
All services/controllers (auto-injects log) |
@RequiredArgsConstructor |
Constructor injection for final fields |
@Data |
Entities (getters/setters/equals/hashCode) |
@Builder |
Fluent object construction |
| Type | Pattern | Example |
|---|---|---|
| Entity | CamelCase | InterviewSession |
| Table | snake_case | interview_sessions |
| Service | {Name}Service |
InterviewService |
| Repository | {Entity}Repository |
InterviewSessionRepository |
| Controller | {Name}Controller |
SetupController |
| Migration | V{n}__{desc}.sql |
V1__initial_schema.sql |
Log these:
- External API calls
- WebSocket events
- Errors and exceptions
- State changes
Don't log:
- Simple CRUD operations
- Getters/setters
- Every method entry/exit
// ❌ Bad
log.info("Started");
// ✅ Good
log.
info("Started session {} for {}",sessionId, candidateName);We follow Conventional Commits.
<type>(<scope>): <description>
[optional body]
[optional footer]
| Type | Description |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation changes |
style |
Code style (formatting, no logic change) |
refactor |
Code refactoring |
test |
Adding or updating tests |
chore |
Maintenance tasks |
feat(interview): add support for German language
fix(audio): resolve audio playback glitch on Safari
docs(readme): update Docker setup instructions
refactor(grading): simplify score calculation logic
test(cv): add tests for DOCX processing-
Update from upstream:
git fetch upstream git rebase upstream/main
-
Run tests:
./mvnw test -
Check code style:
- Ensure all files end with newline
- Verify closing brace comments
- Check proper spacing between methods
-
Update documentation if needed
When creating a PR, include:
## Description
Brief description of changes.
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## How Has This Been Tested?
Describe the tests you ran.
## Checklist
- [ ] My code follows the style guidelines
- [ ] I have added tests for new functionality
- [ ] I have updated documentation
- [ ] All tests pass locally- Maintainers will review your PR
- Address any requested changes
- Once approved, your PR will be merged
# Run all tests
./mvnw test
# Run specific test class
./mvnw test -Dtest=GradingServiceTest
# Run with coverage
./mvnw test jacoco:report- Use JUnit 5
- Test class names:
{ClassName}Test - Test method names: describe the behavior being tested
- Use Testcontainers for database tests
@SpringBootTest
class GradingServiceTest {
@Autowired
private GradingService gradingService;
@Test
void gradeInterview_shouldReturnValidScores() {
// Arrange
UUID sessionId = createTestSession();
// Act
InterviewFeedback feedback = gradingService.gradeInterview(sessionId);
// Assert
assertThat(feedback.getOverallScore()).isBetween(0, 100);
}//gradeInterview_shouldReturnValidScores
}//GradingServiceTestWhen adding UI text:
- Add key to
messages_en.properties(English) - Add Bulgarian translation to
messages_bg.properties - Use
#{key.name}in Thymeleaf templates
# Format: section.subsection.element.attribute
setup.step1.candidateName=Candidate Name
setup.step1.candidateName.placeholder=e.g., John DoeIf you have questions:
- Check existing Issues
- Read the Documentation
- Create a new issue with the "Question" label
Thank you for contributing! 🎉