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.
- x_ipe/app.py +32 -1
- 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 +289 -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 +10 -2
- 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 +50 -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 +535 -2
- x_ipe/services/kb_service.py +378 -0
- x_ipe/services/proxy_service.py +37 -7
- 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 +148 -1
- 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 +23 -0
- x_ipe/static/css/tracing-dashboard.css +796 -0
- x_ipe/static/css/uiux-feedback.css +7 -1
- x_ipe/static/css/workplace.css +636 -0
- x_ipe/static/img/homepage-infinity-loop.png +0 -0
- x_ipe/static/js/features/confirm-dialog.js +169 -0
- x_ipe/static/js/features/folder-view.js +742 -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-drag.js +227 -0
- x_ipe/static/js/features/tree-search.js +228 -0
- x_ipe/static/js/features/workplace.js +661 -33
- x_ipe/static/js/init.js +76 -0
- x_ipe/static/js/terminal-v2.js +45 -14
- x_ipe/static/js/terminal.js +50 -49
- x_ipe/static/js/uiux-feedback.js +75 -16
- x_ipe/templates/base.html +24 -0
- x_ipe/templates/index.html +10 -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.23.dist-info → x_ipe-1.0.25.dist-info}/METADATA +2 -2
- {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/RECORD +138 -65
- x_ipe/app.py.bak +0 -1333
- 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.23.dist-info → x_ipe-1.0.25.dist-info}/WHEEL +0 -0
- {x_ipe-1.0.23.dist-info → x_ipe-1.0.25.dist-info}/entry_points.txt +0 -0
- {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');
|
x_ipe/static/js/terminal-v2.js
CHANGED
|
@@ -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 (
|
|
556
|
+
* Send Copilot prompt command (types command, no Enter - user can review)
|
|
557
557
|
*/
|
|
558
558
|
sendCopilotPromptCommand(promptCommand) {
|
|
559
|
-
this._sendCopilotCommand(promptCommand
|
|
559
|
+
this._sendCopilotCommand(promptCommand);
|
|
560
560
|
}
|
|
561
561
|
|
|
562
562
|
/**
|
|
563
|
-
* Send Copilot prompt command without pressing Enter (for
|
|
563
|
+
* Send Copilot prompt command without pressing Enter (alias for sendCopilotPromptCommand)
|
|
564
564
|
*/
|
|
565
565
|
sendCopilotPromptCommandNoEnter(promptCommand) {
|
|
566
|
-
this._sendCopilotCommand(promptCommand
|
|
566
|
+
this._sendCopilotCommand(promptCommand);
|
|
567
567
|
}
|
|
568
568
|
|
|
569
569
|
/**
|
|
570
570
|
* Internal: Send copilot command with typing effect
|
|
571
|
-
*
|
|
572
|
-
*
|
|
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
|
|
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
|
-
//
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
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) {
|
x_ipe/static/js/terminal.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
//
|
|
877
|
-
const
|
|
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
|
|
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') ||
|
|
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
|
x_ipe/static/js/uiux-feedback.js
CHANGED
|
@@ -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
|
|
1388
|
-
<
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
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
|
|
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
|
|
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 %}
|
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>
|
|
@@ -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>
|