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.
Files changed (139) hide show
  1. x_ipe/app.py +25 -3
  2. x_ipe/handlers/terminal_handlers.py +6 -0
  3. x_ipe/handlers/voice_handlers.py +5 -0
  4. x_ipe/resources/copilot-instructions.md +19 -6
  5. x_ipe/resources/skills/lesson-learned/SKILL.md +208 -0
  6. x_ipe/resources/skills/lesson-learned/references/examples.md +238 -0
  7. x_ipe/resources/skills/project-quality-board-management/SKILL.md +135 -298
  8. x_ipe/resources/skills/project-quality-board-management/references/evaluation-principles.md +213 -0
  9. x_ipe/resources/skills/project-quality-board-management/references/evaluation-procedures.md +214 -0
  10. x_ipe/resources/skills/project-quality-board-management/templates/quality-report.md +70 -18
  11. x_ipe/resources/skills/task-execution-guideline/SKILL.md +2 -2
  12. x_ipe/resources/skills/task-execution-guideline/templates/task-record.yaml +1 -1
  13. x_ipe/resources/skills/task-type-code-implementation/SKILL.md +72 -270
  14. x_ipe/resources/skills/task-type-code-implementation/references/implementation-guidelines.md +432 -0
  15. x_ipe/resources/skills/task-type-code-refactor-v2/SKILL.md +127 -353
  16. x_ipe/resources/skills/task-type-code-refactor-v2/references/refactoring-techniques.md +373 -0
  17. x_ipe/resources/skills/task-type-feature-breakdown/SKILL.md +31 -243
  18. x_ipe/resources/skills/task-type-feature-breakdown/references/breakdown-guidelines.md +330 -0
  19. x_ipe/resources/skills/task-type-feature-refinement/SKILL.md +27 -180
  20. x_ipe/resources/skills/task-type-feature-refinement/references/specification-writing-guide.md +267 -0
  21. x_ipe/resources/skills/task-type-idea-mockup/SKILL.md +38 -276
  22. x_ipe/resources/skills/task-type-idea-mockup/references/mockup-guidelines.md +299 -0
  23. x_ipe/resources/skills/task-type-idea-to-architecture/SKILL.md +20 -218
  24. x_ipe/resources/skills/task-type-idea-to-architecture/references/architecture-patterns.md +342 -0
  25. x_ipe/resources/skills/task-type-ideation/SKILL.md +10 -266
  26. x_ipe/resources/skills/task-type-ideation/references/folder-naming-guide.md +55 -0
  27. x_ipe/resources/skills/task-type-ideation/references/tool-usage-guide.md +236 -0
  28. x_ipe/resources/skills/task-type-ideation-v2/SKILL.md +488 -0
  29. x_ipe/resources/skills/task-type-ideation-v2/references/examples.md +377 -0
  30. x_ipe/resources/skills/task-type-ideation-v2/references/folder-naming-guide.md +74 -0
  31. x_ipe/resources/skills/task-type-ideation-v2/references/tool-usage-guide.md +145 -0
  32. x_ipe/resources/skills/task-type-ideation-v2/references/visualization-guide.md +160 -0
  33. x_ipe/resources/skills/task-type-ideation-v2/templates/idea-summary.md +86 -0
  34. x_ipe/resources/skills/task-type-refactoring-analysis/SKILL.md +83 -145
  35. x_ipe/resources/skills/task-type-refactoring-analysis/references/output-schema.md +172 -0
  36. x_ipe/resources/skills/task-type-technical-design/SKILL.md +28 -214
  37. x_ipe/resources/skills/task-type-technical-design/references/design-templates.md +422 -0
  38. x_ipe/resources/skills/task-type-test-generation/SKILL.md +47 -332
  39. x_ipe/resources/skills/task-type-test-generation/references/test-patterns.md +368 -0
  40. x_ipe/resources/skills/tool-tracing-creator/SKILL.md +312 -0
  41. x_ipe/resources/skills/tool-tracing-creator/references/examples.md +324 -0
  42. x_ipe/resources/skills/tool-tracing-instrumentation/SKILL.md +373 -0
  43. x_ipe/resources/skills/tool-tracing-instrumentation/references/examples.md +264 -0
  44. x_ipe/resources/skills/x-ipe-skill-creator-v3/SKILL.md +486 -0
  45. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/10. example-gate-conditions.md +73 -0
  46. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/11. reference-quality-standards.md +127 -0
  47. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/2. reference-section-order.md +127 -0
  48. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/3. example-step-based-code-review.md +84 -0
  49. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/4. example-step-based-feature-implementation.md +113 -0
  50. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/5. example-function-based-validation.md +73 -0
  51. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/6. example-function-based-analysis.md +94 -0
  52. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/7. example-task-io-code-implementation.md +36 -0
  53. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/8. example-structured-summary.md +43 -0
  54. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/9. example-dor-dod.md +77 -0
  55. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/examples.md +429 -0
  56. x_ipe/resources/skills/x-ipe-skill-creator-v3/references/skill-general-guidelines-v2.md +611 -0
  57. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-meta.md +153 -0
  58. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-task-based.md +324 -0
  59. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-task-category.md +109 -0
  60. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/skill-meta-x-ipe-tool.md +205 -0
  61. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-meta.md +334 -0
  62. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-task-based.md +279 -0
  63. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-tool.md +175 -0
  64. x_ipe/resources/skills/x-ipe-skill-creator-v3/templates/x-ipe-workflow-orchestration.md +329 -0
  65. x_ipe/resources/skills/x-ipe-task-based-ideation/SKILL.md +487 -0
  66. x_ipe/resources/skills/x-ipe-task-based-ideation/references/examples.md +377 -0
  67. x_ipe/resources/skills/x-ipe-task-based-ideation/references/folder-naming-guide.md +74 -0
  68. x_ipe/resources/skills/x-ipe-task-based-ideation/references/tool-usage-guide.md +145 -0
  69. x_ipe/resources/skills/x-ipe-task-based-ideation/references/visualization-guide.md +160 -0
  70. x_ipe/resources/skills/x-ipe-task-based-ideation/templates/idea-summary.md +86 -0
  71. x_ipe/routes/__init__.py +2 -0
  72. x_ipe/routes/ideas_routes.py +17 -0
  73. x_ipe/routes/kb_routes.py +80 -0
  74. x_ipe/routes/main_routes.py +18 -0
  75. x_ipe/routes/project_routes.py +7 -0
  76. x_ipe/routes/proxy_routes.py +2 -0
  77. x_ipe/routes/quality_evaluation_routes.py +193 -0
  78. x_ipe/routes/settings_routes.py +6 -0
  79. x_ipe/routes/tools_routes.py +6 -0
  80. x_ipe/routes/tracing_routes.py +232 -0
  81. x_ipe/routes/uiux_feedback_routes.py +30 -0
  82. x_ipe/services/__init__.py +5 -0
  83. x_ipe/services/config_service.py +6 -0
  84. x_ipe/services/file_service.py +20 -0
  85. x_ipe/services/homepage_service.py +160 -0
  86. x_ipe/services/ideas_service.py +19 -0
  87. x_ipe/services/kb_service.py +378 -0
  88. x_ipe/services/proxy_service.py +4 -0
  89. x_ipe/services/settings_service.py +13 -0
  90. x_ipe/services/skills_service.py +4 -0
  91. x_ipe/services/terminal_service.py +24 -0
  92. x_ipe/services/themes_service.py +4 -0
  93. x_ipe/services/tools_config_service.py +4 -0
  94. x_ipe/services/tracing_service.py +333 -0
  95. x_ipe/services/uiux_feedback_service.py +32 -0
  96. x_ipe/services/voice_input_service_v2.py +11 -0
  97. x_ipe/static/css/base.css +7 -0
  98. x_ipe/static/css/homepage-infinity.css +330 -0
  99. x_ipe/static/css/kb-core.css +301 -0
  100. x_ipe/static/css/quality-evaluation.css +345 -0
  101. x_ipe/static/css/sidebar.css +14 -4
  102. x_ipe/static/css/terminal.css +1 -0
  103. x_ipe/static/css/tracing-dashboard.css +796 -0
  104. x_ipe/static/css/workplace.css +20 -0
  105. x_ipe/static/img/homepage-infinity-loop.png +0 -0
  106. x_ipe/static/js/features/homepage-infinity.js +314 -0
  107. x_ipe/static/js/features/kb-core.js +371 -0
  108. x_ipe/static/js/features/quality-evaluation.js +387 -0
  109. x_ipe/static/js/features/sidebar.js +255 -12
  110. x_ipe/static/js/features/tracing-dashboard.js +855 -0
  111. x_ipe/static/js/features/tracing-graph.js +1031 -0
  112. x_ipe/static/js/features/tree-search.js +6 -2
  113. x_ipe/static/js/features/workplace.js +200 -6
  114. x_ipe/static/js/init.js +76 -0
  115. x_ipe/static/js/uiux-feedback.js +18 -2
  116. x_ipe/templates/base.html +19 -0
  117. x_ipe/templates/index.html +7 -1
  118. x_ipe/templates/knowledge-base.html +110 -0
  119. x_ipe/templates/workplace.html +4 -0
  120. x_ipe/tracing/__init__.py +37 -0
  121. x_ipe/tracing/buffer.py +135 -0
  122. x_ipe/tracing/context.py +125 -0
  123. x_ipe/tracing/decorator.py +288 -0
  124. x_ipe/tracing/middleware.py +197 -0
  125. x_ipe/tracing/parser.py +235 -0
  126. x_ipe/tracing/redactor.py +111 -0
  127. x_ipe/tracing/writer.py +122 -0
  128. {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/METADATA +2 -2
  129. {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/RECORD +132 -62
  130. x_ipe/resources/skills/x-ipe-skill-creator/SKILL.md +0 -329
  131. x_ipe/resources/skills/x-ipe-skill-creator/references/output-patterns.md +0 -169
  132. x_ipe/resources/skills/x-ipe-skill-creator/references/skill-structure.md +0 -162
  133. x_ipe/resources/skills/x-ipe-skill-creator/references/workflows.md +0 -110
  134. x_ipe/resources/skills/x-ipe-skill-creator/templates/references/examples.md +0 -113
  135. x_ipe/resources/skills/x-ipe-skill-creator/templates/skill-category-skill.md +0 -296
  136. x_ipe/resources/skills/x-ipe-skill-creator/templates/task-type-skill.md +0 -269
  137. {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/WHEEL +0 -0
  138. {x_ipe-1.0.24.dist-info → x_ipe-1.0.25.dist-info}/entry_points.txt +0 -0
  139. {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
- this.copilotPrompts = data.prompts || [];
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
- // Toggle expanded state on mobile/touch
102
- const sidebar = document.getElementById('workplace-sidebar');
103
- sidebar.classList.toggle('expanded');
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');
@@ -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 name = this.feedbackEntries[index].name;
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 %}
@@ -8,10 +8,16 @@
8
8
  <!-- ROW 1: Top Menu Bar -->
9
9
  <header class="top-menu">
10
10
  <div class="brand">
11
- <span class="brand-name">X IPE</span>
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 %}
@@ -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
+ ]