@vibeuniv/mcp-server 0.1.0

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 (50) hide show
  1. package/README.md +200 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +37 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/api-client.d.ts +16 -0
  7. package/dist/lib/api-client.d.ts.map +1 -0
  8. package/dist/lib/api-client.js +78 -0
  9. package/dist/lib/api-client.js.map +1 -0
  10. package/dist/lib/config.d.ts +6 -0
  11. package/dist/lib/config.d.ts.map +1 -0
  12. package/dist/lib/config.js +13 -0
  13. package/dist/lib/config.js.map +1 -0
  14. package/dist/lib/file-scanner.d.ts +10 -0
  15. package/dist/lib/file-scanner.d.ts.map +1 -0
  16. package/dist/lib/file-scanner.js +300 -0
  17. package/dist/lib/file-scanner.js.map +1 -0
  18. package/dist/tools/analyze.d.ts +8 -0
  19. package/dist/tools/analyze.d.ts.map +1 -0
  20. package/dist/tools/analyze.js +57 -0
  21. package/dist/tools/analyze.js.map +1 -0
  22. package/dist/tools/ask-tutor.d.ts +9 -0
  23. package/dist/tools/ask-tutor.d.ts.map +1 -0
  24. package/dist/tools/ask-tutor.js +24 -0
  25. package/dist/tools/ask-tutor.js.map +1 -0
  26. package/dist/tools/get-learning.d.ts +8 -0
  27. package/dist/tools/get-learning.d.ts.map +1 -0
  28. package/dist/tools/get-learning.js +43 -0
  29. package/dist/tools/get-learning.js.map +1 -0
  30. package/dist/tools/log-session.d.ts +10 -0
  31. package/dist/tools/log-session.d.ts.map +1 -0
  32. package/dist/tools/log-session.js +36 -0
  33. package/dist/tools/log-session.js.map +1 -0
  34. package/dist/tools/submit-analysis.d.ts +9 -0
  35. package/dist/tools/submit-analysis.d.ts.map +1 -0
  36. package/dist/tools/submit-analysis.js +37 -0
  37. package/dist/tools/submit-analysis.js.map +1 -0
  38. package/dist/tools/sync-project.d.ts +9 -0
  39. package/dist/tools/sync-project.d.ts.map +1 -0
  40. package/dist/tools/sync-project.js +126 -0
  41. package/dist/tools/sync-project.js.map +1 -0
  42. package/dist/tools/upload-files.d.ts +9 -0
  43. package/dist/tools/upload-files.d.ts.map +1 -0
  44. package/dist/tools/upload-files.js +72 -0
  45. package/dist/tools/upload-files.js.map +1 -0
  46. package/dist/types.d.ts +55 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +40 -0
@@ -0,0 +1,300 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ import { glob } from "glob";
5
+ const MAX_FILE_SIZE = 50 * 1024; // 50KB
6
+ const MAX_SOURCE_FILES = 50; // 소스 코드 파일 최대 수
7
+ const README_MAX_LINES = 50;
8
+ // Source code extensions that only need import/export headers (not full content)
9
+ const SOURCE_CODE_EXTENSIONS = new Set([
10
+ ".ts",
11
+ ".tsx",
12
+ ".js",
13
+ ".jsx",
14
+ ".py",
15
+ ".rs",
16
+ ".go",
17
+ ]);
18
+ // ─── Root-level config/dependency files (exact match) ───────────────
19
+ const DEPENDENCY_FILES = [
20
+ "package.json",
21
+ "requirements.txt",
22
+ "Pipfile",
23
+ "pyproject.toml",
24
+ "build.gradle",
25
+ "build.gradle.kts",
26
+ "pom.xml",
27
+ "Cargo.toml",
28
+ "go.mod",
29
+ "Gemfile",
30
+ "composer.json",
31
+ ];
32
+ const AI_PROJECT_FILES = [
33
+ "CLAUDE.md",
34
+ ".cursorrules",
35
+ ".windsurfrules",
36
+ "CONVENTIONS.md",
37
+ ];
38
+ const CONFIG_FILES = [
39
+ "tsconfig.json",
40
+ "next.config.js",
41
+ "next.config.ts",
42
+ "next.config.mjs",
43
+ "vite.config.ts",
44
+ "nuxt.config.ts",
45
+ "angular.json",
46
+ "docker-compose.yml",
47
+ "docker-compose.yaml",
48
+ "Dockerfile",
49
+ ".env.example",
50
+ "vercel.json",
51
+ "netlify.toml",
52
+ ];
53
+ const ROOT_FILES = [
54
+ ...DEPENDENCY_FILES,
55
+ ...AI_PROJECT_FILES,
56
+ ...CONFIG_FILES,
57
+ "README.md",
58
+ ];
59
+ // ─── Source code glob patterns ──────────────────────────────────────
60
+ const SOURCE_PATTERNS = [
61
+ "app/**/*.{ts,tsx}",
62
+ "src/**/*.{ts,tsx,js,jsx}",
63
+ "pages/**/*.{ts,tsx,js,jsx}",
64
+ "components/**/*.{ts,tsx,js,jsx}",
65
+ "lib/**/*.{ts,tsx,js,jsx}",
66
+ "server/**/*.{ts,tsx,js,jsx}",
67
+ "api/**/*.{ts,tsx,js,jsx}",
68
+ "routes/**/*.{ts,tsx,js,jsx}",
69
+ "middleware.{ts,js}",
70
+ // Python
71
+ "**/*.py",
72
+ // Rust
73
+ "src/**/*.rs",
74
+ // Go
75
+ "**/*.go",
76
+ ];
77
+ // ─── Ignore patterns ────────────────────────────────────────────────
78
+ // ─── Teaching-critical file patterns ─────────────────────────────────
79
+ // These files contain core logic essential for personalized education.
80
+ // They skip header extraction and retain full content so the AI tutor
81
+ // can reference the student's actual code (e.g. "In your middleware.ts…").
82
+ const TEACHING_CRITICAL_PATTERNS = [
83
+ "app/**/page.tsx",
84
+ "app/**/page.ts",
85
+ "app/**/layout.tsx",
86
+ "app/**/layout.ts",
87
+ "app/api/**/*.ts",
88
+ "middleware.ts",
89
+ "middleware.js",
90
+ "lib/**/*.ts",
91
+ "server/**/*.ts",
92
+ "types/**/*.ts",
93
+ ];
94
+ function isTeachingCriticalFile(relativePath) {
95
+ return TEACHING_CRITICAL_PATTERNS.some((pattern) => {
96
+ // Convert glob pattern to regex using placeholders to avoid
97
+ // conflicting replacements between glob wildcards and regex syntax.
98
+ const regexStr = pattern
99
+ .replace(/\*\*/g, "GLOB_DSTAR")
100
+ .replace(/\*/g, "GLOB_STAR")
101
+ .replace(/\./g, "\\.")
102
+ .replace(/GLOB_DSTAR\//g, "(?:[^/]+/)*")
103
+ .replace(/\/GLOB_DSTAR/g, "(?:/[^/]+)*")
104
+ .replace(/GLOB_DSTAR/g, ".*")
105
+ .replace(/GLOB_STAR/g, "[^/]*");
106
+ return new RegExp(`^${regexStr}$`).test(relativePath);
107
+ });
108
+ }
109
+ // ─── Ignore patterns ────────────────────────────────────────────────
110
+ // Base ignore patterns applied to all file collection (build artifacts, tests, etc.)
111
+ const BASE_IGNORE_PATTERNS = [
112
+ "node_modules/**",
113
+ ".next/**",
114
+ "dist/**",
115
+ "build/**",
116
+ ".git/**",
117
+ "coverage/**",
118
+ "*.test.*",
119
+ "*.spec.*",
120
+ "__tests__/**",
121
+ "**/*.d.ts",
122
+ "packages/mcp-server/dist/**",
123
+ ];
124
+ // Sensitive file patterns — applied only to source code glob, not to
125
+ // ROOT_FILES (which are explicit safe filenames like .env.example).
126
+ const SENSITIVE_PATTERNS = [
127
+ ".env",
128
+ ".env.*",
129
+ "**/.env",
130
+ "**/.env.*",
131
+ "**/credentials.json",
132
+ "**/service-account*.json",
133
+ "**/*.pem",
134
+ "**/*.key",
135
+ "**/id_rsa*",
136
+ "**/id_ed25519*",
137
+ "**/*.p12",
138
+ "**/*.pfx",
139
+ "**/*.jks",
140
+ "**/secrets.*",
141
+ "**/vault.*",
142
+ "**/.npmrc",
143
+ "**/.pypirc",
144
+ ];
145
+ // Full ignore list for source code collection (base + sensitive)
146
+ const IGNORE_PATTERNS = [...BASE_IGNORE_PATTERNS, ...SENSITIVE_PATTERNS];
147
+ function computeSha256(content) {
148
+ return createHash("sha256").update(content, "utf-8").digest("hex");
149
+ }
150
+ /**
151
+ * Extract lightweight header from source code files.
152
+ * Returns only import/require statements, export statements,
153
+ * and "use client"/"use server" directives.
154
+ * This dramatically reduces upload size (~500 bytes vs ~50KB per file).
155
+ */
156
+ export function extractFileHeader(content) {
157
+ const lines = content.split("\n");
158
+ const extracted = [];
159
+ for (const line of lines) {
160
+ const trimmed = line.trim();
161
+ // Skip empty lines and comments (but keep them if part of a block we're extracting)
162
+ if (trimmed === "")
163
+ continue;
164
+ // ─── JS/TS directives ──────────────────────────────────────
165
+ if (trimmed === '"use client";' || trimmed === "'use client';") {
166
+ extracted.push(line);
167
+ continue;
168
+ }
169
+ if (trimmed === '"use server";' || trimmed === "'use server';") {
170
+ extracted.push(line);
171
+ continue;
172
+ }
173
+ // ─── JS/TS import / require ────────────────────────────────
174
+ if (trimmed.startsWith("import ") ||
175
+ trimmed.startsWith("import{") ||
176
+ trimmed === "import(" ||
177
+ trimmed.startsWith("require(") ||
178
+ /^(const|let|var)\s+.+=\s*require\(/.test(trimmed)) {
179
+ extracted.push(line);
180
+ continue;
181
+ }
182
+ // ─── JS/TS export ──────────────────────────────────────────
183
+ if (trimmed.startsWith("export ") ||
184
+ trimmed.startsWith("export{") ||
185
+ trimmed === "export default" ||
186
+ trimmed.startsWith("export default ")) {
187
+ // For multi-line exports like `export function foo(`, just keep the declaration line
188
+ extracted.push(line);
189
+ continue;
190
+ }
191
+ // ─── Python import ─────────────────────────────────────────
192
+ if (trimmed.startsWith("from ") && trimmed.includes(" import ")) {
193
+ extracted.push(line);
194
+ continue;
195
+ }
196
+ if (trimmed.startsWith("import ") && !trimmed.startsWith("import {")) {
197
+ // Python-style import (already caught by JS import above for JS files,
198
+ // but that's fine — duplicates won't happen since a line matches once)
199
+ extracted.push(line);
200
+ continue;
201
+ }
202
+ // ─── Rust use / pub declarations ───────────────────────────
203
+ if (trimmed.startsWith("use ") || trimmed.startsWith("use::")) {
204
+ extracted.push(line);
205
+ continue;
206
+ }
207
+ if (/^pub\s+(fn|struct|enum|mod|type|trait|const|static)\s/.test(trimmed) ||
208
+ /^pub\s*\(\s*(crate|super)\s*\)\s+(fn|struct|enum|mod|type|trait)\s/.test(trimmed)) {
209
+ extracted.push(line);
210
+ continue;
211
+ }
212
+ // ─── Go package / import ───────────────────────────────────
213
+ if (trimmed.startsWith("package ")) {
214
+ extracted.push(line);
215
+ continue;
216
+ }
217
+ }
218
+ return extracted.join("\n");
219
+ }
220
+ function isSourceCodeFile(relativePath) {
221
+ const lastDot = relativePath.lastIndexOf(".");
222
+ if (lastDot === -1)
223
+ return false;
224
+ return SOURCE_CODE_EXTENSIONS.has(relativePath.slice(lastDot));
225
+ }
226
+ async function readFileContent(filePath, fileName) {
227
+ const buffer = await readFile(filePath, "utf-8");
228
+ if (fileName === "README.md") {
229
+ const lines = buffer.split("\n");
230
+ return lines.slice(0, README_MAX_LINES).join("\n");
231
+ }
232
+ if (Buffer.byteLength(buffer, "utf-8") > MAX_FILE_SIZE) {
233
+ return buffer.slice(0, MAX_FILE_SIZE);
234
+ }
235
+ return buffer;
236
+ }
237
+ async function collectFiles(rootDir, patterns, ignore) {
238
+ const matches = await glob(patterns, {
239
+ cwd: rootDir,
240
+ nodir: true,
241
+ dot: true,
242
+ absolute: false,
243
+ ignore,
244
+ });
245
+ return [...new Set(matches)];
246
+ }
247
+ export async function scanProjectFiles(rootDir) {
248
+ const foundFiles = [];
249
+ // 1) Collect root-level config/dependency files
250
+ // Use BASE_IGNORE_PATTERNS only (not SENSITIVE_PATTERNS) because ROOT_FILES
251
+ // are explicit safe filenames like .env.example that we intentionally collect.
252
+ const rootMatches = await collectFiles(rootDir, ROOT_FILES, BASE_IGNORE_PATTERNS);
253
+ const configFileSet = new Set(rootMatches);
254
+ // 2) Collect source code files
255
+ const sourceMatches = await collectFiles(rootDir, SOURCE_PATTERNS, IGNORE_PATTERNS);
256
+ // Prioritize: shorter paths first (entry points), then alphabetically
257
+ sourceMatches.sort((a, b) => {
258
+ const depthA = a.split("/").length;
259
+ const depthB = b.split("/").length;
260
+ if (depthA !== depthB)
261
+ return depthA - depthB;
262
+ return a.localeCompare(b);
263
+ });
264
+ // Limit source files to avoid huge uploads
265
+ const limitedSource = sourceMatches.slice(0, MAX_SOURCE_FILES);
266
+ const allPaths = [...new Set([...rootMatches, ...limitedSource])];
267
+ for (const relativePath of allPaths) {
268
+ const absolutePath = join(rootDir, relativePath);
269
+ try {
270
+ const fileStat = await stat(absolutePath);
271
+ if (!fileStat.isFile()) {
272
+ continue;
273
+ }
274
+ let content = await readFileContent(absolutePath, relativePath);
275
+ // For source code files (not config/dependency files), extract only
276
+ // import/export headers to reduce upload size (~500 bytes vs ~50KB).
277
+ // Exception: teaching-critical files retain full content so the AI
278
+ // tutor can reference the student's actual code during lessons.
279
+ const isConfig = configFileSet.has(relativePath);
280
+ const isTeachingCritical = isTeachingCriticalFile(relativePath);
281
+ if (!isConfig && !isTeachingCritical && isSourceCodeFile(relativePath)) {
282
+ content = extractFileHeader(content);
283
+ }
284
+ const sha256 = computeSha256(content);
285
+ foundFiles.push({
286
+ name: relativePath.split("/").pop() || relativePath,
287
+ relativePath,
288
+ size: fileStat.size,
289
+ content,
290
+ sha256,
291
+ });
292
+ }
293
+ catch {
294
+ console.error(`[vibeuniv] Warning: Could not read file ${relativePath}`);
295
+ }
296
+ }
297
+ console.error(`[vibeuniv] Scanned ${foundFiles.length} files (${rootMatches.length} config + ${limitedSource.length} source) in ${rootDir}`);
298
+ return foundFiles;
299
+ }
300
+ //# sourceMappingURL=file-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/lib/file-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const analyzeSchema: {
5
+ project_id: z.ZodString;
6
+ };
7
+ export declare function registerAnalyze(server: McpServer, client: VibeUnivClient): void;
8
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/tools/analyze.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,aAAa;;CAEzB,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgE/E"}
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ export const analyzeSchema = {
3
+ project_id: z.string().describe("The VibeUniv project ID to analyze"),
4
+ };
5
+ export function registerAnalyze(server, client) {
6
+ server.tool("vibeuniv_analyze", "Trigger AI analysis of the project's tech stack and get results", analyzeSchema, { readOnlyHint: true, openWorldHint: true }, async ({ project_id }) => {
7
+ try {
8
+ console.error(`[vibeuniv] Triggering analysis for project ${project_id}...`);
9
+ const result = await client.triggerAnalysis(project_id);
10
+ if (result.status === "failed") {
11
+ return {
12
+ content: [
13
+ {
14
+ type: "text",
15
+ text: "Analysis failed. Please try again or check that files have been uploaded.",
16
+ },
17
+ ],
18
+ isError: true,
19
+ };
20
+ }
21
+ let output = `Analysis completed for project ${project_id}\n`;
22
+ output += `Analysis ID: ${result.id}\n\n`;
23
+ if (result.summary) {
24
+ output += `Summary:\n${result.summary}\n\n`;
25
+ }
26
+ if (result.techStack && result.techStack.length > 0) {
27
+ output += "Detected Tech Stack:\n";
28
+ const grouped = new Map();
29
+ for (const item of result.techStack) {
30
+ const existing = grouped.get(item.category) || [];
31
+ existing.push(item);
32
+ grouped.set(item.category, existing);
33
+ }
34
+ for (const [category, items] of grouped) {
35
+ output += `\n [${category}]\n`;
36
+ for (const item of items) {
37
+ const version = item.version ? ` v${item.version}` : "";
38
+ const confidence = Math.round(item.confidence * 100);
39
+ output += ` - ${item.name}${version} (${confidence}% confidence)\n`;
40
+ }
41
+ }
42
+ output += "\nNext step: Use vibeuniv_get_learning to get personalized learning recommendations.";
43
+ }
44
+ return {
45
+ content: [{ type: "text", text: output }],
46
+ };
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : String(error);
50
+ return {
51
+ content: [{ type: "text", text: `Failed to analyze project: ${message}` }],
52
+ isError: true,
53
+ };
54
+ }
55
+ });
56
+ }
57
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const askTutorSchema: {
5
+ project_id: z.ZodString;
6
+ question: z.ZodString;
7
+ };
8
+ export declare function registerAskTutor(server: McpServer, client: VibeUnivClient): void;
9
+ //# sourceMappingURL=ask-tutor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-tutor.d.ts","sourceRoot":"","sources":["../../src/tools/ask-tutor.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,cAAc;;;CAG1B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAuBhF"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export const askTutorSchema = {
3
+ project_id: z.string().describe("The VibeUniv project ID"),
4
+ question: z.string().describe("Question to ask the AI tutor about your project's tech stack"),
5
+ };
6
+ export function registerAskTutor(server, client) {
7
+ server.tool("vibeuniv_ask_tutor", "Ask the AI tutor a question about your project's tech stack with full project context", askTutorSchema, { readOnlyHint: true, openWorldHint: true }, async ({ project_id, question }) => {
8
+ try {
9
+ console.error(`[vibeuniv] Asking tutor for project ${project_id}...`);
10
+ const answer = await client.askTutor(project_id, question);
11
+ return {
12
+ content: [{ type: "text", text: answer }],
13
+ };
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : String(error);
17
+ return {
18
+ content: [{ type: "text", text: `Failed to get tutor response: ${message}` }],
19
+ isError: true,
20
+ };
21
+ }
22
+ });
23
+ }
24
+ //# sourceMappingURL=ask-tutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-tutor.js","sourceRoot":"","sources":["../../src/tools/ask-tutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;CAC9F,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAsB;IACxE,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,uFAAuF,EACvF,cAAc,EACd,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,uCAAuC,UAAU,KAAK,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAE3D,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,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iCAAiC,OAAO,EAAE,EAAE,CAAC;gBACtF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const getLearningSchema: {
5
+ project_id: z.ZodString;
6
+ };
7
+ export declare function registerGetLearning(server: McpServer, client: VibeUnivClient): void;
8
+ //# sourceMappingURL=get-learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-learning.d.ts","sourceRoot":"","sources":["../../src/tools/get-learning.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,iBAAiB;;CAE7B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA8CnF"}
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ export const getLearningSchema = {
3
+ project_id: z.string().describe("The VibeUniv project ID"),
4
+ };
5
+ export function registerGetLearning(server, client) {
6
+ server.tool("vibeuniv_get_learning", "Get personalized learning recommendations based on the project's tech stack", getLearningSchema, { readOnlyHint: true, openWorldHint: true }, async ({ project_id }) => {
7
+ try {
8
+ console.error(`[vibeuniv] Fetching learning path for project ${project_id}...`);
9
+ const learningPath = await client.getLearningPath(project_id);
10
+ let output = `Learning Path for Project ${project_id}\n`;
11
+ output += `Learning Path ID: ${learningPath.id}\n`;
12
+ output += `Created: ${learningPath.createdAt}\n\n`;
13
+ if (learningPath.modules.length === 0) {
14
+ output +=
15
+ "No learning modules available yet. Run vibeuniv_analyze first to generate recommendations.";
16
+ }
17
+ else {
18
+ output += `${learningPath.modules.length} Learning Module(s):\n`;
19
+ for (const mod of learningPath.modules) {
20
+ output += `\n ${mod.order}. ${mod.title}\n`;
21
+ output += ` ${mod.description}\n`;
22
+ if (mod.topics.length > 0) {
23
+ output += ` Topics: ${mod.topics.join(", ")}\n`;
24
+ }
25
+ }
26
+ output += "\nUse vibeuniv_ask_tutor to ask questions about any of these topics.";
27
+ }
28
+ return {
29
+ content: [{ type: "text", text: output }],
30
+ };
31
+ }
32
+ catch (error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ return {
35
+ content: [
36
+ { type: "text", text: `Failed to get learning path: ${message}` },
37
+ ],
38
+ isError: true,
39
+ };
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=get-learning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-learning.js","sourceRoot":"","sources":["../../src/tools/get-learning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC3D,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAsB;IAC3E,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,6EAA6E,EAC7E,iBAAiB,EACjB,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,iDAAiD,UAAU,KAAK,CAAC,CAAC;YAChF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAE9D,IAAI,MAAM,GAAG,6BAA6B,UAAU,IAAI,CAAC;YACzD,MAAM,IAAI,qBAAqB,YAAY,CAAC,EAAE,IAAI,CAAC;YACnD,MAAM,IAAI,YAAY,YAAY,CAAC,SAAS,MAAM,CAAC;YAEnD,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM;oBACJ,4FAA4F,CAAC;YACjG,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,wBAAwB,CAAC;gBAEjE,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBACvC,MAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC;oBAC7C,MAAM,IAAI,QAAQ,GAAG,CAAC,WAAW,IAAI,CAAC;oBACtC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC1B,MAAM,IAAI,gBAAgB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBACtD,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,sEAAsE,CAAC;YACnF,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,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gCAAgC,OAAO,EAAE,EAAE;iBAC3E;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const logSessionSchema: {
5
+ project_id: z.ZodString;
6
+ summary: z.ZodString;
7
+ files_changed: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
8
+ };
9
+ export declare function registerLogSession(server: McpServer, client: VibeUnivClient): void;
10
+ //# sourceMappingURL=log-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-session.d.ts","sourceRoot":"","sources":["../../src/tools/log-session.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,gBAAgB;;;;CAO5B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAiClF"}
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ export const logSessionSchema = {
3
+ project_id: z.string().describe("The VibeUniv project ID"),
4
+ summary: z.string().describe("Summary of today's coding session"),
5
+ files_changed: z
6
+ .array(z.string())
7
+ .optional()
8
+ .describe("List of files changed during the session"),
9
+ };
10
+ export function registerLogSession(server, client) {
11
+ server.tool("vibeuniv_log_session", "Log today's coding session summary to VibeUniv", logSessionSchema, { readOnlyHint: false, destructiveHint: false, openWorldHint: true }, async ({ project_id, summary, files_changed }) => {
12
+ try {
13
+ await client.logSession(project_id, {
14
+ summary,
15
+ filesChanged: files_changed,
16
+ });
17
+ let output = "Session logged successfully!\n\n";
18
+ output += `Summary: ${summary}\n`;
19
+ if (files_changed && files_changed.length > 0) {
20
+ output += `\nFiles changed (${files_changed.length}):\n`;
21
+ output += files_changed.map((f) => ` - ${f}`).join("\n");
22
+ }
23
+ return {
24
+ content: [{ type: "text", text: output }],
25
+ };
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ return {
30
+ content: [{ type: "text", text: `Failed to log session: ${message}` }],
31
+ isError: true,
32
+ };
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=log-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-session.js","sourceRoot":"","sources":["../../src/tools/log-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACjE,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAsB;IAC1E,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,gDAAgD,EAChD,gBAAgB,EAChB,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,EACpE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE;gBAClC,OAAO;gBACP,YAAY,EAAE,aAAa;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,kCAAkC,CAAC;YAChD,MAAM,IAAI,YAAY,OAAO,IAAI,CAAC;YAElC,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,oBAAoB,aAAa,CAAC,MAAM,MAAM,CAAC;gBACzD,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,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,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,0BAA0B,OAAO,EAAE,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const submitAnalysisSchema: {
5
+ project_id: z.ZodString;
6
+ analysis: z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
7
+ };
8
+ export declare function registerSubmitAnalysis(server: McpServer, client: VibeUnivClient): void;
9
+ //# sourceMappingURL=submit-analysis.d.ts.map
@@ -0,0 +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,CAiCtF"}
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+ export const submitAnalysisSchema = {
3
+ project_id: z.string().describe("The VibeUniv project ID"),
4
+ analysis: z
5
+ .object({})
6
+ .passthrough()
7
+ .describe("Educational analysis JSON containing project_overview, user_flows, file_analysis, architecture, code_quality, learning_priorities, and repeated_patterns"),
8
+ };
9
+ export function registerSubmitAnalysis(server, client) {
10
+ server.tool("vibeuniv_submit_analysis", "Submit educational analysis of the project for personalized learning curriculum generation", submitAnalysisSchema, { readOnlyHint: false, openWorldHint: true }, async ({ project_id, analysis }) => {
11
+ try {
12
+ console.error(`[vibeuniv] Submitting educational analysis for project ${project_id}...`);
13
+ await client.submitEducationalAnalysis(project_id, analysis);
14
+ return {
15
+ content: [
16
+ {
17
+ type: "text",
18
+ text: `Educational analysis submitted successfully for project ${project_id}. This data will be used to generate a more personalized learning curriculum.`,
19
+ },
20
+ ],
21
+ };
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : String(error);
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: `Failed to submit educational analysis: ${message}`,
30
+ },
31
+ ],
32
+ isError: true,
33
+ };
34
+ }
35
+ });
36
+ }
37
+ //# sourceMappingURL=submit-analysis.js.map
@@ -0,0 +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,2DAA2D,UAAU,+EAA+E;qBAC3J;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"}
@@ -0,0 +1,9 @@
1
+ import { z } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { VibeUnivClient } from "../lib/api-client.js";
4
+ export declare const syncProjectSchema: {
5
+ project_name: z.ZodOptional<z.ZodString>;
6
+ description: z.ZodOptional<z.ZodString>;
7
+ };
8
+ export declare function registerSyncProject(server: McpServer, client: VibeUnivClient): void;
9
+ //# sourceMappingURL=sync-project.d.ts.map
@@ -0,0 +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,CAiInF"}