Files
airano-ir 16ee9e3beb sync: malware page, security alerts, review diagnostics, skill detail improvements
- Add malware security advisory page and SecurityAlertBanner component
- Add review diagnostics API and reviewed stats page
- Improve skill detail page with better scoring display and metadata
- Update review API endpoints with enhanced filtering and stats
- Add skill file serving improvements and cache enhancements
- Remove legacy curation scripts (moved to internal tooling)
- Update CLI search with score filtering support

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 16:08:12 +02:00

170 lines
7.1 KiB
TypeScript

import { getTranslations, setRequestLocale } from 'next-intl/server';
import { Header } from '@/components/Header';
import { Footer } from '@/components/Footer';
import Link from 'next/link';
import { ArrowLeft, ArrowRight } from 'lucide-react';
import { getPageAlternates } from '@/lib/seo';
export async function generateMetadata({
params,
}: {
params: Promise<{ locale: string }>;
}) {
const { locale } = await params;
return {
alternates: getPageAlternates(locale, '/docs/cli'),
};
}
export default async function CliDocsPage({
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 commands = [
{ name: 'install <skill-id>', desc: tContent('cmdInstallDesc') },
{ name: 'search <query>', desc: tContent('cmdSearchDesc') },
{ name: 'list', desc: tContent('cmdListDesc') },
{ name: 'update [skill-name]', desc: tContent('cmdUpdateDesc') },
{ name: 'uninstall <skill-name>', desc: tContent('cmdUninstallDesc') },
{ name: 'config', desc: tContent('cmdConfigDesc') },
];
const platforms = [
{ name: 'Claude', path: tContent('platformClaudePath') },
{ name: 'Codex', path: tContent('platformCodexPath') },
{ name: 'Copilot', path: tContent('platformCopilotPath') },
{ name: 'Cursor', path: tContent('platformCursorPath') },
{ name: 'Windsurf', path: tContent('platformWindsurfPath') },
];
const configKeys = [
{ key: 'defaultPlatform', desc: tContent('configDefaultPlatform') },
{ key: 'apiUrl', desc: tContent('configApiUrl') },
{ key: 'githubToken', desc: tContent('configGithubToken') },
];
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="flex-1">
<section className="section bg-surface">
<div className="container-main">
<div className="max-w-3xl mx-auto">
<Link
href={`/${locale}/docs`}
className="inline-flex items-center gap-2 text-primary-600 hover:text-primary-700 mb-8"
>
<ArrowIcon className="w-4 h-4 rotate-180" />
{t('title')}
</Link>
<h1 className="text-4xl font-bold mb-6">{t('cli.title')}</h1>
<p className="text-lg text-text-secondary mb-8">{t('cli.description')}</p>
<div className="prose prose-lg max-w-none">
<h2>{tContent('installation')}</h2>
<div className="glass-card p-4 my-4" dir="ltr">
<code className="text-sm font-mono text-left block">npm install -g skillhub</code>
</div>
<h2>{tContent('commands')}</h2>
<div className="space-y-4 my-6" dir="ltr">
{commands.map((cmd, index) => (
<div key={index} className="glass-card p-4 text-left">
<code className="text-sm font-mono text-primary-600">skillhub {cmd.name}</code>
<p className="text-text-secondary mt-2">{cmd.desc}</p>
</div>
))}
</div>
<h2>{tContent('examples')}</h2>
<div className="glass-card p-4 my-4 space-y-4" dir="ltr">
{/* Install globally */}
<div>
<p className="text-sm text-text-muted mb-1">{tContent('exInstallGlobal')}</p>
<code className="block text-sm font-mono">
<span className="text-text-muted">$</span> npx skillhub install anthropics/skills/pdf
</code>
<code className="block text-sm font-mono text-success">
Skill installed to ~/.claude/skills/pdf/
</code>
</div>
{/* Install in project */}
<div>
<p className="text-sm text-text-muted mb-1">{tContent('exInstallProject')}</p>
<code className="block text-sm font-mono">
<span className="text-text-muted">$</span> npx skillhub install anthropics/skills/pdf --project
</code>
<code className="block text-sm font-mono text-success">
Skill installed to ./.claude/skills/pdf/
</code>
</div>
{/* Search */}
<div>
<p className="text-sm text-text-muted mb-1">{tContent('exSearch')}</p>
<code className="block text-sm font-mono">
<span className="text-text-muted">$</span> npx skillhub search pdf
</code>
</div>
{/* Search with sort */}
<div>
<p className="text-sm text-text-muted mb-1">{tContent('exSearchSort')}</p>
<code className="block text-sm font-mono">
<span className="text-text-muted">$</span> npx skillhub search &quot;code review&quot; --sort aiScore --limit 5
</code>
<code className="block text-sm font-mono text-text-muted mt-1">
# Sort options: recommended (default), aiScore, downloads, stars, rating, recent
</code>
</div>
{/* Update all */}
<div>
<p className="text-sm text-text-muted mb-1">{tContent('exUpdateAll')}</p>
<code className="block text-sm font-mono">
<span className="text-text-muted">$</span> npx skillhub update --all
</code>
</div>
</div>
{/* Supported Platforms */}
<h2>{tContent('platformsTitle')}</h2>
<p>{tContent('platformsDesc')}</p>
<div className="space-y-3 my-6" dir="ltr">
{platforms.map((p) => (
<div key={p.name} className="glass-card p-4 text-left flex items-center justify-between">
<span className="text-sm font-semibold text-text-primary">{p.name}</span>
<code className="text-sm font-mono text-text-secondary">{p.path}</code>
</div>
))}
</div>
{/* Configuration */}
<h2>{tContent('configTitle')}</h2>
<p>{tContent('configDesc')}</p>
<div className="space-y-3 my-6" dir="ltr">
{configKeys.map((c) => (
<div key={c.key} className="glass-card p-4 text-left">
<code className="text-sm font-mono text-primary-600">{c.key}</code>
<p className="text-text-secondary mt-1 text-sm">{c.desc}</p>
</div>
))}
</div>
</div>
</div>
</div>
</section>
</main>
<Footer />
</div>
);
}