Files
openclaw/CONTRIBUTING.md
quotentiroler ade7f0a8a0 feat(ci): activate staged pipeline enable push triggers + ci.yml gates
Enable the staged branch promotion pipeline:

- ci.yml: remove push-to-main trigger (handled by release-orchestrator),
  add workflow_call input for test_stage, gate Windows tests to beta+
  and macOS tests to stable-only to reduce PR CI cost.

- Re-enable push triggers on feature-pr, hotfix-pr, promote-branch,
  and release-orchestrator workflows.

- Update CONTRIBUTING.md to reflect active branch strategy.

IMPORTANT: Before merging, ensure develop/alpha/beta branches are
created and the team is ready for the new workflow.

Depends on: dev/ci-additive-workflows (PR1)
2026-02-07 09:51:22 -08:00

4.9 KiB

Contributing to OpenClaw

Welcome to the lobster tank! 🦞

Maintainers

How to Contribute

  1. Bugs & small fixes → Open a PR!
  2. New features / architecture → Start a GitHub Discussion or ask in Discord first
  3. Questions → Discord #setup-help

Before You PR

  • Test locally with your OpenClaw instance
  • Run tests: pnpm build && pnpm check && pnpm test
  • Keep PRs focused (one thing per PR)
  • Describe what & why

Control UI Decorators

The Control UI uses Lit with legacy decorators (current Rollup parsing does not support accessor fields required for standard decorators). When adding reactive fields, keep the legacy style:

@state() foo = "bar";
@property({ type: Number }) count = 0;

The root tsconfig.json is configured for legacy decorators (experimentalDecorators: true) with useDefineForClassFields: false. Avoid flipping these unless you are also updating the UI build tooling to support standard decorators.

AI/Vibe-Coded PRs Welcome! 🤖

Built with Codex, Claude, or other AI tools? Awesome - just mark it!

Please include in your PR:

  • Mark as AI-assisted in the PR title or description
  • Note the degree of testing (untested / lightly tested / fully tested)
  • Include prompts or session logs if possible (super helpful!)
  • Confirm you understand what the code does

AI PRs are first-class citizens here. We just want transparency so reviewers know what to look for.

Current Focus & Roadmap 🗺

We are currently prioritizing:

  • Stability: Fixing edge cases in channel connections (WhatsApp/Telegram).
  • UX: Improving the onboarding wizard and error messages.
  • Skills: Expanding the library of bundled skills and improving the Skill Creation developer experience.
  • Performance: Optimizing token usage and compaction logic.

Check the GitHub Issues for "good first issue" labels!

Core vs ClawHub

Not everything belongs in the main repo. Here's how to decide:

Belongs in Core Belongs on ClawHub
Channel integrations (Telegram, Discord, etc.) Domain-specific skills (QR codes, image tools, etc.)
CLI commands and infrastructure Custom workflows and automations
Provider integrations (LLM backends) Niche or experimental utilities
Security, routing, and core plumbing Third-party service integrations

Rule of thumb: if it adds new dependencies or is useful to some users but not most, it belongs on ClawHub. When in doubt, ask in Discord or open a Discussion before writing code.

Skills submitted as PRs to this repo will be redirected to ClawHub. If the core maintainers later decide certain functionality should be first-party, it will be integrated into core.

Branch Strategy

We use staged branch promotion to keep main stable:

dev/* / feature/* / fix/*  →  develop  →  alpha  →  beta  →  main

For External Contributors

  1. Fork the repo
  2. Create your branch (dev/my-feature, fix/some-bug, etc.)
  3. Open a PR targeting develop (not main)
  4. CI runs lightweight checks only — no heavy platform tests on your PR
  5. Once merged to develop, your changes promote through alpha → beta → main automatically

Do not target main — PRs to main will be redirected to develop.

For Maintainers

  • Regular changes: merge to develop, let the pipeline promote
  • Hotfixes: use hotfix/* branches for emergency fixes that bypass staging directly to main
  • Docs-only changes: skip the test pipeline automatically (paths-ignore)

See Pipeline docs for full details.