@orchid-labs/pluxx 0.1.1 → 0.1.3
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 +25 -8
- package/bin/pluxx.js +19 -28
- package/dist/agents.d.ts +16 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/cli/agent.d.ts +62 -0
- package/dist/cli/agent.d.ts.map +1 -1
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/entry.d.ts +2 -0
- package/dist/cli/entry.d.ts.map +1 -0
- package/dist/cli/index.d.ts +7 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +21810 -0
- package/dist/cli/init-from-mcp.d.ts +17 -1
- package/dist/cli/init-from-mcp.d.ts.map +1 -1
- package/dist/cli/install.d.ts +1 -0
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/lint.d.ts +3 -1
- package/dist/cli/lint.d.ts.map +1 -1
- package/dist/cli/mcp-proxy.d.ts.map +1 -1
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/primitive-summary.d.ts +14 -0
- package/dist/cli/primitive-summary.d.ts.map +1 -0
- package/dist/cli/prompt.d.ts +1 -1
- package/dist/cli/publish.d.ts +6 -1
- package/dist/cli/publish.d.ts.map +1 -1
- package/dist/cli/sync-from-mcp.d.ts.map +1 -1
- package/dist/cli/verify-install.d.ts +25 -0
- package/dist/cli/verify-install.d.ts.map +1 -0
- package/dist/commands.d.ts +10 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/compiler-intent.d.ts +165 -0
- package/dist/compiler-intent.d.ts.map +1 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/delegation.d.ts +11 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/generators/amp/index.d.ts.map +1 -1
- package/dist/generators/base.d.ts +5 -0
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/claude-code/index.d.ts.map +1 -1
- package/dist/generators/cline/index.d.ts.map +1 -1
- package/dist/generators/codex/index.d.ts +4 -0
- package/dist/generators/codex/index.d.ts.map +1 -1
- package/dist/generators/cursor/index.d.ts +1 -0
- package/dist/generators/cursor/index.d.ts.map +1 -1
- package/dist/generators/gemini-cli/index.d.ts.map +1 -1
- package/dist/generators/github-copilot/index.d.ts.map +1 -1
- package/dist/generators/opencode/index.d.ts +1 -0
- package/dist/generators/opencode/index.d.ts.map +1 -1
- package/dist/generators/openhands/index.d.ts.map +1 -1
- package/dist/generators/roo-code/index.d.ts.map +1 -1
- package/dist/generators/shared/claude-family.d.ts.map +1 -1
- package/dist/generators/warp/index.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5371 -553
- package/dist/schema.d.ts +91 -42
- package/dist/schema.d.ts.map +1 -1
- package/dist/text-files.d.ts +5 -0
- package/dist/text-files.d.ts.map +1 -0
- package/dist/validation/platform-rules.d.ts +15 -1
- package/dist/validation/platform-rules.d.ts.map +1 -1
- package/package.json +15 -13
- package/src/cli/agent.ts +0 -1455
- package/src/cli/dev.ts +0 -112
- package/src/cli/doctor.ts +0 -987
- package/src/cli/eval.ts +0 -470
- package/src/cli/index.ts +0 -2933
- package/src/cli/init-from-mcp.ts +0 -2115
- package/src/cli/install.ts +0 -860
- package/src/cli/lint.ts +0 -1249
- package/src/cli/mcp-proxy.ts +0 -322
- package/src/cli/migrate.ts +0 -867
- package/src/cli/prompt.ts +0 -82
- package/src/cli/publish.ts +0 -401
- package/src/cli/runtime.ts +0 -86
- package/src/cli/sync-from-mcp.ts +0 -586
- package/src/cli/test.ts +0 -142
- package/src/compatibility/matrix.ts +0 -149
- package/src/config/define.ts +0 -20
- package/src/config/load.ts +0 -74
- package/src/generators/amp/index.ts +0 -63
- package/src/generators/base.ts +0 -188
- package/src/generators/claude-code/index.ts +0 -172
- package/src/generators/cline/index.ts +0 -35
- package/src/generators/codex/index.ts +0 -143
- package/src/generators/cursor/index.ts +0 -158
- package/src/generators/gemini-cli/index.ts +0 -83
- package/src/generators/github-copilot/index.ts +0 -32
- package/src/generators/hooks-warning.ts +0 -51
- package/src/generators/index.ts +0 -71
- package/src/generators/opencode/index.ts +0 -526
- package/src/generators/openhands/index.ts +0 -32
- package/src/generators/roo-code/index.ts +0 -35
- package/src/generators/shared/claude-family.ts +0 -215
- package/src/generators/warp/index.ts +0 -32
- package/src/hook-events.ts +0 -33
- package/src/index.ts +0 -34
- package/src/mcp/introspect.ts +0 -1107
- package/src/permissions.ts +0 -260
- package/src/schema.ts +0 -312
- package/src/user-config.ts +0 -177
- package/src/validation/platform-rules.ts +0 -686
|
@@ -1,686 +0,0 @@
|
|
|
1
|
-
import type { TargetPlatform } from '../schema'
|
|
2
|
-
|
|
3
|
-
type RuleLevel = 'required' | 'supported' | 'fallback' | 'optional' | 'unknown'
|
|
4
|
-
|
|
5
|
-
export interface PlatformRuleSource {
|
|
6
|
-
label: string
|
|
7
|
-
url: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export type PlatformLimitKind = 'hard' | 'advisory' | 'display'
|
|
11
|
-
|
|
12
|
-
export interface PlatformLimitPolicy {
|
|
13
|
-
kind: PlatformLimitKind
|
|
14
|
-
notes?: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface PlatformLimits {
|
|
18
|
-
skillDescriptionMax: number | null
|
|
19
|
-
skillDescriptionDisplayMax: number | null
|
|
20
|
-
skillListingBudgetMax: number | null
|
|
21
|
-
skillNameMax: number
|
|
22
|
-
skillNameMustMatchDir: boolean
|
|
23
|
-
manifestPromptMax: number | null
|
|
24
|
-
manifestPromptCountMax: number | null
|
|
25
|
-
manifestPathPrefix: string | null
|
|
26
|
-
instructionsMaxBytes: number | null
|
|
27
|
-
hooksFeatureFlag: string | null
|
|
28
|
-
rulesMaxLines: number | null
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface PlatformLimitPolicies {
|
|
32
|
-
skillDescriptionMax: PlatformLimitPolicy | null
|
|
33
|
-
skillDescriptionDisplayMax: PlatformLimitPolicy | null
|
|
34
|
-
skillListingBudgetMax: PlatformLimitPolicy | null
|
|
35
|
-
skillNameMax: PlatformLimitPolicy
|
|
36
|
-
skillNameMustMatchDir: PlatformLimitPolicy
|
|
37
|
-
manifestPromptMax: PlatformLimitPolicy | null
|
|
38
|
-
manifestPromptCountMax: PlatformLimitPolicy | null
|
|
39
|
-
manifestPathPrefix: PlatformLimitPolicy | null
|
|
40
|
-
instructionsMaxBytes: PlatformLimitPolicy | null
|
|
41
|
-
hooksFeatureFlag: PlatformLimitPolicy | null
|
|
42
|
-
rulesMaxLines: PlatformLimitPolicy | null
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface PlatformRules {
|
|
46
|
-
platform: TargetPlatform
|
|
47
|
-
summary: string
|
|
48
|
-
limits: PlatformLimits
|
|
49
|
-
limitPolicies: PlatformLimitPolicies
|
|
50
|
-
skillDiscoveryDirs: {
|
|
51
|
-
path: string
|
|
52
|
-
level: RuleLevel
|
|
53
|
-
notes?: string
|
|
54
|
-
}[]
|
|
55
|
-
frontmatter: {
|
|
56
|
-
standard: string[]
|
|
57
|
-
additional: string[]
|
|
58
|
-
notes?: string
|
|
59
|
-
}
|
|
60
|
-
manifest: {
|
|
61
|
-
files: string[]
|
|
62
|
-
required: boolean
|
|
63
|
-
notes?: string
|
|
64
|
-
}
|
|
65
|
-
mcp: {
|
|
66
|
-
files: string[]
|
|
67
|
-
rootKey?: string
|
|
68
|
-
transports: string[]
|
|
69
|
-
auth: string[]
|
|
70
|
-
notes?: string
|
|
71
|
-
}
|
|
72
|
-
hooks: {
|
|
73
|
-
supported: boolean
|
|
74
|
-
files: string[]
|
|
75
|
-
eventNames: string[]
|
|
76
|
-
notes?: string
|
|
77
|
-
}
|
|
78
|
-
instructions: {
|
|
79
|
-
files: string[]
|
|
80
|
-
format: string
|
|
81
|
-
notes?: string
|
|
82
|
-
}
|
|
83
|
-
sources: PlatformRuleSource[]
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const STANDARD_SKILL_FRONTMATTER = [
|
|
87
|
-
'name',
|
|
88
|
-
'description',
|
|
89
|
-
'license',
|
|
90
|
-
'compatibility',
|
|
91
|
-
'metadata',
|
|
92
|
-
'disable-model-invocation',
|
|
93
|
-
] as const
|
|
94
|
-
|
|
95
|
-
const NULL_LIMITS: PlatformLimits = {
|
|
96
|
-
skillDescriptionMax: null,
|
|
97
|
-
skillDescriptionDisplayMax: null,
|
|
98
|
-
skillListingBudgetMax: null,
|
|
99
|
-
skillNameMax: 64,
|
|
100
|
-
skillNameMustMatchDir: false,
|
|
101
|
-
manifestPromptMax: null,
|
|
102
|
-
manifestPromptCountMax: null,
|
|
103
|
-
manifestPathPrefix: null,
|
|
104
|
-
instructionsMaxBytes: null,
|
|
105
|
-
hooksFeatureFlag: null,
|
|
106
|
-
rulesMaxLines: null,
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const NULL_LIMIT_POLICIES: PlatformLimitPolicies = {
|
|
110
|
-
skillDescriptionMax: null,
|
|
111
|
-
skillDescriptionDisplayMax: null,
|
|
112
|
-
skillListingBudgetMax: null,
|
|
113
|
-
skillNameMax: { kind: 'hard' },
|
|
114
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
115
|
-
manifestPromptMax: null,
|
|
116
|
-
manifestPromptCountMax: null,
|
|
117
|
-
manifestPathPrefix: null,
|
|
118
|
-
instructionsMaxBytes: null,
|
|
119
|
-
hooksFeatureFlag: null,
|
|
120
|
-
rulesMaxLines: null,
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export const PLATFORM_LIMITS: Record<TargetPlatform, PlatformLimits> = {
|
|
124
|
-
'claude-code': {
|
|
125
|
-
...NULL_LIMITS,
|
|
126
|
-
skillDescriptionMax: 1536,
|
|
127
|
-
skillDescriptionDisplayMax: 250,
|
|
128
|
-
skillListingBudgetMax: 8000,
|
|
129
|
-
},
|
|
130
|
-
'codex': {
|
|
131
|
-
...NULL_LIMITS,
|
|
132
|
-
skillDescriptionMax: 1024,
|
|
133
|
-
skillNameMustMatchDir: true,
|
|
134
|
-
manifestPromptMax: 128,
|
|
135
|
-
manifestPromptCountMax: 3,
|
|
136
|
-
manifestPathPrefix: './',
|
|
137
|
-
instructionsMaxBytes: 32768,
|
|
138
|
-
hooksFeatureFlag: 'codex_hooks',
|
|
139
|
-
},
|
|
140
|
-
'cursor': {
|
|
141
|
-
...NULL_LIMITS,
|
|
142
|
-
skillNameMustMatchDir: true,
|
|
143
|
-
rulesMaxLines: 500,
|
|
144
|
-
},
|
|
145
|
-
'opencode': {
|
|
146
|
-
...NULL_LIMITS,
|
|
147
|
-
skillDescriptionMax: 1024,
|
|
148
|
-
skillNameMustMatchDir: true,
|
|
149
|
-
},
|
|
150
|
-
'github-copilot': {
|
|
151
|
-
...NULL_LIMITS,
|
|
152
|
-
skillDescriptionDisplayMax: 250,
|
|
153
|
-
},
|
|
154
|
-
'openhands': {
|
|
155
|
-
...NULL_LIMITS,
|
|
156
|
-
},
|
|
157
|
-
'warp': {
|
|
158
|
-
...NULL_LIMITS,
|
|
159
|
-
},
|
|
160
|
-
'gemini-cli': {
|
|
161
|
-
...NULL_LIMITS,
|
|
162
|
-
skillNameMustMatchDir: true,
|
|
163
|
-
},
|
|
164
|
-
'roo-code': {
|
|
165
|
-
...NULL_LIMITS,
|
|
166
|
-
},
|
|
167
|
-
'cline': {
|
|
168
|
-
...NULL_LIMITS,
|
|
169
|
-
skillDescriptionMax: 1024,
|
|
170
|
-
skillNameMustMatchDir: true,
|
|
171
|
-
},
|
|
172
|
-
'amp': {
|
|
173
|
-
...NULL_LIMITS,
|
|
174
|
-
},
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export const PLATFORM_LIMIT_POLICIES: Record<TargetPlatform, PlatformLimitPolicies> = {
|
|
178
|
-
'claude-code': {
|
|
179
|
-
...NULL_LIMIT_POLICIES,
|
|
180
|
-
skillDescriptionMax: {
|
|
181
|
-
kind: 'hard',
|
|
182
|
-
notes: 'Claude skills listing caps description + when_to_use combined at 1,536 characters.',
|
|
183
|
-
},
|
|
184
|
-
skillDescriptionDisplayMax: {
|
|
185
|
-
kind: 'display',
|
|
186
|
-
notes: 'Claude surfaces commonly truncate long listing text around 250 characters.',
|
|
187
|
-
},
|
|
188
|
-
skillListingBudgetMax: {
|
|
189
|
-
kind: 'advisory',
|
|
190
|
-
notes: 'Pluxx warns at 8,000 aggregate characters to keep Claude listings readable and avoid crowded discovery surfaces.',
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
'codex': {
|
|
194
|
-
...NULL_LIMIT_POLICIES,
|
|
195
|
-
skillDescriptionMax: { kind: 'hard' },
|
|
196
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
197
|
-
manifestPromptMax: { kind: 'hard' },
|
|
198
|
-
manifestPromptCountMax: { kind: 'hard' },
|
|
199
|
-
manifestPathPrefix: { kind: 'hard' },
|
|
200
|
-
instructionsMaxBytes: {
|
|
201
|
-
kind: 'hard',
|
|
202
|
-
notes: 'Codex AGENTS.md/project docs truncate at 32 KiB.',
|
|
203
|
-
},
|
|
204
|
-
hooksFeatureFlag: {
|
|
205
|
-
kind: 'hard',
|
|
206
|
-
notes: 'Hook support depends on the Codex hooks feature flag/runtime support.',
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
'cursor': {
|
|
210
|
-
...NULL_LIMIT_POLICIES,
|
|
211
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
212
|
-
rulesMaxLines: {
|
|
213
|
-
kind: 'advisory',
|
|
214
|
-
notes: 'Cursor docs treat 500 lines as practical guidance rather than a documented hard cap.',
|
|
215
|
-
},
|
|
216
|
-
},
|
|
217
|
-
'opencode': {
|
|
218
|
-
...NULL_LIMIT_POLICIES,
|
|
219
|
-
skillDescriptionMax: { kind: 'hard' },
|
|
220
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
221
|
-
},
|
|
222
|
-
'github-copilot': {
|
|
223
|
-
...NULL_LIMIT_POLICIES,
|
|
224
|
-
skillDescriptionDisplayMax: { kind: 'display' },
|
|
225
|
-
},
|
|
226
|
-
'openhands': {
|
|
227
|
-
...NULL_LIMIT_POLICIES,
|
|
228
|
-
},
|
|
229
|
-
'warp': {
|
|
230
|
-
...NULL_LIMIT_POLICIES,
|
|
231
|
-
},
|
|
232
|
-
'gemini-cli': {
|
|
233
|
-
...NULL_LIMIT_POLICIES,
|
|
234
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
235
|
-
},
|
|
236
|
-
'roo-code': {
|
|
237
|
-
...NULL_LIMIT_POLICIES,
|
|
238
|
-
},
|
|
239
|
-
'cline': {
|
|
240
|
-
...NULL_LIMIT_POLICIES,
|
|
241
|
-
skillDescriptionMax: { kind: 'hard' },
|
|
242
|
-
skillNameMustMatchDir: { kind: 'hard' },
|
|
243
|
-
},
|
|
244
|
-
'amp': {
|
|
245
|
-
...NULL_LIMIT_POLICIES,
|
|
246
|
-
},
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
type ResearchTarget = Extract<
|
|
250
|
-
TargetPlatform,
|
|
251
|
-
| 'claude-code'
|
|
252
|
-
| 'cursor'
|
|
253
|
-
| 'codex'
|
|
254
|
-
| 'opencode'
|
|
255
|
-
| 'openhands'
|
|
256
|
-
| 'warp'
|
|
257
|
-
| 'gemini-cli'
|
|
258
|
-
| 'roo-code'
|
|
259
|
-
| 'cline'
|
|
260
|
-
| 'amp'
|
|
261
|
-
>
|
|
262
|
-
|
|
263
|
-
export const PLATFORM_VALIDATION_RULES: Record<ResearchTarget, PlatformRules> = {
|
|
264
|
-
'claude-code': {
|
|
265
|
-
platform: 'claude-code',
|
|
266
|
-
summary: 'Claude Code plugins use an optional manifest at .claude-plugin/plugin.json with auto-discovery for skills, commands, agents, hooks, MCP, and output styles.',
|
|
267
|
-
limits: PLATFORM_LIMITS['claude-code'],
|
|
268
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['claude-code'],
|
|
269
|
-
skillDiscoveryDirs: [
|
|
270
|
-
{ path: 'skills/', level: 'supported' },
|
|
271
|
-
],
|
|
272
|
-
frontmatter: {
|
|
273
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
274
|
-
additional: [],
|
|
275
|
-
},
|
|
276
|
-
manifest: {
|
|
277
|
-
files: ['.claude-plugin/plugin.json'],
|
|
278
|
-
required: false,
|
|
279
|
-
notes: 'The manifest is optional; if present, name is the only required field.',
|
|
280
|
-
},
|
|
281
|
-
mcp: {
|
|
282
|
-
files: ['.mcp.json'],
|
|
283
|
-
rootKey: 'mcpServers',
|
|
284
|
-
transports: ['stdio', 'http', 'sse'],
|
|
285
|
-
auth: ['headers', 'env interpolation'],
|
|
286
|
-
notes: 'Claude Code supports either inline MCP config in plugin.json or a separate .mcp.json file.',
|
|
287
|
-
},
|
|
288
|
-
hooks: {
|
|
289
|
-
supported: true,
|
|
290
|
-
files: ['hooks/hooks.json'],
|
|
291
|
-
eventNames: [],
|
|
292
|
-
notes: 'Hook configs can be stored in hooks/hooks.json or inlined in plugin.json.',
|
|
293
|
-
},
|
|
294
|
-
instructions: {
|
|
295
|
-
files: ['CLAUDE.md'],
|
|
296
|
-
format: 'markdown',
|
|
297
|
-
},
|
|
298
|
-
sources: [
|
|
299
|
-
{ label: 'Claude Code headless docs', url: 'https://code.claude.com/docs/en/headless' },
|
|
300
|
-
{ label: 'Claude Code CLI reference', url: 'https://code.claude.com/docs/en/cli-reference' },
|
|
301
|
-
{ label: 'Claude Code discover plugins docs', url: 'https://code.claude.com/docs/en/discover-plugins' },
|
|
302
|
-
{ label: 'Claude Code plugins reference', url: 'https://code.claude.com/docs/en/plugins-reference' },
|
|
303
|
-
{ label: 'Claude Code hooks docs', url: 'https://code.claude.com/docs/en/hooks' },
|
|
304
|
-
{ label: 'Claude Code skills docs', url: 'https://code.claude.com/docs/en/skills' },
|
|
305
|
-
],
|
|
306
|
-
},
|
|
307
|
-
'cursor': {
|
|
308
|
-
platform: 'cursor',
|
|
309
|
-
summary: 'Cursor plugins use .cursor-plugin/plugin.json plus auto-discovered rules, skills, agents, commands, hooks, and mcp.json at the plugin root; Cursor subagents are a related but separate surface under .cursor/agents and ~/.cursor/agents.',
|
|
310
|
-
limits: PLATFORM_LIMITS['cursor'],
|
|
311
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['cursor'],
|
|
312
|
-
skillDiscoveryDirs: [
|
|
313
|
-
{ path: 'skills/', level: 'supported' },
|
|
314
|
-
{ path: 'SKILL.md', level: 'fallback', notes: 'Used when no skills directory or manifest skill path is present.' },
|
|
315
|
-
],
|
|
316
|
-
frontmatter: {
|
|
317
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
318
|
-
additional: [],
|
|
319
|
-
},
|
|
320
|
-
manifest: {
|
|
321
|
-
files: ['.cursor-plugin/plugin.json'],
|
|
322
|
-
required: true,
|
|
323
|
-
notes: 'Cursor documents plugin.json as the required plugin manifest.',
|
|
324
|
-
},
|
|
325
|
-
mcp: {
|
|
326
|
-
files: ['mcp.json'],
|
|
327
|
-
rootKey: 'mcpServers',
|
|
328
|
-
transports: ['stdio', 'http', 'sse'],
|
|
329
|
-
auth: ['headers', 'env interpolation'],
|
|
330
|
-
},
|
|
331
|
-
hooks: {
|
|
332
|
-
supported: true,
|
|
333
|
-
files: ['hooks/hooks.json'],
|
|
334
|
-
eventNames: [],
|
|
335
|
-
notes: 'Cursor plugin hooks live under hooks/hooks.json; project hooks also exist separately in .cursor/hooks.json.',
|
|
336
|
-
},
|
|
337
|
-
instructions: {
|
|
338
|
-
files: ['rules/', 'AGENTS.md'],
|
|
339
|
-
format: 'mdc + markdown',
|
|
340
|
-
notes: 'rules/ is the plugin-native instruction surface. AGENTS.md remains useful as shared repo guidance. Cursor subagents use markdown files under .cursor/agents or ~/.cursor/agents (with .claude/.codex compatibility paths).',
|
|
341
|
-
},
|
|
342
|
-
sources: [
|
|
343
|
-
{ label: 'Cursor plugins reference', url: 'https://cursor.com/docs/reference/plugins' },
|
|
344
|
-
{ label: 'Cursor plugins overview', url: 'https://cursor.com/docs/plugins' },
|
|
345
|
-
{ label: 'Cursor hooks docs', url: 'https://cursor.com/docs/hooks' },
|
|
346
|
-
{ label: 'Cursor skills docs', url: 'https://cursor.com/docs/skills' },
|
|
347
|
-
{ label: 'Cursor rules docs', url: 'https://cursor.com/docs/rules' },
|
|
348
|
-
{ label: 'Cursor MCP docs', url: 'https://cursor.com/docs/mcp' },
|
|
349
|
-
{ label: 'Cursor CLI headless docs', url: 'https://cursor.com/docs/cli/headless' },
|
|
350
|
-
{ label: 'Cursor CLI parameters', url: 'https://cursor.com/docs/cli/reference/parameters' },
|
|
351
|
-
{ label: 'Cursor CLI authentication', url: 'https://cursor.com/docs/cli/reference/authentication' },
|
|
352
|
-
{ label: 'Cursor subagents docs', url: 'https://cursor.com/docs/subagents' },
|
|
353
|
-
],
|
|
354
|
-
},
|
|
355
|
-
'codex': {
|
|
356
|
-
platform: 'codex',
|
|
357
|
-
summary: 'Codex plugins use .codex-plugin/plugin.json with skills, .mcp.json, optional app mappings, and AGENTS.md; current docs separate plugin packaging from hooks configuration and do not document plugin-provided slash commands.',
|
|
358
|
-
limits: PLATFORM_LIMITS['codex'],
|
|
359
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['codex'],
|
|
360
|
-
skillDiscoveryDirs: [
|
|
361
|
-
{ path: 'skills/', level: 'supported' },
|
|
362
|
-
],
|
|
363
|
-
frontmatter: {
|
|
364
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
365
|
-
additional: [],
|
|
366
|
-
},
|
|
367
|
-
manifest: {
|
|
368
|
-
files: ['.codex-plugin/plugin.json'],
|
|
369
|
-
required: true,
|
|
370
|
-
notes: 'The build plugins guide documents plugin.json, skills/, .mcp.json, .app.json, and assets/ as the standard plugin structure.',
|
|
371
|
-
},
|
|
372
|
-
mcp: {
|
|
373
|
-
files: ['.mcp.json'],
|
|
374
|
-
rootKey: 'mcpServers',
|
|
375
|
-
transports: ['stdio', 'http', 'sse'],
|
|
376
|
-
auth: ['bearer_token_env_var', 'env_http_headers', 'http_headers', 'platform-managed auth'],
|
|
377
|
-
notes: 'The current build guide documents mcpServers as a path to .mcp.json in the plugin bundle.',
|
|
378
|
-
},
|
|
379
|
-
hooks: {
|
|
380
|
-
supported: true,
|
|
381
|
-
files: ['.codex/hooks.json', '~/.codex/hooks.json'],
|
|
382
|
-
eventNames: [],
|
|
383
|
-
notes: 'Codex documents hooks in project/user config, but the current plugin build guide does not document plugin-packaged hooks.',
|
|
384
|
-
},
|
|
385
|
-
instructions: {
|
|
386
|
-
files: ['AGENTS.md'],
|
|
387
|
-
format: 'markdown',
|
|
388
|
-
},
|
|
389
|
-
sources: [
|
|
390
|
-
{ label: 'Codex build plugins docs', url: 'https://developers.openai.com/codex/plugins/build' },
|
|
391
|
-
{ label: 'Codex hooks docs', url: 'https://developers.openai.com/codex/hooks' },
|
|
392
|
-
{ label: 'Codex skills docs', url: 'https://developers.openai.com/codex/skills' },
|
|
393
|
-
{ label: 'Codex MCP docs', url: 'https://developers.openai.com/codex/mcp' },
|
|
394
|
-
{ label: 'Codex AGENTS.md guide', url: 'https://developers.openai.com/codex/guides/agents-md' },
|
|
395
|
-
],
|
|
396
|
-
},
|
|
397
|
-
'opencode': {
|
|
398
|
-
platform: 'opencode',
|
|
399
|
-
summary: 'OpenCode plugins are code-first TypeScript or JavaScript modules that register skills, commands, MCP servers, and hook handlers programmatically.',
|
|
400
|
-
limits: PLATFORM_LIMITS['opencode'],
|
|
401
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['opencode'],
|
|
402
|
-
skillDiscoveryDirs: [
|
|
403
|
-
{ path: 'skills/', level: 'supported' },
|
|
404
|
-
],
|
|
405
|
-
frontmatter: {
|
|
406
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
407
|
-
additional: [],
|
|
408
|
-
},
|
|
409
|
-
manifest: {
|
|
410
|
-
files: ['package.json', 'index.ts'],
|
|
411
|
-
required: true,
|
|
412
|
-
notes: 'OpenCode plugins are loaded as local modules or npm packages rather than a JSON manifest-only bundle.',
|
|
413
|
-
},
|
|
414
|
-
mcp: {
|
|
415
|
-
files: ['index.ts'],
|
|
416
|
-
transports: ['local', 'remote'],
|
|
417
|
-
auth: ['headers', 'programmatic env interpolation', 'OAuth'],
|
|
418
|
-
notes: 'OpenCode plugin code mutates Config["mcp"] programmatically; the underlying platform config supports local and remote servers.',
|
|
419
|
-
},
|
|
420
|
-
hooks: {
|
|
421
|
-
supported: true,
|
|
422
|
-
files: ['index.ts'],
|
|
423
|
-
eventNames: [],
|
|
424
|
-
notes: 'OpenCode hooks are plugin event handlers implemented in code, not a separate hooks.json file.',
|
|
425
|
-
},
|
|
426
|
-
instructions: {
|
|
427
|
-
files: ['index.ts'],
|
|
428
|
-
format: 'typescript',
|
|
429
|
-
notes: 'Plugins inject instructions into the runtime system prompt from code.',
|
|
430
|
-
},
|
|
431
|
-
sources: [
|
|
432
|
-
{ label: 'OpenCode plugins docs', url: 'https://opencode.ai/docs/plugins/' },
|
|
433
|
-
{ label: 'OpenCode skills docs', url: 'https://opencode.ai/docs/skills/' },
|
|
434
|
-
{ label: 'OpenCode MCP servers docs', url: 'https://opencode.ai/docs/mcp-servers/' },
|
|
435
|
-
],
|
|
436
|
-
},
|
|
437
|
-
'openhands': {
|
|
438
|
-
platform: 'openhands',
|
|
439
|
-
summary: 'OpenHands plugins use a Claude-style manifest at .plugin/plugin.json and support skills, hooks, and MCP.',
|
|
440
|
-
limits: PLATFORM_LIMITS['openhands'],
|
|
441
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['openhands'],
|
|
442
|
-
skillDiscoveryDirs: [
|
|
443
|
-
{ path: '.openhands/skills/', level: 'supported' },
|
|
444
|
-
{ path: '.claude/skills/', level: 'supported' },
|
|
445
|
-
{ path: '.agents/skills/', level: 'supported' },
|
|
446
|
-
],
|
|
447
|
-
frontmatter: {
|
|
448
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
449
|
-
additional: ['triggers'],
|
|
450
|
-
notes: 'OpenHands skill docs mention support for trigger metadata in addition to Agent Skills frontmatter.',
|
|
451
|
-
},
|
|
452
|
-
manifest: {
|
|
453
|
-
files: ['.plugin/plugin.json'],
|
|
454
|
-
required: true,
|
|
455
|
-
notes: 'OpenHands plugin docs require a manifest under .plugin.',
|
|
456
|
-
},
|
|
457
|
-
mcp: {
|
|
458
|
-
files: ['.mcp.json'],
|
|
459
|
-
rootKey: 'mcpServers',
|
|
460
|
-
transports: ['stdio', 'http', 'sse'],
|
|
461
|
-
auth: ['headers-based env interpolation'],
|
|
462
|
-
},
|
|
463
|
-
hooks: {
|
|
464
|
-
supported: true,
|
|
465
|
-
files: ['hooks/hooks.json'],
|
|
466
|
-
eventNames: [],
|
|
467
|
-
notes: 'OpenHands supports hook configuration via hooks/hooks.json; event names align with Claude-style hooks in current docs.',
|
|
468
|
-
},
|
|
469
|
-
instructions: {
|
|
470
|
-
files: ['AGENTS.md'],
|
|
471
|
-
format: 'markdown',
|
|
472
|
-
},
|
|
473
|
-
sources: [
|
|
474
|
-
{ label: 'OpenHands plugin guide', url: 'https://docs.openhands.dev/sdk/guides/plugins' },
|
|
475
|
-
{ label: 'OpenHands skill guide', url: 'https://docs.openhands.dev/sdk/guides/skill' },
|
|
476
|
-
],
|
|
477
|
-
},
|
|
478
|
-
'warp': {
|
|
479
|
-
platform: 'warp',
|
|
480
|
-
summary: 'Warp supports skills, rules, and MCP with AGENTS.md as the current rules anchor.',
|
|
481
|
-
limits: PLATFORM_LIMITS['warp'],
|
|
482
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['warp'],
|
|
483
|
-
skillDiscoveryDirs: [
|
|
484
|
-
{ path: '.agents/skills/', level: 'supported' },
|
|
485
|
-
{ path: '.warp/skills/', level: 'supported' },
|
|
486
|
-
{ path: '.claude/skills/', level: 'supported', notes: 'Compatibility directory' },
|
|
487
|
-
{ path: '.codex/skills/', level: 'supported', notes: 'Compatibility directory' },
|
|
488
|
-
],
|
|
489
|
-
frontmatter: {
|
|
490
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
491
|
-
additional: [],
|
|
492
|
-
},
|
|
493
|
-
manifest: {
|
|
494
|
-
files: [],
|
|
495
|
-
required: false,
|
|
496
|
-
notes: 'Warp does not currently require a dedicated plugin manifest file.',
|
|
497
|
-
},
|
|
498
|
-
mcp: {
|
|
499
|
-
files: ['mcp.json'],
|
|
500
|
-
rootKey: 'mcpServers',
|
|
501
|
-
transports: ['stdio', 'http', 'sse'],
|
|
502
|
-
auth: ['headers', 'OAuth (remote server flows)'],
|
|
503
|
-
},
|
|
504
|
-
hooks: {
|
|
505
|
-
supported: false,
|
|
506
|
-
files: [],
|
|
507
|
-
eventNames: [],
|
|
508
|
-
notes: 'Warp docs reviewed for this ticket focus on skills, rules, and MCP; no standalone hooks schema found.',
|
|
509
|
-
},
|
|
510
|
-
instructions: {
|
|
511
|
-
files: ['AGENTS.md', 'WARP.md'],
|
|
512
|
-
format: 'markdown',
|
|
513
|
-
notes: 'AGENTS.md is current; WARP.md is backward compatible.',
|
|
514
|
-
},
|
|
515
|
-
sources: [
|
|
516
|
-
{ label: 'Warp skills docs', url: 'https://docs.warp.dev/agent-platform/capabilities/skills' },
|
|
517
|
-
{ label: 'Warp MCP docs', url: 'https://docs.warp.dev/agent-platform/capabilities/mcp' },
|
|
518
|
-
{ label: 'Warp rules docs', url: 'https://docs.warp.dev/agent-platform/capabilities/rules' },
|
|
519
|
-
],
|
|
520
|
-
},
|
|
521
|
-
'gemini-cli': {
|
|
522
|
-
platform: 'gemini-cli',
|
|
523
|
-
summary: 'Gemini CLI uses gemini-extension.json, GEMINI.md instructions, and hook definitions in hooks/hooks.json.',
|
|
524
|
-
limits: PLATFORM_LIMITS['gemini-cli'],
|
|
525
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['gemini-cli'],
|
|
526
|
-
skillDiscoveryDirs: [
|
|
527
|
-
{ path: 'skills/', level: 'supported' },
|
|
528
|
-
],
|
|
529
|
-
frontmatter: {
|
|
530
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
531
|
-
additional: [],
|
|
532
|
-
},
|
|
533
|
-
manifest: {
|
|
534
|
-
files: ['gemini-extension.json'],
|
|
535
|
-
required: true,
|
|
536
|
-
notes: 'Gemini extensions require a manifest file named gemini-extension.json.',
|
|
537
|
-
},
|
|
538
|
-
mcp: {
|
|
539
|
-
files: ['gemini-extension.json'],
|
|
540
|
-
rootKey: 'mcpServers',
|
|
541
|
-
transports: ['stdio', 'http', 'sse'],
|
|
542
|
-
auth: ['headers', 'env interpolation'],
|
|
543
|
-
},
|
|
544
|
-
hooks: {
|
|
545
|
-
supported: true,
|
|
546
|
-
files: ['hooks/hooks.json'],
|
|
547
|
-
eventNames: [],
|
|
548
|
-
notes: 'Gemini hook docs specify hooks/hooks.json; hook config is separate from gemini-extension.json.',
|
|
549
|
-
},
|
|
550
|
-
instructions: {
|
|
551
|
-
files: ['GEMINI.md'],
|
|
552
|
-
format: 'markdown',
|
|
553
|
-
},
|
|
554
|
-
sources: [
|
|
555
|
-
{ label: 'Gemini extensions docs', url: 'https://geminicli.com/docs/extensions/' },
|
|
556
|
-
{ label: 'Gemini extension reference', url: 'https://geminicli.com/docs/extensions/reference/' },
|
|
557
|
-
{ label: 'Gemini hooks docs', url: 'https://geminicli.com/docs/hooks/' },
|
|
558
|
-
],
|
|
559
|
-
},
|
|
560
|
-
'roo-code': {
|
|
561
|
-
platform: 'roo-code',
|
|
562
|
-
summary: 'Roo Code supports project and mode-specific rules, project-level MCP config, and custom modes metadata.',
|
|
563
|
-
limits: PLATFORM_LIMITS['roo-code'],
|
|
564
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['roo-code'],
|
|
565
|
-
skillDiscoveryDirs: [
|
|
566
|
-
{ path: '.roo/skills/', level: 'supported' },
|
|
567
|
-
],
|
|
568
|
-
frontmatter: {
|
|
569
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
570
|
-
additional: ['mode fields: slug, roleDefinition, whenToUse, customInstructions, groups'],
|
|
571
|
-
notes: 'Additional fields apply to custom mode definitions, not SKILL.md frontmatter.',
|
|
572
|
-
},
|
|
573
|
-
manifest: {
|
|
574
|
-
files: [],
|
|
575
|
-
required: false,
|
|
576
|
-
notes: 'Roo Code does not require a plugin manifest file.',
|
|
577
|
-
},
|
|
578
|
-
mcp: {
|
|
579
|
-
files: ['.roo/mcp.json', 'mcp_settings.json'],
|
|
580
|
-
rootKey: 'mcpServers',
|
|
581
|
-
transports: ['stdio', 'http', 'sse', 'streamable-http'],
|
|
582
|
-
auth: ['headers', 'OAuth', 'provider-specific env'],
|
|
583
|
-
},
|
|
584
|
-
hooks: {
|
|
585
|
-
supported: false,
|
|
586
|
-
files: [],
|
|
587
|
-
eventNames: [],
|
|
588
|
-
notes: 'No standalone hook event schema identified in Roo docs reviewed for this ticket.',
|
|
589
|
-
},
|
|
590
|
-
instructions: {
|
|
591
|
-
files: ['.roo/rules/', '.roo/rules-{modeSlug}/', '.roorules', '.roorules-{modeSlug}'],
|
|
592
|
-
format: 'markdown',
|
|
593
|
-
notes: '.roo/rules/ and mode-specific rules are preferred over legacy .roorules files.',
|
|
594
|
-
},
|
|
595
|
-
sources: [
|
|
596
|
-
{ label: 'Roo custom instructions docs', url: 'https://docs.roocode.com/features/custom-instructions' },
|
|
597
|
-
{ label: 'Roo custom modes docs', url: 'https://docs.roocode.com/features/custom-modes' },
|
|
598
|
-
{ label: 'Roo MCP docs', url: 'https://docs.roocode.com/features/mcp/using-mcp-in-roo' },
|
|
599
|
-
{ label: 'Roo MCP transports docs', url: 'https://docs.roocode.com/features/mcp/server-transports' },
|
|
600
|
-
],
|
|
601
|
-
},
|
|
602
|
-
'cline': {
|
|
603
|
-
platform: 'cline',
|
|
604
|
-
summary: 'Cline supports layered rules, .cline/mcp.json, and conditional rules via frontmatter path globs.',
|
|
605
|
-
limits: PLATFORM_LIMITS['cline'],
|
|
606
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['cline'],
|
|
607
|
-
skillDiscoveryDirs: [
|
|
608
|
-
{ path: '.cline/skills/', level: 'supported' },
|
|
609
|
-
{ path: '.agents/skills/', level: 'supported' },
|
|
610
|
-
],
|
|
611
|
-
frontmatter: {
|
|
612
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
613
|
-
additional: ['paths (for conditional .clinerules entries)'],
|
|
614
|
-
notes: 'The additional field applies to rule files, not SKILL.md.',
|
|
615
|
-
},
|
|
616
|
-
manifest: {
|
|
617
|
-
files: [],
|
|
618
|
-
required: false,
|
|
619
|
-
notes: 'Cline does not require a dedicated plugin manifest file.',
|
|
620
|
-
},
|
|
621
|
-
mcp: {
|
|
622
|
-
files: ['.cline/mcp.json'],
|
|
623
|
-
rootKey: 'mcpServers',
|
|
624
|
-
transports: ['stdio', 'http', 'sse'],
|
|
625
|
-
auth: ['headers', 'env interpolation'],
|
|
626
|
-
notes: 'Current Cline docs align with a Claude-style mcpServers object in project config.',
|
|
627
|
-
},
|
|
628
|
-
hooks: {
|
|
629
|
-
supported: true,
|
|
630
|
-
files: ['.clinerules/hooks/'],
|
|
631
|
-
eventNames: [],
|
|
632
|
-
notes: 'Hook scripts are documented under .clinerules/hooks/ conventions.',
|
|
633
|
-
},
|
|
634
|
-
instructions: {
|
|
635
|
-
files: ['.clinerules/', 'AGENTS.md'],
|
|
636
|
-
format: 'markdown',
|
|
637
|
-
notes: '.clinerules supports both always-on and conditional rule files.',
|
|
638
|
-
},
|
|
639
|
-
sources: [
|
|
640
|
-
{ label: 'Cline rules docs', url: 'https://docs.cline.bot/customization/cline-rules' },
|
|
641
|
-
],
|
|
642
|
-
},
|
|
643
|
-
'amp': {
|
|
644
|
-
platform: 'amp',
|
|
645
|
-
summary: 'AMP uses AGENTS.md/AGENT.md for instruction hierarchy and .amp/settings.json for settings, hooks, and MCP.',
|
|
646
|
-
limits: PLATFORM_LIMITS['amp'],
|
|
647
|
-
limitPolicies: PLATFORM_LIMIT_POLICIES['amp'],
|
|
648
|
-
skillDiscoveryDirs: [
|
|
649
|
-
{ path: '.agents/skills/', level: 'supported' },
|
|
650
|
-
{ path: '~/.config/amp/skills/', level: 'supported' },
|
|
651
|
-
],
|
|
652
|
-
frontmatter: {
|
|
653
|
-
standard: [...STANDARD_SKILL_FRONTMATTER],
|
|
654
|
-
additional: [],
|
|
655
|
-
},
|
|
656
|
-
manifest: {
|
|
657
|
-
files: [],
|
|
658
|
-
required: false,
|
|
659
|
-
notes: 'AMP does not require a standalone plugin manifest file.',
|
|
660
|
-
},
|
|
661
|
-
mcp: {
|
|
662
|
-
files: ['.amp/settings.json', '~/.config/amp/settings.json'],
|
|
663
|
-
rootKey: 'amp.mcpServers',
|
|
664
|
-
transports: ['stdio', 'http'],
|
|
665
|
-
auth: ['headers', 'env interpolation', 'OAuth via server support'],
|
|
666
|
-
},
|
|
667
|
-
hooks: {
|
|
668
|
-
supported: true,
|
|
669
|
-
files: ['.amp/settings.json'],
|
|
670
|
-
eventNames: [],
|
|
671
|
-
notes: 'AMP manual documents hooks within settings, but event naming/details are less explicit than other platforms.',
|
|
672
|
-
},
|
|
673
|
-
instructions: {
|
|
674
|
-
files: ['AGENTS.md', 'AGENT.md'],
|
|
675
|
-
format: 'markdown',
|
|
676
|
-
notes: 'AMP prefers AGENTS.md and falls back to AGENT.md for compatibility.',
|
|
677
|
-
},
|
|
678
|
-
sources: [
|
|
679
|
-
{ label: 'AMP manual', url: 'https://ampcode.com/manual' },
|
|
680
|
-
],
|
|
681
|
-
},
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
export function getPlatformRules(platform: ResearchTarget): PlatformRules {
|
|
685
|
-
return PLATFORM_VALIDATION_RULES[platform]
|
|
686
|
-
}
|