@syke1/mcp-server 1.3.1 → 1.3.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.
package/dist/index.js CHANGED
@@ -111,7 +111,7 @@ async function main() {
111
111
  };
112
112
  process.on("SIGINT", shutdown);
113
113
  process.on("SIGTERM", shutdown);
114
- const server = new index_js_1.Server({ name: "syke", version: "1.3.0" }, { capabilities: { tools: {} } });
114
+ const server = new index_js_1.Server({ name: "syke", version: "1.3.2" }, { capabilities: { tools: {} } });
115
115
  // List tools
116
116
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
117
117
  tools: [
@@ -218,6 +218,16 @@ async function main() {
218
218
  },
219
219
  ],
220
220
  }));
221
+ // Dashboard URL footer — shown only on the first successful tool call
222
+ let firstToolCall = true;
223
+ const DASHBOARD_FOOTER = `\n\n---\nšŸ“Š SYKE Dashboard: http://localhost:${WEB_PORT}`;
224
+ function appendDashboardFooter(text) {
225
+ if (firstToolCall && currentProjectRoot) {
226
+ firstToolCall = false;
227
+ return text + DASHBOARD_FOOTER;
228
+ }
229
+ return text;
230
+ }
221
231
  // Handle tool calls
222
232
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
223
233
  const { name, arguments: args } = request.params;
@@ -228,7 +238,7 @@ async function main() {
228
238
  const result = (0, gate_build_1.gateCheck)(graph, files);
229
239
  return {
230
240
  content: [
231
- { type: "text", text: (0, gate_build_1.formatGateResult)(result) },
241
+ { type: "text", text: appendDashboardFooter((0, gate_build_1.formatGateResult)(result)) },
232
242
  ],
233
243
  isError: result.verdict === "FAIL",
234
244
  };
@@ -270,7 +280,7 @@ async function main() {
270
280
  lines.push(`- ${d}`);
271
281
  }
272
282
  }
273
- return { content: [{ type: "text", text: lines.join("\n") }] };
283
+ return { content: [{ type: "text", text: appendDashboardFooter(lines.join("\n")) }] };
274
284
  }
275
285
  case "check_safe": {
276
286
  const file = args.file;
@@ -295,7 +305,7 @@ async function main() {
295
305
  content: [
296
306
  {
297
307
  type: "text",
298
- text: `${result.riskLevel} — ${rel} impacts ${result.totalImpacted} file(s)`,
308
+ text: appendDashboardFooter(`${result.riskLevel} — ${rel} impacts ${result.totalImpacted} file(s)`),
299
309
  },
300
310
  ],
301
311
  };
@@ -397,7 +407,7 @@ async function main() {
397
407
  const impactResult = (0, analyze_impact_1.analyzeImpact)(resolved, graph);
398
408
  const aiResult = await (0, analyzer_1.analyzeWithAI)(resolved, impactResult, graph);
399
409
  return {
400
- content: [{ type: "text", text: aiResult }],
410
+ content: [{ type: "text", text: appendDashboardFooter(aiResult) }],
401
411
  };
402
412
  }
403
413
  case "check_warnings": {
@@ -448,7 +458,7 @@ async function main() {
448
458
  lines.push(`${count} warning(s) acknowledged.`);
449
459
  }
450
460
  return {
451
- content: [{ type: "text", text: lines.join("\n") }],
461
+ content: [{ type: "text", text: appendDashboardFooter(lines.join("\n")) }],
452
462
  };
453
463
  }
454
464
  default:
@@ -461,7 +471,7 @@ async function main() {
461
471
  }
462
472
  });
463
473
  // Pre-warm the graph (skip if no project root — e.g. Smithery scan)
464
- console.error(`[syke] Starting SYKE MCP Server v1.3.0`);
474
+ console.error(`[syke] Starting SYKE MCP Server v1.3.2`);
465
475
  console.error(`[syke] License: ${licenseStatus.plan.toUpperCase()} (${licenseStatus.source})`);
466
476
  // Log AI provider status
467
477
  const aiProvider = (0, provider_1.getAIProvider)();
@@ -553,7 +563,7 @@ main().catch((err) => {
553
563
  * See: https://smithery.ai/docs/deploy#sandbox-server
554
564
  */
555
565
  function createSandboxServer() {
556
- const sandboxServer = new index_js_1.Server({ name: "syke", version: "1.3.0" }, { capabilities: { tools: {} } });
566
+ const sandboxServer = new index_js_1.Server({ name: "syke", version: "1.3.2" }, { capabilities: { tools: {} } });
557
567
  sandboxServer.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
558
568
  tools: [
559
569
  {
@@ -51,6 +51,27 @@ document.addEventListener("DOMContentLoaded", async () => {
51
51
  initSSE();
52
52
  });
53
53
 
54
+ // ═══════════════════════════════════════════
55
+ // WELCOME OVERLAY
56
+ // ═══════════════════════════════════════════
57
+ function showWelcomeOverlay() {
58
+ const overlay = document.getElementById("welcome-overlay");
59
+ if (overlay) overlay.classList.remove("hidden");
60
+
61
+ const btn = document.getElementById("btn-welcome-open");
62
+ if (btn && !btn._bound) {
63
+ btn.addEventListener("click", () => {
64
+ document.getElementById("btn-change-project").click();
65
+ });
66
+ btn._bound = true;
67
+ }
68
+ }
69
+
70
+ function hideWelcomeOverlay() {
71
+ const overlay = document.getElementById("welcome-overlay");
72
+ if (overlay) overlay.classList.add("hidden");
73
+ }
74
+
54
75
  // ═══════════════════════════════════════════
55
76
  // GRAPH LOADING
56
77
  // ═══════════════════════════════════════════
@@ -59,6 +80,12 @@ async function loadGraph() {
59
80
  const raw = await res.json();
60
81
  console.log("[SYKE]", raw.nodes.length, "nodes", raw.edges.length, "edges");
61
82
 
83
+ if (raw.nodes.length === 0) {
84
+ showWelcomeOverlay();
85
+ return;
86
+ }
87
+ hideWelcomeOverlay();
88
+
62
89
  const nodes = raw.nodes.map(n => {
63
90
  const layer = n.data.layer || "UTIL";
64
91
  const c = LAYER_CENTERS[layer] || LAYER_CENTERS.UTIL;
@@ -56,6 +56,34 @@
56
56
  <input type="text" id="search-input" placeholder="SEARCH TARGET...">
57
57
  </div>
58
58
  <div id="3d-graph"></div>
59
+ <!-- Welcome Overlay (shown when no project loaded) -->
60
+ <div id="welcome-overlay" class="welcome-overlay hidden">
61
+ <div class="welcome-content">
62
+ <div class="welcome-logo">
63
+ <div class="welcome-pulse-ring"><span class="welcome-pulse-dot"></span></div>
64
+ <span class="welcome-title">SYKE</span>
65
+ </div>
66
+ <p class="welcome-subtitle">CODE IMPACT RADAR</p>
67
+ <p class="welcome-msg">Open a project to get started</p>
68
+ <button id="btn-welcome-open" class="welcome-open-btn">OPEN PROJECT</button>
69
+ <div class="welcome-steps">
70
+ <div class="welcome-step">
71
+ <span class="step-num">1</span>
72
+ <span class="step-text">Open Project</span>
73
+ </div>
74
+ <div class="welcome-step-arrow">&rarr;</div>
75
+ <div class="welcome-step">
76
+ <span class="step-num">2</span>
77
+ <span class="step-text">Explore Graph</span>
78
+ </div>
79
+ <div class="welcome-step-arrow">&rarr;</div>
80
+ <div class="welcome-step">
81
+ <span class="step-num">3</span>
82
+ <span class="step-text">Monitor Changes</span>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
59
87
  <!-- HTML overlay for node labels -->
60
88
  <div id="node-labels"></div>
61
89
  <!-- Layer Legend (clickable filter) -->
@@ -1825,3 +1825,150 @@ main {
1825
1825
  font-size: 11px;
1826
1826
  letter-spacing: 2px;
1827
1827
  }
1828
+
1829
+ /* ═══════════════════════════════════════════ */
1830
+ /* Welcome Overlay */
1831
+ /* ═══════════════════════════════════════════ */
1832
+ .welcome-overlay {
1833
+ position: absolute;
1834
+ top: 0; left: 0; right: 0; bottom: 0;
1835
+ display: flex;
1836
+ align-items: center;
1837
+ justify-content: center;
1838
+ z-index: 50;
1839
+ background: radial-gradient(ellipse at center, rgba(13,26,48,0.95) 0%, rgba(5,10,24,0.98) 70%);
1840
+ backdrop-filter: blur(2px);
1841
+ }
1842
+
1843
+ .welcome-overlay.hidden { display: none; }
1844
+
1845
+ .welcome-content {
1846
+ display: flex;
1847
+ flex-direction: column;
1848
+ align-items: center;
1849
+ gap: 16px;
1850
+ animation: welcome-fade-in 0.8s ease-out;
1851
+ }
1852
+
1853
+ @keyframes welcome-fade-in {
1854
+ 0% { opacity: 0; transform: translateY(20px); }
1855
+ 100% { opacity: 1; transform: translateY(0); }
1856
+ }
1857
+
1858
+ .welcome-logo {
1859
+ display: flex;
1860
+ align-items: center;
1861
+ gap: 16px;
1862
+ }
1863
+
1864
+ .welcome-pulse-ring {
1865
+ position: relative;
1866
+ width: 28px;
1867
+ height: 28px;
1868
+ display: flex;
1869
+ align-items: center;
1870
+ justify-content: center;
1871
+ }
1872
+
1873
+ .welcome-pulse-ring::before {
1874
+ content: '';
1875
+ position: absolute;
1876
+ width: 28px; height: 28px;
1877
+ border-radius: 50%;
1878
+ border: 1px solid var(--risk-high);
1879
+ animation: pulse-ring 2s ease-out infinite;
1880
+ }
1881
+
1882
+ .welcome-pulse-dot {
1883
+ width: 10px;
1884
+ height: 10px;
1885
+ border-radius: 50%;
1886
+ background: var(--risk-high);
1887
+ box-shadow: 0 0 12px var(--risk-high);
1888
+ animation: pulse-glow 2s ease-in-out infinite;
1889
+ }
1890
+
1891
+ .welcome-title {
1892
+ font-size: 42px;
1893
+ font-weight: 700;
1894
+ letter-spacing: 12px;
1895
+ color: var(--accent);
1896
+ text-shadow: var(--glow-cyan), 0 0 40px rgba(0,212,255,0.2);
1897
+ }
1898
+
1899
+ .welcome-subtitle {
1900
+ font-size: 11px;
1901
+ color: var(--text-secondary);
1902
+ letter-spacing: 6px;
1903
+ margin-top: -8px;
1904
+ }
1905
+
1906
+ .welcome-msg {
1907
+ font-size: 14px;
1908
+ color: var(--text-primary);
1909
+ letter-spacing: 1px;
1910
+ margin-top: 8px;
1911
+ }
1912
+
1913
+ .welcome-open-btn {
1914
+ padding: 12px 40px;
1915
+ background: rgba(0,212,255,0.1);
1916
+ color: var(--accent);
1917
+ border: 1px solid var(--accent);
1918
+ border-radius: 3px;
1919
+ cursor: pointer;
1920
+ font-size: 13px;
1921
+ font-family: inherit;
1922
+ font-weight: 700;
1923
+ letter-spacing: 4px;
1924
+ transition: all 0.3s;
1925
+ margin-top: 8px;
1926
+ }
1927
+
1928
+ .welcome-open-btn:hover {
1929
+ background: rgba(0,212,255,0.2);
1930
+ box-shadow: var(--glow-cyan), 0 0 40px rgba(0,212,255,0.15);
1931
+ transform: translateY(-1px);
1932
+ }
1933
+
1934
+ .welcome-steps {
1935
+ display: flex;
1936
+ align-items: center;
1937
+ gap: 12px;
1938
+ margin-top: 24px;
1939
+ padding: 16px 24px;
1940
+ background: rgba(0,0,0,0.3);
1941
+ border: 1px solid var(--border);
1942
+ border-radius: 4px;
1943
+ }
1944
+
1945
+ .welcome-step {
1946
+ display: flex;
1947
+ align-items: center;
1948
+ gap: 8px;
1949
+ }
1950
+
1951
+ .step-num {
1952
+ width: 22px;
1953
+ height: 22px;
1954
+ border-radius: 50%;
1955
+ border: 1px solid var(--accent-dim);
1956
+ display: flex;
1957
+ align-items: center;
1958
+ justify-content: center;
1959
+ font-size: 10px;
1960
+ font-weight: 700;
1961
+ color: var(--accent);
1962
+ }
1963
+
1964
+ .step-text {
1965
+ font-size: 11px;
1966
+ color: var(--text-secondary);
1967
+ letter-spacing: 1px;
1968
+ }
1969
+
1970
+ .welcome-step-arrow {
1971
+ color: var(--text-secondary);
1972
+ font-size: 14px;
1973
+ opacity: 0.5;
1974
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syke1/mcp-server",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "mcpName": "io.github.khalomsky/syke",
5
5
  "description": "AI code impact analysis MCP server — dependency graphs, cascade detection, and a mandatory build gate for AI coding agents",
6
6
  "main": "dist/index.js",