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
@@ -24,6 +24,8 @@ from dashscope.audio.asr import (
24
24
  TranslationResult,
25
25
  )
26
26
 
27
+ from x_ipe.tracing import x_ipe_tracing
28
+
27
29
 
28
30
  # Constants
29
31
  VOICE_MAX_DURATION = 30 # Maximum recording duration in seconds
@@ -225,6 +227,7 @@ class VoiceInputService:
225
227
  self.sessions: Dict[str, VoiceSession] = {}
226
228
  print(f"[Voice] VoiceInputService initialized")
227
229
 
230
+ @x_ipe_tracing()
228
231
  def create_session(
229
232
  self,
230
233
  socket_sid: str,
@@ -260,10 +263,12 @@ class VoiceInputService:
260
263
  print(f"[Voice] 📦 Session created: {session_id} for socket {socket_sid}")
261
264
  return session_id
262
265
 
266
+ @x_ipe_tracing()
263
267
  def get_session(self, session_id: str) -> Optional[VoiceSession]:
264
268
  """Get session by ID."""
265
269
  return self.sessions.get(session_id)
266
270
 
271
+ @x_ipe_tracing()
267
272
  def start_recognition(self, session_id: str) -> bool:
268
273
  """
269
274
  Start speech recognition for a session.
@@ -333,6 +338,7 @@ class VoiceInputService:
333
338
  session.on_error(str(e))
334
339
  return False
335
340
 
341
+ @x_ipe_tracing()
336
342
  def send_audio(self, session_id: str, audio_data: bytes) -> None:
337
343
  """
338
344
  Send audio data to recognizer.
@@ -366,6 +372,7 @@ class VoiceInputService:
366
372
  else:
367
373
  print(f"[Voice] ⚠️ send_audio: no recognizer for session {session_id}")
368
374
 
375
+ @x_ipe_tracing()
369
376
  def stop_recognition(self, session_id: str) -> str:
370
377
  """
371
378
  Stop recognition and get final result.
@@ -409,6 +416,7 @@ class VoiceInputService:
409
416
  print(f"[Voice] ✅ Recognition stopped, transcription result: '{result}'")
410
417
  return result
411
418
 
419
+ @x_ipe_tracing()
412
420
  def cancel_recognition(self, session_id: str) -> None:
413
421
  """
414
422
  Cancel recognition without getting result.
@@ -434,6 +442,7 @@ class VoiceInputService:
434
442
  session.partial_text = ""
435
443
  session.translation_text = ""
436
444
 
445
+ @x_ipe_tracing()
437
446
  def remove_session(self, session_id: str) -> None:
438
447
  """
439
448
  Remove a session.
@@ -448,6 +457,7 @@ class VoiceInputService:
448
457
  except Exception:
449
458
  pass
450
459
 
460
+ @x_ipe_tracing()
451
461
  def is_session_expired(self, session_id: str) -> bool:
452
462
  """
453
463
  Check if session has exceeded max duration.
@@ -465,6 +475,7 @@ class VoiceInputService:
465
475
  elapsed = (datetime.now() - session.created_at).total_seconds()
466
476
  return elapsed > VOICE_MAX_DURATION
467
477
 
478
+ @x_ipe_tracing()
468
479
  def process_transcription(self, session_id: str, text: str) -> Optional[str]:
469
480
  """
470
481
  Process transcription result.
x_ipe/static/css/base.css CHANGED
@@ -62,6 +62,13 @@ html, body {
62
62
  font-size: 1rem;
63
63
  font-weight: 700;
64
64
  letter-spacing: 0.5px;
65
+ color: inherit;
66
+ text-decoration: none;
67
+ cursor: pointer;
68
+ }
69
+
70
+ .top-menu .brand-name:hover {
71
+ color: #3b82f6;
65
72
  }
66
73
 
67
74
  .top-menu .brand-subtitle {
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Homepage Infinity Loop Styles - FEATURE-026
3
+ */
4
+
5
+ /* Container - transparent background to match mockup */
6
+ .homepage-infinity-container {
7
+ display: flex;
8
+ flex-direction: column;
9
+ align-items: center;
10
+ justify-content: center;
11
+ min-height: 100%;
12
+ padding: 2rem;
13
+ background: transparent;
14
+ color: var(--bs-body-color, #212529);
15
+ }
16
+
17
+ /* Header */
18
+ .homepage-header {
19
+ text-align: center;
20
+ margin-bottom: 2rem;
21
+ }
22
+
23
+ .homepage-header h1 {
24
+ font-size: 3rem;
25
+ font-weight: 700;
26
+ background: linear-gradient(135deg, #4facfe, #a855f7);
27
+ -webkit-background-clip: text;
28
+ -webkit-text-fill-color: transparent;
29
+ background-clip: text;
30
+ margin: 0 0 0.5rem 0;
31
+ }
32
+
33
+ .homepage-header p {
34
+ font-size: 1.25rem;
35
+ color: var(--bs-secondary-color, #6c757d);
36
+ margin: 0;
37
+ }
38
+
39
+ /* Infinity Loop Container */
40
+ .infinity-loop-container {
41
+ position: relative;
42
+ width: 100%;
43
+ max-width: 900px;
44
+ aspect-ratio: 16 / 9;
45
+ }
46
+
47
+ .infinity-loop {
48
+ position: relative;
49
+ width: 100%;
50
+ height: 100%;
51
+ }
52
+
53
+ .infinity-bg {
54
+ width: 100%;
55
+ height: 100%;
56
+ object-fit: contain;
57
+ opacity: 0.9;
58
+ }
59
+
60
+ /* Loop Labels */
61
+ .loop-label {
62
+ position: absolute;
63
+ font-size: 1.2rem;
64
+ font-weight: 700;
65
+ letter-spacing: 0.1em;
66
+ text-transform: uppercase;
67
+ text-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
68
+ }
69
+
70
+ .loop-label.control {
71
+ left: 19%;
72
+ top: 49%;
73
+ color: #00c6fb;
74
+ }
75
+
76
+ .loop-label.transparency {
77
+ left: 64%;
78
+ top: 49%;
79
+ color: #a855f7;
80
+ }
81
+
82
+ /* Stage Buttons - Circular like mockup */
83
+ .stage-btn {
84
+ position: absolute;
85
+ display: flex;
86
+ flex-direction: column;
87
+ align-items: center;
88
+ justify-content: center;
89
+ width: 80px;
90
+ height: 80px;
91
+ border: none;
92
+ border-radius: 50%;
93
+ cursor: pointer;
94
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
95
+ transform: translate(-50%, -50%);
96
+ box-shadow:
97
+ 0 4px 20px rgba(0, 0, 0, 0.15),
98
+ 0 2px 8px rgba(0, 0, 0, 0.1);
99
+ z-index: 10;
100
+ }
101
+
102
+ /* Individual button colors - customized */
103
+ .stage-btn[data-stage="ideation"] {
104
+ background: rgb(123, 68, 174);
105
+ color: #fff;
106
+ }
107
+
108
+ .stage-btn[data-stage="requirement"] {
109
+ background: rgb(165, 87, 194);
110
+ color: #fff;
111
+ }
112
+
113
+ .stage-btn[data-stage="implementation"] {
114
+ background: rgb(110, 99, 206);
115
+ color: #fff;
116
+ }
117
+
118
+ .stage-btn[data-stage="deployment"] {
119
+ background: rgb(67, 161, 231);
120
+ color: #fff;
121
+ }
122
+
123
+ .stage-btn[data-stage="validation"] {
124
+ background: rgb(66, 112, 203);
125
+ color: #fff;
126
+ }
127
+
128
+ .stage-btn[data-stage="monitoring"] {
129
+ background: rgb(62, 157, 226);
130
+ color: #fff;
131
+ }
132
+
133
+ .stage-btn[data-stage="feedback"] {
134
+ background: rgb(69, 124, 213);
135
+ color: #fff;
136
+ }
137
+
138
+ .stage-btn[data-stage="planning"] {
139
+ background: rgb(125, 72, 184);
140
+ color: #fff;
141
+ }
142
+
143
+ .stage-btn:hover {
144
+ transform: translate(-50%, -50%) scale(1.12);
145
+ box-shadow:
146
+ 0 8px 30px rgba(0, 0, 0, 0.2),
147
+ 0 4px 12px rgba(0, 0, 0, 0.15);
148
+ }
149
+
150
+ .stage-btn.tbd {
151
+ background: linear-gradient(135deg, #94a3b8 0%, #cbd5e1 100%) !important;
152
+ opacity: 0.8;
153
+ cursor: not-allowed;
154
+ }
155
+
156
+ .stage-btn.tbd:hover {
157
+ transform: translate(-50%, -50%) scale(1.05);
158
+ }
159
+
160
+ /* Stage Icon & Label */
161
+ .stage-icon {
162
+ font-size: 1.4rem;
163
+ margin-bottom: 2px;
164
+ }
165
+
166
+ .stage-label {
167
+ font-size: 0.6rem;
168
+ font-weight: 600;
169
+ letter-spacing: 0.03em;
170
+ text-transform: uppercase;
171
+ line-height: 1.1;
172
+ text-align: center;
173
+ }
174
+
175
+ /* TBD Badge */
176
+ .tbd-badge {
177
+ position: absolute;
178
+ top: -8px;
179
+ right: -8px;
180
+ background: #ef4444;
181
+ color: #fff;
182
+ font-size: 0.6rem;
183
+ font-weight: 700;
184
+ padding: 2px 6px;
185
+ border-radius: 4px;
186
+ }
187
+
188
+ /* Legend */
189
+ .homepage-legend {
190
+ display: flex;
191
+ gap: 2rem;
192
+ margin-top: 2rem;
193
+ font-size: 0.9rem;
194
+ color: var(--bs-secondary-color, #6c757d);
195
+ }
196
+
197
+ .legend-control::before {
198
+ color: #4facfe;
199
+ }
200
+
201
+ .legend-transparency::before {
202
+ color: #a855f7;
203
+ }
204
+
205
+ /* Tooltip */
206
+ .homepage-tooltip {
207
+ position: fixed;
208
+ background: #1f2937;
209
+ color: #fff;
210
+ padding: 0.5rem 1rem;
211
+ border-radius: 6px;
212
+ font-size: 0.875rem;
213
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
214
+ transform: translateX(-50%);
215
+ z-index: 1000;
216
+ pointer-events: none;
217
+ }
218
+
219
+ .homepage-tooltip::before {
220
+ content: '';
221
+ position: absolute;
222
+ top: -6px;
223
+ left: 50%;
224
+ transform: translateX(-50%);
225
+ border-left: 6px solid transparent;
226
+ border-right: 6px solid transparent;
227
+ border-bottom: 6px solid #1f2937;
228
+ }
229
+
230
+ /* Sidebar Highlight - Epic neon glow effect */
231
+ .homepage-highlight {
232
+ position: relative;
233
+ overflow: hidden;
234
+ background: linear-gradient(90deg,
235
+ rgba(139, 92, 246, 0.25) 0%,
236
+ rgba(59, 130, 246, 0.15) 50%,
237
+ rgba(236, 72, 153, 0.2) 100%) !important;
238
+ border-left: 3px solid transparent !important;
239
+ border-image: linear-gradient(180deg, #8b5cf6, #3b82f6, #ec4899) 1 !important;
240
+ box-shadow:
241
+ 0 0 15px rgba(139, 92, 246, 0.5),
242
+ 0 0 30px rgba(59, 130, 246, 0.3),
243
+ 0 0 60px rgba(139, 92, 246, 0.15),
244
+ inset 0 0 15px rgba(139, 92, 246, 0.1);
245
+ animation: homepage-highlight-neon 2s ease-in-out infinite;
246
+ border-radius: 6px;
247
+ margin: 2px 4px;
248
+ padding-left: 8px !important;
249
+ z-index: 1;
250
+ }
251
+
252
+ /* Animated border gradient */
253
+ .homepage-highlight::before {
254
+ content: '';
255
+ position: absolute;
256
+ top: -2px;
257
+ left: -2px;
258
+ right: -2px;
259
+ bottom: -2px;
260
+ background: linear-gradient(45deg,
261
+ #8b5cf6, #3b82f6, #06b6d4, #ec4899,
262
+ #8b5cf6, #3b82f6, #06b6d4, #ec4899);
263
+ background-size: 400% 400%;
264
+ border-radius: 8px;
265
+ z-index: -2;
266
+ animation: homepage-border-rotate 3s linear infinite;
267
+ opacity: 0.7;
268
+ }
269
+
270
+ /* Inner fill to create border effect */
271
+ .homepage-highlight::after {
272
+ content: '';
273
+ position: absolute;
274
+ top: 0;
275
+ left: 0;
276
+ right: 0;
277
+ bottom: 0;
278
+ background: linear-gradient(90deg,
279
+ rgba(15, 23, 42, 0.85) 0%,
280
+ rgba(15, 23, 42, 0.7) 50%,
281
+ rgba(15, 23, 42, 0.85) 100%);
282
+ border-radius: 6px;
283
+ z-index: -1;
284
+ animation: homepage-highlight-shimmer 2s ease-in-out infinite;
285
+ }
286
+
287
+ /* Neon pulse */
288
+ @keyframes homepage-highlight-neon {
289
+ 0%, 100% {
290
+ box-shadow:
291
+ 0 0 15px rgba(139, 92, 246, 0.5),
292
+ 0 0 30px rgba(59, 130, 246, 0.3),
293
+ 0 0 60px rgba(139, 92, 246, 0.15),
294
+ inset 0 0 15px rgba(139, 92, 246, 0.1);
295
+ }
296
+ 33% {
297
+ box-shadow:
298
+ 0 0 20px rgba(59, 130, 246, 0.6),
299
+ 0 0 40px rgba(6, 182, 212, 0.4),
300
+ 0 0 80px rgba(59, 130, 246, 0.2),
301
+ inset 0 0 20px rgba(59, 130, 246, 0.15);
302
+ }
303
+ 66% {
304
+ box-shadow:
305
+ 0 0 20px rgba(236, 72, 153, 0.5),
306
+ 0 0 40px rgba(139, 92, 246, 0.35),
307
+ 0 0 80px rgba(236, 72, 153, 0.2),
308
+ inset 0 0 20px rgba(236, 72, 153, 0.1);
309
+ }
310
+ }
311
+
312
+ /* Rotating gradient border */
313
+ @keyframes homepage-border-rotate {
314
+ 0% { background-position: 0% 50%; }
315
+ 50% { background-position: 100% 50%; }
316
+ 100% { background-position: 0% 50%; }
317
+ }
318
+
319
+ /* Inner shimmer */
320
+ @keyframes homepage-highlight-shimmer {
321
+ 0%, 100% { opacity: 0.85; }
322
+ 50% { opacity: 0.7; }
323
+ }
324
+
325
+ /* Responsive - Hide on mobile */
326
+ @media (max-width: 768px) {
327
+ .homepage-infinity-container {
328
+ display: none;
329
+ }
330
+ }
@@ -0,0 +1,301 @@
1
+ /**
2
+ * FEATURE-025-A: Knowledge Base Core CSS
3
+ *
4
+ * Two-column layout (like Ideation view) with tree on left of content area.
5
+ */
6
+
7
+ /* Override content-body padding when KB container is displayed */
8
+ .content-body:has(.kb-container) {
9
+ padding: 0;
10
+ }
11
+
12
+ /* Override content-area background when KB is displayed to avoid white gap */
13
+ .content-area:has(.kb-container) {
14
+ background-color: var(--bg-primary, #1e1e1e);
15
+ }
16
+
17
+ /* KB Container - Two column layout */
18
+ .kb-container {
19
+ display: flex;
20
+ height: 100%;
21
+ width: 100%;
22
+ overflow: hidden;
23
+ background: var(--bg-primary, #1e1e1e);
24
+ }
25
+
26
+ /* KB Sidebar (within content area, not main sidebar) */
27
+ .kb-sidebar {
28
+ width: 280px;
29
+ min-width: 240px;
30
+ max-width: 400px;
31
+ display: flex;
32
+ flex-direction: column;
33
+ background: var(--bg-secondary, #252526);
34
+ border-right: 1px solid var(--border-color, #3d3d3d);
35
+ }
36
+
37
+ .kb-sidebar-header {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: space-between;
41
+ padding: 0.75rem 1rem;
42
+ border-bottom: 1px solid var(--border-color, #3d3d3d);
43
+ }
44
+
45
+ .kb-sidebar-title {
46
+ font-weight: 600;
47
+ color: var(--text-primary, #e0e0e0);
48
+ font-size: 0.875rem;
49
+ }
50
+
51
+ .kb-refresh-btn {
52
+ background: transparent;
53
+ border: none;
54
+ color: var(--text-muted, #808080);
55
+ cursor: pointer;
56
+ padding: 0.25rem;
57
+ border-radius: 3px;
58
+ transition: all 0.15s;
59
+ }
60
+
61
+ .kb-refresh-btn:hover {
62
+ color: var(--text-primary, #e0e0e0);
63
+ background: var(--bg-hover, #2a2a2a);
64
+ }
65
+
66
+ .kb-search-box {
67
+ padding: 0.5rem 0.75rem;
68
+ border-bottom: 1px solid var(--border-color, #3d3d3d);
69
+ }
70
+
71
+ .kb-search-input {
72
+ width: 100%;
73
+ padding: 0.375rem 0.75rem;
74
+ background: var(--bg-darker, #1e1e1e);
75
+ border: 1px solid var(--border-color, #3d3d3d);
76
+ border-radius: 4px;
77
+ color: var(--text-primary, #e0e0e0);
78
+ font-size: 0.813rem;
79
+ }
80
+
81
+ .kb-search-input::placeholder {
82
+ color: var(--text-muted, #808080);
83
+ }
84
+
85
+ .kb-search-input:focus {
86
+ outline: none;
87
+ border-color: var(--accent-color, #0d6efd);
88
+ }
89
+
90
+ /* KB Tree */
91
+ .kb-tree {
92
+ flex: 1;
93
+ overflow-y: auto;
94
+ padding: 0.5rem 0;
95
+ }
96
+
97
+ .kb-loading {
98
+ padding: 1rem;
99
+ text-align: center;
100
+ color: var(--text-muted, #808080);
101
+ }
102
+
103
+ /* KB Folder */
104
+ .kb-folder {
105
+ margin-bottom: 0.25rem;
106
+ }
107
+
108
+ .kb-folder-header {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 0.5rem;
112
+ padding: 0.375rem 0.75rem;
113
+ cursor: pointer;
114
+ color: var(--text-secondary, #cccccc);
115
+ font-size: 0.875rem;
116
+ transition: background-color 0.15s;
117
+ }
118
+
119
+ .kb-folder-header:hover {
120
+ background: var(--bg-hover, #2a2a2a);
121
+ }
122
+
123
+ .kb-folder-header i:first-child {
124
+ font-size: 0.75rem;
125
+ color: var(--text-muted, #808080);
126
+ width: 12px;
127
+ }
128
+
129
+ .kb-folder-files {
130
+ padding-left: 1.5rem;
131
+ }
132
+
133
+ .kb-folder.collapsed .kb-folder-files {
134
+ display: none;
135
+ }
136
+
137
+ /* KB File Item */
138
+ .kb-file-item {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: 0.5rem;
142
+ padding: 0.25rem 0.75rem;
143
+ font-size: 0.813rem;
144
+ color: var(--text-primary, #e0e0e0);
145
+ cursor: pointer;
146
+ border-radius: 3px;
147
+ transition: background-color 0.15s;
148
+ }
149
+
150
+ .kb-file-item:hover {
151
+ background: var(--bg-hover, #2a2a2a);
152
+ }
153
+
154
+ .kb-file-item.active {
155
+ background: var(--accent-color-dim, rgba(13, 110, 253, 0.2));
156
+ color: var(--accent-color, #0d6efd);
157
+ }
158
+
159
+ .kb-file-item i {
160
+ font-size: 0.875rem;
161
+ width: 16px;
162
+ text-align: center;
163
+ }
164
+
165
+ .kb-file-name {
166
+ overflow: hidden;
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ .kb-empty {
172
+ padding: 0.5rem 0.75rem;
173
+ font-size: 0.813rem;
174
+ color: var(--text-muted, #808080);
175
+ font-style: italic;
176
+ }
177
+
178
+ .kb-empty-state {
179
+ padding: 2rem 1rem;
180
+ text-align: center;
181
+ color: var(--text-muted, #808080);
182
+ }
183
+
184
+ .kb-empty-state i {
185
+ font-size: 2rem;
186
+ display: block;
187
+ margin-bottom: 0.5rem;
188
+ }
189
+
190
+ /* KB Content (right side) */
191
+ .kb-content {
192
+ flex: 1;
193
+ overflow-y: auto;
194
+ padding: 1.5rem;
195
+ background: var(--bg-primary, #1e1e1e);
196
+ }
197
+
198
+ .kb-placeholder {
199
+ display: flex;
200
+ flex-direction: column;
201
+ align-items: center;
202
+ justify-content: center;
203
+ height: 100%;
204
+ color: var(--text-muted, #808080);
205
+ }
206
+
207
+ .kb-placeholder i {
208
+ font-size: 3rem;
209
+ margin-bottom: 1rem;
210
+ }
211
+
212
+ .kb-placeholder h5 {
213
+ color: var(--text-secondary, #cccccc);
214
+ }
215
+
216
+ /* KB Welcome/Stats View */
217
+ .kb-welcome {
218
+ max-width: 800px;
219
+ }
220
+
221
+ .kb-stats {
222
+ display: flex;
223
+ align-items: center;
224
+ }
225
+
226
+ .kb-section h6 {
227
+ color: var(--text-secondary, #cccccc);
228
+ margin-bottom: 0.75rem;
229
+ display: flex;
230
+ align-items: center;
231
+ }
232
+
233
+ .kb-landing-list {
234
+ border: 1px solid var(--border-color, #3d3d3d);
235
+ border-radius: 4px;
236
+ background: var(--bg-darker, #252526);
237
+ }
238
+
239
+ .kb-landing-file {
240
+ display: flex;
241
+ align-items: center;
242
+ gap: 0.5rem;
243
+ padding: 0.5rem 0.75rem;
244
+ border-bottom: 1px solid var(--border-color, #3d3d3d);
245
+ color: var(--text-primary, #e0e0e0);
246
+ font-size: 0.875rem;
247
+ }
248
+
249
+ .kb-landing-file:last-child {
250
+ border-bottom: none;
251
+ }
252
+
253
+ .kb-topics-grid {
254
+ display: flex;
255
+ flex-wrap: wrap;
256
+ gap: 0.5rem;
257
+ }
258
+
259
+ .kb-topic-card {
260
+ display: flex;
261
+ align-items: center;
262
+ padding: 0.5rem 0.75rem;
263
+ background: var(--bg-darker, #252526);
264
+ border: 1px solid var(--border-color, #3d3d3d);
265
+ border-radius: 4px;
266
+ color: var(--text-primary, #e0e0e0);
267
+ font-size: 0.875rem;
268
+ transition: border-color 0.15s;
269
+ }
270
+
271
+ .kb-topic-card:hover {
272
+ border-color: var(--accent-color, #0d6efd);
273
+ }
274
+
275
+ /* KB File Preview */
276
+ .kb-file-preview {
277
+ background: var(--bg-darker, #252526);
278
+ border: 1px solid var(--border-color, #3d3d3d);
279
+ border-radius: 6px;
280
+ padding: 1.5rem;
281
+ }
282
+
283
+ .kb-file-header {
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 1rem;
287
+ }
288
+
289
+ .kb-file-info h6 {
290
+ color: var(--text-primary, #e0e0e0);
291
+ }
292
+
293
+ .kb-file-meta .badge {
294
+ font-weight: 400;
295
+ }
296
+
297
+ .kb-error {
298
+ padding: 2rem;
299
+ text-align: center;
300
+ color: var(--text-danger, #dc3545);
301
+ }