Skip to main content

Contributing

We welcome contributions to KiraPilot! This guide will help you get started with contributing to the project.

Getting Started

Prerequisites

Before contributing, make sure you have:

  1. Development environment set up - Follow the Development Setup guide
  2. Familiarity with the codebase - Review the Architecture and Project Structure
  3. GitHub account - For submitting pull requests and issues

Ways to Contribute

Code Contributions

  • Bug fixes: Fix issues reported in GitHub Issues
  • New features: Implement features from the roadmap
  • Performance improvements: Optimize existing functionality
  • Tests: Add or improve test coverage
  • Documentation: Update or expand documentation

Non-Code Contributions

  • Bug reports: Report issues you encounter
  • Feature requests: Suggest new functionality
  • Documentation: Improve guides and API docs
  • Translations: Help localize KiraPilot
  • Community support: Help other users in discussions

Finding Issues to Work On

  1. Check GitHub Issues labeled with:

    • good first issue - Great for new contributors
    • help wanted - Community contributions welcome
    • bug - Bug fixes needed
    • enhancement - New features or improvements
  2. Review the project roadmap for planned features

  3. Ask in discussions if you're unsure what to work on

Development Workflow

Setting Up Your Fork

  1. Fork the repository on GitHub
  2. Clone your fork locally:
    git clone https://github.com/YOUR_USERNAME/kirapilot-app.git
    cd kirapilot-app
  3. Add upstream remote:
    git remote add upstream https://github.com/vietanhdev/kirapilot-app.git
  4. Install dependencies:
    npm install

Creating a Feature Branch

  1. Sync with upstream:
    git checkout main
    git pull upstream main
  2. Create a feature branch:
    git checkout -b feature/your-feature-name
    # or
    git checkout -b fix/issue-description

Making Changes

  1. Make your changes following the code style guidelines
  2. Write or update tests for your changes
  3. Run the test suite:
    npm test
  4. Check code quality:
    npm run lint
    npm run type-check
    npm run format:check
  5. Test your changes thoroughly in the application

Committing Changes

We use conventional commits for clear commit messages:

Commit Message Format

<type>(<scope>): <description>

[optional body]

[optional footer(s)]

Types

  • feat: New feature
  • fix: Bug fix
  • docs: Documentation changes
  • style: Code style changes (formatting, etc.)
  • refactor: Code refactoring
  • test: Adding or updating tests
  • chore: Maintenance tasks

Examples

git commit -m "feat(tasks): add time preset options for task creation"
git commit -m "fix(timer): resolve timer not stopping on task completion"
git commit -m "docs(api): update TypeScript interfaces documentation"
git commit -m "test(database): add integration tests for task repository"

Code Style and Standards

TypeScript Guidelines

Type Safety

  • Use strict TypeScript: No any types unless absolutely necessary
  • Define interfaces: Create proper interfaces for all data structures
  • Use enums: For fixed sets of values
  • Prefer type unions: Over loose typing
// Good
interface Task {
id: string;
title: string;
priority: Priority;
status: TaskStatus;
}

// Avoid
interface Task {
id: any;
title: string;
priority: number;
status: string;
}

Naming Conventions

  • Interfaces: PascalCase (Task, UserPreferences)
  • Types: PascalCase (TaskStatus, Priority)
  • Functions: camelCase (createTask, updateTimer)
  • Variables: camelCase (taskList, currentUser)
  • Constants: UPPER_SNAKE_CASE (DEFAULT_PRIORITY, MAX_RETRIES)
  • Files: camelCase for utilities, PascalCase for components

React Guidelines

Component Structure

// Component file structure
import { useState, useEffect } from 'react';
import { Button } from '@heroui/react';

import { Task, TaskStatus } from '../types';
import { useDatabase } from '../hooks/useDatabase';
import { TaskCard } from './TaskCard';

interface TaskListProps {
tasks: Task[];
onTaskUpdate: (task: Task) => void;
}

export function TaskList({ tasks, onTaskUpdate }: TaskListProps) {
// Component implementation
}

Hooks Usage

  • Use custom hooks for reusable logic
  • Follow hooks rules (only call at top level)
  • Prefer useCallback for event handlers
  • Use useMemo for expensive calculations
// Good
const handleTaskUpdate = useCallback(
(task: Task) => {
onTaskUpdate(task);
},
[onTaskUpdate]
);

const sortedTasks = useMemo(() => {
return tasks.sort((a, b) => a.priority - b.priority);
}, [tasks]);

Rust Guidelines

Code Style

  • Follow rustfmt: Use cargo fmt for formatting
  • Use clippy: Address all clippy warnings
  • Error handling: Use Result types, avoid panics
  • Documentation: Add doc comments for public APIs
/// Creates a new task in the database
///
/// # Arguments
/// * `task_data` - The task creation data
///
/// # Returns
/// * `Result<Task, DbErr>` - The created task or database error
pub async fn create_task(&self, task_data: CreateTaskInput) -> Result<Task, DbErr> {
// Implementation
}

Database Operations

  • Use transactions for multi-step operations
  • Handle errors gracefully with proper error types
  • Validate input before database operations
  • Use prepared statements to prevent SQL injection

Testing Standards

Test Organization

src/
├── components/
│ └── __tests__/
│ └── TaskCard.test.tsx
├── hooks/
│ └── __tests__/
│ └── useDatabase.test.ts
└── __tests__/
├── setup/
├── mocks/
└── integration/

Test Naming

describe('TaskCard', () => {
describe('when task is completed', () => {
it('should display completion checkmark', () => {
// Test implementation
});
});

describe('when task has high priority', () => {
it('should display red priority indicator', () => {
// Test implementation
});
});
});

Test Coverage

  • Aim for 80%+ coverage on new code
  • Test edge cases and error conditions
  • Mock external dependencies appropriately
  • Use integration tests for critical workflows

Documentation Standards

Code Documentation

  • JSDoc comments for all public functions
  • Type annotations for complex types
  • README files in major directories
  • Inline comments for complex logic
/**
* Calculates the estimated completion time for a task based on historical data
*
* @param task - The task to estimate
* @param historicalData - Previous task completion data
* @returns Estimated completion time in minutes
*/
function estimateTaskTime(
task: Task,
historicalData: CompletedSession[]
): number {
// Implementation with inline comments for complex logic
}

API Documentation

  • Keep TypeScript interfaces updated in docs/docs/api/
  • Document breaking changes in pull requests
  • Update user guides when adding user-facing features
  • Include examples in documentation

Pull Request Process

Before Submitting

  1. Ensure all tests pass:

    npm run build:all
  2. Update documentation if needed

  3. Add changelog entry for significant changes

  4. Rebase on latest main:

    git fetch upstream
    git rebase upstream/main

Pull Request Template

When creating a pull request, include:

Description

  • What: Brief description of changes
  • Why: Reason for the changes
  • How: Approach taken

Testing

  • Test coverage: What tests were added/updated
  • Manual testing: How you verified the changes
  • Edge cases: Any edge cases considered

Screenshots

  • Before/after: For UI changes
  • New features: Screenshots of new functionality

Checklist

  • Tests pass locally
  • Code follows style guidelines
  • Documentation updated
  • No breaking changes (or documented)
  • Changelog updated (if applicable)

Review Process

  1. Automated checks must pass (CI/CD pipeline)
  2. Code review by maintainers
  3. Testing by reviewers if needed
  4. Approval from at least one maintainer
  5. Merge by maintainers

After Merge

  1. Delete your feature branch:
    git branch -d feature/your-feature-name
  2. Sync your fork:
    git checkout main
    git pull upstream main
    git push origin main

Community Guidelines

Code of Conduct

We are committed to providing a welcoming and inclusive environment:

  • Be respectful in all interactions
  • Be constructive in feedback and criticism
  • Be patient with new contributors
  • Be collaborative in problem-solving

Communication

GitHub Issues

  • Search existing issues before creating new ones
  • Use clear, descriptive titles
  • Provide reproduction steps for bugs
  • Include system information when relevant

Pull Request Reviews

  • Be specific in feedback
  • Explain the "why" behind suggestions
  • Acknowledge good work
  • Be open to discussion

Discussions

  • Ask questions if you're unsure
  • Share knowledge and help others
  • Stay on topic in discussions
  • Be patient with response times

Recognition

Contributors are recognized through:

  • Contributors list in the README
  • Release notes mentioning significant contributions
  • GitHub contributor insights
  • Community highlights in discussions

Getting Help

Resources

Support Channels

  • GitHub Issues - Bug reports and feature requests
  • GitHub Discussions - Questions and community support
  • Discord - Real-time chat with the community
  • Email - Direct contact with maintainers

Mentorship

New contributors can get help through:

  • Good first issue labels for beginner-friendly tasks
  • Mentorship program pairing new contributors with experienced ones
  • Code review feedback with learning opportunities
  • Community support in discussions and Discord

Release Process

Versioning

KiraPilot follows semantic versioning (SemVer):

  • Major (1.0.0): Breaking changes
  • Minor (0.1.0): New features, backward compatible
  • Patch (0.0.1): Bug fixes, backward compatible

Release Cycle

  • Regular releases: Monthly minor releases
  • Patch releases: As needed for critical fixes
  • Major releases: When significant breaking changes accumulate

Contributing to Releases

  • Test release candidates and provide feedback
  • Update documentation for new features
  • Help with release notes and changelog
  • Assist with migration guides for breaking changes

Thank you for contributing to KiraPilot! Your contributions help make productivity tools better for everyone.