@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
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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ export interface Config {
2
+ apiKey: string;
3
+ apiUrl: string;
4
+ }
5
+ export declare function loadConfig(): Config;
6
+ //# sourceMappingURL=config.d.ts.map
@@ -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"}