import { getTranslations, setRequestLocale } from 'next-intl/server'; import { Header } from '@/components/Header'; import { Footer } from '@/components/Footer'; import { DiscoveryModes } from '@/components/DiscoveryModes'; import Link from 'next/link'; import { ArrowLeft, ArrowRight } from 'lucide-react'; import { createDb, skills, sql } from '@skillhub/db'; import { formatPromptSkillCount } from '@/lib/format-number'; export const dynamic = 'force-dynamic'; async function getSkillCount(): Promise { try { const db = createDb(); const result = await db .select({ count: sql`count(*)::int` }) .from(skills) .where(sql`${skills.isDuplicate} = false AND (${skills.skillType} IS NULL OR ${skills.skillType} != 'aggregator')`); return formatPromptSkillCount(result[0]?.count ?? 16000); } catch { return '16,000+'; } } function getDiscoveryPrompts(count: string) { const siteUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://skills.palebluedot.live'; return { standard: `## SkillHub - AI Agent Skills ${count} skills available at ${siteUrl} Search when working with unfamiliar tech, complex workflows, or after a failed attempt: \`\`\`bash npx skillhub search "" --limit 5 npx skillhub install --project npx skillhub uninstall # when done \`\`\` Rules: - Only install skills with security status "Pass" - After installing, read the SKILL.md and follow its instructions - Search during planning phase for best results`, compact: `## SkillHub (${count} skills) -- ${siteUrl} \`\`\`bash npx skillhub search "" --limit 5 npx skillhub install --project npx skillhub uninstall \`\`\` Search for unfamiliar tech or complex tasks. Only install "Pass" security status. Read SKILL.md after install.`, oneshot: `You have access to SkillHub (${count} AI agent skills, ${siteUrl}). For unfamiliar or complex tasks: \`npx skillhub search "" --limit 5\` then \`npx skillhub install --project\`. Only "Pass" security. Read SKILL.md after install. Uninstall when done.`, }; } export default async function GettingStartedPage({ params, }: { params: Promise<{ locale: string }>; }) { const { locale } = await params; setRequestLocale(locale); const t = await getTranslations('docs'); const tContent = await getTranslations('docs.content'); const isRTL = locale === 'fa'; const ArrowIcon = isRTL ? ArrowLeft : ArrowRight; const skillCount = await getSkillCount(); const prompts = getDiscoveryPrompts(skillCount); return (
{t('title')}

{t('gettingStarted.title')}

{t('gettingStarted.description')}

{tContent('installation')}

{tContent('installCli')}

npm install -g skillhub

{tContent('usage')}

{tContent('searchSkills')}

skillhub search code-review

{tContent('installSkill')}

skillhub install anthropic/skills/code-review

{tContent('listInstalled')}

skillhub list
{/* Web-based Installation */}

{tContent('webInstallTitle')}

{tContent('webInstallDesc')}

{tContent('webInstallStep1')}

{tContent('webInstallStep2')}

{tContent('webInstallStep3')}

  • {tContent('webInstallMethodFolder')}
  • {tContent('webInstallMethodZip')}
{/* Dynamic Skill Discovery */}

{tContent('discoveryTitle')}

{tContent('discoveryIntro')}

{tContent('discoveryModesTitle')}

{tContent('selectMode')}

{tContent('crossPlatformTitle')}

{tContent('crossPlatformDesc')}

{tContent('platformClaude')}
{tContent('platformCodex')}
{tContent('platformCopilot')}
{tContent('platformCursor')}
{tContent('platformWindsurf')}

{tContent('fullDocsLink')}{' '} CLI Reference

); }