universal-plugin 0.5.0 → 0.7.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-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/com.github.copilot/agents/agentskills-specialist.agent.md +132 -0
- package/dist/cli.mjs +727 -43
- package/governances/plugin-design.md +14 -0
- package/package.json +4 -1
- package/plugin.json +1 -1
- package/readme.md +4 -0
- package/schema/README.md +10 -0
- package/schema/claude-code-marketplace.json +1939 -0
- package/schema/extension.schema.json +846 -0
- package/skills/doctor/README.md +3 -1
- package/skills/doctor/SKILL.md +27 -6
- package/skills/doctor/scripts/doctor.mjs +90 -0
- package/skills/init/README.md +4 -1
- package/skills/init/SKILL.md +35 -10
- package/skills/init/references/adopt.md +101 -13
- package/skills/init/references/detection.md +8 -2
- package/skills/init/references/vendors/copilot-cli.md +159 -11
- package/skills/marketplace/README.md +14 -2
- package/skills/marketplace/SKILL.md +45 -6
- package/skills/marketplace/scripts/validate.mjs +11 -0
|
@@ -0,0 +1,846 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "universal-plugin extension namespace",
|
|
4
|
+
"description": "universal-plugin build configuration: the build-target list, per-harness manifest overrides, the plugins depended on, the npm package tracked, and the canonical component input paths the build derives per harness. This is the body of extensions[\"org.cyberuni.universal-plugin\"] in an Agent Plugins Specification v1.0.0 manifest, and nothing else — apply it to the namespace object, not to the manifest.",
|
|
5
|
+
"$comment": "The manifest envelope around this object belongs to the Agent Plugins Specification and is validated by https://agent-plugins.org/schemas/1.0.0/plugin.schema.json. That specification assigns no semantics to a namespace object's contents (§8), so this schema supplies them for the one namespace universal-plugin owns. It carries no $id: the fields it describes version with the universal-plugin package that ships it.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"vendors": {
|
|
10
|
+
"type": "array",
|
|
11
|
+
"items": {
|
|
12
|
+
"$ref": "#/$defs/vendorId"
|
|
13
|
+
},
|
|
14
|
+
"uniqueItems": true,
|
|
15
|
+
"description": "Vendor targets to generate manifests for during 'plugin build'."
|
|
16
|
+
},
|
|
17
|
+
"harnesses": {
|
|
18
|
+
"$ref": "#/$defs/harnesses",
|
|
19
|
+
"description": "Per-harness fields copied verbatim into that harness's derived manifest during 'plugin build'. Keyed by vendor id."
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"$ref": "#/$defs/dependencies",
|
|
23
|
+
"description": "Plugins this plugin needs. Delivered to the harnesses that read a dependency and dropped with a build warning for the rest — only Claude Code reads one (ADR-0013)."
|
|
24
|
+
},
|
|
25
|
+
"packagePath": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Relative path (from repo root) to the npm package folder whose version this plugin tracks."
|
|
28
|
+
},
|
|
29
|
+
"skills": {
|
|
30
|
+
"$ref": "#/$defs/pathValue",
|
|
31
|
+
"description": "Skill directories. Default: ./skills/. Each subdirectory must contain SKILL.md."
|
|
32
|
+
},
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"$ref": "#/$defs/mcpServersValue",
|
|
35
|
+
"description": "MCP server configuration. Path string, path config, or inline mcpServers object. Default: ./mcp.json."
|
|
36
|
+
},
|
|
37
|
+
"commands": {
|
|
38
|
+
"$ref": "#/$defs/pathValue",
|
|
39
|
+
"description": "Command markdown files. Default: ./commands/."
|
|
40
|
+
},
|
|
41
|
+
"agents": {
|
|
42
|
+
"$ref": "#/$defs/pathValue",
|
|
43
|
+
"description": "Agent definition markdown files. Default: ./agents/."
|
|
44
|
+
},
|
|
45
|
+
"rules": {
|
|
46
|
+
"$ref": "#/$defs/pathValue",
|
|
47
|
+
"description": "Rule markdown files (.mdc). Default: ./rules/."
|
|
48
|
+
},
|
|
49
|
+
"hooks": {
|
|
50
|
+
"$ref": "#/$defs/hooksValue",
|
|
51
|
+
"description": "Hook configuration. Path string, path config, or inline hooks object. Default: ./hooks/hooks.json. Event names must be PascalCase canonical names — the build translates per vendor."
|
|
52
|
+
},
|
|
53
|
+
"lspServers": {
|
|
54
|
+
"$ref": "#/$defs/lspServersValue",
|
|
55
|
+
"description": "LSP server configuration. Path string, path config, or inline server map. Default: ./.lsp.json."
|
|
56
|
+
},
|
|
57
|
+
"outputStyles": {
|
|
58
|
+
"$ref": "#/$defs/pathValue",
|
|
59
|
+
"description": "Output style resources. Default: ./output-styles/."
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"$defs": {
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"type": "array",
|
|
65
|
+
"description": "Each entry names a plugin, optionally qualified with @marketplace. Use the object form to carry a constraint: a range in the string form parses and is then discarded by the runtime.",
|
|
66
|
+
"items": {
|
|
67
|
+
"oneOf": [
|
|
68
|
+
{
|
|
69
|
+
"type": "string",
|
|
70
|
+
"pattern": "^[A-Za-z0-9][-A-Za-z0-9._]*(@[A-Za-z0-9][-A-Za-z0-9._]*)?(@\\^[^@]*)?$"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "object",
|
|
74
|
+
"required": ["name"],
|
|
75
|
+
"description": "Claude Code parses this form loosely, so an unknown key is carried rather than rejected.",
|
|
76
|
+
"properties": {
|
|
77
|
+
"name": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"pattern": "^[A-Za-z0-9][-A-Za-z0-9._]*$"
|
|
80
|
+
},
|
|
81
|
+
"marketplace": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"pattern": "^[A-Za-z0-9][-A-Za-z0-9._]*$"
|
|
84
|
+
},
|
|
85
|
+
"version": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"description": "Semver range, checked against the installed plugin's version."
|
|
88
|
+
},
|
|
89
|
+
"sha": {
|
|
90
|
+
"type": "string",
|
|
91
|
+
"description": "Commit sha to pin a git-sourced dependency to."
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"pluginPath": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"pattern": "^\\./"
|
|
101
|
+
},
|
|
102
|
+
"pathConfig": {
|
|
103
|
+
"type": "object",
|
|
104
|
+
"required": ["paths"],
|
|
105
|
+
"additionalProperties": false,
|
|
106
|
+
"properties": {
|
|
107
|
+
"paths": {
|
|
108
|
+
"type": "array",
|
|
109
|
+
"minItems": 1,
|
|
110
|
+
"items": {
|
|
111
|
+
"$ref": "#/$defs/pluginPath"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"pathValue": {
|
|
117
|
+
"description": "A component path: a single path string, an array of path strings, or a path config object with a 'paths' array. All paths must start with './'.",
|
|
118
|
+
"oneOf": [
|
|
119
|
+
{
|
|
120
|
+
"$ref": "#/$defs/pluginPath"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"type": "array",
|
|
124
|
+
"minItems": 1,
|
|
125
|
+
"items": {
|
|
126
|
+
"$ref": "#/$defs/pluginPath"
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"$ref": "#/$defs/pathConfig"
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
},
|
|
134
|
+
"mcpServerStdio": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"required": ["command"],
|
|
137
|
+
"additionalProperties": false,
|
|
138
|
+
"properties": {
|
|
139
|
+
"type": {
|
|
140
|
+
"type": "string",
|
|
141
|
+
"const": "stdio"
|
|
142
|
+
},
|
|
143
|
+
"command": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "Executable. Supports ${PLUGIN_ROOT} and ${PLUGIN_DATA}."
|
|
146
|
+
},
|
|
147
|
+
"args": {
|
|
148
|
+
"type": "array",
|
|
149
|
+
"items": {
|
|
150
|
+
"type": "string"
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"env": {
|
|
154
|
+
"type": "object",
|
|
155
|
+
"additionalProperties": {
|
|
156
|
+
"type": "string"
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"cwd": {
|
|
160
|
+
"type": "string"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"mcpServerUrl": {
|
|
165
|
+
"type": "object",
|
|
166
|
+
"required": ["type", "url"],
|
|
167
|
+
"additionalProperties": false,
|
|
168
|
+
"properties": {
|
|
169
|
+
"type": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"enum": ["sse", "http", "ws"]
|
|
172
|
+
},
|
|
173
|
+
"url": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"format": "uri"
|
|
176
|
+
},
|
|
177
|
+
"headers": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"additionalProperties": {
|
|
180
|
+
"type": "string"
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
"headersHelper": {
|
|
184
|
+
"type": "string"
|
|
185
|
+
},
|
|
186
|
+
"oauth": {
|
|
187
|
+
"type": "object",
|
|
188
|
+
"additionalProperties": false,
|
|
189
|
+
"properties": {
|
|
190
|
+
"clientId": {
|
|
191
|
+
"type": "string"
|
|
192
|
+
},
|
|
193
|
+
"callbackPort": {
|
|
194
|
+
"type": "integer",
|
|
195
|
+
"exclusiveMinimum": 0
|
|
196
|
+
},
|
|
197
|
+
"authServerMetadataUrl": {
|
|
198
|
+
"type": "string",
|
|
199
|
+
"format": "uri"
|
|
200
|
+
},
|
|
201
|
+
"scopes": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"minLength": 1
|
|
204
|
+
},
|
|
205
|
+
"xaa": {
|
|
206
|
+
"type": "boolean"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"mcpServerMap": {
|
|
213
|
+
"type": "object",
|
|
214
|
+
"description": "Map of server name to server configuration.",
|
|
215
|
+
"additionalProperties": {
|
|
216
|
+
"oneOf": [
|
|
217
|
+
{
|
|
218
|
+
"$ref": "#/$defs/mcpServerStdio"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"$ref": "#/$defs/mcpServerUrl"
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"mcpServersValue": {
|
|
227
|
+
"description": "MCP server config: a path string, path config, or an inline object with a top-level 'mcpServers' map.",
|
|
228
|
+
"oneOf": [
|
|
229
|
+
{
|
|
230
|
+
"$ref": "#/$defs/pluginPath"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"$ref": "#/$defs/pathConfig"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"type": "object",
|
|
237
|
+
"required": ["mcpServers"],
|
|
238
|
+
"additionalProperties": false,
|
|
239
|
+
"properties": {
|
|
240
|
+
"mcpServers": {
|
|
241
|
+
"$ref": "#/$defs/mcpServerMap"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
]
|
|
246
|
+
},
|
|
247
|
+
"canonicalHookEvent": {
|
|
248
|
+
"type": "string",
|
|
249
|
+
"description": "Canonical PascalCase hook event name. The build translates to vendor-specific casing.",
|
|
250
|
+
"enum": [
|
|
251
|
+
"PreToolUse",
|
|
252
|
+
"PostToolUse",
|
|
253
|
+
"PostToolUseFailure",
|
|
254
|
+
"SessionStart",
|
|
255
|
+
"SessionEnd",
|
|
256
|
+
"UserPromptSubmit",
|
|
257
|
+
"Stop",
|
|
258
|
+
"StopFailure",
|
|
259
|
+
"SubagentStart",
|
|
260
|
+
"SubagentStop",
|
|
261
|
+
"PreCompact",
|
|
262
|
+
"PostCompact",
|
|
263
|
+
"Notification",
|
|
264
|
+
"PermissionRequest",
|
|
265
|
+
"InstructionsLoaded",
|
|
266
|
+
"ConfigChange",
|
|
267
|
+
"CwdChanged",
|
|
268
|
+
"FileChanged",
|
|
269
|
+
"WorktreeCreate",
|
|
270
|
+
"WorktreeRemove",
|
|
271
|
+
"Elicitation",
|
|
272
|
+
"ElicitationResult",
|
|
273
|
+
"TaskCreated",
|
|
274
|
+
"TaskCompleted",
|
|
275
|
+
"TeammateIdle"
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
"hookActionCommand": {
|
|
279
|
+
"type": "object",
|
|
280
|
+
"required": ["type", "command"],
|
|
281
|
+
"additionalProperties": false,
|
|
282
|
+
"properties": {
|
|
283
|
+
"type": {
|
|
284
|
+
"type": "string",
|
|
285
|
+
"const": "command"
|
|
286
|
+
},
|
|
287
|
+
"command": {
|
|
288
|
+
"type": "string",
|
|
289
|
+
"description": "Shell command. Supports ${PLUGIN_ROOT} and ${PLUGIN_DATA}."
|
|
290
|
+
},
|
|
291
|
+
"shell": {
|
|
292
|
+
"type": "string",
|
|
293
|
+
"enum": ["bash", "powershell"]
|
|
294
|
+
},
|
|
295
|
+
"if": {
|
|
296
|
+
"type": "string",
|
|
297
|
+
"description": "Permission rule filter expression."
|
|
298
|
+
},
|
|
299
|
+
"timeout": {
|
|
300
|
+
"type": "number",
|
|
301
|
+
"exclusiveMinimum": 0
|
|
302
|
+
},
|
|
303
|
+
"statusMessage": {
|
|
304
|
+
"type": "string"
|
|
305
|
+
},
|
|
306
|
+
"once": {
|
|
307
|
+
"type": "boolean"
|
|
308
|
+
},
|
|
309
|
+
"async": {
|
|
310
|
+
"type": "boolean"
|
|
311
|
+
},
|
|
312
|
+
"asyncRewake": {
|
|
313
|
+
"type": "boolean"
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"hookActionHttp": {
|
|
318
|
+
"type": "object",
|
|
319
|
+
"required": ["type", "url"],
|
|
320
|
+
"additionalProperties": false,
|
|
321
|
+
"properties": {
|
|
322
|
+
"type": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"const": "http"
|
|
325
|
+
},
|
|
326
|
+
"url": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"format": "uri"
|
|
329
|
+
},
|
|
330
|
+
"if": {
|
|
331
|
+
"type": "string"
|
|
332
|
+
},
|
|
333
|
+
"timeout": {
|
|
334
|
+
"type": "number",
|
|
335
|
+
"exclusiveMinimum": 0
|
|
336
|
+
},
|
|
337
|
+
"headers": {
|
|
338
|
+
"type": "object",
|
|
339
|
+
"additionalProperties": {
|
|
340
|
+
"type": "string"
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"allowedEnvVars": {
|
|
344
|
+
"type": "array",
|
|
345
|
+
"items": {
|
|
346
|
+
"type": "string"
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
"statusMessage": {
|
|
350
|
+
"type": "string"
|
|
351
|
+
},
|
|
352
|
+
"once": {
|
|
353
|
+
"type": "boolean"
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"hookActionPrompt": {
|
|
358
|
+
"type": "object",
|
|
359
|
+
"required": ["type", "prompt"],
|
|
360
|
+
"additionalProperties": false,
|
|
361
|
+
"properties": {
|
|
362
|
+
"type": {
|
|
363
|
+
"type": "string",
|
|
364
|
+
"const": "prompt"
|
|
365
|
+
},
|
|
366
|
+
"prompt": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"description": "Prompt text. Use $ARGUMENTS for event context."
|
|
369
|
+
},
|
|
370
|
+
"if": {
|
|
371
|
+
"type": "string"
|
|
372
|
+
},
|
|
373
|
+
"timeout": {
|
|
374
|
+
"type": "number",
|
|
375
|
+
"exclusiveMinimum": 0
|
|
376
|
+
},
|
|
377
|
+
"model": {
|
|
378
|
+
"type": "string"
|
|
379
|
+
},
|
|
380
|
+
"statusMessage": {
|
|
381
|
+
"type": "string"
|
|
382
|
+
},
|
|
383
|
+
"once": {
|
|
384
|
+
"type": "boolean"
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"hookActionAgent": {
|
|
389
|
+
"type": "object",
|
|
390
|
+
"required": ["type", "prompt"],
|
|
391
|
+
"additionalProperties": false,
|
|
392
|
+
"properties": {
|
|
393
|
+
"type": {
|
|
394
|
+
"type": "string",
|
|
395
|
+
"const": "agent"
|
|
396
|
+
},
|
|
397
|
+
"prompt": {
|
|
398
|
+
"type": "string"
|
|
399
|
+
},
|
|
400
|
+
"if": {
|
|
401
|
+
"type": "string"
|
|
402
|
+
},
|
|
403
|
+
"timeout": {
|
|
404
|
+
"type": "number",
|
|
405
|
+
"exclusiveMinimum": 0,
|
|
406
|
+
"default": 60
|
|
407
|
+
},
|
|
408
|
+
"model": {
|
|
409
|
+
"type": "string"
|
|
410
|
+
},
|
|
411
|
+
"statusMessage": {
|
|
412
|
+
"type": "string"
|
|
413
|
+
},
|
|
414
|
+
"once": {
|
|
415
|
+
"type": "boolean"
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
"hookAction": {
|
|
420
|
+
"description": "A single hook action. Discriminated by 'type'.",
|
|
421
|
+
"oneOf": [
|
|
422
|
+
{
|
|
423
|
+
"$ref": "#/$defs/hookActionCommand"
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
"$ref": "#/$defs/hookActionHttp"
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"$ref": "#/$defs/hookActionPrompt"
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
"$ref": "#/$defs/hookActionAgent"
|
|
433
|
+
}
|
|
434
|
+
]
|
|
435
|
+
},
|
|
436
|
+
"hookRule": {
|
|
437
|
+
"type": "object",
|
|
438
|
+
"required": ["hooks"],
|
|
439
|
+
"additionalProperties": false,
|
|
440
|
+
"properties": {
|
|
441
|
+
"matcher": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "Optional regex matched against event-specific context (e.g. tool name for PreToolUse)."
|
|
444
|
+
},
|
|
445
|
+
"hooks": {
|
|
446
|
+
"type": "array",
|
|
447
|
+
"minItems": 1,
|
|
448
|
+
"items": {
|
|
449
|
+
"$ref": "#/$defs/hookAction"
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
"hooksMap": {
|
|
455
|
+
"type": "object",
|
|
456
|
+
"description": "Map of canonical PascalCase event name to an array of hook rules.",
|
|
457
|
+
"propertyNames": {
|
|
458
|
+
"$ref": "#/$defs/canonicalHookEvent"
|
|
459
|
+
},
|
|
460
|
+
"additionalProperties": {
|
|
461
|
+
"type": "array",
|
|
462
|
+
"items": {
|
|
463
|
+
"$ref": "#/$defs/hookRule"
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
"hooksValue": {
|
|
468
|
+
"description": "Hooks config: a path string, path config, or an inline object with a top-level 'hooks' map.",
|
|
469
|
+
"oneOf": [
|
|
470
|
+
{
|
|
471
|
+
"$ref": "#/$defs/pluginPath"
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
"$ref": "#/$defs/pathConfig"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"type": "object",
|
|
478
|
+
"required": ["hooks"],
|
|
479
|
+
"additionalProperties": false,
|
|
480
|
+
"properties": {
|
|
481
|
+
"hooks": {
|
|
482
|
+
"$ref": "#/$defs/hooksMap"
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
]
|
|
487
|
+
},
|
|
488
|
+
"lspServer": {
|
|
489
|
+
"type": "object",
|
|
490
|
+
"required": ["command", "extensionToLanguage"],
|
|
491
|
+
"additionalProperties": false,
|
|
492
|
+
"properties": {
|
|
493
|
+
"command": {
|
|
494
|
+
"type": "string"
|
|
495
|
+
},
|
|
496
|
+
"extensionToLanguage": {
|
|
497
|
+
"type": "object",
|
|
498
|
+
"description": "Maps file extensions (e.g. '.ts') to language IDs (e.g. 'typescript').",
|
|
499
|
+
"additionalProperties": {
|
|
500
|
+
"type": "string"
|
|
501
|
+
}
|
|
502
|
+
},
|
|
503
|
+
"args": {
|
|
504
|
+
"type": "array",
|
|
505
|
+
"items": {
|
|
506
|
+
"type": "string"
|
|
507
|
+
}
|
|
508
|
+
},
|
|
509
|
+
"transport": {
|
|
510
|
+
"type": "string",
|
|
511
|
+
"enum": ["stdio", "socket"],
|
|
512
|
+
"default": "stdio"
|
|
513
|
+
},
|
|
514
|
+
"env": {
|
|
515
|
+
"type": "object",
|
|
516
|
+
"additionalProperties": {
|
|
517
|
+
"type": "string"
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
"initializationOptions": {},
|
|
521
|
+
"settings": {},
|
|
522
|
+
"workspaceFolder": {
|
|
523
|
+
"type": "string"
|
|
524
|
+
},
|
|
525
|
+
"startupTimeout": {
|
|
526
|
+
"type": "integer",
|
|
527
|
+
"exclusiveMinimum": 0
|
|
528
|
+
},
|
|
529
|
+
"shutdownTimeout": {
|
|
530
|
+
"type": "integer",
|
|
531
|
+
"exclusiveMinimum": 0
|
|
532
|
+
},
|
|
533
|
+
"restartOnCrash": {
|
|
534
|
+
"type": "boolean"
|
|
535
|
+
},
|
|
536
|
+
"maxRestarts": {
|
|
537
|
+
"type": "integer",
|
|
538
|
+
"minimum": 0
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
"lspServersValue": {
|
|
543
|
+
"description": "LSP server config: a path string, path config, or an inline map of server name to server config.",
|
|
544
|
+
"oneOf": [
|
|
545
|
+
{
|
|
546
|
+
"$ref": "#/$defs/pluginPath"
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"$ref": "#/$defs/pathConfig"
|
|
550
|
+
},
|
|
551
|
+
{
|
|
552
|
+
"type": "object",
|
|
553
|
+
"description": "Inline server map. Each key is a server name.",
|
|
554
|
+
"additionalProperties": {
|
|
555
|
+
"$ref": "#/$defs/lspServer"
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
]
|
|
559
|
+
},
|
|
560
|
+
"vendorId": {
|
|
561
|
+
"type": "string",
|
|
562
|
+
"enum": ["claude-code", "cursor", "codex", "copilot-cli"],
|
|
563
|
+
"description": "Recognized vendor target identifier."
|
|
564
|
+
},
|
|
565
|
+
"userConfigItem": {
|
|
566
|
+
"type": "object",
|
|
567
|
+
"required": ["type", "title", "description"],
|
|
568
|
+
"additionalProperties": false,
|
|
569
|
+
"properties": {
|
|
570
|
+
"type": {
|
|
571
|
+
"type": "string",
|
|
572
|
+
"enum": ["string", "number", "boolean", "directory", "file"]
|
|
573
|
+
},
|
|
574
|
+
"title": {
|
|
575
|
+
"type": "string",
|
|
576
|
+
"description": "Label shown in the configuration dialog."
|
|
577
|
+
},
|
|
578
|
+
"description": {
|
|
579
|
+
"type": "string",
|
|
580
|
+
"description": "Help text shown below the input."
|
|
581
|
+
},
|
|
582
|
+
"required": {
|
|
583
|
+
"type": "boolean"
|
|
584
|
+
},
|
|
585
|
+
"default": {
|
|
586
|
+
"description": "Default value. Type must match the 'type' field."
|
|
587
|
+
},
|
|
588
|
+
"multiple": {
|
|
589
|
+
"type": "boolean",
|
|
590
|
+
"description": "Array of strings. Only valid when type is 'string'."
|
|
591
|
+
},
|
|
592
|
+
"sensitive": {
|
|
593
|
+
"type": "boolean",
|
|
594
|
+
"description": "Store securely (e.g. keychain). Only valid when type is 'string'."
|
|
595
|
+
},
|
|
596
|
+
"min": {
|
|
597
|
+
"type": "number",
|
|
598
|
+
"description": "Minimum value. Only valid when type is 'number'."
|
|
599
|
+
},
|
|
600
|
+
"max": {
|
|
601
|
+
"type": "number",
|
|
602
|
+
"description": "Maximum value. Only valid when type is 'number'."
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
},
|
|
606
|
+
"channelEntry": {
|
|
607
|
+
"type": "object",
|
|
608
|
+
"required": ["server"],
|
|
609
|
+
"additionalProperties": false,
|
|
610
|
+
"properties": {
|
|
611
|
+
"server": {
|
|
612
|
+
"type": "string",
|
|
613
|
+
"description": "MCP server name as declared in mcpServers."
|
|
614
|
+
},
|
|
615
|
+
"displayName": {
|
|
616
|
+
"type": "string"
|
|
617
|
+
},
|
|
618
|
+
"userConfig": {
|
|
619
|
+
"type": "object",
|
|
620
|
+
"additionalProperties": {
|
|
621
|
+
"$ref": "#/$defs/userConfigItem"
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
},
|
|
626
|
+
"monitorEntry": {
|
|
627
|
+
"type": "object",
|
|
628
|
+
"required": ["name", "command", "description"],
|
|
629
|
+
"additionalProperties": false,
|
|
630
|
+
"properties": {
|
|
631
|
+
"name": {
|
|
632
|
+
"type": "string"
|
|
633
|
+
},
|
|
634
|
+
"command": {
|
|
635
|
+
"type": "string",
|
|
636
|
+
"description": "Supports ${PLUGIN_ROOT}, ${PLUGIN_DATA}, ${user_config.*}, and env vars."
|
|
637
|
+
},
|
|
638
|
+
"description": {
|
|
639
|
+
"type": "string"
|
|
640
|
+
},
|
|
641
|
+
"when": {
|
|
642
|
+
"type": "string",
|
|
643
|
+
"description": "When to run. 'always' or 'on-skill-invoke:<skill-name>'.",
|
|
644
|
+
"default": "always"
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
"harnesses": {
|
|
649
|
+
"type": "object",
|
|
650
|
+
"additionalProperties": false,
|
|
651
|
+
"description": "Per-harness manifest overrides, keyed by vendor id. Each block is copied verbatim into that harness's derived manifest.",
|
|
652
|
+
"properties": {
|
|
653
|
+
"claude-code": {
|
|
654
|
+
"$ref": "#/$defs/harnessExtensionClaudeCode"
|
|
655
|
+
},
|
|
656
|
+
"cursor": {
|
|
657
|
+
"$ref": "#/$defs/harnessExtensionCursor"
|
|
658
|
+
},
|
|
659
|
+
"codex": {
|
|
660
|
+
"$ref": "#/$defs/harnessExtensionCodex"
|
|
661
|
+
},
|
|
662
|
+
"copilot-cli": {
|
|
663
|
+
"$ref": "#/$defs/harnessExtensionCopilotCli"
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
},
|
|
667
|
+
"harnessExtensionClaudeCode": {
|
|
668
|
+
"type": "object",
|
|
669
|
+
"additionalProperties": true,
|
|
670
|
+
"description": "Per-harness overrides merged into the derived .claude-plugin/plugin.json (was vendorExtensions['claude-code']).",
|
|
671
|
+
"properties": {
|
|
672
|
+
"displayName": {
|
|
673
|
+
"type": "string"
|
|
674
|
+
},
|
|
675
|
+
"defaultEnabled": {
|
|
676
|
+
"type": "boolean"
|
|
677
|
+
},
|
|
678
|
+
"dependencies": {
|
|
679
|
+
"type": "array",
|
|
680
|
+
"items": {
|
|
681
|
+
"oneOf": [
|
|
682
|
+
{
|
|
683
|
+
"type": "string"
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
"type": "object",
|
|
687
|
+
"required": ["name"],
|
|
688
|
+
"additionalProperties": false,
|
|
689
|
+
"properties": {
|
|
690
|
+
"name": {
|
|
691
|
+
"type": "string"
|
|
692
|
+
},
|
|
693
|
+
"version": {
|
|
694
|
+
"type": "string"
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
]
|
|
699
|
+
},
|
|
700
|
+
"description": "Inter-plugin dependencies by name or name+version range."
|
|
701
|
+
},
|
|
702
|
+
"themes": {
|
|
703
|
+
"$ref": "#/$defs/pathValue"
|
|
704
|
+
},
|
|
705
|
+
"monitors": {
|
|
706
|
+
"oneOf": [
|
|
707
|
+
{
|
|
708
|
+
"$ref": "#/$defs/pluginPath"
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"$ref": "#/$defs/pathConfig"
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"type": "array",
|
|
715
|
+
"items": {
|
|
716
|
+
"$ref": "#/$defs/monitorEntry"
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
]
|
|
720
|
+
},
|
|
721
|
+
"channels": {
|
|
722
|
+
"type": "array",
|
|
723
|
+
"items": {
|
|
724
|
+
"$ref": "#/$defs/channelEntry"
|
|
725
|
+
}
|
|
726
|
+
},
|
|
727
|
+
"userConfig": {
|
|
728
|
+
"type": "object",
|
|
729
|
+
"additionalProperties": {
|
|
730
|
+
"$ref": "#/$defs/userConfigItem"
|
|
731
|
+
},
|
|
732
|
+
"description": "Prompted at plugin enable time. Keys are config item names."
|
|
733
|
+
},
|
|
734
|
+
"settings": {
|
|
735
|
+
"type": "object",
|
|
736
|
+
"description": "User settings overrides."
|
|
737
|
+
},
|
|
738
|
+
"hooks": {
|
|
739
|
+
"$ref": "#/$defs/vendorOnlyHooksMap",
|
|
740
|
+
"description": "Claude Code-only hook events (e.g. PostToolBatch, UserPromptExpansion). Merged with translated canonical hooks."
|
|
741
|
+
}
|
|
742
|
+
},
|
|
743
|
+
"$comment": "Open by design. The build copies this block verbatim into the derived manifest and holds no opinion on a field it does not translate, so a vendor field newer than this schema must ride along rather than be rejected. The properties below are the ones documented here, not the ones permitted."
|
|
744
|
+
},
|
|
745
|
+
"harnessExtensionCursor": {
|
|
746
|
+
"type": "object",
|
|
747
|
+
"additionalProperties": true,
|
|
748
|
+
"description": "Per-harness overrides merged into the derived .cursor-plugin/plugin.json (was vendorExtensions['cursor']).",
|
|
749
|
+
"properties": {
|
|
750
|
+
"displayName": {
|
|
751
|
+
"type": "string"
|
|
752
|
+
},
|
|
753
|
+
"publisher": {
|
|
754
|
+
"type": "string"
|
|
755
|
+
},
|
|
756
|
+
"logo": {
|
|
757
|
+
"type": "string",
|
|
758
|
+
"description": "Relative path or absolute URL to logo image."
|
|
759
|
+
},
|
|
760
|
+
"category": {
|
|
761
|
+
"type": "string"
|
|
762
|
+
},
|
|
763
|
+
"tags": {
|
|
764
|
+
"type": "array",
|
|
765
|
+
"items": {
|
|
766
|
+
"type": "string"
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
},
|
|
770
|
+
"$comment": "Open by design. The build copies this block verbatim into the derived manifest and holds no opinion on a field it does not translate, so a vendor field newer than this schema must ride along rather than be rejected. The properties below are the ones documented here, not the ones permitted."
|
|
771
|
+
},
|
|
772
|
+
"codexInterface": {
|
|
773
|
+
"type": "object",
|
|
774
|
+
"additionalProperties": false,
|
|
775
|
+
"properties": {
|
|
776
|
+
"displayName": {
|
|
777
|
+
"type": "string"
|
|
778
|
+
},
|
|
779
|
+
"shortDescription": {
|
|
780
|
+
"type": "string"
|
|
781
|
+
},
|
|
782
|
+
"category": {
|
|
783
|
+
"type": "string"
|
|
784
|
+
},
|
|
785
|
+
"websiteURL": {
|
|
786
|
+
"type": "string",
|
|
787
|
+
"format": "uri"
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
},
|
|
791
|
+
"harnessExtensionCodex": {
|
|
792
|
+
"type": "object",
|
|
793
|
+
"additionalProperties": true,
|
|
794
|
+
"description": "Per-harness overrides merged into the derived .codex-plugin/plugin.json (was vendorExtensions['codex']).",
|
|
795
|
+
"properties": {
|
|
796
|
+
"version": {
|
|
797
|
+
"type": "string",
|
|
798
|
+
"description": "Override canonical version for Codex. Required if not set in canonical fields."
|
|
799
|
+
},
|
|
800
|
+
"description": {
|
|
801
|
+
"type": "string",
|
|
802
|
+
"description": "Override canonical description for Codex. Required if not set in canonical fields."
|
|
803
|
+
},
|
|
804
|
+
"apps": {
|
|
805
|
+
"$ref": "#/$defs/pathValue",
|
|
806
|
+
"description": ".app.json for connector/app integrations."
|
|
807
|
+
},
|
|
808
|
+
"interface": {
|
|
809
|
+
"$ref": "#/$defs/codexInterface"
|
|
810
|
+
}
|
|
811
|
+
},
|
|
812
|
+
"$comment": "Open by design. The build copies this block verbatim into the derived manifest and holds no opinion on a field it does not translate, so a vendor field newer than this schema must ride along rather than be rejected. The properties below are the ones documented here, not the ones permitted."
|
|
813
|
+
},
|
|
814
|
+
"harnessExtensionCopilotCli": {
|
|
815
|
+
"type": "object",
|
|
816
|
+
"additionalProperties": true,
|
|
817
|
+
"description": "Per-harness overrides merged into the derived plugin.json for Copilot CLI (was vendorExtensions['copilot-cli']).",
|
|
818
|
+
"properties": {
|
|
819
|
+
"category": {
|
|
820
|
+
"type": "string"
|
|
821
|
+
},
|
|
822
|
+
"tags": {
|
|
823
|
+
"type": "array",
|
|
824
|
+
"items": {
|
|
825
|
+
"type": "string"
|
|
826
|
+
}
|
|
827
|
+
},
|
|
828
|
+
"hooks": {
|
|
829
|
+
"$ref": "#/$defs/vendorOnlyHooksMap",
|
|
830
|
+
"description": "Copilot CLI-only hook events (e.g. agentStop, permissionRequest, notification). Merged with translated canonical hooks."
|
|
831
|
+
}
|
|
832
|
+
},
|
|
833
|
+
"$comment": "Open by design. The build copies this block verbatim into the derived manifest and holds no opinion on a field it does not translate, so a vendor field newer than this schema must ride along rather than be rejected. The properties below are the ones documented here, not the ones permitted."
|
|
834
|
+
},
|
|
835
|
+
"vendorOnlyHooksMap": {
|
|
836
|
+
"type": "object",
|
|
837
|
+
"description": "Vendor-specific hook events not in the canonical event set. Keys are vendor-native event names (any string).",
|
|
838
|
+
"additionalProperties": {
|
|
839
|
+
"type": "array",
|
|
840
|
+
"items": {
|
|
841
|
+
"$ref": "#/$defs/hookRule"
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
}
|