@orchid-labs/pluxx 0.1.1 → 0.1.4

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.
Files changed (103) hide show
  1. package/README.md +25 -8
  2. package/bin/pluxx.js +19 -28
  3. package/dist/agents.d.ts +16 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/cli/agent.d.ts +62 -0
  6. package/dist/cli/agent.d.ts.map +1 -1
  7. package/dist/cli/doctor.d.ts +2 -0
  8. package/dist/cli/doctor.d.ts.map +1 -1
  9. package/dist/cli/entry.d.ts +2 -0
  10. package/dist/cli/entry.d.ts.map +1 -0
  11. package/dist/cli/index.d.ts +7 -1
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +21810 -0
  14. package/dist/cli/init-from-mcp.d.ts +17 -1
  15. package/dist/cli/init-from-mcp.d.ts.map +1 -1
  16. package/dist/cli/install.d.ts +1 -0
  17. package/dist/cli/install.d.ts.map +1 -1
  18. package/dist/cli/lint.d.ts +3 -1
  19. package/dist/cli/lint.d.ts.map +1 -1
  20. package/dist/cli/mcp-proxy.d.ts.map +1 -1
  21. package/dist/cli/migrate.d.ts.map +1 -1
  22. package/dist/cli/primitive-summary.d.ts +14 -0
  23. package/dist/cli/primitive-summary.d.ts.map +1 -0
  24. package/dist/cli/prompt.d.ts +1 -1
  25. package/dist/cli/publish.d.ts +6 -1
  26. package/dist/cli/publish.d.ts.map +1 -1
  27. package/dist/cli/sync-from-mcp.d.ts.map +1 -1
  28. package/dist/cli/verify-install.d.ts +25 -0
  29. package/dist/cli/verify-install.d.ts.map +1 -0
  30. package/dist/commands.d.ts +10 -0
  31. package/dist/commands.d.ts.map +1 -0
  32. package/dist/compiler-intent.d.ts +165 -0
  33. package/dist/compiler-intent.d.ts.map +1 -0
  34. package/dist/config/load.d.ts.map +1 -1
  35. package/dist/delegation.d.ts +11 -0
  36. package/dist/delegation.d.ts.map +1 -0
  37. package/dist/generators/amp/index.d.ts.map +1 -1
  38. package/dist/generators/base.d.ts +5 -0
  39. package/dist/generators/base.d.ts.map +1 -1
  40. package/dist/generators/claude-code/index.d.ts.map +1 -1
  41. package/dist/generators/cline/index.d.ts.map +1 -1
  42. package/dist/generators/codex/index.d.ts +4 -0
  43. package/dist/generators/codex/index.d.ts.map +1 -1
  44. package/dist/generators/cursor/index.d.ts +1 -0
  45. package/dist/generators/cursor/index.d.ts.map +1 -1
  46. package/dist/generators/gemini-cli/index.d.ts.map +1 -1
  47. package/dist/generators/github-copilot/index.d.ts.map +1 -1
  48. package/dist/generators/opencode/index.d.ts +1 -0
  49. package/dist/generators/opencode/index.d.ts.map +1 -1
  50. package/dist/generators/openhands/index.d.ts.map +1 -1
  51. package/dist/generators/roo-code/index.d.ts.map +1 -1
  52. package/dist/generators/shared/claude-family.d.ts.map +1 -1
  53. package/dist/generators/warp/index.d.ts.map +1 -1
  54. package/dist/index.d.ts +4 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +5371 -553
  57. package/dist/schema.d.ts +91 -42
  58. package/dist/schema.d.ts.map +1 -1
  59. package/dist/text-files.d.ts +5 -0
  60. package/dist/text-files.d.ts.map +1 -0
  61. package/dist/validation/platform-rules.d.ts +15 -1
  62. package/dist/validation/platform-rules.d.ts.map +1 -1
  63. package/package.json +15 -13
  64. package/src/cli/agent.ts +0 -1455
  65. package/src/cli/dev.ts +0 -112
  66. package/src/cli/doctor.ts +0 -987
  67. package/src/cli/eval.ts +0 -470
  68. package/src/cli/index.ts +0 -2933
  69. package/src/cli/init-from-mcp.ts +0 -2115
  70. package/src/cli/install.ts +0 -860
  71. package/src/cli/lint.ts +0 -1249
  72. package/src/cli/mcp-proxy.ts +0 -322
  73. package/src/cli/migrate.ts +0 -867
  74. package/src/cli/prompt.ts +0 -82
  75. package/src/cli/publish.ts +0 -401
  76. package/src/cli/runtime.ts +0 -86
  77. package/src/cli/sync-from-mcp.ts +0 -586
  78. package/src/cli/test.ts +0 -142
  79. package/src/compatibility/matrix.ts +0 -149
  80. package/src/config/define.ts +0 -20
  81. package/src/config/load.ts +0 -74
  82. package/src/generators/amp/index.ts +0 -63
  83. package/src/generators/base.ts +0 -188
  84. package/src/generators/claude-code/index.ts +0 -172
  85. package/src/generators/cline/index.ts +0 -35
  86. package/src/generators/codex/index.ts +0 -143
  87. package/src/generators/cursor/index.ts +0 -158
  88. package/src/generators/gemini-cli/index.ts +0 -83
  89. package/src/generators/github-copilot/index.ts +0 -32
  90. package/src/generators/hooks-warning.ts +0 -51
  91. package/src/generators/index.ts +0 -71
  92. package/src/generators/opencode/index.ts +0 -526
  93. package/src/generators/openhands/index.ts +0 -32
  94. package/src/generators/roo-code/index.ts +0 -35
  95. package/src/generators/shared/claude-family.ts +0 -215
  96. package/src/generators/warp/index.ts +0 -32
  97. package/src/hook-events.ts +0 -33
  98. package/src/index.ts +0 -34
  99. package/src/mcp/introspect.ts +0 -1107
  100. package/src/permissions.ts +0 -260
  101. package/src/schema.ts +0 -312
  102. package/src/user-config.ts +0 -177
  103. 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
- }