create-walle 0.9.4 → 0.9.6

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 (90) hide show
  1. package/README.md +13 -11
  2. package/package.json +2 -2
  3. package/template/claude-task-manager/approval-agent.js +3 -2
  4. package/template/claude-task-manager/db.js +44 -10
  5. package/template/claude-task-manager/public/css/walle-session.css +538 -0
  6. package/template/claude-task-manager/public/css/walle.css +5 -1
  7. package/template/claude-task-manager/public/index.html +1335 -172
  8. package/template/claude-task-manager/public/js/prompts.js +4 -1
  9. package/template/claude-task-manager/public/js/walle-session.js +691 -0
  10. package/template/claude-task-manager/public/js/walle.js +115 -54
  11. package/template/claude-task-manager/public/setup.html +9 -0
  12. package/template/claude-task-manager/queue-engine.js +6 -0
  13. package/template/claude-task-manager/server.js +1082 -45
  14. package/template/package.json +1 -1
  15. package/template/wall-e/agent.js +28 -0
  16. package/template/wall-e/api-walle.js +211 -2
  17. package/template/wall-e/brain.js +256 -3
  18. package/template/wall-e/chat.js +202 -63
  19. package/template/wall-e/coding-orchestrator.js +284 -12
  20. package/template/wall-e/context/compactor.js +5 -8
  21. package/template/wall-e/context/context-builder.js +52 -2
  22. package/template/wall-e/context/state-snapshot.js +1 -1
  23. package/template/wall-e/context/topic-matcher.js +5 -1
  24. package/template/wall-e/evaluation/complexity.js +141 -0
  25. package/template/wall-e/evaluation/index.js +9 -0
  26. package/template/wall-e/evaluation/learner.js +208 -0
  27. package/template/wall-e/evaluation/quorum.js +256 -0
  28. package/template/wall-e/evaluation/router.js +332 -0
  29. package/template/wall-e/evaluation/scorecard.js +173 -0
  30. package/template/wall-e/extraction/contradiction.js +7 -10
  31. package/template/wall-e/extraction/knowledge-extractor.js +11 -79
  32. package/template/wall-e/fly.toml +2 -1
  33. package/template/wall-e/llm/anthropic.js +213 -0
  34. package/template/wall-e/llm/client.js +62 -0
  35. package/template/wall-e/llm/google.js +163 -0
  36. package/template/wall-e/llm/health.js +256 -0
  37. package/template/wall-e/llm/index.js +10 -0
  38. package/template/wall-e/llm/ollama.js +97 -0
  39. package/template/wall-e/llm/openai.js +138 -0
  40. package/template/wall-e/llm/tool-adapter.js +206 -0
  41. package/template/wall-e/loops/initiative.js +13 -49
  42. package/template/wall-e/loops/tasks.js +138 -3
  43. package/template/wall-e/package.json +1 -0
  44. package/template/wall-e/scripts/slack-backfill.js +1 -1
  45. package/template/wall-e/scripts/slack-channel-history.js +15 -4
  46. package/template/wall-e/skills/_bundled/model-pricing-sync/SKILL.md +44 -0
  47. package/template/wall-e/skills/_bundled/model-pricing-sync/run.js +251 -0
  48. package/template/wall-e/skills/_bundled/model-trainer/SKILL.md +34 -0
  49. package/template/wall-e/skills/_bundled/model-trainer/index.js +112 -0
  50. package/template/wall-e/skills/_bundled/model-trainer/skill.json +7 -0
  51. package/template/wall-e/skills/_bundled/slack-mentions/run.js +140 -16
  52. package/template/wall-e/skills/claude-code-reader.js +383 -78
  53. package/template/wall-e/skills/skill-executor.js +20 -52
  54. package/template/wall-e/skills/skill-planner.js +28 -3
  55. package/template/wall-e/skills/slack-pull-live.js +2 -2
  56. package/template/wall-e/telemetry.js +130 -0
  57. package/template/wall-e/test/evaluation/complexity.test.js +101 -0
  58. package/template/wall-e/test/evaluation/learner.test.js +271 -0
  59. package/template/wall-e/test/evaluation/quorum.test.js +372 -0
  60. package/template/wall-e/test/evaluation/router.test.js +269 -0
  61. package/template/wall-e/test/evaluation/scorecard.test.js +152 -0
  62. package/template/wall-e/test/llm/anthropic.test.js +172 -0
  63. package/template/wall-e/test/llm/brain-models.test.js +182 -0
  64. package/template/wall-e/test/llm/client.test.js +132 -0
  65. package/template/wall-e/test/llm/google.test.js +37 -0
  66. package/template/wall-e/test/llm/health.test.js +426 -0
  67. package/template/wall-e/test/llm/integration.test.js +285 -0
  68. package/template/wall-e/test/llm/ollama.test.js +50 -0
  69. package/template/wall-e/test/llm/openai.test.js +48 -0
  70. package/template/wall-e/test/llm/tool-adapter.test.js +297 -0
  71. package/template/wall-e/test/training/evaluate.test.js +221 -0
  72. package/template/wall-e/test/training/exporter.test.js +213 -0
  73. package/template/wall-e/test/training/trainer.test.js +241 -0
  74. package/template/wall-e/tests/agent-api.test.js +6 -6
  75. package/template/wall-e/tests/brain.test.js +2 -1
  76. package/template/wall-e/tests/chat.test.js +20 -20
  77. package/template/wall-e/tests/compactor.test.js +13 -15
  78. package/template/wall-e/tests/initiative.test.js +32 -32
  79. package/template/wall-e/tests/session-persistence.test.js +38 -42
  80. package/template/wall-e/tools/local-tools.js +168 -6
  81. package/template/wall-e/tools/permission-checker.js +110 -0
  82. package/template/wall-e/tools/slack-mcp.js +124 -6
  83. package/template/wall-e/training/evaluate.js +202 -0
  84. package/template/wall-e/training/exporter.js +127 -0
  85. package/template/wall-e/training/train.py +269 -0
  86. package/template/wall-e/training/trainer.js +202 -0
  87. package/template/website/Dockerfile +4 -0
  88. package/template/website/fly.toml +15 -0
  89. package/template/website/index.html +436 -0
  90. package/template/website/nginx.conf +21 -0
@@ -0,0 +1,538 @@
1
+ /* ===================================================================
2
+ Wall-E Session — Chat UI, Agent Badges, Tool Cards
3
+ =================================================================== */
4
+
5
+ /* --- Agent color accents in session list --- */
6
+ .session-item[data-agent="walle"] {
7
+ border-left: 3px solid #f59e0b;
8
+ background: #1e1a0e;
9
+ }
10
+ .session-item[data-agent="walle"].active {
11
+ box-shadow: 0 0 0 1px rgba(245,158,11,0.3);
12
+ }
13
+ .session-item[data-agent="claude"] {
14
+ border-left: 3px solid #c084fc;
15
+ }
16
+ .session-item[data-agent="codex"] {
17
+ border-left: 3px solid #22c55e;
18
+ }
19
+ .session-item[data-agent="gemini"] {
20
+ border-left: 3px solid #3b82f6;
21
+ }
22
+ .session-item[data-agent="shell"] {
23
+ border-left: 3px solid #6b7280;
24
+ }
25
+
26
+ /* --- Agent badges --- */
27
+ .agent-badge {
28
+ display: inline-block;
29
+ font-size: 10px;
30
+ font-weight: 600;
31
+ padding: 1px 5px;
32
+ border-radius: 3px;
33
+ margin-left: 4px;
34
+ vertical-align: middle;
35
+ line-height: 1.4;
36
+ white-space: nowrap;
37
+ }
38
+ .agent-badge.walle {
39
+ background: rgba(245,158,11,0.18);
40
+ color: #f59e0b;
41
+ }
42
+ .agent-badge.claude {
43
+ background: rgba(192,132,252,0.18);
44
+ color: #c084fc;
45
+ }
46
+ .agent-badge.codex {
47
+ background: rgba(34,197,94,0.18);
48
+ color: #22c55e;
49
+ }
50
+ .agent-badge.gemini {
51
+ background: rgba(59,130,246,0.18);
52
+ color: #3b82f6;
53
+ }
54
+ .agent-badge.shell {
55
+ background: rgba(107,114,128,0.18);
56
+ color: #6b7280;
57
+ }
58
+
59
+ /* --- Wall-E session container --- */
60
+ .walle-session {
61
+ display: flex;
62
+ flex-direction: column;
63
+ height: 100%;
64
+ width: 100%;
65
+ background: var(--bg, #1a1b26);
66
+ position: absolute;
67
+ top: 0; left: 0; right: 0; bottom: 0;
68
+ }
69
+ .walle-session:not(.active) {
70
+ display: none;
71
+ }
72
+
73
+ /* --- Session header --- */
74
+ .walle-session-header {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 10px;
78
+ padding: 10px 16px;
79
+ background: var(--bg-card, #24283b);
80
+ border-bottom: 1px solid var(--border, #3b4261);
81
+ flex-shrink: 0;
82
+ }
83
+ .walle-session-header .walle-icon {
84
+ font-size: 22px;
85
+ line-height: 1;
86
+ }
87
+ .walle-session-header .session-info {
88
+ flex: 1;
89
+ min-width: 0;
90
+ }
91
+ .walle-session-header .session-title {
92
+ font-weight: 600;
93
+ font-size: 14px;
94
+ color: var(--fg, #c0caf5);
95
+ }
96
+ .walle-session-header .session-meta {
97
+ font-size: 11px;
98
+ color: var(--fg-dim, #565f89);
99
+ margin-top: 2px;
100
+ white-space: nowrap;
101
+ overflow: hidden;
102
+ text-overflow: ellipsis;
103
+ }
104
+ .walle-header-right {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 8px;
108
+ margin-left: auto;
109
+ flex-shrink: 0;
110
+ }
111
+ .walle-session-header .model-select {
112
+ background: var(--bg, #1a1b26);
113
+ color: var(--fg, #c0caf5);
114
+ border: 1px solid var(--border, #3b4261);
115
+ border-radius: 4px;
116
+ padding: 4px 8px;
117
+ font-size: 12px;
118
+ cursor: pointer;
119
+ max-width: 180px;
120
+ }
121
+ .walle-stat-badge {
122
+ font-size: 11px;
123
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
124
+ color: var(--fg-dim, #565f89);
125
+ background: rgba(255,255,255,0.04);
126
+ border: 1px solid var(--border, #3b4261);
127
+ border-radius: 4px;
128
+ padding: 3px 8px;
129
+ white-space: nowrap;
130
+ }
131
+ .walle-stat-badge.cost {
132
+ color: #e0af68;
133
+ }
134
+
135
+ /* --- Chat messages area --- */
136
+ .walle-messages {
137
+ flex: 1;
138
+ overflow-y: auto;
139
+ padding: 12px 16px;
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 12px;
143
+ }
144
+
145
+ .walle-msg {
146
+ display: flex;
147
+ gap: 10px;
148
+ align-items: flex-start;
149
+ max-width: 100%;
150
+ }
151
+ .walle-msg-header {
152
+ display: flex;
153
+ align-items: center;
154
+ gap: 6px;
155
+ margin-bottom: 4px;
156
+ flex-wrap: wrap;
157
+ }
158
+ .walle-msg-avatar {
159
+ width: 28px;
160
+ height: 28px;
161
+ border-radius: 50%;
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ font-size: 13px;
166
+ font-weight: 700;
167
+ flex-shrink: 0;
168
+ color: #fff;
169
+ }
170
+ .walle-msg-avatar.user {
171
+ background: #4a9eff;
172
+ }
173
+ .walle-msg-avatar.assistant {
174
+ background: linear-gradient(135deg, #f59e0b, #d97706);
175
+ }
176
+ .walle-msg-name {
177
+ font-weight: 600;
178
+ font-size: 13px;
179
+ color: var(--fg, #c0caf5);
180
+ }
181
+ .walle-msg-time {
182
+ font-size: 11px;
183
+ color: var(--fg-dim, #565f89);
184
+ }
185
+ .walle-msg-model {
186
+ font-size: 10px;
187
+ background: rgba(167,139,250,0.15);
188
+ color: #a78bfa;
189
+ padding: 1px 5px;
190
+ border-radius: 3px;
191
+ font-weight: 500;
192
+ }
193
+ .walle-msg-body {
194
+ font-size: 13px;
195
+ line-height: 1.55;
196
+ color: var(--fg, #c0caf5);
197
+ overflow-wrap: break-word;
198
+ word-break: break-word;
199
+ flex: 1;
200
+ min-width: 0;
201
+ }
202
+ .walle-msg-body p { margin: 0 0 8px; }
203
+ .walle-msg-body p:last-child { margin-bottom: 0; }
204
+ .walle-msg-body pre {
205
+ background: var(--bg, #1a1b26);
206
+ border: 1px solid var(--border, #3b4261);
207
+ border-radius: 6px;
208
+ padding: 10px 12px;
209
+ overflow-x: auto;
210
+ font-size: 12px;
211
+ margin: 8px 0;
212
+ }
213
+ .walle-msg-body code {
214
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
215
+ font-size: 0.9em;
216
+ background: rgba(255,255,255,0.06);
217
+ padding: 1px 4px;
218
+ border-radius: 3px;
219
+ }
220
+ .walle-msg-body pre code {
221
+ background: none;
222
+ padding: 0;
223
+ }
224
+ .walle-msg-body table {
225
+ border-collapse: collapse;
226
+ margin: 8px 0;
227
+ font-size: 12px;
228
+ width: 100%;
229
+ }
230
+ .walle-msg-body th,
231
+ .walle-msg-body td {
232
+ border: 1px solid var(--border, #3b4261);
233
+ padding: 4px 8px;
234
+ text-align: left;
235
+ }
236
+ .walle-msg-body th {
237
+ background: rgba(255,255,255,0.04);
238
+ font-weight: 600;
239
+ }
240
+ .walle-msg-body ul,
241
+ .walle-msg-body ol {
242
+ margin: 4px 0 8px 18px;
243
+ }
244
+ .walle-msg-body li {
245
+ margin-bottom: 2px;
246
+ }
247
+ .walle-msg-body blockquote {
248
+ border-left: 3px solid var(--border, #3b4261);
249
+ padding-left: 10px;
250
+ margin: 6px 0;
251
+ color: var(--fg-dim, #565f89);
252
+ }
253
+
254
+ /* --- Tool cards --- */
255
+ .walle-tool-card {
256
+ background: var(--bg, #1a1b26);
257
+ border: 1px solid var(--border, #3b4261);
258
+ border-radius: 6px;
259
+ margin: 6px 0;
260
+ overflow: hidden;
261
+ }
262
+ .walle-tool-header {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 6px;
266
+ padding: 6px 10px;
267
+ cursor: pointer;
268
+ user-select: none;
269
+ transition: background 0.15s;
270
+ }
271
+ .walle-tool-header:hover {
272
+ background: rgba(255,255,255,0.03);
273
+ }
274
+ .walle-tool-arrow {
275
+ font-size: 10px;
276
+ color: var(--fg-dim, #565f89);
277
+ transition: transform 0.2s;
278
+ flex-shrink: 0;
279
+ }
280
+ .walle-tool-card[data-expanded="true"] .walle-tool-arrow {
281
+ transform: rotate(90deg);
282
+ }
283
+ .walle-tool-name {
284
+ font-weight: 600;
285
+ font-size: 12px;
286
+ color: #a78bfa;
287
+ }
288
+ .walle-tool-summary {
289
+ font-size: 11px;
290
+ color: var(--fg-dim, #565f89);
291
+ flex: 1;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ white-space: nowrap;
295
+ }
296
+ .walle-tool-status {
297
+ font-size: 10px;
298
+ font-weight: 600;
299
+ padding: 1px 6px;
300
+ border-radius: 3px;
301
+ flex-shrink: 0;
302
+ }
303
+ .walle-tool-status.done {
304
+ background: rgba(34,197,94,0.15);
305
+ color: #22c55e;
306
+ }
307
+ .walle-tool-status.working {
308
+ background: rgba(245,158,11,0.15);
309
+ color: #f59e0b;
310
+ }
311
+ .walle-tool-status.error {
312
+ background: rgba(247,118,142,0.15);
313
+ color: #f7768e;
314
+ }
315
+ .walle-tool-output {
316
+ display: none;
317
+ padding: 8px 10px;
318
+ border-top: 1px solid var(--border, #3b4261);
319
+ font-size: 12px;
320
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
321
+ white-space: pre-wrap;
322
+ word-break: break-all;
323
+ max-height: 300px;
324
+ overflow-y: auto;
325
+ color: var(--fg-dim, #565f89);
326
+ }
327
+ .walle-tool-card[data-expanded="true"] .walle-tool-output {
328
+ display: block;
329
+ }
330
+
331
+ /* Spinner for in-progress tool calls */
332
+ .walle-tool-status.working::after {
333
+ content: '';
334
+ display: inline-block;
335
+ width: 8px;
336
+ height: 8px;
337
+ border: 1.5px solid rgba(245,158,11,0.3);
338
+ border-top-color: #f59e0b;
339
+ border-radius: 50%;
340
+ margin-left: 4px;
341
+ vertical-align: middle;
342
+ animation: walle-spin 0.8s linear infinite;
343
+ }
344
+ @keyframes walle-spin {
345
+ to { transform: rotate(360deg); }
346
+ }
347
+
348
+ /* --- Input bar --- */
349
+ .walle-input-bar {
350
+ display: flex;
351
+ gap: 8px;
352
+ padding: 10px 16px 12px;
353
+ background: var(--bg-card, #24283b);
354
+ border-top: 1px solid var(--border, #3b4261);
355
+ flex-shrink: 0;
356
+ align-items: flex-end;
357
+ }
358
+ .walle-input {
359
+ flex: 1;
360
+ background: var(--bg, #1a1b26);
361
+ color: var(--fg, #c0caf5);
362
+ border: 1px solid var(--border, #3b4261);
363
+ border-radius: 8px;
364
+ padding: 8px 12px;
365
+ font-size: 13px;
366
+ font-family: inherit;
367
+ resize: none;
368
+ min-height: 38px;
369
+ max-height: 200px;
370
+ line-height: 1.4;
371
+ outline: none;
372
+ transition: border-color 0.15s;
373
+ }
374
+ .walle-input:focus {
375
+ border-color: #f59e0b;
376
+ }
377
+ .walle-input::placeholder {
378
+ color: var(--fg-dim, #565f89);
379
+ }
380
+ .walle-send-btn {
381
+ background: linear-gradient(135deg, #f59e0b, #d97706);
382
+ color: #fff;
383
+ border: none;
384
+ border-radius: 8px;
385
+ padding: 8px 16px;
386
+ font-size: 13px;
387
+ font-weight: 600;
388
+ cursor: pointer;
389
+ white-space: nowrap;
390
+ transition: opacity 0.15s;
391
+ }
392
+ .walle-send-btn:hover {
393
+ opacity: 0.9;
394
+ }
395
+ .walle-send-btn:disabled {
396
+ opacity: 0.5;
397
+ cursor: not-allowed;
398
+ }
399
+ .walle-input-hints {
400
+ font-size: 10px;
401
+ color: var(--fg-dim, #565f89);
402
+ padding: 0 16px 6px;
403
+ background: var(--bg-card, #24283b);
404
+ flex-shrink: 0;
405
+ }
406
+
407
+ /* --- Thinking indicator --- */
408
+ .walle-thinking {
409
+ display: flex;
410
+ align-items: center;
411
+ gap: 6px;
412
+ padding: 8px 0;
413
+ color: var(--fg-dim, #565f89);
414
+ font-size: 13px;
415
+ }
416
+ .walle-thinking-dots span {
417
+ display: inline-block;
418
+ width: 6px;
419
+ height: 6px;
420
+ background: #f59e0b;
421
+ border-radius: 50%;
422
+ animation: walle-dot-bounce 1.4s ease-in-out infinite;
423
+ }
424
+ .walle-thinking-dots span:nth-child(2) { animation-delay: 0.2s; }
425
+ .walle-thinking-dots span:nth-child(3) { animation-delay: 0.4s; }
426
+ @keyframes walle-dot-bounce {
427
+ 0%, 80%, 100% { opacity: 0.3; transform: scale(0.8); }
428
+ 40% { opacity: 1; transform: scale(1); }
429
+ }
430
+
431
+ /* --- Error notice --- */
432
+ .walle-error-notice {
433
+ background: rgba(247,118,142,0.12);
434
+ border: 1px solid rgba(247,118,142,0.3);
435
+ border-radius: 6px;
436
+ padding: 8px 12px;
437
+ color: #f7768e;
438
+ font-size: 13px;
439
+ margin: 6px 0;
440
+ }
441
+
442
+ /* Permission Request Card */
443
+ .walle-perm-card {
444
+ margin: 8px 48px 8px 48px;
445
+ padding: 12px 14px;
446
+ border: 1px solid #f59e0b44;
447
+ border-left: 3px solid #f59e0b;
448
+ border-radius: 8px;
449
+ background: color-mix(in srgb, var(--bg-light) 90%, #f59e0b 10%);
450
+ }
451
+ .walle-perm-header {
452
+ display: flex;
453
+ align-items: center;
454
+ gap: 8px;
455
+ margin-bottom: 8px;
456
+ font-size: 12px;
457
+ font-weight: 600;
458
+ color: #f59e0b;
459
+ }
460
+ .walle-perm-detail {
461
+ font-size: 12px;
462
+ color: var(--fg-dim);
463
+ margin-bottom: 4px;
464
+ font-family: 'SF Mono', 'Menlo', monospace;
465
+ }
466
+ .walle-perm-detail code {
467
+ background: var(--bg);
468
+ padding: 2px 6px;
469
+ border-radius: 3px;
470
+ font-size: 11px;
471
+ }
472
+ .walle-perm-reason {
473
+ font-size: 11px;
474
+ color: var(--fg-dim);
475
+ margin-bottom: 10px;
476
+ }
477
+ .walle-perm-actions {
478
+ display: flex;
479
+ gap: 8px;
480
+ }
481
+ .walle-perm-actions button {
482
+ padding: 5px 12px;
483
+ border-radius: 5px;
484
+ border: 1px solid var(--border);
485
+ background: var(--bg);
486
+ color: var(--fg);
487
+ font-size: 11px;
488
+ font-weight: 500;
489
+ cursor: pointer;
490
+ transition: all 0.15s;
491
+ }
492
+ .walle-perm-actions button:hover {
493
+ border-color: var(--fg-dim);
494
+ }
495
+ .walle-perm-actions .perm-allow-once {
496
+ background: #22c55e22;
497
+ border-color: #22c55e44;
498
+ color: #22c55e;
499
+ }
500
+ .walle-perm-actions .perm-allow-once:hover {
501
+ background: #22c55e33;
502
+ }
503
+ .walle-perm-actions .perm-allow-always {
504
+ background: #3b82f622;
505
+ border-color: #3b82f644;
506
+ color: #3b82f6;
507
+ }
508
+ .walle-perm-actions .perm-allow-always:hover {
509
+ background: #3b82f633;
510
+ }
511
+ .walle-perm-actions .perm-deny {
512
+ background: #ef444422;
513
+ border-color: #ef444444;
514
+ color: #ef4444;
515
+ }
516
+ .walle-perm-actions .perm-deny:hover {
517
+ background: #ef444433;
518
+ }
519
+ .walle-perm-card.resolved {
520
+ opacity: 0.6;
521
+ pointer-events: none;
522
+ }
523
+ .walle-perm-card.resolved .walle-perm-actions {
524
+ display: none;
525
+ }
526
+ .walle-perm-card.resolved::after {
527
+ content: attr(data-resolved);
528
+ display: block;
529
+ font-size: 11px;
530
+ font-weight: 500;
531
+ margin-top: 6px;
532
+ }
533
+ .walle-perm-card.resolved.perm-approved::after {
534
+ color: #22c55e;
535
+ }
536
+ .walle-perm-card.resolved.perm-denied::after {
537
+ color: #ef4444;
538
+ }
@@ -1192,5 +1192,9 @@
1192
1192
  transition: border-color 0.15s;
1193
1193
  }
1194
1194
  .we-cc-skill-card:hover { border-color: var(--accent); }
1195
- .we-cc-skill-name { font-size: 11px; font-weight: 600; color: var(--fg); margin-bottom: 2px; }
1195
+ .we-cc-skill-name { font-size: 11px; font-weight: 600; color: var(--fg); margin-bottom: 2px; display: flex; align-items: center; gap: 6px; }
1196
+ .we-cc-skill-source { font-size: 9px; font-weight: 400; color: var(--fg-dim, #666); background: var(--bg-card, #1a1a2e); padding: 1px 5px; border-radius: 3px; white-space: nowrap; }
1197
+ .we-cc-install-btn { font-size: 9px; padding: 1px 6px; border-radius: 3px; border: 1px solid var(--accent, #7c3aed); color: var(--accent, #7c3aed); background: transparent; cursor: pointer; margin-left: auto; white-space: nowrap; transition: all 0.15s; }
1198
+ .we-cc-install-btn:hover { background: var(--accent, #7c3aed); color: #fff; }
1199
+ .we-cc-skill-installed { font-size: 11px; color: #5c940d; margin-left: auto; font-weight: 600; }
1196
1200
  .we-cc-skill-desc { font-size: 10px; color: var(--fg-muted, #888); line-height: 1.3; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }