소스 정보
- 저장소
- AJBcoding/claude-skill-eval
- 최근 소스 활동
- 2025년 11월 18일 19:33
- 감지된 SKILL.md 언어
- 영어
- 스타
- 4
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/AJBcoding/claude-skill-eval --skill moai-nextra-architecture명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Enterprise database architecture specialist with PostgreSQL 17, MySQL 8.4 LTS, MongoDB 8.0, Redis 7.4 expertise. Master connection pooling, query optimization, caching strategies, and database DevOps automation. Build scalable, resilient database systems with comprehensive monitoring and disaster recovery.
Enterprise Frontend Development with AI-powered modern architecture, Context7 integration, and intelligent component orchestration for scalable user interfaces
Enterprise-grade security expertise with production-ready patterns for OWASP Top 10 2021, zero-trust architecture, threat modeling (STRIDE, PASTA), secure SDLC, DevSecOps automation, cloud security, cryptography, identity & access management, and compliance frameworks (SOC 2, ISO 27001, GDPR, CCPA).
SOC 직업 분류 기준
SKILL.md 표시 중
| name | moai-nextra-architecture |
| version | 4.0.0 |
| status | stable |
| description | Enterprise Skill for advanced development |
| allowed-tools | Read, Bash, WebSearch, WebFetch |
skill_id: moai-nextra-architecture
skill_name: Nextra Architecture Expert
version: 1.0.0
created_date: 2025-11-11
updated_date: 2025-11-11
language: english
word_count: 1800
triggers:
- keywords: [nextra, nextjs documentation, theme config, mdx, static site generation]
- contexts: [nextra-architecture, docs-optimization, site-generation, documentation-framework]
agents:
- docs-manager
- frontend-expert
- docs-manager
freedom_level: high
context7_references:
- url: "https://github.com/shuding/nextra"
topic: "Nextra framework best practices and configuration"
- url: "https://vercel.com/templates/next.js"
topic: "Next.js deployment and optimization strategies"
Nextra is a React-based static site generator built on Next.js that specializes in documentation websites. Key architectural advantages:
theme.config.tsx (Core Configuration):
import { DocsThemeConfig } from 'nextra-theme-docs'
const config: DocsThemeConfig = {
logo: <span>My Documentation</span>,
project: {
link: 'https://github.com/username/project',
},
docsRepositoryBase: 'https://github.com/username/project/tree/main',
useNextSeoProps: true,
head: (
<>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta property="og:title" content="My Documentation" />
<meta property="og:description" content="Comprehensive documentation" />
</>
),
footer: {
text: 'Built with Nextra and Next.js',
},
sidebar: {
defaultMenuCollapseLevel: 1,
toggleButton: true,
},
toc: {
backToTop: true,
extraContent: (
Last updated: {new Date().toLocaleDateString()}
),
},
: {
: ,
},
: {
: ,
: ,
},
: {
: ,
: ,
},
: ,
: {
: ,
() {
{
: ,
: ,
: ,
}
},
},
}
config
next.config.js (Build Optimization):
const withNextra = require('nextra')({
theme: 'nextra-theme-docs',
themeConfig: './theme.config.tsx',
// Performance optimizations
staticImage: true,
flexibleSearch: true,
defaultShowCopyCode: true,
readingTime: true,
// MDX configuration
mdxOptions: {
remarkPlugins: [
// Custom remark plugins
require('remark-gfm'),
require('remark-footnotes'),
],
rehypePlugins: [
// Custom rehype plugins
require('rehype-slug'),
require('rehype-autolink-headings'),
],
},
})
module.exports = withNextra({
// Next.js optimizations
experimental: {
appDir: true,
serverComponentsExternalPackages: ['nextra'],
},
images: {
domains: ['example.com'],
formats: ['image/webp', 'image/avif'],
},
// Build performance
swcMinify: true,
compiler: {
: process.. === ,
},
: ,
: ,
: {
: ,
},
})
Optimal Nextra Project Structure:
docs/
├── pages/ # Route definitions (optional)
│ ├── _meta.json # Site metadata
│ └── api/ # Custom API routes
├── public/ # Static assets
│ ├── images/ # Images and icons
│ ├── files/ # Downloadable files
│ └── favicon.ico
├── components/ # React components
│ ├── ui/ # Reusable UI components
│ ├── diagrams/ # Custom diagram components
│ └── interactive/ # Interactive elements
├── lib/ # Utility functions
│ ├── nextra-config.ts # Nextra configuration helpers
│ ├── content-utils.ts # Content processing utilities
│ └── search-client.ts # Custom search implementation
├── styles/ # Custom styles
│ ├── globals.css # Global CSS
│ └── components.css # Component-specific styles
├── content/ # Documentation content
│ ├── index.mdx # Homepage
│ ├── getting-started/ # Getting started guides
│ ├── guides/ # How-to guides
│ ├── reference/ # API reference
│ └── tutorials/ # Step-by-step tutorials
├── scripts/ # Build and utility scripts
│ ├── build-search-index.js # Search index generation
│ ├── validate-links.js # Link validation
│ └── generate-sitemap.js # Sitemap generation
├── types/ # TypeScript definitions
│ ├── content.d.ts # Content type definitions
│ └── config.d.ts # Configuration types
├── .nextra/ # Nextra cache (auto-generated)
├── package.json
├── tsconfig.json
└── README.md
Homepage (content/index.mdx):
---
title: Welcome to My Documentation
description: Comprehensive guide for getting started with our platform
---
import { Callout } from 'nextra-theme-docs'
import { Tabs, TabItem } from 'nextra-theme-docs'
# Welcome to My Platform
<Callout type="info" emoji="🎯">
This documentation will help you get up and running in minutes.
</Callout>
## Quick Start
<Tabs items={['npm', 'yarn', 'pnpm']}>
<TabItem>
```bash
npm install my-platform
```
</TabItem>
<TabItem>
```bash
yarn add my-platform
```
</TabItem>
<TabItem>
```bash
pnpm install my-platform
```
</TabItem>
</Tabs>
## Why Choose Our Platform?
- 🚀 **Performance**: Built with modern web technologies
- 🎨 **Customizable**: Extensive theming and configuration options
- 📱 **Mobile-First**: Responsive design for all devices
- 🔍 **Searchable**: Built-in search functionality
- ♿ **Accessible**: WCAG 2.1 compliant
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 mt-8">
<div className="p-6 border rounded-lg">
<h3 className="text-lg font-semibold mb-2">📚 Documentation</h3>
<p>Comprehensive guides and API references.</p>
</div>
<div className="p-6 border rounded-lg">
<h3 className="text-lg font-semibold mb-2">🛠️ Tools</h3>
<p>Developer tools and utilities.</p>
</div>
<div className="p-6 border rounded-lg">
<h3 className="text-lg font-semibold mb-2">🤝 Community</h3>
<p>Join our community for support.</p>
</div>
</div>
Guide Page Pattern (content/guides/example.mdx):
---
title: Complete Guide to Feature X
description: Learn how to implement and customize Feature X
---
import { Steps, Step } from 'nextra-theme-docs'
import { FileTree } from 'nextra/components'
# Feature X Guide
<Callout type="warning" emoji="⚠️">
This feature requires version 2.0.0 or higher.
</Callout>
## Prerequisites
Before you begin, ensure you have:
- Node.js 18+ installed
- Basic understanding of React
- Project configured for TypeScript
## Implementation Steps
<Steps>
<Step>
### Step 1: Installation
Install the required dependencies:
```bash
npm install feature-x-package
```
Update your configuration:
<FileTree>
<FileTree.File name="config.json" active>
{`{
"featureX": {
"enabled": true,
"options": {
"theme": "default"
}
}
}}`}
</FileTree.File>
</FileTree>
</Step>
<Step>
### Step 2: Configuration
Configure the feature according to your needs:
```typescript showLineNumbers
// src/config/featureX.ts
export const featureXConfig = {
mode: 'production',
plugins: ['analytics', 'seo'],
theme: {
primary: '#0070f3',
secondary: '#6f42c1'
}
}
```
<Callout type="tip" emoji="💡">
You can customize the theme using CSS variables.
</Callout>
</Step>
<Step>
### Step 3: Usage
Now you can use the feature in your application:
```tsx
import { FeatureX } from 'feature-x-package'
export default function MyComponent() {
return (
<FeatureX
config={featureXConfig}
onReady={() => console.log('Ready!')}
/>
)
}
```
</Step>
</Steps>
## Advanced Configuration
For more advanced use cases, refer to the [API Reference](/reference/feature-x).
Optimizing Build Speed:
// scripts/optimize-build.js
const { execSync } = require('child_process')
const fs = require('fs')
// Pre-build optimizations
function optimizeBuild() {
// Clear Next.js cache
execSync('rm -rf .next', { stdio: 'inherit' })
// Generate search index incrementally
execSync('node scripts/build-search-index.js --incremental', {
stdio: 'inherit'
})
// Optimize images
execSync('node scripts/optimize-images.js', { stdio: 'inherit' })
}
// Post-build optimizations
function optimizeOutput() {
// Generate sitemap
execSync('node scripts/generate-sitemap.js', { stdio: 'inherit' })
// Compress static assets
execSync('gzip -k -r out/', { stdio: 'inherit' })
// Generate Lighthouse report
execSync('lighthouse http://localhost:3000 --output=json --output-path=./lighthouse-report.json', {
stdio: 'inherit'
})
}
Search Optimization:
// lib/search-client.ts
import type { PagefindResult } from './types'
export class SearchClient {
private searchIndex: Map<string, PagefindResult> = new Map()
async initialize() {
// Load pre-built search index
const response = await fetch('/search-index.json')
const index = await response.json()
this.searchIndex = new Map(
index.map((item: PagefindResult) => [item.url, item])
)
}
async search(query: string, limit = 10) {
const results = Array.from(this.searchIndex.values())
.filter(item =>
item.title.().(query.()) ||
item..().(query.())
)
.(, limit)
{
results,
: results.
}
}
}
Client-Side Optimizations:
// lib/performance.ts
export class PerformanceOptimizer {
// Lazy load images
static optimizeImages() {
if ('IntersectionObserver' in window) {
const imageObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target as HTMLImageElement
if (img.dataset.src) {
img.src = img.dataset.src
imageObserver.unobserve(img)
}
}
})
})
document.querySelectorAll('img[data-src]').forEach(img => {
imageObserver.observe(img)
})
}
}
// Prefetch critical resources
static prefetchCriticalResources() {
const criticalPaths = ['/api/content', '/search-index.json']
criticalPaths.forEach( {
link = .()
link. =
link. = path
..(link)
})
}
() {
ticking =
.(, {
(!ticking) {
( {
.()
ticking =
})
ticking =
}
})
}
}
Mobile-First Layout Components:
// components/ui/MobileLayout.tsx
import { useState } from 'react'
import { useRouter } from 'next/router'
export function MobileLayout({ children }) {
const [sidebarOpen, setSidebarOpen] = useState(false)
const router = useRouter()
return (
<div className="min-h-screen bg-background">
{/* Mobile Header */}
<header className="sticky top-0 z-50 border-b bg-background md:hidden">
<div className="flex h-14 items-center px-4">
<button
onClick={() => setSidebarOpen(true)}
className="mr-4 p-2 rounded-md hover:bg-accent"
aria-label="Open sidebar"
>
<svg className="h-5 w-5" fill="none" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2}
d="M4 6h16M4 12h16M4 18h16" />
Documentation
{/* Mobile Sidebar Overlay */}
{sidebarOpen && (
setSidebarOpen(false)}
/>
{/* Sidebar content here */}
)}
{/* Main Content */}
{/* Desktop Sidebar (always visible) */}
{/* Desktop sidebar content */}
{/* Content Area */}
{children}
)
}
Touch-Friendly Interactions:
/* styles/mobile.css}
@media (max-width: 768px) {
/* Larger tap targets */
button, a, input, select, textarea {
min-height: 44px;
min-width: 44px;
padding: 12px;
}
/* Improved spacing */
.mobile-spacing > * + * {
margin-top: 1.5rem;
}
/* Touch-friendly navigation */
.mobile-nav {
touch-action: manipulation;
-webkit-tap-highlight-color: transparent;
}
/* Readable font sizes */
body {
font-size: 16px;
line-height: 1.6;
}
/* Improved readability */
.content {
max-width: 100%;
padding: 0 1rem;
}
/* Horizontal scroll prevention */
.no-overflow {
overflow-x: hidden;
}
}
Semantic HTML Structure:
// components/ui/AccessibleContent.tsx
export function AccessibleContent({ title, children }) {
return (
<main id="main-content" role="main" aria-labelledby="page-title">
<header>
<h1 id="page-title" className="sr-only">
{title}
</h1>
</header>
<div className="prose prose-lg max-w-none">
{children}
</div>
{/* Skip to main content link */}
<a
href="#main-content"
className="sr-only focus:not-sr-only focus:absolute focus:top-4 focus:left-4
bg-primary text-primary-foreground px-4 py-2 rounded-md"
>
Skip to main content
</a>
</main>
)
}
Keyboard Navigation:
// components/ui/KeyboardNavigation.tsx
import { useEffect } from 'react'
export function KeyboardNavigation() {
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
// Focus trap for modals
if (event.key === 'Tab') {
const focusableElements = document.querySelectorAll(
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
)
const firstElement = focusableElements[0] as HTMLElement
const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement
if (event.shiftKey && document.activeElement === firstElement) {
event.preventDefault()
lastElement.focus()
} else if (!event.shiftKey && document.activeElement === lastElement) {
event.preventDefault()
firstElement.focus()
}
}
// Escape key to close modals
(event. === ) {
modal = .()
(modal) {
closeButton = modal.()
closeButton?.( ())
}
}
}
.(, handleKeyDown)
.(, handleKeyDown)
}, [])
}
Dynamic SEO Implementation:
// lib/seo.ts
import type { Metadata } from 'next'
export function generateSEOMetadata({
title,
description,
path = '',
image,
keywords = [],
publishedTime,
modifiedTime
}: {
title: string
description: string
path?: string
image?: string
keywords?: string[]
publishedTime?: string
modifiedTime?: string
}): Metadata {
const baseUrl = 'https://docs.example.com'
const url = `${baseUrl}${path}`
return {
title,
description,
keywords: keywords.join(', '),
authors: [{ name: 'Documentation Team' }],
creator: 'Documentation Platform',
publisher: 'Your Company',
openGraph: {
type: 'article',
locale: 'en_US',
url,
title,
description,
siteName: 'Documentation',
images: image ? [{
url: image,
width: 1200,
height: 630,
: title,
}] : [],
},
: {
: ,
title,
description,
: image ? [image] : [],
},
: {
: url,
: {
: ,
: ,
: ,
},
},
: {
: ,
: ,
: {
: ,
: ,
: -,
: ,
: -,
},
},
}
}
# docs-manager agent
Skill("moai-nextra-architecture")
# Analyze project structure
architecture = NextraArchitecture()
structure_analysis = architecture.analyze_source_project("./src")
# Design optimal Nextra configuration
config = architecture.design_theme_config(structure_analysis)
directory_structure = architecture.design_content_structure(structure_analysis)
# Generate configuration files
architecture.generate_theme_config(config)
architecture.create_directory_structure(directory_structure)
# Initialize Nextra documentation project
npx nextra-init docs --theme docs --typescript
# Generate optimized configuration
node scripts/generate-nextra-config.js --source ./src --output ./docs
# Build and validate documentation
npm run build:docs
npm run validate:docs
npm run test:docs