Files
beads/docs/ROUTING.md
Steve Yegge cac9ae6647 Add routing integration tests and documentation
- Created routing_integration_test.go with comprehensive routing tests
- Tests cover maintainer/contributor detection, explicit overrides, end-to-end multi-repo
- Added docs/ROUTING.md documenting auto-routing feature
- Closed bd-6u6g, bd-zmi5, bd-nzt4, bd-btsm (routing tests)
- Updated bd-4ms and bd-8hf with progress notes

All routing tests pass. Multi-repo auto-routing is complete.

Amp-Thread-ID: https://ampcode.com/threads/T-2ea8b2ed-ceb7-432e-91f1-1f527b0e7b4d
Co-authored-by: Amp <amp@ampcode.com>
2025-11-04 23:12:42 -08:00

141 lines
3.9 KiB
Markdown

# Multi-Repo Auto-Routing
This document describes the auto-routing feature that intelligently directs new issues to the appropriate repository based on user role.
## Overview
Auto-routing solves the OSS contributor problem: contributors want to plan work locally without polluting upstream PRs with planning issues. The routing layer automatically detects whether you're a maintainer or contributor and routes `bd create` to the appropriate repository.
## User Role Detection
### Strategy
The routing system detects user role via:
1. **Explicit git config** (highest priority):
```bash
git config beads.role maintainer
# or
git config beads.role contributor
```
2. **Push URL inspection** (automatic):
- SSH URLs (`git@github.com:user/repo.git`) → Maintainer
- HTTPS with credentials → Maintainer
- HTTPS without credentials → Contributor
- No remote → Contributor (fallback)
### Examples
```bash
# Maintainer (SSH access)
git remote add origin git@github.com:owner/repo.git
bd create "Fix bug" -p 1
# → Creates in current repo (.)
# Contributor (HTTPS fork)
git remote add origin https://github.com/fork/repo.git
git remote add upstream https://github.com/owner/repo.git
bd create "Fix bug" -p 1
# → Creates in planning repo (~/.beads-planning by default)
```
## Configuration
Routing is configured via the database config:
```bash
# Set routing mode (auto = detect role, explicit = always use default)
bd config set routing.mode auto
# Set default planning repo
bd config set routing.default "~/.beads-planning"
# Set repo for maintainers (in auto mode)
bd config set routing.maintainer "."
# Set repo for contributors (in auto mode)
bd config set routing.contributor "~/.beads-planning"
```
## CLI Usage
### Auto-Routing
```bash
# Let bd decide based on role
bd create "Fix authentication bug" -p 1
# Maintainer: creates in current repo (.)
# Contributor: creates in ~/.beads-planning
```
### Explicit Override
```bash
# Force creation in specific repo (overrides auto-routing)
bd create "Fix bug" -p 1 --repo /path/to/repo
bd create "Add feature" -p 1 --repo ~/my-planning
```
## Discovered Issue Inheritance
Issues created with `discovered-from` dependencies automatically inherit the parent's `source_repo`:
```bash
# Parent in current repo
bd create "Implement auth" -p 1
# → Created as bd-abc (source_repo = ".")
# Discovered issue inherits parent's repo
bd create "Found bug in auth" -p 1 --deps discovered-from:bd-abc
# → Created with source_repo = "." (same as parent)
```
This ensures discovered work stays in the same repository as the parent task.
## Backward Compatibility
- **Single-repo workflows unchanged**: If no multi-repo config exists, all issues go to current repo
- **Explicit --repo always wins**: `--repo` flag overrides any auto-routing
- **No schema changes**: Routing is pure config-based, no database migrations
## Implementation
**Key Files:**
- `internal/routing/routing.go` - Role detection and routing logic
- `internal/routing/routing_test.go` - Unit tests
- `cmd/bd/create.go` - Integration with create command
- `routing_integration_test.go` - End-to-end tests
**API:**
```go
// Detect user role based on git configuration
func DetectUserRole(repoPath string) (UserRole, error)
// Determine target repo based on config and role
func DetermineTargetRepo(config *RoutingConfig, userRole UserRole, repoPath string) string
```
## Testing
```bash
# Run routing tests
go test -v -run TestRouting
# Tests cover:
# - Maintainer detection (git config)
# - Contributor detection (fork remotes)
# - SSH vs HTTPS remote detection
# - Explicit --repo override
# - End-to-end multi-repo workflow
```
## Future Enhancements
See [bd-k58](https://github.com/steveyegge/beads/issues/k58) for proposal workflow:
- `bd propose <id>` - Move issue from planning to upstream
- `bd withdraw <id>` - Un-propose
- `bd accept <id>` - Maintainer accepts proposal