@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.
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +16 -1
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +33 -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/lib/file-scanner.d.ts +13 -0
- package/dist/lib/file-scanner.d.ts.map +1 -1
- package/dist/lib/file-scanner.js +43 -1
- package/dist/lib/file-scanner.js.map +1 -1
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +13 -4
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/ask-tutor.d.ts.map +1 -1
- package/dist/tools/ask-tutor.js +17 -5
- package/dist/tools/ask-tutor.js.map +1 -1
- package/dist/tools/generate-curriculum.d.ts.map +1 -1
- package/dist/tools/generate-curriculum.js +192 -158
- 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/dist/tools/submit-analysis.d.ts.map +1 -1
- package/dist/tools/submit-analysis.js +17 -7
- package/dist/tools/submit-analysis.js.map +1 -1
- package/dist/tools/submit-curriculum.d.ts.map +1 -1
- package/dist/tools/submit-curriculum.js +66 -19
- package/dist/tools/submit-curriculum.js.map +1 -1
- package/dist/tools/submit-tech-stacks.d.ts.map +1 -1
- package/dist/tools/submit-tech-stacks.js +12 -3
- package/dist/tools/submit-tech-stacks.js.map +1 -1
- package/dist/tools/sync-project.d.ts.map +1 -1
- package/dist/tools/sync-project.js +33 -15
- package/dist/tools/sync-project.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- 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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"}
|
|
@@ -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,
|
|
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;
|
|
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,
|
|
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;
|
|
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,
|
|
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
|
-
|
|
30
|
-
output
|
|
31
|
-
|
|
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;
|
|
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,
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACjG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CAChF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAsB;IAC3E,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,8FAA8F,EAC9F,iBAAiB,EACjB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EACpE,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,iBAAiB,CAAC;YAE9D,OAAO,CAAC,KAAK,CAAC,wCAAwC,GAAG,KAAK,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,sGAAsG;yBAC7G;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBACzC,IAAI,EAAE,YAAY,IAAI,WAAW;gBACjC,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAE5C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;
|
|
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: {
|