feat: Add source tracing metadata to cooked steps (gt-8tmz.18)
Add SourceFormula and SourceLocation fields to track where each step came from during the cooking process. This enables debugging of complex compositions with inheritance, expansion, and advice. Changes: - Added SourceFormula and SourceLocation fields to Step struct (formula/types.go) - Added same fields to Issue struct (types/types.go) - Added SetSourceInfo() to parser.go - sets source on all steps after parsing - Updated cook.go to copy source fields from Step to Issue - Updated dry-run output to display source info: [from: formula@location] - Updated advice.go to set source on advice-generated steps - Updated controlflow.go to preserve source on loop-expanded steps - Updated expand.go to preserve source on template-expanded steps The source location format is: - steps[N] - regular step at index N - steps[N].children[M] - child step - steps[N].loop.body[M] - loop body step - template[N] - expansion template step - advice - step inserted by advice transformation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -374,16 +374,18 @@ func collectStepsRecursive(steps []*formula.Step, parentID string, idMapping map
|
||||
}
|
||||
|
||||
issue := &types.Issue{
|
||||
ID: issueID,
|
||||
Title: step.Title, // Keep {{variables}} for substitution at pour time
|
||||
Description: step.Description,
|
||||
Status: types.StatusOpen,
|
||||
Priority: priority,
|
||||
IssueType: issueType,
|
||||
Assignee: step.Assignee,
|
||||
IsTemplate: true,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
ID: issueID,
|
||||
Title: step.Title, // Keep {{variables}} for substitution at pour time
|
||||
Description: step.Description,
|
||||
Status: types.StatusOpen,
|
||||
Priority: priority,
|
||||
IssueType: issueType,
|
||||
Assignee: step.Assignee,
|
||||
IsTemplate: true,
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
SourceFormula: step.SourceFormula, // Source tracing (gt-8tmz.18)
|
||||
SourceLocation: step.SourceLocation, // Source tracing (gt-8tmz.18)
|
||||
}
|
||||
*issues = append(*issues, issue)
|
||||
|
||||
@@ -502,7 +504,13 @@ func printFormulaSteps(steps []*formula.Step, indent string) {
|
||||
typeStr = fmt.Sprintf(" (%s)", step.Type)
|
||||
}
|
||||
|
||||
fmt.Printf("%s%s %s: %s%s%s\n", indent, connector, step.ID, step.Title, typeStr, depStr)
|
||||
// Source tracing info (gt-8tmz.18)
|
||||
sourceStr := ""
|
||||
if step.SourceFormula != "" || step.SourceLocation != "" {
|
||||
sourceStr = fmt.Sprintf(" [from: %s@%s]", step.SourceFormula, step.SourceLocation)
|
||||
}
|
||||
|
||||
fmt.Printf("%s%s %s: %s%s%s%s\n", indent, connector, step.ID, step.Title, typeStr, depStr, sourceStr)
|
||||
|
||||
if len(step.Children) > 0 {
|
||||
childIndent := indent
|
||||
|
||||
Reference in New Issue
Block a user