x-ipe 1.0.24__py3-none-any.whl → 1.0.25__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.
- x_ipe/app.py +25 -3
- x_ipe/handlers/terminal_handlers.py +6 -0
- x_ipe/handlers/voice_handlers.py +5 -0
- x_ipe/resources/copilot-instructions.md +19 -6
- x_ipe/resources/skills/lesson-learned/SKILL.md +208 -0
- x_ipe/resources/skills/lesson-learned/references/examples.md +238 -0
- x_ipe/resources/skills/project-quality-board-management/SKILL.md +135 -298
- x_ipe/resources/skills/project-quality-board-management/references/evaluation-principles.md +213 -0
- x_ipe/resources/skills/project-quality-board-management/references/evaluation-procedures.md +214 -0
- x_ipe/resources/skills/project-quality-board-management/templates/quality-report.md +70 -18
- x_ipe/resources/skills/task-execution-guideline/SKILL.md +2 -2
- x_ipe/resources/skills/task-execution-guideline/templates/task-record.yaml +1 -1
- x_ipe/resources/skills/task-type-code-implementation/SKILL.md +72 -270
- x_ipe/resources/skills/task-type-code-implementation/references/implementation-guidelines.md +432 -0
- x_ipe/resources/skills/task-type-code-refactor-v2/SKILL.md +127 -353
- x_ipe/resources/skills/task-type-code-refactor-v2/references/refactoring-techniques.md +373 -0
- x_ipe/resources/skills/task-type-feature-breakdown/SKILL.md +31 -243
- x_ipe/resources/skills/task-type-feature-breakdown/references/breakdown-guidelines.md +330 -0
- x_ipe/resources/skills/task-type-feature-refinement/SKILL.md +27 -180
- x_ipe/resources/skills/task-type-feature-refinement/references/specification-writing-guide.md +267 -0
- x_ipe/resources/skills/task-type-idea-mockup/SKILL.md +38 -276
- x_ipe/resources/skills/task-type-idea-mockup/references/mockup-guidelines.md +299 -0
- x_ipe/resources/skills/task-type-idea-to-architecture/SKILL.md +20 -218
- x_ipe/resources/skills/task-type-idea-to-architecture/references/architecture-patterns.md +342 -0
- x_ipe/resources/skills/task-type-ideation/SKILL.md +10 -266
- x_ipe/resources/skills/task-type-ideation/references/folder-naming-guide.md +55 -0
- x_ipe/resources/skills/task-type-ideation/references/tool-usage-guide.md +236 -0
- x_ipe/resources/skills/task-type-ideation-v2/SKILL.md +488 -0
- x_ipe/resources/skills/task-type-ideation-v2/references/examples.md +377 -0
- x_ipe/resources/skills/task-type-ideation-v2/references/folder-naming-guide.md +74 -0
- x_ipe/resources/skills/task-type-ideation-v2/references/tool-usage-guide.md +145 -0
- x_ipe/resources/skills/task-type-ideation-v2/references/visualization-guide.md +160 -0
- x_ipe/resources/skills/task-type-ideation-v2/templates/idea-summary.md +86 -0
- x_ipe/resources/skills/task-type-refactoring-analysis/SKILL.md +83 -145
- x_ipe/resources/skills/task-type-refactoring-analysis/references/output-schema.md +172 -0
- x_ipe/resources/skills/task-type-technical-design/SKILL.md +28 -214
- x_ipe/resources/skills/task-type-technical-design/references/design-templates.md +422 -0
- x_ipe/resources/skills/task-type-test-generation/SKILL.md +47 -332
- x_ipe/resources/skills/task-type-test-generation/references/test-patterns.md +368 -0
- x_ipe/resources/skills/tool-tracing-creator/SKILL.md +312 -0
- x_ipe/resources/skills/tool-tracing-creator/references/examples.md +324 -0
- x_ipe/resources/skills/tool-tracing-instrumentation/SKILL.md +373 -0
- x_ipe/resources/skills/tool-tracing-instrumentation/references/examples.md +264 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/SKILL.md +486 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/10. example-gate-conditions.md +73 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/11. reference-quality-standards.md +127 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/2. reference-section-order.md +127 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/3. example-step-based-code-review.md +84 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/4. example-step-based-feature-implementation.md +113 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/5. example-function-based-validation.md +73 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/6. example-function-based-analysis.md +94 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/7. example-task-io-code-implementation.md +36 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/8. example-structured-summary.md +43 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/9. example-dor-dod.md +77 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/examples.md +429 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/references/skill-general-guidelines-v2.md +611 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-meta.md +153 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-task-based.md +324 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-task-category.md +109 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-tool.md +205 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-meta.md +334 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-task-based.md +279 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-tool.md +175 -0
- x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-workflow-orchestration.md +329 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/SKILL.md +487 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/references/examples.md +377 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/references/folder-naming-guide.md +74 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/references/tool-usage-guide.md +145 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/references/visualization-guide.md +160 -0
- x_ipe/resources/skills/x-ipe-task-based-ideation/templates/idea-summary.md +86 -0
- x_ipe/routes/__init__.py +2 -0
- x_ipe/routes/ideas_routes.py +17 -0
- x_ipe/routes/kb_routes.py +80 -0
- x_ipe/routes/main_routes.py +18 -0
- x_ipe/routes/project_routes.py +7 -0
- x_ipe/routes/proxy_routes.py +2 -0
- x_ipe/routes/quality_evaluation_routes.py +193 -0
- x_ipe/routes/settings_routes.py +6 -0
- x_ipe/routes/tools_routes.py +6 -0
- x_ipe/routes/tracing_routes.py +232 -0
- x_ipe/routes/uiux_feedback_routes.py +30 -0
- x_ipe/services/__init__.py +5 -0
- x_ipe/services/config_service.py +6 -0
- x_ipe/services/file_service.py +20 -0
- x_ipe/services/homepage_service.py +160 -0
- x_ipe/services/ideas_service.py +19 -0
- x_ipe/services/kb_service.py +378 -0
- x_ipe/services/proxy_service.py +4 -0
- x_ipe/services/settings_service.py +13 -0
- x_ipe/services/skills_service.py +4 -0
- x_ipe/services/terminal_service.py +24 -0
- x_ipe/services/themes_service.py +4 -0
- x_ipe/services/tools_config_service.py +4 -0
- x_ipe/services/tracing_service.py +333 -0
- x_ipe/services/uiux_feedback_service.py +32 -0
- x_ipe/services/voice_input_service_v2.py +11 -0
- x_ipe/static/css/base.css +7 -0
- x_ipe/static/css/homepage-infinity.css +330 -0
- x_ipe/static/css/kb-core.css +301 -0
- x_ipe/static/css/quality-evaluation.css +345 -0
- x_ipe/static/css/sidebar.css +14 -4
- x_ipe/static/css/terminal.css +1 -0
- x_ipe/static/css/tracing-dashboard.css +796 -0
- x_ipe/static/css/workplace.css +20 -0
- x_ipe/static/img/homepage-infinity-loop.png +0 -0
- x_ipe/static/js/features/homepage-infinity.js +314 -0
- x_ipe/static/js/features/kb-core.js +371 -0
- x_ipe/static/js/features/quality-evaluation.js +387 -0
- x_ipe/static/js/features/sidebar.js +255 -12
- x_ipe/static/js/features/tracing-dashboard.js +855 -0
- x_ipe/static/js/features/tracing-graph.js +1031 -0
- x_ipe/static/js/features/tree-search.js +6 -2
- x_ipe/static/js/features/workplace.js +200 -6
- x_ipe/static/js/init.js +76 -0
- x_ipe/static/js/uiux-feedback.js +18 -2
- x_ipe/templates/base.html +19 -0
- x_ipe/templates/index.html +7 -1
- x_ipe/templates/knowledge-base.html +110 -0
- x_ipe/templates/workplace.html +4 -0
- x_ipe/tracing/__init__.py +37 -0
- x_ipe/tracing/buffer.py +135 -0
- x_ipe/tracing/context.py +125 -0
- x_ipe/tracing/decorator.py +288 -0
- x_ipe/tracing/middleware.py +197 -0
- x_ipe/tracing/parser.py +235 -0
- x_ipe/tracing/redactor.py +111 -0
- x_ipe/tracing/writer.py +122 -0
- {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/METADATA +2 -2
- {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/RECORD +132 -62
- x_ipe/resources/skills/x-ipe-skill-creator/SKILL.md +0 -329
- x_ipe/resources/skills/x-ipe-skill-creator/references/output-patterns.md +0 -169
- x_ipe/resources/skills/x-ipe-skill-creator/references/skill-structure.md +0 -162
- x_ipe/resources/skills/x-ipe-skill-creator/references/workflows.md +0 -110
- x_ipe/resources/skills/x-ipe-skill-creator/templates/references/examples.md +0 -113
- x_ipe/resources/skills/x-ipe-skill-creator/templates/skill-category-skill.md +0 -296
- x_ipe/resources/skills/x-ipe-skill-creator/templates/task-type-skill.md +0 -269
- {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/WHEEL +0 -0
- {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/entry_points.txt +0 -0
- {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/licenses/LICENSE +0 -0
|
@@ -119,10 +119,14 @@ class TreeSearchManager {
|
|
|
119
119
|
const items = this.treeContainer.querySelectorAll('.tree-item');
|
|
120
120
|
|
|
121
121
|
if (!normalizedQuery) {
|
|
122
|
-
// Show all items
|
|
122
|
+
// Show all items and collapse folders
|
|
123
123
|
items.forEach(item => {
|
|
124
124
|
item.style.display = '';
|
|
125
|
-
item.classList.remove('search-match', 'search-parent');
|
|
125
|
+
item.classList.remove('search-match', 'search-parent', 'expanded');
|
|
126
|
+
const childContainer = item.querySelector('.tree-children');
|
|
127
|
+
if (childContainer) {
|
|
128
|
+
childContainer.style.display = 'none';
|
|
129
|
+
}
|
|
126
130
|
});
|
|
127
131
|
return;
|
|
128
132
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
class WorkplaceManager {
|
|
11
11
|
constructor() {
|
|
12
|
-
this.currentView = 'tree'; // tree | upload | editor | folderView
|
|
12
|
+
this.currentView = 'tree'; // tree | upload | editor | folderView | tracing | homepage
|
|
13
13
|
this.currentPath = null;
|
|
14
14
|
this.saveTimer = null;
|
|
15
15
|
this.saveDelay = 5000; // 5 seconds auto-save delay
|
|
@@ -33,6 +33,12 @@ class WorkplaceManager {
|
|
|
33
33
|
this.treeDragManager = null;
|
|
34
34
|
this.confirmDialog = null;
|
|
35
35
|
|
|
36
|
+
// FEATURE-023-B: Tracing Dashboard
|
|
37
|
+
this.tracingDashboard = null;
|
|
38
|
+
|
|
39
|
+
// FEATURE-026: Homepage reference
|
|
40
|
+
this.sidebarRef = null;
|
|
41
|
+
|
|
36
42
|
this._loadCopilotPrompts();
|
|
37
43
|
}
|
|
38
44
|
|
|
@@ -44,7 +50,8 @@ class WorkplaceManager {
|
|
|
44
50
|
const response = await fetch('/api/config/copilot-prompt');
|
|
45
51
|
if (response.ok) {
|
|
46
52
|
const data = await response.json();
|
|
47
|
-
|
|
53
|
+
// TASK-196: Config structure is data.ideation.prompts, not data.prompts
|
|
54
|
+
this.copilotPrompts = data.ideation?.prompts || [];
|
|
48
55
|
}
|
|
49
56
|
} catch (error) {
|
|
50
57
|
console.warn('Failed to load copilot prompts:', error);
|
|
@@ -61,9 +68,12 @@ class WorkplaceManager {
|
|
|
61
68
|
<div class="workplace-container">
|
|
62
69
|
<div class="workplace-sidebar pinned" id="workplace-sidebar">
|
|
63
70
|
<div class="workplace-sidebar-icons">
|
|
64
|
-
<button class="workplace-sidebar-icon" title="Browse Ideas" id="workplace-icon-browse">
|
|
71
|
+
<button class="workplace-sidebar-icon active" title="Browse Ideas" id="workplace-icon-browse">
|
|
65
72
|
<i class="bi bi-folder2"></i>
|
|
66
73
|
</button>
|
|
74
|
+
<button class="workplace-sidebar-icon" title="Tracing Dashboard" id="workplace-icon-tracing">
|
|
75
|
+
<i class="bi bi-graph-up"></i>
|
|
76
|
+
</button>
|
|
67
77
|
</div>
|
|
68
78
|
<div class="workplace-sidebar-content">
|
|
69
79
|
<div class="workplace-sidebar-header">
|
|
@@ -72,6 +82,9 @@ class WorkplaceManager {
|
|
|
72
82
|
<button class="workplace-create-folder-btn" title="Create new folder" id="workplace-create-folder-btn">
|
|
73
83
|
<i class="bi bi-folder-plus"></i>
|
|
74
84
|
</button>
|
|
85
|
+
<button class="workplace-collapse-all-btn" title="Collapse all folders" id="workplace-collapse-all-btn">
|
|
86
|
+
<i class="bi bi-arrows-collapse"></i>
|
|
87
|
+
</button>
|
|
75
88
|
<button class="workplace-pin-btn" title="Unpin sidebar" id="workplace-pin-btn">
|
|
76
89
|
<i class="bi bi-pin-angle-fill"></i>
|
|
77
90
|
</button>
|
|
@@ -98,9 +111,12 @@ class WorkplaceManager {
|
|
|
98
111
|
|
|
99
112
|
// Bind sidebar icon events
|
|
100
113
|
document.getElementById('workplace-icon-browse').addEventListener('click', () => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
114
|
+
this._switchToIdeasView();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
// FEATURE-023-B: Tracing icon event
|
|
118
|
+
document.getElementById('workplace-icon-tracing').addEventListener('click', () => {
|
|
119
|
+
this._switchToTracingView();
|
|
104
120
|
});
|
|
105
121
|
|
|
106
122
|
// Bind pin button
|
|
@@ -127,6 +143,11 @@ class WorkplaceManager {
|
|
|
127
143
|
this._createFolder(); // Create new folder at root level
|
|
128
144
|
});
|
|
129
145
|
|
|
146
|
+
// Bind collapse all button
|
|
147
|
+
document.getElementById('workplace-collapse-all-btn').addEventListener('click', () => {
|
|
148
|
+
this._collapseAllFolders();
|
|
149
|
+
});
|
|
150
|
+
|
|
130
151
|
// Load tree and start polling
|
|
131
152
|
await this.loadTree();
|
|
132
153
|
this._startPolling();
|
|
@@ -436,6 +457,18 @@ class WorkplaceManager {
|
|
|
436
457
|
return expanded;
|
|
437
458
|
}
|
|
438
459
|
|
|
460
|
+
/**
|
|
461
|
+
* Collapse all expanded folders in the tree
|
|
462
|
+
*/
|
|
463
|
+
_collapseAllFolders() {
|
|
464
|
+
const container = document.getElementById('workplace-tree');
|
|
465
|
+
if (!container) return;
|
|
466
|
+
const expandedItems = container.querySelectorAll('.workplace-tree-item.expanded');
|
|
467
|
+
expandedItems.forEach(item => {
|
|
468
|
+
item.classList.remove('expanded');
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
|
|
439
472
|
/**
|
|
440
473
|
* Restore expanded state to folders after re-rendering
|
|
441
474
|
*/
|
|
@@ -955,6 +988,9 @@ class WorkplaceManager {
|
|
|
955
988
|
this.hasUnsavedChanges = false;
|
|
956
989
|
this.isEditing = false;
|
|
957
990
|
|
|
991
|
+
// Highlight parent folder in tree
|
|
992
|
+
this._highlightParentFolder(path);
|
|
993
|
+
|
|
958
994
|
// Detect file type
|
|
959
995
|
const ext = path.split('.').pop().toLowerCase();
|
|
960
996
|
this.fileExtension = ext;
|
|
@@ -1768,6 +1804,9 @@ class WorkplaceManager {
|
|
|
1768
1804
|
this.hasUnsavedChanges = false;
|
|
1769
1805
|
this.targetFolderPath = targetFolder;
|
|
1770
1806
|
|
|
1807
|
+
// Clear folder highlight when leaving file view
|
|
1808
|
+
this._highlightParentFolder(null);
|
|
1809
|
+
|
|
1771
1810
|
// Build target folder indicator
|
|
1772
1811
|
const folderName = targetFolder ? targetFolder.split('/').pop() : null;
|
|
1773
1812
|
const targetIndicator = targetFolder ? `
|
|
@@ -2620,6 +2659,53 @@ class WorkplaceManager {
|
|
|
2620
2659
|
}
|
|
2621
2660
|
}
|
|
2622
2661
|
|
|
2662
|
+
/**
|
|
2663
|
+
* Highlight the parent folder of the currently previewed file
|
|
2664
|
+
* Changes folder icon to yellow to indicate active file location
|
|
2665
|
+
*/
|
|
2666
|
+
_highlightParentFolder(filePath) {
|
|
2667
|
+
// Remove previous highlight
|
|
2668
|
+
const previousHighlight = document.querySelectorAll('.workplace-tree-item.folder-highlighted');
|
|
2669
|
+
previousHighlight.forEach(el => {
|
|
2670
|
+
el.classList.remove('folder-highlighted');
|
|
2671
|
+
const icon = el.querySelector('.workplace-tree-item-content > i.bi-folder, .workplace-tree-item-content > i.bi-folder-fill');
|
|
2672
|
+
if (icon) {
|
|
2673
|
+
icon.classList.remove('bi-folder-fill');
|
|
2674
|
+
icon.classList.add('bi-folder');
|
|
2675
|
+
}
|
|
2676
|
+
});
|
|
2677
|
+
|
|
2678
|
+
if (!filePath) return;
|
|
2679
|
+
|
|
2680
|
+
// Get parent folder path
|
|
2681
|
+
const pathParts = filePath.split('/');
|
|
2682
|
+
pathParts.pop(); // Remove file name
|
|
2683
|
+
const parentFolderPath = pathParts.join('/');
|
|
2684
|
+
|
|
2685
|
+
if (!parentFolderPath) return;
|
|
2686
|
+
|
|
2687
|
+
// Find and highlight the parent folder
|
|
2688
|
+
const treeItems = document.querySelectorAll('.workplace-tree-item[data-type="folder"]');
|
|
2689
|
+
for (const item of treeItems) {
|
|
2690
|
+
if (item.dataset.path === parentFolderPath) {
|
|
2691
|
+
item.classList.add('folder-highlighted');
|
|
2692
|
+
const icon = item.querySelector('.workplace-tree-item-content > i.bi-folder');
|
|
2693
|
+
if (icon) {
|
|
2694
|
+
icon.classList.remove('bi-folder');
|
|
2695
|
+
icon.classList.add('bi-folder-fill');
|
|
2696
|
+
}
|
|
2697
|
+
|
|
2698
|
+
// Expand parent folders to make highlighted folder visible
|
|
2699
|
+
let parent = item.parentElement?.closest('.workplace-tree-item.has-children');
|
|
2700
|
+
while (parent) {
|
|
2701
|
+
parent.classList.add('expanded');
|
|
2702
|
+
parent = parent.parentElement?.closest('.workplace-tree-item.has-children');
|
|
2703
|
+
}
|
|
2704
|
+
break;
|
|
2705
|
+
}
|
|
2706
|
+
}
|
|
2707
|
+
}
|
|
2708
|
+
|
|
2623
2709
|
/**
|
|
2624
2710
|
* Escape HTML special characters
|
|
2625
2711
|
*/
|
|
@@ -2628,4 +2714,112 @@ class WorkplaceManager {
|
|
|
2628
2714
|
div.textContent = text || '';
|
|
2629
2715
|
return div.innerHTML;
|
|
2630
2716
|
}
|
|
2717
|
+
|
|
2718
|
+
// =========================================================================
|
|
2719
|
+
// FEATURE-023-B: Tracing Dashboard View
|
|
2720
|
+
// =========================================================================
|
|
2721
|
+
|
|
2722
|
+
/**
|
|
2723
|
+
* Switch to Ideas view (tree navigation)
|
|
2724
|
+
*/
|
|
2725
|
+
_switchToIdeasView() {
|
|
2726
|
+
// Update active icon
|
|
2727
|
+
document.querySelectorAll('.workplace-sidebar-icon').forEach(icon => {
|
|
2728
|
+
icon.classList.remove('active');
|
|
2729
|
+
});
|
|
2730
|
+
document.getElementById('workplace-icon-browse').classList.add('active');
|
|
2731
|
+
|
|
2732
|
+
// Show sidebar content, hide tracing
|
|
2733
|
+
const sidebarContent = document.querySelector('.workplace-sidebar-content');
|
|
2734
|
+
if (sidebarContent) {
|
|
2735
|
+
sidebarContent.style.display = '';
|
|
2736
|
+
}
|
|
2737
|
+
|
|
2738
|
+
// Destroy tracing dashboard if active
|
|
2739
|
+
if (this.tracingDashboard) {
|
|
2740
|
+
this.tracingDashboard.destroy();
|
|
2741
|
+
this.tracingDashboard = null;
|
|
2742
|
+
}
|
|
2743
|
+
|
|
2744
|
+
// Restore content to placeholder or current view
|
|
2745
|
+
const contentContainer = document.getElementById('workplace-content');
|
|
2746
|
+
if (contentContainer && this.currentView === 'tracing') {
|
|
2747
|
+
contentContainer.innerHTML = `
|
|
2748
|
+
<div class="workplace-placeholder">
|
|
2749
|
+
<i class="bi bi-lightbulb"></i>
|
|
2750
|
+
<h5>Welcome to Workplace</h5>
|
|
2751
|
+
<p class="text-muted">Hover sidebar to browse ideas, or click pin to keep it open</p>
|
|
2752
|
+
</div>
|
|
2753
|
+
`;
|
|
2754
|
+
this.currentView = 'tree';
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
/**
|
|
2759
|
+
* Switch to Tracing Dashboard view
|
|
2760
|
+
*/
|
|
2761
|
+
_switchToTracingView() {
|
|
2762
|
+
// Update active icon
|
|
2763
|
+
document.querySelectorAll('.workplace-sidebar-icon').forEach(icon => {
|
|
2764
|
+
icon.classList.remove('active');
|
|
2765
|
+
});
|
|
2766
|
+
document.getElementById('workplace-icon-tracing').classList.add('active');
|
|
2767
|
+
|
|
2768
|
+
// Hide sidebar content (tree)
|
|
2769
|
+
const sidebarContent = document.querySelector('.workplace-sidebar-content');
|
|
2770
|
+
if (sidebarContent) {
|
|
2771
|
+
sidebarContent.style.display = 'none';
|
|
2772
|
+
}
|
|
2773
|
+
|
|
2774
|
+
// Collapse sidebar to icons only
|
|
2775
|
+
const sidebar = document.getElementById('workplace-sidebar');
|
|
2776
|
+
if (sidebar) {
|
|
2777
|
+
sidebar.classList.remove('pinned', 'expanded');
|
|
2778
|
+
}
|
|
2779
|
+
|
|
2780
|
+
// Initialize tracing dashboard
|
|
2781
|
+
this.currentView = 'tracing';
|
|
2782
|
+
const contentContainer = document.getElementById('workplace-content');
|
|
2783
|
+
if (contentContainer && window.TracingDashboard) {
|
|
2784
|
+
this.tracingDashboard = new window.TracingDashboard(contentContainer);
|
|
2785
|
+
this.tracingDashboard.init();
|
|
2786
|
+
} else if (contentContainer) {
|
|
2787
|
+
contentContainer.innerHTML = `
|
|
2788
|
+
<div class="workplace-placeholder">
|
|
2789
|
+
<i class="bi bi-graph-up"></i>
|
|
2790
|
+
<h5>Tracing Dashboard</h5>
|
|
2791
|
+
<p class="text-muted">Tracing module not loaded</p>
|
|
2792
|
+
</div>
|
|
2793
|
+
`;
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2796
|
+
|
|
2797
|
+
/**
|
|
2798
|
+
* FEATURE-026: Show Homepage Infinity Loop
|
|
2799
|
+
* Called when X-IPE logo is clicked or no file selected
|
|
2800
|
+
*/
|
|
2801
|
+
showHomepage() {
|
|
2802
|
+
this.currentView = 'homepage';
|
|
2803
|
+
this.currentPath = null;
|
|
2804
|
+
|
|
2805
|
+
// Try workplace-content first (workplace two-column view), then content-body (main app)
|
|
2806
|
+
const contentContainer = document.getElementById('workplace-content') ||
|
|
2807
|
+
document.getElementById('content-body');
|
|
2808
|
+
if (!contentContainer) return;
|
|
2809
|
+
|
|
2810
|
+
// Check if HomepageInfinity is available
|
|
2811
|
+
if (typeof window.HomepageInfinity !== 'undefined') {
|
|
2812
|
+
contentContainer.innerHTML = window.HomepageInfinity.getTemplate();
|
|
2813
|
+
window.HomepageInfinity.init(this.sidebarRef);
|
|
2814
|
+
} else {
|
|
2815
|
+
// Fallback placeholder
|
|
2816
|
+
contentContainer.innerHTML = `
|
|
2817
|
+
<div class="workplace-placeholder">
|
|
2818
|
+
<i class="bi bi-infinity"></i>
|
|
2819
|
+
<h5>X-IPE</h5>
|
|
2820
|
+
<p class="text-muted">AI-Powered Development Lifecycle</p>
|
|
2821
|
+
</div>
|
|
2822
|
+
`;
|
|
2823
|
+
}
|
|
2824
|
+
}
|
|
2631
2825
|
}
|
x_ipe/static/js/init.js
CHANGED
|
@@ -56,6 +56,19 @@ function initializeApp() {
|
|
|
56
56
|
window.projectSidebar = new ProjectSidebar('sidebar-content');
|
|
57
57
|
window.projectSidebar.load();
|
|
58
58
|
|
|
59
|
+
// FEATURE-026: Show homepage by default on page load
|
|
60
|
+
const contentBody = document.getElementById('content-body');
|
|
61
|
+
if (contentBody && typeof window.HomepageInfinity !== 'undefined') {
|
|
62
|
+
contentBody.innerHTML = window.HomepageInfinity.getTemplate();
|
|
63
|
+
window.HomepageInfinity.init(window.projectSidebar);
|
|
64
|
+
|
|
65
|
+
// Update breadcrumb
|
|
66
|
+
const breadcrumb = document.getElementById('breadcrumb');
|
|
67
|
+
if (breadcrumb) {
|
|
68
|
+
breadcrumb.innerHTML = '<li class="breadcrumb-item active">Home</li>';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
59
72
|
// Project switcher with callback to refresh sidebar
|
|
60
73
|
window.projectSwitcher = new ProjectSwitcher('project-select', (project) => {
|
|
61
74
|
window.projectSidebar.load();
|
|
@@ -81,6 +94,41 @@ function initializeApp() {
|
|
|
81
94
|
});
|
|
82
95
|
}
|
|
83
96
|
|
|
97
|
+
// FEATURE-026: X-IPE Logo click handler - show homepage
|
|
98
|
+
// Support both workplace.html (.top-bar-brand) and index.html (#brand-home-link)
|
|
99
|
+
const logoBrand = document.querySelector('.top-bar-brand') || document.getElementById('brand-home-link');
|
|
100
|
+
if (logoBrand) {
|
|
101
|
+
logoBrand.addEventListener('click', (e) => {
|
|
102
|
+
e.preventDefault(); // Prevent navigation
|
|
103
|
+
|
|
104
|
+
// Store sidebar reference for homepage navigation
|
|
105
|
+
if (window.workplaceManager) {
|
|
106
|
+
window.workplaceManager.sidebarRef = window.projectSidebar;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Show homepage in content area
|
|
110
|
+
const contentBody = document.getElementById('content-body');
|
|
111
|
+
if (contentBody && typeof window.HomepageInfinity !== 'undefined') {
|
|
112
|
+
contentBody.innerHTML = window.HomepageInfinity.getTemplate();
|
|
113
|
+
window.HomepageInfinity.init(window.projectSidebar);
|
|
114
|
+
|
|
115
|
+
// Update breadcrumb
|
|
116
|
+
const breadcrumb = document.getElementById('breadcrumb');
|
|
117
|
+
if (breadcrumb) {
|
|
118
|
+
breadcrumb.innerHTML = '<li class="breadcrumb-item active">Home</li>';
|
|
119
|
+
}
|
|
120
|
+
} else if (window.workplaceManager) {
|
|
121
|
+
window.workplaceManager.showHomepage();
|
|
122
|
+
|
|
123
|
+
// Update breadcrumb
|
|
124
|
+
const breadcrumb = document.getElementById('breadcrumb');
|
|
125
|
+
if (breadcrumb) {
|
|
126
|
+
breadcrumb.innerHTML = '<li class="breadcrumb-item active">Home</li>';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
84
132
|
// FEATURE-011: Initialize Stage Toolbox Modal
|
|
85
133
|
if (typeof StageToolboxModal !== 'undefined') {
|
|
86
134
|
window.stageToolboxModal = new StageToolboxModal();
|
|
@@ -92,6 +140,34 @@ function initializeApp() {
|
|
|
92
140
|
}
|
|
93
141
|
}
|
|
94
142
|
|
|
143
|
+
// FEATURE-025-A: Knowledge Base button click handler
|
|
144
|
+
const kbBtn = document.getElementById('btn-knowledge-base');
|
|
145
|
+
if (kbBtn) {
|
|
146
|
+
kbBtn.addEventListener('click', () => {
|
|
147
|
+
console.log('[KB] Knowledge Base button clicked');
|
|
148
|
+
|
|
149
|
+
// Update breadcrumb
|
|
150
|
+
const breadcrumb = document.getElementById('breadcrumb');
|
|
151
|
+
if (breadcrumb) {
|
|
152
|
+
breadcrumb.innerHTML = '<li class="breadcrumb-item active">Knowledge Base</li>';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Hide Create Idea button
|
|
156
|
+
const createIdeaBtn = document.getElementById('btn-create-idea');
|
|
157
|
+
if (createIdeaBtn) {
|
|
158
|
+
createIdeaBtn.classList.add('d-none');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Render Knowledge Base view in content area (two-column layout like Ideation)
|
|
162
|
+
const container = document.getElementById('content-body');
|
|
163
|
+
if (container && window.kbCore) {
|
|
164
|
+
window.kbCore.render(container);
|
|
165
|
+
} else if (container) {
|
|
166
|
+
container.innerHTML = '<div class="p-4 text-muted">Knowledge Base module not loaded</div>';
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
95
171
|
// Initialize terminal panel (FEATURE-005)
|
|
96
172
|
if (typeof TerminalManager !== 'undefined') {
|
|
97
173
|
window.terminalManager = new TerminalManager('terminal-panes');
|
x_ipe/static/js/uiux-feedback.js
CHANGED
|
@@ -1547,10 +1547,26 @@ class UIUXFeedbackManager {
|
|
|
1547
1547
|
/**
|
|
1548
1548
|
* Delete a feedback entry
|
|
1549
1549
|
*/
|
|
1550
|
-
_deleteEntry(id) {
|
|
1550
|
+
async _deleteEntry(id) {
|
|
1551
1551
|
const index = this.feedbackEntries.findIndex(e => e.id === id);
|
|
1552
1552
|
if (index >= 0) {
|
|
1553
|
-
const
|
|
1553
|
+
const entry = this.feedbackEntries[index];
|
|
1554
|
+
const name = entry.name;
|
|
1555
|
+
|
|
1556
|
+
// If submitted, delete from filesystem too
|
|
1557
|
+
if (entry.status === 'submitted') {
|
|
1558
|
+
try {
|
|
1559
|
+
const response = await fetch(`/api/uiux-feedback/${encodeURIComponent(name)}`, {
|
|
1560
|
+
method: 'DELETE'
|
|
1561
|
+
});
|
|
1562
|
+
if (!response.ok) {
|
|
1563
|
+
console.warn('[UIUXFeedback] Failed to delete from filesystem');
|
|
1564
|
+
}
|
|
1565
|
+
} catch (err) {
|
|
1566
|
+
console.warn('[UIUXFeedback] Delete API error:', err);
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1554
1570
|
this.feedbackEntries.splice(index, 1);
|
|
1555
1571
|
this._renderFeedbackPanel();
|
|
1556
1572
|
this.updateStatus(`Deleted: ${name}`);
|
x_ipe/templates/base.html
CHANGED
|
@@ -24,6 +24,14 @@
|
|
|
24
24
|
<link href="/static/css/features/stage-toolbox.css" rel="stylesheet">
|
|
25
25
|
<!-- FEATURE-022-A: UI/UX Feedback Browser Simulator -->
|
|
26
26
|
<link href="/static/css/uiux-feedback.css" rel="stylesheet">
|
|
27
|
+
<!-- FEATURE-023-B: Tracing Dashboard UI -->
|
|
28
|
+
<link href="/static/css/tracing-dashboard.css" rel="stylesheet">
|
|
29
|
+
<!-- FEATURE-024: Project Quality Evaluation UI -->
|
|
30
|
+
<link href="/static/css/quality-evaluation.css" rel="stylesheet">
|
|
31
|
+
<!-- FEATURE-025-A: Knowledge Base Core UI -->
|
|
32
|
+
<link href="/static/css/kb-core.css" rel="stylesheet">
|
|
33
|
+
<!-- FEATURE-026: Homepage Infinity Loop -->
|
|
34
|
+
<link href="/static/css/homepage-infinity.css" rel="stylesheet">
|
|
27
35
|
|
|
28
36
|
{% block extra_css %}{% endblock %}
|
|
29
37
|
</head>
|
|
@@ -72,6 +80,17 @@
|
|
|
72
80
|
<script src="/static/3rdparty/html2canvas.min.js"></script>
|
|
73
81
|
<!-- FEATURE-022-A: UI/UX Feedback Browser Simulator -->
|
|
74
82
|
<script src="/static/js/uiux-feedback.js"></script>
|
|
83
|
+
<!-- FEATURE-023-C: G6 Graph Visualization Library -->
|
|
84
|
+
<script src="https://unpkg.com/@antv/g6@4.8.24/dist/g6.min.js"></script>
|
|
85
|
+
<!-- FEATURE-023-B/C: Tracing Dashboard & Graph -->
|
|
86
|
+
<script src="/static/js/features/tracing-graph.js"></script>
|
|
87
|
+
<script src="/static/js/features/tracing-dashboard.js"></script>
|
|
88
|
+
<!-- FEATURE-024: Quality Evaluation UI -->
|
|
89
|
+
<script src="/static/js/features/quality-evaluation.js"></script>
|
|
90
|
+
<!-- FEATURE-025-A: Knowledge Base Core -->
|
|
91
|
+
<script src="/static/js/features/kb-core.js"></script>
|
|
92
|
+
<!-- FEATURE-026: Homepage Infinity Loop -->
|
|
93
|
+
<script src="/static/js/features/homepage-infinity.js"></script>
|
|
75
94
|
<script src="/static/js/init.js"></script>
|
|
76
95
|
|
|
77
96
|
{% block extra_js %}{% endblock %}
|
x_ipe/templates/index.html
CHANGED
|
@@ -8,10 +8,16 @@
|
|
|
8
8
|
<!-- ROW 1: Top Menu Bar -->
|
|
9
9
|
<header class="top-menu">
|
|
10
10
|
<div class="brand">
|
|
11
|
-
|
|
11
|
+
<!-- FEATURE-026: Make brand clickable to show homepage -->
|
|
12
|
+
<a href="#" class="brand-name" id="brand-home-link" title="Go to Homepage">X IPE</a>
|
|
12
13
|
<span class="brand-subtitle">An AI native integrated project environment for end to end business value delivery</span>
|
|
13
14
|
</div>
|
|
14
15
|
<div class="menu-actions">
|
|
16
|
+
<!-- FEATURE-025-A: Knowledge Base Button -->
|
|
17
|
+
<button class="menu-link" id="btn-knowledge-base" title="Knowledge Base - Manage project knowledge">
|
|
18
|
+
<i class="bi bi-archive"></i>
|
|
19
|
+
<span>Knowledge</span>
|
|
20
|
+
</button>
|
|
15
21
|
<!-- FEATURE-011: Stage Toolbox Button -->
|
|
16
22
|
<button class="menu-link" id="btn-stage-toolbox" title="Stage Toolbox - Manage development tools">
|
|
17
23
|
<i class="bi bi-tools"></i>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}Knowledge Base - X-IPE{% endblock %}
|
|
4
|
+
|
|
5
|
+
{% block body %}
|
|
6
|
+
<div class="app-container">
|
|
7
|
+
<!-- ROW 1: Top Bar -->
|
|
8
|
+
<header class="top-bar">
|
|
9
|
+
<div class="d-flex align-items-center gap-3">
|
|
10
|
+
<a href="/" class="top-bar-brand text-decoration-none">
|
|
11
|
+
<i class="bi bi-journal-code me-2"></i>X-IPE
|
|
12
|
+
</a>
|
|
13
|
+
<nav aria-label="breadcrumb" class="top-bar-breadcrumb">
|
|
14
|
+
<ol class="breadcrumb mb-0" id="breadcrumb">
|
|
15
|
+
<li class="breadcrumb-item active">Knowledge Base</li>
|
|
16
|
+
</ol>
|
|
17
|
+
</nav>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="d-flex align-items-center gap-2">
|
|
20
|
+
<button class="btn btn-sm btn-primary" id="btn-refresh-index" title="Refresh index">
|
|
21
|
+
<i class="bi bi-arrow-clockwise"></i> Refresh
|
|
22
|
+
</button>
|
|
23
|
+
<a href="/settings" class="btn btn-link text-light" title="Settings">
|
|
24
|
+
<i class="bi bi-gear-fill"></i>
|
|
25
|
+
</a>
|
|
26
|
+
</div>
|
|
27
|
+
</header>
|
|
28
|
+
|
|
29
|
+
<!-- ROW 2: Middle Section (sidebar + content) -->
|
|
30
|
+
<div class="middle-section" id="middle-section">
|
|
31
|
+
<!-- LEFT: Sidebar Navigation -->
|
|
32
|
+
<nav class="sidebar" id="sidebar">
|
|
33
|
+
<!-- Search Box -->
|
|
34
|
+
<div class="kb-sidebar-search p-2">
|
|
35
|
+
<input type="text" class="form-control form-control-sm" id="kb-search"
|
|
36
|
+
placeholder="Search files..." aria-label="Search knowledge base">
|
|
37
|
+
</div>
|
|
38
|
+
<!-- File Tree -->
|
|
39
|
+
<div class="sidebar-content" id="sidebar-content">
|
|
40
|
+
<div class="loading-spinner">
|
|
41
|
+
<div class="spinner-border spinner-border-sm text-light" role="status">
|
|
42
|
+
<span class="visually-hidden">Loading...</span>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</nav>
|
|
47
|
+
|
|
48
|
+
<!-- Resize Handle -->
|
|
49
|
+
<div class="sidebar-resize-handle" id="sidebar-resize-handle"></div>
|
|
50
|
+
|
|
51
|
+
<!-- RIGHT: Content Area -->
|
|
52
|
+
<main class="content-area">
|
|
53
|
+
<div class="content-view" id="content-view">
|
|
54
|
+
<div class="content-header d-flex justify-content-between align-items-center" id="content-header">
|
|
55
|
+
<h5 class="mb-0" id="content-title">Knowledge Base</h5>
|
|
56
|
+
<div class="kb-stats" id="kb-stats">
|
|
57
|
+
<!-- File count, topic count loaded here -->
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="content-body" id="content-body">
|
|
61
|
+
<!-- KB content loaded here -->
|
|
62
|
+
<div class="kb-landing-view" id="kb-landing-view">
|
|
63
|
+
<div class="kb-section">
|
|
64
|
+
<h6><i class="bi bi-inbox me-2"></i>Landing (Unprocessed)</h6>
|
|
65
|
+
<div class="kb-file-list" id="landing-files">
|
|
66
|
+
<p class="text-muted small">No files in landing folder</p>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="kb-section mt-4">
|
|
70
|
+
<h6><i class="bi bi-folder me-2"></i>Topics</h6>
|
|
71
|
+
<div class="kb-topics-grid" id="topics-grid">
|
|
72
|
+
<p class="text-muted small">No topics created yet</p>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</main>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<!-- ROW 3: Footer Terminal Panel -->
|
|
82
|
+
<div class="terminal-panel" id="terminal-panel">
|
|
83
|
+
<div class="terminal-header">
|
|
84
|
+
<div class="terminal-tabs" id="terminal-tabs">
|
|
85
|
+
<!-- Tabs rendered by JavaScript -->
|
|
86
|
+
</div>
|
|
87
|
+
<div class="d-flex align-items-center gap-2">
|
|
88
|
+
<button class="btn btn-sm btn-outline-light" id="btn-new-terminal" title="New Terminal">
|
|
89
|
+
<i class="bi bi-plus"></i>
|
|
90
|
+
</button>
|
|
91
|
+
<button class="btn btn-sm btn-outline-light terminal-toggle" id="terminal-toggle" title="Toggle Terminal">
|
|
92
|
+
<i class="bi bi-chevron-down"></i>
|
|
93
|
+
</button>
|
|
94
|
+
</div>
|
|
95
|
+
</div>
|
|
96
|
+
<div class="terminal-body" id="terminal-body">
|
|
97
|
+
<!-- xterm.js terminals rendered here -->
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
|
|
102
|
+
<script>
|
|
103
|
+
// Auto-initialize KB view when page loads
|
|
104
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
105
|
+
if (window.kbCore) {
|
|
106
|
+
window.kbCore.init();
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
</script>
|
|
110
|
+
{% endblock %}
|
x_ipe/templates/workplace.html
CHANGED
|
@@ -21,6 +21,10 @@
|
|
|
21
21
|
<button class="btn btn-sm btn-primary" id="btn-create-idea" title="Create new idea">
|
|
22
22
|
<i class="bi bi-plus-lg"></i> Create Idea
|
|
23
23
|
</button>
|
|
24
|
+
<!-- FEATURE-025-A: Knowledge Base Button -->
|
|
25
|
+
<button class="btn btn-sm btn-outline-secondary" id="btn-knowledge-base" title="Knowledge Base">
|
|
26
|
+
<i class="bi bi-archive"></i>
|
|
27
|
+
</button>
|
|
24
28
|
<!-- FEATURE-011: Stage Toolbox Button -->
|
|
25
29
|
<button class="btn btn-sm btn-outline-secondary" id="btn-stage-toolbox" title="Stage Toolbox">
|
|
26
30
|
<i class="bi bi-tools"></i>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
FEATURE-023: Application Action Tracing - Core
|
|
3
|
+
|
|
4
|
+
Tracing module for X-IPE applications.
|
|
5
|
+
|
|
6
|
+
Provides automatic function tracing with sensitive data redaction,
|
|
7
|
+
execution timing, and structured log output.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
from x_ipe.tracing import x_ipe_tracing, TraceContext
|
|
11
|
+
|
|
12
|
+
@x_ipe_tracing(level="INFO", redact=["password"])
|
|
13
|
+
def my_function(email: str, password: str):
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
# Start/end traces manually (usually done by middleware)
|
|
17
|
+
TraceContext.start_trace("POST /api/endpoint")
|
|
18
|
+
# ... execute traced functions ...
|
|
19
|
+
buffer = TraceContext.end_trace()
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from .decorator import x_ipe_tracing
|
|
23
|
+
from .context import TraceContext
|
|
24
|
+
from .buffer import TraceBuffer, TraceEntry
|
|
25
|
+
from .writer import TraceLogWriter
|
|
26
|
+
from .redactor import Redactor
|
|
27
|
+
from .middleware import init_tracing_middleware
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
'x_ipe_tracing',
|
|
31
|
+
'TraceContext',
|
|
32
|
+
'TraceBuffer',
|
|
33
|
+
'TraceEntry',
|
|
34
|
+
'TraceLogWriter',
|
|
35
|
+
'Redactor',
|
|
36
|
+
'init_tracing_middleware',
|
|
37
|
+
]
|