@doxhub/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 +231 -0
- package/dist/api-client.d.ts +27 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +75 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth/check-permissions.d.ts +16 -0
- package/dist/auth/check-permissions.d.ts.map +1 -0
- package/dist/auth/check-permissions.js +43 -0
- package/dist/auth/check-permissions.js.map +1 -0
- package/dist/auth/get-user-workspaces.d.ts +3 -0
- package/dist/auth/get-user-workspaces.d.ts.map +1 -0
- package/dist/auth/get-user-workspaces.js +16 -0
- package/dist/auth/get-user-workspaces.js.map +1 -0
- package/dist/auth/mcp-token-verify.d.ts +10 -0
- package/dist/auth/mcp-token-verify.d.ts.map +1 -0
- package/dist/auth/mcp-token-verify.js +43 -0
- package/dist/auth/mcp-token-verify.js.map +1 -0
- package/dist/auth/verify-token.d.ts +4 -0
- package/dist/auth/verify-token.d.ts.map +1 -0
- package/dist/auth/verify-token.js +61 -0
- package/dist/auth/verify-token.js.map +1 -0
- package/dist/cli/config-manager.d.ts +29 -0
- package/dist/cli/config-manager.d.ts.map +1 -0
- package/dist/cli/config-manager.js +111 -0
- package/dist/cli/config-manager.js.map +1 -0
- package/dist/cli/credentials.d.ts +64 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +117 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/profiles.d.ts +3 -0
- package/dist/cli/profiles.d.ts.map +1 -0
- package/dist/cli/profiles.js +35 -0
- package/dist/cli/profiles.js.map +1 -0
- package/dist/cli/revoke.d.ts +3 -0
- package/dist/cli/revoke.d.ts.map +1 -0
- package/dist/cli/revoke.js +60 -0
- package/dist/cli/revoke.js.map +1 -0
- package/dist/cli/setup.d.ts +11 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +296 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/status.d.ts +2 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +45 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/queries/file-queries.d.ts +15 -0
- package/dist/queries/file-queries.d.ts.map +1 -0
- package/dist/queries/file-queries.js +75 -0
- package/dist/queries/file-queries.js.map +1 -0
- package/dist/queries/search-queries.d.ts +7 -0
- package/dist/queries/search-queries.d.ts.map +1 -0
- package/dist/queries/search-queries.js +93 -0
- package/dist/queries/search-queries.js.map +1 -0
- package/dist/queries/version-queries.d.ts +26 -0
- package/dist/queries/version-queries.d.ts.map +1 -0
- package/dist/queries/version-queries.js +46 -0
- package/dist/queries/version-queries.js.map +1 -0
- package/dist/queries/workspace-queries.d.ts +10 -0
- package/dist/queries/workspace-queries.d.ts.map +1 -0
- package/dist/queries/workspace-queries.js +108 -0
- package/dist/queries/workspace-queries.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +81 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-file-versions.d.ts +30 -0
- package/dist/tools/get-file-versions.d.ts.map +1 -0
- package/dist/tools/get-file-versions.js +42 -0
- package/dist/tools/get-file-versions.js.map +1 -0
- package/dist/tools/get-file.d.ts +26 -0
- package/dist/tools/get-file.d.ts.map +1 -0
- package/dist/tools/get-file.js +51 -0
- package/dist/tools/get-file.js.map +1 -0
- package/dist/tools/get-project-structure.d.ts +26 -0
- package/dist/tools/get-project-structure.d.ts.map +1 -0
- package/dist/tools/get-project-structure.js +37 -0
- package/dist/tools/get-project-structure.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-files.d.ts +35 -0
- package/dist/tools/list-files.d.ts.map +1 -0
- package/dist/tools/list-files.js +74 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/list-projects.d.ts +19 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +74 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +17 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +45 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/search-documentation.d.ts +38 -0
- package/dist/tools/search-documentation.d.ts.map +1 -0
- package/dist/tools/search-documentation.js +53 -0
- package/dist/tools/search-documentation.js.map +1 -0
- package/dist/types.d.ts +126 -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 +57 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { getApiClient } from '../api-client.js';
|
|
2
|
+
import { listWorkspaces } from './workspace-queries.js';
|
|
3
|
+
export async function searchDocumentation(auth, options) {
|
|
4
|
+
const apiClient = getApiClient();
|
|
5
|
+
const limit = Math.min(options.limit || 10, 50);
|
|
6
|
+
const offset = options.offset || 0;
|
|
7
|
+
try {
|
|
8
|
+
let allResults = [];
|
|
9
|
+
// If workspaceId is specified, search only that workspace
|
|
10
|
+
if (options.workspaceId) {
|
|
11
|
+
const results = await apiClient.searchFiles(options.workspaceId, options.query, options.projectId);
|
|
12
|
+
allResults = results;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
// Search across all accessible workspaces
|
|
16
|
+
const { workspaces } = await listWorkspaces(auth, { includeProjects: false });
|
|
17
|
+
if (workspaces.length === 0) {
|
|
18
|
+
return { results: [], total: 0, hasMore: false };
|
|
19
|
+
}
|
|
20
|
+
// Search each workspace in parallel
|
|
21
|
+
const searchPromises = workspaces.map((workspace) => apiClient
|
|
22
|
+
.searchFiles(workspace.id, options.query, options.projectId)
|
|
23
|
+
.catch(() => []) // Return empty array if search fails for a workspace
|
|
24
|
+
);
|
|
25
|
+
const workspaceResults = await Promise.all(searchPromises);
|
|
26
|
+
allResults = workspaceResults.flat();
|
|
27
|
+
}
|
|
28
|
+
// Calculate match scores and sort results
|
|
29
|
+
const scoredResults = allResults.map((result) => {
|
|
30
|
+
const titleMatch = result.title
|
|
31
|
+
.toLowerCase()
|
|
32
|
+
.includes(options.query.toLowerCase());
|
|
33
|
+
return {
|
|
34
|
+
...result,
|
|
35
|
+
matchScore: titleMatch ? 2 : 1,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
// Sort by match score (descending) then by updatedAt (descending)
|
|
39
|
+
scoredResults.sort((a, b) => {
|
|
40
|
+
if (a.matchScore !== b.matchScore) {
|
|
41
|
+
return b.matchScore - a.matchScore;
|
|
42
|
+
}
|
|
43
|
+
return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();
|
|
44
|
+
});
|
|
45
|
+
// Apply pagination
|
|
46
|
+
const total = scoredResults.length;
|
|
47
|
+
const hasMore = total > offset + limit;
|
|
48
|
+
const paginatedResults = scoredResults.slice(offset, offset + limit);
|
|
49
|
+
// Process results with excerpts
|
|
50
|
+
const processedResults = paginatedResults.map((result) => ({
|
|
51
|
+
fileId: result.fileId || result.id,
|
|
52
|
+
title: result.title,
|
|
53
|
+
path: result.path,
|
|
54
|
+
content: extractSearchExcerpt(result.content || '', options.query, 500),
|
|
55
|
+
projectId: result.projectId,
|
|
56
|
+
projectName: result.projectName,
|
|
57
|
+
workspaceId: result.workspaceId,
|
|
58
|
+
workspaceName: result.workspaceName,
|
|
59
|
+
matchScore: result.matchScore,
|
|
60
|
+
updatedAt: result.updatedAt,
|
|
61
|
+
}));
|
|
62
|
+
return {
|
|
63
|
+
results: processedResults,
|
|
64
|
+
total,
|
|
65
|
+
hasMore,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new Error(`Failed to search documentation: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function extractSearchExcerpt(content, query, maxLength) {
|
|
73
|
+
const lowerContent = content.toLowerCase();
|
|
74
|
+
const lowerQuery = query.toLowerCase();
|
|
75
|
+
const queryIndex = lowerContent.indexOf(lowerQuery);
|
|
76
|
+
if (queryIndex === -1) {
|
|
77
|
+
// Query not found in content, return start
|
|
78
|
+
return (content.substring(0, maxLength) +
|
|
79
|
+
(content.length > maxLength ? '...' : ''));
|
|
80
|
+
}
|
|
81
|
+
// Calculate excerpt bounds with context
|
|
82
|
+
const contextBefore = 100;
|
|
83
|
+
const contextAfter = maxLength - contextBefore - query.length;
|
|
84
|
+
const start = Math.max(0, queryIndex - contextBefore);
|
|
85
|
+
const end = Math.min(content.length, queryIndex + query.length + contextAfter);
|
|
86
|
+
let excerpt = content.substring(start, end);
|
|
87
|
+
if (start > 0)
|
|
88
|
+
excerpt = '...' + excerpt;
|
|
89
|
+
if (end < content.length)
|
|
90
|
+
excerpt = excerpt + '...';
|
|
91
|
+
return excerpt;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=search-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-queries.js","sourceRoot":"","sources":["../../src/queries/search-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AuthContext } from '../types.js';
|
|
2
|
+
export declare function getFileVersions(_auth: AuthContext, fileId: string, options: {
|
|
3
|
+
limit?: number;
|
|
4
|
+
offset?: number;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
versions: {
|
|
7
|
+
id: any;
|
|
8
|
+
versionNumber: any;
|
|
9
|
+
content: any;
|
|
10
|
+
changeMessage: any;
|
|
11
|
+
createdAt: any;
|
|
12
|
+
createdBy: any;
|
|
13
|
+
}[];
|
|
14
|
+
total: number;
|
|
15
|
+
hasMore: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function getFileVersionById(_auth: AuthContext, fileId: string, versionId: string): Promise<{
|
|
18
|
+
id: any;
|
|
19
|
+
fileId: any;
|
|
20
|
+
versionNumber: any;
|
|
21
|
+
content: any;
|
|
22
|
+
changeMessage: any;
|
|
23
|
+
createdAt: any;
|
|
24
|
+
createdBy: any;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=version-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-queries.d.ts","sourceRoot":"","sources":["../../src/queries/version-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,wBAAsB,eAAe,CACnC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;GA4B7C;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM;;;;;;;;GAmBlB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getApiClient } from '../api-client.js';
|
|
2
|
+
export async function getFileVersions(_auth, fileId, options) {
|
|
3
|
+
const apiClient = getApiClient();
|
|
4
|
+
try {
|
|
5
|
+
const versions = await apiClient.getFileVersions(fileId);
|
|
6
|
+
// Apply pagination if needed
|
|
7
|
+
const limit = Math.min(options.limit || 20, 100);
|
|
8
|
+
const offset = options.offset || 0;
|
|
9
|
+
const paginatedVersions = versions.slice(offset, offset + limit);
|
|
10
|
+
const hasMore = versions.length > offset + limit;
|
|
11
|
+
return {
|
|
12
|
+
versions: paginatedVersions.map((v) => ({
|
|
13
|
+
id: v.id,
|
|
14
|
+
versionNumber: v.versionNumber,
|
|
15
|
+
content: v.content,
|
|
16
|
+
changeMessage: v.changeMessage,
|
|
17
|
+
createdAt: v.createdAt,
|
|
18
|
+
createdBy: v.createdBy,
|
|
19
|
+
})),
|
|
20
|
+
total: paginatedVersions.length,
|
|
21
|
+
hasMore,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
throw new Error(`Failed to get file versions: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function getFileVersionById(_auth, fileId, versionId) {
|
|
29
|
+
const apiClient = getApiClient();
|
|
30
|
+
try {
|
|
31
|
+
const version = await apiClient.getFileVersion(fileId, versionId);
|
|
32
|
+
return {
|
|
33
|
+
id: version.id,
|
|
34
|
+
fileId: version.fileId,
|
|
35
|
+
versionNumber: version.versionNumber,
|
|
36
|
+
content: version.content,
|
|
37
|
+
changeMessage: version.changeMessage,
|
|
38
|
+
createdAt: version.createdAt,
|
|
39
|
+
createdBy: version.createdBy,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
throw new Error(`Failed to get file version: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=version-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-queries.js","sourceRoot":"","sources":["../../src/queries/version-queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAkB,EAClB,MAAc,EACd,OAA4C;IAE5C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEzD,6BAA6B;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACnC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;QAEjD,OAAO;YACL,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,aAAa,EAAE,CAAC,CAAC,aAAa;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,KAAK,EAAE,iBAAiB,CAAC,MAAM;YAC/B,OAAO;SACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAkB,EAClB,MAAc,EACd,SAAiB;IAEjB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAElE,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuthContext, WorkspaceWithRole, ProjectStructure } from '../types.js';
|
|
2
|
+
export declare function listWorkspaces(_auth: AuthContext, options: {
|
|
3
|
+
includeProjects?: boolean;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
workspaces: WorkspaceWithRole[];
|
|
6
|
+
}>;
|
|
7
|
+
export declare function getProjectStructure(_auth: AuthContext, projectId: string, _options: {
|
|
8
|
+
includeArchived?: boolean;
|
|
9
|
+
}): Promise<ProjectStructure>;
|
|
10
|
+
//# sourceMappingURL=workspace-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-queries.d.ts","sourceRoot":"","sources":["../../src/queries/workspace-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAGrB,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAoD9C;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAmE3B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { getApiClient } from '../api-client.js';
|
|
2
|
+
export async function listWorkspaces(_auth, options) {
|
|
3
|
+
const apiClient = getApiClient();
|
|
4
|
+
// Get user's workspaces from API
|
|
5
|
+
const workspaces = await apiClient.getWorkspaces();
|
|
6
|
+
// If includeProjects is true, fetch projects for each workspace
|
|
7
|
+
if (options.includeProjects) {
|
|
8
|
+
const workspacesWithProjects = await Promise.all(workspaces.map(async (workspace) => {
|
|
9
|
+
try {
|
|
10
|
+
const projects = await apiClient.getProjects(workspace.id);
|
|
11
|
+
const projectList = projects.map((p) => ({
|
|
12
|
+
id: p.id,
|
|
13
|
+
name: p.name,
|
|
14
|
+
slug: p.slug,
|
|
15
|
+
description: p.description,
|
|
16
|
+
fileCount: p.fileCount || 0,
|
|
17
|
+
}));
|
|
18
|
+
return {
|
|
19
|
+
id: workspace.id,
|
|
20
|
+
name: workspace.name,
|
|
21
|
+
slug: workspace.slug,
|
|
22
|
+
role: workspace.role,
|
|
23
|
+
projects: projectList,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// If projects fetch fails, return workspace without projects
|
|
28
|
+
return {
|
|
29
|
+
id: workspace.id,
|
|
30
|
+
name: workspace.name,
|
|
31
|
+
slug: workspace.slug,
|
|
32
|
+
role: workspace.role,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}));
|
|
36
|
+
return { workspaces: workspacesWithProjects };
|
|
37
|
+
}
|
|
38
|
+
// Return workspaces without projects
|
|
39
|
+
const workspaceList = workspaces.map((w) => ({
|
|
40
|
+
id: w.id,
|
|
41
|
+
name: w.name,
|
|
42
|
+
slug: w.slug,
|
|
43
|
+
role: w.role,
|
|
44
|
+
}));
|
|
45
|
+
return { workspaces: workspaceList };
|
|
46
|
+
}
|
|
47
|
+
export async function getProjectStructure(_auth, projectId, _options) {
|
|
48
|
+
const apiClient = getApiClient();
|
|
49
|
+
// Get project details
|
|
50
|
+
const project = await apiClient.getProject('', projectId);
|
|
51
|
+
if (!project) {
|
|
52
|
+
throw new Error('Project not found');
|
|
53
|
+
}
|
|
54
|
+
// Get all files for the project
|
|
55
|
+
const allFiles = await apiClient.getFiles(projectId);
|
|
56
|
+
// Separate files into root files and files in folders
|
|
57
|
+
const rootFiles = allFiles
|
|
58
|
+
.filter((f) => !f.folderId)
|
|
59
|
+
.map((f) => ({
|
|
60
|
+
id: f.id,
|
|
61
|
+
title: f.title,
|
|
62
|
+
path: f.path,
|
|
63
|
+
}));
|
|
64
|
+
// Group files by folder
|
|
65
|
+
const folderMap = new Map();
|
|
66
|
+
allFiles
|
|
67
|
+
.filter((f) => f.folderId)
|
|
68
|
+
.forEach((f) => {
|
|
69
|
+
if (!folderMap.has(f.folderId)) {
|
|
70
|
+
folderMap.set(f.folderId, []);
|
|
71
|
+
}
|
|
72
|
+
folderMap.get(f.folderId).push({
|
|
73
|
+
id: f.id,
|
|
74
|
+
title: f.title,
|
|
75
|
+
path: f.path,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// Build folders structure
|
|
79
|
+
const folders = Array.from(folderMap.entries()).map(([folderId, files]) => {
|
|
80
|
+
// Get folder name from first file's folder info
|
|
81
|
+
const folderName = files[0]?.folderName || 'Unknown';
|
|
82
|
+
return {
|
|
83
|
+
id: folderId,
|
|
84
|
+
name: folderName,
|
|
85
|
+
path: folderName,
|
|
86
|
+
files,
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
project: {
|
|
91
|
+
id: project.id,
|
|
92
|
+
name: project.name,
|
|
93
|
+
slug: project.slug,
|
|
94
|
+
description: project.description,
|
|
95
|
+
workspaceId: project.workspaceId,
|
|
96
|
+
workspaceName: project.workspaceName || '',
|
|
97
|
+
},
|
|
98
|
+
structure: {
|
|
99
|
+
rootFiles,
|
|
100
|
+
folders,
|
|
101
|
+
},
|
|
102
|
+
stats: {
|
|
103
|
+
totalFiles: allFiles.length,
|
|
104
|
+
totalFolders: folders.length,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=workspace-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-queries.js","sourceRoot":"","sources":["../../src/queries/workspace-queries.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
export declare function createServer(): Server<{
|
|
3
|
+
method: string;
|
|
4
|
+
params?: import("zod").objectOutputType<{
|
|
5
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
6
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
7
|
+
}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{
|
|
8
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
9
|
+
}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{
|
|
10
|
+
progressToken: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodString, import("zod").ZodNumber]>>;
|
|
11
|
+
}, import("zod").ZodTypeAny, "passthrough">>>;
|
|
12
|
+
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
method: string;
|
|
15
|
+
params?: import("zod").objectOutputType<{
|
|
16
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
|
|
17
|
+
}, import("zod").ZodTypeAny, "passthrough"> | undefined;
|
|
18
|
+
}, import("zod").objectOutputType<{
|
|
19
|
+
_meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
|
|
20
|
+
}, import("zod").ZodTypeAny, "passthrough">>;
|
|
21
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAQnE,wBAAgB,YAAY;;;;;;;;;;;;;;;;;;6CAkF3B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { getAuthContext } from './auth/verify-token.js';
|
|
4
|
+
import * as tools from './tools/index.js';
|
|
5
|
+
export function createServer() {
|
|
6
|
+
const server = new Server({
|
|
7
|
+
name: 'doxhub-mcp-server',
|
|
8
|
+
version: '0.1.0',
|
|
9
|
+
}, {
|
|
10
|
+
capabilities: {
|
|
11
|
+
tools: {},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
// Verify authentication on startup (async)
|
|
15
|
+
(async () => {
|
|
16
|
+
try {
|
|
17
|
+
const auth = await getAuthContext();
|
|
18
|
+
console.error(`DoxHub MCP Server: Authenticated as user ${auth.userId}`);
|
|
19
|
+
if (auth.workspaceId) {
|
|
20
|
+
console.error(`DoxHub MCP Server: Default workspace: ${auth.workspaceId}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('DoxHub MCP Server: Authentication failed:', error);
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
})();
|
|
28
|
+
// Register tools/list handler
|
|
29
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
30
|
+
return {
|
|
31
|
+
tools: [
|
|
32
|
+
tools.listWorkspacesTool,
|
|
33
|
+
tools.listProjectsTool,
|
|
34
|
+
tools.listFilesTool,
|
|
35
|
+
tools.getFileTool,
|
|
36
|
+
tools.searchDocumentationTool,
|
|
37
|
+
tools.getFileVersionsTool,
|
|
38
|
+
tools.getProjectStructureTool,
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
// Register tools/call handler
|
|
43
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
44
|
+
const { name, arguments: args } = request.params;
|
|
45
|
+
try {
|
|
46
|
+
const auth = await getAuthContext();
|
|
47
|
+
switch (name) {
|
|
48
|
+
case 'list_workspaces':
|
|
49
|
+
return await tools.listWorkspaces(auth, args);
|
|
50
|
+
case 'list_projects':
|
|
51
|
+
return await tools.listProjects(auth, args || {});
|
|
52
|
+
case 'list_files':
|
|
53
|
+
return await tools.listFiles(auth, args);
|
|
54
|
+
case 'get_file':
|
|
55
|
+
return await tools.getFile(auth, args);
|
|
56
|
+
case 'search_documentation':
|
|
57
|
+
return await tools.searchDocumentation(auth, args);
|
|
58
|
+
case 'get_file_versions':
|
|
59
|
+
return await tools.getFileVersions(auth, args);
|
|
60
|
+
case 'get_project_structure':
|
|
61
|
+
return await tools.getProjectStructure(auth, args);
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(`DoxHub MCP Server: Error executing tool ${name}:`, error);
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: 'text',
|
|
72
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
return server;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AuthContext } from '../types.js';
|
|
2
|
+
export declare const getFileVersionsTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: string;
|
|
7
|
+
properties: {
|
|
8
|
+
fileId: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
limit: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
offset: {
|
|
17
|
+
type: string;
|
|
18
|
+
description: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
required: string[];
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export declare function getFileVersions(auth: AuthContext, args: any): Promise<{
|
|
25
|
+
content: {
|
|
26
|
+
type: string;
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=get-file-versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file-versions.d.ts","sourceRoot":"","sources":["../../src/tools/get-file-versions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;CAsB/B,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;;;;;GAoBjE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getFileVersions as getFileVersionsQuery } from '../queries/version-queries.js';
|
|
2
|
+
export const getFileVersionsTool = {
|
|
3
|
+
name: 'get_file_versions',
|
|
4
|
+
description: 'Get version history for a documentation file. Shows what changed and who made the changes. Use this to understand the evolution of documentation.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
fileId: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'The UUID of the file whose versions to retrieve',
|
|
11
|
+
},
|
|
12
|
+
limit: {
|
|
13
|
+
type: 'number',
|
|
14
|
+
description: 'Maximum number of versions to return (default: 10, max: 50)',
|
|
15
|
+
},
|
|
16
|
+
offset: {
|
|
17
|
+
type: 'number',
|
|
18
|
+
description: 'Number of versions to skip for pagination (default: 0)',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ['fileId'],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export async function getFileVersions(auth, args) {
|
|
25
|
+
const { fileId, limit, offset } = args;
|
|
26
|
+
if (!fileId || typeof fileId !== 'string') {
|
|
27
|
+
throw new Error('fileId parameter is required and must be a string');
|
|
28
|
+
}
|
|
29
|
+
const results = await getFileVersionsQuery(auth, fileId, {
|
|
30
|
+
limit,
|
|
31
|
+
offset,
|
|
32
|
+
});
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: JSON.stringify(results, null, 2),
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=get-file-versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file-versions.js","sourceRoot":"","sources":["../../src/tools/get-file-versions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAExF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,mJAAmJ;IACrJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iDAAiD;aAC/D;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6DAA6D;aAC3E;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wDAAwD;aACtE;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAiB,EAAE,IAAS;IAChE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE;QACvD,KAAK;QACL,MAAM;KACP,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AuthContext } from '../types.js';
|
|
2
|
+
export declare const getFileTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: string;
|
|
7
|
+
properties: {
|
|
8
|
+
fileId: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
includeMetadata: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
required: string[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare function getFile(auth: AuthContext, args: any): Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=get-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file.d.ts","sourceRoot":"","sources":["../../src/tools/get-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;CAkBvB,CAAC;AAEF,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;;;;;GAsCzD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { getFileById as getFileQuery } from '../queries/file-queries.js';
|
|
2
|
+
export const getFileTool = {
|
|
3
|
+
name: 'get_file',
|
|
4
|
+
description: 'Get the complete content and metadata of a specific documentation file by its ID. Requires read access to the file\'s workspace.',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
fileId: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
description: 'The UUID of the file to retrieve',
|
|
11
|
+
},
|
|
12
|
+
includeMetadata: {
|
|
13
|
+
type: 'boolean',
|
|
14
|
+
description: 'Include file metadata (default: true)',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ['fileId'],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export async function getFile(auth, args) {
|
|
21
|
+
const { fileId, includeMetadata = true } = args;
|
|
22
|
+
if (!fileId || typeof fileId !== 'string') {
|
|
23
|
+
throw new Error('fileId parameter is required and must be a string');
|
|
24
|
+
}
|
|
25
|
+
const file = await getFileQuery(auth, fileId);
|
|
26
|
+
// If user doesn't want metadata, return only essential fields
|
|
27
|
+
if (!includeMetadata) {
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: 'text',
|
|
32
|
+
text: JSON.stringify({
|
|
33
|
+
id: file.id,
|
|
34
|
+
title: file.title,
|
|
35
|
+
path: file.path,
|
|
36
|
+
content: file.content,
|
|
37
|
+
}, null, 2),
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{
|
|
45
|
+
type: 'text',
|
|
46
|
+
text: JSON.stringify(file, null, 2),
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=get-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file.js","sourceRoot":"","sources":["../../src/tools/get-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,kIAAkI;IACpI,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;YACD,eAAe,EAAE;gBACf,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,uCAAuC;aACrD;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB,EAAE,IAAS;IACxD,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAEhD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE9C,8DAA8D;IAC9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AuthContext } from '../types.js';
|
|
2
|
+
export declare const getProjectStructureTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: string;
|
|
7
|
+
properties: {
|
|
8
|
+
projectId: {
|
|
9
|
+
type: string;
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
includeArchived: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
required: string[];
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export declare function getProjectStructure(auth: AuthContext, args: any): Promise<{
|
|
21
|
+
content: {
|
|
22
|
+
type: string;
|
|
23
|
+
text: string;
|
|
24
|
+
}[];
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=get-project-structure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-project-structure.d.ts","sourceRoot":"","sources":["../../src/tools/get-project-structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;CAkBnC,CAAC;AAEF,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;;;;;GAmBrE"}
|