diff --git a/src/app/_components/DownloadedScriptsTab.tsx b/src/app/_components/DownloadedScriptsTab.tsx index 94552c0..a2e3331 100644 --- a/src/app/_components/DownloadedScriptsTab.tsx +++ b/src/app/_components/DownloadedScriptsTab.tsx @@ -185,13 +185,19 @@ export function DownloadedScriptsTab({ onInstallScript }: DownloadedScriptsTabPr // Check if there's a corresponding local script const hasLocalVersion = localScriptsData?.scripts?.some(local => { if (!local?.name) return false; + + // Primary: Exact slug-to-slug matching (most reliable, prevents false positives) + if (local.slug && script.slug) { + if (local.slug.toLowerCase() === script.slug.toLowerCase()) { + return true; + } + } + + // Secondary: Check install basenames (for edge cases where install script names differ from slugs) + // Only use normalized matching for install basenames, not for slug/name matching const normalizedLocal = normalizeId(local.name); - const matchesNameOrSlug = ( - normalizedLocal === normalizeId(script.name) || - normalizedLocal === normalizeId(script.slug) - ); const matchesInstallBasename = (script as any)?.install_basenames?.some((base: string) => normalizeId(base) === normalizedLocal) ?? false; - return matchesNameOrSlug || matchesInstallBasename; + return matchesInstallBasename; }) ?? false; return { diff --git a/src/app/_components/ScriptsGrid.tsx b/src/app/_components/ScriptsGrid.tsx index 0a4fbdf..bb8d9bd 100644 --- a/src/app/_components/ScriptsGrid.tsx +++ b/src/app/_components/ScriptsGrid.tsx @@ -216,13 +216,19 @@ export function ScriptsGrid({ onInstallScript }: ScriptsGridProps) { // Check if there's a corresponding local script const hasLocalVersion = localScriptsData?.scripts?.some(local => { if (!local?.name) return false; + + // Primary: Exact slug-to-slug matching (most reliable, prevents false positives) + if (local.slug && script.slug) { + if (local.slug.toLowerCase() === script.slug.toLowerCase()) { + return true; + } + } + + // Secondary: Check install basenames (for edge cases where install script names differ from slugs) + // Only use normalized matching for install basenames, not for slug/name matching const normalizedLocal = normalizeId(local.name); - const matchesNameOrSlug = ( - normalizedLocal === normalizeId(script.name) || - normalizedLocal === normalizeId(script.slug) - ); const matchesInstallBasename = (script as any)?.install_basenames?.some((base: string) => normalizeId(base) === normalizedLocal) ?? false; - return matchesNameOrSlug || matchesInstallBasename; + return matchesInstallBasename; }) ?? false; return {