claudecode-linter 2.1.138 → 2.1.139

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.
@@ -0,0 +1,1319 @@
1
+ {
2
+ "extractedFromClaudeCodeVersion": "2.1.138",
3
+ "extractedAt": "2026-05-11T08:02:42.909Z",
4
+ "schema": {
5
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
6
+ "title": "Claude Code plugin.json",
7
+ "type": "object",
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "description": "JSON Schema reference for editor autocomplete/validation; ignored at load time"
12
+ },
13
+ "name": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "description": "Unique identifier for the plugin, used for namespacing (prefer kebab-case)"
17
+ },
18
+ "version": {
19
+ "type": "string",
20
+ "description": "Semantic version (e.g., 1.2.3) following semver.org specification"
21
+ },
22
+ "description": {
23
+ "type": "string",
24
+ "description": "Brief, user-facing explanation of what the plugin provides"
25
+ },
26
+ "author": {
27
+ "type": "object",
28
+ "properties": {
29
+ "name": {
30
+ "type": "string",
31
+ "minLength": 1,
32
+ "description": "Display name of the plugin author or organization"
33
+ },
34
+ "email": {
35
+ "type": "string",
36
+ "description": "Contact email for support or feedback"
37
+ },
38
+ "url": {
39
+ "type": "string",
40
+ "description": "Website, GitHub profile, or organization URL"
41
+ }
42
+ },
43
+ "required": [
44
+ "name"
45
+ ],
46
+ "description": "Information about the plugin creator or maintainer"
47
+ },
48
+ "homepage": {
49
+ "type": "string",
50
+ "format": "uri",
51
+ "description": "Plugin homepage or documentation URL"
52
+ },
53
+ "repository": {
54
+ "type": "string",
55
+ "description": "Source code repository URL"
56
+ },
57
+ "license": {
58
+ "type": "string",
59
+ "description": "SPDX license identifier (e.g., MIT, Apache-2.0)"
60
+ },
61
+ "keywords": {
62
+ "type": "array",
63
+ "items": {
64
+ "type": "string"
65
+ },
66
+ "description": "Tags for plugin discovery and categorization"
67
+ },
68
+ "dependencies": {
69
+ "type": "array",
70
+ "items": {
71
+ "anyOf": [
72
+ {
73
+ "type": "string"
74
+ },
75
+ {
76
+ "type": "object",
77
+ "properties": {
78
+ "name": {
79
+ "type": "string",
80
+ "minLength": 1,
81
+ "pattern": "^[A-Za-z0-9][-A-Za-z0-9._]*$"
82
+ },
83
+ "marketplace": {
84
+ "type": "string",
85
+ "minLength": 1,
86
+ "pattern": "^[A-Za-z0-9][-A-Za-z0-9._]*$"
87
+ }
88
+ },
89
+ "required": [
90
+ "name"
91
+ ]
92
+ }
93
+ ]
94
+ },
95
+ "description": "`Plugins that must be enabled for this plugin to function. Bare names (no \"@marketplace\") are resolved against the declaring plugin's own marketplace.`"
96
+ },
97
+ "hooks": {
98
+ "anyOf": [
99
+ {
100
+ "type": "string",
101
+ "description": "Path to file with additional hooks (in addition to those in hooks/hooks.json, if it exists), relative to the plugin root"
102
+ },
103
+ {
104
+ "description": "Additional hooks (in addition to those in hooks/hooks.json, if it exists)"
105
+ },
106
+ {
107
+ "type": "array",
108
+ "items": {
109
+ "anyOf": [
110
+ {
111
+ "type": "string",
112
+ "description": "Path to file with additional hooks (in addition to those in hooks/hooks.json, if it exists), relative to the plugin root"
113
+ },
114
+ {
115
+ "description": "Additional hooks (in addition to those in hooks/hooks.json, if it exists)"
116
+ }
117
+ ]
118
+ }
119
+ }
120
+ ]
121
+ },
122
+ "commands": {
123
+ "anyOf": [
124
+ {
125
+ "anyOf": [
126
+ {
127
+ "type": "string"
128
+ },
129
+ {
130
+ "type": "string"
131
+ }
132
+ ],
133
+ "description": "Path to additional command file or skill directory (in addition to those in the commands/ directory, if it exists), relative to the plugin root"
134
+ },
135
+ {
136
+ "type": "array",
137
+ "items": {
138
+ "anyOf": [
139
+ {
140
+ "type": "string"
141
+ },
142
+ {
143
+ "type": "string"
144
+ }
145
+ ],
146
+ "description": "Path to additional command file or skill directory (in addition to those in the commands/ directory, if it exists), relative to the plugin root"
147
+ },
148
+ "description": "List of paths to additional command files or skill directories"
149
+ },
150
+ {
151
+ "type": "object",
152
+ "additionalProperties": {
153
+ "type": "object",
154
+ "properties": {
155
+ "source": {
156
+ "anyOf": [
157
+ {
158
+ "type": "string"
159
+ },
160
+ {
161
+ "type": "string"
162
+ }
163
+ ],
164
+ "description": "Path to command markdown file, relative to plugin root"
165
+ },
166
+ "content": {
167
+ "type": "string",
168
+ "description": "Inline markdown content for the command"
169
+ },
170
+ "description": {
171
+ "type": "string",
172
+ "description": "Command description override"
173
+ },
174
+ "argumentHint": {
175
+ "type": "string",
176
+ "description": "Hint for command arguments (e.g., \"[file]\")"
177
+ },
178
+ "model": {
179
+ "type": "string",
180
+ "description": "Default model for this command"
181
+ },
182
+ "allowedTools": {
183
+ "type": "array",
184
+ "items": {
185
+ "type": "string"
186
+ },
187
+ "description": "Tools allowed when command runs"
188
+ }
189
+ }
190
+ },
191
+ "description": "Object mapping of command names to their metadata and source files. Command name becomes the slash command name (e.g., \"about\" \\u2192 \"/plugin:about\")"
192
+ }
193
+ ]
194
+ },
195
+ "agents": {
196
+ "anyOf": [
197
+ {
198
+ "type": "string",
199
+ "description": "Path to additional agent file (in addition to those in the agents/ directory, if it exists), relative to the plugin root"
200
+ },
201
+ {
202
+ "type": "array",
203
+ "items": {
204
+ "type": "string",
205
+ "description": "Path to additional agent file (in addition to those in the agents/ directory, if it exists), relative to the plugin root"
206
+ },
207
+ "description": "List of paths to additional agent files"
208
+ }
209
+ ]
210
+ },
211
+ "skills": {
212
+ "anyOf": [
213
+ {
214
+ "type": "string",
215
+ "description": "Path to additional skill directory (in addition to those in the skills/ directory, if it exists), relative to the plugin root"
216
+ },
217
+ {
218
+ "type": "array",
219
+ "items": {
220
+ "type": "string",
221
+ "description": "Path to additional skill directory (in addition to those in the skills/ directory, if it exists), relative to the plugin root"
222
+ },
223
+ "description": "List of paths to additional skill directories"
224
+ }
225
+ ]
226
+ },
227
+ "outputStyles": {
228
+ "anyOf": [
229
+ {
230
+ "type": "string",
231
+ "description": "Path to additional output styles directory or file (in addition to those in the output-styles/ directory, if it exists), relative to the plugin root"
232
+ },
233
+ {
234
+ "type": "array",
235
+ "items": {
236
+ "type": "string",
237
+ "description": "Path to additional output styles directory or file (in addition to those in the output-styles/ directory, if it exists), relative to the plugin root"
238
+ },
239
+ "description": "List of paths to additional output styles directories or files"
240
+ }
241
+ ]
242
+ },
243
+ "themes": {
244
+ "anyOf": [
245
+ {
246
+ "type": "string",
247
+ "description": "Path to additional themes directory or file (in addition to those in the themes/ directory, if it exists), relative to the plugin root"
248
+ },
249
+ {
250
+ "type": "array",
251
+ "items": {
252
+ "type": "string",
253
+ "description": "Path to additional themes directory or file (in addition to those in the themes/ directory, if it exists), relative to the plugin root"
254
+ },
255
+ "description": "List of paths to additional themes directories or files"
256
+ }
257
+ ]
258
+ },
259
+ "channels": {
260
+ "type": "array",
261
+ "items": {
262
+ "type": "object",
263
+ "properties": {
264
+ "server": {
265
+ "type": "string",
266
+ "minLength": 1,
267
+ "description": "Name of the MCP server this channel binds to. Must match a key in this plugin's mcpServers."
268
+ },
269
+ "displayName": {
270
+ "type": "string",
271
+ "description": "Human-readable name shown in the config dialog title (e.g., \"Telegram\"). Defaults to the server name."
272
+ },
273
+ "userConfig": {
274
+ "type": "object",
275
+ "additionalProperties": {
276
+ "type": "object",
277
+ "properties": {
278
+ "type": {
279
+ "enum": [
280
+ "string",
281
+ "number",
282
+ "boolean",
283
+ "directory",
284
+ "file"
285
+ ],
286
+ "description": "Type of the configuration value"
287
+ },
288
+ "title": {
289
+ "type": "string",
290
+ "description": "Human-readable label shown in the config dialog"
291
+ },
292
+ "description": {
293
+ "type": "string",
294
+ "description": "Help text shown beneath the field in the config dialog"
295
+ },
296
+ "required": {
297
+ "type": "boolean",
298
+ "description": "If true, validation fails when this field is empty"
299
+ },
300
+ "default": {
301
+ "anyOf": [
302
+ {
303
+ "type": "string"
304
+ },
305
+ {
306
+ "type": "number"
307
+ },
308
+ {
309
+ "type": "boolean"
310
+ },
311
+ {
312
+ "type": "array",
313
+ "items": {
314
+ "type": "string"
315
+ }
316
+ }
317
+ ],
318
+ "description": "Default value used when the user provides nothing"
319
+ },
320
+ "multiple": {
321
+ "type": "boolean",
322
+ "description": "For string type: allow an array of strings"
323
+ },
324
+ "sensitive": {
325
+ "type": "boolean",
326
+ "description": "If true, masks dialog input and stores value in secure storage (keychain/credentials file) instead of settings.json"
327
+ },
328
+ "min": {
329
+ "type": "number",
330
+ "description": "Minimum value (number type only)"
331
+ },
332
+ "max": {
333
+ "type": "number",
334
+ "description": "Maximum value (number type only)"
335
+ }
336
+ },
337
+ "required": [
338
+ "type",
339
+ "title",
340
+ "description"
341
+ ],
342
+ "additionalProperties": false
343
+ },
344
+ "description": "Fields to prompt the user for when enabling this plugin in assistant mode. Saved values are substituted into ${user_config.KEY} references in the mcpServers env."
345
+ }
346
+ },
347
+ "required": [
348
+ "server"
349
+ ],
350
+ "additionalProperties": false
351
+ },
352
+ "description": "Channels this plugin provides. Each entry declares an MCP server as a message channel and optionally specifies user configuration to prompt for at enable time."
353
+ },
354
+ "mcpServers": {
355
+ "anyOf": [
356
+ {
357
+ "type": "string",
358
+ "description": "MCP servers to include in the plugin (in addition to those in the .mcp.json file, if it exists)"
359
+ },
360
+ {
361
+ "anyOf": [
362
+ {
363
+ "type": "string",
364
+ "description": "Path to MCPB file relative to plugin root"
365
+ },
366
+ {
367
+ "type": "string",
368
+ "format": "uri",
369
+ "description": "URL to MCPB file"
370
+ }
371
+ ],
372
+ "description": "Path or URL to MCPB file containing MCP server configuration"
373
+ },
374
+ {
375
+ "type": "object",
376
+ "additionalProperties": {
377
+ "anyOf": [
378
+ {
379
+ "type": "object",
380
+ "properties": {
381
+ "type": {
382
+ "const": "stdio"
383
+ },
384
+ "command": {
385
+ "type": "string",
386
+ "minLength": 1
387
+ },
388
+ "args": {
389
+ "type": "array",
390
+ "items": {
391
+ "type": "string"
392
+ },
393
+ "default": "[]"
394
+ },
395
+ "env": {
396
+ "type": "object",
397
+ "additionalProperties": {
398
+ "type": "string"
399
+ }
400
+ },
401
+ "alwaysLoad": {
402
+ "type": "boolean"
403
+ }
404
+ },
405
+ "required": [
406
+ "command"
407
+ ]
408
+ },
409
+ {
410
+ "type": "object",
411
+ "properties": {
412
+ "type": {
413
+ "const": "sse"
414
+ },
415
+ "url": {
416
+ "type": "string"
417
+ },
418
+ "headers": {
419
+ "type": "object",
420
+ "additionalProperties": {
421
+ "type": "string"
422
+ }
423
+ },
424
+ "headersHelper": {
425
+ "type": "string"
426
+ },
427
+ "oauth": {
428
+ "type": "object",
429
+ "properties": {
430
+ "clientId": {
431
+ "type": "string"
432
+ },
433
+ "callbackPort": {
434
+ "type": "number"
435
+ },
436
+ "authServerMetadataUrl": {
437
+ "type": "string",
438
+ "format": "uri"
439
+ },
440
+ "scopes": {
441
+ "type": "string",
442
+ "minLength": 1
443
+ },
444
+ "xaa": {
445
+ "type": "boolean"
446
+ }
447
+ }
448
+ },
449
+ "alwaysLoad": {
450
+ "type": "boolean"
451
+ }
452
+ },
453
+ "required": [
454
+ "type",
455
+ "url"
456
+ ]
457
+ },
458
+ {
459
+ "type": "object",
460
+ "properties": {
461
+ "type": {
462
+ "const": "sse-ide"
463
+ },
464
+ "url": {
465
+ "type": "string"
466
+ },
467
+ "ideName": {
468
+ "type": "string"
469
+ },
470
+ "ideRunningInWindows": {
471
+ "type": "boolean"
472
+ },
473
+ "alwaysLoad": {
474
+ "type": "boolean"
475
+ }
476
+ },
477
+ "required": [
478
+ "type",
479
+ "url",
480
+ "ideName"
481
+ ]
482
+ },
483
+ {
484
+ "type": "object",
485
+ "properties": {
486
+ "type": {
487
+ "const": "ws-ide"
488
+ },
489
+ "url": {
490
+ "type": "string"
491
+ },
492
+ "ideName": {
493
+ "type": "string"
494
+ },
495
+ "authToken": {
496
+ "type": "string"
497
+ },
498
+ "ideRunningInWindows": {
499
+ "type": "boolean"
500
+ },
501
+ "alwaysLoad": {
502
+ "type": "boolean"
503
+ }
504
+ },
505
+ "required": [
506
+ "type",
507
+ "url",
508
+ "ideName"
509
+ ]
510
+ },
511
+ {
512
+ "type": "object",
513
+ "properties": {
514
+ "type": {
515
+ "enum": [
516
+ "http",
517
+ "streamable-http"
518
+ ]
519
+ },
520
+ "url": {
521
+ "type": "string"
522
+ },
523
+ "headers": {
524
+ "type": "object",
525
+ "additionalProperties": {
526
+ "type": "string"
527
+ }
528
+ },
529
+ "headersHelper": {
530
+ "type": "string"
531
+ },
532
+ "oauth": {
533
+ "type": "object",
534
+ "properties": {
535
+ "clientId": {
536
+ "type": "string"
537
+ },
538
+ "callbackPort": {
539
+ "type": "number"
540
+ },
541
+ "authServerMetadataUrl": {
542
+ "type": "string",
543
+ "format": "uri"
544
+ },
545
+ "scopes": {
546
+ "type": "string",
547
+ "minLength": 1
548
+ },
549
+ "xaa": {
550
+ "type": "boolean"
551
+ }
552
+ }
553
+ },
554
+ "alwaysLoad": {
555
+ "type": "boolean"
556
+ }
557
+ },
558
+ "required": [
559
+ "type",
560
+ "url"
561
+ ]
562
+ },
563
+ {
564
+ "type": "object",
565
+ "properties": {
566
+ "type": {
567
+ "const": "ws"
568
+ },
569
+ "url": {
570
+ "type": "string"
571
+ },
572
+ "headers": {
573
+ "type": "object",
574
+ "additionalProperties": {
575
+ "type": "string"
576
+ }
577
+ },
578
+ "headersHelper": {
579
+ "type": "string"
580
+ },
581
+ "alwaysLoad": {
582
+ "type": "boolean"
583
+ }
584
+ },
585
+ "required": [
586
+ "type",
587
+ "url"
588
+ ]
589
+ },
590
+ {
591
+ "type": "object",
592
+ "properties": {
593
+ "type": {
594
+ "const": "sdk"
595
+ },
596
+ "name": {
597
+ "type": "string"
598
+ },
599
+ "alwaysLoad": {
600
+ "type": "boolean"
601
+ }
602
+ },
603
+ "required": [
604
+ "type",
605
+ "name"
606
+ ]
607
+ },
608
+ {
609
+ "type": "object",
610
+ "properties": {
611
+ "type": {
612
+ "const": "claudeai-proxy"
613
+ },
614
+ "url": {
615
+ "type": "string"
616
+ },
617
+ "id": {
618
+ "type": "string"
619
+ },
620
+ "alwaysLoad": {
621
+ "type": "boolean"
622
+ },
623
+ "toolPermissions": {
624
+ "type": "object",
625
+ "additionalProperties": {
626
+ "enum": [
627
+ "allow",
628
+ "ask",
629
+ "blocked"
630
+ ]
631
+ }
632
+ }
633
+ },
634
+ "required": [
635
+ "type",
636
+ "url",
637
+ "id"
638
+ ]
639
+ }
640
+ ]
641
+ },
642
+ "description": "MCP server configurations keyed by server name"
643
+ },
644
+ {
645
+ "type": "array",
646
+ "items": {
647
+ "anyOf": [
648
+ {
649
+ "type": "string",
650
+ "description": "Path to MCP servers configuration file"
651
+ },
652
+ {
653
+ "anyOf": [
654
+ {
655
+ "type": "string",
656
+ "description": "Path to MCPB file relative to plugin root"
657
+ },
658
+ {
659
+ "type": "string",
660
+ "format": "uri",
661
+ "description": "URL to MCPB file"
662
+ }
663
+ ],
664
+ "description": "Path or URL to MCPB file"
665
+ },
666
+ {
667
+ "type": "object",
668
+ "additionalProperties": {
669
+ "anyOf": [
670
+ {
671
+ "type": "object",
672
+ "properties": {
673
+ "type": {
674
+ "const": "stdio"
675
+ },
676
+ "command": {
677
+ "type": "string",
678
+ "minLength": 1
679
+ },
680
+ "args": {
681
+ "type": "array",
682
+ "items": {
683
+ "type": "string"
684
+ },
685
+ "default": "[]"
686
+ },
687
+ "env": {
688
+ "type": "object",
689
+ "additionalProperties": {
690
+ "type": "string"
691
+ }
692
+ },
693
+ "alwaysLoad": {
694
+ "type": "boolean"
695
+ }
696
+ },
697
+ "required": [
698
+ "command"
699
+ ]
700
+ },
701
+ {
702
+ "type": "object",
703
+ "properties": {
704
+ "type": {
705
+ "const": "sse"
706
+ },
707
+ "url": {
708
+ "type": "string"
709
+ },
710
+ "headers": {
711
+ "type": "object",
712
+ "additionalProperties": {
713
+ "type": "string"
714
+ }
715
+ },
716
+ "headersHelper": {
717
+ "type": "string"
718
+ },
719
+ "oauth": {
720
+ "type": "object",
721
+ "properties": {
722
+ "clientId": {
723
+ "type": "string"
724
+ },
725
+ "callbackPort": {
726
+ "type": "number"
727
+ },
728
+ "authServerMetadataUrl": {
729
+ "type": "string",
730
+ "format": "uri"
731
+ },
732
+ "scopes": {
733
+ "type": "string",
734
+ "minLength": 1
735
+ },
736
+ "xaa": {
737
+ "type": "boolean"
738
+ }
739
+ }
740
+ },
741
+ "alwaysLoad": {
742
+ "type": "boolean"
743
+ }
744
+ },
745
+ "required": [
746
+ "type",
747
+ "url"
748
+ ]
749
+ },
750
+ {
751
+ "type": "object",
752
+ "properties": {
753
+ "type": {
754
+ "const": "sse-ide"
755
+ },
756
+ "url": {
757
+ "type": "string"
758
+ },
759
+ "ideName": {
760
+ "type": "string"
761
+ },
762
+ "ideRunningInWindows": {
763
+ "type": "boolean"
764
+ },
765
+ "alwaysLoad": {
766
+ "type": "boolean"
767
+ }
768
+ },
769
+ "required": [
770
+ "type",
771
+ "url",
772
+ "ideName"
773
+ ]
774
+ },
775
+ {
776
+ "type": "object",
777
+ "properties": {
778
+ "type": {
779
+ "const": "ws-ide"
780
+ },
781
+ "url": {
782
+ "type": "string"
783
+ },
784
+ "ideName": {
785
+ "type": "string"
786
+ },
787
+ "authToken": {
788
+ "type": "string"
789
+ },
790
+ "ideRunningInWindows": {
791
+ "type": "boolean"
792
+ },
793
+ "alwaysLoad": {
794
+ "type": "boolean"
795
+ }
796
+ },
797
+ "required": [
798
+ "type",
799
+ "url",
800
+ "ideName"
801
+ ]
802
+ },
803
+ {
804
+ "type": "object",
805
+ "properties": {
806
+ "type": {
807
+ "enum": [
808
+ "http",
809
+ "streamable-http"
810
+ ]
811
+ },
812
+ "url": {
813
+ "type": "string"
814
+ },
815
+ "headers": {
816
+ "type": "object",
817
+ "additionalProperties": {
818
+ "type": "string"
819
+ }
820
+ },
821
+ "headersHelper": {
822
+ "type": "string"
823
+ },
824
+ "oauth": {
825
+ "type": "object",
826
+ "properties": {
827
+ "clientId": {
828
+ "type": "string"
829
+ },
830
+ "callbackPort": {
831
+ "type": "number"
832
+ },
833
+ "authServerMetadataUrl": {
834
+ "type": "string",
835
+ "format": "uri"
836
+ },
837
+ "scopes": {
838
+ "type": "string",
839
+ "minLength": 1
840
+ },
841
+ "xaa": {
842
+ "type": "boolean"
843
+ }
844
+ }
845
+ },
846
+ "alwaysLoad": {
847
+ "type": "boolean"
848
+ }
849
+ },
850
+ "required": [
851
+ "type",
852
+ "url"
853
+ ]
854
+ },
855
+ {
856
+ "type": "object",
857
+ "properties": {
858
+ "type": {
859
+ "const": "ws"
860
+ },
861
+ "url": {
862
+ "type": "string"
863
+ },
864
+ "headers": {
865
+ "type": "object",
866
+ "additionalProperties": {
867
+ "type": "string"
868
+ }
869
+ },
870
+ "headersHelper": {
871
+ "type": "string"
872
+ },
873
+ "alwaysLoad": {
874
+ "type": "boolean"
875
+ }
876
+ },
877
+ "required": [
878
+ "type",
879
+ "url"
880
+ ]
881
+ },
882
+ {
883
+ "type": "object",
884
+ "properties": {
885
+ "type": {
886
+ "const": "sdk"
887
+ },
888
+ "name": {
889
+ "type": "string"
890
+ },
891
+ "alwaysLoad": {
892
+ "type": "boolean"
893
+ }
894
+ },
895
+ "required": [
896
+ "type",
897
+ "name"
898
+ ]
899
+ },
900
+ {
901
+ "type": "object",
902
+ "properties": {
903
+ "type": {
904
+ "const": "claudeai-proxy"
905
+ },
906
+ "url": {
907
+ "type": "string"
908
+ },
909
+ "id": {
910
+ "type": "string"
911
+ },
912
+ "alwaysLoad": {
913
+ "type": "boolean"
914
+ },
915
+ "toolPermissions": {
916
+ "type": "object",
917
+ "additionalProperties": {
918
+ "enum": [
919
+ "allow",
920
+ "ask",
921
+ "blocked"
922
+ ]
923
+ }
924
+ }
925
+ },
926
+ "required": [
927
+ "type",
928
+ "url",
929
+ "id"
930
+ ]
931
+ }
932
+ ]
933
+ },
934
+ "description": "Inline MCP server configurations"
935
+ }
936
+ ]
937
+ },
938
+ "description": "Array of MCP server configurations (paths, MCPB files, or inline definitions)"
939
+ }
940
+ ]
941
+ },
942
+ "lspServers": {
943
+ "anyOf": [
944
+ {
945
+ "type": "string",
946
+ "description": "Path to .lsp.json configuration file relative to plugin root"
947
+ },
948
+ {
949
+ "type": "object",
950
+ "additionalProperties": {
951
+ "type": "object",
952
+ "properties": {
953
+ "command": {
954
+ "type": "string",
955
+ "minLength": 1,
956
+ "description": "Command to execute the LSP server (e.g., \"typescript-language-server\")"
957
+ },
958
+ "args": {
959
+ "type": "array",
960
+ "items": {
961
+ "type": "string",
962
+ "minLength": 1
963
+ },
964
+ "description": "Command-line arguments to pass to the server"
965
+ },
966
+ "extensionToLanguage": {
967
+ "type": "object",
968
+ "additionalProperties": {
969
+ "type": "string",
970
+ "minLength": 1
971
+ },
972
+ "description": "Mapping from file extension to LSP language ID. File extensions and languages are derived from this mapping."
973
+ },
974
+ "transport": {
975
+ "enum": [
976
+ "stdio",
977
+ "socket"
978
+ ],
979
+ "default": "stdio",
980
+ "description": "Communication transport mechanism"
981
+ },
982
+ "env": {
983
+ "type": "object",
984
+ "additionalProperties": {
985
+ "type": "string"
986
+ },
987
+ "description": "Environment variables to set when starting the server"
988
+ },
989
+ "initializationOptions": {
990
+ "description": "Initialization options passed to the server during initialization"
991
+ },
992
+ "settings": {
993
+ "description": "Settings passed to the server via workspace/didChangeConfiguration"
994
+ },
995
+ "workspaceFolder": {
996
+ "type": "string",
997
+ "description": "Workspace folder path to use for the server"
998
+ },
999
+ "startupTimeout": {
1000
+ "type": "number",
1001
+ "description": "Maximum time to wait for server startup (milliseconds)"
1002
+ },
1003
+ "shutdownTimeout": {
1004
+ "type": "number",
1005
+ "description": "Maximum time to wait for graceful shutdown (milliseconds)"
1006
+ },
1007
+ "restartOnCrash": {
1008
+ "type": "boolean",
1009
+ "description": "Whether to restart the server if it crashes"
1010
+ },
1011
+ "maxRestarts": {
1012
+ "type": "number",
1013
+ "description": "Maximum number of restart attempts before giving up"
1014
+ }
1015
+ },
1016
+ "required": [
1017
+ "command",
1018
+ "extensionToLanguage"
1019
+ ],
1020
+ "additionalProperties": false
1021
+ },
1022
+ "description": "LSP server configurations keyed by server name"
1023
+ },
1024
+ {
1025
+ "type": "array",
1026
+ "items": {
1027
+ "anyOf": [
1028
+ {
1029
+ "type": "string",
1030
+ "description": "Path to LSP configuration file"
1031
+ },
1032
+ {
1033
+ "type": "object",
1034
+ "additionalProperties": {
1035
+ "type": "object",
1036
+ "properties": {
1037
+ "command": {
1038
+ "type": "string",
1039
+ "minLength": 1,
1040
+ "description": "Command to execute the LSP server (e.g., \"typescript-language-server\")"
1041
+ },
1042
+ "args": {
1043
+ "type": "array",
1044
+ "items": {
1045
+ "type": "string",
1046
+ "minLength": 1
1047
+ },
1048
+ "description": "Command-line arguments to pass to the server"
1049
+ },
1050
+ "extensionToLanguage": {
1051
+ "type": "object",
1052
+ "additionalProperties": {
1053
+ "type": "string",
1054
+ "minLength": 1
1055
+ },
1056
+ "description": "Mapping from file extension to LSP language ID. File extensions and languages are derived from this mapping."
1057
+ },
1058
+ "transport": {
1059
+ "enum": [
1060
+ "stdio",
1061
+ "socket"
1062
+ ],
1063
+ "default": "stdio",
1064
+ "description": "Communication transport mechanism"
1065
+ },
1066
+ "env": {
1067
+ "type": "object",
1068
+ "additionalProperties": {
1069
+ "type": "string"
1070
+ },
1071
+ "description": "Environment variables to set when starting the server"
1072
+ },
1073
+ "initializationOptions": {
1074
+ "description": "Initialization options passed to the server during initialization"
1075
+ },
1076
+ "settings": {
1077
+ "description": "Settings passed to the server via workspace/didChangeConfiguration"
1078
+ },
1079
+ "workspaceFolder": {
1080
+ "type": "string",
1081
+ "description": "Workspace folder path to use for the server"
1082
+ },
1083
+ "startupTimeout": {
1084
+ "type": "number",
1085
+ "description": "Maximum time to wait for server startup (milliseconds)"
1086
+ },
1087
+ "shutdownTimeout": {
1088
+ "type": "number",
1089
+ "description": "Maximum time to wait for graceful shutdown (milliseconds)"
1090
+ },
1091
+ "restartOnCrash": {
1092
+ "type": "boolean",
1093
+ "description": "Whether to restart the server if it crashes"
1094
+ },
1095
+ "maxRestarts": {
1096
+ "type": "number",
1097
+ "description": "Maximum number of restart attempts before giving up"
1098
+ }
1099
+ },
1100
+ "required": [
1101
+ "command",
1102
+ "extensionToLanguage"
1103
+ ],
1104
+ "additionalProperties": false
1105
+ },
1106
+ "description": "Inline LSP server configurations"
1107
+ }
1108
+ ]
1109
+ },
1110
+ "description": "Array of LSP server configurations (paths or inline definitions)"
1111
+ }
1112
+ ]
1113
+ },
1114
+ "monitors": {
1115
+ "anyOf": [
1116
+ {
1117
+ "type": "string",
1118
+ "description": "Path to a JSON file containing the monitors array, relative to the plugin root"
1119
+ },
1120
+ {
1121
+ "type": "array",
1122
+ "items": {
1123
+ "type": "object",
1124
+ "properties": {
1125
+ "name": {
1126
+ "type": "string",
1127
+ "minLength": 1,
1128
+ "description": "Identifier for this monitor, unique within the plugin. Used to dedupe so re-arming (plugin reload, repeat skill invoke) does not spawn duplicates."
1129
+ },
1130
+ "command": {
1131
+ "type": "string",
1132
+ "minLength": 1,
1133
+ "description": "Shell command to run as a persistent background monitor. Each stdout line is delivered to the model as a <task_notification> event; the process runs for the session lifetime. ${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA}, ${user_config.*}, and ${ENV_VAR} are substituted. Runs in the session cwd \\u2014 prefix with `cd \"${CLAUDE_PLUGIN_ROOT}\" && ` if the script needs its own directory."
1134
+ },
1135
+ "description": {
1136
+ "type": "string",
1137
+ "minLength": 1,
1138
+ "description": "Short human-readable description of what is being monitored (shown in task panel and notification summary)."
1139
+ },
1140
+ "when": {
1141
+ "anyOf": [
1142
+ {
1143
+ "const": "always"
1144
+ },
1145
+ {
1146
+ "type": "string"
1147
+ }
1148
+ ],
1149
+ "default": "always",
1150
+ "description": "Arm trigger. \"always\" arms at session start and on plugin reload. \"on-skill-invoke:<skill>\" arms the first time that skill is dispatched (via Skill tool or slash command)."
1151
+ }
1152
+ },
1153
+ "required": [
1154
+ "name",
1155
+ "command",
1156
+ "description"
1157
+ ],
1158
+ "additionalProperties": false
1159
+ }
1160
+ }
1161
+ ],
1162
+ "description": "Background watch scripts the host arms as persistent Monitor tasks (unsandboxed, same trust tier as hooks) so plugins need not instruct the model to arm them. When omitted, monitors/monitors.json at the plugin root is loaded if present."
1163
+ },
1164
+ "settings": {
1165
+ "type": "object",
1166
+ "additionalProperties": {},
1167
+ "description": "Settings to merge into the user settings while this plugin is enabled. Only the documented allowlisted keys are applied."
1168
+ },
1169
+ "userConfig": {
1170
+ "type": "object",
1171
+ "additionalProperties": {
1172
+ "type": "object",
1173
+ "properties": {
1174
+ "type": {
1175
+ "enum": [
1176
+ "string",
1177
+ "number",
1178
+ "boolean",
1179
+ "directory",
1180
+ "file"
1181
+ ],
1182
+ "description": "Type of the configuration value"
1183
+ },
1184
+ "title": {
1185
+ "type": "string",
1186
+ "description": "Human-readable label shown in the config dialog"
1187
+ },
1188
+ "description": {
1189
+ "type": "string",
1190
+ "description": "Help text shown beneath the field in the config dialog"
1191
+ },
1192
+ "required": {
1193
+ "type": "boolean",
1194
+ "description": "If true, validation fails when this field is empty"
1195
+ },
1196
+ "default": {
1197
+ "anyOf": [
1198
+ {
1199
+ "type": "string"
1200
+ },
1201
+ {
1202
+ "type": "number"
1203
+ },
1204
+ {
1205
+ "type": "boolean"
1206
+ },
1207
+ {
1208
+ "type": "array",
1209
+ "items": {
1210
+ "type": "string"
1211
+ }
1212
+ }
1213
+ ],
1214
+ "description": "Default value used when the user provides nothing"
1215
+ },
1216
+ "multiple": {
1217
+ "type": "boolean",
1218
+ "description": "For string type: allow an array of strings"
1219
+ },
1220
+ "sensitive": {
1221
+ "type": "boolean",
1222
+ "description": "If true, masks dialog input and stores value in secure storage (keychain/credentials file) instead of settings.json"
1223
+ },
1224
+ "min": {
1225
+ "type": "number",
1226
+ "description": "Minimum value (number type only)"
1227
+ },
1228
+ "max": {
1229
+ "type": "number",
1230
+ "description": "Maximum value (number type only)"
1231
+ }
1232
+ },
1233
+ "required": [
1234
+ "type",
1235
+ "title",
1236
+ "description"
1237
+ ],
1238
+ "additionalProperties": false
1239
+ },
1240
+ "description": "User-configurable values this plugin needs. Prompted at enable time. Non-sensitive values saved to settings.json; sensitive values to secure storage. Available as ${user_config.KEY} in MCP/LSP server config, hook commands, and (non-sensitive only) skill/agent content. Keep sensitive value counts small."
1241
+ },
1242
+ "experimental": {
1243
+ "type": "object",
1244
+ "properties": {
1245
+ "themes": {
1246
+ "anyOf": [
1247
+ {
1248
+ "type": "string",
1249
+ "description": "Path to additional themes directory or file (in addition to those in the themes/ directory, if it exists), relative to the plugin root"
1250
+ },
1251
+ {
1252
+ "type": "array",
1253
+ "items": {
1254
+ "type": "string",
1255
+ "description": "Path to additional themes directory or file (in addition to those in the themes/ directory, if it exists), relative to the plugin root"
1256
+ },
1257
+ "description": "List of paths to additional themes directories or files"
1258
+ }
1259
+ ]
1260
+ },
1261
+ "monitors": {
1262
+ "anyOf": [
1263
+ {
1264
+ "type": "string",
1265
+ "description": "Path to a JSON file containing the monitors array, relative to the plugin root"
1266
+ },
1267
+ {
1268
+ "type": "array",
1269
+ "items": {
1270
+ "type": "object",
1271
+ "properties": {
1272
+ "name": {
1273
+ "type": "string",
1274
+ "minLength": 1,
1275
+ "description": "Identifier for this monitor, unique within the plugin. Used to dedupe so re-arming (plugin reload, repeat skill invoke) does not spawn duplicates."
1276
+ },
1277
+ "command": {
1278
+ "type": "string",
1279
+ "minLength": 1,
1280
+ "description": "Shell command to run as a persistent background monitor. Each stdout line is delivered to the model as a <task_notification> event; the process runs for the session lifetime. ${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA}, ${user_config.*}, and ${ENV_VAR} are substituted. Runs in the session cwd \\u2014 prefix with `cd \"${CLAUDE_PLUGIN_ROOT}\" && ` if the script needs its own directory."
1281
+ },
1282
+ "description": {
1283
+ "type": "string",
1284
+ "minLength": 1,
1285
+ "description": "Short human-readable description of what is being monitored (shown in task panel and notification summary)."
1286
+ },
1287
+ "when": {
1288
+ "anyOf": [
1289
+ {
1290
+ "const": "always"
1291
+ },
1292
+ {
1293
+ "type": "string"
1294
+ }
1295
+ ],
1296
+ "default": "always",
1297
+ "description": "Arm trigger. \"always\" arms at session start and on plugin reload. \"on-skill-invoke:<skill>\" arms the first time that skill is dispatched (via Skill tool or slash command)."
1298
+ }
1299
+ },
1300
+ "required": [
1301
+ "name",
1302
+ "command",
1303
+ "description"
1304
+ ],
1305
+ "additionalProperties": false
1306
+ }
1307
+ }
1308
+ ],
1309
+ "description": "Background watch scripts the host arms as persistent Monitor tasks (unsandboxed, same trust tier as hooks) so plugins need not instruct the model to arm them. When omitted, monitors/monitors.json at the plugin root is loaded if present."
1310
+ }
1311
+ },
1312
+ "description": "Components whose manifest shape may change without a deprecation cycle. Move a key out of here once it is promoted to stable."
1313
+ }
1314
+ },
1315
+ "required": [
1316
+ "name"
1317
+ ]
1318
+ }
1319
+ }