@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.
- package/README.md +200 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +16 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +78 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +6 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +13 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/file-scanner.d.ts +10 -0
- package/dist/lib/file-scanner.d.ts.map +1 -0
- package/dist/lib/file-scanner.js +300 -0
- package/dist/lib/file-scanner.js.map +1 -0
- package/dist/tools/analyze.d.ts +8 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +57 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/ask-tutor.d.ts +9 -0
- package/dist/tools/ask-tutor.d.ts.map +1 -0
- package/dist/tools/ask-tutor.js +24 -0
- package/dist/tools/ask-tutor.js.map +1 -0
- package/dist/tools/get-learning.d.ts +8 -0
- package/dist/tools/get-learning.d.ts.map +1 -0
- package/dist/tools/get-learning.js +43 -0
- package/dist/tools/get-learning.js.map +1 -0
- package/dist/tools/log-session.d.ts +10 -0
- package/dist/tools/log-session.d.ts.map +1 -0
- package/dist/tools/log-session.js +36 -0
- package/dist/tools/log-session.js.map +1 -0
- package/dist/tools/submit-analysis.d.ts +9 -0
- package/dist/tools/submit-analysis.d.ts.map +1 -0
- package/dist/tools/submit-analysis.js +37 -0
- package/dist/tools/submit-analysis.js.map +1 -0
- package/dist/tools/sync-project.d.ts +9 -0
- package/dist/tools/sync-project.d.ts.map +1 -0
- package/dist/tools/sync-project.js +126 -0
- package/dist/tools/sync-project.js.map +1 -0
- package/dist/tools/upload-files.d.ts +9 -0
- package/dist/tools/upload-files.d.ts.map +1 -0
- package/dist/tools/upload-files.js +72 -0
- package/dist/tools/upload-files.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# @vibestack/mcp-server
|
|
2
|
+
|
|
3
|
+
VibeStack MCP Server - Sync your vibe-coded projects for tech stack analysis and learning.
|
|
4
|
+
|
|
5
|
+
## What is VibeStack?
|
|
6
|
+
|
|
7
|
+
VibeStack helps vibe coders understand and learn the tech stacks of projects they've built with AI coding tools. Connect your coding environment to VibeStack and get personalized learning paths based on your actual projects.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
### Using npx (Recommended)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @vibestack/mcp-server
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Global Install
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @vibestack/mcp-server
|
|
21
|
+
vibestack-mcp
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Configuration
|
|
25
|
+
|
|
26
|
+
### Environment Variables
|
|
27
|
+
|
|
28
|
+
| Variable | Required | Default | Description |
|
|
29
|
+
|----------|----------|---------|-------------|
|
|
30
|
+
| `VIBESTACK_API_KEY` | Yes | - | Your VibeStack API key. Get it at [vibestack.io/settings/api](https://vibestack.io/settings/api) |
|
|
31
|
+
| `VIBESTACK_API_URL` | No | `https://vibestack.io/api/v1` | API base URL (for self-hosted instances) |
|
|
32
|
+
|
|
33
|
+
### Claude Code
|
|
34
|
+
|
|
35
|
+
Add to your Claude Code MCP settings (`~/.claude/settings.json`):
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"mcpServers": {
|
|
40
|
+
"vibestack": {
|
|
41
|
+
"command": "npx",
|
|
42
|
+
"args": ["-y", "@vibestack/mcp-server"],
|
|
43
|
+
"env": {
|
|
44
|
+
"VIBESTACK_API_KEY": "your-api-key-here"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Cursor
|
|
52
|
+
|
|
53
|
+
Add to your Cursor MCP settings (`.cursor/mcp.json`):
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"mcpServers": {
|
|
58
|
+
"vibestack": {
|
|
59
|
+
"command": "npx",
|
|
60
|
+
"args": ["-y", "@vibestack/mcp-server"],
|
|
61
|
+
"env": {
|
|
62
|
+
"VIBESTACK_API_KEY": "your-api-key-here"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Windsurf
|
|
70
|
+
|
|
71
|
+
Add to your Windsurf MCP settings (`~/.windsurf/mcp.json`):
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"mcpServers": {
|
|
76
|
+
"vibestack": {
|
|
77
|
+
"command": "npx",
|
|
78
|
+
"args": ["-y", "@vibestack/mcp-server"],
|
|
79
|
+
"env": {
|
|
80
|
+
"VIBESTACK_API_KEY": "your-api-key-here"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Cline (VS Code)
|
|
88
|
+
|
|
89
|
+
Add to Cline MCP settings:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"mcpServers": {
|
|
94
|
+
"vibestack": {
|
|
95
|
+
"command": "npx",
|
|
96
|
+
"args": ["-y", "@vibestack/mcp-server"],
|
|
97
|
+
"env": {
|
|
98
|
+
"VIBESTACK_API_KEY": "your-api-key-here"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Available Tools
|
|
106
|
+
|
|
107
|
+
### vibestack_sync_project
|
|
108
|
+
|
|
109
|
+
Sync your current project's tech stack files to VibeStack.
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
Input:
|
|
113
|
+
- project_name (optional): Name for the project
|
|
114
|
+
- description (optional): Short project description
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### vibestack_upload_files
|
|
118
|
+
|
|
119
|
+
Upload specific files for detailed analysis.
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Input:
|
|
123
|
+
- project_id: Your VibeStack project ID
|
|
124
|
+
- file_paths: Array of file paths to upload
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### vibestack_analyze
|
|
128
|
+
|
|
129
|
+
Trigger AI analysis of your project's tech stack.
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
Input:
|
|
133
|
+
- project_id: Your VibeStack project ID
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### vibestack_get_learning
|
|
137
|
+
|
|
138
|
+
Get personalized learning recommendations based on detected tech stack.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Input:
|
|
142
|
+
- project_id: Your VibeStack project ID
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### vibestack_log_session
|
|
146
|
+
|
|
147
|
+
Log a coding session summary for progress tracking.
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
Input:
|
|
151
|
+
- project_id: Your VibeStack project ID
|
|
152
|
+
- summary: Summary of the coding session
|
|
153
|
+
- files_changed (optional): List of changed files
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### vibestack_ask_tutor
|
|
157
|
+
|
|
158
|
+
Ask the AI tutor questions about your project's tech stack.
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
Input:
|
|
162
|
+
- project_id: Your VibeStack project ID
|
|
163
|
+
- question: Your question about the tech stack
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Usage Example
|
|
167
|
+
|
|
168
|
+
1. **Sync your project:** Ask your AI assistant to "sync this project to VibeStack"
|
|
169
|
+
2. **Analyze the stack:** "Analyze this project's tech stack on VibeStack"
|
|
170
|
+
3. **Get learning path:** "What should I learn about this project's tech stack?"
|
|
171
|
+
4. **Ask questions:** "Ask VibeStack tutor: How does Next.js App Router work?"
|
|
172
|
+
|
|
173
|
+
## Development
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Install dependencies
|
|
177
|
+
npm install
|
|
178
|
+
|
|
179
|
+
# Run in development mode
|
|
180
|
+
VIBESTACK_API_KEY=your-key npm run dev
|
|
181
|
+
|
|
182
|
+
# Build
|
|
183
|
+
npm run build
|
|
184
|
+
|
|
185
|
+
# Test with MCP Inspector
|
|
186
|
+
npx @modelcontextprotocol/inspector node dist/index.js
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Auto-detected Files
|
|
190
|
+
|
|
191
|
+
The file scanner automatically detects:
|
|
192
|
+
|
|
193
|
+
- **Dependencies:** package.json, requirements.txt, Cargo.toml, go.mod, etc.
|
|
194
|
+
- **AI Project Files:** CLAUDE.md, .cursorrules, .windsurfrules, etc.
|
|
195
|
+
- **Config:** tsconfig.json, next.config.*, vite.config.*, Dockerfile, etc.
|
|
196
|
+
- **Documentation:** README.md (first 50 lines)
|
|
197
|
+
|
|
198
|
+
## License
|
|
199
|
+
|
|
200
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { loadConfig } from "./lib/config.js";
|
|
5
|
+
import { VibeUnivClient } from "./lib/api-client.js";
|
|
6
|
+
import { registerSyncProject } from "./tools/sync-project.js";
|
|
7
|
+
import { registerUploadFiles } from "./tools/upload-files.js";
|
|
8
|
+
import { registerAnalyze } from "./tools/analyze.js";
|
|
9
|
+
import { registerGetLearning } from "./tools/get-learning.js";
|
|
10
|
+
import { registerLogSession } from "./tools/log-session.js";
|
|
11
|
+
import { registerAskTutor } from "./tools/ask-tutor.js";
|
|
12
|
+
import { registerSubmitAnalysis } from "./tools/submit-analysis.js";
|
|
13
|
+
async function main() {
|
|
14
|
+
console.error("[vibeuniv] Starting VibeUniv MCP Server v0.1.0...");
|
|
15
|
+
const config = loadConfig();
|
|
16
|
+
const client = new VibeUnivClient(config.apiKey, config.apiUrl);
|
|
17
|
+
const server = new McpServer({
|
|
18
|
+
name: "vibeuniv-mcp-server",
|
|
19
|
+
version: "0.1.0",
|
|
20
|
+
});
|
|
21
|
+
registerSyncProject(server, client);
|
|
22
|
+
registerUploadFiles(server, client);
|
|
23
|
+
registerAnalyze(server, client);
|
|
24
|
+
registerGetLearning(server, client);
|
|
25
|
+
registerLogSession(server, client);
|
|
26
|
+
registerAskTutor(server, client);
|
|
27
|
+
registerSubmitAnalysis(server, client);
|
|
28
|
+
console.error("[vibeuniv] 7 tools registered");
|
|
29
|
+
const transport = new StdioServerTransport();
|
|
30
|
+
await server.connect(transport);
|
|
31
|
+
console.error("[vibeuniv] MCP Server running on stdio");
|
|
32
|
+
}
|
|
33
|
+
main().catch((error) => {
|
|
34
|
+
console.error("[vibeuniv] Fatal error:", error);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAE/C,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AnalysisResult, CreateProjectInput, LearningPath, Project, ProjectFile, SessionLog } from "../types.js";
|
|
2
|
+
export declare class VibeUnivClient {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
constructor(apiKey: string, baseUrl: string);
|
|
6
|
+
private request;
|
|
7
|
+
createProject(data: CreateProjectInput): Promise<Project>;
|
|
8
|
+
uploadFiles(projectId: string, files: ProjectFile[]): Promise<void>;
|
|
9
|
+
triggerAnalysis(projectId: string): Promise<AnalysisResult>;
|
|
10
|
+
private pollAnalysis;
|
|
11
|
+
getLearningPath(projectId: string): Promise<LearningPath>;
|
|
12
|
+
logSession(projectId: string, data: SessionLog): Promise<void>;
|
|
13
|
+
askTutor(projectId: string, question: string): Promise<string>;
|
|
14
|
+
submitEducationalAnalysis(projectId: string, analysisData: Record<string, unknown>): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,WAAW,EACX,UAAU,EACX,MAAM,aAAa,CAAC;AAKrB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YAK7B,OAAO;IAkCf,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YAanD,YAAY;IAwBpB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOzD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS9D,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzG"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const POLL_INTERVAL_MS = 3000;
|
|
2
|
+
const MAX_POLL_ATTEMPTS = 60;
|
|
3
|
+
export class VibeUnivClient {
|
|
4
|
+
apiKey;
|
|
5
|
+
baseUrl;
|
|
6
|
+
constructor(apiKey, baseUrl) {
|
|
7
|
+
this.apiKey = apiKey;
|
|
8
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
9
|
+
}
|
|
10
|
+
async request(method, path, body) {
|
|
11
|
+
const url = `${this.baseUrl}${path}`;
|
|
12
|
+
const headers = {
|
|
13
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
"User-Agent": "vibeuniv-mcp-server/0.1.0",
|
|
16
|
+
};
|
|
17
|
+
const response = await fetch(url, {
|
|
18
|
+
method,
|
|
19
|
+
headers,
|
|
20
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
21
|
+
});
|
|
22
|
+
const json = (await response.json());
|
|
23
|
+
if (!response.ok || !json.success) {
|
|
24
|
+
const errorMessage = json.error || `API request failed with status ${response.status}`;
|
|
25
|
+
throw new Error(errorMessage);
|
|
26
|
+
}
|
|
27
|
+
if (json.data === undefined) {
|
|
28
|
+
throw new Error("API response missing data field");
|
|
29
|
+
}
|
|
30
|
+
return json.data;
|
|
31
|
+
}
|
|
32
|
+
async createProject(data) {
|
|
33
|
+
return this.request("POST", "/projects", data);
|
|
34
|
+
}
|
|
35
|
+
async uploadFiles(projectId, files) {
|
|
36
|
+
const payload = files.map((f) => ({
|
|
37
|
+
file_name: f.name,
|
|
38
|
+
file_path: f.relativePath,
|
|
39
|
+
content: f.content,
|
|
40
|
+
content_hash: f.sha256,
|
|
41
|
+
}));
|
|
42
|
+
await this.request("POST", `/projects/${projectId}/files`, {
|
|
43
|
+
files: payload,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async triggerAnalysis(projectId) {
|
|
47
|
+
const job = await this.request("POST", `/projects/${projectId}/analyze`);
|
|
48
|
+
if (job.status === "completed") {
|
|
49
|
+
return job;
|
|
50
|
+
}
|
|
51
|
+
return this.pollAnalysis(projectId, job.id);
|
|
52
|
+
}
|
|
53
|
+
async pollAnalysis(projectId, jobId) {
|
|
54
|
+
for (let i = 0; i < MAX_POLL_ATTEMPTS; i++) {
|
|
55
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
56
|
+
const result = await this.request("GET", `/projects/${projectId}/analyze/${jobId}`);
|
|
57
|
+
if (result.status === "completed" || result.status === "failed") {
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
console.error(`[vibeuniv] Analysis in progress... (attempt ${i + 1}/${MAX_POLL_ATTEMPTS})`);
|
|
61
|
+
}
|
|
62
|
+
throw new Error("Analysis timed out. Please try again later.");
|
|
63
|
+
}
|
|
64
|
+
async getLearningPath(projectId) {
|
|
65
|
+
return this.request("GET", `/projects/${projectId}/learning`);
|
|
66
|
+
}
|
|
67
|
+
async logSession(projectId, data) {
|
|
68
|
+
await this.request("POST", `/projects/${projectId}/sessions`, data);
|
|
69
|
+
}
|
|
70
|
+
async askTutor(projectId, question) {
|
|
71
|
+
const result = await this.request("POST", `/projects/${projectId}/tutor`, { question });
|
|
72
|
+
return result.answer;
|
|
73
|
+
}
|
|
74
|
+
async submitEducationalAnalysis(projectId, analysisData) {
|
|
75
|
+
await this.request("POST", `/projects/${projectId}/educational-analysis`, { analysis_data: analysisData });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,UAAU,IAAI,MAAM,CAiBnC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const DEFAULT_API_URL = "https://vibeuniv.com/api/v1";
|
|
2
|
+
export function loadConfig() {
|
|
3
|
+
const apiKey = process.env.VIBEUNIV_API_KEY || process.env.VIBESTACK_API_KEY;
|
|
4
|
+
if (!apiKey) {
|
|
5
|
+
throw new Error("VIBEUNIV_API_KEY environment variable is required. " +
|
|
6
|
+
"Get your API key at https://vibeuniv.com/settings/api");
|
|
7
|
+
}
|
|
8
|
+
const apiUrl = process.env.VIBEUNIV_API_URL ||
|
|
9
|
+
process.env.VIBESTACK_API_URL ||
|
|
10
|
+
DEFAULT_API_URL;
|
|
11
|
+
return { apiKey, apiUrl };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAOtD,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAEhE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,qDAAqD;YACnD,uDAAuD,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC7B,eAAe,CAAC;IAElB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ProjectFile } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extract lightweight header from source code files.
|
|
4
|
+
* Returns only import/require statements, export statements,
|
|
5
|
+
* and "use client"/"use server" directives.
|
|
6
|
+
* This dramatically reduces upload size (~500 bytes vs ~50KB per file).
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractFileHeader(content: string): string;
|
|
9
|
+
export declare function scanProjectFiles(rootDir: string): Promise<ProjectFile[]>;
|
|
10
|
+
//# sourceMappingURL=file-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-scanner.d.ts","sourceRoot":"","sources":["../../src/lib/file-scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqK/C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA+EzD;AAyCD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,EAAE,CAAC,CAuExB"}
|