Thank you for your interest in contributing! AI Agent Assembly is an open-source project and we welcome contributions of all sizes — bug reports, documentation fixes, new features, performance improvements, and more.
This guide describes the org-wide conventions that apply across all repositories under ai-agent-assembly. For repo-specific setup (build commands, test runners, language toolchains), see the CONTRIBUTING.md in each individual repo — it takes precedence over this file where they differ.
- A GitHub account
- Git installed locally
- Familiarity with the language and tooling of the repo you're contributing to
- The repo cloned locally (see each repo's README for setup steps)
All feature and fix branches follow this four-part format:
<release-or-phase>/<ticket-number>/<type>/<short-summary>
-
<release-or-phase>— milestone or sprint identifier (e.g.,v0.0.1,phase1) -
<ticket-number>— Jira ticket reference (e.g.,AAASM-1316) -
<type>— change category, one of:Type When to use featNew feature or capability fixBug fix refactorRefactor with no behavior change testTest-only change docsDocumentation change configConfiguration / CI change depsDependency upgrade removeDeletion or removal lintLint or type-error fix -
<short-summary>— 2–4 words insnake_case, max 30 characters
Example: v0.0.1/AAASM-42/feat/add_agent_registry
Commits use Gitmoji format with a scope and imperative summary:
<emoji> (<scope>): <imperative summary>
Examples:
✨ (gateway): Add /v1/capability/matrix endpoint🐛 (auth): Fix token expiry check using UTC♻️ (proxy): Extract MitM handler into a separate module
Keep each commit small and bisectable — one logical change per commit. If you need two sentences to describe a commit, split it into two.
| Emoji | Scope |
|---|---|
✨ |
New feature |
🐛 |
Bug fix |
♻️ |
Refactor |
✅ |
Tests |
📝 |
Documentation |
🔧 |
Configuration / CI |
⬆️ |
Dependency upgrade |
🗑️ |
Removal |
🚨 |
Lint / type-error fix |
🎉 |
Initial commit |
[<ticket>] <emoji> (<scope>): <imperative summary>
Example: [AAASM-42] ✨ (gateway): Add /v1/capability/matrix endpoint
Each repo provides a .github/PULL_REQUEST_TEMPLATE.md. Fill it out completely; at minimum the description must include:
- What changed — one short paragraph
- Why — motivation, context, ticket link
- How to verify — manual steps or test reference
- Related issues — ticket and any related GitHub issues
PRs always target main, even when your branch was created from another feature branch.
Keep PRs focused. One concern per PR — don't bundle unrelated changes. If a single ticket needs more than ~500 lines of diff, split it into a sequence of stacked PRs.
Every repo's CI is hand-rolled, which is why the same gaps recur. To stop
retrofitting, the org .github repo ships starter workflows that bake these
eight principles in, so new and empty repos start compliant. Pick one from the
Actions → New workflow screen (look for "… (Agent Assembly playbook)"):
Rust CI, Node / TypeScript CI, Python CI, Go CI, or Docs CI.
The reference rationale and the measured-result evidence (before/after CI
minutes and wall-clock) live in agent-assembly's
docs/src/benchmarks/ci-cd-pipeline-performance.md.
| # | Principle | How the starters apply it |
|---|---|---|
| 1 | Path-scoped triggers | on.push / on.pull_request list paths: so doc-only or unrelated edits don't spend CI minutes. |
| 2 | Concurrency cancel | concurrency cancels superseded runs only on PRs (cancel-in-progress: ${{ github.event_name == 'pull_request' }}) — $default-branch and tag pushes always run to completion. |
| 3 | Single CI Success gate |
An aggregate job (needs: [...] + if: always()) is the one required check. Branch protection requires only CI Success, not every job. |
| 4 | Linux-default matrices | The OS matrix is ["ubuntu-latest"] on PRs and only fans out to macOS/Windows on $default-branch / tag pushes. |
| 5 | Least-privilege permissions | A top-level permissions: contents: read; jobs widen scope only when they must. |
| 6 | Job timeouts | Every job sets timeout-minutes so a hung step can't burn the runner budget. |
| 7 | Reusable gate | The CI Success logic is a reusable workflow (ci-success.yml, on: workflow_call); repos uses: it instead of copy-pasting (see below). |
| 8 | Cache the toolchain | Each starter caches its package/build artifacts (Swatinem/rust-cache, setup-node … cache: pnpm, setup-uv, setup-go) to keep warm runs fast. |
Instead of copy-pasting the aggregate gate, call the org reusable workflow:
ci-success:
name: CI Success
if: always()
needs: [lint, test]
uses: ai-agent-assembly/.github/.github/workflows/ci-success.yml@main
with:
needs-json: ${{ toJSON(needs) }}It fails if any upstream job's result is failure or cancelled; skipped
jobs are non-blocking. Make CI Success the only required status check.
- At least one approval is required before merge.
- Address every reviewer comment before requesting re-review.
- Don't force-push during an active review (only allowed when rebasing onto the latest base branch — never to rewrite review history).
- CI must be green before merge. Don't bypass with
--no-verifyor by disabling checks. - The reviewer or assignee picks the merge strategy (typically squash or rebase). The repo's default reflects the team's preference.
By contributing to AI Agent Assembly, you certify that:
- The contribution was created in whole or in part by you, or
- The contribution is based on work that is licensed under an appropriate open-source license, or
- The contribution was provided directly to you by someone who certified (1) or (2).
We do not currently require explicit commit sign-off (git commit -s), but reserve the right to add DCO bot enforcement in the future. If we do, we'll announce it on the relevant repo's Discussions and update this section.
By contributing, you agree that your contributions will be licensed under the same license as the repository you're contributing to (Apache 2.0 for all public repos in this org, unless a specific repo states otherwise in its LICENSE file).