x-ipe 1.0.23__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 (146) hide show
  1. x_ipe/app.py +32 -1
  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 +289 -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 +10 -2
  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 +50 -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 +535 -2
  87. x_ipe/services/kb_service.py +378 -0
  88. x_ipe/services/proxy_service.py +37 -7
  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 +148 -1
  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 +23 -0
  103. x_ipe/static/css/tracing-dashboard.css +796 -0
  104. x_ipe/static/css/uiux-feedback.css +7 -1
  105. x_ipe/static/css/workplace.css +636 -0
  106. x_ipe/static/img/homepage-infinity-loop.png +0 -0
  107. x_ipe/static/js/features/confirm-dialog.js +169 -0
  108. x_ipe/static/js/features/folder-view.js +742 -0
  109. x_ipe/static/js/features/homepage-infinity.js +314 -0
  110. x_ipe/static/js/features/kb-core.js +371 -0
  111. x_ipe/static/js/features/quality-evaluation.js +387 -0
  112. x_ipe/static/js/features/sidebar.js +255 -12
  113. x_ipe/static/js/features/tracing-dashboard.js +855 -0
  114. x_ipe/static/js/features/tracing-graph.js +1031 -0
  115. x_ipe/static/js/features/tree-drag.js +227 -0
  116. x_ipe/static/js/features/tree-search.js +228 -0
  117. x_ipe/static/js/features/workplace.js +661 -33
  118. x_ipe/static/js/init.js +76 -0
  119. x_ipe/static/js/terminal-v2.js +45 -14
  120. x_ipe/static/js/terminal.js +50 -49
  121. x_ipe/static/js/uiux-feedback.js +75 -16
  122. x_ipe/templates/base.html +24 -0
  123. x_ipe/templates/index.html +10 -1
  124. x_ipe/templates/knowledge-base.html +110 -0
  125. x_ipe/templates/workplace.html +4 -0
  126. x_ipe/tracing/__init__.py +37 -0
  127. x_ipe/tracing/buffer.py +135 -0
  128. x_ipe/tracing/context.py +125 -0
  129. x_ipe/tracing/decorator.py +288 -0
  130. x_ipe/tracing/middleware.py +197 -0
  131. x_ipe/tracing/parser.py +235 -0
  132. x_ipe/tracing/redactor.py +111 -0
  133. x_ipe/tracing/writer.py +122 -0
  134. {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/METADATA +2 -2
  135. {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/RECORD +138 -65
  136. x_ipe/app.py.bak +0 -1333
  137. x_ipe/resources/skills/x-ipe-skill-creator/SKILL.md +0 -329
  138. x_ipe/resources/skills/x-ipe-skill-creator/references/output-patterns.md +0 -169
  139. x_ipe/resources/skills/x-ipe-skill-creator/references/skill-structure.md +0 -162
  140. x_ipe/resources/skills/x-ipe-skill-creator/references/workflows.md +0 -110
  141. x_ipe/resources/skills/x-ipe-skill-creator/templates/references/examples.md +0 -113
  142. x_ipe/resources/skills/x-ipe-skill-creator/templates/skill-category-skill.md +0 -296
  143. x_ipe/resources/skills/x-ipe-skill-creator/templates/task-type-skill.md +0 -269
  144. {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/WHEEL +0 -0
  145. {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/entry_points.txt +0 -0
  146. {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/licenses/LICENSE +0 -0
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');
@@ -546,32 +546,33 @@
546
546
  }
547
547
 
548
548
  /**
549
- * Send Copilot refine command
549
+ * Send Copilot refine command (types command, no Enter - user can review)
550
550
  */
551
551
  sendCopilotRefineCommand(filePath) {
552
552
  this._sendCopilotCommand(`refine the idea ${filePath}`);
553
553
  }
554
554
 
555
555
  /**
556
- * Send Copilot prompt command (executes with Enter)
556
+ * Send Copilot prompt command (types command, no Enter - user can review)
557
557
  */
558
558
  sendCopilotPromptCommand(promptCommand) {
559
- this._sendCopilotCommand(promptCommand, true);
559
+ this._sendCopilotCommand(promptCommand);
560
560
  }
561
561
 
562
562
  /**
563
- * Send Copilot prompt command without pressing Enter (for review before execution)
563
+ * Send Copilot prompt command without pressing Enter (alias for sendCopilotPromptCommand)
564
564
  */
565
565
  sendCopilotPromptCommandNoEnter(promptCommand) {
566
- this._sendCopilotCommand(promptCommand, false);
566
+ this._sendCopilotCommand(promptCommand);
567
567
  }
568
568
 
569
569
  /**
570
570
  * Internal: Send copilot command with typing effect
571
- * @param {string} command - Command to type
572
- * @param {boolean} pressEnter - Whether to press Enter after command (default: true)
571
+ * Uses `copilot -i "{prompt}"` to pass prompt directly
572
+ * Types command without pressing Enter - user can review before executing
573
+ * @param {string} command - Command/prompt to send to copilot
573
574
  */
574
- _sendCopilotCommand(command, pressEnter = true) {
575
+ _sendCopilotCommand(command) {
575
576
  let targetIndex = this.activeIndex >= 0 ? this.activeIndex : 0;
576
577
 
577
578
  if (this.terminals.length === 0) {
@@ -583,12 +584,10 @@
583
584
  const instance = this.terminals[targetIndex];
584
585
  if (!instance?.socket?.connected) return;
585
586
 
586
- // Type 'copilot --allow-all-tools' then wait and type command
587
- this._typeWithEffect(instance.socket, 'copilot --allow-all-tools', () => {
588
- this._waitForCopilotReady(instance, () => {
589
- this._typeWithEffect(instance.socket, command, null, pressEnter);
590
- });
591
- });
587
+ // Use copilot with all permissions and -i to pass prompt directly, no Enter (user reviews first)
588
+ const escapedCommand = command.replace(/"/g, '\\"');
589
+ const copilotCommand = `copilot --allow-all-tools --allow-all-paths --allow-all-urls -i "${escapedCommand}"`;
590
+ this._typeWithEffect(instance.socket, copilotCommand, null, false);
592
591
  }
593
592
 
594
593
  /**
@@ -669,6 +668,7 @@
669
668
  this.toggleBtn = document.getElementById('terminal-toggle');
670
669
  this.zenBtn = document.getElementById('terminal-zen-btn');
671
670
  this.addBtn = document.getElementById('add-terminal-btn');
671
+ this.copilotCmdBtn = document.getElementById('copilot-cmd-btn');
672
672
  this.resizeHandle = document.getElementById('terminal-resize-handle');
673
673
  this.statusIndicator = document.getElementById('terminal-status-indicator');
674
674
  this.statusText = document.getElementById('terminal-status-text');
@@ -713,6 +713,14 @@
713
713
  });
714
714
  }
715
715
 
716
+ // Copilot command button - insert command without triggering expand/collapse
717
+ if (this.copilotCmdBtn) {
718
+ this.copilotCmdBtn.addEventListener('click', e => {
719
+ e.stopPropagation();
720
+ this._insertCopilotCommand();
721
+ });
722
+ }
723
+
716
724
  // Resize handle
717
725
  this._initResize();
718
726
 
@@ -865,6 +873,29 @@
865
873
  }
866
874
  }
867
875
 
876
+ /**
877
+ * Insert copilot command into active terminal (no Enter)
878
+ */
879
+ _insertCopilotCommand() {
880
+ const copilotCommand = 'copilot --allow-all-tools --allow-all-paths --allow-all-urls';
881
+
882
+ // Ensure we have a terminal
883
+ let targetIndex = this.paneManager.activeIndex;
884
+ if (this.paneManager.terminals.length === 0) {
885
+ targetIndex = this.paneManager.addTerminal();
886
+ } else if (targetIndex < 0) {
887
+ targetIndex = 0;
888
+ }
889
+
890
+ this.paneManager.setFocus(targetIndex);
891
+
892
+ const instance = this.paneManager.terminals[targetIndex];
893
+ if (!instance?.socket?.connected) return;
894
+
895
+ // Type command without pressing Enter
896
+ this.paneManager._typeWithEffect(instance.socket, copilotCommand, null, false);
897
+ }
898
+
868
899
  _reconnectAll() {
869
900
  this.paneManager.terminals.forEach(t => {
870
901
  if (t.socket && !t.socket.connected) {
@@ -813,48 +813,29 @@
813
813
 
814
814
  /**
815
815
  * Send Copilot refine command with typing simulation
816
+ * Uses `copilot -i "{prompt}"` - types command, no Enter (user can review)
816
817
  * @param {string} filePath - Path to the idea file to refine
817
818
  */
818
819
  sendCopilotRefineCommand(filePath) {
819
- // Check if we need a new terminal (if current one is in copilot mode)
820
- let targetIndex = this.activeIndex;
821
-
822
- // If no terminals exist, create one
823
- if (this.terminals.length === 0) {
824
- targetIndex = this.addTerminal();
825
- } else if (targetIndex < 0) {
826
- targetIndex = 0;
827
- }
828
-
829
- // Check if current terminal appears to be in copilot CLI mode
830
- // We detect this by checking if a new terminal is needed
831
- const needsNewTerminal = this._isInCopilotMode(targetIndex);
832
-
833
- if (needsNewTerminal && this.terminals.length < MAX_TERMINALS) {
834
- targetIndex = this.addTerminal();
835
- }
836
-
837
- this.setFocus(targetIndex);
838
-
839
- // Build the command sequence
840
- const copilotCommand = 'copilot --allow-all-tools';
841
820
  const refineCommand = `refine the idea ${filePath}`;
842
-
843
- // Send commands with typing simulation
844
- this._sendWithTypingEffect(targetIndex, copilotCommand, () => {
845
- // After copilot command, wait for CLI to be ready before sending refine command
846
- this._waitForCopilotReady(targetIndex, () => {
847
- this._sendWithTypingEffect(targetIndex, refineCommand);
848
- });
849
- });
821
+ this._sendCopilotWithPrompt(refineCommand);
850
822
  }
851
823
 
852
824
  /**
853
825
  * Send a custom Copilot prompt command with typing simulation
826
+ * Uses `copilot -i "{prompt}"` - types command, no Enter (user can review)
854
827
  * @param {string} promptCommand - The command to send (with placeholders already replaced)
855
828
  */
856
829
  sendCopilotPromptCommand(promptCommand) {
857
- // Check if we need a new terminal (if current one is in copilot mode)
830
+ this._sendCopilotWithPrompt(promptCommand);
831
+ }
832
+
833
+ /**
834
+ * Internal: Send copilot command with -i flag
835
+ * Types command without pressing Enter - user can review before executing
836
+ * @param {string} prompt - The prompt to pass to copilot
837
+ */
838
+ _sendCopilotWithPrompt(prompt) {
858
839
  let targetIndex = this.activeIndex;
859
840
 
860
841
  // If no terminals exist, create one
@@ -864,25 +845,14 @@
864
845
  targetIndex = 0;
865
846
  }
866
847
 
867
- // Check if current terminal appears to be in copilot CLI mode
868
- const needsNewTerminal = this._isInCopilotMode(targetIndex);
869
-
870
- if (needsNewTerminal && this.terminals.length < MAX_TERMINALS) {
871
- targetIndex = this.addTerminal();
872
- }
873
-
874
848
  this.setFocus(targetIndex);
875
849
 
876
- // Build the command sequence
877
- const copilotCommand = 'copilot --allow-all-tools';
850
+ // Use copilot with all permissions and -i to pass prompt directly, no Enter (user reviews first)
851
+ const escapedPrompt = prompt.replace(/"/g, '\\"');
852
+ const copilotCommand = `copilot --allow-all-tools --allow-all-paths --allow-all-urls -i "${escapedPrompt}"`;
878
853
 
879
- // Send commands with typing simulation
880
- this._sendWithTypingEffect(targetIndex, copilotCommand, () => {
881
- // After copilot command, wait for CLI to be ready before sending the prompt
882
- this._waitForCopilotReady(targetIndex, () => {
883
- this._sendWithTypingEffect(targetIndex, promptCommand);
884
- });
885
- });
854
+ // Send command with typing simulation, no Enter
855
+ this._sendWithTypingEffect(targetIndex, copilotCommand, null, false);
886
856
  }
887
857
 
888
858
  /**
@@ -1018,6 +988,7 @@
1018
988
  this.header = document.getElementById('terminal-header');
1019
989
  this.toggleBtn = document.getElementById('terminal-toggle');
1020
990
  this.zenBtn = document.getElementById('terminal-zen-btn');
991
+ this.copilotCmdBtn = document.getElementById('copilot-cmd-btn');
1021
992
  this.resizeHandle = document.getElementById('terminal-resize-handle');
1022
993
  this.terminalManager = terminalManager;
1023
994
 
@@ -1029,9 +1000,11 @@
1029
1000
  }
1030
1001
 
1031
1002
  _bindEvents() {
1032
- // Header click to toggle (except on buttons/status)
1003
+ // Header click to toggle (except on buttons/status/center controls)
1033
1004
  this.header.addEventListener('click', (e) => {
1034
- if (e.target.closest('.terminal-actions') || e.target.closest('.terminal-status')) return;
1005
+ if (e.target.closest('.terminal-actions') ||
1006
+ e.target.closest('.terminal-status') ||
1007
+ e.target.closest('.terminal-header-center')) return;
1035
1008
  this.toggle();
1036
1009
  });
1037
1010
 
@@ -1047,6 +1020,14 @@
1047
1020
  });
1048
1021
  }
1049
1022
 
1023
+ // Copilot command button - insert command without triggering expand/collapse
1024
+ if (this.copilotCmdBtn) {
1025
+ this.copilotCmdBtn.addEventListener('click', (e) => {
1026
+ e.stopPropagation();
1027
+ this._insertCopilotCommand();
1028
+ });
1029
+ }
1030
+
1050
1031
  this._initResize();
1051
1032
 
1052
1033
  // ESC to exit zen mode
@@ -1166,6 +1147,26 @@
1166
1147
 
1167
1148
  this.terminalManager.fitAll();
1168
1149
  }
1150
+
1151
+ /**
1152
+ * Insert copilot command into active terminal (no Enter)
1153
+ */
1154
+ _insertCopilotCommand() {
1155
+ const copilotCommand = 'copilot --allow-all-tools --allow-all-paths --allow-all-urls';
1156
+
1157
+ // Ensure we have a terminal
1158
+ let targetIndex = this.terminalManager.activeIndex;
1159
+ if (this.terminalManager.terminals.length === 0) {
1160
+ targetIndex = this.terminalManager.addTerminal();
1161
+ } else if (targetIndex < 0) {
1162
+ targetIndex = 0;
1163
+ }
1164
+
1165
+ this.terminalManager.setFocus(targetIndex);
1166
+
1167
+ // Type command without pressing Enter
1168
+ this.terminalManager._sendWithTypingEffect(targetIndex, copilotCommand, null, false);
1169
+ }
1169
1170
  }
1170
1171
 
1171
1172
  // Export to window
@@ -218,6 +218,42 @@ class UIUXFeedbackManager {
218
218
  if (this.state.currentUrl) {
219
219
  this.elements.urlInput.value = this.state.currentUrl;
220
220
  }
221
+
222
+ // Load saved feedback entries (TASK-237)
223
+ this._loadSavedFeedback();
224
+ }
225
+
226
+ /**
227
+ * Load saved feedback entries from backend (TASK-237)
228
+ */
229
+ async _loadSavedFeedback() {
230
+ try {
231
+ const response = await fetch('/api/uiux-feedback?days=2');
232
+ if (!response.ok) {
233
+ console.warn('[UIUXFeedback] Failed to load saved feedback');
234
+ return;
235
+ }
236
+
237
+ const data = await response.json();
238
+ if (data.entries && data.entries.length > 0) {
239
+ // Convert saved entries to internal format
240
+ for (const entry of data.entries) {
241
+ this.feedbackEntries.push({
242
+ id: entry.id,
243
+ name: entry.name,
244
+ url: entry.url,
245
+ elements: [], // Not stored in feedback.md
246
+ screenshot: null, // Would need to load from file
247
+ description: entry.description || '',
248
+ createdAt: entry.date ? new Date(entry.date) : new Date(),
249
+ status: 'submitted' // Already saved
250
+ });
251
+ }
252
+ this._renderFeedbackPanel();
253
+ }
254
+ } catch (error) {
255
+ console.warn('[UIUXFeedback] Error loading saved feedback:', error);
256
+ }
221
257
  }
222
258
 
223
259
  /**
@@ -1384,17 +1420,14 @@ class UIUXFeedbackManager {
1384
1420
  </div>
1385
1421
  ` : ''}
1386
1422
  <div class="entry-actions-footer">
1387
- ${entry.status === 'submitted' && entry.folder ? `
1388
- <button class="btn-copilot" data-folder="${entry.folder}">
1389
- <i class="bi bi-robot"></i>
1390
- Copilot
1391
- </button>
1392
- ` : `
1393
- <button class="btn-submit" ${canSubmit ? '' : 'disabled'}>
1394
- <i class="bi bi-send"></i>
1395
- ${entry.status === 'submitting' ? 'Submitting...' : 'Submit'}
1396
- </button>
1397
- `}
1423
+ <button class="btn-submit" ${canSubmit && entry.status !== 'submitted' ? '' : 'disabled'}>
1424
+ <i class="bi bi-send"></i>
1425
+ ${entry.status === 'submitting' ? 'Submitting...' : 'Submit'}
1426
+ </button>
1427
+ <button class="btn-copilot" data-folder="${entry.folder || ''}" ${entry.folder ? '' : 'disabled'}>
1428
+ <i class="bi bi-robot"></i>
1429
+ Copilot
1430
+ </button>
1398
1431
  </div>
1399
1432
  </div>
1400
1433
  </div>
@@ -1459,6 +1492,18 @@ class UIUXFeedbackManager {
1459
1492
  descInput.addEventListener('blur', () => {
1460
1493
  this._updateEntryDescription(id, descInput.value);
1461
1494
  });
1495
+
1496
+ // Re-enable submit button when description changes
1497
+ descInput.addEventListener('input', () => {
1498
+ if (submitBtn && submitBtn.disabled) {
1499
+ // Re-enable submit if user modifies description
1500
+ const entryData = this.feedbackEntries.find(e => e.id === id);
1501
+ if (entryData && entryData.status === 'submitted') {
1502
+ entryData.status = 'pending'; // Mark as pending for resubmit
1503
+ submitBtn.disabled = false;
1504
+ }
1505
+ }
1506
+ });
1462
1507
  }
1463
1508
 
1464
1509
  // Submit entry
@@ -1502,10 +1547,26 @@ class UIUXFeedbackManager {
1502
1547
  /**
1503
1548
  * Delete a feedback entry
1504
1549
  */
1505
- _deleteEntry(id) {
1550
+ async _deleteEntry(id) {
1506
1551
  const index = this.feedbackEntries.findIndex(e => e.id === id);
1507
1552
  if (index >= 0) {
1508
- 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
+
1509
1570
  this.feedbackEntries.splice(index, 1);
1510
1571
  this._renderFeedbackPanel();
1511
1572
  this.updateStatus(`Deleted: ${name}`);
@@ -1592,9 +1653,7 @@ class UIUXFeedbackManager {
1592
1653
 
1593
1654
  // Use terminalManager's sendCopilotPromptCommandNoEnter which:
1594
1655
  // 1. Creates terminal if needed
1595
- // 2. Types 'copilot --allow-all-tools' and presses Enter
1596
- // 3. Waits for Copilot CLI to be ready
1597
- // 4. Types the command WITHOUT pressing Enter (user can review/edit)
1656
+ // 2. Types 'copilot -i "{prompt}"' (user can review/edit before pressing Enter)
1598
1657
  if (window.terminalManager && window.terminalManager.sendCopilotPromptCommandNoEnter) {
1599
1658
  window.terminalManager.sendCopilotPromptCommandNoEnter(command);
1600
1659
  } else {
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>
@@ -58,6 +66,11 @@
58
66
  <script src="/static/js/features/live-refresh.js"></script>
59
67
  <script src="/static/js/features/project-switcher.js"></script>
60
68
  <script src="/static/js/features/sidebar.js"></script>
69
+ <!-- CR-006: Ideas Folder Tree Enhancement -->
70
+ <script src="/static/js/features/confirm-dialog.js"></script>
71
+ <script src="/static/js/features/tree-search.js"></script>
72
+ <script src="/static/js/features/tree-drag.js"></script>
73
+ <script src="/static/js/features/folder-view.js"></script>
61
74
  <script src="/static/js/features/workplace.js"></script>
62
75
  <!-- FEATURE-011: Stage Toolbox -->
63
76
  <script src="/static/js/features/stage-toolbox.js"></script>
@@ -67,6 +80,17 @@
67
80
  <script src="/static/3rdparty/html2canvas.min.js"></script>
68
81
  <!-- FEATURE-022-A: UI/UX Feedback Browser Simulator -->
69
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>
70
94
  <script src="/static/js/init.js"></script>
71
95
 
72
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>
@@ -94,6 +100,9 @@
94
100
  </div>
95
101
  <!-- Center: Voice Controls (FEATURE-021) -->
96
102
  <div class="terminal-header-center">
103
+ <button class="copilot-cmd-btn" id="copilot-cmd-btn" title="Insert Copilot command">
104
+ <i class="bi bi-robot"></i>
105
+ </button>
97
106
  <button class="mic-toggle" id="mic-toggle" title="Toggle microphone (Ctrl+Shift+V to record when enabled)">
98
107
  <i class="bi bi-mic-mute"></i>
99
108
  </button>