* docs: fix Go version typo in CONTRIBUTING.md (1.25 -> 1.24) * docs: update Go version requirement to 1.24+ across docs * docs: fix broken links to docs/ in npm-package/README.md * docs: fix QUICKSTART.md path reference in AGENTS.md
242 lines
6.2 KiB
Markdown
242 lines
6.2 KiB
Markdown
# BD Extension Example (Go)
|
|
|
|
This example demonstrates how to extend bd with custom tables for application-specific orchestration, following the patterns described in [EXTENDING.md](../../EXTENDING.md).
|
|
|
|
## What This Example Shows
|
|
|
|
1. **Schema Extension**: Adding custom tables (`example_executions`, `example_checkpoints`) to bd's SQLite database
|
|
2. **Foreign Key Integration**: Linking extension tables to bd's `issues` table with proper cascading
|
|
3. **Dual-Layer Access**: Using bd's Go API for issue management while directly querying extension tables
|
|
4. **Complex Queries**: Joining bd's issues with extension tables for powerful insights
|
|
5. **Execution Tracking**: Implementing agent assignment, checkpointing, and crash recovery patterns
|
|
|
|
## Key Patterns Illustrated
|
|
|
|
### Pattern 1: Namespace Your Tables
|
|
|
|
All tables are prefixed with `example_` to avoid conflicts:
|
|
|
|
```sql
|
|
CREATE TABLE example_executions (...)
|
|
CREATE TABLE example_checkpoints (...)
|
|
```
|
|
|
|
### Pattern 2: Foreign Key Relationships
|
|
|
|
Extension tables link to bd's issues with cascading deletes:
|
|
|
|
```sql
|
|
FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE
|
|
```
|
|
|
|
### Pattern 3: Index Common Queries
|
|
|
|
Indexes are created for frequent query patterns:
|
|
|
|
```sql
|
|
CREATE INDEX idx_executions_status ON example_executions(status);
|
|
CREATE INDEX idx_executions_issue ON example_executions(issue_id);
|
|
```
|
|
|
|
### Pattern 4: Layer Separation
|
|
|
|
- **bd layer**: Issue tracking, dependencies, ready work
|
|
- **Extension layer**: Execution state, agent assignments, checkpoints
|
|
|
|
### Pattern 5: Join Queries
|
|
|
|
Powerful queries join both layers:
|
|
|
|
```sql
|
|
SELECT i.id, i.title, i.priority, e.status, e.agent_id, COUNT(c.id)
|
|
FROM issues i
|
|
LEFT JOIN example_executions e ON i.id = e.issue_id
|
|
LEFT JOIN example_checkpoints c ON e.id = c.execution_id
|
|
GROUP BY i.id, e.id
|
|
```
|
|
|
|
## Building and Running
|
|
|
|
### Prerequisites
|
|
|
|
- Go 1.24 or later
|
|
- bd initialized in a directory (run `bd init --prefix demo`)
|
|
|
|
### Install
|
|
|
|
```bash
|
|
# Install from the repository
|
|
go install github.com/steveyegge/beads/examples/bd-example-extension-go@latest
|
|
|
|
# Or install from local source
|
|
cd examples/bd-example-extension-go
|
|
go install .
|
|
```
|
|
|
|
The binary will be installed as `bd-example-extension-go` in your `$GOPATH/bin` (or `$GOBIN` if set).
|
|
|
|
### Running
|
|
|
|
```bash
|
|
# Auto-discover database and run
|
|
bd-example-extension-go
|
|
|
|
# Or specify database path
|
|
bd-example-extension-go -db .beads/demo.db
|
|
```
|
|
|
|
**Output:**
|
|
```
|
|
Claiming: demo-5
|
|
✓ assess
|
|
✓ implement
|
|
✓ test
|
|
|
|
Status:
|
|
demo-4: Fix memory leak [closed] agent=agent-demo checkpoints=3
|
|
demo-1: Implement auth [in_progress] agent=agent-alice checkpoints=0
|
|
demo-5: Test minimized [closed] agent=demo-agent checkpoints=3
|
|
```
|
|
|
|
## Code Structure
|
|
|
|
**Just 116 lines total** - minimal, focused extension example.
|
|
|
|
- **main.go** (93 lines): Complete workflow with embedded schema
|
|
- **schema.sql** (23 lines): Extension tables (`example_executions`, `example_checkpoints`) with foreign keys and indexes
|
|
|
|
Demonstrates:
|
|
1. Auto-discover database (`beads.FindDatabasePath`)
|
|
2. Dual-layer access (bd API + direct SQL)
|
|
3. Execution tracking with checkpoints
|
|
4. Complex joined queries across layers
|
|
|
|
## Example Queries
|
|
|
|
### Find Running Executions with Checkpoint Count
|
|
|
|
```go
|
|
query := `
|
|
SELECT i.id, i.title, e.status, e.agent_id, COUNT(c.id) as checkpoints
|
|
FROM issues i
|
|
INNER JOIN example_executions e ON i.id = e.issue_id
|
|
LEFT JOIN example_checkpoints c ON e.id = c.execution_id
|
|
WHERE e.status = 'running'
|
|
GROUP BY i.id, e.id
|
|
`
|
|
```
|
|
|
|
### Find Failed Executions
|
|
|
|
```go
|
|
query := `
|
|
SELECT i.id, i.title, e.error, e.completed_at
|
|
FROM issues i
|
|
INNER JOIN example_executions e ON i.id = e.issue_id
|
|
WHERE e.status = 'failed'
|
|
ORDER BY e.completed_at DESC
|
|
`
|
|
```
|
|
|
|
### Get Latest Checkpoint for Recovery
|
|
|
|
```go
|
|
query := `
|
|
SELECT checkpoint_data
|
|
FROM example_checkpoints
|
|
WHERE execution_id = ?
|
|
ORDER BY created_at DESC
|
|
LIMIT 1
|
|
`
|
|
```
|
|
|
|
## Integration with bd
|
|
|
|
### Using bd's Go API
|
|
|
|
```go
|
|
// Auto-discover database path
|
|
dbPath := beads.FindDatabasePath()
|
|
if dbPath == "" {
|
|
log.Fatal("No bd database found")
|
|
}
|
|
|
|
// Open bd storage
|
|
store, err := beads.NewSQLiteStorage(dbPath)
|
|
|
|
// Find ready work
|
|
readyIssues, err := store.GetReadyWork(ctx, beads.WorkFilter{Limit: 10})
|
|
|
|
// Update issue status
|
|
updates := map[string]interface{}{"status": beads.StatusInProgress}
|
|
err = store.UpdateIssue(ctx, issueID, updates, "agent-name")
|
|
|
|
// Close issue
|
|
err = store.CloseIssue(ctx, issueID, "Completed", "agent-name")
|
|
|
|
// Find corresponding JSONL path (for git hooks, monitoring, etc.)
|
|
jsonlPath := beads.FindJSONLPath(dbPath)
|
|
```
|
|
|
|
### Direct Database Access
|
|
|
|
```go
|
|
// Open same database for extension tables
|
|
db, err := sql.Open("sqlite3", dbPath)
|
|
|
|
// Initialize extension schema
|
|
_, err = db.Exec(Schema)
|
|
|
|
// Query extension tables
|
|
rows, err := db.Query("SELECT * FROM example_executions WHERE status = ?", "running")
|
|
```
|
|
|
|
## Testing the Example
|
|
|
|
1. **Initialize bd:**
|
|
```bash
|
|
bd init --prefix demo
|
|
```
|
|
|
|
2. **Create some test issues:**
|
|
```bash
|
|
bd create "Implement authentication" -p 1 -t feature
|
|
bd create "Add API documentation" -p 1 -t task
|
|
bd create "Refactor database layer" -p 2 -t task
|
|
```
|
|
|
|
3. **Run the demo:**
|
|
```bash
|
|
bd-example-extension-go -cmd demo
|
|
```
|
|
|
|
4. **Check the results:**
|
|
```bash
|
|
bd list
|
|
sqlite3 .beads/demo.db "SELECT * FROM example_executions"
|
|
```
|
|
|
|
## Real-World Usage
|
|
|
|
This pattern is used in production by:
|
|
|
|
- **VC (VibeCoder)**: Multi-agent orchestration with state machines
|
|
- **CI/CD Systems**: Build tracking and artifact management
|
|
- **Task Runners**: Parallel execution with dependency resolution
|
|
|
|
See [EXTENDING.md](../../EXTENDING.md) for more patterns and the VC implementation example.
|
|
|
|
## Next Steps
|
|
|
|
1. **Add Your Own Tables**: Extend the schema with application-specific tables
|
|
2. **Implement State Machines**: Use checkpoints for resumable workflows
|
|
3. **Add Metrics**: Track execution times, retry counts, success rates
|
|
4. **Build Dashboards**: Query joined data for visibility
|
|
5. **Integrate with Agents**: Use bd's ready work queue for agent orchestration
|
|
|
|
## See Also
|
|
|
|
- [EXTENDING.md](../../EXTENDING.md) - Complete extension guide
|
|
- [../../README.md](../../README.md) - bd documentation
|
|
- Run `bd quickstart` for an interactive tutorial
|