Thank you for contributing to PathReview! This guide explains our development workflow and standards.
- Fork the repository and clone your fork
- Set up your development environment following SETUP.md
- Browse issues and find one that interests you
- Comment on the issue to let others know you're working on it
Create a branch from main using this format:
<type>/<issue-number>-<short-description>
Where <issue-number> is the GitHub issue number (the number shown under the issue title in the tracker — e.g., #124).
Examples:
fix/124-resume-parser-index-errorfeat/128-first-impression-prompttest/115-readme-scorer-unit-testsdocs/110-update-setup-guide
Types: fix, feat, test, docs, refactor, perf, chore
We use Conventional Commits. Every commit message must follow this format:
<type>(<scope>): <description>
[optional body]
[optional footer]
Types: fix, feat, test, docs, refactor, perf, chore, ci
Scopes: ingestion, rag, agent, safety, api, frontend
Examples:
fix(ingestion): handle missing experience section in resume parser
Resume parser crashed with IndexError when a resume had no work experience
section. Added a bounds check before accessing sections['experience'][0].
Fixes #42
test(agent): add unit tests for readme_scorer tool
- Ensure your code passes all checks:
make check && make test-unit - Push your branch and open a PR using the PR template
- Fill out the PR template completely — incomplete PRs will be sent back
- Respond to review feedback within 48 hours
- Squash fixup commits before final merge if requested
- Python: Formatted with
black, linted withruff, type-checked withmypy - TypeScript/React: Follows the existing component patterns in
frontend/src/ - Tests: Every code change should include or update relevant tests
- Docstrings: All public functions and classes must have Google-style docstrings
make lint # Ruff linter
make format # Black formatter
make typecheck # Mypy type checker
make check # All three
make test-unit # Unit testsIf your issue involves adding a new document parser to the ingestion pipeline:
- Create a new file in
ingestion/parsers/(e.g.,web_parser.py) - Implement the
BaseParserinterface:from ingestion.parsers.base import BaseParser, ParseResult class WebParser(BaseParser): def parse(self, content: str | bytes) -> ParseResult: ...
- Register the parser in
ingestion/pipeline.py - Add unit tests in
tests/unit/test_<parser_name>.py - Add a sample fixture in
tests/fixtures/if needed
If your issue involves adding a new tool to the agent system:
- Create a new file in
agent/tools/(e.g.,dependency_audit_tool.py) - Implement the
BaseToolinterface:from agent.tools.base import BaseTool, ToolResult class DependencyAuditTool(BaseTool): name = "dependency_audit" description = "Checks for outdated dependencies in project repos" def execute(self, input_data: dict) -> ToolResult: ...
- Register the tool in
agent/orchestrator.py - Add unit tests in
tests/unit/test_<tool_name>.py - Add mock responses in
tests/fixtures/if the tool calls external APIs
Open a discussion or reach out in the course Discord channel.