@linkdesk/plugin-sdk 0.1.13 → 0.1.15
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/README.md +35 -35
- package/dist/bin.js +28 -1
- package/dist/bin.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pack.d.ts +46 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +140 -0
- package/dist/pack.js.map +1 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +28 -2
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
- package/schemas/icon-theme.schema.json +97 -97
- package/schemas/plugin.schema.json +687 -682
- package/schemas/theme.schema.json +109 -109
|
@@ -1,682 +1,687 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://embeddesk.app/schemas/plugin.schema.json",
|
|
4
|
-
"title": "
|
|
5
|
-
"description": "plugin.json
|
|
6
|
-
"type": "object",
|
|
7
|
-
"required": ["name", "version"],
|
|
8
|
-
"properties": {
|
|
9
|
-
"$schema": {
|
|
10
|
-
"type": "string",
|
|
11
|
-
"description": "JSON Schema
|
|
12
|
-
"$comment": "$schema
|
|
13
|
-
},
|
|
14
|
-
"
|
|
15
|
-
"type": "string",
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
},
|
|
23
|
-
"
|
|
24
|
-
"type": "
|
|
25
|
-
"description": "
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
},
|
|
52
|
-
"
|
|
53
|
-
"type": "string",
|
|
54
|
-
"description": "
|
|
55
|
-
"
|
|
56
|
-
},
|
|
57
|
-
"
|
|
58
|
-
"type": "string",
|
|
59
|
-
"description": "
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
},
|
|
94
|
-
"
|
|
95
|
-
"type": "
|
|
96
|
-
"description": "
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"
|
|
104
|
-
"type": "boolean",
|
|
105
|
-
"description": "
|
|
106
|
-
"default": false
|
|
107
|
-
},
|
|
108
|
-
"
|
|
109
|
-
"type": "
|
|
110
|
-
"description": "
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
"
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
"
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
"
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
"
|
|
180
|
-
"
|
|
181
|
-
"
|
|
182
|
-
},
|
|
183
|
-
"
|
|
184
|
-
"type": "array",
|
|
185
|
-
"description": "
|
|
186
|
-
"items": {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
"
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
"
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
"
|
|
223
|
-
"
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
"
|
|
228
|
-
"
|
|
229
|
-
},
|
|
230
|
-
"
|
|
231
|
-
"type": "
|
|
232
|
-
"description": "
|
|
233
|
-
"$comment": "
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"additionalProperties": { "type": "string" }
|
|
240
|
-
},
|
|
241
|
-
"
|
|
242
|
-
"type": "object",
|
|
243
|
-
"description": "
|
|
244
|
-
"
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
"
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
"
|
|
269
|
-
"
|
|
270
|
-
"
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
"
|
|
275
|
-
"
|
|
276
|
-
"default":
|
|
277
|
-
},
|
|
278
|
-
"
|
|
279
|
-
"type": "boolean",
|
|
280
|
-
"description": "
|
|
281
|
-
"default": false
|
|
282
|
-
},
|
|
283
|
-
"
|
|
284
|
-
"type": "
|
|
285
|
-
"description": "
|
|
286
|
-
"
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
"
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
"
|
|
348
|
-
"
|
|
349
|
-
"
|
|
350
|
-
"
|
|
351
|
-
"
|
|
352
|
-
"
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
"additionalProperties":
|
|
364
|
-
},
|
|
365
|
-
"
|
|
366
|
-
"type": "
|
|
367
|
-
"description": "
|
|
368
|
-
"
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
"
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
"
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
"
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
"
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
"
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
"
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
"
|
|
526
|
-
"default":
|
|
527
|
-
"description": "
|
|
528
|
-
},
|
|
529
|
-
"
|
|
530
|
-
"type": "
|
|
531
|
-
"
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
"
|
|
536
|
-
"description": "
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
"
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
"
|
|
560
|
-
"
|
|
561
|
-
"
|
|
562
|
-
"
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
"
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
"
|
|
579
|
-
"description": "
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
"
|
|
590
|
-
"
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
"
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
"
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
"additionalProperties":
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
"
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
"
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
"
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
"
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
"
|
|
664
|
-
"required": ["
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
"
|
|
673
|
-
"required": ["
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://embeddesk.app/schemas/plugin.schema.json",
|
|
4
|
+
"title": "Plugin metadata",
|
|
5
|
+
"description": "JSON Schema for plugin.json — IDE autocompletion + JSON validation",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["name", "version"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "JSON Schema reference — used for IDE autocompletion",
|
|
12
|
+
"$comment": "$schema is used only for IDE autocompletion; no JSON Schema validation is performed at runtime"
|
|
13
|
+
},
|
|
14
|
+
"pluginId": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$",
|
|
17
|
+
"description": "🔴 Plugin identity — immutable once published (mirrors VS Code's publisher.name). Everything keys off it: install directory {userData}/plugins/<pluginId>/, distribution file name <pluginId>.linkdesk-plugin, marketplace dedup key, uninstall tombstone key, and update reconciliation. Strongly recommended to declare it explicitly: when omitted it falls back to the project directory name, but repository names and local directory names are free-form — rename the directory and the identity changes with it, and none of the five consequences (two install directories side by side / tombstone mismatch / duplicate marketplace entries / silently broken update chain / plugin data appearing lost) reports an error. Character set: letters, digits, `.`, `_`, `-`; the first character must be a letter or a digit."
|
|
18
|
+
},
|
|
19
|
+
"type": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "[Deprecated] Plugin type — no longer required. The loader infers the contribution type from declared fields such as entry/mode/themes/languages/resources. Kept only for backward compatibility. The value is an open string, not a closed enum."
|
|
22
|
+
},
|
|
23
|
+
"core": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"description": "Pure UI safeguard against accidental removal — marks the plugin as important, so the uninstall entry is hidden in the plugin detail UI (newcomers cannot delete it by mistake). Grants no behavioral privilege: disable/uninstall still work through the API/command layer (uninstall writes a `removed` tombstone; boot does not resurrect it). Built-in capabilities such as the settings page and marketplace come from factoryRole slots (replaceable) and are unrelated to this flag. Absent = an ordinary plugin that the UI can freely install and uninstall. Default false.",
|
|
26
|
+
"default": false
|
|
27
|
+
},
|
|
28
|
+
"factoryRole": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"description": "System slot role — declares which system-level feature this plugin fills. settings = settings page (opened with Ctrl+,), marketplace = plugin marketplace. Multiple plugins with the same role may legally coexist (all become slot candidates, one-to-many); the default is the first registered in stable order (core:true grants no privilege and does not claim the default), and a user-switched active candidate is persisted."
|
|
31
|
+
},
|
|
32
|
+
"pluginRole": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"description": "Plugin loading strategy — view = has React UI components, data = pure data (themes/languages/protocols); inferred when omitted. The value is an open string, so third parties may declare new strategy names."
|
|
35
|
+
},
|
|
36
|
+
"appearsIn": {
|
|
37
|
+
"type": "object",
|
|
38
|
+
"description": "Where the plugin's UI appears — declarative. Replaces iconLocation + viewRole + keepSidebarOnFocus.",
|
|
39
|
+
"properties": {
|
|
40
|
+
"iconBar": { "type": "string", "enum": ["top", "bottom"], "description": "Icon Bar position; omitted = no icon shown" },
|
|
41
|
+
"sidePanel": { "type": "boolean", "description": "Has a Sidebar view container. Default false." },
|
|
42
|
+
"tabBar": { "type": "boolean", "description": "Can be opened as a tab. Default false." },
|
|
43
|
+
"statusBar": { "type": "string", "description": "File path of a self-drawn (code) Status Bar component, relative to the plugin root, .tsx, e.g. \"src/components/statusBar.tsx\" — the pool renders it from the declared URL, replacing static statusBar contributions; omit it when you only contribute static entries." }
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"distribution": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"enum": ["builtin", "user"],
|
|
49
|
+
"default": "user",
|
|
50
|
+
"description": "⚠️ Legacy field — after the single-root flattening there is no longer any plugins/builtin vs. plugins/user distinction, so this field maps to no directory and is always normalized to user on install. Whether a plugin ships built-in is declared by `core`, not by this field. Third-party plugins should not set it."
|
|
51
|
+
},
|
|
52
|
+
"name": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "Display name",
|
|
55
|
+
"minLength": 1
|
|
56
|
+
},
|
|
57
|
+
"version": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Semantic version",
|
|
60
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+$"
|
|
61
|
+
},
|
|
62
|
+
"icon": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Icon (split of the three-image model) — plugins placed on the Icon Bar set a Type-1 monochrome silhouette glyph here (the shell Icon Bar reads only this field); for plugins not on the Icon Bar this field is the Type-2 colored identity image, which the tab bar and marketplace reuse as marketIcon ?? icon ?? default colored block. A codicon name, or a path relative to a bundled svg/png asset (inferred from the value when iconSource is omitted)."
|
|
65
|
+
},
|
|
66
|
+
"iconSource": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"description": "Icon source",
|
|
69
|
+
"enum": ["codicon", "svg", "url", "lucide"],
|
|
70
|
+
"default": "codicon"
|
|
71
|
+
},
|
|
72
|
+
"marketIcon": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"description": "Type-2 colored plugin identity image (the earlier \"cover art / scene cover\" meaning is retired — embed a scene cover in the README instead) — the marketplace Sidebar row / detail header and the tab bar view label show the same image. A path relative to a bundled svg asset; omitted → falls back to icon → shared default colored block. Optional: the whole chain falls back automatically for plugins with no images, so this split is invisible to third parties."
|
|
75
|
+
},
|
|
76
|
+
"marketIconSource": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"description": "Identity image source — same enum as iconSource; the value is a path relative to a bundled svg asset, and when source is omitted it is inferred from the path (an explicit svg treats the path as a bare URL, which breaks already-installed plugins).",
|
|
79
|
+
"enum": ["codicon", "svg", "url", "lucide"],
|
|
80
|
+
"default": "codicon"
|
|
81
|
+
},
|
|
82
|
+
"description": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"description": "One-line description shown on the plugin detail page. Multi-line supported."
|
|
85
|
+
},
|
|
86
|
+
"author": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"description": "Author name"
|
|
89
|
+
},
|
|
90
|
+
"entry": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"description": "Entry file path, relative to the plugin directory. Required for view/card/protocol."
|
|
93
|
+
},
|
|
94
|
+
"sidebar": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"description": "Sidebar component path; only meaningful for the view type.",
|
|
97
|
+
"$comment": "Discovered automatically by Vite glob; no plugin declaration needed"
|
|
98
|
+
},
|
|
99
|
+
"tabBehavior": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"description": "Tab behavior declaration — the core reads this field to decide dedup / fallback / close confirmation.",
|
|
102
|
+
"properties": {
|
|
103
|
+
"isFallback": {
|
|
104
|
+
"type": "boolean",
|
|
105
|
+
"description": "Automatically create this tab when no tab is open, and make it non-closable.",
|
|
106
|
+
"default": false
|
|
107
|
+
},
|
|
108
|
+
"singleton": {
|
|
109
|
+
"type": "boolean",
|
|
110
|
+
"description": "Only one instance allowed globally.",
|
|
111
|
+
"default": false
|
|
112
|
+
},
|
|
113
|
+
"confirmOnClose": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "Show a confirmation dialog before closing; the value is the prompt text."
|
|
116
|
+
},
|
|
117
|
+
"invokeBeforeClose": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"description": "Command invoked before closing (after the confirmOnClose confirmation, before the tab closes). For example the terminal declares \"close_port\"."
|
|
120
|
+
},
|
|
121
|
+
"identityField": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"description": "The single field in CreateTabOptions used to determine tab identity. Omitted = multiple instances allowed, no dedup. For example workspace declares \"workspaceName\" — only one tab per workspace name."
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"additionalProperties": false
|
|
127
|
+
},
|
|
128
|
+
"statusBar": {
|
|
129
|
+
"type": "array",
|
|
130
|
+
"description": "Status Bar contribution entries",
|
|
131
|
+
"items": {
|
|
132
|
+
"type": "object",
|
|
133
|
+
"required": ["id"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"id": { "type": "string", "description": "Unique identifier" },
|
|
136
|
+
"icon": { "type": "string", "description": "codicon name or SVG path" },
|
|
137
|
+
"label": { "type": "string", "description": "Display text" },
|
|
138
|
+
"align": { "type": "string", "enum": ["left", "right"], "default": "left" },
|
|
139
|
+
"onClick": { "type": "string", "description": "Click behavior — command name" },
|
|
140
|
+
"configurable": { "type": "boolean", "description": "Declaring true → the shell auto-registers a configuration entry and injects the visible prop. The plugin author writes one line of JSON, zero code.", "default": false }
|
|
141
|
+
},
|
|
142
|
+
"additionalProperties": false
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"file": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"description": "Single-file entry — for the theme/language types. Use either this or themes/languages."
|
|
148
|
+
},
|
|
149
|
+
"themes": {
|
|
150
|
+
"type": "array",
|
|
151
|
+
"description": "Array of multiple themes; only for the theme type.",
|
|
152
|
+
"items": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"required": ["id", "name", "file"],
|
|
155
|
+
"properties": {
|
|
156
|
+
"id": { "type": "string" },
|
|
157
|
+
"name": { "type": "string" },
|
|
158
|
+
"file": { "type": "string" }
|
|
159
|
+
},
|
|
160
|
+
"additionalProperties": false
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"languages": {
|
|
164
|
+
"type": "array",
|
|
165
|
+
"description": "Array of multiple languages; only for the language type.",
|
|
166
|
+
"items": {
|
|
167
|
+
"type": "object",
|
|
168
|
+
"required": ["code", "name", "file"],
|
|
169
|
+
"properties": {
|
|
170
|
+
"code": { "type": "string" },
|
|
171
|
+
"name": { "type": "string" },
|
|
172
|
+
"file": { "type": "string" }
|
|
173
|
+
},
|
|
174
|
+
"additionalProperties": false
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"mode": {
|
|
178
|
+
"type": "string",
|
|
179
|
+
"description": "Protocol mode. text = plain-text protocol; binary = WASM binary protocol (not available yet).",
|
|
180
|
+
"enum": ["text", "binary"],
|
|
181
|
+
"default": "text"
|
|
182
|
+
},
|
|
183
|
+
"resources": {
|
|
184
|
+
"type": "array",
|
|
185
|
+
"description": "Resource file list; only for the resource type.",
|
|
186
|
+
"items": { "type": "string" }
|
|
187
|
+
},
|
|
188
|
+
"recommends": {
|
|
189
|
+
"type": "array",
|
|
190
|
+
"description": "Plugins recommended to install alongside.",
|
|
191
|
+
"items": {
|
|
192
|
+
"type": "object",
|
|
193
|
+
"required": ["plugin", "reason"],
|
|
194
|
+
"properties": {
|
|
195
|
+
"plugin": { "type": "string" },
|
|
196
|
+
"reason": { "type": "string" }
|
|
197
|
+
},
|
|
198
|
+
"additionalProperties": false
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"suggests": {
|
|
202
|
+
"type": "array",
|
|
203
|
+
"description": "Optional related plugins.",
|
|
204
|
+
"items": {
|
|
205
|
+
"type": "object",
|
|
206
|
+
"required": ["plugin", "reason"],
|
|
207
|
+
"properties": {
|
|
208
|
+
"plugin": { "type": "string" },
|
|
209
|
+
"reason": { "type": "string" }
|
|
210
|
+
},
|
|
211
|
+
"additionalProperties": false
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"requires": {
|
|
215
|
+
"type": "array",
|
|
216
|
+
"description": "Plugin-level activation order dependency — declared by pluginId; dependencies load before this plugin. No version constraint. A missing dependency suspends the plugin (PENDING), which then loads automatically once the dependency is ready.",
|
|
217
|
+
"items": { "type": "string" },
|
|
218
|
+
"uniqueItems": true
|
|
219
|
+
},
|
|
220
|
+
"screenshots": {
|
|
221
|
+
"type": "array",
|
|
222
|
+
"description": "Array of screenshot URLs.",
|
|
223
|
+
"$comment": "Reserved for future PluginDetailView enhancements",
|
|
224
|
+
"items": { "type": "string" }
|
|
225
|
+
},
|
|
226
|
+
"minAppVersion": {
|
|
227
|
+
"type": "string",
|
|
228
|
+
"description": "Minimum required app version."
|
|
229
|
+
},
|
|
230
|
+
"docs": {
|
|
231
|
+
"type": "string",
|
|
232
|
+
"description": "Path to accompanying documentation (used with resource plugins).",
|
|
233
|
+
"$comment": "Documentation link"
|
|
234
|
+
},
|
|
235
|
+
"cardDocMap": {
|
|
236
|
+
"type": "object",
|
|
237
|
+
"description": "Card ID → documentation anchor mapping",
|
|
238
|
+
"$comment": "Card documentation mapping",
|
|
239
|
+
"additionalProperties": { "type": "string" }
|
|
240
|
+
},
|
|
241
|
+
"i18n": {
|
|
242
|
+
"type": "object",
|
|
243
|
+
"description": "@deprecated Use contributes.i18n instead — translation file declarations moved under contributes. Kept only for backward compatibility.",
|
|
244
|
+
"additionalProperties": { "type": "string" }
|
|
245
|
+
},
|
|
246
|
+
"cssVars": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"description": "Plugin-defined CSS variables",
|
|
249
|
+
"$comment": "Plugins inject CSS variables into :root",
|
|
250
|
+
"additionalProperties": {
|
|
251
|
+
"type": "object",
|
|
252
|
+
"properties": {
|
|
253
|
+
"dark": { "type": "string" },
|
|
254
|
+
"light": { "type": "string" }
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"permissions": {
|
|
259
|
+
"type": "array",
|
|
260
|
+
"description": "Permission declaration",
|
|
261
|
+
"$comment": "serial/filesystem/network are the first whitelist values. The value is an open string, so third parties may declare new permission names (interpreted by the main process).",
|
|
262
|
+
"items": {
|
|
263
|
+
"type": "string"
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
"iconLocation": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"description": "Icon position in the Icon Bar. top (default, upper draggable area) or bottom (fixed bottom area).",
|
|
269
|
+
"enum": ["top", "bottom"],
|
|
270
|
+
"default": "top"
|
|
271
|
+
},
|
|
272
|
+
"viewRole": {
|
|
273
|
+
"type": "string",
|
|
274
|
+
"description": "Interaction role of the view in the shell. sidebarPrimary = Sidebar first (clicking toggles the Sidebar; tabs are opened from within the Sidebar; default), tabOnly = tab-only view (opens a tab directly). tabPrimary was removed — all plugins use sidebarPrimary.",
|
|
275
|
+
"enum": ["sidebarPrimary", "tabOnly"],
|
|
276
|
+
"default": "sidebarPrimary"
|
|
277
|
+
},
|
|
278
|
+
"shellRendered": {
|
|
279
|
+
"type": "boolean",
|
|
280
|
+
"description": "The shell renders this view itself (bypassing plugin routing). Declared only by shell-level views such as the welcome page and plugin detail page.",
|
|
281
|
+
"default": false
|
|
282
|
+
},
|
|
283
|
+
"keepSidebarOnFocus": {
|
|
284
|
+
"type": "boolean",
|
|
285
|
+
"description": "Keep the current Sidebar when this view is focused — for example the Sidebar stays unchanged while browsing the plugin detail page.",
|
|
286
|
+
"default": false
|
|
287
|
+
},
|
|
288
|
+
"contributes": {
|
|
289
|
+
"type": "object",
|
|
290
|
+
"description": "Contribution point declarations — mirrors VS Code package.json contributes. A core mechanism.",
|
|
291
|
+
"properties": {
|
|
292
|
+
"commands": {
|
|
293
|
+
"type": "array",
|
|
294
|
+
"description": "Registered commands — the source consumed by the Command Palette, context menus, and keybindings.",
|
|
295
|
+
"items": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"required": ["id", "title"],
|
|
298
|
+
"properties": {
|
|
299
|
+
"id": { "type": "string", "description": "Command ID — e.g. terminal.clear" },
|
|
300
|
+
"title": { "type": "string", "description": "Display name" },
|
|
301
|
+
"category": { "type": "string", "description": "Command palette group" },
|
|
302
|
+
"when": { "type": "string", "description": "context key when condition — e.g. activeEditor == 'terminal'" }
|
|
303
|
+
},
|
|
304
|
+
"additionalProperties": false
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
"menus": {
|
|
308
|
+
"type": "object",
|
|
309
|
+
"description": "Menu item declarations — grouped by MenuId. The built-in shell registration points are listed in the MenuRegistry MENU_SLOTS constant; MenuId is an open string, so third parties may declare any new registration point.",
|
|
310
|
+
"additionalProperties": {
|
|
311
|
+
"type": "array",
|
|
312
|
+
"items": {
|
|
313
|
+
"oneOf": [
|
|
314
|
+
{ "type": "string", "description": "Command ID (shorthand)" },
|
|
315
|
+
{ "$ref": "#/$defs/menuItem" }
|
|
316
|
+
]
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"keybindings": {
|
|
321
|
+
"type": "array",
|
|
322
|
+
"description": "Keybinding.",
|
|
323
|
+
"items": {
|
|
324
|
+
"type": "object",
|
|
325
|
+
"required": ["command", "key"],
|
|
326
|
+
"properties": {
|
|
327
|
+
"command": { "type": "string" },
|
|
328
|
+
"key": { "type": "string", "description": "e.g. ctrl+k" },
|
|
329
|
+
"when": { "type": "string", "description": "context key when condition" }
|
|
330
|
+
},
|
|
331
|
+
"additionalProperties": false
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
"configuration": {
|
|
335
|
+
"type": "object",
|
|
336
|
+
"description": "Configuration declarations — rendered automatically by the Settings Editor.",
|
|
337
|
+
"required": ["title", "properties"],
|
|
338
|
+
"properties": {
|
|
339
|
+
"title": { "type": "string", "description": "Settings group name" },
|
|
340
|
+
"properties": {
|
|
341
|
+
"type": "object",
|
|
342
|
+
"description": "Configuration mapping — key → { type, default, enum?, description }",
|
|
343
|
+
"additionalProperties": {
|
|
344
|
+
"type": "object",
|
|
345
|
+
"required": ["type", "default", "description"],
|
|
346
|
+
"properties": {
|
|
347
|
+
"type": { "type": "string", "enum": ["string", "number", "boolean", "object", "array"] },
|
|
348
|
+
"default": {},
|
|
349
|
+
"enum": { "type": "array" },
|
|
350
|
+
"enumDescriptions": { "type": "object", "description": "enum value → display name mapping" },
|
|
351
|
+
"description": { "type": "string" },
|
|
352
|
+
"uiHint": { "type": "string", "description": "Settings editor rendering hint. SettingsView picks the control from the hint. An unknown hint falls back to the default rendering for its type — no error is thrown. The value is an open string, so third parties may declare new hint names." },
|
|
353
|
+
"monoOnly": { "type": "boolean", "description": "Monospace only — meaningful only with uiHint \"fontFamily\". true/omitted = list monospace families only (editor fonts); false = all families (UI fonts)." },
|
|
354
|
+
"minimum": { "type": "number", "description": "Numeric lower bound — applies when type is number (range of the slider/numeric control)" },
|
|
355
|
+
"maximum": { "type": "number", "description": "Numeric upper bound — applies when type is number (range of the slider/numeric control)" },
|
|
356
|
+
"step": { "type": "number", "description": "Slider step — meaningful only with uiHint \"slider\". Defaults are derived by SettingsView from the range (0.01 for floating-point ranges)." },
|
|
357
|
+
"group": { "type": "string", "description": "Second-level heading within a group — keys sharing a group are rendered under a subheading on the settings page; without a group they stay flat (zero intrusion for third parties)" }
|
|
358
|
+
},
|
|
359
|
+
"additionalProperties": false
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
"additionalProperties": false
|
|
364
|
+
},
|
|
365
|
+
"configurationDefaults": {
|
|
366
|
+
"type": "object",
|
|
367
|
+
"description": "Weak defaults — suggested values this plugin gives for other configuration keys; values set by the user take precedence.",
|
|
368
|
+
"additionalProperties": {}
|
|
369
|
+
},
|
|
370
|
+
"themes": {
|
|
371
|
+
"type": "array",
|
|
372
|
+
"description": "Theme declarations — mirrors VS Code contributes.themes. Plugins contribute themes that users can switch in the theme browser / appearance settings.",
|
|
373
|
+
"items": {
|
|
374
|
+
"type": "object",
|
|
375
|
+
"required": ["id", "label", "uiTheme", "path"],
|
|
376
|
+
"properties": {
|
|
377
|
+
"id": { "type": "string", "description": "Theme ID — e.g. my-theme-dark" },
|
|
378
|
+
"label": { "type": "string", "description": "Display name — e.g. My Theme Dark" },
|
|
379
|
+
"uiTheme": { "type": "string", "enum": ["dark", "light", "highContrast"], "description": "Base UI theme — dark / light / high contrast" },
|
|
380
|
+
"path": { "type": "string", "description": "Path to the theme definition JSON file" }
|
|
381
|
+
},
|
|
382
|
+
"additionalProperties": false
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"iconThemes": {
|
|
386
|
+
"type": "array",
|
|
387
|
+
"description": "Product icon themes — mirrors VS Code productIconThemes. Plugins declare icon sets that users can switch.",
|
|
388
|
+
"items": {
|
|
389
|
+
"type": "object",
|
|
390
|
+
"required": ["id", "label", "path"],
|
|
391
|
+
"properties": {
|
|
392
|
+
"id": { "type": "string", "description": "Icon theme ID — e.g. codicon" },
|
|
393
|
+
"label": { "type": "string", "description": "Display name — e.g. Codicon" },
|
|
394
|
+
"path": { "type": "string", "description": "Path to the icon definition JSON file" }
|
|
395
|
+
},
|
|
396
|
+
"additionalProperties": false
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
"icons": {
|
|
400
|
+
"type": "object",
|
|
401
|
+
"description": "Shared icons — a plugin contributes icons that other plugins reference via iconSource:shared. Mirrors the VS Code icon extension point.",
|
|
402
|
+
"additionalProperties": {
|
|
403
|
+
"type": "object",
|
|
404
|
+
"required": ["description", "default"],
|
|
405
|
+
"properties": {
|
|
406
|
+
"description": { "type": "string", "description": "Icon description" },
|
|
407
|
+
"default": {
|
|
408
|
+
"type": "object",
|
|
409
|
+
"properties": {
|
|
410
|
+
"fontPath": { "type": "string", "description": "Font file path" },
|
|
411
|
+
"fontCharacter": { "type": "string", "description": "Font character code — e.g. \\e001" }
|
|
412
|
+
},
|
|
413
|
+
"additionalProperties": false
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"additionalProperties": false
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
"langDefs": {
|
|
420
|
+
"type": "array",
|
|
421
|
+
"description": "Language definitions — mirrors VS Code contributes.languages. Declares a new language's ID/extensions/syntax highlighting/LSP support.",
|
|
422
|
+
"items": {
|
|
423
|
+
"type": "object",
|
|
424
|
+
"required": ["id", "extensions"],
|
|
425
|
+
"properties": {
|
|
426
|
+
"id": { "type": "string", "description": "Language ID — e.g. cpp / python / rust" },
|
|
427
|
+
"extensions": { "type": "array", "items": { "type": "string" }, "description": "Extension list — e.g. ['.cpp', '.cxx', '.h']" },
|
|
428
|
+
"aliases": { "type": "array", "items": { "type": "string" }, "description": "Aliases — e.g. ['C++', 'C']" },
|
|
429
|
+
"monarch": {
|
|
430
|
+
"type": "object",
|
|
431
|
+
"description": "Optional — Monarch tokenizer definition (Monaco's built-in syntax highlighting)",
|
|
432
|
+
"properties": {
|
|
433
|
+
"tokenizer": { "type": "object" }
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
"lsp": {
|
|
437
|
+
"type": "object",
|
|
438
|
+
"description": "Optional — LSP language server configuration",
|
|
439
|
+
"properties": {
|
|
440
|
+
"command": { "type": "string", "description": "Launch command — an interpreter or executable name (an interpreter such as node; a PATH binary such as clangd; or an absolute path). The python plugin uses command='node' plus args carrying the script path." },
|
|
441
|
+
"args": { "type": "array", "items": { "type": "string" }, "description": "Launch arguments. Relative-path arguments resolve against the plugin root (made absolute once at registration) — e.g. 'node_modules/pyright/dist/pyright-langserver.js' → <plugin root>/node_modules/pyright/dist/pyright-langserver.js; flags such as '--stdio' are passed through verbatim. LSP binaries ship with the plugin: the SDK packaging bundles the referenced node_modules packages into the .linkdesk-plugin file (the shell no longer ships LSPs)." }
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
"additionalProperties": false
|
|
446
|
+
}
|
|
447
|
+
},
|
|
448
|
+
"fileAssociations": {
|
|
449
|
+
"type": "array",
|
|
450
|
+
"description": "File associations — file extension → plugin routing (consumed by the main-process plugin-manifest-loader). Declare only the extension plus an optional open command; this plugin's own pluginId comes from the top-level `pluginId` field (see the top-level pluginId description for the directory-name fallback).",
|
|
451
|
+
"items": {
|
|
452
|
+
"type": "object",
|
|
453
|
+
"required": ["extension"],
|
|
454
|
+
"properties": {
|
|
455
|
+
"extension": { "type": "string", "description": "File extension — without the dot, e.g. dxf / stl / step" },
|
|
456
|
+
"command": { "type": "string", "description": "Optional — command ID to run when opening a file with this extension" },
|
|
457
|
+
"displayName": { "type": "string", "description": "Optional — display name in the 'Open with…' picker" }
|
|
458
|
+
},
|
|
459
|
+
"additionalProperties": false
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
"languages": {
|
|
463
|
+
"type": "array",
|
|
464
|
+
"description": "Language packs — mirrors the VS Code language extension point. A collection language pack declares multiple entries in one plugin.json.",
|
|
465
|
+
"items": {
|
|
466
|
+
"type": "object",
|
|
467
|
+
"required": ["id", "label", "path"],
|
|
468
|
+
"properties": {
|
|
469
|
+
"id": { "type": "string", "description": "Language code — e.g. zh / en / ja" },
|
|
470
|
+
"label": { "type": "string", "description": "Display name — e.g. English / Japanese / Chinese" },
|
|
471
|
+
"path": { "type": "string", "description": "Path to the i18n JSON translation file" }
|
|
472
|
+
},
|
|
473
|
+
"additionalProperties": false
|
|
474
|
+
}
|
|
475
|
+
},
|
|
476
|
+
"titleBar": {
|
|
477
|
+
"type": "object",
|
|
478
|
+
"description": "Title Bar button declarations — mirrors VS Code titleBar. Declares buttons on the left/right of the Title Bar: an icon button (icon) or a text-only button (label); set exactly one.",
|
|
479
|
+
"properties": {
|
|
480
|
+
"left": {
|
|
481
|
+
"type": "array",
|
|
482
|
+
"description": "Left Title Bar buttons",
|
|
483
|
+
"items": {
|
|
484
|
+
"type": "object",
|
|
485
|
+
"required": ["command"],
|
|
486
|
+
"properties": {
|
|
487
|
+
"command": { "type": "string", "description": "Command ID to run on click" },
|
|
488
|
+
"icon": { "type": "string", "description": "codicon name (e.g. codicon-settings) or image path" },
|
|
489
|
+
"label": { "type": "string", "description": "Button text — when set, the icon is not rendered. '$keyName' takes the value of that context key as the text (e.g. $updateButtonLabel); otherwise the value is treated as an i18n key (in this repository an i18n key is the original Chinese string)." },
|
|
490
|
+
"when": { "type": "string", "description": "context key when condition — the button is hidden while unmet" }
|
|
491
|
+
},
|
|
492
|
+
"additionalProperties": false
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
"right": {
|
|
496
|
+
"type": "array",
|
|
497
|
+
"description": "Right Title Bar buttons",
|
|
498
|
+
"items": {
|
|
499
|
+
"type": "object",
|
|
500
|
+
"required": ["command"],
|
|
501
|
+
"properties": {
|
|
502
|
+
"command": { "type": "string", "description": "Command ID to run on click" },
|
|
503
|
+
"icon": { "type": "string", "description": "codicon name (e.g. codicon-settings) or image path" },
|
|
504
|
+
"label": { "type": "string", "description": "Button text — when set, the icon is not rendered. '$keyName' takes the value of that context key as the text (e.g. $updateButtonLabel); otherwise the value is treated as an i18n key (in this repository an i18n key is the original Chinese string)." },
|
|
505
|
+
"when": { "type": "string", "description": "context key when condition — the button is hidden while unmet" }
|
|
506
|
+
},
|
|
507
|
+
"additionalProperties": false
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
"additionalProperties": false
|
|
512
|
+
},
|
|
513
|
+
"viewsContainers": {
|
|
514
|
+
"type": "object",
|
|
515
|
+
"description": "Declares Sidebar containers — clicking this plugin's icon switches to the container. Mirrors VS Code viewsContainers.",
|
|
516
|
+
"patternProperties": {
|
|
517
|
+
"^[a-z][a-z0-9-]*$": {
|
|
518
|
+
"type": "object",
|
|
519
|
+
"required": ["title"],
|
|
520
|
+
"properties": {
|
|
521
|
+
"title": { "type": "string", "description": "Container title — shown in the Sidebar header" },
|
|
522
|
+
"icon": { "type": "string", "description": "Container icon — overrides the plugin's own icon" },
|
|
523
|
+
"location": {
|
|
524
|
+
"type": "string",
|
|
525
|
+
"enum": ["sidebar", "panel", "auxiliarybar", "main"],
|
|
526
|
+
"default": "sidebar",
|
|
527
|
+
"description": "Container location — sidebar = Sidebar, panel = Bottom Panel, auxiliarybar = auxiliary sidebar (⚠ not wired in the shell yet: auxiliarybar containers/views are not rendered), main = Main Area tab render surface (contributed by the active factoryRole plugin via views.main[] and consumed by the shell's ShellViewRenderer when it resolves the plugin-detail tab; third-party plugins that are not marketplace-like should use sidebar/panel)"
|
|
528
|
+
},
|
|
529
|
+
"hideIfEmpty": {
|
|
530
|
+
"type": "boolean",
|
|
531
|
+
"default": false,
|
|
532
|
+
"description": "Hide the container automatically when it has no active views"
|
|
533
|
+
},
|
|
534
|
+
"order": {
|
|
535
|
+
"type": "number",
|
|
536
|
+
"description": "Sort weight within the same location. Lower values come first"
|
|
537
|
+
},
|
|
538
|
+
"mergeHeaderWhenSingle": {
|
|
539
|
+
"type": "boolean",
|
|
540
|
+
"default": false,
|
|
541
|
+
"description": "Hide the view header when the container holds a single view — the title merges into the container header. Mirrors VS Code mergeViewWithContainerWhenSingleView"
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"additionalProperties": false
|
|
545
|
+
}
|
|
546
|
+
},
|
|
547
|
+
"additionalProperties": false
|
|
548
|
+
},
|
|
549
|
+
"views": {
|
|
550
|
+
"type": "object",
|
|
551
|
+
"description": "Register views into containers — key = container ID. Mirrors VS Code views.",
|
|
552
|
+
"patternProperties": {
|
|
553
|
+
"^[a-z][a-z0-9-]*$": {
|
|
554
|
+
"type": "array",
|
|
555
|
+
"items": {
|
|
556
|
+
"type": "object",
|
|
557
|
+
"required": ["id", "render"],
|
|
558
|
+
"properties": {
|
|
559
|
+
"id": { "type": "string", "description": "Unique view ID — e.g. folders / sessions / settings" },
|
|
560
|
+
"title": { "type": "string", "description": "Display title — the header text of the SidebarSection. An empty string hides the collapsible header" },
|
|
561
|
+
"render": { "type": "string", "description": "Module path of the view component — relative to the plugin root" },
|
|
562
|
+
"when": { "type": "string", "description": "Context key when condition" },
|
|
563
|
+
"order": { "type": "number", "description": "Sort weight within the container. Lower values on top" },
|
|
564
|
+
"role": { "type": "string", "enum": ["toolbar", "section"], "default": "section", "description": "Container role — toolbar sticks to the top and is not overridden; section has a collapsible header and is replaced at the same level" },
|
|
565
|
+
"collapsed": { "type": "boolean", "default": false, "description": "Initial collapsed state" },
|
|
566
|
+
"canToggleVisibility": { "type": "boolean", "default": true, "description": "Users can toggle visibility from the Views submenu" },
|
|
567
|
+
"canMoveView": { "type": "boolean", "default": true, "description": "Users can move this view to another container" }, "minHeight": {
|
|
568
|
+
"type": "number",
|
|
569
|
+
"description": "Declared minimum view height — the Sidebar pane PaneSash effectiveMinHeight (mirrors the VS Code view size)"
|
|
570
|
+
},
|
|
571
|
+
|
|
572
|
+
"hideByDefault": { "type": "boolean", "default": false, "description": "Hidden by default — users must enable it manually from the Views menu" },
|
|
573
|
+
"singleViewPaneContainerTitle": { "type": "string", "description": "Replaces the container title when there is a single view and the container has mergeHeaderWhenSingle" },
|
|
574
|
+
"titleDescription": { "type": "string", "description": "Secondary text next to the title — e.g. (5 files)" },
|
|
575
|
+
"showActions": {
|
|
576
|
+
"type": "string",
|
|
577
|
+
"enum": ["always", "whenExpanded", "default"],
|
|
578
|
+
"default": "default",
|
|
579
|
+
"description": "When actions are shown — always, whenExpanded, or default (on hover)"
|
|
580
|
+
},
|
|
581
|
+
"titleTooltip": { "type": "string", "description": "Title hover tooltip — shows the full text when the title is truncated" },
|
|
582
|
+
"titleActions": {
|
|
583
|
+
"type": "array",
|
|
584
|
+
"description": "View action area declaration — the widget list on the right of the Panel tab bar / Sidebar header, carried along with the view when it moves. Three forms: icon button, dropdown menu, and split (primary button + dropdown, like the VS Code terminal's [+] New and [▾] profile list). An action is command + args; label/title are i18n keys (the original Chinese strings).",
|
|
585
|
+
"items": {
|
|
586
|
+
"type": "object",
|
|
587
|
+
"required": ["type", "id"],
|
|
588
|
+
"properties": {
|
|
589
|
+
"type": { "type": "string", "enum": ["icon", "dropdown", "split"], "description": "Widget form" },
|
|
590
|
+
"id": { "type": "string", "description": "Unique widget ID — React key / dropdown open-state anchor" },
|
|
591
|
+
"command": { "type": "string", "description": "Command ID to run on click (split = default action of the primary button; required for icon)" },
|
|
592
|
+
"icon": { "type": "string", "description": "codicon class name (e.g. codicon-add) — the icon/split primary button icon" },
|
|
593
|
+
"title": { "type": "string", "description": "tooltip / aria-label — an i18n key (used as a text button when a split has no icon)" },
|
|
594
|
+
"args": { "description": "Command arguments — passed through as the single positional argument of executeCommand(command, args) (JSON-serializable)" },
|
|
595
|
+
"items": {
|
|
596
|
+
"type": "array",
|
|
597
|
+
"description": "dropdown / split menu entries",
|
|
598
|
+
"items": {
|
|
599
|
+
"type": "object",
|
|
600
|
+
"required": ["label", "command"],
|
|
601
|
+
"properties": {
|
|
602
|
+
"label": { "type": "string", "description": "Display text — an i18n key (the original Chinese string)" },
|
|
603
|
+
"command": { "type": "string", "description": "Command ID to run on click" },
|
|
604
|
+
"args": { "description": "Command arguments — passed through as a single positional argument" }
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
},
|
|
612
|
+
"additionalProperties": false
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
"additionalProperties": false
|
|
617
|
+
},
|
|
618
|
+
"floatingPanel": {
|
|
619
|
+
"type": "object",
|
|
620
|
+
"description": "Floating Panel declaration — declares that a view in contributes.views can be shown in a Floating Panel inside the shell. viewId must reference an already registered view: the declaration is resolved into pluginId/renderPath/title. Without it there is no 'Open in Floating Panel' context menu entry. The first declarer is settings (Ctrl+, opens the panel).",
|
|
621
|
+
"required": ["viewId"],
|
|
622
|
+
"properties": {
|
|
623
|
+
"viewId": { "type": "string", "description": "View ID — a view registered in contributes.views" }
|
|
624
|
+
},
|
|
625
|
+
"additionalProperties": false
|
|
626
|
+
},
|
|
627
|
+
"i18n": {
|
|
628
|
+
"type": "object",
|
|
629
|
+
"description": "Plugin-bundled translations — key = language code, value = JSON file path relative to the plugin root, e.g. { \"en\": \"i18n/en.json\" }. No zh.json is needed — Chinese keys are the built-in fallback.",
|
|
630
|
+
"additionalProperties": { "type": "string" }
|
|
631
|
+
}
|
|
632
|
+
},
|
|
633
|
+
"additionalProperties": false
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
"$defs": {
|
|
637
|
+
"menuItem": {
|
|
638
|
+
"type": "object",
|
|
639
|
+
"required": ["command"],
|
|
640
|
+
"description": "Menu item — aligned with the runtime ManifestMenuItem (MenuRegistry); label/order/children are recursively self-referencing. children recurses to any depth and maps one-to-one onto the runtime normalization.",
|
|
641
|
+
"properties": {
|
|
642
|
+
"command": { "type": "string", "description": "Command ID (may be empty with children — a parent menu item runs no command and expands a submenu)" },
|
|
643
|
+
"label": { "type": "string", "description": "Display label — overrides the command title (getCommand(id).title) when present; required for a parent menu item (no command)" },
|
|
644
|
+
"group": { "type": "string", "description": "Group — navigation/edit/terminal/delete/split" },
|
|
645
|
+
"when": { "type": "string", "description": "context key when condition" },
|
|
646
|
+
"order": { "type": "number", "description": "Sort weight — lower values come first within the same group" },
|
|
647
|
+
"children": {
|
|
648
|
+
"type": "array",
|
|
649
|
+
"description": "Nested submenus — recurses to any depth (mirrors the VS Code SubmenuAction); command may be empty when children is present",
|
|
650
|
+
"items": { "$ref": "#/$defs/menuItem" }
|
|
651
|
+
}
|
|
652
|
+
},
|
|
653
|
+
"additionalProperties": false
|
|
654
|
+
}
|
|
655
|
+
},
|
|
656
|
+
"allOf": [
|
|
657
|
+
{
|
|
658
|
+
"$comment": "entry condition (deprecated type family) — the if clause must include required:[\"type\"], otherwise it is vacuously true for data plugins such as theme/language that have no type (properties only validate properties that are present), which would wrongly require entry. entry is required only when type is present and matches the const.",
|
|
659
|
+
"if": {
|
|
660
|
+
"required": ["type"],
|
|
661
|
+
"properties": { "type": { "const": "view" } }
|
|
662
|
+
},
|
|
663
|
+
"then": {
|
|
664
|
+
"required": ["entry"]
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"if": {
|
|
669
|
+
"required": ["type"],
|
|
670
|
+
"properties": { "type": { "const": "card" } }
|
|
671
|
+
},
|
|
672
|
+
"then": {
|
|
673
|
+
"required": ["entry"]
|
|
674
|
+
}
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"if": {
|
|
678
|
+
"required": ["type"],
|
|
679
|
+
"properties": { "type": { "const": "protocol" } }
|
|
680
|
+
},
|
|
681
|
+
"then": {
|
|
682
|
+
"required": ["entry"]
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
],
|
|
686
|
+
"additionalProperties": true
|
|
687
|
+
}
|