@doxhub/mcp-server 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/create-file.d.ts +8 -0
- package/dist/cli/create-file.d.ts.map +1 -0
- package/dist/cli/create-file.js +44 -0
- package/dist/cli/create-file.js.map +1 -0
- package/dist/cli/delete-file.d.ts +4 -0
- package/dist/cli/delete-file.d.ts.map +1 -0
- package/dist/cli/delete-file.js +62 -0
- package/dist/cli/delete-file.js.map +1 -0
- package/dist/cli/get-file.d.ts +5 -0
- package/dist/cli/get-file.d.ts.map +1 -0
- package/dist/cli/get-file.js +61 -0
- package/dist/cli/get-file.js.map +1 -0
- package/dist/cli/list-files.d.ts +2 -0
- package/dist/cli/list-files.d.ts.map +1 -0
- package/dist/cli/list-files.js +46 -0
- package/dist/cli/list-files.js.map +1 -0
- package/dist/cli/list-projects.d.ts +2 -0
- package/dist/cli/list-projects.d.ts.map +1 -0
- package/dist/cli/list-projects.js +52 -0
- package/dist/cli/list-projects.js.map +1 -0
- package/dist/cli/list-workspaces.d.ts +2 -0
- package/dist/cli/list-workspaces.d.ts.map +1 -0
- package/dist/cli/list-workspaces.js +41 -0
- package/dist/cli/list-workspaces.js.map +1 -0
- package/dist/cli/search.d.ts +5 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +59 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli/update-file.d.ts +9 -0
- package/dist/cli/update-file.d.ts.map +1 -0
- package/dist/cli/update-file.js +59 -0
- package/dist/cli/update-file.js.map +1 -0
- package/dist/index.js +156 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-file.d.ts","sourceRoot":"","sources":["../../src/cli/create-file.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ChB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function createFileCommand(options) {
|
|
5
|
+
try {
|
|
6
|
+
const { projectId, title, path, content, folderId } = options;
|
|
7
|
+
if (!projectId || !title || !path) {
|
|
8
|
+
console.error('❌ Required parameters missing\n');
|
|
9
|
+
console.error('Usage: npx @doxhub/mcp-server create-file --project <id> --title <title> --path <path> [--content <content>] [--folder <id>]\n');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const profile = getCurrentProfile();
|
|
13
|
+
if (!profile) {
|
|
14
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
initializeApiClient({
|
|
18
|
+
baseUrl: profile.apiUrl,
|
|
19
|
+
accessToken: profile.accessToken,
|
|
20
|
+
});
|
|
21
|
+
const auth = await getAuthContext();
|
|
22
|
+
if (!auth) {
|
|
23
|
+
console.error('❌ Authentication failed\n');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const apiClient = getApiClient();
|
|
27
|
+
const file = await apiClient.createFile(projectId, {
|
|
28
|
+
title,
|
|
29
|
+
path,
|
|
30
|
+
content: content || '',
|
|
31
|
+
folderId: folderId || null,
|
|
32
|
+
});
|
|
33
|
+
console.log('\n✅ File created successfully!\n');
|
|
34
|
+
console.log(` Title: ${file.title}`);
|
|
35
|
+
console.log(` ID: ${file.id}`);
|
|
36
|
+
console.log(` Path: ${file.path}`);
|
|
37
|
+
console.log(` Version: ${file.currentVersion}\n`);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=create-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-file.js","sourceRoot":"","sources":["../../src/cli/create-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAMvC;IACC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAE9D,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,gIAAgI,CAAC,CAAC;YAChJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,SAAS,EAAE;YACjD,KAAK;YACL,IAAI;YACJ,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,QAAQ,EAAE,QAAQ,IAAI,IAAI;SAC3B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-file.d.ts","sourceRoot":"","sources":["../../src/cli/delete-file.ts"],"names":[],"mappings":"AAmBA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDrB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import readline from 'readline';
|
|
2
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
3
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
4
|
+
import { getCurrentProfile } from './credentials.js';
|
|
5
|
+
async function askConfirmation(question) {
|
|
6
|
+
const rl = readline.createInterface({
|
|
7
|
+
input: process.stdin,
|
|
8
|
+
output: process.stdout,
|
|
9
|
+
});
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
rl.question(`${question} (y/n): `, (answer) => {
|
|
12
|
+
rl.close();
|
|
13
|
+
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function deleteFileCommand(fileId, options = {}) {
|
|
18
|
+
try {
|
|
19
|
+
if (!fileId) {
|
|
20
|
+
console.error('❌ File ID required\n');
|
|
21
|
+
console.error('Usage: npx @doxhub/mcp-server delete-file <fileId> [--force]\n');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const profile = getCurrentProfile();
|
|
25
|
+
if (!profile) {
|
|
26
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
initializeApiClient({
|
|
30
|
+
baseUrl: profile.apiUrl,
|
|
31
|
+
accessToken: profile.accessToken,
|
|
32
|
+
});
|
|
33
|
+
const auth = await getAuthContext();
|
|
34
|
+
if (!auth) {
|
|
35
|
+
console.error('❌ Authentication failed\n');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Get file info first
|
|
39
|
+
const apiClient = getApiClient();
|
|
40
|
+
const file = await apiClient.getFile(fileId);
|
|
41
|
+
console.log('\n⚠️ You are about to delete this file:\n');
|
|
42
|
+
console.log(` Title: ${file.title}`);
|
|
43
|
+
console.log(` Path: ${file.path}`);
|
|
44
|
+
console.log(` ID: ${file.id}\n`);
|
|
45
|
+
console.log('The file will be moved to trash and can be restored later.\n');
|
|
46
|
+
// Ask for confirmation unless --force flag is used
|
|
47
|
+
if (!options.force) {
|
|
48
|
+
const confirmed = await askConfirmation('Are you sure?');
|
|
49
|
+
if (!confirmed) {
|
|
50
|
+
console.log('\nCancelled\n');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
await apiClient.deleteFile(fileId);
|
|
55
|
+
console.log('\n✅ File deleted successfully (moved to trash)\n');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=delete-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-file.js","sourceRoot":"","sources":["../../src/cli/delete-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file.d.ts","sourceRoot":"","sources":["../../src/cli/get-file.ts"],"names":[],"mappings":"AAIA,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function getFileCommand(fileId, options = {}) {
|
|
5
|
+
try {
|
|
6
|
+
if (!fileId) {
|
|
7
|
+
console.error('❌ File ID required\n');
|
|
8
|
+
console.error('Usage: npx @doxhub/mcp-server get-file <fileId> [--content-only] [--metadata]\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const profile = getCurrentProfile();
|
|
12
|
+
if (!profile) {
|
|
13
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
initializeApiClient({
|
|
17
|
+
baseUrl: profile.apiUrl,
|
|
18
|
+
accessToken: profile.accessToken,
|
|
19
|
+
});
|
|
20
|
+
const auth = await getAuthContext();
|
|
21
|
+
if (!auth) {
|
|
22
|
+
console.error('❌ Authentication failed\n');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const apiClient = getApiClient();
|
|
26
|
+
const file = await apiClient.getFile(fileId);
|
|
27
|
+
// Content only mode - just output the file content
|
|
28
|
+
if (options.contentOnly) {
|
|
29
|
+
console.log(file.content || '');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Metadata mode - show file details without content
|
|
33
|
+
if (options.metadata) {
|
|
34
|
+
console.log('\n📄 File Details:\n');
|
|
35
|
+
console.log(` Title: ${file.title}`);
|
|
36
|
+
console.log(` ID: ${file.id}`);
|
|
37
|
+
console.log(` Path: ${file.path}`);
|
|
38
|
+
console.log(` Status: ${file.status}`);
|
|
39
|
+
console.log(` Version: ${file.currentVersion}`);
|
|
40
|
+
console.log(` Project: ${file.projectName || file.projectId}`);
|
|
41
|
+
console.log(` Created: ${new Date(file.createdAt).toLocaleString()}`);
|
|
42
|
+
console.log(` Updated: ${new Date(file.updatedAt).toLocaleString()}`);
|
|
43
|
+
console.log(` Content length: ${file.content?.length || 0} characters\n`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Default mode - show both metadata and content
|
|
47
|
+
console.log('\n📄 File Details:\n');
|
|
48
|
+
console.log(` Title: ${file.title}`);
|
|
49
|
+
console.log(` Path: ${file.path}`);
|
|
50
|
+
console.log(` ID: ${file.id}`);
|
|
51
|
+
console.log(` Version: ${file.currentVersion}`);
|
|
52
|
+
console.log('\n─────────────────────────────────────────────\n');
|
|
53
|
+
console.log(file.content || '(empty file)');
|
|
54
|
+
console.log('\n─────────────────────────────────────────────\n');
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=get-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file.js","sourceRoot":"","sources":["../../src/cli/get-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-files.d.ts","sourceRoot":"","sources":["../../src/cli/list-files.ts"],"names":[],"mappings":"AAIA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CvE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function listFilesCommand(projectId) {
|
|
5
|
+
try {
|
|
6
|
+
if (!projectId) {
|
|
7
|
+
console.error('❌ Project ID required\n');
|
|
8
|
+
console.error('Usage: npx @doxhub/mcp-server list-files <projectId>\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const profile = getCurrentProfile();
|
|
12
|
+
if (!profile) {
|
|
13
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
initializeApiClient({
|
|
17
|
+
baseUrl: profile.apiUrl,
|
|
18
|
+
accessToken: profile.accessToken,
|
|
19
|
+
});
|
|
20
|
+
const auth = await getAuthContext();
|
|
21
|
+
if (!auth) {
|
|
22
|
+
console.error('❌ Authentication failed\n');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const apiClient = getApiClient();
|
|
26
|
+
const files = await apiClient.getFiles(projectId);
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
console.log('No files found\n');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
console.log('\n📄 Files:\n');
|
|
32
|
+
files.forEach((file) => {
|
|
33
|
+
console.log(` ${file.title}`);
|
|
34
|
+
console.log(` ID: ${file.id}`);
|
|
35
|
+
console.log(` Path: ${file.path}`);
|
|
36
|
+
console.log(` Version: ${file.currentVersion}`);
|
|
37
|
+
console.log(` Updated: ${new Date(file.updatedAt).toLocaleString()}`);
|
|
38
|
+
console.log('');
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=list-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-files.js","sourceRoot":"","sources":["../../src/cli/list-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/cli/list-projects.ts"],"names":[],"mappings":"AAIA,wBAAsB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD7E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function listProjectsCommand(workspaceId) {
|
|
5
|
+
try {
|
|
6
|
+
const profile = getCurrentProfile();
|
|
7
|
+
if (!profile) {
|
|
8
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
initializeApiClient({
|
|
12
|
+
baseUrl: profile.apiUrl,
|
|
13
|
+
accessToken: profile.accessToken,
|
|
14
|
+
});
|
|
15
|
+
const auth = await getAuthContext();
|
|
16
|
+
if (!auth) {
|
|
17
|
+
console.error('❌ Authentication failed\n');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const apiClient = getApiClient();
|
|
21
|
+
// If no workspace ID provided, use the one from profile or get first workspace
|
|
22
|
+
let targetWorkspaceId = workspaceId || profile.workspaceId;
|
|
23
|
+
if (!targetWorkspaceId) {
|
|
24
|
+
const workspaces = await apiClient.getWorkspaces();
|
|
25
|
+
if (workspaces.length === 0) {
|
|
26
|
+
console.error('❌ No workspaces found\n');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
targetWorkspaceId = workspaces[0].id;
|
|
30
|
+
console.log(`Using workspace: ${workspaces[0].name}\n`);
|
|
31
|
+
}
|
|
32
|
+
const projects = await apiClient.getProjects(targetWorkspaceId);
|
|
33
|
+
if (projects.length === 0) {
|
|
34
|
+
console.log('No projects found\n');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log('\n📂 Projects:\n');
|
|
38
|
+
projects.forEach((project) => {
|
|
39
|
+
console.log(` ${project.name}`);
|
|
40
|
+
console.log(` ID: ${project.id}`);
|
|
41
|
+
if (project.description) {
|
|
42
|
+
console.log(` Description: ${project.description}`);
|
|
43
|
+
}
|
|
44
|
+
console.log('');
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=list-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/cli/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAoB;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QAEjC,+EAA+E;QAC/E,IAAI,iBAAiB,GAAG,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;QAE3D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC;YACnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,oBAAoB,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,iBAAkB,CAAC,CAAC;QAEjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-workspaces.d.ts","sourceRoot":"","sources":["../../src/cli/list-workspaces.ts"],"names":[],"mappings":"AAIA,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwC3D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function listWorkspacesCommand() {
|
|
5
|
+
try {
|
|
6
|
+
const profile = getCurrentProfile();
|
|
7
|
+
if (!profile) {
|
|
8
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
initializeApiClient({
|
|
12
|
+
baseUrl: profile.apiUrl,
|
|
13
|
+
accessToken: profile.accessToken,
|
|
14
|
+
});
|
|
15
|
+
const auth = await getAuthContext();
|
|
16
|
+
if (!auth) {
|
|
17
|
+
console.error('❌ Authentication failed\n');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const apiClient = getApiClient();
|
|
21
|
+
const workspaces = await apiClient.getWorkspaces();
|
|
22
|
+
if (workspaces.length === 0) {
|
|
23
|
+
console.log('No workspaces found\n');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log('\n📁 Your Workspaces:\n');
|
|
27
|
+
workspaces.forEach((ws) => {
|
|
28
|
+
console.log(` ${ws.name}`);
|
|
29
|
+
console.log(` ID: ${ws.id}`);
|
|
30
|
+
if (ws.description) {
|
|
31
|
+
console.log(` Description: ${ws.description}`);
|
|
32
|
+
}
|
|
33
|
+
console.log('');
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=list-workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-workspaces.js","sourceRoot":"","sources":["../../src/cli/list-workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mBAAmB,CAAC;YAClB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC;QAEnD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAO,EAAE,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DrB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function searchCommand(query, options = {}) {
|
|
5
|
+
try {
|
|
6
|
+
if (!query) {
|
|
7
|
+
console.error('❌ Search query required\n');
|
|
8
|
+
console.error('Usage: npx @doxhub/mcp-server search <query> [--workspace <id>] [--project <id>]\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const profile = getCurrentProfile();
|
|
12
|
+
if (!profile) {
|
|
13
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
initializeApiClient({
|
|
17
|
+
baseUrl: profile.apiUrl,
|
|
18
|
+
accessToken: profile.accessToken,
|
|
19
|
+
});
|
|
20
|
+
const auth = await getAuthContext();
|
|
21
|
+
if (!auth) {
|
|
22
|
+
console.error('❌ Authentication failed\n');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const apiClient = getApiClient();
|
|
26
|
+
// Get workspace ID
|
|
27
|
+
let workspaceId = options.workspaceId || profile.workspaceId;
|
|
28
|
+
if (!workspaceId) {
|
|
29
|
+
const workspaces = await apiClient.getWorkspaces();
|
|
30
|
+
if (workspaces.length === 0) {
|
|
31
|
+
console.error('❌ No workspaces found\n');
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
workspaceId = workspaces[0].id;
|
|
35
|
+
}
|
|
36
|
+
const results = await apiClient.searchFiles(workspaceId, query, options.projectId);
|
|
37
|
+
if (results.length === 0) {
|
|
38
|
+
console.log(`\nNo results found for: "${query}"\n`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log(`\n🔍 Search results for: "${query}"\n`);
|
|
42
|
+
console.log(`Found ${results.length} result(s)\n`);
|
|
43
|
+
results.forEach((result, index) => {
|
|
44
|
+
console.log(`${index + 1}. ${result.title}`);
|
|
45
|
+
console.log(` ID: ${result.id}`);
|
|
46
|
+
console.log(` Path: ${result.path}`);
|
|
47
|
+
console.log(` Project: ${result.projectName || result.projectId}`);
|
|
48
|
+
if (result.snippet) {
|
|
49
|
+
console.log(` Preview: ${result.snippet.substring(0, 100)}...`);
|
|
50
|
+
}
|
|
51
|
+
console.log('');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/cli/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function updateFileCommand(fileId: string, options: {
|
|
2
|
+
title?: string;
|
|
3
|
+
path?: string;
|
|
4
|
+
content?: string;
|
|
5
|
+
status?: 'active' | 'archived';
|
|
6
|
+
changeSummary?: string;
|
|
7
|
+
createVersion?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=update-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-file.d.ts","sourceRoot":"","sources":["../../src/cli/update-file.ts"],"names":[],"mappings":"AAIA,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACA,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getAuthContext } from '../auth/verify-token.js';
|
|
2
|
+
import { getApiClient, initializeApiClient } from '../api-client.js';
|
|
3
|
+
import { getCurrentProfile } from './credentials.js';
|
|
4
|
+
export async function updateFileCommand(fileId, options) {
|
|
5
|
+
try {
|
|
6
|
+
if (!fileId) {
|
|
7
|
+
console.error('❌ File ID required\n');
|
|
8
|
+
console.error('Usage: npx @doxhub/mcp-server update-file <fileId> [--title <title>] [--path <path>] [--content <content>] [--status <status>] [--summary <text>] [--no-version]\n');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const { title, path, content, status, changeSummary, createVersion } = options;
|
|
12
|
+
// Check if at least one field is provided
|
|
13
|
+
if (!title && !path && content === undefined && !status && !changeSummary) {
|
|
14
|
+
console.error('❌ At least one field to update must be provided\n');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const profile = getCurrentProfile();
|
|
18
|
+
if (!profile) {
|
|
19
|
+
console.error('❌ Not authenticated. Run "npx @doxhub/mcp-server setup" first.\n');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
initializeApiClient({
|
|
23
|
+
baseUrl: profile.apiUrl,
|
|
24
|
+
accessToken: profile.accessToken,
|
|
25
|
+
});
|
|
26
|
+
const auth = await getAuthContext();
|
|
27
|
+
if (!auth) {
|
|
28
|
+
console.error('❌ Authentication failed\n');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const apiClient = getApiClient();
|
|
32
|
+
// Build update data
|
|
33
|
+
const updateData = {};
|
|
34
|
+
if (title !== undefined)
|
|
35
|
+
updateData.title = title;
|
|
36
|
+
if (path !== undefined)
|
|
37
|
+
updateData.path = path;
|
|
38
|
+
if (content !== undefined)
|
|
39
|
+
updateData.content = content;
|
|
40
|
+
if (status !== undefined)
|
|
41
|
+
updateData.status = status;
|
|
42
|
+
if (changeSummary !== undefined)
|
|
43
|
+
updateData.changeSummary = changeSummary;
|
|
44
|
+
if (createVersion !== undefined)
|
|
45
|
+
updateData.createVersion = createVersion;
|
|
46
|
+
const file = await apiClient.updateFile(fileId, updateData);
|
|
47
|
+
console.log('\n✅ File updated successfully!\n');
|
|
48
|
+
console.log(` Title: ${file.title}`);
|
|
49
|
+
console.log(` ID: ${file.id}`);
|
|
50
|
+
console.log(` Path: ${file.path}`);
|
|
51
|
+
console.log(` Version: ${file.currentVersion}`);
|
|
52
|
+
console.log(` Status: ${file.status}\n`);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`❌ Error: ${error instanceof Error ? error.message : error}\n`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=update-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-file.js","sourceRoot":"","sources":["../../src/cli/update-file.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,14 @@ import { setupCommand } from './cli/setup.js';
|
|
|
5
5
|
import { statusCommand } from './cli/status.js';
|
|
6
6
|
import { profilesCommand, switchProfile } from './cli/profiles.js';
|
|
7
7
|
import { revokeCommand, logoutCommand } from './cli/revoke.js';
|
|
8
|
+
import { listWorkspacesCommand } from './cli/list-workspaces.js';
|
|
9
|
+
import { listProjectsCommand } from './cli/list-projects.js';
|
|
10
|
+
import { listFilesCommand } from './cli/list-files.js';
|
|
11
|
+
import { getFileCommand } from './cli/get-file.js';
|
|
12
|
+
import { createFileCommand } from './cli/create-file.js';
|
|
13
|
+
import { updateFileCommand } from './cli/update-file.js';
|
|
14
|
+
import { deleteFileCommand } from './cli/delete-file.js';
|
|
15
|
+
import { searchCommand } from './cli/search.js';
|
|
8
16
|
async function main() {
|
|
9
17
|
const args = process.argv.slice(2);
|
|
10
18
|
// Check if running in CLI mode
|
|
@@ -68,6 +76,95 @@ Options:
|
|
|
68
76
|
await logoutCommand();
|
|
69
77
|
process.exit(0);
|
|
70
78
|
}
|
|
79
|
+
case 'list-workspaces': {
|
|
80
|
+
await listWorkspacesCommand();
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
case 'list-projects': {
|
|
84
|
+
const workspaceId = args[1] || undefined;
|
|
85
|
+
await listProjectsCommand(workspaceId);
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
case 'list-files': {
|
|
89
|
+
const projectId = args[1] || '';
|
|
90
|
+
await listFilesCommand(projectId);
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
case 'get-file': {
|
|
94
|
+
const fileId = args[1] || '';
|
|
95
|
+
const contentOnly = args.includes('--content-only');
|
|
96
|
+
const metadata = args.includes('--metadata');
|
|
97
|
+
await getFileCommand(fileId, { contentOnly, metadata });
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
case 'create-file': {
|
|
101
|
+
const options = {};
|
|
102
|
+
for (let i = 1; i < args.length; i++) {
|
|
103
|
+
if (args[i] === '--project' && args[i + 1]) {
|
|
104
|
+
options.projectId = args[++i];
|
|
105
|
+
}
|
|
106
|
+
else if (args[i] === '--title' && args[i + 1]) {
|
|
107
|
+
options.title = args[++i];
|
|
108
|
+
}
|
|
109
|
+
else if (args[i] === '--path' && args[i + 1]) {
|
|
110
|
+
options.path = args[++i];
|
|
111
|
+
}
|
|
112
|
+
else if (args[i] === '--content' && args[i + 1]) {
|
|
113
|
+
options.content = args[++i];
|
|
114
|
+
}
|
|
115
|
+
else if (args[i] === '--folder' && args[i + 1]) {
|
|
116
|
+
options.folderId = args[++i];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
await createFileCommand(options);
|
|
120
|
+
process.exit(0);
|
|
121
|
+
}
|
|
122
|
+
case 'update-file': {
|
|
123
|
+
const fileId = args[1] || '';
|
|
124
|
+
const options = {};
|
|
125
|
+
for (let i = 2; i < args.length; i++) {
|
|
126
|
+
if (args[i] === '--title' && args[i + 1]) {
|
|
127
|
+
options.title = args[++i];
|
|
128
|
+
}
|
|
129
|
+
else if (args[i] === '--path' && args[i + 1]) {
|
|
130
|
+
options.path = args[++i];
|
|
131
|
+
}
|
|
132
|
+
else if (args[i] === '--content' && args[i + 1]) {
|
|
133
|
+
options.content = args[++i];
|
|
134
|
+
}
|
|
135
|
+
else if (args[i] === '--status' && args[i + 1]) {
|
|
136
|
+
options.status = args[++i];
|
|
137
|
+
}
|
|
138
|
+
else if (args[i] === '--summary' && args[i + 1]) {
|
|
139
|
+
options.changeSummary = args[++i];
|
|
140
|
+
}
|
|
141
|
+
else if (args[i] === '--no-version') {
|
|
142
|
+
options.createVersion = false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
await updateFileCommand(fileId, options);
|
|
146
|
+
process.exit(0);
|
|
147
|
+
}
|
|
148
|
+
case 'delete-file': {
|
|
149
|
+
const fileId = args[1] || '';
|
|
150
|
+
const force = args.includes('--force');
|
|
151
|
+
await deleteFileCommand(fileId, { force });
|
|
152
|
+
process.exit(0);
|
|
153
|
+
}
|
|
154
|
+
case 'search': {
|
|
155
|
+
const query = args[1] || '';
|
|
156
|
+
const options = {};
|
|
157
|
+
for (let i = 2; i < args.length; i++) {
|
|
158
|
+
if (args[i] === '--workspace' && args[i + 1]) {
|
|
159
|
+
options.workspaceId = args[++i];
|
|
160
|
+
}
|
|
161
|
+
else if (args[i] === '--project' && args[i + 1]) {
|
|
162
|
+
options.projectId = args[++i];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
await searchCommand(query, options);
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
71
168
|
case 'help':
|
|
72
169
|
case '--help':
|
|
73
170
|
case '-h': {
|
|
@@ -77,27 +174,70 @@ DoxHub MCP Server
|
|
|
77
174
|
Usage:
|
|
78
175
|
npx @doxhub/mcp-server [command] [options]
|
|
79
176
|
|
|
80
|
-
Commands:
|
|
81
|
-
setup
|
|
82
|
-
status
|
|
83
|
-
profiles
|
|
84
|
-
switch <profile>
|
|
85
|
-
revoke
|
|
86
|
-
logout
|
|
87
|
-
|
|
177
|
+
Authentication Commands:
|
|
178
|
+
setup Set up MCP server authorization
|
|
179
|
+
status Show current token status
|
|
180
|
+
profiles List all profiles
|
|
181
|
+
switch <profile> Switch to a different profile
|
|
182
|
+
revoke Revoke current token
|
|
183
|
+
logout Logout (revoke and remove credentials)
|
|
184
|
+
|
|
185
|
+
File Management Commands:
|
|
186
|
+
list-workspaces List all workspaces
|
|
187
|
+
list-projects [workspaceId] List projects in a workspace
|
|
188
|
+
list-files <projectId> List files in a project
|
|
189
|
+
get-file <fileId> Get file content and metadata
|
|
190
|
+
search <query> Search documentation
|
|
191
|
+
|
|
192
|
+
create-file Create a new file
|
|
193
|
+
--project <id> Project ID (required)
|
|
194
|
+
--title <title> File title (required)
|
|
195
|
+
--path <path> File path (required)
|
|
196
|
+
--content <content> File content (optional)
|
|
197
|
+
--folder <id> Folder ID (optional)
|
|
198
|
+
|
|
199
|
+
update-file <fileId> Update an existing file
|
|
200
|
+
--title <title> New title (optional)
|
|
201
|
+
--path <path> New path (optional)
|
|
202
|
+
--content <content> New content (optional)
|
|
203
|
+
--status <status> Status: active|archived (optional)
|
|
204
|
+
--summary <text> Change summary (optional)
|
|
205
|
+
--no-version Don't create version history
|
|
206
|
+
|
|
207
|
+
delete-file <fileId> Delete a file (move to trash)
|
|
208
|
+
--force Skip confirmation
|
|
209
|
+
|
|
210
|
+
Get File Options:
|
|
211
|
+
--content-only Output only file content (no metadata)
|
|
212
|
+
--metadata Output only metadata (no content)
|
|
213
|
+
|
|
214
|
+
Search Options:
|
|
215
|
+
--workspace <id> Search in specific workspace
|
|
216
|
+
--project <id> Search in specific project
|
|
88
217
|
|
|
89
218
|
MCP Server Mode:
|
|
90
219
|
When run without commands, starts the MCP server for Claude integration.
|
|
91
|
-
This mode is used by Claude Desktop
|
|
220
|
+
This mode is used by Claude Desktop automatically.
|
|
92
221
|
|
|
93
222
|
Examples:
|
|
94
|
-
|
|
95
|
-
npx @doxhub/mcp-server setup
|
|
96
|
-
npx @doxhub/mcp-server status
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
npx @doxhub/mcp-server
|
|
100
|
-
npx @doxhub/mcp-server
|
|
223
|
+
# Authentication
|
|
224
|
+
npx @doxhub/mcp-server setup
|
|
225
|
+
npx @doxhub/mcp-server status
|
|
226
|
+
|
|
227
|
+
# List resources
|
|
228
|
+
npx @doxhub/mcp-server list-workspaces
|
|
229
|
+
npx @doxhub/mcp-server list-projects
|
|
230
|
+
npx @doxhub/mcp-server list-files <projectId>
|
|
231
|
+
|
|
232
|
+
# Read files
|
|
233
|
+
npx @doxhub/mcp-server get-file <fileId>
|
|
234
|
+
npx @doxhub/mcp-server get-file <fileId> --content-only > file.md
|
|
235
|
+
npx @doxhub/mcp-server search "API documentation"
|
|
236
|
+
|
|
237
|
+
# Write files
|
|
238
|
+
npx @doxhub/mcp-server create-file --project <id> --title "README" --path "README.md" --content "Hello"
|
|
239
|
+
npx @doxhub/mcp-server update-file <fileId> --content "\$(cat file.md)"
|
|
240
|
+
npx @doxhub/mcp-server delete-file <fileId>
|
|
101
241
|
`);
|
|
102
242
|
process.exit(0);
|
|
103
243
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|