@quadslab.io/discord-mcp 2.0.1 → 2.1.0
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.
- package/.claude/.quadcode-version +1 -0
- package/.claude/settings.local.json +154 -0
- package/.claude/skills/architect/SKILL.md +111 -0
- package/.claude/skills/assign-environment/SKILL.md +71 -0
- package/.claude/skills/brainstorm/SKILL.md +114 -0
- package/.claude/skills/brainstorm-spec/SKILL.md +72 -0
- package/.claude/skills/check-implemented/SKILL.md +59 -0
- package/.claude/skills/check-issue-progress/SKILL.md +66 -0
- package/.claude/skills/create-rich-plan/SKILL.md +90 -0
- package/.claude/skills/decompose-spec/SKILL.md +32 -0
- package/.claude/skills/detect-environments/SKILL.md +61 -0
- package/.claude/skills/dispatch/SKILL.md +90 -0
- package/.claude/skills/estimate-complexity/SKILL.md +118 -0
- package/.claude/skills/expand-epic/SKILL.md +38 -0
- package/.claude/skills/find-duplicate-issues/SKILL.md +91 -0
- package/.claude/skills/find-duplicates/SKILL.md +77 -0
- package/.claude/skills/find-related-code/SKILL.md +145 -0
- package/.claude/skills/idea-summary/SKILL.md +57 -0
- package/.claude/skills/idea-to-prompt/SKILL.md +98 -0
- package/.claude/skills/ideas-maintenance/SKILL.md +98 -0
- package/.claude/skills/ideas-to-issues/SKILL.md +108 -0
- package/.claude/skills/issue-summary/SKILL.md +64 -0
- package/.claude/skills/issue-to-prompt/SKILL.md +98 -0
- package/.claude/skills/launch-team/SKILL.md +69 -0
- package/.claude/skills/list-environments/SKILL.md +60 -0
- package/.claude/skills/new-spec/SKILL.md +37 -0
- package/.claude/skills/organize-ideas/SKILL.md +47 -0
- package/.claude/skills/organize-issues/SKILL.md +56 -0
- package/.claude/skills/organize-plans/SKILL.md +47 -0
- package/.claude/skills/plan-from-idea/SKILL.md +102 -0
- package/.claude/skills/plan-summary/SKILL.md +53 -0
- package/.claude/skills/plan-to-issues/SKILL.md +63 -0
- package/.claude/skills/preview-promotion/SKILL.md +47 -0
- package/.claude/skills/review-spec/SKILL.md +53 -0
- package/.claude/skills/run-script/SKILL.md +43 -0
- package/.claude/skills/script-summary/SKILL.md +67 -0
- package/.claude/skills/setup-environment/SKILL.md +78 -0
- package/.claude/skills/setup-python/SKILL.md +123 -0
- package/.claude/skills/setup-scripts/SKILL.md +82 -0
- package/.claude/skills/suggest-improvements/SKILL.md +66 -0
- package/.claude/skills/team-status/SKILL.md +68 -0
- package/.claude/skills/triage-issues/SKILL.md +51 -0
- package/.claude/skills/update-plan-progress/SKILL.md +102 -0
- package/.claude/skills/verify-plan/SKILL.md +54 -0
- package/.claude/skills/weekly-digest/SKILL.md +149 -0
- package/.mcp.json +7 -0
- package/.quadcode/config.json +6 -0
- package/CHANGELOG.md +174 -174
- package/CLAUDE.md +40 -0
- package/LICENSE +21 -21
- package/README.md +678 -668
- package/assets/demo.svg +470 -0
- package/assets/social-preview.html +14 -0
- package/assets/social-preview.svg +98 -0
- package/dist/cli.js +8 -8
- package/dist/tools/threads.js +299 -0
- package/dist/tools/threads.js.map +1 -1
- package/dist/tools/utils.js +48 -3
- package/dist/tools/utils.js.map +1 -1
- package/package.json +58 -58
package/assets/demo.svg
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 560" width="800" height="560">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
/* ============================================================
|
|
5
|
+
ANIMATED TERMINAL DEMO — npx @quadslab.io/discord-mcp init
|
|
6
|
+
18s loop, pure CSS keyframes, GitHub-compatible (no JS)
|
|
7
|
+
|
|
8
|
+
Timing (% of 18s):
|
|
9
|
+
0.0s = 0.0% Command typewriter
|
|
10
|
+
1.5s = 8.3% Command done
|
|
11
|
+
1.8s = 10.0% Logo fades in
|
|
12
|
+
2.8s = 15.6% Welcome text
|
|
13
|
+
3.2s = 17.8% Tool count
|
|
14
|
+
3.8s = 21.1% Bot question
|
|
15
|
+
4.4s = 24.4% Answer "y"
|
|
16
|
+
4.8s = 26.7% Token prompt
|
|
17
|
+
5.3s = 29.4% Masked token
|
|
18
|
+
5.8s = 32.2% Spinner starts
|
|
19
|
+
7.8s = 43.3% Connected (spinner hides)
|
|
20
|
+
8.2s = 45.6% Servers found
|
|
21
|
+
8.8s = 48.9% Select server header
|
|
22
|
+
9.1s = 50.6% Server 1
|
|
23
|
+
9.3s = 51.7% Server 2
|
|
24
|
+
9.8s = 54.4% Selection confirmed
|
|
25
|
+
10.4s = 57.8% Client header
|
|
26
|
+
10.8s = 60.0% Client 1
|
|
27
|
+
11.1s = 61.7% Client 2
|
|
28
|
+
11.4s = 63.3% Client 3
|
|
29
|
+
12.2s = 67.8% Setup complete
|
|
30
|
+
12.8s = 71.1% Summary line 1
|
|
31
|
+
13.1s = 72.8% Summary line 2
|
|
32
|
+
13.4s = 74.4% Summary line 3
|
|
33
|
+
15.0s = 83.3% Begin fade out
|
|
34
|
+
16.0s = 88.9% Hidden
|
|
35
|
+
18.0s = 100% Loop
|
|
36
|
+
============================================================ */
|
|
37
|
+
|
|
38
|
+
.mono { font-family: 'SF Mono', 'Cascadia Code', 'Consolas', 'Monaco', monospace; }
|
|
39
|
+
.text-default { fill: #abb2bf; }
|
|
40
|
+
.text-bold { fill: #e5e5e5; }
|
|
41
|
+
.text-cyan { fill: #56b6c2; }
|
|
42
|
+
.text-cyan-br { fill: #6dd6e2; }
|
|
43
|
+
.text-magenta { fill: #c678dd; }
|
|
44
|
+
.text-mag-br { fill: #d898ee; }
|
|
45
|
+
.text-green { fill: #98c379; }
|
|
46
|
+
.text-green-br { fill: #a8d389; }
|
|
47
|
+
.text-red { fill: #e06c75; }
|
|
48
|
+
.text-yellow { fill: #e5c07b; }
|
|
49
|
+
.text-blue-br { fill: #61afef; }
|
|
50
|
+
.text-dim { fill: #5c6370; }
|
|
51
|
+
|
|
52
|
+
/* === KEYFRAMES — each line: hidden → appear → visible → fade out → hidden === */
|
|
53
|
+
|
|
54
|
+
@keyframes typeCmd {
|
|
55
|
+
0% { clip-path: inset(0 100% 0 0); }
|
|
56
|
+
8.3% { clip-path: inset(0 0% 0 0); }
|
|
57
|
+
83.3% { clip-path: inset(0 0% 0 0); }
|
|
58
|
+
88.9% { clip-path: inset(0 100% 0 0); }
|
|
59
|
+
100% { clip-path: inset(0 100% 0 0); }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@keyframes showAt10 {
|
|
63
|
+
0%, 9% { opacity: 0; }
|
|
64
|
+
12% { opacity: 1; }
|
|
65
|
+
83.3% { opacity: 1; }
|
|
66
|
+
88.9% { opacity: 0; }
|
|
67
|
+
100% { opacity: 0; }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes showAt15 {
|
|
71
|
+
0%, 14.5% { opacity: 0; }
|
|
72
|
+
17% { opacity: 1; }
|
|
73
|
+
83.3% { opacity: 1; }
|
|
74
|
+
88.9% { opacity: 0; }
|
|
75
|
+
100% { opacity: 0; }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@keyframes showAt17 {
|
|
79
|
+
0%, 17% { opacity: 0; }
|
|
80
|
+
19% { opacity: 1; }
|
|
81
|
+
83.3% { opacity: 1; }
|
|
82
|
+
88.9% { opacity: 0; }
|
|
83
|
+
100% { opacity: 0; }
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@keyframes showAt21 {
|
|
87
|
+
0%, 20% { opacity: 0; }
|
|
88
|
+
22.5% { opacity: 1; }
|
|
89
|
+
83.3% { opacity: 1; }
|
|
90
|
+
88.9% { opacity: 0; }
|
|
91
|
+
100% { opacity: 0; }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes showAt24 {
|
|
95
|
+
0%, 23.5% { opacity: 0; }
|
|
96
|
+
25% { opacity: 1; }
|
|
97
|
+
83.3% { opacity: 1; }
|
|
98
|
+
88.9% { opacity: 0; }
|
|
99
|
+
100% { opacity: 0; }
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@keyframes showAt26 {
|
|
103
|
+
0%, 26% { opacity: 0; }
|
|
104
|
+
28% { opacity: 1; }
|
|
105
|
+
83.3% { opacity: 1; }
|
|
106
|
+
88.9% { opacity: 0; }
|
|
107
|
+
100% { opacity: 0; }
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@keyframes showAt29 {
|
|
111
|
+
0%, 28.5% { opacity: 0; }
|
|
112
|
+
30.5% { opacity: 1; }
|
|
113
|
+
83.3% { opacity: 1; }
|
|
114
|
+
88.9% { opacity: 0; }
|
|
115
|
+
100% { opacity: 0; }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Spinner: visible 32.2%–43.3% only */
|
|
119
|
+
@keyframes showSpinner {
|
|
120
|
+
0%, 31.5% { opacity: 0; }
|
|
121
|
+
32.2% { opacity: 1; }
|
|
122
|
+
42.5% { opacity: 1; }
|
|
123
|
+
43.3% { opacity: 0; }
|
|
124
|
+
100% { opacity: 0; }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@keyframes showAt43 {
|
|
128
|
+
0%, 42.5% { opacity: 0; }
|
|
129
|
+
44.5% { opacity: 1; }
|
|
130
|
+
83.3% { opacity: 1; }
|
|
131
|
+
88.9% { opacity: 0; }
|
|
132
|
+
100% { opacity: 0; }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@keyframes showAt45 {
|
|
136
|
+
0%, 45% { opacity: 0; }
|
|
137
|
+
46.5% { opacity: 1; }
|
|
138
|
+
83.3% { opacity: 1; }
|
|
139
|
+
88.9% { opacity: 0; }
|
|
140
|
+
100% { opacity: 0; }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
@keyframes showAt48 {
|
|
144
|
+
0%, 48% { opacity: 0; }
|
|
145
|
+
50% { opacity: 1; }
|
|
146
|
+
83.3% { opacity: 1; }
|
|
147
|
+
88.9% { opacity: 0; }
|
|
148
|
+
100% { opacity: 0; }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@keyframes showAt50 {
|
|
152
|
+
0%, 50% { opacity: 0; }
|
|
153
|
+
51.5% { opacity: 1; }
|
|
154
|
+
83.3% { opacity: 1; }
|
|
155
|
+
88.9% { opacity: 0; }
|
|
156
|
+
100% { opacity: 0; }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@keyframes showAt51 {
|
|
160
|
+
0%, 51% { opacity: 0; }
|
|
161
|
+
52.5% { opacity: 1; }
|
|
162
|
+
83.3% { opacity: 1; }
|
|
163
|
+
88.9% { opacity: 0; }
|
|
164
|
+
100% { opacity: 0; }
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@keyframes showAt54 {
|
|
168
|
+
0%, 53.5% { opacity: 0; }
|
|
169
|
+
55% { opacity: 1; }
|
|
170
|
+
83.3% { opacity: 1; }
|
|
171
|
+
88.9% { opacity: 0; }
|
|
172
|
+
100% { opacity: 0; }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@keyframes showAt57 {
|
|
176
|
+
0%, 57% { opacity: 0; }
|
|
177
|
+
59% { opacity: 1; }
|
|
178
|
+
83.3% { opacity: 1; }
|
|
179
|
+
88.9% { opacity: 0; }
|
|
180
|
+
100% { opacity: 0; }
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
@keyframes showAt60 {
|
|
184
|
+
0%, 59% { opacity: 0; }
|
|
185
|
+
61% { opacity: 1; }
|
|
186
|
+
83.3% { opacity: 1; }
|
|
187
|
+
88.9% { opacity: 0; }
|
|
188
|
+
100% { opacity: 0; }
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@keyframes showAt61 {
|
|
192
|
+
0%, 61% { opacity: 0; }
|
|
193
|
+
62.5% { opacity: 1; }
|
|
194
|
+
83.3% { opacity: 1; }
|
|
195
|
+
88.9% { opacity: 0; }
|
|
196
|
+
100% { opacity: 0; }
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@keyframes showAt63 {
|
|
200
|
+
0%, 62.5% { opacity: 0; }
|
|
201
|
+
64% { opacity: 1; }
|
|
202
|
+
83.3% { opacity: 1; }
|
|
203
|
+
88.9% { opacity: 0; }
|
|
204
|
+
100% { opacity: 0; }
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@keyframes showAt67 {
|
|
208
|
+
0%, 66.5% { opacity: 0; }
|
|
209
|
+
69% { opacity: 1; }
|
|
210
|
+
83.3% { opacity: 1; }
|
|
211
|
+
88.9% { opacity: 0; }
|
|
212
|
+
100% { opacity: 0; }
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@keyframes showAt71 {
|
|
216
|
+
0%, 70% { opacity: 0; }
|
|
217
|
+
72% { opacity: 1; }
|
|
218
|
+
83.3% { opacity: 1; }
|
|
219
|
+
88.9% { opacity: 0; }
|
|
220
|
+
100% { opacity: 0; }
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@keyframes showAt72 {
|
|
224
|
+
0%, 72% { opacity: 0; }
|
|
225
|
+
73.5% { opacity: 1; }
|
|
226
|
+
83.3% { opacity: 1; }
|
|
227
|
+
88.9% { opacity: 0; }
|
|
228
|
+
100% { opacity: 0; }
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
@keyframes showAt74 {
|
|
232
|
+
0%, 73.5% { opacity: 0; }
|
|
233
|
+
75% { opacity: 1; }
|
|
234
|
+
83.3% { opacity: 1; }
|
|
235
|
+
88.9% { opacity: 0; }
|
|
236
|
+
100% { opacity: 0; }
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/* Spinner character rotation */
|
|
240
|
+
@keyframes spinA {
|
|
241
|
+
0% { opacity: 1; } 12.5% { opacity: 0; }
|
|
242
|
+
87.5% { opacity: 0; } 100% { opacity: 1; }
|
|
243
|
+
}
|
|
244
|
+
@keyframes spinB {
|
|
245
|
+
0% { opacity: 0; } 12.5% { opacity: 1; }
|
|
246
|
+
25% { opacity: 0; } 100% { opacity: 0; }
|
|
247
|
+
}
|
|
248
|
+
@keyframes spinC {
|
|
249
|
+
0% { opacity: 0; } 25% { opacity: 1; }
|
|
250
|
+
37.5% { opacity: 0; } 100% { opacity: 0; }
|
|
251
|
+
}
|
|
252
|
+
@keyframes spinD {
|
|
253
|
+
0% { opacity: 0; } 37.5% { opacity: 1; }
|
|
254
|
+
50% { opacity: 0; } 100% { opacity: 0; }
|
|
255
|
+
}
|
|
256
|
+
@keyframes spinE {
|
|
257
|
+
0% { opacity: 0; } 50% { opacity: 1; }
|
|
258
|
+
62.5% { opacity: 0; } 100% { opacity: 0; }
|
|
259
|
+
}
|
|
260
|
+
@keyframes spinF {
|
|
261
|
+
0% { opacity: 0; } 62.5% { opacity: 1; }
|
|
262
|
+
75% { opacity: 0; } 100% { opacity: 0; }
|
|
263
|
+
}
|
|
264
|
+
@keyframes spinG {
|
|
265
|
+
0% { opacity: 0; } 75% { opacity: 1; }
|
|
266
|
+
87.5% { opacity: 0; } 100% { opacity: 0; }
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* Apply classes */
|
|
270
|
+
.anim-cmd { clip-path: inset(0 100% 0 0); animation: typeCmd 18s steps(40) infinite; }
|
|
271
|
+
.anim-logo { opacity: 0; animation: showAt10 18s ease infinite; }
|
|
272
|
+
.anim-welcome { opacity: 0; animation: showAt15 18s ease infinite; }
|
|
273
|
+
.anim-tools { opacity: 0; animation: showAt17 18s ease infinite; }
|
|
274
|
+
.anim-q1 { opacity: 0; animation: showAt21 18s ease infinite; }
|
|
275
|
+
.anim-a1 { opacity: 0; animation: showAt24 18s ease infinite; }
|
|
276
|
+
.anim-q2 { opacity: 0; animation: showAt26 18s ease infinite; }
|
|
277
|
+
.anim-a2 { opacity: 0; animation: showAt29 18s ease infinite; }
|
|
278
|
+
.anim-spinner { opacity: 0; animation: showSpinner 18s ease infinite; }
|
|
279
|
+
.anim-connected { opacity: 0; animation: showAt43 18s ease infinite; }
|
|
280
|
+
.anim-srvfound { opacity: 0; animation: showAt45 18s ease infinite; }
|
|
281
|
+
.anim-selheader { opacity: 0; animation: showAt48 18s ease infinite; }
|
|
282
|
+
.anim-srv1 { opacity: 0; animation: showAt50 18s ease infinite; }
|
|
283
|
+
.anim-srv2 { opacity: 0; animation: showAt51 18s ease infinite; }
|
|
284
|
+
.anim-selconf { opacity: 0; animation: showAt54 18s ease infinite; }
|
|
285
|
+
.anim-clheader { opacity: 0; animation: showAt57 18s ease infinite; }
|
|
286
|
+
.anim-cl1 { opacity: 0; animation: showAt60 18s ease infinite; }
|
|
287
|
+
.anim-cl2 { opacity: 0; animation: showAt61 18s ease infinite; }
|
|
288
|
+
.anim-cl3 { opacity: 0; animation: showAt63 18s ease infinite; }
|
|
289
|
+
.anim-done { opacity: 0; animation: showAt67 18s ease infinite; }
|
|
290
|
+
.anim-sum1 { opacity: 0; animation: showAt71 18s ease infinite; }
|
|
291
|
+
.anim-sum2 { opacity: 0; animation: showAt72 18s ease infinite; }
|
|
292
|
+
.anim-sum3 { opacity: 0; animation: showAt74 18s ease infinite; }
|
|
293
|
+
|
|
294
|
+
.sp-a { opacity: 0; animation: spinA 0.64s step-end infinite; }
|
|
295
|
+
.sp-b { opacity: 0; animation: spinB 0.64s step-end infinite; }
|
|
296
|
+
.sp-c { opacity: 0; animation: spinC 0.64s step-end infinite; }
|
|
297
|
+
.sp-d { opacity: 0; animation: spinD 0.64s step-end infinite; }
|
|
298
|
+
.sp-e { opacity: 0; animation: spinE 0.64s step-end infinite; }
|
|
299
|
+
.sp-f { opacity: 0; animation: spinF 0.64s step-end infinite; }
|
|
300
|
+
.sp-g { opacity: 0; animation: spinG 0.64s step-end infinite; }
|
|
301
|
+
</style>
|
|
302
|
+
</defs>
|
|
303
|
+
|
|
304
|
+
<!-- Terminal background -->
|
|
305
|
+
<rect width="800" height="560" rx="10" fill="#1e1e2e"/>
|
|
306
|
+
|
|
307
|
+
<!-- Title bar -->
|
|
308
|
+
<rect width="800" height="36" rx="10" fill="#16161e"/>
|
|
309
|
+
<rect y="20" width="800" height="16" fill="#16161e"/>
|
|
310
|
+
<circle cx="20" cy="18" r="6" fill="#e06c75"/>
|
|
311
|
+
<circle cx="40" cy="18" r="6" fill="#e5c07b"/>
|
|
312
|
+
<circle cx="60" cy="18" r="6" fill="#98c379"/>
|
|
313
|
+
<text x="400" y="22" text-anchor="middle" class="mono text-dim" font-size="12">Terminal</text>
|
|
314
|
+
|
|
315
|
+
<!-- === CONTENT === -->
|
|
316
|
+
|
|
317
|
+
<!-- 1. Command (typewriter) -->
|
|
318
|
+
<g class="anim-cmd" transform="translate(20, 58)">
|
|
319
|
+
<text class="mono text-green-br" font-size="14" font-weight="bold">$</text>
|
|
320
|
+
<text x="16" class="mono text-default" font-size="14"> npx @quadslab.io/discord-mcp init</text>
|
|
321
|
+
</g>
|
|
322
|
+
|
|
323
|
+
<!-- 2. Block logo (cyan bright top → cyan mid → magenta bottom) -->
|
|
324
|
+
<g class="anim-logo" transform="translate(20, 80)">
|
|
325
|
+
<text class="mono text-cyan-br" font-size="11" font-weight="bold" xml:space="preserve"> ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗</text>
|
|
326
|
+
<text y="13" class="mono text-cyan-br" font-size="11" font-weight="bold" xml:space="preserve"> ██╔═══██╗██║ ██║██╔══██╗██╔══██╗██╔════╝</text>
|
|
327
|
+
<text y="26" class="mono text-cyan" font-size="11" xml:space="preserve"> ██║ ██║██║ ██║███████║██║ ██║███████║</text>
|
|
328
|
+
<text y="39" class="mono text-cyan" font-size="11" xml:space="preserve"> ██║▄▄ ██║██║ ██║██╔══██║██║ ██║╚════██║</text>
|
|
329
|
+
<text y="52" class="mono text-magenta" font-size="11" xml:space="preserve"> ╚██████╔╝╚██████╔╝██║ ██║██████╔╝███████║</text>
|
|
330
|
+
<text y="65" class="mono text-magenta" font-size="11" xml:space="preserve"> ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝</text>
|
|
331
|
+
<text y="82" class="mono" font-size="12">
|
|
332
|
+
<tspan class="text-mag-br" font-weight="bold" xml:space="preserve"> L A B </tspan><tspan class="text-dim">.io</tspan>
|
|
333
|
+
</text>
|
|
334
|
+
</g>
|
|
335
|
+
|
|
336
|
+
<!-- 3. Welcome -->
|
|
337
|
+
<g class="anim-welcome" transform="translate(20, 186)">
|
|
338
|
+
<text class="mono text-bold" font-size="14" font-weight="bold">Discord MCP Server</text>
|
|
339
|
+
<text x="170" class="mono text-dim" font-size="14" xml:space="preserve"> — </text>
|
|
340
|
+
<text x="206" class="mono text-dim" font-size="14">Interactive Setup Wizard</text>
|
|
341
|
+
</g>
|
|
342
|
+
|
|
343
|
+
<!-- 4. Tool count -->
|
|
344
|
+
<g class="anim-tools" transform="translate(20, 206)">
|
|
345
|
+
<text class="mono text-dim" font-size="13">134 admin tools across 20 categories</text>
|
|
346
|
+
</g>
|
|
347
|
+
|
|
348
|
+
<!-- 5. Bot question -->
|
|
349
|
+
<g class="anim-q1" transform="translate(20, 232)">
|
|
350
|
+
<text class="mono text-cyan-br" font-size="14">?</text>
|
|
351
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Do you already have a Discord bot?</text>
|
|
352
|
+
</g>
|
|
353
|
+
|
|
354
|
+
<!-- Answer: y -->
|
|
355
|
+
<g class="anim-a1" transform="translate(316, 232)">
|
|
356
|
+
<text class="mono text-cyan-br" font-size="14" font-weight="bold">y</text>
|
|
357
|
+
</g>
|
|
358
|
+
|
|
359
|
+
<!-- 6. Token prompt -->
|
|
360
|
+
<g class="anim-q2" transform="translate(20, 252)">
|
|
361
|
+
<text class="mono text-cyan-br" font-size="14">?</text>
|
|
362
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Paste your bot token:</text>
|
|
363
|
+
</g>
|
|
364
|
+
|
|
365
|
+
<!-- Masked token -->
|
|
366
|
+
<g class="anim-a2" transform="translate(216, 252)">
|
|
367
|
+
<text class="mono text-dim" font-size="14">••••••••••••••••••••••</text>
|
|
368
|
+
</g>
|
|
369
|
+
|
|
370
|
+
<!-- 7. Spinner (visible 5.8s–7.8s only) -->
|
|
371
|
+
<g class="anim-spinner" transform="translate(20, 276)">
|
|
372
|
+
<text class="sp-a mono text-cyan-br" font-size="14">⠋</text>
|
|
373
|
+
<text class="sp-b mono text-cyan-br" font-size="14">⠙</text>
|
|
374
|
+
<text class="sp-c mono text-cyan-br" font-size="14">⠹</text>
|
|
375
|
+
<text class="sp-d mono text-cyan-br" font-size="14">⠸</text>
|
|
376
|
+
<text class="sp-e mono text-cyan-br" font-size="14">⠼</text>
|
|
377
|
+
<text class="sp-f mono text-cyan-br" font-size="14">⠴</text>
|
|
378
|
+
<text class="sp-g mono text-cyan-br" font-size="14">⠧</text>
|
|
379
|
+
<text x="16" class="mono text-default" font-size="14"> Authenticating bot token...</text>
|
|
380
|
+
</g>
|
|
381
|
+
|
|
382
|
+
<!-- 8. Connected checkmark -->
|
|
383
|
+
<g class="anim-connected" transform="translate(20, 276)">
|
|
384
|
+
<text class="mono text-green-br" font-size="14">✔</text>
|
|
385
|
+
<text x="16" class="mono text-default" font-size="14"> Connected as </text>
|
|
386
|
+
<text x="140" class="mono text-bold" font-size="14" font-weight="bold">QuadsBot#1234</text>
|
|
387
|
+
</g>
|
|
388
|
+
|
|
389
|
+
<!-- 9. Servers found -->
|
|
390
|
+
<g class="anim-srvfound" transform="translate(20, 296)">
|
|
391
|
+
<text class="mono text-green-br" font-size="14">✔</text>
|
|
392
|
+
<text x="16" class="mono text-default" font-size="14"> Servers found: </text>
|
|
393
|
+
<text x="148" class="mono text-bold" font-size="14" font-weight="bold">2</text>
|
|
394
|
+
</g>
|
|
395
|
+
|
|
396
|
+
<!-- 10. Select server header -->
|
|
397
|
+
<g class="anim-selheader" transform="translate(20, 322)">
|
|
398
|
+
<text class="mono text-cyan-br" font-size="14">?</text>
|
|
399
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Select your server:</text>
|
|
400
|
+
</g>
|
|
401
|
+
|
|
402
|
+
<!-- Server 1 (selected) -->
|
|
403
|
+
<g class="anim-srv1" transform="translate(36, 342)">
|
|
404
|
+
<text class="mono text-cyan-br" font-size="14">❯</text>
|
|
405
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> QuadsLab HQ</text>
|
|
406
|
+
<text x="148" class="mono text-dim" font-size="13"> (2,847 members)</text>
|
|
407
|
+
</g>
|
|
408
|
+
|
|
409
|
+
<!-- Server 2 -->
|
|
410
|
+
<g class="anim-srv2" transform="translate(36, 360)">
|
|
411
|
+
<text class="mono text-dim" font-size="14" xml:space="preserve"> </text>
|
|
412
|
+
<text x="16" class="mono text-default" font-size="14"> Testing Ground</text>
|
|
413
|
+
<text x="168" class="mono text-dim" font-size="13"> (12 members)</text>
|
|
414
|
+
</g>
|
|
415
|
+
|
|
416
|
+
<!-- Selection confirmed -->
|
|
417
|
+
<g class="anim-selconf" transform="translate(20, 386)">
|
|
418
|
+
<text class="mono text-green-br" font-size="14">✔</text>
|
|
419
|
+
<text x="16" class="mono text-default" font-size="14"> Server: </text>
|
|
420
|
+
<text x="88" class="mono text-bold" font-size="14" font-weight="bold">QuadsLab HQ</text>
|
|
421
|
+
</g>
|
|
422
|
+
|
|
423
|
+
<!-- 11. Configure MCP Clients header -->
|
|
424
|
+
<g class="anim-clheader" transform="translate(20, 412)">
|
|
425
|
+
<text class="mono text-bold" font-size="14" font-weight="bold">Detected MCP clients:</text>
|
|
426
|
+
</g>
|
|
427
|
+
|
|
428
|
+
<!-- Client 1: Claude Code (● = detected) -->
|
|
429
|
+
<g class="anim-cl1" transform="translate(36, 432)">
|
|
430
|
+
<text class="mono text-green-br" font-size="14">●</text>
|
|
431
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Claude Code</text>
|
|
432
|
+
</g>
|
|
433
|
+
|
|
434
|
+
<!-- Client 2: Cursor -->
|
|
435
|
+
<g class="anim-cl2" transform="translate(36, 450)">
|
|
436
|
+
<text class="mono text-green-br" font-size="14">●</text>
|
|
437
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Cursor</text>
|
|
438
|
+
</g>
|
|
439
|
+
|
|
440
|
+
<!-- Client 3: Claude Desktop -->
|
|
441
|
+
<g class="anim-cl3" transform="translate(36, 468)">
|
|
442
|
+
<text class="mono text-green-br" font-size="14">●</text>
|
|
443
|
+
<text x="16" class="mono text-bold" font-size="14" font-weight="bold"> Claude Desktop</text>
|
|
444
|
+
</g>
|
|
445
|
+
|
|
446
|
+
<!-- 12. Setup complete -->
|
|
447
|
+
<g class="anim-done" transform="translate(20, 496)">
|
|
448
|
+
<text class="mono text-green-br" font-size="15" font-weight="bold">✔ Setup complete!</text>
|
|
449
|
+
</g>
|
|
450
|
+
|
|
451
|
+
<!-- Summary lines -->
|
|
452
|
+
<g class="anim-sum1" transform="translate(20, 518)">
|
|
453
|
+
<text class="mono text-dim" font-size="13">Bot:</text>
|
|
454
|
+
<text x="68" class="mono text-bold" font-size="13" font-weight="bold">QuadsBot#1234</text>
|
|
455
|
+
<text x="186" class="mono text-dim" font-size="13">(NjE2...kQ)</text>
|
|
456
|
+
</g>
|
|
457
|
+
|
|
458
|
+
<g class="anim-sum2" transform="translate(20, 534)">
|
|
459
|
+
<text class="mono text-dim" font-size="13">Server:</text>
|
|
460
|
+
<text x="68" class="mono text-bold" font-size="13" font-weight="bold">QuadsLab HQ</text>
|
|
461
|
+
<text x="170" class="mono text-dim" font-size="13">(1234567890)</text>
|
|
462
|
+
</g>
|
|
463
|
+
|
|
464
|
+
<g class="anim-sum3" transform="translate(20, 550)">
|
|
465
|
+
<text class="mono text-dim" font-size="13">Clients:</text>
|
|
466
|
+
<text x="68" class="mono text-bold" font-size="13" font-weight="bold">Claude Code, Cursor, Claude Desktop</text>
|
|
467
|
+
<text x="358" class="mono text-green-br" font-size="13">✔</text>
|
|
468
|
+
</g>
|
|
469
|
+
|
|
470
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<style>
|
|
5
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
6
|
+
html { width: 1280px; height: 640px; overflow: hidden; background: #1e1e2e; }
|
|
7
|
+
body { width: 1280px; height: 640px; overflow: hidden; background: #1e1e2e; }
|
|
8
|
+
img { display: block; width: 1280px; height: 640px; }
|
|
9
|
+
</style>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<img src="social-preview.svg">
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 640" width="1280" height="640">
|
|
2
|
+
<defs>
|
|
3
|
+
<style>
|
|
4
|
+
.mono { font-family: 'SF Mono', 'Cascadia Code', 'Consolas', 'Monaco', monospace; }
|
|
5
|
+
</style>
|
|
6
|
+
</defs>
|
|
7
|
+
|
|
8
|
+
<!-- Terminal fills the whole image -->
|
|
9
|
+
<rect width="1280" height="640" rx="12" fill="#1e1e2e"/>
|
|
10
|
+
|
|
11
|
+
<!-- Title bar -->
|
|
12
|
+
<rect width="1280" height="36" rx="12" fill="#16161e"/>
|
|
13
|
+
<rect y="24" width="1280" height="12" fill="#16161e"/>
|
|
14
|
+
<circle cx="24" cy="18" r="7" fill="#e06c75"/>
|
|
15
|
+
<circle cx="48" cy="18" r="7" fill="#e5c07b"/>
|
|
16
|
+
<circle cx="72" cy="18" r="7" fill="#98c379"/>
|
|
17
|
+
<text x="640" y="22" text-anchor="middle" class="mono" font-size="13" fill="#5c6370">Terminal</text>
|
|
18
|
+
|
|
19
|
+
<!-- QUADS block logo + LAB.io inline -->
|
|
20
|
+
<g transform="translate(200, 50)">
|
|
21
|
+
<text class="mono" fill="#6dd6e2" font-size="13" font-weight="bold" xml:space="preserve"> ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗</text>
|
|
22
|
+
<text y="15" class="mono" fill="#6dd6e2" font-size="13" font-weight="bold" xml:space="preserve"> ██╔═══██╗██║ ██║██╔══██╗██╔══██╗██╔════╝</text>
|
|
23
|
+
<text y="30" class="mono" fill="#56b6c2" font-size="13" xml:space="preserve"> ██║ ██║██║ ██║███████║██║ ██║███████║</text>
|
|
24
|
+
<text y="45" class="mono" fill="#56b6c2" font-size="13" xml:space="preserve"> ██║▄▄ ██║██║ ██║██╔══██║██║ ██║╚════██║</text>
|
|
25
|
+
<text y="60" class="mono" fill="#c678dd" font-size="13" xml:space="preserve"> ╚██████╔╝╚██████╔╝██║ ██║██████╔╝███████║</text>
|
|
26
|
+
<text y="75" class="mono" fill="#c678dd" font-size="13" xml:space="preserve"> ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝</text>
|
|
27
|
+
<text x="350" y="48" class="mono" font-size="22">
|
|
28
|
+
<tspan fill="#d898ee" font-weight="bold">L A B</tspan><tspan fill="#5c6370"> .io</tspan>
|
|
29
|
+
</text>
|
|
30
|
+
</g>
|
|
31
|
+
|
|
32
|
+
<!-- Block art: DISCORD -->
|
|
33
|
+
<g transform="translate(100, 140)">
|
|
34
|
+
<text class="mono" fill="#e5e5e5" font-size="24" font-weight="bold" xml:space="preserve">██████╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ██████╗ </text>
|
|
35
|
+
<text y="28" class="mono" fill="#e5e5e5" font-size="24" font-weight="bold" xml:space="preserve">██╔══██╗██║██╔════╝██╔════╝██╔══██╗██╔══██╗██╔══██╗</text>
|
|
36
|
+
<text y="56" class="mono" fill="#abb2bf" font-size="24" xml:space="preserve">██║ ██║██║███████╗██║ ██║ ██║██████╔╝██║ ██║</text>
|
|
37
|
+
<text y="84" class="mono" fill="#abb2bf" font-size="24" xml:space="preserve">██║ ██║██║╚════██║██║ ██║ ██║██╔══██╗██║ ██║</text>
|
|
38
|
+
<text y="112" class="mono" fill="#5c6370" font-size="24" xml:space="preserve">██████╔╝██║███████║╚██████╗██████╔╝██║ ██║██████╔╝</text>
|
|
39
|
+
<text y="140" class="mono" fill="#5c6370" font-size="24" xml:space="preserve">╚═════╝ ╚═╝╚══════╝ ╚═════╝╚═════╝ ╚═╝ ╚═╝╚═════╝ </text>
|
|
40
|
+
</g>
|
|
41
|
+
|
|
42
|
+
<!-- Block art: MCP SERVER -->
|
|
43
|
+
<g transform="translate(28, 296)">
|
|
44
|
+
<text class="mono" fill="#6dd6e2" font-size="24" font-weight="bold" xml:space="preserve">███╗ ███╗ ██████╗██████╗ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗ </text>
|
|
45
|
+
<text y="28" class="mono" fill="#6dd6e2" font-size="24" font-weight="bold" xml:space="preserve">████╗ ████║██╔════╝██╔══██╗ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗</text>
|
|
46
|
+
<text y="56" class="mono" fill="#56b6c2" font-size="24" xml:space="preserve">██╔████╔██║██║ ██████╔╝ ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝</text>
|
|
47
|
+
<text y="84" class="mono" fill="#56b6c2" font-size="24" xml:space="preserve">██║╚██╔╝██║██║ ██╔═══╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗</text>
|
|
48
|
+
<text y="112" class="mono" fill="#c678dd" font-size="24" xml:space="preserve">██║ ╚═╝ ██║╚██████╗██║ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║</text>
|
|
49
|
+
<text y="140" class="mono" fill="#c678dd" font-size="24" xml:space="preserve">╚═╝ ╚═╝ ╚═════╝╚═╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝</text>
|
|
50
|
+
</g>
|
|
51
|
+
|
|
52
|
+
<!-- Separator -->
|
|
53
|
+
<line x1="80" y1="454" x2="1200" y2="454" stroke="#2a2a3a" stroke-width="1"/>
|
|
54
|
+
|
|
55
|
+
<!-- Subtitle + Stats -->
|
|
56
|
+
<text x="640" y="480" text-anchor="middle" class="mono" font-size="15" fill="#5c6370">Manage your entire Discord server from any MCP client</text>
|
|
57
|
+
<text x="640" y="504" text-anchor="middle" class="mono" font-size="17">
|
|
58
|
+
<tspan fill="#6dd6e2" font-weight="bold">134</tspan>
|
|
59
|
+
<tspan fill="#abb2bf"> admin tools</tspan>
|
|
60
|
+
<tspan fill="#5c6370" xml:space="preserve"> · </tspan>
|
|
61
|
+
<tspan fill="#c678dd" font-weight="bold">20</tspan>
|
|
62
|
+
<tspan fill="#abb2bf"> categories</tspan>
|
|
63
|
+
</text>
|
|
64
|
+
|
|
65
|
+
<!-- Client badges -->
|
|
66
|
+
<g transform="translate(152, 520)">
|
|
67
|
+
<rect width="150" height="24" rx="6" fill="#2a2a3a" stroke="#3a3a4a" stroke-width="1"/>
|
|
68
|
+
<text x="12" y="17" class="mono" font-size="11" fill="#98c379">●</text>
|
|
69
|
+
<text x="24" y="17" class="mono" font-size="11" fill="#e5e5e5" font-weight="bold">Claude Code</text>
|
|
70
|
+
</g>
|
|
71
|
+
<g transform="translate(320, 520)">
|
|
72
|
+
<rect width="110" height="24" rx="6" fill="#2a2a3a" stroke="#3a3a4a" stroke-width="1"/>
|
|
73
|
+
<text x="12" y="17" class="mono" font-size="11" fill="#98c379">●</text>
|
|
74
|
+
<text x="24" y="17" class="mono" font-size="11" fill="#e5e5e5" font-weight="bold">Cursor</text>
|
|
75
|
+
</g>
|
|
76
|
+
<g transform="translate(448, 520)">
|
|
77
|
+
<rect width="158" height="24" rx="6" fill="#2a2a3a" stroke="#3a3a4a" stroke-width="1"/>
|
|
78
|
+
<text x="12" y="17" class="mono" font-size="11" fill="#98c379">●</text>
|
|
79
|
+
<text x="24" y="17" class="mono" font-size="11" fill="#e5e5e5" font-weight="bold">Claude Desktop</text>
|
|
80
|
+
</g>
|
|
81
|
+
<g transform="translate(624, 520)">
|
|
82
|
+
<rect width="120" height="24" rx="6" fill="#2a2a3a" stroke="#3a3a4a" stroke-width="1"/>
|
|
83
|
+
<text x="12" y="17" class="mono" font-size="11" fill="#98c379">●</text>
|
|
84
|
+
<text x="24" y="17" class="mono" font-size="11" fill="#e5e5e5" font-weight="bold">Windsurf</text>
|
|
85
|
+
</g>
|
|
86
|
+
|
|
87
|
+
<!-- npx command box -->
|
|
88
|
+
<g transform="translate(350, 556)">
|
|
89
|
+
<rect width="520" height="30" rx="8" fill="#16161e" stroke="#2a2a3a" stroke-width="1"/>
|
|
90
|
+
<text x="18" y="20" class="mono" font-size="13">
|
|
91
|
+
<tspan fill="#98c379" font-weight="bold">$</tspan>
|
|
92
|
+
<tspan fill="#5c6370"> npx</tspan>
|
|
93
|
+
<tspan fill="#61afef"> @quadslab.io/discord-mcp</tspan>
|
|
94
|
+
<tspan fill="#e5e5e5" font-weight="bold"> init</tspan>
|
|
95
|
+
</text>
|
|
96
|
+
</g>
|
|
97
|
+
|
|
98
|
+
</svg>
|
package/dist/cli.js
CHANGED
|
@@ -43,14 +43,14 @@ const c = {
|
|
|
43
43
|
const out = (...args) => process.stderr.write(args.join(''));
|
|
44
44
|
const ln = (...args) => process.stderr.write(args.join('') + '\n');
|
|
45
45
|
// ── Brand Art ────────────────────────────────────────────────────────
|
|
46
|
-
const LOGO = `
|
|
47
|
-
${c.cyanBright}${c.bold} ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗${c.reset}
|
|
48
|
-
${c.cyanBright}${c.bold} ██╔═══██╗██║ ██║██╔══██╗██╔══██╗██╔════╝${c.reset}
|
|
49
|
-
${c.cyan} ██║ ██║██║ ██║███████║██║ ██║███████╗${c.reset}
|
|
50
|
-
${c.cyan} ██║▄▄ ██║██║ ██║██╔══██║██║ ██║╚════██║${c.reset}
|
|
51
|
-
${c.magenta} ╚██████╔╝╚██████╔╝██║ ██║██████╔╝███████║${c.reset}
|
|
52
|
-
${c.magenta} ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝${c.reset}
|
|
53
|
-
${c.magentaBright}${c.bold} L A B ${c.dim}.io${c.reset}
|
|
46
|
+
const LOGO = `
|
|
47
|
+
${c.cyanBright}${c.bold} ██████╗ ██╗ ██╗ █████╗ ██████╗ ███████╗${c.reset}
|
|
48
|
+
${c.cyanBright}${c.bold} ██╔═══██╗██║ ██║██╔══██╗██╔══██╗██╔════╝${c.reset}
|
|
49
|
+
${c.cyan} ██║ ██║██║ ██║███████║██║ ██║███████╗${c.reset}
|
|
50
|
+
${c.cyan} ██║▄▄ ██║██║ ██║██╔══██║██║ ██║╚════██║${c.reset}
|
|
51
|
+
${c.magenta} ╚██████╔╝╚██████╔╝██║ ██║██████╔╝███████║${c.reset}
|
|
52
|
+
${c.magenta} ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚══════╝${c.reset}
|
|
53
|
+
${c.magentaBright}${c.bold} L A B ${c.dim}.io${c.reset}
|
|
54
54
|
`;
|
|
55
55
|
const LOGO_MINI = `${c.cyanBright}${c.bold}QuadsLab${c.magentaBright}.io${c.reset}`;
|
|
56
56
|
const DISCORD_MCP_BADGE = `${c.gray}[${c.reset}${c.blueBright}discord-mcp${c.reset}${c.gray}]${c.reset}`;
|