Add context packs impact analysis and message validation

This commit is contained in:
2026-05-07 10:17:24 +08:00
parent f2d0a83705
commit 0c5254eb1b
18 changed files with 780 additions and 13 deletions

View File

@@ -96,6 +96,33 @@ func (g Graph) Markdown() string {
return builder.String()
}
func (p *Project) ImpactGraph(impact ImpactResult) Graph {
nodeMap := map[string]GraphNode{}
if unit, ok := p.ByID[impact.Entry]; ok {
nodeMap[impact.Entry] = GraphNode{ID: unit.ID, Title: unit.Title, Type: unit.Type, Resolution: unit.Resolution, File: unit.File}
} else {
nodeMap[impact.Entry] = GraphNode{ID: impact.Entry, Missing: true}
}
for _, entry := range append(append([]ImpactEntry{}, impact.Direct...), impact.Indirect...) {
nodeMap[entry.ID] = GraphNode{ID: entry.ID, Title: entry.Title, Type: entry.Type, Resolution: entry.Resolution, File: entry.File}
if _, ok := nodeMap[entry.Via]; !ok && entry.Via != "" {
if unit, exists := p.ByID[entry.Via]; exists {
nodeMap[entry.Via] = GraphNode{ID: unit.ID, Title: unit.Title, Type: unit.Type, Resolution: unit.Resolution, File: unit.File}
} else {
nodeMap[entry.Via] = GraphNode{ID: entry.Via, Missing: true}
}
}
}
nodes := make([]GraphNode, 0, len(nodeMap))
for _, node := range nodeMap {
nodes = append(nodes, node)
}
sort.Slice(nodes, func(i, j int) bool {
return nodes[i].ID < nodes[j].ID
})
return Graph{Nodes: nodes, Edges: impact.Edges}
}
func (g Graph) Canvas() ([]byte, error) {
canvas := canvasDocument{
Nodes: make([]canvasNode, 0, len(g.Nodes)),