@develosaur/mcp 1.0.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/dist/auth/ApiKeyAuth.d.ts +23 -0
- package/dist/auth/ApiKeyAuth.d.ts.map +1 -0
- package/dist/auth/ApiKeyAuth.js +119 -0
- package/dist/auth/ApiKeyAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +252 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/edges.d.ts +10 -0
- package/dist/tools/edges.d.ts.map +1 -0
- package/dist/tools/edges.js +58 -0
- package/dist/tools/edges.js.map +1 -0
- package/dist/tools/nodes.d.ts +26 -0
- package/dist/tools/nodes.d.ts.map +1 -0
- package/dist/tools/nodes.js +188 -0
- package/dist/tools/nodes.js.map +1 -0
- package/dist/tools/query.d.ts +27 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +133 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/nodeDefaults.d.ts +14 -0
- package/dist/utils/nodeDefaults.d.ts.map +1 -0
- package/dist/utils/nodeDefaults.js +49 -0
- package/dist/utils/nodeDefaults.js.map +1 -0
- package/dist/utils/rateLimiter.d.ts +11 -0
- package/dist/utils/rateLimiter.d.ts.map +1 -0
- package/dist/utils/rateLimiter.js +32 -0
- package/dist/utils/rateLimiter.js.map +1 -0
- package/dist/yjs/BinaryEncoding.d.ts +7 -0
- package/dist/yjs/BinaryEncoding.d.ts.map +1 -0
- package/dist/yjs/BinaryEncoding.js +11 -0
- package/dist/yjs/BinaryEncoding.js.map +1 -0
- package/dist/yjs/YjsProjectSession.d.ts +45 -0
- package/dist/yjs/YjsProjectSession.d.ts.map +1 -0
- package/dist/yjs/YjsProjectSession.js +129 -0
- package/dist/yjs/YjsProjectSession.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import type { DevelosaurConfig, AuthResult } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Discover .develosaur.json by walking up from cwd
|
|
5
|
+
*/
|
|
6
|
+
export declare function discoverConfig(): DevelosaurConfig;
|
|
7
|
+
/**
|
|
8
|
+
* Exchange API key for a Supabase JWT via Edge Function
|
|
9
|
+
*/
|
|
10
|
+
export declare function exchangeKeyForJWT(apiKey: string): Promise<AuthResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Create an authenticated Supabase client using the JWT
|
|
13
|
+
*/
|
|
14
|
+
export declare function createAuthenticatedClient(accessToken: string): SupabaseClient;
|
|
15
|
+
/**
|
|
16
|
+
* Full auth flow: discover config → exchange key → create client
|
|
17
|
+
*/
|
|
18
|
+
export declare function authenticate(): Promise<{
|
|
19
|
+
supabase: SupabaseClient;
|
|
20
|
+
auth: AuthResult;
|
|
21
|
+
config: DevelosaurConfig;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=ApiKeyAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyAuth.d.ts","sourceRoot":"","sources":["../../src/auth/ApiKeyAuth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAShE;;GAEG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CA8CjD;AAuBD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAY7E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC,CAMD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { createClient } from '@supabase/supabase-js';
|
|
4
|
+
// Hardcoded — this is your Supabase instance (public, same as web app client bundle)
|
|
5
|
+
const SUPABASE_URL = 'https://bnrldtitlxipituddgbl.supabase.co';
|
|
6
|
+
const SUPABASE_ANON_KEY = 'sb_publishable_QsRTEDr_AVvYLp-a2aSzFw_4Lrhtq-s';
|
|
7
|
+
const CONFIG_FILENAME = '.develosaur.json';
|
|
8
|
+
const MAX_PARENT_SEARCH_DEPTH = 5;
|
|
9
|
+
/**
|
|
10
|
+
* Discover .develosaur.json by walking up from cwd
|
|
11
|
+
*/
|
|
12
|
+
export function discoverConfig() {
|
|
13
|
+
let dir = process.cwd();
|
|
14
|
+
for (let i = 0; i <= MAX_PARENT_SEARCH_DEPTH; i++) {
|
|
15
|
+
const configPath = join(dir, CONFIG_FILENAME);
|
|
16
|
+
if (existsSync(configPath)) {
|
|
17
|
+
try {
|
|
18
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
19
|
+
const config = JSON.parse(raw);
|
|
20
|
+
if (!config.api_key || !config.project_id) {
|
|
21
|
+
throw new Error(`Invalid ${CONFIG_FILENAME}: missing api_key or project_id`);
|
|
22
|
+
}
|
|
23
|
+
if (!config.api_key.startsWith('dsk_')) {
|
|
24
|
+
throw new Error(`Invalid API key format in ${CONFIG_FILENAME}. Expected key starting with "dsk_"`);
|
|
25
|
+
}
|
|
26
|
+
// Check .gitignore
|
|
27
|
+
checkGitignore(dir);
|
|
28
|
+
return config;
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
if (e instanceof SyntaxError) {
|
|
32
|
+
throw new Error(`Invalid JSON in ${configPath}`);
|
|
33
|
+
}
|
|
34
|
+
throw e;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const parent = dirname(dir);
|
|
38
|
+
if (parent === dir)
|
|
39
|
+
break; // filesystem root
|
|
40
|
+
dir = parent;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`No ${CONFIG_FILENAME} found.\n\n` +
|
|
43
|
+
'To set up Develosaur MCP:\n' +
|
|
44
|
+
'1. Open develosaur.com and navigate to your project\n' +
|
|
45
|
+
'2. Click the MCP download icon on the project card\n' +
|
|
46
|
+
`3. Place the downloaded ${CONFIG_FILENAME} in your project root\n`);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Warn if .develosaur.json is not in .gitignore
|
|
50
|
+
*/
|
|
51
|
+
function checkGitignore(dir) {
|
|
52
|
+
const gitignorePath = join(dir, '.gitignore');
|
|
53
|
+
if (!existsSync(gitignorePath))
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
const gitignore = readFileSync(gitignorePath, 'utf-8');
|
|
57
|
+
if (!gitignore.includes(CONFIG_FILENAME)) {
|
|
58
|
+
console.error(`⚠ WARNING: ${CONFIG_FILENAME} is not in your .gitignore. ` +
|
|
59
|
+
'This file contains an API key and should not be committed to git.\n' +
|
|
60
|
+
`Add "${CONFIG_FILENAME}" to your .gitignore file.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Ignore read errors
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Exchange API key for a Supabase JWT via Edge Function
|
|
69
|
+
*/
|
|
70
|
+
export async function exchangeKeyForJWT(apiKey) {
|
|
71
|
+
const url = `${SUPABASE_URL}/functions/v1/exchange-mcp-key`;
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: {
|
|
75
|
+
'Content-Type': 'application/json',
|
|
76
|
+
apikey: SUPABASE_ANON_KEY,
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({ api_key: apiKey }),
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
const body = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
82
|
+
const msg = body.error || `HTTP ${response.status}`;
|
|
83
|
+
throw new Error(`Authentication failed: ${msg}`);
|
|
84
|
+
}
|
|
85
|
+
const data = await response.json();
|
|
86
|
+
return {
|
|
87
|
+
accessToken: data.access_token,
|
|
88
|
+
expiresIn: data.expires_in,
|
|
89
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
90
|
+
projectId: data.project_id,
|
|
91
|
+
projectName: data.project_name,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create an authenticated Supabase client using the JWT
|
|
96
|
+
*/
|
|
97
|
+
export function createAuthenticatedClient(accessToken) {
|
|
98
|
+
return createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
99
|
+
auth: {
|
|
100
|
+
autoRefreshToken: false,
|
|
101
|
+
persistSession: false,
|
|
102
|
+
},
|
|
103
|
+
global: {
|
|
104
|
+
headers: {
|
|
105
|
+
Authorization: `Bearer ${accessToken}`,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Full auth flow: discover config → exchange key → create client
|
|
112
|
+
*/
|
|
113
|
+
export async function authenticate() {
|
|
114
|
+
const config = discoverConfig();
|
|
115
|
+
const auth = await exchangeKeyForJWT(config.api_key);
|
|
116
|
+
const supabase = createAuthenticatedClient(auth.accessToken);
|
|
117
|
+
return { supabase, auth, config };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=ApiKeyAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiKeyAuth.js","sourceRoot":"","sources":["../../src/auth/ApiKeyAuth.ts"],"names":[],"mappings":"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"}
|
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,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { authenticate } from './auth/ApiKeyAuth.js';
|
|
4
|
+
import { createMcpServer } from './server.js';
|
|
5
|
+
async function main() {
|
|
6
|
+
try {
|
|
7
|
+
// 1. Discover .develosaur.json and authenticate
|
|
8
|
+
const { supabase, auth, config } = await authenticate();
|
|
9
|
+
console.error(`[develosaur-mcp] Connected to project "${auth.projectName}" (${auth.projectId})`);
|
|
10
|
+
// 2. Create MCP server with all tools
|
|
11
|
+
const server = createMcpServer(supabase, auth, config);
|
|
12
|
+
// 3. Start stdio transport
|
|
13
|
+
const transport = new StdioServerTransport();
|
|
14
|
+
await server.connect(transport);
|
|
15
|
+
console.error('[develosaur-mcp] MCP server running on stdio');
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`[develosaur-mcp] Fatal: ${error.message}`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
main();
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,gDAAgD;QAChD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAExD,OAAO,CAAC,KAAK,CACX,0CAA0C,IAAI,CAAC,WAAW,MAAM,IAAI,CAAC,SAAS,GAAG,CAClF,CAAC;QAEF,sCAAsC;QACtC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAEvD,2BAA2B;QAC3B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
3
|
+
import type { AuthResult, DevelosaurConfig } from './types.js';
|
|
4
|
+
export declare function createMcpServer(supabase: SupabaseClient, auth: AuthResult, config: DevelosaurConfig): McpServer;
|
|
5
|
+
//# 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,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS/D,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,gBAAgB,GACvB,SAAS,CAuVX"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { YjsProjectSession } from './yjs/YjsProjectSession.js';
|
|
3
|
+
import { RateLimiter } from './utils/rateLimiter.js';
|
|
4
|
+
// Tools
|
|
5
|
+
import { createNode, updateNode, completeNode, deleteNode, batchCreateNodes } from './tools/nodes.js';
|
|
6
|
+
import { createEdge, moveNode } from './tools/edges.js';
|
|
7
|
+
import { getTree, getNode, findNodes, listTags } from './tools/query.js';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
export function createMcpServer(supabase, auth, config) {
|
|
10
|
+
const server = new McpServer({
|
|
11
|
+
name: 'develosaur',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
});
|
|
14
|
+
let session = null;
|
|
15
|
+
const rateLimiter = new RateLimiter(10, 1000);
|
|
16
|
+
/**
|
|
17
|
+
* Ensure the session is loaded and connected
|
|
18
|
+
*/
|
|
19
|
+
async function ensureSession() {
|
|
20
|
+
if (!session) {
|
|
21
|
+
session = new YjsProjectSession(supabase, auth.projectId);
|
|
22
|
+
await session.load();
|
|
23
|
+
await session.connectRealtime();
|
|
24
|
+
}
|
|
25
|
+
return session;
|
|
26
|
+
}
|
|
27
|
+
// ── Connection Status ──
|
|
28
|
+
server.tool('connection_status', 'Show current connection status: project name, node count, Realtime status.', {}, async () => {
|
|
29
|
+
const s = await ensureSession();
|
|
30
|
+
const doc = s.getDoc();
|
|
31
|
+
const nodeCount = doc.getMap('nodes').size;
|
|
32
|
+
const edgeCount = doc.getMap('edges').size;
|
|
33
|
+
return {
|
|
34
|
+
content: [{
|
|
35
|
+
type: 'text',
|
|
36
|
+
text: JSON.stringify({
|
|
37
|
+
project_name: auth.projectName,
|
|
38
|
+
project_id: auth.projectId,
|
|
39
|
+
node_count: nodeCount,
|
|
40
|
+
edge_count: edgeCount,
|
|
41
|
+
realtime_connected: s.isConnected(),
|
|
42
|
+
jwt_expires_at: new Date(auth.expiresAt).toISOString(),
|
|
43
|
+
}, null, 2),
|
|
44
|
+
}],
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
// ── Create Node ──
|
|
48
|
+
server.tool('create_node', 'Create a new node in the Develosaur project graph. Returns the node ID.', {
|
|
49
|
+
title: z.string().describe('Node title'),
|
|
50
|
+
content_markdown: z.string().optional().describe('Markdown content body'),
|
|
51
|
+
parent_id: z.string().optional().describe('Parent node ID. Omit for root-level (rogue) node.'),
|
|
52
|
+
type: z.enum(['tasks', 'richtext', 'deadline', 'title']).optional().describe('Node type'),
|
|
53
|
+
color: z.string().optional().describe("Hex color, e.g. '#4299e1'"),
|
|
54
|
+
tags: z.array(z.string()).optional().describe('Tag IDs to assign'),
|
|
55
|
+
v_score: z.number().min(0).max(10).optional().describe('Business value 0-10 (priority base tier)'),
|
|
56
|
+
e_score: z.number().min(0).max(10).optional().describe('Effort estimate 0-10 (lower = easier)'),
|
|
57
|
+
}, async (params) => {
|
|
58
|
+
rateLimiter.check();
|
|
59
|
+
const s = await ensureSession();
|
|
60
|
+
const { nodeId, seq } = await createNode(s, {
|
|
61
|
+
title: params.title,
|
|
62
|
+
contentMarkdown: params.content_markdown,
|
|
63
|
+
parentId: params.parent_id,
|
|
64
|
+
type: params.type,
|
|
65
|
+
color: params.color,
|
|
66
|
+
tags: params.tags,
|
|
67
|
+
vScore: params.v_score,
|
|
68
|
+
eScore: params.e_score,
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
content: [{
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: JSON.stringify({ node_id: nodeId, sequence: seq }),
|
|
74
|
+
}],
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
// ── Update Node ──
|
|
78
|
+
server.tool('update_node', 'Update an existing node\'s properties. Only specified fields are changed.', {
|
|
79
|
+
node_id: z.string().describe('Node ID to update'),
|
|
80
|
+
title: z.string().optional().describe('New title'),
|
|
81
|
+
content_markdown: z.string().optional().describe('New markdown content'),
|
|
82
|
+
color: z.string().optional().describe('New hex color'),
|
|
83
|
+
tags: z.array(z.string()).optional().describe('Replace tag IDs'),
|
|
84
|
+
v_score: z.number().min(0).max(10).optional().describe('New business value'),
|
|
85
|
+
e_score: z.number().min(0).max(10).optional().describe('New effort estimate'),
|
|
86
|
+
}, async (params) => {
|
|
87
|
+
rateLimiter.check();
|
|
88
|
+
const s = await ensureSession();
|
|
89
|
+
const seq = await updateNode(s, params.node_id, {
|
|
90
|
+
title: params.title,
|
|
91
|
+
contentMarkdown: params.content_markdown,
|
|
92
|
+
color: params.color,
|
|
93
|
+
tags: params.tags,
|
|
94
|
+
vScore: params.v_score,
|
|
95
|
+
eScore: params.e_score,
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
content: [{
|
|
99
|
+
type: 'text',
|
|
100
|
+
text: JSON.stringify({ node_id: params.node_id, sequence: seq }),
|
|
101
|
+
}],
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
// ── Complete Node ──
|
|
105
|
+
server.tool('complete_node', 'Mark a node as completed. Sets completed=true, completedAt=now, clears heat.', {
|
|
106
|
+
node_id: z.string().describe('Node ID to complete'),
|
|
107
|
+
}, async (params) => {
|
|
108
|
+
rateLimiter.check();
|
|
109
|
+
const s = await ensureSession();
|
|
110
|
+
const seq = await completeNode(s, params.node_id);
|
|
111
|
+
return {
|
|
112
|
+
content: [{
|
|
113
|
+
type: 'text',
|
|
114
|
+
text: JSON.stringify({ node_id: params.node_id, completed: true, sequence: seq }),
|
|
115
|
+
}],
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
// ── Delete Node ──
|
|
119
|
+
server.tool('delete_node', 'Delete a node and all its descendants. Edges are removed automatically.', {
|
|
120
|
+
node_id: z.string().describe('Node ID to delete'),
|
|
121
|
+
}, async (params) => {
|
|
122
|
+
rateLimiter.check();
|
|
123
|
+
const s = await ensureSession();
|
|
124
|
+
const seq = await deleteNode(s, params.node_id);
|
|
125
|
+
return {
|
|
126
|
+
content: [{
|
|
127
|
+
type: 'text',
|
|
128
|
+
text: JSON.stringify({ deleted: params.node_id, sequence: seq }),
|
|
129
|
+
}],
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
// ── Batch Create Nodes ──
|
|
133
|
+
server.tool('batch_create_nodes', 'Create multiple nodes with parent-child relationships in a single atomic operation. Ideal for creating an entire plan/task tree at once. All nodes appear simultaneously.', {
|
|
134
|
+
nodes: z.array(z.object({
|
|
135
|
+
temp_id: z.string().describe('Temporary ID for referencing as parent within this batch'),
|
|
136
|
+
title: z.string().describe('Node title'),
|
|
137
|
+
content_markdown: z.string().optional().describe('Markdown content'),
|
|
138
|
+
parent_temp_id: z.string().optional().describe('temp_id of another node in this batch to use as parent'),
|
|
139
|
+
parent_id: z.string().optional().describe('UUID of an existing node to attach under'),
|
|
140
|
+
type: z.enum(['tasks', 'richtext', 'deadline', 'title']).optional(),
|
|
141
|
+
color: z.string().optional(),
|
|
142
|
+
tags: z.array(z.string()).optional(),
|
|
143
|
+
v_score: z.number().min(0).max(10).optional(),
|
|
144
|
+
e_score: z.number().min(0).max(10).optional(),
|
|
145
|
+
})).describe('Array of nodes to create'),
|
|
146
|
+
}, async (params) => {
|
|
147
|
+
rateLimiter.check();
|
|
148
|
+
const s = await ensureSession();
|
|
149
|
+
const tempToReal = await batchCreateNodes(s, params.nodes);
|
|
150
|
+
const mapping = {};
|
|
151
|
+
for (const [tempId, realId] of tempToReal) {
|
|
152
|
+
mapping[tempId] = realId;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
content: [{
|
|
156
|
+
type: 'text',
|
|
157
|
+
text: JSON.stringify({ created: params.nodes.length, id_mapping: mapping }),
|
|
158
|
+
}],
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
// ── Create Edge ──
|
|
162
|
+
server.tool('create_edge', 'Create a parent-child relationship between two existing nodes.', {
|
|
163
|
+
parent_id: z.string().describe('Parent node ID'),
|
|
164
|
+
child_id: z.string().describe('Child node ID'),
|
|
165
|
+
}, async (params) => {
|
|
166
|
+
rateLimiter.check();
|
|
167
|
+
const s = await ensureSession();
|
|
168
|
+
const seq = await createEdge(s, params.parent_id, params.child_id);
|
|
169
|
+
return {
|
|
170
|
+
content: [{
|
|
171
|
+
type: 'text',
|
|
172
|
+
text: JSON.stringify({ parent_id: params.parent_id, child_id: params.child_id, sequence: seq }),
|
|
173
|
+
}],
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
// ── Move Node ──
|
|
177
|
+
server.tool('move_node', 'Move a node to a new parent (removes old parent edge, creates new one).', {
|
|
178
|
+
node_id: z.string().describe('Node ID to move'),
|
|
179
|
+
new_parent_id: z.string().describe('New parent node ID'),
|
|
180
|
+
}, async (params) => {
|
|
181
|
+
rateLimiter.check();
|
|
182
|
+
const s = await ensureSession();
|
|
183
|
+
const seq = await moveNode(s, params.node_id, params.new_parent_id);
|
|
184
|
+
return {
|
|
185
|
+
content: [{
|
|
186
|
+
type: 'text',
|
|
187
|
+
text: JSON.stringify({ node_id: params.node_id, new_parent_id: params.new_parent_id, sequence: seq }),
|
|
188
|
+
}],
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
// ── Get Tree ──
|
|
192
|
+
server.tool('get_tree', 'Get the full project tree as an indented text outline. Shows title, completion status, tags, and priority score.', {
|
|
193
|
+
max_depth: z.number().optional().describe('Max tree depth (default: unlimited)'),
|
|
194
|
+
include_completed: z.boolean().optional().describe('Include completed nodes (default: false)'),
|
|
195
|
+
}, async (params) => {
|
|
196
|
+
const s = await ensureSession();
|
|
197
|
+
const tree = getTree(s, {
|
|
198
|
+
maxDepth: params.max_depth,
|
|
199
|
+
includeCompleted: params.include_completed,
|
|
200
|
+
});
|
|
201
|
+
return {
|
|
202
|
+
content: [{ type: 'text', text: tree }],
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
// ── Get Node ──
|
|
206
|
+
server.tool('get_node', 'Get full details of a specific node: content, tags, priority, children, completion status.', {
|
|
207
|
+
node_id: z.string().describe('Node ID'),
|
|
208
|
+
}, async (params) => {
|
|
209
|
+
const s = await ensureSession();
|
|
210
|
+
const node = getNode(s, params.node_id);
|
|
211
|
+
if (!node) {
|
|
212
|
+
return {
|
|
213
|
+
content: [{ type: 'text', text: `Node ${params.node_id} not found` }],
|
|
214
|
+
isError: true,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
content: [{ type: 'text', text: JSON.stringify(node, null, 2) }],
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
// ── Find Nodes ──
|
|
222
|
+
server.tool('find_nodes', 'Search nodes by title or content text. Returns matching nodes.', {
|
|
223
|
+
query: z.string().describe('Search text (case-insensitive)'),
|
|
224
|
+
tag: z.string().optional().describe('Filter by tag ID'),
|
|
225
|
+
completed: z.boolean().optional().describe('Filter by completion status'),
|
|
226
|
+
}, async (params) => {
|
|
227
|
+
const s = await ensureSession();
|
|
228
|
+
const results = findNodes(s, {
|
|
229
|
+
query: params.query,
|
|
230
|
+
tag: params.tag,
|
|
231
|
+
completed: params.completed,
|
|
232
|
+
});
|
|
233
|
+
return {
|
|
234
|
+
content: [{
|
|
235
|
+
type: 'text',
|
|
236
|
+
text: JSON.stringify({ count: results.length, results }, null, 2),
|
|
237
|
+
}],
|
|
238
|
+
};
|
|
239
|
+
});
|
|
240
|
+
// ── List Tags ──
|
|
241
|
+
server.tool('list_tags', 'List all tags available in the current project.', {}, async () => {
|
|
242
|
+
const tags = await listTags(supabase, auth.projectId);
|
|
243
|
+
return {
|
|
244
|
+
content: [{
|
|
245
|
+
type: 'text',
|
|
246
|
+
text: JSON.stringify(tags, null, 2),
|
|
247
|
+
}],
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
return server;
|
|
251
|
+
}
|
|
252
|
+
//# 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,10 @@
|
|
|
1
|
+
import type { YjsProjectSession } from '../yjs/YjsProjectSession.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a parent-child edge between two existing nodes
|
|
4
|
+
*/
|
|
5
|
+
export declare function createEdge(session: YjsProjectSession, parentId: string, childId: string): Promise<number>;
|
|
6
|
+
/**
|
|
7
|
+
* Move a node to a new parent
|
|
8
|
+
*/
|
|
9
|
+
export declare function moveNode(session: YjsProjectSession, nodeId: string, newParentId: string): Promise<number>;
|
|
10
|
+
//# sourceMappingURL=edges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../../src/tools/edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIrE;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAEjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { buildEdgeId } from '../utils/nodeDefaults.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a parent-child edge between two existing nodes
|
|
4
|
+
*/
|
|
5
|
+
export async function createEdge(session, parentId, childId) {
|
|
6
|
+
return session.applyChange((doc) => {
|
|
7
|
+
const nodesMap = doc.getMap('nodes');
|
|
8
|
+
const edgesMap = doc.getMap('edges');
|
|
9
|
+
const parentNode = nodesMap.get(parentId);
|
|
10
|
+
if (!parentNode)
|
|
11
|
+
throw new Error(`Parent node ${parentId} not found`);
|
|
12
|
+
const childNode = nodesMap.get(childId);
|
|
13
|
+
if (!childNode)
|
|
14
|
+
throw new Error(`Child node ${childId} not found`);
|
|
15
|
+
// Remove existing parent edge for the child (single-parent invariant)
|
|
16
|
+
if (childNode.relationships.parentId) {
|
|
17
|
+
const oldEdgeId = buildEdgeId(childNode.relationships.parentId, childId);
|
|
18
|
+
edgesMap.delete(oldEdgeId);
|
|
19
|
+
// Remove child from old parent's childIds
|
|
20
|
+
const oldParent = nodesMap.get(childNode.relationships.parentId);
|
|
21
|
+
if (oldParent) {
|
|
22
|
+
nodesMap.set(childNode.relationships.parentId, {
|
|
23
|
+
...oldParent,
|
|
24
|
+
relationships: {
|
|
25
|
+
...oldParent.relationships,
|
|
26
|
+
childIds: (oldParent.relationships.childIds || []).filter((id) => id !== childId),
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Create new edge
|
|
32
|
+
const edgeId = buildEdgeId(parentId, childId);
|
|
33
|
+
edgesMap.set(edgeId, { id: edgeId, source: parentId, target: childId });
|
|
34
|
+
// Update parent's childIds
|
|
35
|
+
nodesMap.set(parentId, {
|
|
36
|
+
...parentNode,
|
|
37
|
+
relationships: {
|
|
38
|
+
...parentNode.relationships,
|
|
39
|
+
childIds: [...(parentNode.relationships.childIds || []), childId],
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
// Update child's parentId
|
|
43
|
+
nodesMap.set(childId, {
|
|
44
|
+
...childNode,
|
|
45
|
+
relationships: {
|
|
46
|
+
...childNode.relationships,
|
|
47
|
+
parentId,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Move a node to a new parent
|
|
54
|
+
*/
|
|
55
|
+
export async function moveNode(session, nodeId, newParentId) {
|
|
56
|
+
return createEdge(session, newParentId, nodeId);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edges.js","sourceRoot":"","sources":["../../src/tools/edges.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA0B,EAC1B,QAAgB,EAChB,OAAe;IAEf,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAyB,CAAC;QAClE,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,YAAY,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAyB,CAAC;QAChE,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,YAAY,CAAC,CAAC;QAEnE,sEAAsE;QACtE,IAAI,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACzE,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE3B,0CAA0C;YAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAyB,CAAC;YACzF,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE;oBAC7C,GAAG,SAAS;oBACZ,aAAa,EAAE;wBACb,GAAG,SAAS,CAAC,aAAa;wBAC1B,QAAQ,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CACvD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CACvB;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAExE,2BAA2B;QAC3B,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;YACrB,GAAG,UAAU;YACb,aAAa,EAAE;gBACb,GAAG,UAAU,CAAC,aAAa;gBAC3B,QAAQ,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC;aAClE;SACF,CAAC,CAAC;QAEH,0BAA0B;QAC1B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;YACpB,GAAG,SAAS;YACZ,aAAa,EAAE;gBACb,GAAG,SAAS,CAAC,aAAa;gBAC1B,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,OAA0B,EAC1B,MAAc,EACd,WAAmB;IAEnB,OAAO,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { YjsProjectSession } from '../yjs/YjsProjectSession.js';
|
|
2
|
+
import type { NodeData, CreateNodeParams, BatchNodeInput } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a single node in the Y.Doc
|
|
5
|
+
*/
|
|
6
|
+
export declare function createNode(session: YjsProjectSession, params: CreateNodeParams): Promise<{
|
|
7
|
+
nodeId: string;
|
|
8
|
+
seq: number;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Update an existing node's properties (partial update)
|
|
12
|
+
*/
|
|
13
|
+
export declare function updateNode(session: YjsProjectSession, nodeId: string, updates: Partial<Pick<NodeData, 'title' | 'contentMarkdown' | 'color' | 'tags' | 'vScore' | 'eScore'>>): Promise<number>;
|
|
14
|
+
/**
|
|
15
|
+
* Mark a node as completed
|
|
16
|
+
*/
|
|
17
|
+
export declare function completeNode(session: YjsProjectSession, nodeId: string): Promise<number>;
|
|
18
|
+
/**
|
|
19
|
+
* Delete a node and all its descendants recursively
|
|
20
|
+
*/
|
|
21
|
+
export declare function deleteNode(session: YjsProjectSession, nodeId: string): Promise<number>;
|
|
22
|
+
/**
|
|
23
|
+
* Batch create multiple nodes with temp_id references (atomic)
|
|
24
|
+
*/
|
|
25
|
+
export declare function batchCreateNodes(session: YjsProjectSession, inputs: BatchNodeInput[]): Promise<Map<string, string>>;
|
|
26
|
+
//# sourceMappingURL=nodes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/tools/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG9E;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA6B1C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,GACrG,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,cAAc,EAAE,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwE9B"}
|