@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.
Files changed (45) hide show
  1. package/dist/auth/ApiKeyAuth.d.ts +23 -0
  2. package/dist/auth/ApiKeyAuth.d.ts.map +1 -0
  3. package/dist/auth/ApiKeyAuth.js +119 -0
  4. package/dist/auth/ApiKeyAuth.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +23 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/server.d.ts +5 -0
  10. package/dist/server.d.ts.map +1 -0
  11. package/dist/server.js +252 -0
  12. package/dist/server.js.map +1 -0
  13. package/dist/tools/edges.d.ts +10 -0
  14. package/dist/tools/edges.d.ts.map +1 -0
  15. package/dist/tools/edges.js +58 -0
  16. package/dist/tools/edges.js.map +1 -0
  17. package/dist/tools/nodes.d.ts +26 -0
  18. package/dist/tools/nodes.d.ts.map +1 -0
  19. package/dist/tools/nodes.js +188 -0
  20. package/dist/tools/nodes.js.map +1 -0
  21. package/dist/tools/query.d.ts +27 -0
  22. package/dist/tools/query.d.ts.map +1 -0
  23. package/dist/tools/query.js +133 -0
  24. package/dist/tools/query.js.map +1 -0
  25. package/dist/types.d.ts +97 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +6 -0
  28. package/dist/types.js.map +1 -0
  29. package/dist/utils/nodeDefaults.d.ts +14 -0
  30. package/dist/utils/nodeDefaults.d.ts.map +1 -0
  31. package/dist/utils/nodeDefaults.js +49 -0
  32. package/dist/utils/nodeDefaults.js.map +1 -0
  33. package/dist/utils/rateLimiter.d.ts +11 -0
  34. package/dist/utils/rateLimiter.d.ts.map +1 -0
  35. package/dist/utils/rateLimiter.js +32 -0
  36. package/dist/utils/rateLimiter.js.map +1 -0
  37. package/dist/yjs/BinaryEncoding.d.ts +7 -0
  38. package/dist/yjs/BinaryEncoding.d.ts.map +1 -0
  39. package/dist/yjs/BinaryEncoding.js +11 -0
  40. package/dist/yjs/BinaryEncoding.js.map +1 -0
  41. package/dist/yjs/YjsProjectSession.d.ts +45 -0
  42. package/dist/yjs/YjsProjectSession.d.ts.map +1 -0
  43. package/dist/yjs/YjsProjectSession.js +129 -0
  44. package/dist/yjs/YjsProjectSession.js.map +1 -0
  45. 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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,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"}
@@ -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"}