@orchid-labs/pluxx 0.1.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/LICENSE +21 -0
- package/README.md +574 -0
- package/bin/pluxx.js +37 -0
- package/dist/cli/agent.d.ts +90 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/dev.d.ts +2 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/doctor.d.ts +19 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/index.d.ts +24 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/init-from-mcp.d.ts +145 -0
- package/dist/cli/init-from-mcp.d.ts.map +1 -0
- package/dist/cli/install.d.ts +56 -0
- package/dist/cli/install.d.ts.map +1 -0
- package/dist/cli/lint.d.ts +18 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/migrate.d.ts +2 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/prompt.d.ts +20 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/publish.d.ts +70 -0
- package/dist/cli/publish.d.ts.map +1 -0
- package/dist/cli/runtime.d.ts +20 -0
- package/dist/cli/runtime.d.ts.map +1 -0
- package/dist/cli/sync-from-mcp.d.ts +32 -0
- package/dist/cli/sync-from-mcp.d.ts.map +1 -0
- package/dist/cli/test.d.ts +33 -0
- package/dist/cli/test.d.ts.map +1 -0
- package/dist/compatibility/matrix.d.ts +14 -0
- package/dist/compatibility/matrix.d.ts.map +1 -0
- package/dist/config/define.d.ts +18 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/load.d.ts +7 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/generators/amp/index.d.ts +13 -0
- package/dist/generators/amp/index.d.ts.map +1 -0
- package/dist/generators/base.d.ts +49 -0
- package/dist/generators/base.d.ts.map +1 -0
- package/dist/generators/claude-code/index.d.ts +7 -0
- package/dist/generators/claude-code/index.d.ts.map +1 -0
- package/dist/generators/cline/index.d.ts +14 -0
- package/dist/generators/cline/index.d.ts.map +1 -0
- package/dist/generators/codex/index.d.ts +9 -0
- package/dist/generators/codex/index.d.ts.map +1 -0
- package/dist/generators/cursor/index.d.ts +11 -0
- package/dist/generators/cursor/index.d.ts.map +1 -0
- package/dist/generators/gemini-cli/index.d.ts +13 -0
- package/dist/generators/gemini-cli/index.d.ts.map +1 -0
- package/dist/generators/github-copilot/index.d.ts +11 -0
- package/dist/generators/github-copilot/index.d.ts.map +1 -0
- package/dist/generators/hooks-warning.d.ts +3 -0
- package/dist/generators/hooks-warning.d.ts.map +1 -0
- package/dist/generators/index.d.ts +11 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/opencode/index.d.ts +15 -0
- package/dist/generators/opencode/index.d.ts.map +1 -0
- package/dist/generators/openhands/index.d.ts +11 -0
- package/dist/generators/openhands/index.d.ts.map +1 -0
- package/dist/generators/roo-code/index.d.ts +14 -0
- package/dist/generators/roo-code/index.d.ts.map +1 -0
- package/dist/generators/shared/claude-family.d.ts +18 -0
- package/dist/generators/shared/claude-family.d.ts.map +1 -0
- package/dist/generators/warp/index.d.ts +13 -0
- package/dist/generators/warp/index.d.ts.map +1 -0
- package/dist/hook-events.d.ts +4 -0
- package/dist/hook-events.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5302 -0
- package/dist/mcp/introspect.d.ts +34 -0
- package/dist/mcp/introspect.d.ts.map +1 -0
- package/dist/permissions.d.ts +18 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/schema.d.ts +9457 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/user-config.d.ts +19 -0
- package/dist/user-config.d.ts.map +1 -0
- package/dist/validation/platform-rules.d.ts +64 -0
- package/dist/validation/platform-rules.d.ts.map +1 -0
- package/package.json +76 -0
- package/src/cli/agent.ts +1030 -0
- package/src/cli/dev.ts +112 -0
- package/src/cli/doctor.ts +588 -0
- package/src/cli/index.ts +2414 -0
- package/src/cli/init-from-mcp.ts +1611 -0
- package/src/cli/install.ts +698 -0
- package/src/cli/lint.ts +1219 -0
- package/src/cli/migrate.ts +614 -0
- package/src/cli/prompt.ts +82 -0
- package/src/cli/publish.ts +401 -0
- package/src/cli/runtime.ts +86 -0
- package/src/cli/sync-from-mcp.ts +563 -0
- package/src/cli/test.ts +134 -0
- package/src/compatibility/matrix.ts +149 -0
- package/src/config/define.ts +20 -0
- package/src/config/load.ts +74 -0
- package/src/generators/amp/index.ts +63 -0
- package/src/generators/base.ts +188 -0
- package/src/generators/claude-code/index.ts +29 -0
- package/src/generators/cline/index.ts +35 -0
- package/src/generators/codex/index.ts +120 -0
- package/src/generators/cursor/index.ts +158 -0
- package/src/generators/gemini-cli/index.ts +83 -0
- package/src/generators/github-copilot/index.ts +32 -0
- package/src/generators/hooks-warning.ts +51 -0
- package/src/generators/index.ts +71 -0
- package/src/generators/opencode/index.ts +526 -0
- package/src/generators/openhands/index.ts +32 -0
- package/src/generators/roo-code/index.ts +35 -0
- package/src/generators/shared/claude-family.ts +215 -0
- package/src/generators/warp/index.ts +32 -0
- package/src/hook-events.ts +33 -0
- package/src/index.ts +23 -0
- package/src/mcp/introspect.ts +834 -0
- package/src/permissions.ts +258 -0
- package/src/schema.ts +312 -0
- package/src/user-config.ts +177 -0
- package/src/validation/platform-rules.ts +565 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import type { McpServer, PluginConfig, TargetPlatform, UserConfigEntry } from './schema'
|
|
2
|
+
|
|
3
|
+
export interface ResolvedUserConfigEntry {
|
|
4
|
+
field: UserConfigEntry
|
|
5
|
+
value: string | number | boolean
|
|
6
|
+
envVar?: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface DerivedUserConfigEntry extends UserConfigEntry {
|
|
10
|
+
source: 'explicit' | 'mcp-auth' | 'mcp-env'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const ENV_VAR_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/
|
|
14
|
+
|
|
15
|
+
export function normalizeUserConfigKey(value: string): string {
|
|
16
|
+
return value
|
|
17
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
18
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
|
|
19
|
+
.replace(/[._/\s]+/g, '-')
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[^a-z0-9-]+/g, '-')
|
|
22
|
+
.replace(/-+/g, '-')
|
|
23
|
+
.replace(/^-+|-+$/g, '')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function humanizeUserConfigLabel(value: string): string {
|
|
27
|
+
return value
|
|
28
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
29
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
30
|
+
.replace(/[._/]+/g, ' ')
|
|
31
|
+
.replace(/-/g, ' ')
|
|
32
|
+
.split(/\s+/)
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())
|
|
35
|
+
.join(' ')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function defaultUserConfigEnvVar(key: string): string {
|
|
39
|
+
return key
|
|
40
|
+
.replace(/[^A-Za-z0-9]+/g, '_')
|
|
41
|
+
.replace(/_+/g, '_')
|
|
42
|
+
.replace(/^_+|_+$/g, '')
|
|
43
|
+
.toUpperCase()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function extractEnvReference(value: string | undefined): string | undefined {
|
|
47
|
+
if (!value) return undefined
|
|
48
|
+
const match = value.match(/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/)
|
|
49
|
+
return match?.[1]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function isRuntimePlatformManaged(config: PluginConfig, target: TargetPlatform, server: McpServer): boolean {
|
|
53
|
+
if (server.transport === 'stdio') return false
|
|
54
|
+
|
|
55
|
+
if (server.auth?.type === 'platform') {
|
|
56
|
+
return true
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (target === 'claude-code') {
|
|
60
|
+
return config.platforms?.['claude-code']?.mcpAuth === 'platform'
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (target === 'cursor') {
|
|
64
|
+
return config.platforms?.cursor?.mcpAuth === 'platform'
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return false
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function targetApplies(entry: UserConfigEntry, target: TargetPlatform): boolean {
|
|
71
|
+
return !entry.targets || entry.targets.includes(target)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function dedupeUserConfigEntries(entries: DerivedUserConfigEntry[]): DerivedUserConfigEntry[] {
|
|
75
|
+
const deduped: DerivedUserConfigEntry[] = []
|
|
76
|
+
const seenKeys = new Set<string>()
|
|
77
|
+
const seenEnvVars = new Set<string>()
|
|
78
|
+
|
|
79
|
+
for (const entry of entries) {
|
|
80
|
+
const envVar = entry.envVar?.trim()
|
|
81
|
+
|
|
82
|
+
if (seenKeys.has(entry.key)) continue
|
|
83
|
+
if (envVar && seenEnvVars.has(envVar)) continue
|
|
84
|
+
|
|
85
|
+
deduped.push(entry)
|
|
86
|
+
seenKeys.add(entry.key)
|
|
87
|
+
if (envVar) seenEnvVars.add(envVar)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return deduped
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function collectUserConfigEntries(
|
|
94
|
+
config: PluginConfig,
|
|
95
|
+
platforms: TargetPlatform[] = config.targets,
|
|
96
|
+
): DerivedUserConfigEntry[] {
|
|
97
|
+
const explicitEntries = (config.userConfig ?? [])
|
|
98
|
+
.filter((entry) => !entry.targets || entry.targets.some((target) => platforms.includes(target)))
|
|
99
|
+
.map((entry) => ({ ...entry, source: 'explicit' as const }))
|
|
100
|
+
|
|
101
|
+
const derivedEntries: DerivedUserConfigEntry[] = []
|
|
102
|
+
|
|
103
|
+
for (const [serverName, server] of Object.entries(config.mcp ?? {})) {
|
|
104
|
+
const applicableTargets = platforms.filter((target) => !isRuntimePlatformManaged(config, target, server))
|
|
105
|
+
|
|
106
|
+
if (
|
|
107
|
+
server.auth?.type
|
|
108
|
+
&& server.auth.type !== 'none'
|
|
109
|
+
&& server.auth.type !== 'platform'
|
|
110
|
+
&& ENV_VAR_NAME.test(server.auth.envVar)
|
|
111
|
+
&& applicableTargets.length > 0
|
|
112
|
+
) {
|
|
113
|
+
derivedEntries.push({
|
|
114
|
+
key: normalizeUserConfigKey(server.auth.envVar),
|
|
115
|
+
title: humanizeUserConfigLabel(server.auth.envVar),
|
|
116
|
+
description: `Authentication credential for the ${serverName} MCP server.`,
|
|
117
|
+
type: 'secret',
|
|
118
|
+
required: true,
|
|
119
|
+
envVar: server.auth.envVar,
|
|
120
|
+
targets: applicableTargets,
|
|
121
|
+
source: 'mcp-auth',
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (server.transport === 'stdio') {
|
|
126
|
+
for (const [key, rawValue] of Object.entries(server.env ?? {})) {
|
|
127
|
+
const envVar = extractEnvReference(rawValue) ?? (ENV_VAR_NAME.test(key) ? key : undefined)
|
|
128
|
+
if (!envVar || !ENV_VAR_NAME.test(envVar)) continue
|
|
129
|
+
|
|
130
|
+
// Skip constant stdio env values that do not need install-time input.
|
|
131
|
+
if (extractEnvReference(rawValue) === undefined && rawValue !== '') {
|
|
132
|
+
continue
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
derivedEntries.push({
|
|
136
|
+
key: normalizeUserConfigKey(envVar),
|
|
137
|
+
title: humanizeUserConfigLabel(envVar),
|
|
138
|
+
description: `Environment value required to launch the ${serverName} stdio MCP server.`,
|
|
139
|
+
type: 'secret',
|
|
140
|
+
required: true,
|
|
141
|
+
envVar,
|
|
142
|
+
targets: applicableTargets.length > 0 ? applicableTargets : platforms,
|
|
143
|
+
source: 'mcp-env',
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return dedupeUserConfigEntries([
|
|
150
|
+
...explicitEntries,
|
|
151
|
+
...derivedEntries,
|
|
152
|
+
])
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function resolveUserConfigEntriesForTarget(
|
|
156
|
+
entries: ResolvedUserConfigEntry[],
|
|
157
|
+
target: TargetPlatform,
|
|
158
|
+
): ResolvedUserConfigEntry[] {
|
|
159
|
+
return entries.filter(({ field }) => targetApplies(field, target))
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function buildUserConfigEnvMap(entries: ResolvedUserConfigEntry[]): Record<string, string> {
|
|
163
|
+
const env: Record<string, string> = {}
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
if (!entry.envVar) continue
|
|
166
|
+
env[entry.envVar] = String(entry.value)
|
|
167
|
+
}
|
|
168
|
+
return env
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function buildUserConfigValueMap(entries: ResolvedUserConfigEntry[]): Record<string, string | number | boolean> {
|
|
172
|
+
const values: Record<string, string | number | boolean> = {}
|
|
173
|
+
for (const entry of entries) {
|
|
174
|
+
values[entry.field.key] = entry.value
|
|
175
|
+
}
|
|
176
|
+
return values
|
|
177
|
+
}
|