Skip to main content
Contributions are welcome! The plugin system makes it straightforward to add support for new agents, runtimes, trackers, and notification channels.

Getting Started

Prerequisites

  • Node.js 20+
  • pnpm 9.15+
  • Git 2.30+

First-Time Setup

1

Clone the repository

2

Install dependencies

3

Build all packages

Building is required before running the dev server.
4

Copy example config

5

Configure your settings

Running the Dev Server

The web dashboard depends on built packages. Always build before running the dev server.

Project Structure

Development Workflow

Making Changes

1

Create a feature branch

2

Make your changes

  • Follow CLAUDE.md conventions
  • Add tests for new features
  • Update documentation
3

Build and test

4

Commit

5

Push and open PR

Code Conventions

TypeScript

  • ESM modules - .js extensions in imports
  • node: prefix for builtins (node:fs, node:path)
  • Strict mode enabled
  • type imports for type-only imports
  • No any - use unknown + type guards
  • Semicolons, double quotes, 2-space indent - enforced by Prettier

Shell Commands

Security critical: Always follow these rules to prevent shell injection vulnerabilities.
  • Always use execFile (or spawn) - NEVER exec
  • Always add timeouts - { timeout: 30_000 }
  • Never interpolate user input - pass as array args
  • Do NOT use JSON.stringify for shell escaping

Plugin Development

Every plugin implements one of the core interfaces defined in packages/core/src/types.ts.

Plugin Pattern

Adding a New Plugin

1

Create plugin package

2

Set up package.json

3

Create src/index.ts

Implement the appropriate interface (Runtime, Agent, Workspace, Tracker, etc.).
4

Register in core

Add to packages/core/src/services/plugin-registry.ts.
5

Add tests

Create src/index.test.ts with test cases.
6

Build and test

Plugin Slots

Eight slots available for plugins:
All interfaces are defined in packages/core/src/types.ts - read this file first!

Testing

Test Coverage

The project has 3,288 test cases ensuring reliability and correctness.

Security

Secret Scanning

A pre-commit hook automatically scans for secrets:
If secrets are detected:
  1. Remove the secret from the file
  2. Use environment variables: ${SECRET_NAME}
  3. Add to .env.local (in .gitignore)
  4. Update example configs with placeholders

What Triggers the Scanner

  • API keys: lin_api_*, ghp_*, gho_*, sk-*, AKIA*
  • Tokens: xoxb-*, xoxa-*, etc.
  • Webhooks: https://hooks.slack.com/*, https://discord.com/api/webhooks/*
  • Private keys: -----BEGIN PRIVATE KEY-----
  • Database URLs: postgres://user:pass@host
  • Generic patterns: api_key=..., token=..., password=...

False Positives

If you get a false positive:
1

Verify it's not a real secret

Double-check the detected pattern is actually safe.
2

Update allowlist

Edit .gitleaks.toml:
3

Commit the change

Working with Worktrees

If using git worktrees for parallel development:

Debugging

Enable Verbose Logging

Attach to tmux Session

Inspect Session Metadata

Check Session Status

Submission Guidelines

Pull Request Process

1

Ensure all tests pass

2

Write a clear description

  • What does this PR do?
  • Why is it needed?
  • How does it work?
  • Any breaking changes?
3

Link related issues

Use Fixes #123 or Closes #123 in the PR description.
4

Request review

Tag relevant maintainers or wait for automatic review assignment.

Commit Message Format

Use Conventional Commits:

Code Review

Expect feedback on:
  • Code quality and style
  • Test coverage
  • Documentation updates
  • Security considerations
  • Performance implications

Resources

Getting Help

Need help contributing?
  1. Check existing issues and discussions
  2. Review the troubleshooting guide
  3. Ask questions in GitHub Discussions
  4. Join the community channels
Thank you for contributing to Agent Orchestrator!