From 149ebdb95f3e7e52e774259197507fc76227a875 Mon Sep 17 00:00:00 2001 From: Christian Gick Date: Sun, 11 Jan 2026 07:27:10 +0200 Subject: [PATCH] fix: Simplify component_graph query to avoid recursive CTE error PostgreSQL does not support multiple recursive references in the same CTE. Changed to use simpler subqueries for direct dependencies + dependents. Co-Authored-By: Claude Opus 4.5 --- src/tools/impact.ts | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/tools/impact.ts b/src/tools/impact.ts index 843d967..0b5c53f 100644 --- a/src/tools/impact.ts +++ b/src/tools/impact.ts @@ -256,25 +256,22 @@ export async function componentGraph( nodes: Array<{ id: string; name: string; type: string }>; edges: Array<{ from: string; to: string; type: string }>; }> { - const nodes = component_id - ? await query<{ id: string; name: string; type: string }>( - `WITH RECURSIVE deps AS ( - SELECT id, name, type FROM components WHERE id = $1 - UNION - SELECT c.id, c.name, c.type FROM components c - JOIN component_dependencies cd ON c.id = cd.depends_on - JOIN deps d ON cd.component_id = d.id - UNION - SELECT c.id, c.name, c.type FROM components c - JOIN component_dependencies cd ON c.id = cd.component_id - JOIN deps d ON cd.depends_on = d.id - ) - SELECT DISTINCT id, name, type FROM deps`, - [component_id] - ) - : await query<{ id: string; name: string; type: string }>( - 'SELECT id, name, type FROM components' - ); + let nodes: Array<{ id: string; name: string; type: string }>; + + if (component_id) { + // Get component and its direct dependencies + dependents + nodes = await query<{ id: string; name: string; type: string }>( + `SELECT DISTINCT c.id, c.name, c.type FROM components c + WHERE c.id = $1 + OR c.id IN (SELECT depends_on FROM component_dependencies WHERE component_id = $1) + OR c.id IN (SELECT component_id FROM component_dependencies WHERE depends_on = $1)`, + [component_id] + ); + } else { + nodes = await query<{ id: string; name: string; type: string }>( + 'SELECT id, name, type FROM components' + ); + } const nodeIds = nodes.map(n => n.id); const edges = nodeIds.length > 0