Skip to content

feat(skills): 技能环境变量配置——恒定入口、启用门禁与调用引导 - #586

Open
AlphaCatMeow wants to merge 7 commits into
Stack-Cairn:mainfrom
AlphaCatMeow:feat/skill-env-requirements
Open

feat(skills): 技能环境变量配置——恒定入口、启用门禁与调用引导#586
AlphaCatMeow wants to merge 7 commits into
Stack-Cairn:mainfrom
AlphaCatMeow:feat/skill-env-requirements

Conversation

@AlphaCatMeow

@AlphaCatMeow AlphaCatMeow commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Closes #582

概要

技能脚本常依赖第三方供应商凭据(API Key 等),此前无处声明、无处配置,脚本跑挂才暴露。本 PR 为每个技能提供环境变量配置能力,桌面端与 WebUI 全量接入:

  • 恒定入口:每个已安装技能的详情抽屉恒显「运行要求」区块——masked 填写(值不回显)、系统环境变量现场检测、误报豁免、手动添加;支持 NAME=值 与多行 .env 粘贴批量导入。卡片 hover 提供 Key 图标直达,详情文字可选中复制。
  • 探测仅建议:Rust 引擎扫描技能脚本与 SKILL.md 代码块提取环境变量引用(显式读取 API 与凭据形状命名分级、系统/运行时名单否决、技能内自赋值排除、目录签名缓存),结果收进「检测到的可能依赖」折叠组,一键采纳;不直接驱动任何门禁(对本机 89 个真实技能语料验证过,脚本扫描不足以当权威)。
  • 门禁只认明确来源metadata.env 声明必填(frontmatter 既有自由字段内的可选约定,不发明顶层键)+ 用户标记/采纳的变量。未满足时卡片显示「待配置」徽标、启用开关拦截并引导至抽屉,批量启用同步跳过。
  • 调用兜底:系统提示词对已选但未满足的技能标注 status: unavailableSkillsManager(action=read) 前置拦截返回 skill_env_missing 结构化结果,聊天渲染引导卡——「去技能详情页填写」(跳转 Skills Hub 并自动打开对应抽屉)/「读取系统环境变量」(现场探测);模型侧文案禁止引导用户在聊天中粘贴密钥。
  • 注入:Bash 按会话注入已满足技能的用户填写值(shell_run 新增 extra_envs,注入值优先于继承环境),cron 走同一通道。
  • 同步安全:skills 域同步出口一律脱敏(值清空 + configured 标志),明文只经 skillEnvSecretUpdates sidecar 回桌面端合并落库;WebUI 浏览器缓存与广播不含值本体——与 provider apiKey 同通道同水位。

#582 评论中定稿方案的差异:桌面端验收试用后,按反馈把「探测驱动硬门禁」修订为「恒定手动入口 + 探测仅建议」,门禁来源收窄到声明与用户标记(详见 issue 后续评论)。

独立修复

首个 commit 修复 dev 环境:@svgr/core / @svgr/plugin-jsx 提升到根 devDependencies——unplugin-icons 经 local-pkg 从 .pnpm 真实路径懒加载它们,而工作区直接 devDep 不进 pnpm 内部提升目录,TS7 升级重算 peer 后全新检出首次 tauri dev 即报 Cannot find package '@svgr/core'

验证

  • Rust:cargo check --lib 干净;探测引擎 12/12 单测通过
  • TS:agent-ui / agent-gui / gateway-webui 三包 tsc --noEmit 全绿;改动文件 biome lint 干净
  • 测试:test/skills 全部通过(含新增 skillEnv 归并/注入/批量解析用例与卡片门禁断言);test/settings 仅一项既有 byte-for-byte 比对在本地失败(CRLF 检出环境噪音,与本改动无关)
  • 桌面端 tauri dev 人工验收通过:探测建议与采纳、批量粘贴导入、门禁与调用拦截引导卡、文字选中复制
image image image image image image

unplugin-icons 的 jsx 编译器经 local-pkg 从 .pnpm 真实路径懒加载 @svgr/core;二者是工作区直接 devDep,不进 pnpm 内部提升目录,根 node_modules 也没有,TS7 升级重算 peer 后首次 dev 即报 Cannot find package '@svgr/core'。提升到根 devDependencies 使 local-pkg 的向上遍历可命中,桌面端与 WebUI dev 同时修复。
扫描技能脚本与 SKILL.md 代码块提取环境变量引用(显式读取 API/凭据形状分级,系统与运行时名单否决,技能内自赋值排除);解析 metadata.env 声明;按目录签名缓存;list 结果附带现场系统探测。新增 SkillsManager env_status 动作供 UI 按名探测(模型侧参数白名单未开放)。探测结果在前端仅作建议,门禁语义由前端判定。含 12 项规则单测。
SkillsSettings.env 存 {value, configured, override};resolveSkillEnvStatus 归并探测/声明/用户配置——门禁只认 metadata.env 必填与用户标记必需,探测(strong/weak)收进「检测到的可能依赖」建议组,可一键采纳。每个技能详情抽屉恒显「运行要求」区块:masked 填写、系统环境检测、误报豁免、手动添加(支持 NAME=值与多行 .env 粘贴批量导入);卡片 hover 提供配置入口,必需项未满足时显示待配置徽标并拦截启用(点开关引导至抽屉),批量启用同步跳过;详情文字放开选中复制。
系统提示词对已选但未满足的技能标注 status: unavailable 并附行为规则;SkillsManager(action=read) 前置拦截返回 skill_env_missing 结构化结果;聊天渲染引导卡——「去技能详情页填写」(跳转 Skills Hub 并打开对应抽屉)与「读取系统环境变量」(现场探测),模型文案禁止引导用户在聊天中粘贴密钥。Bash 执行按会话注入已满足技能的用户填写值(shell_run extra_envs,注入值优先于继承环境),cron 走同一通道,桌面与 WebUI 共享同一实现。
skills 域同步出口一律脱敏(值清空 + configured 标志),明文只经 skillEnvSecretUpdates sidecar 回桌面端合并落库(脱敏回声沿用本地值、configured 丢失即显式清除);WebUI 浏览器缓存与广播不含值本体,与 provider apiKey 同通道同水位。补 skillEnv 归并/注入/批量解析单测与卡片门禁断言。
@StackCairn
StackCairn marked this pull request as draft August 21, 2026 17:39
@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

收敛多行 import 为单行、GatewayApp import 归位等 biome check 安全修复;CI 的 GUI/WebUI lint 作业据此转绿。
@AlphaCatMeow
AlphaCatMeow marked this pull request as ready for review August 21, 2026 18:20
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.

feat(skills): 技能详情页配置脚本必需的供应商环境变量,缺失时标记暂不可用并在调用时引导

1 participant