feat(skill): demote Tools to Settings + rename MCP Connections

This commit is contained in:
matevip 2026-05-01 09:39:52 +08:00
parent 4f3276b9e6
commit 95144ef175
6 changed files with 57 additions and 46 deletions

View File

@ -244,7 +244,9 @@ export default {
connect: 'Connect',
system: 'System',
datasources: 'Datasources',
mcpServers: 'MCP Servers',
mcpServers: 'MCP Connections',
mcpConnections: 'MCP Connections',
toolsCatalog: 'Tools (Catalog)',
settingsGroup: 'Settings',
agents: 'Agents',
security: 'Security',
@ -1046,9 +1048,9 @@ export default {
},
mcp: {
kicker: 'Capability Bridge',
title: 'MCP Server Management',
title: 'MCP Connections',
desc: 'Manage MCP (Model Context Protocol) server connections',
addServer: 'Add Server',
addServer: 'Add Connection',
refreshAll: 'Refresh All',
columns: {
name: 'Name',
@ -1071,8 +1073,8 @@ export default {
streamable_http: 'HTTP',
},
modal: {
newTitle: 'Add MCP Server',
editTitle: 'Edit MCP Server',
newTitle: 'Add MCP Connection',
editTitle: 'Edit MCP Connection',
},
fields: {
name: 'Name',
@ -1109,16 +1111,16 @@ export default {
latency: 'Latency {ms}ms',
},
messages: {
loadFailed: 'Failed to load MCP servers',
createSuccess: 'MCP server created',
updateSuccess: 'MCP server updated',
deleteSuccess: 'MCP server deleted',
deleteConfirm: 'Delete MCP server "{name}"?',
loadFailed: 'Failed to load MCP connections',
createSuccess: 'MCP connection created',
updateSuccess: 'MCP connection updated',
deleteSuccess: 'MCP connection deleted',
deleteConfirm: 'Delete MCP connection "{name}"?',
toggleSuccess: 'Status updated',
refreshSuccess: 'All servers refreshed',
refreshSuccess: 'All connections refreshed',
saveFailed: 'Failed to save',
empty: 'No MCP servers',
emptyDesc: 'Add an MCP server to extend your agents\' capabilities',
empty: 'No MCP connections',
emptyDesc: 'Add an MCP connection to extend your agents\' capabilities',
},
},
sessions: {
@ -1150,8 +1152,9 @@ export default {
},
},
tools: {
title: 'Tools',
desc: 'Manage tools available to your agents',
kicker: 'Developer Catalog',
title: 'Tools (Catalog)',
desc: 'Atomic actions exposed by installed skills. Use the Skills page for end-user binding.',
registerButton: 'Register Tool',
columns: {
tool: 'Tool',

View File

@ -244,7 +244,9 @@ export default {
tools: '工具',
plugins: '插件',
datasources: '数据源',
mcpServers: 'MCP 服务',
mcpServers: 'MCP 连接',
mcpConnections: 'MCP 连接',
toolsCatalog: '工具目录',
settingsGroup: '设置',
agents: '智能体',
security: '安全',
@ -1046,9 +1048,9 @@ export default {
},
mcp: {
kicker: '能力桥接',
title: 'MCP 服务管理',
title: 'MCP 连接',
desc: '管理 MCP (Model Context Protocol) 服务器连接',
addServer: '添加服务',
addServer: '添加连接',
refreshAll: '全量刷新',
columns: {
name: '名称',
@ -1071,8 +1073,8 @@ export default {
streamable_http: 'HTTP',
},
modal: {
newTitle: '添加 MCP 服务',
editTitle: '编辑 MCP 服务',
newTitle: '添加 MCP 连接',
editTitle: '编辑 MCP 连接',
},
fields: {
name: '名称',
@ -1109,16 +1111,16 @@ export default {
latency: '延迟 {ms}ms',
},
messages: {
loadFailed: '加载 MCP 服务列表失败',
createSuccess: 'MCP 服务已创建',
updateSuccess: 'MCP 服务已更新',
deleteSuccess: 'MCP 服务已删除',
deleteConfirm: '确认删除 MCP 服务 "{name}" 吗?',
loadFailed: '加载 MCP 连接列表失败',
createSuccess: 'MCP 连接已创建',
updateSuccess: 'MCP 连接已更新',
deleteSuccess: 'MCP 连接已删除',
deleteConfirm: '确认删除 MCP 连接 "{name}" 吗?',
toggleSuccess: '状态已更新',
refreshSuccess: '全量刷新完成',
saveFailed: '保存失败',
empty: '暂无 MCP 服务',
emptyDesc: '添加一个 MCP 服务来扩展 Agent 的能力',
empty: '暂无 MCP 连接',
emptyDesc: '添加一个 MCP 连接来扩展 Agent 的能力',
},
},
sessions: {
@ -1150,8 +1152,9 @@ export default {
},
},
tools: {
title: '工具管理',
desc: '管理 Agent 可用的工具',
kicker: '开发者目录',
title: '工具目录',
desc: '已安装 Skill 暴露的原子动作。终端绑定请使用 Skills 页。',
registerButton: '注册工具',
columns: {
tool: '工具',

View File

@ -55,12 +55,8 @@ const router = createRouter({
component: () => import('@/views/SkillMarket.vue'),
meta: { title: 'Skills' },
},
{
path: 'tools',
name: 'Tools',
component: () => import('@/views/Tools.vue'),
meta: { title: 'Tools' },
},
// Tools 顶层入口已降级到 Settings ▸ Tools (Catalog) (RFC-090 Phase 1)
// 旧路径 /tools 由下方 redirect 兼容
{
path: 'plugins',
name: 'Plugins',
@ -157,7 +153,13 @@ const router = createRouter({
path: 'mcp-servers',
name: 'SettingsMcpServers',
component: () => import('@/views/McpServers.vue'),
meta: { title: 'Settings - MCP Servers' },
meta: { title: 'Settings - MCP Connections' },
},
{
path: 'tools',
name: 'SettingsTools',
component: () => import('@/views/Tools.vue'),
meta: { title: 'Settings - Tools Catalog' },
},
{
path: 'token-usage',
@ -209,6 +211,8 @@ const router = createRouter({
{ path: 'datasources', redirect: '/settings/datasources' },
{ path: 'mcp-servers', redirect: '/settings/mcp-servers' },
{ path: 'token-usage', redirect: '/settings/token-usage' },
// RFC-090 Phase 1: Tools 顶层降级到 Settings
{ path: 'tools', redirect: '/settings/tools' },
],
},
{

View File

@ -165,9 +165,15 @@ const sections = computed(() => [
{
id: 'mcp-servers',
path: '/settings/mcp-servers',
label: t('nav.mcpServers'),
label: t('nav.mcpConnections'),
icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>',
},
{
id: 'tools',
path: '/settings/tools',
label: t('nav.toolsCatalog'),
icon: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>',
},
{
id: 'token-usage',
path: '/settings/token-usage',

View File

@ -4,7 +4,7 @@
<div class="mc-page-inner tools-page">
<div class="mc-page-header">
<div>
<div class="mc-page-kicker">Execution Surface</div>
<div class="mc-page-kicker">{{ t('tools.kicker') }}</div>
<h1 class="mc-page-title">{{ t('tools.title') }}</h1>
<p class="mc-page-desc">{{ t('tools.desc') }}</p>
</div>
@ -22,7 +22,6 @@
<thead>
<tr>
<th>{{ t('tools.columns.tool') }}</th>
<th>{{ t('tools.columns.beanName') }}</th>
<th>{{ t('tools.columns.type') }}</th>
<th>{{ t('tools.columns.status') }}</th>
<th>{{ t('tools.columns.actions') }}</th>
@ -40,10 +39,10 @@
<div>
<div class="tool-name">{{ tool.name }}</div>
<div class="tool-desc">{{ tool.description }}</div>
<code class="tool-bean">{{ tool.beanName }}</code>
</div>
</div>
</td>
<td><code class="bean-name">{{ tool.beanName }}</code></td>
<td>
<span class="type-badge" :class="'type-' + tool.toolType">{{ tool.toolType }}</span>
</td>
@ -71,7 +70,7 @@
</td>
</tr>
<tr v-if="tools.length === 0">
<td colspan="5" class="empty-row">
<td colspan="4" class="empty-row">
<div class="empty-state">
<span class="empty-icon">🔧</span>
<p>{{ t('tools.empty') }}</p>
@ -221,6 +220,7 @@ async function toggleTool(tool: Tool) {
.tool-name { font-weight: 500; color: var(--mc-text-primary); }
.tool-desc { font-size: 12px; color: var(--mc-text-tertiary); margin-top: 1px; }
.bean-name { background: var(--mc-bg-sunken); padding: 2px 8px; border-radius: 4px; font-size: 12px; color: var(--mc-text-primary); }
.tool-bean { display: inline-block; margin-top: 4px; padding: 1px 6px; background: var(--mc-bg-sunken); border-radius: 4px; font-size: 11px; color: var(--mc-text-tertiary); font-family: var(--mc-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); }
.type-badge { padding: 3px 10px; border-radius: 10px; font-size: 12px; font-weight: 500; }
.type-builtin { background: var(--mc-primary-bg); color: var(--mc-primary); }
.type-mcp { background: var(--mc-primary-bg); color: var(--mc-primary-hover); }

View File

@ -338,11 +338,6 @@ const navGroups = computed(() => [
label: t('nav.skills'),
icon: `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>`,
},
{
path: '/tools',
label: t('nav.tools'),
icon: `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>`,
},
{
path: '/plugins',
label: t('nav.plugins'),