New reference docs: - agents/ref-btmsg.md: inter-agent messaging schema and CLI - agents/ref-bttask.md: kanban task board operations - providers/ref-providers.md: Claude/Codex/Ollama/Aider comparison - config/ref-settings.md: (already committed) New guides: - contributing/dual-repo-workflow.md: community vs commercial repos - plugins/guide-developing.md: Web Worker sandbox API and publishing New pro docs: - pro/features/knowledge-base.md: persistent memory + symbol graph - pro/features/git-integration.md: context injection + branch policy - pro/marketplace/README.md: 13 plugins catalog Split files: - architecture/data-model.md: from architecture.md (schemas, layout) - production/hardening.md: from production.md (supervisor, sandbox, WAL) - production/features.md: from production.md (FTS5, plugins, secrets, audit)
5.2 KiB
Dual-Repo Workflow
Agents Orchestrator uses a dual-repository model to maintain an open-source community edition alongside a private commercial edition.
Repositories
| Remote | Repository | Visibility | Purpose |
|---|---|---|---|
origin |
DexterFromLab/agent-orchestrator | Public (MIT) | Community edition |
orchestrator |
agents-orchestrator/agents-orchestrator | Private | Commercial edition |
Both remotes are configured in every developer clone:
$ git remote -v
orchestrator git@github.com:agents-orchestrator/agents-orchestrator.git (fetch)
orchestrator git@github.com:agents-orchestrator/agents-orchestrator.git (push)
origin git@github.com:DexterFromLab/agent-orchestrator.git (fetch)
origin no-push-to-community (push)
Note: origin push URL is set to no-push-to-community -- a non-existent URL
that causes git push origin to fail. This is intentional. All pushes go to
orchestrator.
Development flow
All daily development happens on the orchestrator remote. The community
edition receives curated exports stripped of commercial code.
Developer -> orchestrator (private) -> curated export -> origin (public)
Branch model
| Branch | Scope | Description |
|---|---|---|
main |
Shared | Community-safe code. Synced between both remotes. |
hib_changes_v2 |
Development | Active development branch on orchestrator. |
commercial/* |
Pro-only | Features exclusive to the commercial edition. |
Typical workflow
- Create a feature branch from
mainonorchestrator. - Develop and test.
- Push to
orchestratorand open a PR againstmain. - After merge, community sync happens via curated export.
Syncing from community
To pull community contributions into the private repo:
make sync
This runs:
git fetch origin
git merge origin/main
Resolve any conflicts between community contributions and commercial code.
Leak prevention
Three layers prevent commercial code from reaching the public repository.
1. Git pre-push hook
.githooks/pre-push scans commits being pushed to any remote matching
DexterFromLab. If any commit touches files in agor-pro/ or
src/lib/commercial/, the push is blocked:
==========================================
PUSH BLOCKED: Commercial code detected!
==========================================
The following commercial files were found in commits being pushed:
- agor-pro/src/billing.rs
- src/lib/commercial/license.ts
You are pushing to the community remote (git@github.com:DexterFromLab/...).
Commercial code must NOT be pushed to this remote.
==========================================
Enable the hook after cloning:
make setup
# or manually:
git config core.hooksPath .githooks
2. CI leak check
.github/workflows/leak-check.yml runs on every push and PR to main on the
community repo. It fails the build if:
agor-pro/directory existssrc/lib/commercial/contains files beyond.gitkeep- Any file contains
SPDX-License-Identifier: LicenseRef-Agor-Commercial
3. SPDX headers
Commercial files carry an SPDX header identifying them:
// SPDX-License-Identifier: LicenseRef-Agor-Commercial
The CI leak check scans for this marker as a final safety net.
File conventions
| Path | Edition | Description |
|---|---|---|
agor-pro/ |
Commercial | Pro Rust crate (billing, licensing, accounts) |
src/lib/commercial/ |
Commercial | Pro frontend components |
src/lib/commercial/.gitkeep |
Community | Placeholder (no content) |
| Everything else | Community | MIT-licensed code |
Commercial code is conditionally compiled:
- Rust:
#[cfg(feature = "pro")]gates, Cargo feature flag - Frontend:
AGOR_EDITIONenv var checked at test/build time
Makefile targets
make setup # Configure git hooks + npm install
make build # Community build (cargo build + npm run build)
make build-pro # Commercial build (cargo build --features pro)
make test # Run all community tests (npm run test:all)
make test-pro # Run commercial tests (cargo test --features pro + vitest)
make sync # Pull community changes (git fetch origin + merge)
make clean # Remove build artifacts (cargo clean + vite cache)
Building the commercial Tauri app
cargo tauri build -- --features pro \
--config src-tauri/tauri.conf.commercial.json
This merges the commercial Tauri config (different bundle ID, product name,
updater URL) with the base config and enables the pro Cargo feature.
Adding commercial features
- Place Rust code in
agor-pro/src/or behind#[cfg(feature = "pro")]. - Place frontend code in
src/lib/commercial/. - Add SPDX header to every new file.
- Test with
make test-pro. - Push to
orchestratoronly. Never push toorigin.
Removing commercial code for export
When preparing a community release:
- Ensure
mainhas no commercial file paths in its history. - The
no-push-to-communitypush URL and pre-push hook prevent accidents. - If a commercial file is accidentally committed to
main, rewrite history before any push toorigin. Rotate any exposed secrets.