project-graph-mcp 1.3.0 → 2.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 (113) hide show
  1. package/README.md +223 -17
  2. package/{AGENT_ROLE.md → docs/examples/AGENT_ROLE.md} +87 -30
  3. package/{AGENT_ROLE_MINIMAL.md → docs/examples/AGENT_ROLE_MINIMAL.md} +23 -8
  4. package/package.json +12 -8
  5. package/src/.project-graph-cache.json +1 -0
  6. package/src/analysis/analysis-cache.js +7 -0
  7. package/src/analysis/complexity.js +14 -0
  8. package/src/analysis/custom-rules.js +36 -0
  9. package/src/analysis/db-analysis.js +9 -0
  10. package/src/analysis/dead-code.js +19 -0
  11. package/src/analysis/full-analysis.js +18 -0
  12. package/src/analysis/jsdoc-checker.js +24 -0
  13. package/src/analysis/jsdoc-generator.js +10 -0
  14. package/src/analysis/large-files.js +11 -0
  15. package/src/analysis/outdated-patterns.js +12 -0
  16. package/src/analysis/similar-functions.js +16 -0
  17. package/src/analysis/test-annotations.js +21 -0
  18. package/src/analysis/type-checker.js +8 -0
  19. package/src/analysis/undocumented.js +14 -0
  20. package/src/cli/cli-handlers.js +4 -0
  21. package/src/cli/cli.js +5 -0
  22. package/src/compact/ai-context.js +7 -0
  23. package/src/compact/compact.js +18 -0
  24. package/src/compact/compress.js +13 -0
  25. package/src/compact/ctx-to-jsdoc.js +29 -0
  26. package/src/compact/doc-dialect.js +30 -0
  27. package/src/compact/expand.js +37 -0
  28. package/src/compact/framework-references.js +5 -0
  29. package/src/compact/instructions.js +3 -0
  30. package/src/compact/mode-config.js +8 -0
  31. package/src/compact/validate-pipeline.js +9 -0
  32. package/src/core/event-bus.js +9 -0
  33. package/src/core/filters.js +14 -0
  34. package/src/core/graph-builder.js +12 -0
  35. package/src/core/parser.js +31 -0
  36. package/src/core/workspace.js +8 -0
  37. package/src/lang/lang-go.js +17 -0
  38. package/src/lang/lang-python.js +12 -0
  39. package/src/lang/lang-sql.js +23 -0
  40. package/src/lang/lang-typescript.js +9 -0
  41. package/src/lang/lang-utils.js +4 -0
  42. package/src/mcp/mcp-server.js +17 -0
  43. package/src/mcp/tool-defs.js +3 -0
  44. package/src/mcp/tools.js +25 -0
  45. package/src/network/backend-lifecycle.js +19 -0
  46. package/src/network/backend.js +5 -0
  47. package/src/network/local-gateway.js +23 -0
  48. package/src/network/mdns.js +13 -0
  49. package/src/network/server.js +10 -0
  50. package/src/network/web-server.js +34 -0
  51. package/vendor/terser.mjs +49 -0
  52. package/web/.project-graph-cache.json +1 -0
  53. package/web/app.js +16 -0
  54. package/web/components/code-block.js +3 -0
  55. package/web/components/quick-open.js +5 -0
  56. package/web/dashboard-state.js +3 -0
  57. package/web/dashboard.html +27 -0
  58. package/web/dashboard.js +8 -0
  59. package/web/highlight.js +13 -0
  60. package/web/index.html +35 -0
  61. package/web/panels/ActionBoard/ActionBoard.css.js +1 -0
  62. package/web/panels/ActionBoard/ActionBoard.js +4 -0
  63. package/web/panels/ActionBoard/ActionBoard.tpl.js +1 -0
  64. package/web/panels/EventItem/EventItem.css.js +1 -0
  65. package/web/panels/EventItem/EventItem.js +4 -0
  66. package/web/panels/EventItem/EventItem.tpl.js +1 -0
  67. package/web/panels/ProjectItem/ProjectItem.css.js +1 -0
  68. package/web/panels/ProjectItem/ProjectItem.js +5 -0
  69. package/web/panels/ProjectItem/ProjectItem.tpl.js +1 -0
  70. package/web/panels/ProjectList/ProjectList.css.js +1 -0
  71. package/web/panels/ProjectList/ProjectList.js +4 -0
  72. package/web/panels/ProjectList/ProjectList.tpl.js +1 -0
  73. package/web/panels/SettingsPanel/.project-graph-cache.json +1 -0
  74. package/web/panels/SettingsPanel/SettingsPanel.css.js +1 -0
  75. package/web/panels/SettingsPanel/SettingsPanel.js +7 -0
  76. package/web/panels/SettingsPanel/SettingsPanel.tpl.js +1 -0
  77. package/web/panels/code-viewer.js +5 -0
  78. package/web/panels/ctx-panel.js +4 -0
  79. package/web/panels/dep-graph.js +6 -0
  80. package/web/panels/file-tree.js +188 -0
  81. package/web/panels/health-panel.js +3 -0
  82. package/web/panels/live-monitor.js +3 -0
  83. package/web/state.js +17 -0
  84. package/web/style.css +157 -0
  85. package/references/symbiote-3x.md +0 -834
  86. package/src/cli-handlers.js +0 -140
  87. package/src/cli.js +0 -83
  88. package/src/complexity.js +0 -223
  89. package/src/custom-rules.js +0 -583
  90. package/src/db-analysis.js +0 -194
  91. package/src/dead-code.js +0 -468
  92. package/src/filters.js +0 -227
  93. package/src/framework-references.js +0 -177
  94. package/src/full-analysis.js +0 -174
  95. package/src/graph-builder.js +0 -299
  96. package/src/instructions.js +0 -175
  97. package/src/jsdoc-generator.js +0 -214
  98. package/src/lang-go.js +0 -285
  99. package/src/lang-python.js +0 -197
  100. package/src/lang-sql.js +0 -309
  101. package/src/lang-typescript.js +0 -190
  102. package/src/lang-utils.js +0 -124
  103. package/src/large-files.js +0 -162
  104. package/src/mcp-server.js +0 -468
  105. package/src/outdated-patterns.js +0 -295
  106. package/src/parser.js +0 -452
  107. package/src/server.js +0 -28
  108. package/src/similar-functions.js +0 -278
  109. package/src/test-annotations.js +0 -301
  110. package/src/tool-defs.js +0 -525
  111. package/src/tools.js +0 -470
  112. package/src/undocumented.js +0 -260
  113. package/src/workspace.js +0 -70
package/web/state.js ADDED
@@ -0,0 +1,17 @@
1
+ // @ctx .context/web/state.ctx
2
+ const e=new URL(".",import.meta.url).href;
3
+ export const state={project:null,skeleton:null,events:[],connected:!1};
4
+ const t=new Map;
5
+ export function subscribe(e,n){return t.has(e)||t.set(e,new Set),t.get(e).add(n),()=>t.get(e)?.delete(n)}const n=new Set;
6
+ export function onEvent(e){return n.add(e),()=>n.delete(e)}
7
+ function o(e,n){t.get(e)?.forEach(t=>t(n,e));
8
+ const r=e.indexOf(".");if(r>0){const n=e.slice(0,r);t.get(n)?.forEach(e=>e(state[n],n))}t.get("*")?.forEach(t=>t(n,e))}let r=1;
9
+ const c=new Map;
10
+ export function call(e,t={}){return new Promise((n,a)=>{if(!s||s.readyState!==WebSocket.OPEN)return void a(new Error("WebSocket not connected"));
11
+ const d=r++;c.set(d,{resolve:n,reject:a}),s.send(JSON.stringify({jsonrpc:"2.0",id:d,method:"tool",params:{name:e,args:t}})),setTimeout(()=>{c.has(d)&&(c.delete(d),a(new Error(`Tool call timeout: ${e}`)))},3e4)})}let s=null,a=null;function l(e){Object.assign(state,e),state.connected=!0,o("*",state);for(const t of Object.keys(e))o(t,e[t])}
12
+ function i(e,t){const n=e.split(".");
13
+ let r=state;for(let e=0;e<n.length-1;e++)r[n[e]]||(r[n[e]]={}),r=r[n[e]];r[n[n.length-1]]=t,o(e,t)}
14
+ function u(e){let t;try{t=JSON.parse(e)}catch{return}if(t.id&&(void 0!==t.result||t.error)){const e=c.get(t.id);return void(e&&(c.delete(t.id),t.error?e.reject(new Error(t.error.message||"Tool error")):e.resolve(t.result)))}"snapshot"!==t.method?"patch"!==t.method?"event"!==t.method?t.type&&n.forEach(e=>e(t)):n.forEach(e=>e(t.params)):i(t.params.path,t.params.value):l(t.params.state)}
15
+ export function connect(){if(s)return;
16
+ const t=e.replace(/^http/,"ws");s=new WebSocket(`${t}ws/monitor`),s.onopen=()=>{state.connected=!0,o("connected",!0),a&&(clearTimeout(a),a=null)},s.onmessage=e=>u(e.data),s.onclose=()=>{state.connected=!1,s=null,o("connected",!1);for(const[e,{reject:t}]of c)t(new Error("WebSocket disconnected"));c.clear(),a=setTimeout(connect,3e3)},s.onerror=()=>{}}
17
+ export function disconnect(){a&&(clearTimeout(a),a=null),s&&(s.close(),s=null)}
package/web/style.css ADDED
@@ -0,0 +1,157 @@
1
+ /* Project Graph Web UI — Carbon Theme Styles */
2
+
3
+ /*
4
+ * Design tokens come from symbiote-node CARBON theme via applyTheme().
5
+ * Layout tokens (--bg-*, --text-*) are bridged from --sn-* tokens automatically.
6
+ * Layout structure mirrors admin-panel: topbar + sidebar + content.
7
+ */
8
+
9
+ *, *::before, *::after {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ html, body {
16
+ height: 100%;
17
+ background: var(--sn-bg, #1a1a1a);
18
+ color: var(--sn-text, #f0f0f0);
19
+ font-family: var(--sn-font, 'Inter', -apple-system, sans-serif);
20
+ font-size: 13px;
21
+ line-height: 1.5;
22
+ overflow: hidden;
23
+ }
24
+
25
+ /* === App shell — full viewport flex column === */
26
+ .app-shell {
27
+ display: flex;
28
+ flex-direction: column;
29
+ width: 100%;
30
+ height: 100%;
31
+ }
32
+
33
+ /* === Topbar === */
34
+ .app-topbar {
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: space-between;
38
+ padding: 0 16px;
39
+ height: 40px;
40
+ background: var(--sn-node-bg, #222222);
41
+ border-bottom: 1px solid var(--sn-node-border, rgba(255, 255, 255, 0.1));
42
+ flex-shrink: 0;
43
+ z-index: 100;
44
+ }
45
+
46
+ .topbar-left {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 8px;
50
+ }
51
+
52
+ .app-title {
53
+ font-size: 13px;
54
+ font-weight: 700;
55
+ color: var(--sn-text, #f0f0f0);
56
+ letter-spacing: 0.5px;
57
+ }
58
+
59
+ .topbar-right {
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 12px;
63
+ }
64
+
65
+
66
+
67
+ .project-name {
68
+ font-size: 13px;
69
+ font-weight: 600;
70
+ color: var(--project-accent, var(--sn-text, #f0f0f0));
71
+ }
72
+
73
+ .project-files {
74
+ font-size: 11px;
75
+ color: var(--sn-text-dim, #999999);
76
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
77
+ }
78
+
79
+ .compression-stats {
80
+ font-size: 10px;
81
+ font-weight: 500;
82
+ color: #64b5f6;
83
+ padding: 2px 8px;
84
+ border-radius: 10px;
85
+ background: rgba(100, 181, 246, 0.1);
86
+ border: 1px solid rgba(100, 181, 246, 0.15);
87
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
88
+ }
89
+
90
+ .topbar-sep {
91
+ color: var(--sn-text-dim, #555);
92
+ font-size: 14px;
93
+ }
94
+
95
+ /* Agent badge */
96
+ .agent-badge {
97
+ font-size: 11px;
98
+ font-weight: 500;
99
+ color: #4caf50;
100
+ padding: 2px 8px;
101
+ border-radius: 10px;
102
+ background: rgba(76, 175, 80, 0.1);
103
+ border: 1px solid rgba(76, 175, 80, 0.2);
104
+ animation: pulse-glow 2s ease-in-out infinite;
105
+ }
106
+
107
+ @keyframes pulse-glow {
108
+ 0%, 100% { box-shadow: 0 0 4px rgba(76, 175, 80, 0.1); }
109
+ 50% { box-shadow: 0 0 8px rgba(76, 175, 80, 0.3); }
110
+ }
111
+
112
+ /* Status indicator */
113
+ .status {
114
+ width: 8px;
115
+ height: 8px;
116
+ border-radius: 50%;
117
+ background: var(--sn-text-dim, #999);
118
+ }
119
+
120
+ .status.connected {
121
+ background: #4caf50;
122
+ box-shadow: 0 0 6px rgba(76, 175, 80, 0.5);
123
+ }
124
+
125
+ .status.disconnected {
126
+ background: #f44336;
127
+ }
128
+
129
+ /* === Workspace: sidebar + content area === */
130
+ .app-workspace {
131
+ flex: 1;
132
+ overflow: hidden;
133
+ position: relative;
134
+ display: flex;
135
+ }
136
+
137
+ .app-content {
138
+ flex: 1;
139
+ overflow: hidden;
140
+ position: relative;
141
+ }
142
+
143
+ .app-content > panel-layout {
144
+ width: 100%;
145
+ height: 100%;
146
+ }
147
+
148
+ /* === Scrollbar — carbon grey === */
149
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
150
+ ::-webkit-scrollbar-track { background: transparent; }
151
+ ::-webkit-scrollbar-thumb {
152
+ background: rgba(255, 255, 255, 0.1);
153
+ border-radius: 4px;
154
+ }
155
+ ::-webkit-scrollbar-thumb:hover {
156
+ background: rgba(255, 255, 255, 0.2);
157
+ }