Contributing
Contributing
Section titled “Contributing”Guidelines for contributing to atlcli.
Development Setup
Section titled “Development Setup”Prerequisites
Section titled “Prerequisites”- Bun v1.0+
- Node.js 18+ (for some tooling)
- An Atlassian Cloud account for testing
Clone and Build
Section titled “Clone and Build”git clone https://github.com/BjoernSchotte/atlcli.gitcd atlclibun installbun run buildRun Tests
Section titled “Run Tests”bun testProject Structure
Section titled “Project Structure”atlcli/├── apps/│ └── cli/ # CLI application│ └── src/│ ├── commands/ # Command handlers│ └── index.ts # Entry point├── packages/│ ├── core/ # Shared utilities│ ├── confluence/ # Confluence API client│ └── jira/ # Jira API client├── docs/ # Documentation (this site)└── spec/ # Internal specs and roadmapsCoding Standards
Section titled “Coding Standards”TypeScript
Section titled “TypeScript”- Use strict TypeScript settings
- Prefer explicit types over
any - Use interfaces for public APIs
Formatting
Section titled “Formatting”The project uses Biome for linting and formatting:
bun run lintbun run formatCommits
Section titled “Commits”Follow Conventional Commits:
feat(jira): add worklog timer modefix(confluence): handle empty pagesdocs: update authentication guidePull Requests
Section titled “Pull Requests”- Fork the repository
- Create a feature branch (
git checkout -b feat/my-feature) - Make your changes
- Run tests (
bun test) - Commit with conventional commit message
- Push and open a PR
PR Guidelines
Section titled “PR Guidelines”- Keep PRs focused on a single change
- Include tests for new functionality
- Update documentation if needed
- Ensure CI passes
Architecture
Section titled “Architecture”Monorepo Structure
Section titled “Monorepo Structure”atlcli uses a monorepo with:
apps/cli- The CLI applicationpackages/*- Shared libraries
API Clients
Section titled “API Clients”Each Atlassian product has its own package:
@atlcli/confluence- Confluence REST API@atlcli/jira- Jira REST API
Clients handle authentication, request/response, and error handling.
Command Pattern
Section titled “Command Pattern”Commands follow a consistent pattern:
async function handleCommand(args: string[], flags: Flags, opts: Options): Promise<void> { // 1. Parse and validate input // 2. Call API client // 3. Format and output result}Releasing
Section titled “Releasing”Releases are automated via the release script:
bun scripts/release.ts patch # 0.6.0 → 0.6.1bun scripts/release.ts minor # 0.6.0 → 0.7.0bun scripts/release.ts major # 0.6.0 → 1.0.0What the Release Script Does
Section titled “What the Release Script Does”- Validates clean working directory and main branch
- Runs tests and type checking
- Bumps version in
package.json - Generates changelog with git-cliff
- Creates commit and tag
- Pushes to origin (triggers GitHub release workflow)
- Waits for release artifacts
- Triggers Homebrew tap update
Options
Section titled “Options”--dry-run- Create commits/tags locally without pushing--skip-tests- Skip test step (use with caution)
Prerequisites
Section titled “Prerequisites”- GitHub CLI authenticated (
gh auth login) - On main branch with clean working directory
Example: Dry Run
Section titled “Example: Dry Run”# Preview release without pushingbun scripts/release.ts patch --dry-run
# Review changes, then rollbackgit reset --hard HEAD~1git tag -d v0.6.1Reporting Issues
Section titled “Reporting Issues”Use GitHub Issues for:
- Bug reports
- Feature requests
- Questions
Include:
- atlcli version (
atlcli --version) - Steps to reproduce
- Expected vs actual behavior
- Relevant error messages
License
Section titled “License”atlcli is MIT licensed. By contributing, you agree your contributions will be under the same license.
Related Topics
Section titled “Related Topics”- Getting Started - Installation and setup
- Creating Plugins - Extend atlcli with plugins
Jira and Confluence are trademarks of Atlassian Corporation Plc.
atlcli is not affiliated with, endorsed by, or sponsored by Atlassian.