mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 13:55:50 +00:00
feat: 注册内建 weixin channel 插件
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -14,10 +14,11 @@
|
||||
* 2. Call registerBuiltinPlugin() with the plugin definition here
|
||||
*/
|
||||
|
||||
import { registerWeixinBuiltinPlugin } from './weixin.js'
|
||||
|
||||
/**
|
||||
* Initialize built-in plugins. Called during CLI startup.
|
||||
*/
|
||||
export function initBuiltinPlugins(): void {
|
||||
// No built-in plugins registered yet — this is the scaffolding for
|
||||
// migrating bundled skills that should be user-toggleable.
|
||||
registerWeixinBuiltinPlugin()
|
||||
}
|
||||
|
||||
21
src/plugins/bundled/weixin.ts
Normal file
21
src/plugins/bundled/weixin.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import { registerBuiltinPlugin } from '../builtinPlugins.js'
|
||||
import { buildCliLaunch } from '../../utils/cliLaunch.js'
|
||||
|
||||
export function registerWeixinBuiltinPlugin(): void {
|
||||
const launch = buildCliLaunch(['weixin', 'serve'])
|
||||
|
||||
registerBuiltinPlugin({
|
||||
name: 'weixin',
|
||||
description:
|
||||
'WeChat channel integration. Enables inbound WeChat messages via channels and provides reply/send_typing MCP tools. Configure with `ccb weixin login` and enable for a session with `--channels plugin:weixin@builtin`.',
|
||||
version: MACRO.VERSION,
|
||||
defaultEnabled: true,
|
||||
mcpServers: {
|
||||
weixin: {
|
||||
type: 'stdio',
|
||||
command: launch.execPath,
|
||||
args: launch.args,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
17
src/services/mcp/__tests__/channelAllowlist.test.ts
Normal file
17
src/services/mcp/__tests__/channelAllowlist.test.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { describe, expect, mock, test } from 'bun:test'
|
||||
|
||||
mock.module('../../analytics/growthbook.js', () => ({
|
||||
getFeatureValue_CACHED_MAY_BE_STALE: () => [],
|
||||
}))
|
||||
|
||||
import { isChannelAllowlisted } from '../channelAllowlist.js'
|
||||
|
||||
describe('isChannelAllowlisted', () => {
|
||||
test('allows builtin weixin plugin', () => {
|
||||
expect(isChannelAllowlisted('weixin@builtin')).toBe(true)
|
||||
})
|
||||
|
||||
test('rejects undefined plugin source', () => {
|
||||
expect(isChannelAllowlisted(undefined)).toBe(false)
|
||||
})
|
||||
})
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
|
||||
import { z } from 'zod/v4'
|
||||
import { BUILTIN_MARKETPLACE_NAME } from '../../plugins/builtinPlugins.js'
|
||||
import { lazySchema } from '../../utils/lazySchema.js'
|
||||
import { parsePluginIdentifier } from '../../utils/plugins/pluginIdentifier.js'
|
||||
import { getFeatureValue_CACHED_MAY_BE_STALE } from '../analytics/growthbook.js'
|
||||
@@ -68,6 +69,9 @@ export function isChannelAllowlisted(
|
||||
if (!pluginSource) return false
|
||||
const { name, marketplace } = parsePluginIdentifier(pluginSource)
|
||||
if (!marketplace) return false
|
||||
if (marketplace === BUILTIN_MARKETPLACE_NAME && name === 'weixin') {
|
||||
return true
|
||||
}
|
||||
return getChannelAllowlist().some(
|
||||
e => e.plugin === name && e.marketplace === marketplace,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user