| name | protobuf |
| description | Use when working with Protocol Buffer (.proto) files, buf.yaml, buf.gen.yaml, or buf.lock. Covers proto design, buf CLI, gRPC/Connect services, protovalidate constraints, schema evolution, and troubleshooting lint/breaking errors. |
| filePatterns | ["**/*.proto","**/buf.yaml","**/buf.*.yaml","**/buf.gen.yaml","**/buf.gen.*.yaml","**/buf.lock"] |
Protocol Buffers
When You Need This Skill
- Creating or editing
.proto files
- Setting up
buf.yaml or buf.gen.yaml
- Designing gRPC or Connect services
- Adding protovalidate constraints
- Troubleshooting buf lint or breaking change errors
Core Workflow
1. Match Project Style
Before writing proto code, review existing .proto files in the project.
Match conventions for naming, field ordering, structural patterns, validation, and documentation style.
If none exists, ask the user what style should be used or an existing library to emulate.
2. Write Proto Code
3. Verify Changes
Always run after making changes:
buf format -w && buf lint
Check for a Makefile first—many projects use make lint or make format.
Fix all errors before considering the change complete.
Quick Reference
Project Setup
New Project
-
Create directory structure:
proto/
├── buf.yaml
├── buf.gen.yaml
└── company/
└── domain/
└── v1/
└── service.proto
-
Use assets/buf.yaml as starting point
-
Use assets/buf.gen.*.yaml for code generation config
Code Generation Templates
| Template | Use For |
|---|
buf.gen.go.yaml | Go with gRPC |
buf.gen.go-connect.yaml | Go with Connect |
buf.gen.ts.yaml | TypeScript with Connect |
buf.gen.python.yaml | Python with gRPC |
buf.gen.java.yaml | Java with gRPC |
Proto File Templates
Located in assets/proto/example/v1/:
| Template | Description |
|---|
book.proto | Entity message, BookRef oneof, enum |
book_service.proto | Full CRUD with batch ops, pagination, ordering |
Common Tasks
Add a new field
- Use next sequential field number
- Add appropriate semantic validation
- Document the field
- Run
buf format -w && buf lint
Remove a field
- Reserve the field number AND name:
reserved 4;
reserved "old_field_name";
- Run
buf breaking --against '.git#branch=main' to verify
Add semantic validation
See protovalidate.md for constraint patterns:
- Required fields:
(buf.validate.field).required = true
- String formats:
.string.uuid, .string.email, .string.uri
- Numeric bounds:
.int32.gt, .uint32.lte
- Repeated bounds:
.repeated.min_items, .repeated.max_items
Verification Checklist
After making changes: