@vibeuniv/mcp-server 0.3.1 β†’ 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.
Files changed (42) hide show
  1. package/dist/index.js +5 -3
  2. package/dist/index.js.map +1 -1
  3. package/dist/lib/api-client.d.ts +16 -1
  4. package/dist/lib/api-client.d.ts.map +1 -1
  5. package/dist/lib/api-client.js +33 -0
  6. package/dist/lib/api-client.js.map +1 -1
  7. package/dist/lib/curriculum-helpers.d.ts +11 -0
  8. package/dist/lib/curriculum-helpers.d.ts.map +1 -0
  9. package/dist/lib/curriculum-helpers.js +243 -0
  10. package/dist/lib/curriculum-helpers.js.map +1 -0
  11. package/dist/lib/file-scanner.d.ts +13 -0
  12. package/dist/lib/file-scanner.d.ts.map +1 -1
  13. package/dist/lib/file-scanner.js +43 -1
  14. package/dist/lib/file-scanner.js.map +1 -1
  15. package/dist/tools/analyze.d.ts.map +1 -1
  16. package/dist/tools/analyze.js +13 -4
  17. package/dist/tools/analyze.js.map +1 -1
  18. package/dist/tools/ask-tutor.d.ts.map +1 -1
  19. package/dist/tools/ask-tutor.js +17 -5
  20. package/dist/tools/ask-tutor.js.map +1 -1
  21. package/dist/tools/generate-curriculum.d.ts.map +1 -1
  22. package/dist/tools/generate-curriculum.js +192 -158
  23. package/dist/tools/generate-curriculum.js.map +1 -1
  24. package/dist/tools/generate-module-content.d.ts +30 -0
  25. package/dist/tools/generate-module-content.d.ts.map +1 -0
  26. package/dist/tools/generate-module-content.js +304 -0
  27. package/dist/tools/generate-module-content.js.map +1 -0
  28. package/dist/tools/submit-analysis.d.ts.map +1 -1
  29. package/dist/tools/submit-analysis.js +17 -7
  30. package/dist/tools/submit-analysis.js.map +1 -1
  31. package/dist/tools/submit-curriculum.d.ts.map +1 -1
  32. package/dist/tools/submit-curriculum.js +66 -19
  33. package/dist/tools/submit-curriculum.js.map +1 -1
  34. package/dist/tools/submit-tech-stacks.d.ts.map +1 -1
  35. package/dist/tools/submit-tech-stacks.js +12 -3
  36. package/dist/tools/submit-tech-stacks.js.map +1 -1
  37. package/dist/tools/sync-project.d.ts.map +1 -1
  38. package/dist/tools/sync-project.js +33 -15
  39. package/dist/tools/sync-project.js.map +1 -1
  40. package/dist/types.d.ts +6 -0
  41. package/dist/types.d.ts.map +1 -1
  42. 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":"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,GACvB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACtE,MAAM,EAAE,CAAC;SACN,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACzC,CAAC;SACD,QAAQ,CAAC,2DAA2D,CAAC;IACxE,UAAU,EAAE,CAAC;SACV,IAAI,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;SAC9C,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC7F,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,MAAiB,EAAE,MAAsB;IACrF,MAAM,CAAC,IAAI,CACT,kCAAkC,EAClC,gNAAgN,EAChN,2BAA2B,EAC3B,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;QACxE,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,4CAA4C,YAAY,GAAG,CAAC,IAAI,aAAa,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC;YAErH,6CAA6C;YAC7C,IAAI,iBAAoC,CAAC;YACzC,IAAI,UAAU,GAAkD,EAAE,CAAC;YAEnE,MAAM,MAAM,GAAG,MAAM,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,0DAA0D,UAAU,EAAE,CAAC,CAAC;gBACtF,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,yEAAyE,UAAU,EAAE,CAAC,CAAC;gBACrG,iBAAiB,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAClE,IAAI,CAAC;oBACH,UAAU,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9G,CAAC;gBACD,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAC;YAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,IAAI,IAAI,CAAC;YAChD,MAAM,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC;YAE3B,2DAA2D;YAC3D,MAAM,aAAa,GAAG,sBAAsB,CAAC,iBAAiB,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACjG,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC;gBACrD,CAAC,CAAC,KAAK,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC/C,CAAC,CAAC,EAAE,CAAC;YAEP,uBAAuB;YACvB,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,UAAU,GAAG,KAAK,yBAAyB,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC;gBAC7G,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC9H,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7F,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE;oBACF,CAAC,CAAC;;;;;;EAMZ,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtF,CAAC,CAAC;;;;;;EAMZ,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;gBACxF,CAAC,CAAC,EAAE,CAAC;YAEP,qBAAqB;YACrB,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;YACrE,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC;gBAChD,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;YAE3B,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAE7D,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;YAC1D,MAAM,YAAY,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/D,MAAM,iBAAiB,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACpE,MAAM,WAAW,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1D,MAAM,UAAU,GAAG,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAE7D,oBAAoB;YACpB,MAAM,YAAY,GAAG,YAAY,IAAI,aAAa,GAAG,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,YAAY;gBAC7B,CAAC,CAAC;;2BAEe,YAAY,GAAG,CAAC,IAAI,aAAa;;;;sDAIN,UAAU,mCAAmC;gBACzF,CAAC,CAAC,uBAAuB,YAAY,GAAG,CAAC,OAAO,aAAa;;;kDAGrB,UAAU,oBAAoB,YAAY,GAAG,CAAC,wDAAwD,UAAU,qBAAqB,aAAa,KAAK,CAAC;YAElM,MAAM,UAAU,GAAG,YAAY;gBAC7B,CAAC,CAAC;;aAEC,YAAY,GAAG,CAAC,IAAI,aAAa;;;;kDAII,UAAU,6BAA6B;gBAC/E,CAAC,CAAC,aAAa,YAAY,GAAG,CAAC,MAAM,aAAa;;;kDAGV,UAAU,oBAAoB,YAAY,GAAG,CAAC,wCAAwC,UAAU,qBAAqB,aAAa,KAAK,CAAC;YAElL,MAAM,YAAY,GAAG,EAAE;gBACrB,CAAC,CAAC,wCAAwC,YAAY,GAAG,CAAC,OAAO,aAAa,MAAM,MAAM,CAAC,KAAK;;;eAG3F,MAAM,CAAC,KAAK;qBACN,MAAM,CAAC,WAAW;cACzB,MAAM,CAAC,WAAW;oBACZ,MAAM,CAAC,SAAS;EAClC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,iBAAiB,UAAU,CAAC,CAAC,CAAC,EAAE,qBAAqB,UAAU;;;EAGrH,aAAa;;;YAGH,QAAQ;kBACF,cAAc;EAC9B,YAAY,GAAG,UAAU,GAAG,SAAS;qBAClB,iBAAiB,sBAAsB,WAAW;0BAC7C,UAAU;cACtB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAoC0C,YAAY;;;;;;;;;;;;;;;YAetE,WAAW;sCACe,YAAY,cAAc,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC;;;;;;mDAMzC,CAAC,CAAC,CAAC,EAAE;;EAEtD,UAAU,EAAE;gBACJ,CAAC,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,aAAa,sBAAsB,MAAM,CAAC,KAAK;;;YAGzE,MAAM,CAAC,KAAK;YACZ,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,SAAS;EAC1B,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,UAAU;;;EAGnG,aAAa;;;YAGH,QAAQ;kBACF,cAAc;EAC9B,YAAY,GAAG,UAAU,GAAG,SAAS;YAC3B,iBAAiB,SAAS,WAAW;sBAC3B,UAAU;QACxB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAoCgC,YAAY;;;;;;;;;;;;;;;OAe3D,WAAW;sBACI,YAAY,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC;;;;;;mBAMlD,CAAC,CAAC,CAAC,EAAE;;EAEtB,UAAU,EAAE,CAAC;YAEP,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,mDAAmD,OAAO,EAAE;qBACnE;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"submit-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/submit-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,oBAAoB;;;CAQhC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuCtF"}
1
+ {"version":3,"file":"submit-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/submit-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,oBAAoB;;;CAQhC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAkDtF"}
@@ -11,17 +11,27 @@ export function registerSubmitAnalysis(server, client) {
11
11
  try {
12
12
  console.error(`[vibeuniv] Submitting educational analysis for project ${project_id}...`);
13
13
  await client.submitEducationalAnalysis(project_id, analysis);
14
+ const locale = await client.getUserLocale();
15
+ const message = locale === "en"
16
+ ? [
17
+ `Educational analysis submitted successfully! (Project: ${project_id})`,
18
+ `This data will be used to generate a personalized learning curriculum.`,
19
+ ``,
20
+ `Next step: Call vibeuniv_analyze to analyze the tech stack.`,
21
+ `Once analysis is complete, you can view the project at https://vibeuniv.com`,
22
+ ]
23
+ : [
24
+ `ꡐ윑적 뢄석이 μ„±κ³΅μ μœΌλ‘œ μ œμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€! (Project: ${project_id})`,
25
+ `이 λ°μ΄ν„°λŠ” 맞좀 ν•™μŠ΅ 컀리큘럼 생성에 ν™œμš©λ©λ‹ˆλ‹€.`,
26
+ ``,
27
+ `λ‹€μŒ 단계: vibeuniv_analyzeλ₯Ό ν˜ΈμΆœν•˜μ—¬ 기술 μŠ€νƒμ„ λΆ„μ„ν•˜μ„Έμš”.`,
28
+ `뢄석이 μ™„λ£Œλ˜λ©΄ https://vibeuniv.com μ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.`,
29
+ ];
14
30
  return {
15
31
  content: [
16
32
  {
17
33
  type: "text",
18
- text: [
19
- `ꡐ윑적 뢄석이 μ„±κ³΅μ μœΌλ‘œ μ œμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€! (Project: ${project_id})`,
20
- `이 λ°μ΄ν„°λŠ” 맞좀 ν•™μŠ΅ 컀리큘럼 생성에 ν™œμš©λ©λ‹ˆλ‹€.`,
21
- ``,
22
- `λ‹€μŒ 단계: vibeuniv_analyzeλ₯Ό ν˜ΈμΆœν•˜μ—¬ 기술 μŠ€νƒμ„ λΆ„μ„ν•˜μ„Έμš”.`,
23
- `뢄석이 μ™„λ£Œλ˜λ©΄ https://vibeuniv.com μ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.`,
24
- ].join("\n"),
34
+ text: message.join("\n"),
25
35
  },
26
36
  ],
27
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"submit-analysis.js","sourceRoot":"","sources":["../../src/tools/submit-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,CACP,0JAA0J,CAC3J;CACJ,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAsB;IAC9E,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,4FAA4F,EAC5F,oBAAoB,EACpB,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,0DAA0D,UAAU,KAAK,CAAC,CAAC;YACzF,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,QAAmC,CAAC,CAAC;YAExF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,oCAAoC,UAAU,GAAG;4BACjD,8BAA8B;4BAC9B,EAAE;4BACF,6CAA6C;4BAC7C,oDAAoD;yBACrD,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0CAA0C,OAAO,EAAE;qBAC1D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"submit-analysis.js","sourceRoot":"","sources":["../../src/tools/submit-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,CACP,0JAA0J,CAC3J;CACJ,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAsB;IAC9E,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,4FAA4F,EAC5F,oBAAoB,EACpB,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,0DAA0D,UAAU,KAAK,CAAC,CAAC;YACzF,MAAM,MAAM,CAAC,yBAAyB,CAAC,UAAU,EAAE,QAAmC,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAE5C,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI;gBAC7B,CAAC,CAAC;oBACE,0DAA0D,UAAU,GAAG;oBACvE,wEAAwE;oBACxE,EAAE;oBACF,6DAA6D;oBAC7D,6EAA6E;iBAC9E;gBACH,CAAC,CAAC;oBACE,oCAAoC,UAAU,GAAG;oBACjD,8BAA8B;oBAC9B,EAAE;oBACF,6CAA6C;oBAC7C,oDAAoD;iBACrD,CAAC;YAEN,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;qBACzB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0CAA0C,OAAO,EAAE;qBAC1D;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"submit-curriculum.d.ts","sourceRoot":"","sources":["../../src/tools/submit-curriculum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,sBAAsB;;;CAQlC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAqDxF"}
1
+ {"version":3,"file":"submit-curriculum.d.ts","sourceRoot":"","sources":["../../src/tools/submit-curriculum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,sBAAsB;;;CAQlC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuGxF"}
@@ -11,39 +11,86 @@ export function registerSubmitCurriculum(server, client) {
11
11
  try {
12
12
  console.error(`[vibeuniv] Submitting curriculum for project ${project_id}...`);
13
13
  const result = await client.submitCurriculum(project_id, curriculum);
14
+ const locale = await client.getUserLocale();
15
+ const message = locale === "en"
16
+ ? [
17
+ `Curriculum created successfully!`,
18
+ ``,
19
+ `- Learning Path ID: ${result.learningPathId}`,
20
+ `- Title: ${result.title}`,
21
+ `- Total modules: ${result.totalModules}`,
22
+ ``,
23
+ `${"=".repeat(50)}`,
24
+ `πŸŽ“ Ready to learn!`,
25
+ `${"=".repeat(50)}`,
26
+ ``,
27
+ `Your personalized learning curriculum is ready.`,
28
+ `Start learning right away at the link below:`,
29
+ ``,
30
+ `πŸ‘‰ https://vibeuniv.com`,
31
+ ``,
32
+ `Start your project-based learning journey with an AI tutor!`,
33
+ ]
34
+ : [
35
+ `컀리큘럼이 μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€!`,
36
+ ``,
37
+ `- Learning Path ID: ${result.learningPathId}`,
38
+ `- 제λͺ©: ${result.title}`,
39
+ `- 총 λͺ¨λ“ˆ 수: ${result.totalModules}`,
40
+ ``,
41
+ `${"=".repeat(50)}`,
42
+ `πŸŽ“ ν•™μŠ΅ μ€€λΉ„ μ™„λ£Œ!`,
43
+ `${"=".repeat(50)}`,
44
+ ``,
45
+ `맞좀 ν•™μŠ΅ 컀리큘럼이 μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.`,
46
+ `μ•„λž˜ λ§ν¬μ—μ„œ λ°”λ‘œ ν•™μŠ΅μ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€:`,
47
+ ``,
48
+ `πŸ‘‰ https://vibeuniv.com`,
49
+ ``,
50
+ `AI νŠœν„°μ™€ ν•¨κ»˜ ν”„λ‘œμ νŠΈ 기반 ν•™μŠ΅μ„ μ‹œμž‘ν•΄λ³΄μ„Έμš”!`,
51
+ ];
14
52
  return {
15
53
  content: [
16
54
  {
17
55
  type: "text",
18
- text: [
19
- `컀리큘럼이 μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€!`,
20
- ``,
21
- `- Learning Path ID: ${result.learningPathId}`,
22
- `- 제λͺ©: ${result.title}`,
23
- `- 총 λͺ¨λ“ˆ 수: ${result.totalModules}`,
24
- ``,
25
- `${"=".repeat(50)}`,
26
- `πŸŽ“ ν•™μŠ΅ μ€€λΉ„ μ™„λ£Œ!`,
27
- `${"=".repeat(50)}`,
28
- ``,
29
- `맞좀 ν•™μŠ΅ 컀리큘럼이 μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.`,
30
- `μ•„λž˜ λ§ν¬μ—μ„œ λ°”λ‘œ ν•™μŠ΅μ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€:`,
31
- ``,
32
- `πŸ‘‰ https://vibeuniv.com`,
33
- ``,
34
- `AI νŠœν„°μ™€ ν•¨κ»˜ ν”„λ‘œμ νŠΈ 기반 ν•™μŠ΅μ„ μ‹œμž‘ν•΄λ³΄μ„Έμš”!`,
35
- ].join("\n"),
56
+ text: message.join("\n"),
36
57
  },
37
58
  ],
38
59
  };
39
60
  }
40
61
  catch (error) {
41
62
  const message = error instanceof Error ? error.message : String(error);
63
+ const locale = await client.getUserLocale().catch(() => "ko");
64
+ const hint = locale === "en"
65
+ ? [
66
+ ``,
67
+ `--- Validation Guide ---`,
68
+ `Server minimum requirements:`,
69
+ `β€’ 10+ modules (aim for 10-15)`,
70
+ `β€’ Beginner: 5+ sections/module, 400+ chars/explanation`,
71
+ `β€’ Other: 3+ sections/module, 200+ chars/explanation`,
72
+ `β€’ Each module needs at least 1 code_example + 1 quiz_question`,
73
+ `β€’ quiz_question needs exactly 4 options + quiz_explanation`,
74
+ ``,
75
+ `Fix the failing module/section and resubmit β€” no need to regenerate everything.`,
76
+ ]
77
+ : [
78
+ ``,
79
+ `--- 검증 κ°€μ΄λ“œ ---`,
80
+ `μ„œλ²„ μ΅œμ†Œ μš”κ΅¬μ‚¬ν•­:`,
81
+ `β€’ 10개 이상 λͺ¨λ“ˆ (10-15개 ꢌμž₯)`,
82
+ `β€’ μ΄ˆκΈ‰: λͺ¨λ“ˆλ‹Ή 5κ°œβ†‘ μ„Ήμ…˜, explanation 400μžβ†‘`,
83
+ `β€’ κ·Έ μ™Έ: λͺ¨λ“ˆλ‹Ή 3κ°œβ†‘ μ„Ήμ…˜, explanation 200μžβ†‘`,
84
+ `β€’ λͺ¨λ“ˆλ‹Ή code_example 1κ°œβ†‘ + quiz_question 1κ°œβ†‘ ν•„μˆ˜`,
85
+ `β€’ quiz_question은 μ •ν™•νžˆ 4개 선택지 + quiz_explanation ν•„μˆ˜`,
86
+ ``,
87
+ `μ‹€νŒ¨ν•œ λͺ¨λ“ˆ/μ„Ήμ…˜λ§Œ μˆ˜μ •ν•΄μ„œ λ‹€μ‹œ μ œμΆœν•˜μ„Έμš” β€” 전체 μž¬μƒμ„± λΆˆν•„μš”.`,
88
+ ];
42
89
  return {
43
90
  content: [
44
91
  {
45
92
  type: "text",
46
- text: `Failed to submit curriculum: ${message}`,
93
+ text: `Failed to submit curriculum: ${message}\n${hint.join("\n")}`,
47
94
  },
48
95
  ],
49
96
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"submit-curriculum.js","sourceRoot":"","sources":["../../src/tools/submit-curriculum.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,UAAU,EAAE,CAAC;SACV,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,CACP,qHAAqH,CACtH;CACJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAsB;IAChF,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,yIAAyI,EACzI,sBAAsB,EACtB,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,gDAAgD,UAAU,KAAK,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC1C,UAAU,EACV,UAAqC,CACtC,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,sBAAsB;4BACtB,EAAE;4BACF,uBAAuB,MAAM,CAAC,cAAc,EAAE;4BAC9C,SAAS,MAAM,CAAC,KAAK,EAAE;4BACvB,aAAa,MAAM,CAAC,YAAY,EAAE;4BAClC,EAAE;4BACF,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;4BACnB,cAAc;4BACd,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;4BACnB,EAAE;4BACF,sBAAsB;4BACtB,4BAA4B;4BAC5B,EAAE;4BACF,yBAAyB;4BACzB,EAAE;4BACF,+BAA+B;yBAChC,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gCAAgC,OAAO,EAAE;qBAChD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"submit-curriculum.js","sourceRoot":"","sources":["../../src/tools/submit-curriculum.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"submit-tech-stacks.d.ts","sourceRoot":"","sources":["../../src/tools/submit-tech-stacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,eAAO,MAAM,sBAAsB;;;CAQlC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAoDxF"}
1
+ {"version":3,"file":"submit-tech-stacks.d.ts","sourceRoot":"","sources":["../../src/tools/submit-tech-stacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,eAAO,MAAM,sBAAsB;;;CAQlC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA4DxF"}
@@ -26,9 +26,18 @@ export function registerSubmitTechStacks(server, client) {
26
26
  };
27
27
  }
28
28
  const result = await client.submitTechStacks(project_id, submission);
29
- let output = `πŸŽ‰ ν”„λ‘œμ νŠΈ μ—°κ²° μ™„λ£Œ! (${result.savedCount}개 기술 μ €μž₯)\n\n`;
30
- output += `https://vibeuniv.com μ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.\n\n`;
31
- output += `πŸ“š λ‹€μŒ: μ‚¬μš©μžμ—κ²Œ λ‚œμ΄λ„(beginner μ΄ˆκΈ‰ / intermediate 쀑급 / advanced κ³ κΈ‰)λ₯Ό λ¬Όμ–΄λ³Έ ν›„ vibeuniv_generate_curriculum을 ν˜ΈμΆœν•˜μ„Έμš”.`;
29
+ const locale = await client.getUserLocale();
30
+ let output;
31
+ if (locale === "en") {
32
+ output = `πŸŽ‰ Project connected! (${result.savedCount} technologies saved)\n\n`;
33
+ output += `You can view the project at https://vibeuniv.com\n\n`;
34
+ output += `πŸ“š Next: Ask the user which difficulty level they prefer (beginner / intermediate / advanced), then call vibeuniv_generate_curriculum.`;
35
+ }
36
+ else {
37
+ output = `πŸŽ‰ ν”„λ‘œμ νŠΈ μ—°κ²° μ™„λ£Œ! (${result.savedCount}개 기술 μ €μž₯)\n\n`;
38
+ output += `https://vibeuniv.com μ—μ„œ ν”„λ‘œμ νŠΈλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.\n\n`;
39
+ output += `πŸ“š λ‹€μŒ: μ‚¬μš©μžμ—κ²Œ λ‚œμ΄λ„(beginner μ΄ˆκΈ‰ / intermediate 쀑급 / advanced κ³ κΈ‰)λ₯Ό λ¬Όμ–΄λ³Έ ν›„ vibeuniv_generate_curriculum을 ν˜ΈμΆœν•˜μ„Έμš”.`;
40
+ }
32
41
  return {
33
42
  content: [{ type: "text", text: output }],
34
43
  };
@@ -1 +1 @@
1
- {"version":3,"file":"submit-tech-stacks.js","sourceRoot":"","sources":["../../src/tools/submit-tech-stacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,CACP,iFAAiF,CAClF;CACJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAsB;IAChF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,wHAAwH,EACxH,sBAAsB,EACtB,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,iDAAiD,UAAU,KAAK,CAAC,CAAC;YAEhF,MAAM,UAAU,GAAG,QAA0C,CAAC;YAE9D,+BAA+B;YAC/B,IACE,CAAC,UAAU,CAAC,YAAY;gBACxB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;gBACvC,UAAU,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACpC,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oFAAoF;yBAC3F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAErE,IAAI,MAAM,GAAG,mBAAmB,MAAM,CAAC,UAAU,cAAc,CAAC;YAChE,MAAM,IAAI,+CAA+C,CAAC;YAC1D,MAAM,IAAI,2GAA2G,CAAC;YAEtH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACnD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iCAAiC,OAAO,EAAE;qBACjD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"submit-tech-stacks.js","sourceRoot":"","sources":["../../src/tools/submit-tech-stacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,CAAC;SACV,WAAW,EAAE;SACb,QAAQ,CACP,iFAAiF,CAClF;CACJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAsB;IAChF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,wHAAwH,EACxH,sBAAsB,EACtB,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,iDAAiD,UAAU,KAAK,CAAC,CAAC;YAEhF,MAAM,UAAU,GAAG,QAA0C,CAAC;YAE9D,+BAA+B;YAC/B,IACE,CAAC,UAAU,CAAC,YAAY;gBACxB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;gBACvC,UAAU,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACpC,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,oFAAoF;yBAC3F;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAE5C,IAAI,MAAc,CAAC;YACnB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,GAAG,0BAA0B,MAAM,CAAC,UAAU,0BAA0B,CAAC;gBAC/E,MAAM,IAAI,sDAAsD,CAAC;gBACjE,MAAM,IAAI,wIAAwI,CAAC;YACrJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,mBAAmB,MAAM,CAAC,UAAU,cAAc,CAAC;gBAC5D,MAAM,IAAI,+CAA+C,CAAC;gBAC1D,MAAM,IAAI,2GAA2G,CAAC;YACxH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aACnD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iCAAiC,OAAO,EAAE;qBACjD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync-project.d.ts","sourceRoot":"","sources":["../../src/tools/sync-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,iBAAiB;;;CAG7B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAoEnF"}
1
+ {"version":3,"file":"sync-project.d.ts","sourceRoot":"","sources":["../../src/tools/sync-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,iBAAiB;;;CAG7B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuFnF"}
@@ -30,25 +30,43 @@ export function registerSyncProject(server, client) {
30
30
  console.error(`[vibeuniv] Uploading ${files.length} files...`);
31
31
  await client.uploadFiles(project.id, files);
32
32
  const fileList = files.map((f) => ` - ${f.relativePath} (${f.size} bytes)`).join("\n");
33
+ const locale = await client.getUserLocale();
34
+ const message = locale === "en"
35
+ ? [
36
+ `Project "${project.name}" synced successfully!`,
37
+ `Project ID: ${project.id}`,
38
+ "",
39
+ `${files.length} files uploaded:`,
40
+ fileList,
41
+ "",
42
+ "Next step: Read the project source files and submit an educational analysis.",
43
+ "",
44
+ `vibeuniv_submit_analysis({ project_id: "${project.id}", analysis: {`,
45
+ ` project_overview: { one_liner, app_type, core_features },`,
46
+ ` file_roles: [{ path, role, complexity(1-5) }],`,
47
+ ` architecture_summary, learning_priorities: { start_with, focus_on, skip_for_now }`,
48
+ `} })`,
49
+ ]
50
+ : [
51
+ `ν”„λ‘œμ νŠΈ "${project.name}" 동기화 μ™„λ£Œ!`,
52
+ `Project ID: ${project.id}`,
53
+ "",
54
+ `${files.length}개 파일 μ—…λ‘œλ“œλ¨:`,
55
+ fileList,
56
+ "",
57
+ "λ‹€μŒ 단계: ν”„λ‘œμ νŠΈ μ†ŒμŠ€ νŒŒμΌμ„ 읽고 ꡐ윑적 뢄석을 μ œμΆœν•˜μ„Έμš”.",
58
+ "",
59
+ `vibeuniv_submit_analysis({ project_id: "${project.id}", analysis: {`,
60
+ ` project_overview: { one_liner, app_type, core_features },`,
61
+ ` file_roles: [{ path, role, complexity(1-5) }],`,
62
+ ` architecture_summary, learning_priorities: { start_with, focus_on, skip_for_now }`,
63
+ `} })`,
64
+ ];
33
65
  return {
34
66
  content: [
35
67
  {
36
68
  type: "text",
37
- text: [
38
- `ν”„λ‘œμ νŠΈ "${project.name}" 동기화 μ™„λ£Œ!`,
39
- `Project ID: ${project.id}`,
40
- "",
41
- `${files.length}개 파일 μ—…λ‘œλ“œλ¨:`,
42
- fileList,
43
- "",
44
- "λ‹€μŒ 단계: ν”„λ‘œμ νŠΈ μ†ŒμŠ€ νŒŒμΌμ„ 읽고 ꡐ윑적 뢄석을 μ œμΆœν•˜μ„Έμš”.",
45
- "",
46
- `vibeuniv_submit_analysis({ project_id: "${project.id}", analysis: {`,
47
- ` project_overview: { one_liner, app_type, core_features },`,
48
- ` file_roles: [{ path, role, complexity(1-5) }],`,
49
- ` architecture_summary, learning_priorities: { start_with, focus_on, skip_for_now }`,
50
- `} })`,
51
- ].join("\n"),
69
+ text: message.join("\n"),
52
70
  },
53
71
  ],
54
72
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sync-project.js","sourceRoot":"","sources":["../../src/tools/sync-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-project.js","sourceRoot":"","sources":["../../src/tools/sync-project.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -85,6 +85,7 @@ export interface KnowledgeHintsResult {
85
85
  availableCount: number;
86
86
  requestedCount: number;
87
87
  }
88
+ export type Locale = "ko" | "en";
88
89
  export interface ProjectDetail {
89
90
  id: string;
90
91
  name: string;
@@ -140,6 +141,11 @@ export interface CurriculumContext {
140
141
  techStacks: TechStackItem[];
141
142
  knowledgeHints: Record<string, ConceptHintItem[]>;
142
143
  educationalAnalysis: EducationalAnalysisData | null;
144
+ files?: Array<{
145
+ file_path: string;
146
+ content: string;
147
+ }>;
148
+ locale?: "ko" | "en";
143
149
  }
144
150
  export interface EducationalAnalysisData {
145
151
  project_overview: {