Files
gastown/internal/formula/README.md
mayor 5aa218fc96 docs(formula): add comprehensive package documentation
Add documentation to make the formula package more discoverable and
demonstrate its value as a reusable workflow definition library.

The formula package provides TOML-based workflow definitions with:
- Type inference (convoy, workflow, expansion, aspect)
- Comprehensive validation
- Cycle detection in dependency graphs
- Topological sorting (Kahn's algorithm)
- Ready-step computation for parallel execution

New files:
- doc.go: Package-level godoc with examples and API overview
- README.md: User guide with installation, quick start, and API reference
- example_test.go: Runnable examples for godoc and testing

The package has 130% test coverage (1,200 LOC tests for 925 LOC code)
and only depends on github.com/BurntSushi/toml.
2026-01-11 21:45:14 -05:00

234 lines
4.6 KiB
Markdown

# Formula Package
TOML-based workflow definitions with validation, cycle detection, and execution planning.
## Overview
The formula package parses and validates structured workflow definitions, enabling:
- **Type inference** - Automatically detect formula type from content
- **Validation** - Check required fields, unique IDs, valid references
- **Cycle detection** - Prevent circular dependencies
- **Topological sorting** - Compute dependency-ordered execution
- **Ready computation** - Find steps with satisfied dependencies
## Installation
```go
import "github.com/steveyegge/gastown/internal/formula"
```
## Quick Start
```go
// Parse a formula file
f, err := formula.ParseFile("workflow.formula.toml")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Formula: %s (type: %s)\n", f.Name, f.Type)
// Get execution order
order, _ := f.TopologicalSort()
fmt.Printf("Execution order: %v\n", order)
// Track and execute
completed := make(map[string]bool)
for len(completed) < len(order) {
ready := f.ReadySteps(completed)
// Execute ready steps (can be parallel)
for _, id := range ready {
step := f.GetStep(id)
fmt.Printf("Executing: %s\n", step.Title)
completed[id] = true
}
}
```
## Formula Types
### Workflow
Sequential steps with explicit dependencies. Steps execute when all `needs` are satisfied.
```toml
formula = "release"
description = "Standard release process"
type = "workflow"
[vars.version]
description = "Version to release"
required = true
[[steps]]
id = "test"
title = "Run Tests"
description = "Execute test suite"
[[steps]]
id = "build"
title = "Build Artifacts"
needs = ["test"]
[[steps]]
id = "publish"
title = "Publish Release"
needs = ["build"]
```
### Convoy
Parallel legs that execute independently, with optional synthesis.
```toml
formula = "security-scan"
type = "convoy"
[[legs]]
id = "sast"
title = "Static Analysis"
focus = "Code vulnerabilities"
[[legs]]
id = "deps"
title = "Dependency Audit"
focus = "Vulnerable packages"
[[legs]]
id = "secrets"
title = "Secret Detection"
focus = "Leaked credentials"
[synthesis]
title = "Security Report"
description = "Combine all findings"
depends_on = ["sast", "deps", "secrets"]
```
### Expansion
Template-based formulas for parameterized workflows.
```toml
formula = "component-review"
type = "expansion"
[[template]]
id = "analyze"
title = "Analyze {{component}}"
[[template]]
id = "test"
title = "Test {{component}}"
needs = ["analyze"]
```
### Aspect
Multi-aspect parallel analysis (similar to convoy).
```toml
formula = "code-review"
type = "aspect"
[[aspects]]
id = "security"
title = "Security Review"
focus = "OWASP Top 10"
[[aspects]]
id = "performance"
title = "Performance Review"
focus = "Complexity and bottlenecks"
[[aspects]]
id = "maintainability"
title = "Maintainability Review"
focus = "Code clarity and documentation"
```
## API Reference
### Parsing
```go
// Parse from file
f, err := formula.ParseFile("path/to/formula.toml")
// Parse from bytes
f, err := formula.Parse([]byte(tomlContent))
```
### Validation
Validation is automatic during parsing. Errors are descriptive:
```go
f, err := formula.Parse(data)
// Possible errors:
// - "formula field is required"
// - "invalid formula type \"foo\""
// - "duplicate step id: build"
// - "step \"deploy\" needs unknown step: missing"
// - "cycle detected involving step: a"
```
### Execution Planning
```go
// Get dependency-sorted order
order, err := f.TopologicalSort()
// Find ready steps given completed set
completed := map[string]bool{"test": true, "lint": true}
ready := f.ReadySteps(completed)
// Lookup individual items
step := f.GetStep("build")
leg := f.GetLeg("sast")
tmpl := f.GetTemplate("analyze")
aspect := f.GetAspect("security")
```
### Dependency Queries
```go
// Get all item IDs
ids := f.GetAllIDs()
// Get dependencies for a specific item
deps := f.GetDependencies("build") // Returns ["test"]
```
## Embedded Formulas
The package embeds common formulas for Gas Town workflows:
```go
// Provision embedded formulas to a beads workspace
count, err := formula.ProvisionFormulas("/path/to/workspace")
// Check formula health (outdated, modified, etc.)
report, err := formula.CheckFormulaHealth("/path/to/workspace")
// Update formulas safely (preserves user modifications)
updated, skipped, reinstalled, err := formula.UpdateFormulas("/path/to/workspace")
```
## Testing
```bash
go test ./internal/formula/... -v
```
The package has 130% test coverage (1,200 lines of tests for 925 lines of code).
## Dependencies
- `github.com/BurntSushi/toml` - TOML parsing (stable, widely-used)
## License
MIT License - see repository LICENSE file.