@vibeuniv/mcp-server 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +20 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/curriculum-helpers.d.ts +11 -0
- package/dist/lib/curriculum-helpers.d.ts.map +1 -0
- package/dist/lib/curriculum-helpers.js +243 -0
- package/dist/lib/curriculum-helpers.js.map +1 -0
- package/dist/tools/generate-curriculum.d.ts.map +1 -1
- package/dist/tools/generate-curriculum.js +61 -350
- package/dist/tools/generate-curriculum.js.map +1 -1
- package/dist/tools/generate-module-content.d.ts +30 -0
- package/dist/tools/generate-module-content.d.ts.map +1 -0
- package/dist/tools/generate-module-content.js +304 -0
- package/dist/tools/generate-module-content.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { scanTeachingCriticalFiles } from "../lib/file-scanner.js";
|
|
3
|
+
import { formatTechStack, formatKBHints, formatEducationalAnalysis, buildLevelGuidance, filterKBHintsForModule, } from "../lib/curriculum-helpers.js";
|
|
4
|
+
export const generateModuleContentSchema = {
|
|
5
|
+
project_id: z.string().describe("The VibeUniv project ID"),
|
|
6
|
+
module_index: z.number().int().min(0).describe("0-based module index"),
|
|
7
|
+
module: z
|
|
8
|
+
.object({
|
|
9
|
+
title: z.string(),
|
|
10
|
+
description: z.string(),
|
|
11
|
+
module_type: z.string(),
|
|
12
|
+
tech_name: z.string(),
|
|
13
|
+
estimated_minutes: z.number().optional(),
|
|
14
|
+
})
|
|
15
|
+
.describe("Module structure object from vibeuniv_generate_curriculum"),
|
|
16
|
+
difficulty: z
|
|
17
|
+
.enum(["beginner", "intermediate", "advanced"])
|
|
18
|
+
.default("beginner")
|
|
19
|
+
.describe("Curriculum difficulty level"),
|
|
20
|
+
total_modules: z.number().int().min(1).describe("Total number of modules in the curriculum"),
|
|
21
|
+
};
|
|
22
|
+
export function registerGenerateModuleContent(server, client) {
|
|
23
|
+
server.tool("vibeuniv_generate_module_content", "Pass 2 of 2: Generate content sections for a single module. Call this once per module after vibeuniv_generate_curriculum returns the module structure. Returns section-generation instructions for one module.", generateModuleContentSchema, { readOnlyHint: true, openWorldHint: true }, async ({ project_id, module_index, module, difficulty, total_modules }) => {
|
|
24
|
+
try {
|
|
25
|
+
console.error(`[vibeuniv] Generating content for module ${module_index + 1}/${total_modules}: "${module.title}"...`);
|
|
26
|
+
// Try cached data first, fetch fresh if miss
|
|
27
|
+
let curriculumContext;
|
|
28
|
+
let localFiles = [];
|
|
29
|
+
const cached = client.getCachedCurriculumData(project_id);
|
|
30
|
+
if (cached) {
|
|
31
|
+
console.error(`[vibeuniv] Using cached curriculum context for project ${project_id}`);
|
|
32
|
+
curriculumContext = cached.context;
|
|
33
|
+
localFiles = cached.localFiles;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.error(`[vibeuniv] Cache miss — fetching fresh curriculum context for project ${project_id}`);
|
|
37
|
+
curriculumContext = await client.getCurriculumContext(project_id);
|
|
38
|
+
try {
|
|
39
|
+
localFiles = await scanTeachingCriticalFiles(process.cwd());
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.error(`[vibeuniv] Local file scan failed (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
43
|
+
}
|
|
44
|
+
client.setCachedCurriculumData(project_id, curriculumContext, localFiles);
|
|
45
|
+
}
|
|
46
|
+
const techStacks = curriculumContext.techStacks;
|
|
47
|
+
const locale = curriculumContext.locale ?? "ko";
|
|
48
|
+
const en = locale === "en";
|
|
49
|
+
// Filter KB hints for this module's tech (+ prerequisites)
|
|
50
|
+
const filteredHints = filterKBHintsForModule(curriculumContext.knowledgeHints, module.tech_name);
|
|
51
|
+
const kbSection = Object.keys(filteredHints).length > 0
|
|
52
|
+
? `\n${formatKBHints(filteredHints, locale)}\n`
|
|
53
|
+
: "";
|
|
54
|
+
// Educational analysis
|
|
55
|
+
let eduSection = "";
|
|
56
|
+
if (curriculumContext.educationalAnalysis) {
|
|
57
|
+
try {
|
|
58
|
+
eduSection = `\n${formatEducationalAnalysis(curriculumContext.educationalAnalysis, difficulty, locale)}\n`;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`[vibeuniv] Educational analysis formatting failed (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Source code (prefer local files, fall back to server files)
|
|
65
|
+
const curriculumFiles = localFiles.length > 0 ? localFiles : (curriculumContext.files ?? []);
|
|
66
|
+
const filesSection = curriculumFiles.length > 0
|
|
67
|
+
? en
|
|
68
|
+
? `\n## Project Source Code
|
|
69
|
+
|
|
70
|
+
Below are the student's actual project files.
|
|
71
|
+
You MUST directly quote this code in code_example and walkthrough sections.
|
|
72
|
+
Do NOT make up code.
|
|
73
|
+
|
|
74
|
+
${curriculumFiles.map((f) => `#### ${f.file_path}\n\`\`\`\n${f.content}\n\`\`\``).join("\n\n")}\n`
|
|
75
|
+
: `\n## 프로젝트 소스 코드
|
|
76
|
+
|
|
77
|
+
아래는 학생의 실제 프로젝트 파일입니다.
|
|
78
|
+
커리큘럼의 code_example, walkthrough 섹션에서 반드시 이 코드를 직접 인용하세요.
|
|
79
|
+
코드를 창작하지 마세요.
|
|
80
|
+
|
|
81
|
+
${curriculumFiles.map((f) => `#### ${f.file_path}\n\`\`\`\n${f.content}\n\`\`\``).join("\n\n")}\n`
|
|
82
|
+
: "";
|
|
83
|
+
// Tech stack listing
|
|
84
|
+
const coreStacks = techStacks.filter((t) => t.importance === "core");
|
|
85
|
+
const supportingStacks = techStacks.filter((t) => t.importance !== "core");
|
|
86
|
+
const coreList = coreStacks.map(formatTechStack).join("\n");
|
|
87
|
+
const supportingList = supportingStacks.length > 0
|
|
88
|
+
? supportingStacks.map(formatTechStack).join("\n")
|
|
89
|
+
: en ? "(none)" : "(없음)";
|
|
90
|
+
const levelGuidance = buildLevelGuidance(difficulty, locale);
|
|
91
|
+
const learnMoreLabel = en ? "📚 Learn More" : "📚 더 알아보기";
|
|
92
|
+
const minBodyChars = difficulty === "beginner" ? "400" : "200";
|
|
93
|
+
const sectionsPerModule = difficulty === "beginner" ? "5-7" : "3-5";
|
|
94
|
+
const minSections = difficulty === "beginner" ? "5" : "3";
|
|
95
|
+
const paragraphs = difficulty === "beginner" ? "6-8" : "4-6";
|
|
96
|
+
// Progress guidance
|
|
97
|
+
const isLastModule = module_index >= total_modules - 1;
|
|
98
|
+
const progressEN = isLastModule
|
|
99
|
+
? `## All Modules Complete!
|
|
100
|
+
|
|
101
|
+
This is the last module (${module_index + 1}/${total_modules}).
|
|
102
|
+
After generating these sections, assemble the complete curriculum JSON:
|
|
103
|
+
- Take the structure from vibeuniv_generate_curriculum
|
|
104
|
+
- Add "content": { "sections": [...] } to each module from each generate_module_content result
|
|
105
|
+
- Submit: vibeuniv_submit_curriculum({ project_id: "${project_id}", curriculum: <complete JSON> })`
|
|
106
|
+
: `## Progress: Module ${module_index + 1} of ${total_modules}
|
|
107
|
+
|
|
108
|
+
After generating these sections, proceed to the next module:
|
|
109
|
+
vibeuniv_generate_module_content({ project_id: "${project_id}", module_index: ${module_index + 1}, module: <next module from structure>, difficulty: "${difficulty}", total_modules: ${total_modules} })`;
|
|
110
|
+
const progressKO = isLastModule
|
|
111
|
+
? `## 모든 모듈 완료!
|
|
112
|
+
|
|
113
|
+
마지막 모듈입니다 (${module_index + 1}/${total_modules}).
|
|
114
|
+
이 섹션을 생성한 후 완성 커리큘럼 JSON을 조합하세요:
|
|
115
|
+
- vibeuniv_generate_curriculum에서 받은 구조에
|
|
116
|
+
- 각 모듈에 "content": { "sections": [...] } 추가 (각 generate_module_content 결과에서)
|
|
117
|
+
- 제출: vibeuniv_submit_curriculum({ project_id: "${project_id}", curriculum: <완성 JSON> })`
|
|
118
|
+
: `## 진행: 모듈 ${module_index + 1} / ${total_modules}
|
|
119
|
+
|
|
120
|
+
이 섹션을 생성한 후 다음 모듈로 진행하세요:
|
|
121
|
+
vibeuniv_generate_module_content({ project_id: "${project_id}", module_index: ${module_index + 1}, module: <구조에서 다음 모듈>, difficulty: "${difficulty}", total_modules: ${total_modules} })`;
|
|
122
|
+
const instructions = en
|
|
123
|
+
? `Generate content sections for module ${module_index + 1} of ${total_modules}: "${module.title}"
|
|
124
|
+
|
|
125
|
+
## Module Info
|
|
126
|
+
- **Title:** ${module.title}
|
|
127
|
+
- **Description:** ${module.description}
|
|
128
|
+
- **Type:** ${module.module_type}
|
|
129
|
+
- **Technology:** ${module.tech_name}
|
|
130
|
+
${module.estimated_minutes ? `- **Estimated:** ${module.estimated_minutes} minutes` : ""}- **Difficulty:** ${difficulty}
|
|
131
|
+
|
|
132
|
+
## Level Guidance
|
|
133
|
+
${levelGuidance}
|
|
134
|
+
|
|
135
|
+
## Tech Stack
|
|
136
|
+
**Core:** ${coreList}
|
|
137
|
+
**Supporting:** ${supportingList}
|
|
138
|
+
${filesSection}${eduSection}${kbSection}
|
|
139
|
+
## Section Design (${sectionsPerModule} sections, minimum ${minSections})
|
|
140
|
+
- explanation: Markdown ${paragraphs} paragraphs. Must cite project file paths.
|
|
141
|
+
End with "${learnMoreLabel}" links 2-3 (React→react.dev, Next.js→nextjs.org/docs,
|
|
142
|
+
TypeScript→typescriptlang.org, Supabase→supabase.com/docs, Tailwind→tailwindcss.com/docs)
|
|
143
|
+
- code_example: Copy actual project code + line-by-line comments.
|
|
144
|
+
Below the code block, explain with numbered list "What this code does:"
|
|
145
|
+
- quiz_question: 4-choice based on project code. quiz_explanation with correct/incorrect reasoning
|
|
146
|
+
- challenge: ___BLANK___ fill-in-the-blank. Both starter_code and answer_code required
|
|
147
|
+
- reflection: "Open the X folder in your project. Look for Y." format
|
|
148
|
+
|
|
149
|
+
**Required Placement Rules:**
|
|
150
|
+
- Start each module with explanation
|
|
151
|
+
- Maximum 2 consecutive explanations, 3rd must be quiz/reflection
|
|
152
|
+
- At least 1 code_example per module required
|
|
153
|
+
- At least 1 quiz_question per module required
|
|
154
|
+
|
|
155
|
+
**Tone (Critical — key to learning content quality):**
|
|
156
|
+
- Use casual, friendly "you" language
|
|
157
|
+
- Address the student as "you" or "we"
|
|
158
|
+
- Short sentences, one idea per sentence
|
|
159
|
+
- Keep technical terms in English + follow with a plain explanation in parentheses
|
|
160
|
+
- Start with questions: "Have you ever wondered about this code?", "Why does it work this way?"
|
|
161
|
+
- Encourage: "If you've followed along this far, you already understand half of it!", "It can be confusing at first — don't worry"
|
|
162
|
+
- Use analogies: everyday analogies for new concepts (API→restaurant order window, component→LEGO blocks)
|
|
163
|
+
- Transition phrases: "Alright, now let's...", "Wait a moment!", "Let's check the actual code, shall we?"
|
|
164
|
+
- Forbidden: dry academic tone, filler phrases like "Great question!", emotionless listing
|
|
165
|
+
- Do NOT make up code — only quote actual project code
|
|
166
|
+
|
|
167
|
+
**walkthrough:** Explain a file from import→logic→export order + connections to other files.
|
|
168
|
+
|
|
169
|
+
## JSON Output
|
|
170
|
+
|
|
171
|
+
Output ONLY a JSON array of sections (no code fences/explanations):
|
|
172
|
+
|
|
173
|
+
[
|
|
174
|
+
{
|
|
175
|
+
"type": "explanation | code_example | quiz_question | challenge | reflection",
|
|
176
|
+
"title": "string (required) — Section title",
|
|
177
|
+
"body": "string (required) — Markdown body. explanation minimum ${minBodyChars} chars",
|
|
178
|
+
|
|
179
|
+
"code": "string (required for code_example) — Actual project code + line-by-line comments",
|
|
180
|
+
|
|
181
|
+
"quiz_options": ["string", "string", "string", "string"] (required for quiz_question, exactly 4),
|
|
182
|
+
"quiz_answer": number (required for quiz_question, 0-3),
|
|
183
|
+
"quiz_explanation": "string (required for quiz_question) — Correct/incorrect reasoning",
|
|
184
|
+
|
|
185
|
+
"challenge_starter_code": "string (required for challenge) — Contains ___BLANK___",
|
|
186
|
+
"challenge_answer_code": "string (required for challenge) — Completed code"
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
|
|
190
|
+
**Required Rules:**
|
|
191
|
+
- At least 1 code_example + 1 quiz_question
|
|
192
|
+
- Minimum ${minSections} sections
|
|
193
|
+
- explanation body must be at least ${minBodyChars} characters${difficulty === "beginner" ? `
|
|
194
|
+
|
|
195
|
+
**[Beginner-only Additional Rules — Must Follow]:**
|
|
196
|
+
- Every concept must have "What if this didn't exist?" before/after comparison
|
|
197
|
+
- Every line of code in code_example must have a plain-English translation
|
|
198
|
+
- Challenges must have only 1-2 blanks with very specific hints
|
|
199
|
+
- All technical terms must have friendly nicknames` : ""}
|
|
200
|
+
|
|
201
|
+
${progressEN}`
|
|
202
|
+
: `모듈 ${module_index + 1}/${total_modules}의 콘텐츠 섹션을 생성해주세요: "${module.title}"
|
|
203
|
+
|
|
204
|
+
## 모듈 정보
|
|
205
|
+
- **제목:** ${module.title}
|
|
206
|
+
- **설명:** ${module.description}
|
|
207
|
+
- **유형:** ${module.module_type}
|
|
208
|
+
- **기술:** ${module.tech_name}
|
|
209
|
+
${module.estimated_minutes ? `- **예상 시간:** ${module.estimated_minutes}분` : ""}- **난이도:** ${difficulty}
|
|
210
|
+
|
|
211
|
+
## 난이도별 가이드
|
|
212
|
+
${levelGuidance}
|
|
213
|
+
|
|
214
|
+
## 기술 스택
|
|
215
|
+
**Core:** ${coreList}
|
|
216
|
+
**Supporting:** ${supportingList}
|
|
217
|
+
${filesSection}${eduSection}${kbSection}
|
|
218
|
+
## 섹션 구성 (${sectionsPerModule}개, 최소 ${minSections}개)
|
|
219
|
+
- explanation: 마크다운 ${paragraphs} 문단. 반드시 프로젝트 파일 경로 인용.
|
|
220
|
+
끝에 "${learnMoreLabel}" 링크 2-3개 (React→react.dev, Next.js→nextjs.org/docs,
|
|
221
|
+
TypeScript→typescriptlang.org, Supabase→supabase.com/docs, Tailwind→tailwindcss.com/docs)
|
|
222
|
+
- code_example: 프로젝트 실제 코드 복사 + 라인별 한국어 주석.
|
|
223
|
+
코드 블록 아래에 "이 코드가 하는 일:" 번호 목록으로 설명
|
|
224
|
+
- quiz_question: 프로젝트 코드 기반 4지선다. quiz_explanation에 정답/오답 이유
|
|
225
|
+
- challenge: ___BLANK___ 빈칸 채우기. starter_code + answer_code 모두 필수
|
|
226
|
+
- reflection: "여러분의 프로젝트에서 X 폴더를 열어보세요. Y를 찾아보세요." 형태
|
|
227
|
+
|
|
228
|
+
**필수 배치 규칙:**
|
|
229
|
+
- 모듈 시작은 explanation으로
|
|
230
|
+
- explanation 연속 2개까지만, 3번째는 반드시 quiz/reflection
|
|
231
|
+
- 모듈당 code_example 최소 1개 필수
|
|
232
|
+
- 모듈당 quiz_question 최소 1개 필수
|
|
233
|
+
|
|
234
|
+
**톤 (매우 중요 — 학습 콘텐츠 품질의 핵심):**
|
|
235
|
+
- 해요체 사용 (~이에요, ~거든요, ~잖아요, ~해볼까요?)
|
|
236
|
+
- 학생을 "여러분" 또는 "우리"로 지칭
|
|
237
|
+
- 짧은 문장 위주, 한 문장에 하나의 아이디어
|
|
238
|
+
- 기술 용어는 영어 유지 + 바로 뒤에 괄호로 쉬운 설명
|
|
239
|
+
- 질문으로 시작: "혹시 이 코드 보면서 궁금하셨죠?", "왜 이렇게 할까요?"
|
|
240
|
+
- 격려 필수: "여기까지 따라오셨으면 벌써 절반은 이해하신 거예요!", "처음엔 헷갈릴 수 있는데 걱정 마세요"
|
|
241
|
+
- 비유 필수: 새 개념마다 일상생활 비유 (API→식당 주문 창구, 컴포넌트→레고 블록)
|
|
242
|
+
- 전환 어구: "자, 그러면 이제...", "여기서 잠깐!", "실제 코드에서 확인해볼까요?"
|
|
243
|
+
- 금지: 교과서체(~이다, ~하라), 감정 없는 나열, 영어 직역투
|
|
244
|
+
- 코드 창작 금지 — 프로젝트 실제 코드만 인용
|
|
245
|
+
|
|
246
|
+
**walkthrough:** 파일 하나를 import→로직→export 순서로 설명 + 다른 파일과의 연결.
|
|
247
|
+
|
|
248
|
+
## JSON 출력
|
|
249
|
+
|
|
250
|
+
섹션 JSON 배열만 출력하세요 (코드 펜스/설명 없이):
|
|
251
|
+
|
|
252
|
+
[
|
|
253
|
+
{
|
|
254
|
+
"type": "explanation | code_example | quiz_question | challenge | reflection",
|
|
255
|
+
"title": "string (필수) — 섹션 제목",
|
|
256
|
+
"body": "string (필수) — 마크다운 본문. explanation은 최소 ${minBodyChars}자",
|
|
257
|
+
|
|
258
|
+
"code": "string (code_example일 때 필수) — 프로젝트 실제 코드 + 라인별 주석",
|
|
259
|
+
|
|
260
|
+
"quiz_options": ["string", "string", "string", "string"] (quiz_question일 때 필수, 정확히 4개),
|
|
261
|
+
"quiz_answer": number (quiz_question일 때 필수, 0-3),
|
|
262
|
+
"quiz_explanation": "string (quiz_question일 때 필수) — 정답/오답 이유",
|
|
263
|
+
|
|
264
|
+
"challenge_starter_code": "string (challenge일 때 필수) — ___BLANK___ 포함",
|
|
265
|
+
"challenge_answer_code": "string (challenge일 때 필수) — 완성 코드"
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
**필수 규칙:**
|
|
270
|
+
- 모듈당 code_example 최소 1개 + quiz_question 최소 1개
|
|
271
|
+
- 최소 ${minSections}개 섹션
|
|
272
|
+
- explanation body는 ${minBodyChars}자 이상${difficulty === "beginner" ? `
|
|
273
|
+
|
|
274
|
+
**[초급 전용 추가 규칙 — 반드시 준수]:**
|
|
275
|
+
- 모든 개념에 "이게 없으면?" before/after 비교 필수
|
|
276
|
+
- code_example 모든 코드 라인에 "우리말 번역" 필수
|
|
277
|
+
- challenge 빈칸 1-2개만, 힌트 매우 구체적
|
|
278
|
+
- 기술 용어에 한국어 별명 필수` : ""}
|
|
279
|
+
|
|
280
|
+
${progressKO}`;
|
|
281
|
+
return {
|
|
282
|
+
content: [
|
|
283
|
+
{
|
|
284
|
+
type: "text",
|
|
285
|
+
text: instructions,
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
292
|
+
return {
|
|
293
|
+
content: [
|
|
294
|
+
{
|
|
295
|
+
type: "text",
|
|
296
|
+
text: `Failed to generate module content instructions: ${message}`,
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
isError: true,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=generate-module-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-module-content.js","sourceRoot":"","sources":["../../src/tools/generate-module-content.ts"],"names":[],"mappings":"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"}
|