claude-mpm 4.2.44__py3-none-any.whl → 4.2.51__py3-none-any.whl
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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +43 -1
- claude_mpm/agents/INSTRUCTIONS.md +75 -1
- claude_mpm/agents/WORKFLOW.md +46 -1
- claude_mpm/agents/frontmatter_validator.py +20 -12
- claude_mpm/agents/templates/nextjs_engineer.json +277 -0
- claude_mpm/agents/templates/python_engineer.json +289 -0
- claude_mpm/agents/templates/react_engineer.json +11 -3
- claude_mpm/agents/templates/security.json +50 -9
- claude_mpm/cli/commands/agents.py +2 -2
- claude_mpm/cli/commands/uninstall.py +1 -2
- claude_mpm/cli/interactive/agent_wizard.py +3 -3
- claude_mpm/cli/parsers/agent_manager_parser.py +3 -3
- claude_mpm/cli/parsers/agents_parser.py +1 -1
- claude_mpm/constants.py +1 -1
- claude_mpm/core/error_handler.py +2 -4
- claude_mpm/core/file_utils.py +4 -12
- claude_mpm/core/log_manager.py +8 -5
- claude_mpm/core/logger.py +1 -1
- claude_mpm/core/logging_utils.py +6 -6
- claude_mpm/core/unified_agent_registry.py +18 -4
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -1076
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -465
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +251 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +28 -5
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +713 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-viewer.js +306 -66
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +285 -85
- claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
- claude_mpm/dashboard/static/js/dashboard.js +61 -33
- claude_mpm/dashboard/static/js/socket-client.js +12 -8
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors-index.html +218 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +715 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/templates/index.html +79 -9
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +1 -1
- claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +25 -8
- claude_mpm/services/agents/deployment/agent_validator.py +3 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +13 -4
- claude_mpm/services/agents/local_template_manager.py +2 -6
- claude_mpm/services/monitor/daemon.py +1 -2
- claude_mpm/services/monitor/daemon_manager.py +2 -5
- claude_mpm/services/monitor/event_emitter.py +2 -2
- claude_mpm/services/monitor/handlers/code_analysis.py +4 -6
- claude_mpm/services/monitor/handlers/hooks.py +2 -4
- claude_mpm/services/monitor/server.py +27 -4
- claude_mpm/tools/code_tree_analyzer.py +2 -2
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/METADATA +1 -1
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/RECORD +146 -81
- claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
- claude_mpm/dashboard/static/test-simple.html +0 -97
- /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/WHEEL +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.2.44.dist-info → claude_mpm-4.2.51.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,353 @@
|
|
1
|
+
/**
|
2
|
+
* Tree Breadcrumb Navigation
|
3
|
+
*
|
4
|
+
* Breadcrumb navigation and status display for the code tree.
|
5
|
+
* Provides path navigation and activity status updates.
|
6
|
+
*
|
7
|
+
* @module tree-breadcrumb
|
8
|
+
*/
|
9
|
+
|
10
|
+
class TreeBreadcrumb {
|
11
|
+
constructor() {
|
12
|
+
this.container = null;
|
13
|
+
this.pathElement = null;
|
14
|
+
this.statusElement = null;
|
15
|
+
this.currentPath = '/';
|
16
|
+
this.workingDirectory = null;
|
17
|
+
this.navigationCallback = null;
|
18
|
+
this.maxSegments = 10;
|
19
|
+
}
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Initialize breadcrumb component
|
23
|
+
* @param {string} containerId - Container element ID
|
24
|
+
* @param {Object} options - Configuration options
|
25
|
+
*/
|
26
|
+
initialize(containerId, options = {}) {
|
27
|
+
this.container = document.getElementById(containerId);
|
28
|
+
if (!this.container) {
|
29
|
+
console.error(`Breadcrumb container not found: ${containerId}`);
|
30
|
+
return;
|
31
|
+
}
|
32
|
+
|
33
|
+
// Set options
|
34
|
+
this.maxSegments = options.maxSegments || 10;
|
35
|
+
this.navigationCallback = options.onNavigate || null;
|
36
|
+
|
37
|
+
// Create breadcrumb structure
|
38
|
+
this.createBreadcrumbStructure();
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Create breadcrumb DOM structure
|
43
|
+
*/
|
44
|
+
createBreadcrumbStructure() {
|
45
|
+
// Clear existing content
|
46
|
+
this.container.innerHTML = '';
|
47
|
+
|
48
|
+
// Create path navigation
|
49
|
+
const pathContainer = document.createElement('div');
|
50
|
+
pathContainer.className = 'tree-breadcrumb-path-container';
|
51
|
+
|
52
|
+
this.pathElement = document.createElement('div');
|
53
|
+
this.pathElement.id = 'tree-breadcrumb-path';
|
54
|
+
this.pathElement.className = 'tree-breadcrumb-path';
|
55
|
+
pathContainer.appendChild(this.pathElement);
|
56
|
+
|
57
|
+
// Create status/activity display
|
58
|
+
const statusContainer = document.createElement('div');
|
59
|
+
statusContainer.className = 'tree-breadcrumb-status-container';
|
60
|
+
|
61
|
+
this.statusElement = document.createElement('div');
|
62
|
+
this.statusElement.id = 'breadcrumb-content';
|
63
|
+
this.statusElement.className = 'breadcrumb-content';
|
64
|
+
statusContainer.appendChild(this.statusElement);
|
65
|
+
|
66
|
+
// Add to container
|
67
|
+
this.container.appendChild(pathContainer);
|
68
|
+
this.container.appendChild(statusContainer);
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Set working directory
|
73
|
+
* @param {string} directory - Working directory path
|
74
|
+
*/
|
75
|
+
setWorkingDirectory(directory) {
|
76
|
+
this.workingDirectory = directory;
|
77
|
+
this.updatePath(this.currentPath);
|
78
|
+
}
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Update breadcrumb path
|
82
|
+
* @param {string} path - Current navigation path
|
83
|
+
*/
|
84
|
+
updatePath(path) {
|
85
|
+
this.currentPath = path || '/';
|
86
|
+
|
87
|
+
if (!this.pathElement) return;
|
88
|
+
|
89
|
+
// Clear existing path
|
90
|
+
this.pathElement.innerHTML = '';
|
91
|
+
|
92
|
+
if (!this.workingDirectory ||
|
93
|
+
this.workingDirectory === 'Loading...' ||
|
94
|
+
this.workingDirectory === 'Not selected') {
|
95
|
+
this.pathElement.textContent = 'No project selected';
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
|
99
|
+
// Build path segments
|
100
|
+
const segments = this.buildSegments(this.currentPath);
|
101
|
+
|
102
|
+
// Create clickable segments
|
103
|
+
segments.forEach((segment, index) => {
|
104
|
+
if (index > 0) {
|
105
|
+
const separator = document.createElement('span');
|
106
|
+
separator.className = 'breadcrumb-separator';
|
107
|
+
separator.textContent = '/';
|
108
|
+
this.pathElement.appendChild(separator);
|
109
|
+
}
|
110
|
+
|
111
|
+
const segmentElement = document.createElement('span');
|
112
|
+
segmentElement.className = index === segments.length - 1 ?
|
113
|
+
'breadcrumb-segment current' : 'breadcrumb-segment';
|
114
|
+
segmentElement.textContent = segment.name;
|
115
|
+
|
116
|
+
// Add click handler for non-current segments
|
117
|
+
if (index < segments.length - 1) {
|
118
|
+
segmentElement.style.cursor = 'pointer';
|
119
|
+
segmentElement.addEventListener('click', () => {
|
120
|
+
this.navigateToSegment(segment.path);
|
121
|
+
});
|
122
|
+
|
123
|
+
// Add hover effect
|
124
|
+
segmentElement.addEventListener('mouseenter', () => {
|
125
|
+
segmentElement.classList.add('hover');
|
126
|
+
});
|
127
|
+
segmentElement.addEventListener('mouseleave', () => {
|
128
|
+
segmentElement.classList.remove('hover');
|
129
|
+
});
|
130
|
+
}
|
131
|
+
|
132
|
+
this.pathElement.appendChild(segmentElement);
|
133
|
+
});
|
134
|
+
|
135
|
+
// Add overflow handling for long paths
|
136
|
+
this.handlePathOverflow();
|
137
|
+
}
|
138
|
+
|
139
|
+
/**
|
140
|
+
* Build path segments from current path
|
141
|
+
* @param {string} path - Current path
|
142
|
+
* @returns {Array} Array of segment objects
|
143
|
+
*/
|
144
|
+
buildSegments(path) {
|
145
|
+
const segments = [];
|
146
|
+
|
147
|
+
// Add root/project segment
|
148
|
+
const projectName = this.workingDirectory.split('/').pop() || 'Root';
|
149
|
+
segments.push({
|
150
|
+
name: projectName,
|
151
|
+
path: '/'
|
152
|
+
});
|
153
|
+
|
154
|
+
// Add path segments if not at root
|
155
|
+
if (path && path !== '/') {
|
156
|
+
const pathParts = path.split('/').filter(p => p.length > 0);
|
157
|
+
let currentPath = '';
|
158
|
+
|
159
|
+
pathParts.forEach(part => {
|
160
|
+
currentPath += '/' + part;
|
161
|
+
segments.push({
|
162
|
+
name: part,
|
163
|
+
path: currentPath
|
164
|
+
});
|
165
|
+
});
|
166
|
+
}
|
167
|
+
|
168
|
+
// Truncate if too many segments
|
169
|
+
if (segments.length > this.maxSegments) {
|
170
|
+
const truncated = [
|
171
|
+
segments[0],
|
172
|
+
{ name: '...', path: null },
|
173
|
+
...segments.slice(-(this.maxSegments - 2))
|
174
|
+
];
|
175
|
+
return truncated;
|
176
|
+
}
|
177
|
+
|
178
|
+
return segments;
|
179
|
+
}
|
180
|
+
|
181
|
+
/**
|
182
|
+
* Navigate to a path segment
|
183
|
+
* @param {string} path - Path to navigate to
|
184
|
+
*/
|
185
|
+
navigateToSegment(path) {
|
186
|
+
if (path === null) return; // Skip ellipsis
|
187
|
+
|
188
|
+
this.currentPath = path;
|
189
|
+
this.updatePath(path);
|
190
|
+
|
191
|
+
// Call navigation callback if provided
|
192
|
+
if (this.navigationCallback) {
|
193
|
+
this.navigationCallback(path);
|
194
|
+
}
|
195
|
+
|
196
|
+
// Dispatch custom event
|
197
|
+
const event = new CustomEvent('breadcrumbNavigation', {
|
198
|
+
detail: { path }
|
199
|
+
});
|
200
|
+
document.dispatchEvent(event);
|
201
|
+
}
|
202
|
+
|
203
|
+
/**
|
204
|
+
* Update status/activity message
|
205
|
+
* @param {string} message - Status message
|
206
|
+
* @param {string} type - Message type (info/success/warning/error)
|
207
|
+
*/
|
208
|
+
updateStatus(message, type = 'info') {
|
209
|
+
if (!this.statusElement) return;
|
210
|
+
|
211
|
+
this.statusElement.textContent = message;
|
212
|
+
this.statusElement.className = `breadcrumb-content breadcrumb-${type}`;
|
213
|
+
|
214
|
+
// Add fade animation for status changes
|
215
|
+
this.statusElement.style.animation = 'none';
|
216
|
+
setTimeout(() => {
|
217
|
+
this.statusElement.style.animation = 'fadeIn 0.3s ease-in';
|
218
|
+
}, 10);
|
219
|
+
}
|
220
|
+
|
221
|
+
/**
|
222
|
+
* Update activity ticker with rotating messages
|
223
|
+
* @param {string} message - Activity message
|
224
|
+
* @param {string} type - Message type
|
225
|
+
*/
|
226
|
+
updateActivityTicker(message, type = 'info') {
|
227
|
+
this.updateStatus(message, type);
|
228
|
+
|
229
|
+
// Optional: Add to activity history
|
230
|
+
if (!this.activityHistory) {
|
231
|
+
this.activityHistory = [];
|
232
|
+
}
|
233
|
+
|
234
|
+
this.activityHistory.push({
|
235
|
+
message,
|
236
|
+
type,
|
237
|
+
timestamp: Date.now()
|
238
|
+
});
|
239
|
+
|
240
|
+
// Keep only last 100 activities
|
241
|
+
if (this.activityHistory.length > 100) {
|
242
|
+
this.activityHistory.shift();
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
/**
|
247
|
+
* Handle path overflow for long paths
|
248
|
+
*/
|
249
|
+
handlePathOverflow() {
|
250
|
+
if (!this.pathElement) return;
|
251
|
+
|
252
|
+
// Check if path overflows
|
253
|
+
if (this.pathElement.scrollWidth > this.pathElement.clientWidth) {
|
254
|
+
// Add scroll buttons or implement horizontal scroll
|
255
|
+
this.pathElement.style.overflowX = 'auto';
|
256
|
+
this.pathElement.classList.add('overflow');
|
257
|
+
} else {
|
258
|
+
this.pathElement.style.overflowX = 'hidden';
|
259
|
+
this.pathElement.classList.remove('overflow');
|
260
|
+
}
|
261
|
+
}
|
262
|
+
|
263
|
+
/**
|
264
|
+
* Show loading state
|
265
|
+
* @param {string} message - Loading message
|
266
|
+
*/
|
267
|
+
showLoading(message = 'Loading...') {
|
268
|
+
this.updateStatus(message, 'info');
|
269
|
+
|
270
|
+
// Add loading spinner if needed
|
271
|
+
if (this.statusElement) {
|
272
|
+
const spinner = document.createElement('span');
|
273
|
+
spinner.className = 'breadcrumb-spinner';
|
274
|
+
spinner.innerHTML = ' ⏳';
|
275
|
+
this.statusElement.appendChild(spinner);
|
276
|
+
}
|
277
|
+
}
|
278
|
+
|
279
|
+
/**
|
280
|
+
* Hide loading state
|
281
|
+
*/
|
282
|
+
hideLoading() {
|
283
|
+
if (this.statusElement) {
|
284
|
+
const spinner = this.statusElement.querySelector('.breadcrumb-spinner');
|
285
|
+
if (spinner) {
|
286
|
+
spinner.remove();
|
287
|
+
}
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Get current path
|
293
|
+
* @returns {string} Current path
|
294
|
+
*/
|
295
|
+
getCurrentPath() {
|
296
|
+
return this.currentPath;
|
297
|
+
}
|
298
|
+
|
299
|
+
/**
|
300
|
+
* Get activity history
|
301
|
+
* @returns {Array} Activity history
|
302
|
+
*/
|
303
|
+
getActivityHistory() {
|
304
|
+
return this.activityHistory || [];
|
305
|
+
}
|
306
|
+
|
307
|
+
/**
|
308
|
+
* Clear breadcrumb
|
309
|
+
*/
|
310
|
+
clear() {
|
311
|
+
this.currentPath = '/';
|
312
|
+
this.workingDirectory = null;
|
313
|
+
|
314
|
+
if (this.pathElement) {
|
315
|
+
this.pathElement.innerHTML = '';
|
316
|
+
}
|
317
|
+
|
318
|
+
if (this.statusElement) {
|
319
|
+
this.statusElement.textContent = '';
|
320
|
+
this.statusElement.className = 'breadcrumb-content';
|
321
|
+
}
|
322
|
+
|
323
|
+
this.activityHistory = [];
|
324
|
+
}
|
325
|
+
|
326
|
+
/**
|
327
|
+
* Destroy breadcrumb component
|
328
|
+
*/
|
329
|
+
destroy() {
|
330
|
+
this.clear();
|
331
|
+
|
332
|
+
if (this.container) {
|
333
|
+
this.container.innerHTML = '';
|
334
|
+
}
|
335
|
+
|
336
|
+
this.container = null;
|
337
|
+
this.pathElement = null;
|
338
|
+
this.statusElement = null;
|
339
|
+
this.navigationCallback = null;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
|
343
|
+
// Export as singleton for consistent state
|
344
|
+
const treeBreadcrumb = new TreeBreadcrumb();
|
345
|
+
|
346
|
+
// Support both module and global usage
|
347
|
+
if (typeof module !== 'undefined' && module.exports) {
|
348
|
+
module.exports = treeBreadcrumb;
|
349
|
+
} else if (typeof define === 'function' && define.amd) {
|
350
|
+
define([], () => treeBreadcrumb);
|
351
|
+
} else {
|
352
|
+
window.treeBreadcrumb = treeBreadcrumb;
|
353
|
+
}
|
@@ -0,0 +1,235 @@
|
|
1
|
+
/**
|
2
|
+
* Tree Constants and Configuration
|
3
|
+
*
|
4
|
+
* Constants and default configurations for the code tree visualization.
|
5
|
+
*
|
6
|
+
* @module tree-constants
|
7
|
+
*/
|
8
|
+
|
9
|
+
const treeConstants = {
|
10
|
+
// Layout dimensions
|
11
|
+
DEFAULT_MARGIN: { top: 20, right: 20, bottom: 20, left: 20 },
|
12
|
+
DEFAULT_WIDTH: 960,
|
13
|
+
DEFAULT_HEIGHT: 600,
|
14
|
+
|
15
|
+
// Animation settings
|
16
|
+
ANIMATION_DURATION: 750,
|
17
|
+
TOOLTIP_FADE_DURATION: 200,
|
18
|
+
TOOLTIP_HIDE_DELAY: 500,
|
19
|
+
|
20
|
+
// Node visualization
|
21
|
+
NODE_RADIUS: {
|
22
|
+
DEFAULT: 6,
|
23
|
+
SMALL: 4,
|
24
|
+
LARGE: 8,
|
25
|
+
EXPANDED: 10
|
26
|
+
},
|
27
|
+
|
28
|
+
// Colors
|
29
|
+
COLORS: {
|
30
|
+
// Complexity colors
|
31
|
+
COMPLEXITY_LOW: '#52c41a', // Green
|
32
|
+
COMPLEXITY_MEDIUM: '#faad14', // Orange
|
33
|
+
COMPLEXITY_HIGH: '#f5222d', // Red
|
34
|
+
|
35
|
+
// Node state colors
|
36
|
+
NODE_DEFAULT: '#69b7ff',
|
37
|
+
NODE_SELECTED: '#1890ff',
|
38
|
+
NODE_HOVER: '#40a9ff',
|
39
|
+
NODE_LOADING: '#ffc53d',
|
40
|
+
NODE_ERROR: '#ff4d4f',
|
41
|
+
|
42
|
+
// Link colors
|
43
|
+
LINK_DEFAULT: '#d9d9d9',
|
44
|
+
LINK_SELECTED: '#1890ff',
|
45
|
+
|
46
|
+
// Text colors
|
47
|
+
TEXT_PRIMARY: '#262626',
|
48
|
+
TEXT_SECONDARY: '#8c8c8c',
|
49
|
+
TEXT_DISABLED: '#bfbfbf'
|
50
|
+
},
|
51
|
+
|
52
|
+
// Tree layout
|
53
|
+
TREE_LAYOUT: {
|
54
|
+
NODE_SIZE: [100, 40],
|
55
|
+
SEPARATION: (a, b) => (a.parent === b.parent ? 1 : 2),
|
56
|
+
RADIAL_SEPARATION: (a, b) => (a.parent === b.parent ? 1 : 2) / a.depth
|
57
|
+
},
|
58
|
+
|
59
|
+
// File type mappings
|
60
|
+
LANGUAGE_EXTENSIONS: {
|
61
|
+
'py': 'python',
|
62
|
+
'js': 'javascript',
|
63
|
+
'ts': 'typescript',
|
64
|
+
'jsx': 'javascript',
|
65
|
+
'tsx': 'typescript',
|
66
|
+
'java': 'java',
|
67
|
+
'c': 'c',
|
68
|
+
'cpp': 'cpp',
|
69
|
+
'cs': 'csharp',
|
70
|
+
'go': 'go',
|
71
|
+
'rs': 'rust',
|
72
|
+
'rb': 'ruby',
|
73
|
+
'php': 'php',
|
74
|
+
'swift': 'swift',
|
75
|
+
'kt': 'kotlin',
|
76
|
+
'scala': 'scala',
|
77
|
+
'r': 'r',
|
78
|
+
'lua': 'lua',
|
79
|
+
'dart': 'dart',
|
80
|
+
'html': 'html',
|
81
|
+
'css': 'css',
|
82
|
+
'scss': 'scss',
|
83
|
+
'sass': 'sass',
|
84
|
+
'less': 'less',
|
85
|
+
'json': 'json',
|
86
|
+
'xml': 'xml',
|
87
|
+
'yaml': 'yaml',
|
88
|
+
'yml': 'yaml',
|
89
|
+
'toml': 'toml',
|
90
|
+
'ini': 'ini',
|
91
|
+
'sql': 'sql',
|
92
|
+
'sh': 'shell',
|
93
|
+
'bash': 'bash',
|
94
|
+
'ps1': 'powershell',
|
95
|
+
'bat': 'batch',
|
96
|
+
'md': 'markdown'
|
97
|
+
},
|
98
|
+
|
99
|
+
// Default filters
|
100
|
+
DEFAULT_FILTERS: {
|
101
|
+
language: 'all',
|
102
|
+
searchTerm: '',
|
103
|
+
minComplexity: 0,
|
104
|
+
maxComplexity: 999,
|
105
|
+
showHidden: false
|
106
|
+
},
|
107
|
+
|
108
|
+
// API endpoints
|
109
|
+
API_ENDPOINTS: {
|
110
|
+
FILE_READ: '/api/file/read',
|
111
|
+
ANALYZE_FILE: '/api/analyze/file',
|
112
|
+
ANALYZE_DIRECTORY: '/api/analyze/directory',
|
113
|
+
SEARCH: '/api/search'
|
114
|
+
},
|
115
|
+
|
116
|
+
// WebSocket events
|
117
|
+
SOCKET_EVENTS: {
|
118
|
+
CONNECT: 'connect',
|
119
|
+
DISCONNECT: 'disconnect',
|
120
|
+
CODE_UPDATE: 'code_update',
|
121
|
+
ANALYSIS_START: 'analysis_start',
|
122
|
+
ANALYSIS_PROGRESS: 'analysis_progress',
|
123
|
+
ANALYSIS_COMPLETE: 'analysis_complete',
|
124
|
+
ANALYSIS_ERROR: 'analysis_error',
|
125
|
+
FILE_SELECTED: 'file_selected',
|
126
|
+
NODE_EXPANDED: 'node_expanded',
|
127
|
+
NODE_COLLAPSED: 'node_collapsed'
|
128
|
+
},
|
129
|
+
|
130
|
+
// Messages
|
131
|
+
MESSAGES: {
|
132
|
+
NO_WORKING_DIR: 'Please select a working directory to view the code tree',
|
133
|
+
LOADING: 'Loading code tree...',
|
134
|
+
ANALYZING: 'Analyzing code structure...',
|
135
|
+
NO_DATA: 'No code structure data available',
|
136
|
+
ERROR: 'Error loading code tree',
|
137
|
+
EMPTY_DIR: 'Directory is empty',
|
138
|
+
NO_RESULTS: 'No matching files found',
|
139
|
+
CLICK_TO_EXPLORE: 'Click to explore contents',
|
140
|
+
CLICK_TO_ANALYZE: 'Click to analyze file'
|
141
|
+
},
|
142
|
+
|
143
|
+
// Performance thresholds
|
144
|
+
PERFORMANCE: {
|
145
|
+
MAX_NODES_RENDER: 1000,
|
146
|
+
MAX_NODES_EXPAND: 100,
|
147
|
+
DEBOUNCE_SEARCH: 300,
|
148
|
+
DEBOUNCE_RESIZE: 150,
|
149
|
+
CACHE_TTL: 300000 // 5 minutes
|
150
|
+
},
|
151
|
+
|
152
|
+
// Icon mappings
|
153
|
+
ICONS: {
|
154
|
+
// Node type icons
|
155
|
+
MODULE: '📦',
|
156
|
+
CLASS: '🏗️',
|
157
|
+
FUNCTION: '⚡',
|
158
|
+
METHOD: '🔧',
|
159
|
+
PROPERTY: '📌',
|
160
|
+
VARIABLE: '📍',
|
161
|
+
DIRECTORY: '📁',
|
162
|
+
FILE: '📄',
|
163
|
+
|
164
|
+
// State icons
|
165
|
+
LOADING: '⏳',
|
166
|
+
ERROR: '❌',
|
167
|
+
WARNING: '⚠️',
|
168
|
+
SUCCESS: '✅',
|
169
|
+
|
170
|
+
// Action icons
|
171
|
+
EXPAND: '▶',
|
172
|
+
COLLAPSE: '▼',
|
173
|
+
SEARCH: '🔍',
|
174
|
+
FILTER: '🔽',
|
175
|
+
REFRESH: '🔄',
|
176
|
+
SETTINGS: '⚙️'
|
177
|
+
},
|
178
|
+
|
179
|
+
// CSS classes
|
180
|
+
CSS_CLASSES: {
|
181
|
+
// Container classes
|
182
|
+
CONTAINER: 'code-tree-container',
|
183
|
+
SVG: 'code-tree-svg',
|
184
|
+
GROUP: 'code-tree-group',
|
185
|
+
|
186
|
+
// Node classes
|
187
|
+
NODE: 'tree-node',
|
188
|
+
NODE_SELECTED: 'tree-node-selected',
|
189
|
+
NODE_HOVER: 'tree-node-hover',
|
190
|
+
NODE_LOADING: 'tree-node-loading',
|
191
|
+
NODE_ERROR: 'tree-node-error',
|
192
|
+
|
193
|
+
// Link classes
|
194
|
+
LINK: 'tree-link',
|
195
|
+
LINK_SELECTED: 'tree-link-selected',
|
196
|
+
|
197
|
+
// Text classes
|
198
|
+
LABEL: 'tree-label',
|
199
|
+
LABEL_PRIMARY: 'tree-label-primary',
|
200
|
+
LABEL_SECONDARY: 'tree-label-secondary',
|
201
|
+
|
202
|
+
// Tooltip classes
|
203
|
+
TOOLTIP: 'code-tree-tooltip',
|
204
|
+
TOOLTIP_VISIBLE: 'code-tree-tooltip-visible',
|
205
|
+
|
206
|
+
// Control classes
|
207
|
+
CONTROLS: 'tree-controls',
|
208
|
+
CONTROL_BTN: 'tree-control-btn',
|
209
|
+
CONTROL_ACTIVE: 'tree-control-active'
|
210
|
+
}
|
211
|
+
};
|
212
|
+
|
213
|
+
// Freeze constants to prevent modification
|
214
|
+
Object.freeze(treeConstants);
|
215
|
+
Object.freeze(treeConstants.DEFAULT_MARGIN);
|
216
|
+
Object.freeze(treeConstants.NODE_RADIUS);
|
217
|
+
Object.freeze(treeConstants.COLORS);
|
218
|
+
Object.freeze(treeConstants.TREE_LAYOUT);
|
219
|
+
Object.freeze(treeConstants.LANGUAGE_EXTENSIONS);
|
220
|
+
Object.freeze(treeConstants.DEFAULT_FILTERS);
|
221
|
+
Object.freeze(treeConstants.API_ENDPOINTS);
|
222
|
+
Object.freeze(treeConstants.SOCKET_EVENTS);
|
223
|
+
Object.freeze(treeConstants.MESSAGES);
|
224
|
+
Object.freeze(treeConstants.PERFORMANCE);
|
225
|
+
Object.freeze(treeConstants.ICONS);
|
226
|
+
Object.freeze(treeConstants.CSS_CLASSES);
|
227
|
+
|
228
|
+
// Support both module and global usage
|
229
|
+
if (typeof module !== 'undefined' && module.exports) {
|
230
|
+
module.exports = treeConstants;
|
231
|
+
} else if (typeof define === 'function' && define.amd) {
|
232
|
+
define([], () => treeConstants);
|
233
|
+
} else {
|
234
|
+
window.treeConstants = treeConstants;
|
235
|
+
}
|