project-graph-mcp 2.2.6 → 2.3.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/ARCHITECTURE.md +81 -0
- package/CHANGELOG.md +57 -0
- package/README.md +9 -4
- package/package.json +6 -13
- package/src/compact/expand.js +1 -1
- package/src/core/graph-builder.js +2 -2
- package/src/core/parser.js +2 -2
- package/src/network/server.js +1 -2
- package/vendor/symbiote-node/CHANGELOG.md +31 -0
- package/vendor/symbiote-node/LICENSE +21 -0
- package/vendor/symbiote-node/README.md +206 -0
- package/vendor/symbiote-node/canvas/AutoLayout.js +725 -0
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.css.js +73 -0
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.js +93 -0
- package/vendor/symbiote-node/canvas/Breadcrumb/Breadcrumb.tpl.js +9 -0
- package/vendor/symbiote-node/canvas/CanvasConnectionRenderer.js +962 -0
- package/vendor/symbiote-node/canvas/ConnectionRenderer.js +1468 -0
- package/vendor/symbiote-node/canvas/FlowSimulator.js +323 -0
- package/vendor/symbiote-node/canvas/ForceLayout.js +189 -0
- package/vendor/symbiote-node/canvas/ForceWorker.js +1325 -0
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.css.js +97 -0
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.js +176 -0
- package/vendor/symbiote-node/canvas/GraphTabs/GraphTabs.tpl.js +12 -0
- package/vendor/symbiote-node/canvas/LODManager.js +88 -0
- package/vendor/symbiote-node/canvas/Minimap/Minimap.css.js +71 -0
- package/vendor/symbiote-node/canvas/Minimap/Minimap.js +207 -0
- package/vendor/symbiote-node/canvas/Minimap/Minimap.tpl.js +9 -0
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.css.js +261 -0
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.js +1840 -0
- package/vendor/symbiote-node/canvas/NodeCanvas/NodeCanvas.tpl.js +22 -0
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.css.js +97 -0
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.js +132 -0
- package/vendor/symbiote-node/canvas/NodeSearch/NodeSearch.tpl.js +21 -0
- package/vendor/symbiote-node/canvas/NodeViewManager.js +584 -0
- package/vendor/symbiote-node/canvas/PinExpansion.js +131 -0
- package/vendor/symbiote-node/canvas/PseudoConnection.js +80 -0
- package/vendor/symbiote-node/canvas/SubgraphManager.js +201 -0
- package/vendor/symbiote-node/canvas/SubgraphRouter.js +443 -0
- package/vendor/symbiote-node/canvas/ViewportActions.js +446 -0
- package/vendor/symbiote-node/core/Connection.js +45 -0
- package/vendor/symbiote-node/core/Editor.js +451 -0
- package/vendor/symbiote-node/core/Frame.js +31 -0
- package/vendor/symbiote-node/core/GraphMermaid.js +348 -0
- package/vendor/symbiote-node/core/GraphText.js +210 -0
- package/vendor/symbiote-node/core/Node.js +143 -0
- package/vendor/symbiote-node/core/Portal.js +104 -0
- package/vendor/symbiote-node/core/Socket.js +185 -0
- package/vendor/symbiote-node/core/SubgraphNode.js +125 -0
- package/vendor/symbiote-node/index.js +103 -0
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.css.js +361 -0
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.js +332 -0
- package/vendor/symbiote-node/inspector/InspectorPanel/InspectorPanel.tpl.js +96 -0
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.css.js +104 -0
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.js +133 -0
- package/vendor/symbiote-node/inspector/TemplatePreview/TemplatePreview.tpl.js +33 -0
- package/vendor/symbiote-node/interactions/ConnectFlow.js +307 -0
- package/vendor/symbiote-node/interactions/Drag.js +102 -0
- package/vendor/symbiote-node/interactions/Selector.js +132 -0
- package/vendor/symbiote-node/interactions/SnapGrid.js +65 -0
- package/vendor/symbiote-node/interactions/Zoom.js +140 -0
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.css.js +88 -0
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.js +254 -0
- package/vendor/symbiote-node/layout/ActionZone/ActionZone.tpl.js +11 -0
- package/vendor/symbiote-node/layout/Layout/Layout.css.js +88 -0
- package/vendor/symbiote-node/layout/Layout/Layout.js +622 -0
- package/vendor/symbiote-node/layout/Layout/Layout.tpl.js +25 -0
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.css.js +293 -0
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.js +467 -0
- package/vendor/symbiote-node/layout/LayoutNode/LayoutNode.tpl.js +33 -0
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.css.js +46 -0
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.js +102 -0
- package/vendor/symbiote-node/layout/LayoutPreview/LayoutPreview.tpl.js +6 -0
- package/vendor/symbiote-node/layout/LayoutRouter/LayoutRouter.js +156 -0
- package/vendor/symbiote-node/layout/LayoutRouter/routerSync.js +250 -0
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.css.js +379 -0
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.js +263 -0
- package/vendor/symbiote-node/layout/LayoutSidebar/LayoutSidebar.tpl.js +20 -0
- package/vendor/symbiote-node/layout/LayoutSidebar/SidebarSection.js +183 -0
- package/vendor/symbiote-node/layout/LayoutTree.js +246 -0
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.css.js +43 -0
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.js +89 -0
- package/vendor/symbiote-node/layout/PanelMenu/PanelMenu.tpl.js +14 -0
- package/vendor/symbiote-node/layout/index.js +16 -0
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.css.js +61 -0
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.js +79 -0
- package/vendor/symbiote-node/menu/ContextMenu/ContextMenu.tpl.js +19 -0
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.css.js +41 -0
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.js +24 -0
- package/vendor/symbiote-node/node/CtrlItem/CtrlItem.tpl.js +16 -0
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.css.js +65 -0
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.js +29 -0
- package/vendor/symbiote-node/node/GraphFrame/GraphFrame.tpl.js +13 -0
- package/vendor/symbiote-node/node/GraphNode/GraphNode.css.js +683 -0
- package/vendor/symbiote-node/node/GraphNode/GraphNode.js +92 -0
- package/vendor/symbiote-node/node/GraphNode/GraphNode.tpl.js +17 -0
- package/vendor/symbiote-node/node/NodeSocket/NodeSocket.js +25 -0
- package/vendor/symbiote-node/node/NodeSocket/NodeSocket.tpl.js +7 -0
- package/vendor/symbiote-node/node/PortItem/PortItem.css.js +90 -0
- package/vendor/symbiote-node/node/PortItem/PortItem.js +87 -0
- package/vendor/symbiote-node/node/PortItem/PortItem.tpl.js +10 -0
- package/vendor/symbiote-node/package.json +59 -0
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.css.js +143 -0
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.js +131 -0
- package/vendor/symbiote-node/palette/PaletteBrowser/PaletteBrowser.tpl.js +16 -0
- package/vendor/symbiote-node/plugins/History.js +384 -0
- package/vendor/symbiote-node/plugins/Readonly.js +59 -0
- package/vendor/symbiote-node/shapes/CircleShape.js +80 -0
- package/vendor/symbiote-node/shapes/CommentShape.js +35 -0
- package/vendor/symbiote-node/shapes/DiamondShape.js +115 -0
- package/vendor/symbiote-node/shapes/NodeShape.js +80 -0
- package/vendor/symbiote-node/shapes/PillShape.js +91 -0
- package/vendor/symbiote-node/shapes/RectShape.js +72 -0
- package/vendor/symbiote-node/shapes/SVGShape.js +494 -0
- package/vendor/symbiote-node/shapes/index.js +53 -0
- package/vendor/symbiote-node/themes/Palette.js +32 -0
- package/vendor/symbiote-node/themes/Skin.js +113 -0
- package/vendor/symbiote-node/themes/Theme.js +84 -0
- package/vendor/symbiote-node/themes/carbon.js +137 -0
- package/vendor/symbiote-node/themes/dark.js +137 -0
- package/vendor/symbiote-node/themes/ebook.js +138 -0
- package/vendor/symbiote-node/themes/grey.js +137 -0
- package/vendor/symbiote-node/themes/light.js +137 -0
- package/vendor/symbiote-node/themes/neon.js +138 -0
- package/vendor/symbiote-node/themes/pcb.js +273 -0
- package/vendor/symbiote-node/themes/synthwave.js +137 -0
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.css.js +86 -0
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.js +128 -0
- package/vendor/symbiote-node/toolbar/QuickToolbar/QuickToolbar.tpl.js +29 -0
- package/web/app.js +6 -5
- package/web/components/canvas-graph.js +1666 -0
- package/web/components/event-feed/CodeWidget.js +32 -0
- package/web/components/event-feed/EventWidget.js +97 -0
- package/web/components/event-feed/ListWidget.js +57 -0
- package/web/components/event-feed/MiniGraphWidget.js +69 -0
- package/web/dashboard.js +1 -1
- package/web/index.html +4 -0
- package/web/panels/ActionBoard/ActionBoard.js +1 -1
- package/web/panels/SettingsPanel/SettingsPanel.tpl.js +1 -1
- package/web/panels/code-viewer.js +50 -15
- package/web/panels/dep-graph.js +2712 -7
- package/web/panels/file-tree.js +5 -2
- package/web/panels/live-monitor.js +75 -3
- package/web/style.css +33 -0
- package/docs/img/explorer-compact.jpg +0 -0
- package/docs/img/explorer-expanded.jpg +0 -0
- package/src/.contextignore +0 -22
- package/src/.project-graph-cache.json +0 -1
- package/src/compact/.project-graph-cache.json +0 -1
- package/web/.project-graph-cache.json +0 -1
- package/web/panels/SettingsPanel/.project-graph-cache.json +0 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeShape — abstract base class for node geometry
|
|
3
|
+
*
|
|
4
|
+
* Defines socket placement strategy and outline path for any node shape.
|
|
5
|
+
* Each shape determines WHERE sockets appear and at WHAT ANGLE
|
|
6
|
+
* connections should exit/enter.
|
|
7
|
+
*
|
|
8
|
+
* @module symbiote-node/shapes/NodeShape
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export class NodeShape {
|
|
12
|
+
|
|
13
|
+
/** @type {string} */
|
|
14
|
+
name = 'base';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get socket position on the shape outline
|
|
18
|
+
* @param {'input'|'output'} side
|
|
19
|
+
* @param {number} index - ordinal index of this port
|
|
20
|
+
* @param {number} total - total ports on this side
|
|
21
|
+
* @param {{ width: number, height: number }} size - node dimensions
|
|
22
|
+
* @returns {{ x: number, y: number, angle: number }}
|
|
23
|
+
* x, y are relative to node top-left corner
|
|
24
|
+
* angle is in degrees: 0 = right, 90 = down, 180 = left, 270 = up
|
|
25
|
+
*/
|
|
26
|
+
getSocketPosition(side, index, total, size) {
|
|
27
|
+
throw new Error('getSocketPosition must be implemented');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get SVG outline path for the shape
|
|
32
|
+
* @param {{ width: number, height: number }} size
|
|
33
|
+
* @returns {string} SVG path d attribute
|
|
34
|
+
*/
|
|
35
|
+
getOutlinePath(size) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* CSS border-radius value for the shape
|
|
41
|
+
* @param {{ width: number, height: number }} size
|
|
42
|
+
* @returns {string}
|
|
43
|
+
*/
|
|
44
|
+
getBorderRadius(size) {
|
|
45
|
+
return 'var(--sn-node-radius, 10px)';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether this shape uses standard header+body layout
|
|
50
|
+
* @returns {boolean}
|
|
51
|
+
*/
|
|
52
|
+
get hasHeader() {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Whether this shape supports embedded controls
|
|
58
|
+
* @returns {boolean}
|
|
59
|
+
*/
|
|
60
|
+
get hasControls() {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* CSS clip-path for non-rectangular shapes
|
|
66
|
+
* @param {{ width: number, height: number }} size
|
|
67
|
+
* @returns {string|null} null = no clip
|
|
68
|
+
*/
|
|
69
|
+
getClipPath(size) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Minimum node dimensions for this shape
|
|
75
|
+
* @returns {{ minWidth: number, minHeight: number }}
|
|
76
|
+
*/
|
|
77
|
+
getMinSize() {
|
|
78
|
+
return { minWidth: 180, minHeight: 60 };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PillShape — compact horizontal pill node
|
|
3
|
+
*
|
|
4
|
+
* Small node with rounded ends, label centered, 1 input left, 1 output right.
|
|
5
|
+
* No header, no controls. Ideal for simple operations (multiply, add, etc.)
|
|
6
|
+
*
|
|
7
|
+
* @module symbiote-node/shapes/PillShape
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { NodeShape } from './NodeShape.js';
|
|
11
|
+
|
|
12
|
+
export class PillShape extends NodeShape {
|
|
13
|
+
name = 'pill';
|
|
14
|
+
|
|
15
|
+
getSocketPosition(side, index, total, { width, height }) {
|
|
16
|
+
const r = height / 2;
|
|
17
|
+
if (total <= 1) {
|
|
18
|
+
return {
|
|
19
|
+
x: side === 'input' ? 0 : width,
|
|
20
|
+
y: height / 2,
|
|
21
|
+
angle: side === 'input' ? 180 : 0,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Multiple sockets: distribute along the rounded end
|
|
26
|
+
const arcAngle = Math.PI * 0.6; // 108 degrees arc
|
|
27
|
+
const startAngle = side === 'input' ? Math.PI - arcAngle / 2 : -arcAngle / 2;
|
|
28
|
+
const step = arcAngle / (total - 1);
|
|
29
|
+
const a = startAngle + step * index;
|
|
30
|
+
|
|
31
|
+
const cx = side === 'input' ? r : width - r;
|
|
32
|
+
return {
|
|
33
|
+
x: cx + r * Math.cos(a),
|
|
34
|
+
y: height / 2 + r * Math.sin(a),
|
|
35
|
+
angle: (a * 180) / Math.PI,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get pin position on a specific side of the pill.
|
|
41
|
+
* Left/right follow the rounded semicircle arc.
|
|
42
|
+
* Top/bottom follow the flat straight edge.
|
|
43
|
+
*
|
|
44
|
+
* @param {'top'|'right'|'bottom'|'left'} side
|
|
45
|
+
* @param {number} t - position along the side (0..1)
|
|
46
|
+
* @param {{ width: number, height: number }} size
|
|
47
|
+
* @returns {{ x: number, y: number, angle: number }}
|
|
48
|
+
*/
|
|
49
|
+
getSidePosition(side, t, size) {
|
|
50
|
+
const NORMALS = { top: -90, right: 0, bottom: 90, left: 180 };
|
|
51
|
+
const MARGIN = 0.2;
|
|
52
|
+
const effectiveT = MARGIN + t * (1 - 2 * MARGIN);
|
|
53
|
+
const r = size.height / 2;
|
|
54
|
+
|
|
55
|
+
if (side === 'top' || side === 'bottom') {
|
|
56
|
+
// Flat edge between the two semicircles
|
|
57
|
+
const x = r + effectiveT * (size.width - 2 * r);
|
|
58
|
+
const y = side === 'top' ? 0 : size.height;
|
|
59
|
+
return { x, y, angle: NORMALS[side] };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Rounded semicircle ends
|
|
63
|
+
const arcSpan = Math.PI * 0.8; // 144° arc
|
|
64
|
+
const cx = side === 'left' ? r : size.width - r;
|
|
65
|
+
const centerAngle = side === 'left' ? Math.PI : 0;
|
|
66
|
+
const startAngle = centerAngle - arcSpan / 2;
|
|
67
|
+
const a = startAngle + arcSpan * effectiveT;
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
x: cx + r * Math.cos(a),
|
|
71
|
+
y: size.height / 2 + r * Math.sin(a),
|
|
72
|
+
angle: (a * 180) / Math.PI,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
getBorderRadius({ height }) {
|
|
77
|
+
return `${height / 2}px`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get hasHeader() {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get hasControls() {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
getMinSize() {
|
|
89
|
+
return { minWidth: 100, minHeight: 40 };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RectShape — standard rectangular node card
|
|
3
|
+
*
|
|
4
|
+
* Sockets arranged vertically on left (inputs) and right (outputs).
|
|
5
|
+
* Default shape for most nodes.
|
|
6
|
+
*
|
|
7
|
+
* @module symbiote-node/shapes/RectShape
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { NodeShape } from './NodeShape.js';
|
|
11
|
+
|
|
12
|
+
export class RectShape extends NodeShape {
|
|
13
|
+
name = 'rect';
|
|
14
|
+
|
|
15
|
+
/** @type {number} */
|
|
16
|
+
#headerHeight;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {object} [config]
|
|
20
|
+
* @param {number} [config.headerHeight=36] - Height of header area
|
|
21
|
+
*/
|
|
22
|
+
constructor(config = {}) {
|
|
23
|
+
super();
|
|
24
|
+
this.#headerHeight = config.headerHeight || 36;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
getSocketPosition(side, index, total, { width, height }) {
|
|
28
|
+
const bodyHeight = height - this.#headerHeight;
|
|
29
|
+
const spacing = bodyHeight / (total + 1);
|
|
30
|
+
const y = this.#headerHeight + spacing * (index + 1);
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
x: side === 'input' ? 0 : width,
|
|
34
|
+
y,
|
|
35
|
+
angle: side === 'input' ? 180 : 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get pin position on a specific side of the rectangle.
|
|
41
|
+
* Required for PCB path style — without this, ConnectionRenderer
|
|
42
|
+
* skips rect nodes entirely.
|
|
43
|
+
*
|
|
44
|
+
* @param {'top'|'right'|'bottom'|'left'} side
|
|
45
|
+
* @param {number} t - position along the side (0..1), 0.5 = center
|
|
46
|
+
* @param {{ width: number, height: number }} size
|
|
47
|
+
* @returns {{ x: number, y: number, angle: number }}
|
|
48
|
+
*/
|
|
49
|
+
getSidePosition(side, t, size) {
|
|
50
|
+
const NORMALS = { top: -90, right: 0, bottom: 90, left: 180 };
|
|
51
|
+
const MARGIN = 0.2;
|
|
52
|
+
const effectiveT = MARGIN + t * (1 - 2 * MARGIN);
|
|
53
|
+
|
|
54
|
+
let x, y;
|
|
55
|
+
switch (side) {
|
|
56
|
+
case 'top': x = size.width * effectiveT; y = 0; break;
|
|
57
|
+
case 'right': x = size.width; y = size.height * effectiveT; break;
|
|
58
|
+
case 'bottom': x = size.width * effectiveT; y = size.height; break;
|
|
59
|
+
case 'left': x = 0; y = size.height * effectiveT; break;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return { x, y, angle: NORMALS[side] };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
getBorderRadius() {
|
|
66
|
+
return 'var(--sn-node-radius, 10px)';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
getMinSize() {
|
|
70
|
+
return { minWidth: 180, minHeight: 60 };
|
|
71
|
+
}
|
|
72
|
+
}
|