--- id: formulas title: Formulas sidebar_position: 3 --- # Formulas Formulas are declarative workflow templates. ## Formula Format Formulas can be written in TOML (preferred) or JSON: ### TOML Format ```toml formula = "feature-workflow" description = "Standard feature development workflow" version = 1 type = "workflow" [vars.feature_name] description = "Name of the feature" required = true [[steps]] id = "design" title = "Design {{feature_name}}" type = "human" description = "Create design document" [[steps]] id = "implement" title = "Implement {{feature_name}}" needs = ["design"] [[steps]] id = "review" title = "Code review" needs = ["implement"] type = "human" [[steps]] id = "merge" title = "Merge to main" needs = ["review"] ``` ### JSON Format ```json { "formula": "feature-workflow", "description": "Standard feature development workflow", "version": 1, "type": "workflow", "vars": { "feature_name": { "description": "Name of the feature", "required": true } }, "steps": [ { "id": "design", "title": "Design {{feature_name}}", "type": "human" }, { "id": "implement", "title": "Implement {{feature_name}}", "needs": ["design"] } ] } ``` ## Formula Types | Type | Description | |------|-------------| | `workflow` | Standard step sequence | | `expansion` | Template for expansion operator | | `aspect` | Cross-cutting concerns | ## Variables Define variables with defaults and constraints: ```toml [vars.version] description = "Release version" required = true pattern = "^\\d+\\.\\d+\\.\\d+$" [vars.environment] description = "Target environment" default = "staging" enum = ["staging", "production"] ``` Use variables in steps: ```toml [[steps]] title = "Deploy {{version}} to {{environment}}" ``` ## Step Types | Type | Description | |------|-------------| | `task` | Normal work step (default) | | `human` | Requires human action | | `gate` | Async coordination point | ## Dependencies ### Sequential ```toml [[steps]] id = "step1" title = "First step" [[steps]] id = "step2" title = "Second step" needs = ["step1"] ``` ### Parallel then Join ```toml [[steps]] id = "test-unit" title = "Unit tests" [[steps]] id = "test-integration" title = "Integration tests" [[steps]] id = "deploy" title = "Deploy" needs = ["test-unit", "test-integration"] # Waits for both ``` ## Gates Add gates for async coordination: ```toml [[steps]] id = "approval" title = "Manager approval" type = "human" [steps.gate] type = "human" approvers = ["manager"] [[steps]] id = "deploy" title = "Deploy to production" needs = ["approval"] ``` ## Aspects (Cross-cutting) Apply transformations to matching steps: ```toml formula = "security-scan" type = "aspect" [[advice]] target = "*.deploy" # Match all deploy steps [advice.before] id = "security-scan-{step.id}" title = "Security scan before {step.title}" ``` ## Formula Locations Formulas are searched in order: 1. `.beads/formulas/` (project-level) 2. `~/.beads/formulas/` (user-level) 3. Built-in formulas ## Using Formulas ```bash # List available formulas bd mol list # Pour formula into molecule bd pour --var key=value # Preview what would be created bd pour --dry-run ``` ## Creating Custom Formulas 1. Create file: `.beads/formulas/my-workflow.formula.toml` 2. Define structure (see examples above) 3. Use with: `bd pour my-workflow` ## Example: Release Formula ```toml formula = "release" description = "Standard release workflow" version = 1 [vars.version] required = true pattern = "^\\d+\\.\\d+\\.\\d+$" [[steps]] id = "bump-version" title = "Bump version to {{version}}" [[steps]] id = "changelog" title = "Update CHANGELOG" needs = ["bump-version"] [[steps]] id = "test" title = "Run full test suite" needs = ["changelog"] [[steps]] id = "build" title = "Build release artifacts" needs = ["test"] [[steps]] id = "tag" title = "Create git tag v{{version}}" needs = ["build"] [[steps]] id = "publish" title = "Publish release" needs = ["tag"] type = "human" ```