From 2c047af9bdfdbc8882af32f04ebfc0a860e6ce14 Mon Sep 17 00:00:00 2001 From: Horus AI Date: Tue, 24 Mar 2026 16:15:42 +0100 Subject: [PATCH] fix: proper parsing of clawhub output with multi-word names --- app/api/clawhub/route.ts | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/app/api/clawhub/route.ts b/app/api/clawhub/route.ts index 1fa6679..3db9120 100644 --- a/app/api/clawhub/route.ts +++ b/app/api/clawhub/route.ts @@ -23,17 +23,13 @@ export async function GET(req: NextRequest) { const skills = lines .filter((line) => line.includes("(")) .map((line) => { - const match = line.trim().match(/^([^\s]+)\s+([^\s]+)\s+\(([0-9.]+)\)$/); + const match = line.trim().match(/^(.+?)\s+(.+?)\s+\(([0-9.]+)\)$/); if (match) { return { slug: match[1], name: match[2], score: parseFloat(match[3]) }; } - const parts = line.trim().split(/\s+/); - return { - slug: parts[0] || "", - name: parts[1] || parts[0] || "", - score: parseFloat(parts[parts.length - 1]?.replace(/[()]/g, "") || "0") || 0, - }; - }); + return null; + }) + .filter(Boolean); return NextResponse.json({ skills }); } @@ -45,14 +41,14 @@ export async function GET(req: NextRequest) { const skills = lines .filter((line) => line.includes("(")) .map((line) => { - const parts = line.trim().split(/\s+/); - return { - slug: parts[0] || "", - name: parts[1] || parts[0] || "", - score: parseFloat(parts[parts.length - 1]?.replace(/[()]/g, "") || "0") || 0, - }; + const match = line.trim().match(/^(.+?)\s+(.+?)\s+\(([0-9.]+)\)$/); + if (match) { + return { slug: match[1], name: match[2], score: parseFloat(match[3]) }; + } + return null; }) - .sort((a, b) => b.score - a.score) + .filter(Boolean) + .sort((a: any, b: any) => b.score - a.score) .slice(0, 20); return NextResponse.json({ skills }); }