Skip to content

feat(skills): add reusable skill presets - #317

Open
NotToday1024 wants to merge 9 commits into
Stack-Cairn:mainfrom
NotToday1024:feat/skill-presets
Open

feat(skills): add reusable skill presets#317
NotToday1024 wants to merge 9 commits into
Stack-Cairn:mainfrom
NotToday1024:feat/skill-presets

Conversation

@NotToday1024

@NotToday1024 NotToday1024 commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

关联 Issue

Closes #306

需求说明

增加可复用的 Skill 预设。Skills Hub 负责预设及成员管理;不同会话和 Cron Prompt 任务可选择不同预设,运行时只向模型暴露该预设内的 Skill 信息,减少无关 Skill description。

主要改动

Skills Hub 与设置

  • “已安装”页保持安装、导入和 Default 成员管理的原有语义。
  • 增加平级的“Skill 预设”入口,以带说明的卡片展示 Default 和自定义预设。
  • Default 与“已安装”页当前启用项同步,只读展示;自定义预设在右侧抽屉创建、查看和编辑。
  • 自定义编辑器支持名称、说明、按名称搜索、按类别过滤、有限长度 Skill 描述和绿色启用开关。
  • 支持创建、复制、重命名和删除;删除 Skill 时同步清理预设成员,缺失预设动态回退到 Default。
  • 保留全局 Skills 开关,并兼容迁移旧版 skills.selected

会话与 Cron

  • 会话通过类似 Codex CLI /model/skills 命令选择 Default、自定义预设或“本会话关闭”,不增加常驻输入框控件。
  • 选择立即持久化,但命令本身不写入历史、不发送给模型;排队消息保留发送时选择,子 Agent 继承解析后的 Skills prompt。
  • Auto Prompt Cron 可选择 Skill 预设或单任务关闭 Skills;Bash/HTTP 任务保持原行为。
  • 会话和 Cron 只保存预设 ID,执行时解析预设的最新成员,因此预设更新会自动生效。

Gateway 与持久化

  • 扩展 Gateway Proto、Go/WebUI adapters 和 passthrough guard。
  • 会话历史持久化预设 ID 与关闭状态。
  • GUI 与 Gateway WebUI 保持镜像行为。

代码改动范围

模块 主要目录 内容
设置模型 agent-gui/src/lib/settings, gateway/web/src/lib/settings 预设结构、迁移、规范化与回退
Skills Hub 两端 pages/skills-hub, components/skills 预设卡片、抽屉和成员管理 UI
会话运行时 两端 pages/chat, GUI queue/runtime /skills、关闭、排队与 prompt 解析
会话历史 src-tauri/commands/history 预设元数据持久化
Cron 两端 Cron UI、Rust automation 任务字段、校验与执行
Gateway agent-gateway, GUI gateway services Proto、消息适配与立即持久化
子 Agent agent-gui/src/lib/subagents 继承已解析的 Skills prompt
测试 GUI/WebUI/Go/Rust test 迁移、回退、协议、运行时和 UI 回归

当前相对 origin/main@b6d6231:71 个文件,约 +4330/-389;生成的 Go/TS Proto 文件包含在范围内。

截图预览

已安装页:Default 与已启用 Skill 保持一致

Skills Hub Default preset

Skill 预设:与安装、导入等功能平级的卡片入口

Skills Hub presets

Default 只读详情

Default preset drawer

自定义预设编辑器:说明、搜索、类别过滤与启用开关

Custom preset editor

Filtered preset editor

会话 /skills 命令与预设列表

Conversation Skills command

Conversation Skills presets

Cron Prompt 预设选择

Cron Skills preset

预设生命周期与关闭状态

空态

Empty presets

创建并编辑名称、说明和成员

Create preset

Created preset card

重命名、复制与删除确认

Rename preset

Duplicate preset

Delete preset

单会话与单 Cron 关闭 Skills

Conversation Skills disabled

Cron Skills disabled

Gateway WebUI 对应界面

已安装页与预设页

WebUI Default

WebUI presets

自定义预设编辑器

WebUI preset editor

/skills 与 Cron

WebUI Skills command

WebUI Skills presets

WebUI Cron preset

共 22 张当前实现截图,覆盖 GUI 与真实 Gateway WebUI 的新增 UI 和主要交互状态。

验证

检查 结果
GUI production build 通过
WebUI production build 通过
Tauri App debug build 通过
GUI full frontend tests 1406/1406
WebUI full tests 495/495
Targeted Skill UI tests 14/14
Go Gateway go test ./... 通过
Rust history Skills tests 2/2
Rust automation tests 28/28
Rust gateway tests 56/56
Rust services tests 290/290
Proto regeneration Go/TS 生成文件已更新,HistorySkillsResponse=98
buf lint / breaking check 通过
GUI/WebUI mirror check 通过(117 个镜像文件)
Playwright GUI 15 个状态、真实 Gateway WebUI 6 个状态;无 console/page/相关请求错误或水平溢出
git diff --check / Go/Rust format 通过

真实 Playwright 操作额外发现并修复了“输入新预设名称时读取失效 React event 导致页面崩溃”的问题;当前截图流程已覆盖输入、保存和再次进入编辑器。

基线测试说明

Rust 全量测试仍暴露主线既有问题:4 个 Git/worktree 断言失败,以及 3 个 terminal 测试在当前 PTY 中终止测试进程。对应实现文件未被本 PR 修改,并与 origin/main 一致,因此不混入本功能 PR。

兼容性

  • 旧版 skills.selected 自动迁移到 Default。
  • 不存在或已删除的预设 ID 回退到 Default。
  • 全局 Skills 关闭优先于会话/Cron 预设选择。
  • Skill 商店安装后自动加入 Default;自定义预设只选择已安装 Skill。
  • 不改变公开分享、Skill 导入及非 Prompt Cron 语义。

Review 建议顺序

  1. 两端 settings normalization 和测试:数据模型、迁移与回退。
  2. 会话/Cron runtime:最终注入范围与关闭优先级。
  3. 历史持久化和 Gateway Proto:跨端字段传递。
  4. Skills Hub、/skills、Cron UI 和截图。

提交前检查

  • Issue skill组合功能 #306 已提供需求说明并由本 PR 关联。
  • 本地已合并并解决最新 origin/main@b6d6231 的冲突。
  • HistorySkillsResponse 使用空闲 Proto tag 98,保留上游 Chat Ingress 95-97
  • Proto 已重新生成并通过 breaking check。
  • 对齐基线后重新运行构建、相关测试与 Playwright。
  • 22 张截图已更新,覆盖所有新增 UI、主要交互和 GUI/WebUI 两端。
  • 合并提交 2fea3b0 已推送,GitHub 已重新计算为 MERGEABLE、无基线冲突。

Copilot AI review requested due to automatic review settings July 28, 2026 15:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces reusable Skills preset support across the desktop GUI and Gateway WebUI, so conversations and Cron Prompt tasks persist only a preset ID (plus a per-run disable flag) and resolve the latest preset contents at runtime—reducing unnecessary skill description exposure.

Changes:

  • Adds a preset-based Skills data model (migration from legacy skills.selected into Default, deterministic normalization, missing-preset fallback).
  • Updates GUI/WebUI UX for Skills Hub, chat composer, and Cron Prompt tasks to select a preset or disable Skills per conversation/task.
  • Extends Gateway protocol + adapters and persists per-conversation skills metadata in history (including runtime inheritance for subagents).

Reviewed changes

Copilot reviewed 60 out of 61 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
crates/agent-gui/test/subagents/harness.mjs Passes resolved skillsPrompt into subagent harness runtime.
crates/agent-gui/test/subagents/agent-tool.test.mjs Verifies subagents inherit parent resolved Skills prompt snapshot.
crates/agent-gui/test/settings/normalization.test.mjs Adds tests for preset normalization, migration, fallback, and cleanup.
crates/agent-gui/test/settings/automation-prompt-runner.test.mjs Ensures Cron preset selectors display names (not internal IDs).
crates/agent-gui/test/chat/conversation-state.test.mjs Updates conversation schema to v4 and tests per-conversation skills metadata retention.
crates/agent-gui/test/chat/chat-turn-queue.test.mjs Ensures queued gateway turns preserve per-request preset/disable overrides.
crates/agent-gui/src/pages/skills-hub/SkillsHubPage.tsx Adds preset CRUD + member selection UI and routes selections through presets.
crates/agent-gui/src/pages/settings/CronTaskModal.tsx Adds preset selection + “disable Skills” toggle for prompt Cron tasks.
crates/agent-gui/src/pages/settings/CronSection.tsx Wires presets into Cron modal props.
crates/agent-gui/src/pages/ChatPage.tsx Uses effective skill selection per conversation; persists per-conversation skills changes.
crates/agent-gui/src/pages/chat/turns/runAgentConversationTurn.ts Threads skillsPrompt into subagent runtime configuration.
crates/agent-gui/src/pages/chat/runtime/useSendChatTurn.ts Resolves effective preset/disable flags per request and snapshots into prompts/tools.
crates/agent-gui/src/pages/chat/queue/useChatTurnQueue.ts Propagates queued gateway preset/disable overrides into send overrides.
crates/agent-gui/src/pages/chat/queue/chatTurnQueue.ts Extends queued gateway request type with preset/disable fields.
crates/agent-gui/src/pages/chat/hooks/useChatSkills.ts Reconciles installed skills against all presets (removes missing skills).
crates/agent-gui/src/pages/chat/history/useConversationHistoryActions.ts Loads per-conversation preset/disable metadata from history records.
crates/agent-gui/src/pages/chat/gateway/useGatewayBridgeListeners.ts Applies gateway-requested preset/disable overrides when sending chat turns.
crates/agent-gui/src/pages/chat/gateway/gatewayBridgeTypes.ts Extends gateway bridge types to carry preset/disable overrides.
crates/agent-gui/src/pages/chat/components/ChatComposerBar.tsx Adds composer control to select preset or disable Skills for the conversation.
crates/agent-gui/src/lib/tools/builtinRegistry.ts Passes skillsPrompt into subagent tool registry; removes forced skillsEnabled: false.
crates/agent-gui/src/lib/subagents/run.ts Appends resolved skillsPrompt into subagent system prompt and context creation.
crates/agent-gui/src/lib/subagents/agentTool.ts Adds skillsPrompt to subagent runtime config plumbing.
crates/agent-gui/src/lib/settings/index.ts Introduces preset model, normalization, resolution helpers, and preset-aware updates.
crates/agent-gui/src/lib/chat/history/chatHistory.ts Persists and parses skillPresetId/skillsDisabled in chat history meta (schema v4).
crates/agent-gui/src/lib/chat/conversation/conversationState.ts Bumps stored meta schema to v4; includes preset/disable fields through transforms.
crates/agent-gui/src/lib/automation/types.ts Adds preset/disable fields to Cron task + prompt run request types.
crates/agent-gui/src/i18n/config.ts Adds i18n strings for preset selection and per-conversation/task disable labels.
crates/agent-gui/src/components/cron/CronPromptRunner.tsx Builds Cron skills context using effective preset/disable selection.
crates/agent-gui/src-tauri/src/services/gateway/types.rs Adds preset/disable fields to gateway chat request event struct.
crates/agent-gui/src-tauri/src/services/gateway/tests.rs Updates gateway chat request test fixtures for new fields.
crates/agent-gui/src-tauri/src/services/gateway/envelope_handler.rs Adds handler arm for history.skills request/response passthrough + sync publish.
crates/agent-gui/src-tauri/src/services/gateway/chat.rs Wires new preset/disable fields through chat request conversion.
crates/agent-gui/src-tauri/src/services/gateway_bridge.rs Adds history skills config extraction + history.skills handler.
crates/agent-gui/src-tauri/src/services/automation/validate.rs Validates/preserves Cron skillPresetId and skillsDisabled fields (defaulting).
crates/agent-gui/src-tauri/src/services/automation/types.rs Adds preset/disable fields and defaults to Cron task + prompt run request structs.
crates/agent-gui/src-tauri/src/services/automation/store.rs Includes preset/disable fields in serialized prompt run request payload.
crates/agent-gui/src-tauri/src/services/automation/db.rs Persists preset/disable fields in Cron task config JSON and row parsing.
crates/agent-gui/src-tauri/src/lib.rs Registers new tauri command chat_history_set_skills.
crates/agent-gui/src-tauri/src/commands/history/chat_history/tests.rs Adds tests for skills metadata patching and schema v4 expectations.
crates/agent-gui/src-tauri/src/commands/history/chat_history/segments.rs Implements DB update for per-conversation preset/disable metadata (no updated_at bump).
crates/agent-gui/src-tauri/src/commands/history/chat_history/commands.rs Adds tauri command + gateway sync publish for history skills updates.
crates/agent-gateway/web/test/gateway-v2-adapters.test.mjs Tests new history.skills envelope encoding and chat command field mapping.
crates/agent-gateway/web/test/conversation-skills-state.test.mjs Tests client-side “dirty override” state machine for skills selections.
crates/agent-gateway/web/src/pages/skills-hub/SkillsHubPage.tsx Mirrors GUI preset management UI and preset-aware skill selection behavior.
crates/agent-gateway/web/src/pages/settings/CronTaskModal.tsx Mirrors GUI Cron preset selection + disable toggle.
crates/agent-gateway/web/src/pages/settings/CronSection.tsx Wires presets into WebUI Cron modal props.
crates/agent-gateway/web/src/pages/chat/useChatSkills.ts Reconciles installed skills against all presets (WebUI).
crates/agent-gateway/web/src/pages/chat/ChatComposerBar.tsx Adds WebUI composer preset selector + per-chat disable option.
crates/agent-gateway/web/src/lib/settings/index.ts Adds WebUI preset model + normalization/resolution helpers mirroring GUI.
crates/agent-gateway/web/src/lib/gatewayTypes.ts Exposes history detail skill preset/disable fields in WebUI types.
crates/agent-gateway/web/src/lib/gatewaySocketV2/adapters.ts Adds history.skills request mapping and response decoding support.
crates/agent-gateway/web/src/lib/gatewaySocket.ts Adds setHistorySkills API and includes preset/disable on chat commands.
crates/agent-gateway/web/src/lib/chat/conversationSkillsState.ts Implements WebUI client-side per-conversation skills override tracking + dirty reconciliation.
crates/agent-gateway/web/src/lib/automation/types.ts Adds preset/disable fields to WebUI Cron task type.
crates/agent-gateway/web/src/i18n/config.ts Adds WebUI i18n strings for preset selection and disable labels.
crates/agent-gateway/web/src/app/GatewayApp.tsx Tracks per-conversation preset/disable state, persists via gateway, uses effective selection.
crates/agent-gateway/proto/v2/gateway.proto Adds proto fields/messages for preset/disable on chat + history get/prefix + history.skills.
crates/agent-gateway/internal/protocol/pbws/guard.go Allows history.skills request through guard.
crates/agent-gateway/internal/protocol/pbws/guard_test.go Tests history.skills is permitted by guard.
crates/agent-gateway/internal/proto/v2/gateway.pb.go Regenerated Go bindings for new proto fields/messages.
Files not reviewed (1)
  • crates/agent-gateway/internal/proto/v2/gateway.pb.go: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread crates/agent-gui/src/pages/skills-hub/SkillsHubPage.tsx Outdated
Comment thread crates/agent-gateway/web/src/pages/skills-hub/SkillsHubPage.tsx Outdated
Comment thread crates/agent-gui/src/lib/settings/index.ts
@su-fen

su-fen commented Jul 29, 2026

Copy link
Copy Markdown
Member

我感觉预设加在斜杠命令中选择会不会好一些,提示词输入框底部已经很挤了

@NotToday1024

Copy link
Copy Markdown
Contributor Author

已按建议调整(099fe8b):会话输入框底部的常驻方案选择器已移除,改为类似 Codex CLI /model/skills 斜杠命令。输入 / 可发现该命令,进入后选择 Default、自定义方案或“本会话关闭”;当前项带勾选。选择会立即持久化到当前会话,命令文本随后从编辑器清除,不写入消息历史或发送给模型。GUI/WebUI 对应截图和测试也已更新。

# Conflicts:
#	crates/agent-gateway/internal/proto/v2/gateway.pb.go
#	crates/agent-gateway/internal/protocol/pbws/guard_test.go
#	crates/agent-gateway/proto/v2/gateway.proto
#	crates/agent-gateway/web/src/lib/proto/gen/proto/v2/gateway_pb.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skill组合功能

3 participants