소스 정보
- 저장소
- puk0806/gugbab-claude
- 최근 소스 활동
- 2026년 8월 12일 00:35
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 2
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/puk0806/gugbab-claude --skill meal-recommendation-prompt명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
DDD(Domain-Driven Design) 아키텍처 핵심 패턴 - 유비쿼터스 언어, 서브도메인, 바운디드 컨텍스트, Aggregate, Entity/VO, 도메인 서비스/이벤트, 레이어드 아키텍처
대규모 React/Next.js 프로젝트를 layer-first(types/·utils/·hooks/·api/·components/ 밑에 도메인이 반복되는 구조)에서 domain-first(feature/도메인 우선) 구조로 전환하는 설계 기준과 절차. Feature-Sliced Design 2.1 정본(layers 6종·slices·segments·import 규칙·@x 크로스임포트·public API), FSD를 쓰지 않는 경량 대안(features + shared 2~3계층 + ESLint import/no-restricted-paths), Next.js App Router 공존 전략(route group `()`·private folder `_`·colocation), Turborepo/Nx 모노레포에서 폴더↔패키지 승격 기준, colocation과 배럴 파일 성능 트레이드오프, 도메인 경계 역추출(import 그래프·change coupling·용어 클러스터), 전환 실패 패턴(shared 비대화·entities 남용·순환 의존·도메인=라우트 착각·조기 추상화). 도메인 개념 자체(바운디드 컨텍스트·유비쿼터스 언어)는 `architecture/ddd` 스킬을 참조한다.
소스 파일 수천 개 규모 프론트엔드 코드베이스를 멈추지 않고 점진 재구조화하는 실행 전략 - Strangler Fig / Branch by Abstraction / Parallel Change, ts-morph·jscodeshift codemod, PR 분할·검증 게이트·되돌리기, 테스트 없는 코드의 안전망, 작업 순서 설계와 위반 수 기반 진행 추적
SKILL.md 표시 중
| name | meal-recommendation-prompt |
| description | 보유 식재료 기반 식단·레시피 추천 Claude 프롬프트 패턴. 소비기한 우선순위 반영, 구조화된 JSON 출력 포함. |
소스: https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices 검증일: 2026-08-12
당신은 한국 가정의 영양사 겸 요리 전문가입니다.
역할:
- 사용자가 보유한 식재료를 기반으로 현실적이고 맛있는 식단을 추천합니다
- 소비기한이 임박한 식재료를 우선적으로 활용합니다
- 한식 위주로 추천하되, 간편하게 만들 수 있는 요리를 선호합니다
규칙:
- 사용자가 갖고 있지 않은 재료는 최소 1~2가지만 추가 권장합니다
- 조리 시간을 항상 명시합니다 (10분 이내 / 30분 이내 / 30분 이상)
- 각 메뉴의 대략적인 칼로리를 함께 제공합니다
- 응답은 반드시 지정된 JSON 형식으로만 반환합니다
다음 식재료로 만들 수 있는 식단을 추천해주세요.
{ingredientContext}
요청 사항:
- 추천 식단 수: {count}가지 (기본 3가지)
- 끼니 유형: {mealType} (아침/점심/저녁/간식 중 하나)
- 소비기한 임박 식재료를 최대한 활용해주세요
- 추가 재료가 필요하면 최소한으로 제안해주세요
아래 JSON 형식으로만 응답해주세요:
{
"recommendations": [
{
"name": "음식명",
"description": "한 줄 설명",
"cookTime": "10분 이내 | 30분 이내 | 30분 이상",
"calories": 숫자 (kcal, 1인분 기준),
"usedIngredients": ["사용하는 보유 식재료"],
"additionalIngredients": ["추가 필요한 재료 (없으면 빈 배열)"],
"steps": ["조리 순서 1", "조리 순서 2", "조리 순서 3"],
"tip": "요리 팁 또는 변형 방법 (선택)"
}
],
"urgentUsageNote": "소비기한 임박 식재료 활용 메모 (있을 경우)"
}
const buildPromptContext = (ingredients: Ingredient[]): string => {
const urgent = ingredients.filter(i => getIngredientStatus(i) === 'urgent');
const warning = ingredients.filter(i => getIngredientStatus(i) === 'warning');
const fresh = ingredients.filter(i =>
['fresh', 'no_expiry'].includes(getIngredientStatus(i))
);
const fmt = (items: Ingredient[]) =>
items.map(i => `- ${i.name} (${i.quantity}${i.unit})`).join('\n');
const sections = [];
if (urgent.length > 0) sections.push(`🚨 빨리 써야 하는 식재료 (3일 이내):\n${fmt(urgent)}`);
if (warning.length > 0) sections.push(`⚠️ 곧 사용해야 하는 식재료 (7일 이내):\n${fmt(warning)}`);
if (fresh.length > 0) sections.push(`✅ 보유 중인 식재료:\n${fmt(fresh)}`);
return sections.join('\n\n');
};
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const getMealRecommendations = async (
ingredients: Ingredient[],
mealType: '아침' | '점심' | '저녁' | '간식' = '저녁',
count: number = 3
) => {
const ingredientContext = buildPromptContext(ingredients);
const prompt = `
다음 식재료로 만들 수 있는 식단을 추천해주세요.
${ingredientContext}
요청 사항:
- 추천 식단 수: ${count}가지
- 끼니 유형: ${mealType}
- 소비기한 임박 식재료를 최대한 활용해주세요
- 추가 재료가 필요하면 최소한으로 제안해주세요
아래 JSON 형식으로만 응답해주세요:
{"recommendations": [...], "urgentUsageNote": "..."}
`;
const message = await client.messages.create({
model: 'claude-sonnet-5',
max_tokens: 2048,
system: `당신은 한국 가정의 영양사 겸 요리 전문가입니다. 보유 식재료로 현실적인 한식 위주 식단을 추천하며, 소비기한 임박 재료를 우선 활용합니다. 응답은 반드시 JSON 형식으로만 반환합니다.`,
messages: [{ role: 'user', content: prompt }],
});
const text = message.content[0].type === 'text' ? message.content[]. : ;
jsonStr = text.(, ).();
.(jsonStr);
};
const getMealRecommendationsStream = async (
ingredients: Ingredient[],
onChunk: (text: string) => void
) => {
const stream = client.messages.stream({
model: 'claude-sonnet-5',
max_tokens: 2048,
system: '...위와 동일...',
messages: [{ role: 'user', content: buildMealPrompt(ingredients) }],
});
let fullText = '';
for await (const chunk of stream) {
if (chunk.type === 'content_block_delta' && chunk.delta.type === 'text_delta') {
fullText += chunk.delta.text;
onChunk(chunk.delta.text);
}
}
return JSON.parse(fullText.replace(/```json\n?|\n?```/g, '').trim());
};
interface MealRecommendation {
name: string;
description: string;
cookTime: '10분 이내' | '30분 이내' | '30분 이상';
calories: number;
usedIngredients: string[];
additionalIngredients: string[];
steps: string[];
tip?: string;
}
interface MealRecommendationResponse {
recommendations: MealRecommendation[];
urgentUsageNote?: string;
}
위 식재료 중 반드시 "{ingredientName}"을(를) 포함한 레시피를 추천해주세요.
1인분 기준 {maxCalories}kcal 이하 메뉴만 추천해주세요.
조리 시간 20분 이내의 간단한 메뉴만 추천해주세요.
다음 조건을 반드시 지켜주세요: {dietaryRestriction}
예: "돼지고기 제외", "채식 위주", "저탄수화물"