Ways to Contribute
There are several ways you can contribute:- Report bugs: Help identify and fix issues
- Request features: Suggest new functionality
- Submit pull requests: Contribute code improvements
- Improve documentation: Help others understand the plugin
- Share feedback: Let us know how we can improve
Reporting Bugs
Before Opening an Issue
- Search existing issues to avoid duplicates
- Check the troubleshooting guide at Troubleshooting
- Verify you’re using the latest version of the plugin
- Test with a fresh configuration to rule out local issues
Creating a Bug Report
Open a new issue on GitHub with: Required Information:- Title: Clear, concise description of the issue
- Steps to reproduce: Detailed steps to recreate the bug
- Expected behavior: What should happen
- Actual behavior: What actually happens
- Environment:
- OmniFocus version
- macOS version
- Plugin version
- Console logs: Relevant output from Console.app (filter for “OmniFocus”)
- Screenshots or screen recordings
- Sample JQL query (redact sensitive project names if needed)
- Error messages from Jira API responses
Security Issues
If you discover a security vulnerability:- Do not open a public GitHub issue
- Email the maintainer directly (see README for contact)
- Include details about the vulnerability and potential impact
- We will respond within 48 hours
Requesting Features
Before Requesting
- Search existing issues to see if it’s already requested
- Check the roadmap (if available) to see if it’s planned
- Consider alternatives that might solve your use case
Creating a Feature Request
Open a new issue on GitHub with: Required Information:- Title: Clear, concise feature description
- Problem: What problem are you trying to solve?
- Proposed solution: How should the feature work?
- Alternatives considered: What other solutions have you thought about?
- Use case: How would you use this feature?
Development Setup
Prerequisites
- macOS with OmniFocus installed
- Node.js (for linting only)
- Git for version control
- Jira instance with API access for testing
Getting Started
- Fork the repository on GitHub
-
Clone your fork:
-
Install dependencies (for linting):
-
Create a symbolic link to the OmniFocus Plug-Ins directory:
Alternatively, copy the plugin directory:
- Restart OmniFocus completely (⌘Q, then relaunch)
-
Verify the plugin loaded:
- Go to Automation → Plug-Ins
- Look for “Jira Sync”
Making Changes
-
Create a feature branch:
- Make your changes to the plugin files
-
Test your changes:
- Restart OmniFocus to load updated code
- Run Configure JIRA Sync to set up test credentials
- Run Sync Jira or Sync Jira Full to test
- Check Console.app for debug output (filter for “OmniFocus”)
-
Run the linter:
-
Commit your changes with a conventional commit message:
Manual Testing
There is no automated test suite. Test your changes manually by: Configuration Testing:- Test with invalid credentials (should show error)
- Test with invalid JQL query (should show error)
- Test with valid configuration (should save successfully)
- Test connection test button
- Test first sync (all new tasks)
- Test incremental sync (some updated, some unchanged)
- Test full sync with cleanup
- Test status changes (active → completed → reopened)
- Test due date updates
- Test parent issue changes (if project organization is enabled)
- Empty JQL results
- Large result sets (100+ issues)
- Issues with no description
- Issues with complex formatting
- Network failures (disconnect Wi-Fi during sync)
- Open Console.app (Applications → Utilities → Console)
- Filter for “OmniFocus” in the search bar
- Click Start to stream logs
- Run your action and observe output
- Look for errors, warnings, or unexpected behavior
Coding Standards
Language & Style
JavaScript Environment:- ES6+ syntax (const/let, arrow functions, async/await, template literals, destructuring)
- No Node.js or browser APIs
- No
btoa(),fetch(), orXMLHttpRequest - Use OmniFocus-specific APIs (
URL.FetchRequest,Preferences,Credentials, etc.)
- 2-space indentation
- Single quotes for strings
- Semicolons required
- camelCase for variables and functions
- UPPER_CASE for constants
- Descriptive variable names
Linting
Run ESLint before submitting:Code Comments
- Use comments to explain why, not what
- Document complex algorithms or non-obvious logic
- Add JSDoc comments for exported functions
- Avoid redundant comments that restate the code
Commit Messages
This project uses Conventional Commits:Commit Types
feat: New featurefix: Bug fixdocs: Documentation changesrefactor: Code refactoring (no functional changes)perf: Performance improvementstest: Adding or updating testschore: Maintenance tasks (dependencies, build config, etc.)style: Code style changes (formatting, whitespace, etc.)
Examples
Feature:Breaking Changes
If your commit introduces a breaking change, addBREAKING CHANGE: in the footer:
Pull Request Process
Before Submitting
-
Rebase on main to ensure a clean history:
-
Run the linter:
- Test manually in OmniFocus
- Update documentation if needed
-
Update CHANGELOG.md under
[Unreleased]for user-facing changes
Creating a Pull Request
-
Push your branch to your fork:
-
Open a Pull Request on GitHub against the
mainbranch -
Fill out the PR template with:
- Description of changes
- Motivation and context
- How to test
- Checklist of completed tasks
- Link related issues (e.g., “Fixes #123”)
PR Guidelines
Do:- Keep PRs focused on a single change
- Include clear commit messages
- Update documentation and CHANGELOG
- Test thoroughly before submitting
- Respond to review feedback promptly
- Submit PRs with unrelated changes
- Include merge commits (use rebase instead)
- Push directly to main
- Force push to shared branches
- Ignore linter errors
Code Review
All PRs require review before merging:-
Maintainers will review your code for:
- Correctness and functionality
- Code quality and style
- Performance implications
- Security considerations
- Documentation completeness
- You may be asked to make changes
- Address feedback by pushing new commits
- Once approved, a maintainer will merge your PR
Merge Strategy
- Squash merge is preferred for clean history
- Your commits will be squashed into a single commit on main
- The squashed commit will use your PR title as the commit message
- Ensure your PR title follows conventional commit format
Documentation
Good documentation is just as important as good code:README Updates
Update the README if your changes:- Add new features
- Change installation steps
- Modify configuration options
- Alter usage instructions
Code Documentation
Document your code:- Add comments for complex logic
- Use JSDoc for exported functions
- Explain non-obvious decisions
- Document function parameters and return values
User-Facing Documentation
If adding a user-facing feature, consider adding:- Usage examples
- Configuration instructions
- Troubleshooting tips
- FAQ entries
Community Guidelines
Code of Conduct
Be respectful and inclusive:- Use welcoming and inclusive language
- Respect differing viewpoints and experiences
- Accept constructive criticism gracefully
- Focus on what’s best for the community
- Show empathy towards other community members
Communication
GitHub Issues:- Use for bug reports and feature requests
- Search before opening new issues
- Provide clear, detailed information
- Stay on topic
- Use for code contributions
- Keep discussions focused on the code
- Be open to feedback
- Use GitHub Discussions (if enabled) for questions and general discussion
- Help others when you can
Recognition
Contributors are recognized in:- GitHub Contributors list
- CHANGELOG.md (for significant contributions)
- Release notes
Additional Resources
- Development Guide - Technical documentation
- Troubleshooting - Common issues and solutions
- Security & Privacy - Security information
- GitHub Repository
- Conventional Commits
- OmniFocus Omni Automation