@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,45 @@
1
+ import * as Y from 'yjs';
2
+ import type { SupabaseClient } from '@supabase/supabase-js';
3
+ export declare class YjsProjectSession {
4
+ private yDoc;
5
+ private channel;
6
+ private supabase;
7
+ private projectId;
8
+ private connected;
9
+ constructor(supabase: SupabaseClient, projectId: string);
10
+ /**
11
+ * Load project state: snapshot + incremental updates
12
+ * Uses the EXISTING load_yjs_state_efficient RPC (no modifications)
13
+ */
14
+ load(): Promise<{
15
+ nodeCount: number;
16
+ edgeCount: number;
17
+ }>;
18
+ /**
19
+ * Connect to Realtime channel for bidirectional sync
20
+ */
21
+ connectRealtime(): Promise<void>;
22
+ /**
23
+ * Apply a mutation to the Y.Doc, save the delta, and broadcast
24
+ * Uses the EXISTING save_yjs_update RPC (no modifications)
25
+ */
26
+ applyChange(fn: (doc: Y.Doc) => void): Promise<number>;
27
+ /**
28
+ * Broadcast an update via Realtime channel
29
+ */
30
+ private broadcast;
31
+ /**
32
+ * Disconnect from Realtime
33
+ */
34
+ disconnect(): Promise<void>;
35
+ /**
36
+ * Access the Y.Doc for read operations
37
+ */
38
+ getDoc(): Y.Doc;
39
+ /**
40
+ * Check if Realtime is connected
41
+ */
42
+ isConnected(): boolean;
43
+ getProjectId(): string;
44
+ }
45
+ //# sourceMappingURL=YjsProjectSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YjsProjectSession.d.ts","sourceRoot":"","sources":["../../src/yjs/YjsProjectSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAG7E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IAMvD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC/D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtC;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC5D;;OAEG;YACW,SAAS;IAkBvB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC,GAAG;IAIf;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,129 @@
1
+ import * as Y from 'yjs';
2
+ import { uint8ArrayToBase64, base64ToUint8Array } from './BinaryEncoding.js';
3
+ export class YjsProjectSession {
4
+ yDoc;
5
+ channel = null;
6
+ supabase;
7
+ projectId;
8
+ connected = false;
9
+ constructor(supabase, projectId) {
10
+ this.supabase = supabase;
11
+ this.projectId = projectId;
12
+ this.yDoc = new Y.Doc();
13
+ }
14
+ /**
15
+ * Load project state: snapshot + incremental updates
16
+ * Uses the EXISTING load_yjs_state_efficient RPC (no modifications)
17
+ */
18
+ async load() {
19
+ const { data, error } = await this.supabase.rpc('load_yjs_state_efficient', {
20
+ p_project_id: this.projectId,
21
+ });
22
+ if (error) {
23
+ throw new Error(`Failed to load project: ${error.message}`);
24
+ }
25
+ if (data && data.length > 0) {
26
+ const state = data[0];
27
+ // Apply snapshot
28
+ if (state.snapshot_base64) {
29
+ Y.applyUpdate(this.yDoc, base64ToUint8Array(state.snapshot_base64), 'remote');
30
+ }
31
+ // Apply incremental updates
32
+ if (state.updates && Array.isArray(state.updates)) {
33
+ for (const updateBase64 of state.updates) {
34
+ Y.applyUpdate(this.yDoc, base64ToUint8Array(updateBase64), 'remote');
35
+ }
36
+ }
37
+ }
38
+ const nodeCount = this.yDoc.getMap('nodes').size;
39
+ const edgeCount = this.yDoc.getMap('edges').size;
40
+ return { nodeCount, edgeCount };
41
+ }
42
+ /**
43
+ * Connect to Realtime channel for bidirectional sync
44
+ */
45
+ async connectRealtime() {
46
+ this.channel = this.supabase.channel(`yjs-project-${this.projectId}`);
47
+ // Listen for updates from the web app
48
+ this.channel.on('broadcast', { event: 'yjs-update' }, ({ payload }) => {
49
+ if (payload.clientId === this.yDoc.clientID)
50
+ return; // Skip own
51
+ Y.applyUpdate(this.yDoc, new Uint8Array(payload.update), 'remote');
52
+ });
53
+ await this.channel.subscribe();
54
+ this.connected = true;
55
+ }
56
+ /**
57
+ * Apply a mutation to the Y.Doc, save the delta, and broadcast
58
+ * Uses the EXISTING save_yjs_update RPC (no modifications)
59
+ */
60
+ async applyChange(fn) {
61
+ let capturedUpdate = null;
62
+ const listener = (update, origin) => {
63
+ if (origin !== 'remote') {
64
+ capturedUpdate = update;
65
+ }
66
+ };
67
+ this.yDoc.on('update', listener);
68
+ this.yDoc.transact(() => fn(this.yDoc), 'local');
69
+ this.yDoc.off('update', listener);
70
+ if (!capturedUpdate)
71
+ return -1; // No-op
72
+ // Save to DB via existing RPC
73
+ const { data, error } = await this.supabase.rpc('save_yjs_update', {
74
+ p_project_id: this.projectId,
75
+ p_update_base64: uint8ArrayToBase64(capturedUpdate),
76
+ p_client_id: this.yDoc.clientID,
77
+ });
78
+ if (error) {
79
+ throw new Error(`Failed to save update: ${error.message}`);
80
+ }
81
+ const sequenceNumber = data;
82
+ // Broadcast to web app
83
+ await this.broadcast(capturedUpdate, sequenceNumber);
84
+ return sequenceNumber;
85
+ }
86
+ /**
87
+ * Broadcast an update via Realtime channel
88
+ */
89
+ async broadcast(update, seq) {
90
+ if (!this.channel)
91
+ return;
92
+ await this.channel.send({
93
+ type: 'broadcast',
94
+ event: 'yjs-update',
95
+ payload: {
96
+ sequence: seq,
97
+ update: Array.from(update),
98
+ clientId: this.yDoc.clientID,
99
+ timestamp: Date.now(),
100
+ },
101
+ });
102
+ }
103
+ /**
104
+ * Disconnect from Realtime
105
+ */
106
+ async disconnect() {
107
+ if (this.channel) {
108
+ await this.supabase.removeChannel(this.channel);
109
+ this.channel = null;
110
+ }
111
+ this.connected = false;
112
+ }
113
+ /**
114
+ * Access the Y.Doc for read operations
115
+ */
116
+ getDoc() {
117
+ return this.yDoc;
118
+ }
119
+ /**
120
+ * Check if Realtime is connected
121
+ */
122
+ isConnected() {
123
+ return this.connected;
124
+ }
125
+ getProjectId() {
126
+ return this.projectId;
127
+ }
128
+ }
129
+ //# sourceMappingURL=YjsProjectSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YjsProjectSession.js","sourceRoot":"","sources":["../../src/yjs/YjsProjectSession.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@develosaur/mcp",
3
+ "version": "1.0.0",
4
+ "description": "Develosaur MCP server — AI agents track development progress in real-time",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "develosaur-mcp": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "dependencies": {
16
+ "@modelcontextprotocol/sdk": "^1.12.1",
17
+ "@supabase/supabase-js": "^2.49.4",
18
+ "yjs": "^13.6.24"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "^5.7.0",
22
+ "@types/node": "^22.0.0"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md"
27
+ ],
28
+ "keywords": [
29
+ "mcp",
30
+ "develosaur",
31
+ "project-management",
32
+ "ai-agent",
33
+ "model-context-protocol"
34
+ ],
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ }
39
+ }