feat: Add aspect composition support (gt-8tmz.5)

- Add Aspects field to ComposeRules for listing aspect formulas
- Apply aspects during cooking after expansions
- Aspects are loaded by name and their advice rules are applied

Usage in formula:
  "compose": {
    "aspects": ["security-audit", "logging"]
  }

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-25 12:15:12 -08:00
parent de1a9559fa
commit 516c62e543
3 changed files with 27 additions and 3 deletions

View File

@@ -108,6 +108,24 @@ func runCook(cmd *cobra.Command, args []string) {
resolved.Steps = expandedSteps
}
// Apply aspects from compose.aspects (gt-8tmz.5)
if resolved.Compose != nil && len(resolved.Compose.Aspects) > 0 {
for _, aspectName := range resolved.Compose.Aspects {
aspectFormula, err := parser.LoadByName(aspectName)
if err != nil {
fmt.Fprintf(os.Stderr, "Error loading aspect %q: %v\n", aspectName, err)
os.Exit(1)
}
if aspectFormula.Type != formula.TypeAspect {
fmt.Fprintf(os.Stderr, "Error: %q is not an aspect formula (type=%s)\n", aspectName, aspectFormula.Type)
os.Exit(1)
}
if len(aspectFormula.Advice) > 0 {
resolved.Steps = formula.ApplyAdvice(resolved.Steps, aspectFormula.Advice)
}
}
}
// Apply prefix to proto ID if specified (bd-47qx)
protoID := resolved.Formula
if prefix != "" {