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:
1111
2026-04-19 14:35:23 +08:00
parent c0f7735110
commit 4bf9f04a4d
4 changed files with 45 additions and 2 deletions

View File

@@ -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()
}

View 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,
},
},
})
}

View 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)
})
})

View File

@@ -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,
)