flowspec-mcp 5.5.0 → 5.5.2

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 (71) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/analysisUtils.d.ts +36 -0
  3. package/dist/analysis/analysisUtils.js +284 -0
  4. package/dist/analysis/analysisUtils.js.map +1 -0
  5. package/dist/db.js +19 -3
  6. package/dist/db.js.map +1 -1
  7. package/dist/export/jsonExporter.js +1 -1
  8. package/dist/export/jsonExporter.js.map +1 -1
  9. package/dist/export/yamlExporter.d.ts +6 -0
  10. package/dist/export/yamlExporter.js +155 -0
  11. package/dist/export/yamlExporter.js.map +1 -0
  12. package/dist/import/yamlImporter.d.ts +22 -0
  13. package/dist/import/yamlImporter.js +227 -0
  14. package/dist/import/yamlImporter.js.map +1 -0
  15. package/dist/index.js +0 -0
  16. package/dist/layout/semanticLayout.d.ts +24 -0
  17. package/dist/layout/semanticLayout.js +233 -0
  18. package/dist/layout/semanticLayout.js.map +1 -0
  19. package/dist/normalise.d.ts +1 -1
  20. package/dist/normalise.js +9 -0
  21. package/dist/normalise.js.map +1 -1
  22. package/dist/resources/selection.d.ts +5 -0
  23. package/dist/resources/selection.js +88 -0
  24. package/dist/resources/selection.js.map +1 -0
  25. package/dist/tools/captureScreen.d.ts +48 -0
  26. package/dist/tools/captureScreen.js +135 -0
  27. package/dist/tools/captureScreen.js.map +1 -0
  28. package/dist/tools/createNode.d.ts +3 -3
  29. package/dist/tools/createNode.js +1 -1
  30. package/dist/tools/createNode.js.map +1 -1
  31. package/dist/tools/createSubview.d.ts +50 -0
  32. package/dist/tools/createSubview.js +29 -0
  33. package/dist/tools/createSubview.js.map +1 -0
  34. package/dist/tools/deleteSubview.d.ts +24 -0
  35. package/dist/tools/deleteSubview.js +19 -0
  36. package/dist/tools/deleteSubview.js.map +1 -0
  37. package/dist/tools/generateSpec.d.ts +26 -0
  38. package/dist/tools/generateSpec.js +336 -0
  39. package/dist/tools/generateSpec.js.map +1 -0
  40. package/dist/tools/getYaml.d.ts +21 -0
  41. package/dist/tools/getYaml.js +23 -0
  42. package/dist/tools/getYaml.js.map +1 -0
  43. package/dist/tools/healthCheck.d.ts +8 -0
  44. package/dist/tools/healthCheck.js +16 -0
  45. package/dist/tools/healthCheck.js.map +1 -0
  46. package/dist/tools/importYaml.d.ts +33 -0
  47. package/dist/tools/importYaml.js +97 -0
  48. package/dist/tools/importYaml.js.map +1 -0
  49. package/dist/tools/ingestCodebase.d.ts +27 -0
  50. package/dist/tools/ingestCodebase.js +516 -0
  51. package/dist/tools/ingestCodebase.js.map +1 -0
  52. package/dist/tools/listSubviews.d.ts +21 -0
  53. package/dist/tools/listSubviews.js +34 -0
  54. package/dist/tools/listSubviews.js.map +1 -0
  55. package/dist/tools/searchNodes.d.ts +3 -3
  56. package/dist/tools/searchNodes.js +1 -1
  57. package/dist/tools/searchNodes.js.map +1 -1
  58. package/dist/tools/smartLayout.d.ts +30 -0
  59. package/dist/tools/smartLayout.js +74 -0
  60. package/dist/tools/smartLayout.js.map +1 -0
  61. package/dist/tools/updateNode.js.map +1 -1
  62. package/dist/tools/updateSubview.d.ts +53 -0
  63. package/dist/tools/updateSubview.js +33 -0
  64. package/dist/tools/updateSubview.js.map +1 -0
  65. package/dist/tools/validateProject.js +2 -2
  66. package/dist/tools/validateProject.js.map +1 -1
  67. package/dist/types.d.ts +6 -0
  68. package/dist/utils/selectionHelper.d.ts +61 -0
  69. package/dist/utils/selectionHelper.js +111 -0
  70. package/dist/utils/selectionHelper.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { MODE, LOCAL_API_BASE, getLocalAuthToken } from '../config.js';
2
+ /**
3
+ * Fetch current selection state from desktop server
4
+ */
5
+ export async function fetchCurrentSelection() {
6
+ if (MODE !== 'local') {
7
+ return null;
8
+ }
9
+ try {
10
+ const token = getLocalAuthToken();
11
+ const headers = {
12
+ 'Content-Type': 'application/json',
13
+ };
14
+ if (token) {
15
+ headers['Authorization'] = `Bearer ${token}`;
16
+ }
17
+ const res = await fetch(`${LOCAL_API_BASE}/api/selection/current`, {
18
+ headers,
19
+ signal: AbortSignal.timeout(2000)
20
+ });
21
+ if (!res.ok) {
22
+ return null;
23
+ }
24
+ return res.json();
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Resolve "current" node ID to the actual selected node ID.
32
+ *
33
+ * @param nodeId - Either a real UUID or the string "current"
34
+ * @param projectId - Optional project ID to validate selection matches
35
+ * @returns The resolved node ID
36
+ * @throws Error if "current" is used but no node is selected, or multiple nodes selected
37
+ */
38
+ export async function resolveCurrentNodeId(nodeId, projectId) {
39
+ if (nodeId !== 'current') {
40
+ return nodeId;
41
+ }
42
+ const selection = await fetchCurrentSelection();
43
+ if (!selection || selection.type === 'none' || selection.stale) {
44
+ throw new Error('No node currently selected in FlowSpec editor. Please click a node first or provide the node ID explicitly.');
45
+ }
46
+ if (projectId && selection.projectId !== projectId) {
47
+ throw new Error(`Selection is from a different project (${selection.projectName}). Please switch to the correct project or provide the node ID explicitly.`);
48
+ }
49
+ const selectedNodes = selection.selectedNodes || [];
50
+ if (selectedNodes.length === 0) {
51
+ throw new Error('No node currently selected. Please click a node first or provide the node ID explicitly.');
52
+ }
53
+ if (selectedNodes.length > 1) {
54
+ const nodeList = selectedNodes.map(n => `"${n.label}" (${n.id})`).join(', ');
55
+ throw new Error(`Multiple nodes selected: ${nodeList}. Please click a single node or provide the node ID explicitly.`);
56
+ }
57
+ return selectedNodes[0].id;
58
+ }
59
+ /**
60
+ * Resolve "current" edge ID to the actual selected edge ID.
61
+ *
62
+ * @param edgeId - Either a real UUID or the string "current"
63
+ * @param projectId - Optional project ID to validate selection matches
64
+ * @returns The resolved edge ID
65
+ * @throws Error if "current" is used but no edge is selected, or multiple edges selected
66
+ */
67
+ export async function resolveCurrentEdgeId(edgeId, projectId) {
68
+ if (edgeId !== 'current') {
69
+ return edgeId;
70
+ }
71
+ const selection = await fetchCurrentSelection();
72
+ if (!selection || selection.type === 'none' || selection.stale) {
73
+ throw new Error('No edge currently selected in FlowSpec editor. Please click an edge first or provide the edge ID explicitly.');
74
+ }
75
+ if (projectId && selection.projectId !== projectId) {
76
+ throw new Error(`Selection is from a different project (${selection.projectName}). Please switch to the correct project or provide the edge ID explicitly.`);
77
+ }
78
+ const selectedEdges = selection.selectedEdges || [];
79
+ if (selectedEdges.length === 0) {
80
+ throw new Error('No edge currently selected. Please click an edge first or provide the edge ID explicitly.');
81
+ }
82
+ if (selectedEdges.length > 1) {
83
+ throw new Error(`Multiple edges selected. Please click a single edge or provide the edge ID explicitly.`);
84
+ }
85
+ return selectedEdges[0].id;
86
+ }
87
+ /**
88
+ * Get information about the current selection for user-friendly error messages.
89
+ */
90
+ export async function getSelectionSummary() {
91
+ const selection = await fetchCurrentSelection();
92
+ if (!selection || selection.type === 'none') {
93
+ return 'No selection';
94
+ }
95
+ if (selection.stale) {
96
+ return 'Selection stale (>60s)';
97
+ }
98
+ const nodeCount = selection.selectedNodes?.length || 0;
99
+ const edgeCount = selection.selectedEdges?.length || 0;
100
+ if (nodeCount > 0 && edgeCount > 0) {
101
+ return `${nodeCount} node(s) and ${edgeCount} edge(s) selected`;
102
+ }
103
+ else if (nodeCount > 0) {
104
+ return `${nodeCount} node(s) selected`;
105
+ }
106
+ else if (edgeCount > 0) {
107
+ return `${edgeCount} edge(s) selected`;
108
+ }
109
+ return 'No selection';
110
+ }
111
+ //# sourceMappingURL=selectionHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionHelper.js","sourceRoot":"","sources":["../../src/utils/selectionHelper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flowspec-mcp",
3
- "version": "5.5.0",
3
+ "version": "5.5.2",
4
4
  "type": "module",
5
5
  "description": "MCP server for FlowSpec — exposes project specs to Claude Code",
6
6
  "bin": {