@vibeuniv/mcp-server 0.3.6 → 0.3.8
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/README.md +141 -90
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.js +1 -1
- package/dist/lib/curriculum-helpers.d.ts +19 -6
- package/dist/lib/curriculum-helpers.d.ts.map +1 -1
- package/dist/lib/curriculum-helpers.js +33 -25
- package/dist/lib/curriculum-helpers.js.map +1 -1
- package/dist/tools/generate-curriculum.d.ts.map +1 -1
- package/dist/tools/generate-curriculum.js +78 -367
- package/dist/tools/generate-curriculum.js.map +1 -1
- package/dist/tools/generate-module-content.d.ts +7 -0
- package/dist/tools/generate-module-content.d.ts.map +1 -1
- package/dist/tools/generate-module-content.js +69 -43
- package/dist/tools/generate-module-content.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { scanTeachingCriticalFiles } from "../lib/file-scanner.js";
|
|
3
|
-
import { formatTechStack, formatKBHints, formatEducationalAnalysis, buildLevelGuidance, filterKBHintsForModule, } from "../lib/curriculum-helpers.js";
|
|
3
|
+
import { formatTechStack, formatKBHints, formatEducationalAnalysis, buildLevelGuidance, filterKBHintsForModule, getCachedCurriculumData, setCachedCurriculumData, } from "../lib/curriculum-helpers.js";
|
|
4
4
|
export const generateModuleContentSchema = {
|
|
5
5
|
project_id: z.string().describe("The VibeUniv project ID"),
|
|
6
6
|
module_index: z.number().int().min(0).describe("0-based module index"),
|
|
@@ -11,6 +11,8 @@ export const generateModuleContentSchema = {
|
|
|
11
11
|
module_type: z.string(),
|
|
12
12
|
tech_name: z.string(),
|
|
13
13
|
estimated_minutes: z.number().optional(),
|
|
14
|
+
relevant_files: z.array(z.string()).optional(),
|
|
15
|
+
learning_objectives: z.array(z.string()).optional(),
|
|
14
16
|
})
|
|
15
17
|
.describe("Module structure object from vibeuniv_generate_curriculum"),
|
|
16
18
|
difficulty: z
|
|
@@ -18,15 +20,16 @@ export const generateModuleContentSchema = {
|
|
|
18
20
|
.default("beginner")
|
|
19
21
|
.describe("Curriculum difficulty level"),
|
|
20
22
|
total_modules: z.number().int().min(1).describe("Total number of modules in the curriculum"),
|
|
23
|
+
learning_path_id: z.string().optional().describe("Learning path ID from vibeuniv_create_curriculum (for submit guidance)"),
|
|
21
24
|
};
|
|
22
25
|
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 }) => {
|
|
26
|
+
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. After generating sections, immediately submit with vibeuniv_submit_module.", generateModuleContentSchema, { readOnlyHint: true, openWorldHint: true }, async ({ project_id, module_index, module, difficulty, total_modules, learning_path_id }) => {
|
|
24
27
|
try {
|
|
25
28
|
console.error(`[vibeuniv] Generating content for module ${module_index + 1}/${total_modules}: "${module.title}"...`);
|
|
26
29
|
// Try cached data first, fetch fresh if miss
|
|
27
30
|
let curriculumContext;
|
|
28
31
|
let localFiles = [];
|
|
29
|
-
const cached =
|
|
32
|
+
const cached = getCachedCurriculumData(project_id);
|
|
30
33
|
if (cached) {
|
|
31
34
|
console.error(`[vibeuniv] Using cached curriculum context for project ${project_id}`);
|
|
32
35
|
curriculumContext = cached.context;
|
|
@@ -41,7 +44,7 @@ export function registerGenerateModuleContent(server, client) {
|
|
|
41
44
|
catch (err) {
|
|
42
45
|
console.error(`[vibeuniv] Local file scan failed (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
43
46
|
}
|
|
44
|
-
|
|
47
|
+
setCachedCurriculumData(project_id, curriculumContext, localFiles);
|
|
45
48
|
}
|
|
46
49
|
const techStacks = curriculumContext.techStacks;
|
|
47
50
|
const locale = curriculumContext.locale ?? "ko";
|
|
@@ -61,8 +64,18 @@ export function registerGenerateModuleContent(server, client) {
|
|
|
61
64
|
console.error(`[vibeuniv] Educational analysis formatting failed (non-fatal): ${err instanceof Error ? err.message : err}`);
|
|
62
65
|
}
|
|
63
66
|
}
|
|
64
|
-
// Source code
|
|
65
|
-
const
|
|
67
|
+
// Source code — filter to relevant files if available, otherwise include all
|
|
68
|
+
const allFiles = localFiles.length > 0 ? localFiles : (curriculumContext.files ?? []);
|
|
69
|
+
let curriculumFiles = allFiles;
|
|
70
|
+
if (module.relevant_files && module.relevant_files.length > 0) {
|
|
71
|
+
const relevantPaths = new Set(module.relevant_files.map((f) => f.toLowerCase()));
|
|
72
|
+
const matched = allFiles.filter((f) => relevantPaths.has(f.file_path.toLowerCase()) ||
|
|
73
|
+
module.relevant_files.some((rf) => f.file_path.toLowerCase().includes(rf.toLowerCase())));
|
|
74
|
+
// Use matched files if found, otherwise fall back to all files
|
|
75
|
+
if (matched.length > 0) {
|
|
76
|
+
curriculumFiles = matched;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
66
79
|
const filesSection = curriculumFiles.length > 0
|
|
67
80
|
? en
|
|
68
81
|
? `\n## Project Source Code
|
|
@@ -89,36 +102,49 @@ ${curriculumFiles.map((f) => `#### ${f.file_path}\n\`\`\`\n${f.content}\n\`\`\``
|
|
|
89
102
|
: en ? "(none)" : "(없음)";
|
|
90
103
|
const levelGuidance = buildLevelGuidance(difficulty, locale);
|
|
91
104
|
const learnMoreLabel = en ? "📚 Learn More" : "📚 더 알아보기";
|
|
92
|
-
const minBodyChars = difficulty === "beginner" ? "
|
|
93
|
-
const sectionsPerModule = difficulty === "beginner" ? "
|
|
94
|
-
const minSections = difficulty === "beginner" ? "
|
|
95
|
-
const paragraphs = difficulty === "beginner" ? "
|
|
96
|
-
|
|
105
|
+
const minBodyChars = difficulty === "beginner" ? "800" : "400";
|
|
106
|
+
const sectionsPerModule = difficulty === "beginner" ? "7-10" : "5-7";
|
|
107
|
+
const minSections = difficulty === "beginner" ? "7" : "5";
|
|
108
|
+
const paragraphs = difficulty === "beginner" ? "8-12" : "5-8";
|
|
109
|
+
const minCodeExamples = difficulty === "beginner" ? "2" : "1";
|
|
110
|
+
const minQuizQuestions = difficulty === "beginner" ? "2" : "1";
|
|
111
|
+
// Learning objectives guidance
|
|
112
|
+
const objectivesSection = module.learning_objectives && module.learning_objectives.length > 0
|
|
113
|
+
? en
|
|
114
|
+
? `\n**Learning Objectives (must be covered in sections):**\n${module.learning_objectives.map((o) => `- ${o}`).join("\n")}\n`
|
|
115
|
+
: `\n**학습 목표 (섹션에서 반드시 다뤄야 함):**\n${module.learning_objectives.map((o) => `- ${o}`).join("\n")}\n`
|
|
116
|
+
: "";
|
|
117
|
+
// Progress & submit guidance
|
|
97
118
|
const isLastModule = module_index >= total_modules - 1;
|
|
119
|
+
const pathIdRef = learning_path_id || "<learning_path_id>";
|
|
98
120
|
const progressEN = isLastModule
|
|
99
|
-
? `##
|
|
100
|
-
|
|
101
|
-
This is the
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
121
|
+
? `## Next Step (auto-execute, do NOT ask the user)
|
|
122
|
+
|
|
123
|
+
This is the LAST module (${module_index + 1}/${total_modules}). After generating sections:
|
|
124
|
+
1. Call **vibeuniv_submit_module**({ project_id: "${project_id}", learning_path_id: "${pathIdRef}", module_order: ${module_index + 1}, title: "${module.title}", description: "...", module_type: "${module.module_type}", tech_name: "${module.tech_name}", content: { sections: [...] } })
|
|
125
|
+
2. Show completion message with vibeuniv.com link — curriculum auto-activates!
|
|
126
|
+
**Do NOT show the sections JSON to the user. Do NOT ask for confirmation.**`
|
|
127
|
+
: `## Next Step (auto-execute, do NOT ask the user)
|
|
128
|
+
|
|
129
|
+
Module ${module_index + 1} of ${total_modules}. After generating sections:
|
|
130
|
+
1. Call **vibeuniv_submit_module**({ project_id: "${project_id}", learning_path_id: "${pathIdRef}", module_order: ${module_index + 1}, title: "${module.title}", description: "...", module_type: "${module.module_type}", tech_name: "${module.tech_name}", content: { sections: [...] } })
|
|
131
|
+
2. Show one-line progress: "Module ${module_index + 1}/${total_modules} ✓"
|
|
132
|
+
3. Immediately proceed to next module: **vibeuniv_generate_module_content**({ project_id: "${project_id}", module_index: ${module_index + 1}, module: <next>, difficulty: "${difficulty}", total_modules: ${total_modules}${learning_path_id ? `, learning_path_id: "${learning_path_id}"` : ""} })
|
|
133
|
+
**Do NOT show the sections JSON to the user. Do NOT ask for confirmation. Just keep going.**`;
|
|
110
134
|
const progressKO = isLastModule
|
|
111
|
-
? `##
|
|
112
|
-
|
|
113
|
-
마지막 모듈입니다 (${module_index + 1}/${total_modules}).
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
135
|
+
? `## 다음 단계 (자동 실행 — 사용자에게 묻지 마세요)
|
|
136
|
+
|
|
137
|
+
마지막 모듈입니다 (${module_index + 1}/${total_modules}). 섹션 생성 후:
|
|
138
|
+
1. **vibeuniv_submit_module**({ project_id: "${project_id}", learning_path_id: "${pathIdRef}", module_order: ${module_index + 1}, title: "${module.title}", description: "...", module_type: "${module.module_type}", tech_name: "${module.tech_name}", content: { sections: [...] } }) 호출
|
|
139
|
+
2. 완료 메시지 + vibeuniv.com 링크 표시 — 커리큘럼 자동 활성화!
|
|
140
|
+
**섹션 JSON을 사용자에게 보여주지 마세요. 확인을 구하지 마세요.**`
|
|
141
|
+
: `## 다음 단계 (자동 실행 — 사용자에게 묻지 마세요)
|
|
142
|
+
|
|
143
|
+
모듈 ${module_index + 1} / ${total_modules}. 섹션 생성 후:
|
|
144
|
+
1. **vibeuniv_submit_module**({ project_id: "${project_id}", learning_path_id: "${pathIdRef}", module_order: ${module_index + 1}, title: "${module.title}", description: "...", module_type: "${module.module_type}", tech_name: "${module.tech_name}", content: { sections: [...] } }) 호출
|
|
145
|
+
2. 한 줄 진행 표시: "모듈 ${module_index + 1}/${total_modules} ✓"
|
|
146
|
+
3. 즉시 다음 모듈 진행: **vibeuniv_generate_module_content**({ project_id: "${project_id}", module_index: ${module_index + 1}, module: <다음 모듈>, difficulty: "${difficulty}", total_modules: ${total_modules}${learning_path_id ? `, learning_path_id: "${learning_path_id}"` : ""} })
|
|
147
|
+
**섹션 JSON을 사용자에게 보여주지 마세요. 확인을 구하지 마세요. 그냥 계속 진행하세요.**`;
|
|
122
148
|
const instructions = en
|
|
123
149
|
? `Generate content sections for module ${module_index + 1} of ${total_modules}: "${module.title}"
|
|
124
150
|
|
|
@@ -127,8 +153,8 @@ vibeuniv_generate_module_content({ project_id: "${project_id}", module_index: ${
|
|
|
127
153
|
- **Description:** ${module.description}
|
|
128
154
|
- **Type:** ${module.module_type}
|
|
129
155
|
- **Technology:** ${module.tech_name}
|
|
130
|
-
${module.estimated_minutes ? `- **Estimated:** ${module.estimated_minutes} minutes` : ""}- **Difficulty:** ${difficulty}
|
|
131
|
-
|
|
156
|
+
${module.estimated_minutes ? `- **Estimated:** ${module.estimated_minutes} minutes\n` : ""}- **Difficulty:** ${difficulty}
|
|
157
|
+
${objectivesSection}
|
|
132
158
|
## Level Guidance
|
|
133
159
|
${levelGuidance}
|
|
134
160
|
|
|
@@ -149,8 +175,8 @@ ${filesSection}${eduSection}${kbSection}
|
|
|
149
175
|
**Required Placement Rules:**
|
|
150
176
|
- Start each module with explanation
|
|
151
177
|
- Maximum 2 consecutive explanations, 3rd must be quiz/reflection
|
|
152
|
-
- At least
|
|
153
|
-
- At least
|
|
178
|
+
- At least ${minCodeExamples} code_example(s) per module required
|
|
179
|
+
- At least ${minQuizQuestions} quiz_question(s) per module required
|
|
154
180
|
- At least 1 challenge per module required (interactive coding exercise)
|
|
155
181
|
|
|
156
182
|
**Tone (Critical — key to learning content quality):**
|
|
@@ -189,7 +215,7 @@ Output ONLY a JSON array of sections (no code fences/explanations):
|
|
|
189
215
|
]
|
|
190
216
|
|
|
191
217
|
**Required Rules:**
|
|
192
|
-
- At least
|
|
218
|
+
- At least ${minCodeExamples} code_example(s) + ${minQuizQuestions} quiz_question(s) + 1 challenge
|
|
193
219
|
- Minimum ${minSections} sections
|
|
194
220
|
- explanation body must be at least ${minBodyChars} characters${difficulty === "beginner" ? `
|
|
195
221
|
|
|
@@ -207,8 +233,8 @@ ${progressEN}`
|
|
|
207
233
|
- **설명:** ${module.description}
|
|
208
234
|
- **유형:** ${module.module_type}
|
|
209
235
|
- **기술:** ${module.tech_name}
|
|
210
|
-
${module.estimated_minutes ? `- **예상 시간:** ${module.estimated_minutes}
|
|
211
|
-
|
|
236
|
+
${module.estimated_minutes ? `- **예상 시간:** ${module.estimated_minutes}분\n` : ""}- **난이도:** ${difficulty}
|
|
237
|
+
${objectivesSection}
|
|
212
238
|
## 난이도별 가이드
|
|
213
239
|
${levelGuidance}
|
|
214
240
|
|
|
@@ -229,8 +255,8 @@ ${filesSection}${eduSection}${kbSection}
|
|
|
229
255
|
**필수 배치 규칙:**
|
|
230
256
|
- 모듈 시작은 explanation으로
|
|
231
257
|
- explanation 연속 2개까지만, 3번째는 반드시 quiz/reflection
|
|
232
|
-
- 모듈당 code_example 최소
|
|
233
|
-
- 모듈당 quiz_question 최소
|
|
258
|
+
- 모듈당 code_example 최소 ${minCodeExamples}개 필수
|
|
259
|
+
- 모듈당 quiz_question 최소 ${minQuizQuestions}개 필수
|
|
234
260
|
- 모듈당 challenge 최소 1개 필수 (코드 타이핑 실습)
|
|
235
261
|
|
|
236
262
|
**톤 (매우 중요 — 학습 콘텐츠 품질의 핵심):**
|
|
@@ -269,7 +295,7 @@ ${filesSection}${eduSection}${kbSection}
|
|
|
269
295
|
]
|
|
270
296
|
|
|
271
297
|
**필수 규칙:**
|
|
272
|
-
- 모듈당 code_example 최소
|
|
298
|
+
- 모듈당 code_example 최소 ${minCodeExamples}개 + quiz_question 최소 ${minQuizQuestions}개 + challenge 최소 1개
|
|
273
299
|
- 최소 ${minSections}개 섹션
|
|
274
300
|
- explanation body는 ${minBodyChars}자 이상${difficulty === "beginner" ? `
|
|
275
301
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-module-content.js","sourceRoot":"","sources":["../../src/tools/generate-module-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EACL,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"generate-module-content.js","sourceRoot":"","sources":["../../src/tools/generate-module-content.ts"],"names":[],"mappings":"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"}
|