Files
qihuaiflow/docs/PRD-self-evolution.md
T
qyyfw 78ff261b5a 初始提交: Qihu-AIFlow v2.0.1 完整项目
- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
2026-07-02 14:40:46 +08:00

29 KiB
Raw Blame History

AI自进化功能模块 - 产品需求文档(PRD)


1. 概述(Summary)

本文档为Qihu-AIFlow平台「AI自进化」功能模块的产品需求文档。该模块深度整合开源项目xSkill(https://github.com/SkillNerds/xskill)的自进化技能库引擎,让每个用户的AI在对话过程中持续学习、自动提炼技能、灰度验证后优胜劣汰,形成用户专属的AI能力体系。该功能被用户形象地称为「养龙虾」——在平台内培养不断进化的AI。


2. 联系人(Contacts)

姓名 角色 备注
项目负责人 Team Lead 项目整体规划与协调决策
产品经理 Product Manager PRD撰写、需求分析与产品设计
UI设计师 UI Designer AI进化驾驶舱UI视觉设计
开发工程师 Developer xSkill后端整合 + 驾驶舱前端开发
测试工程师 QA Engineer 技能进化链路测试、数据隔离验证

3. 背景(Background)

3.1 业务背景

当前AI平台的对话能力是「静态」的——用户每次与AI互动,AI以同样的方式响应,不会从历史对话中学习成长。这意味着:

  • 用户重复遇到相似问题时,AI每次都从零开始理解和处理
  • 用户无法将自己在特定领域的成功经验「固化」为可复用的技能
  • 平台的AI能力不会随着使用深度而个性化升级
  • 竞品在AI自进化领域尚未形成标准方案,这是差异化突破口

3.2 时机分析

  • xSkill框架成熟:xSkill已在PyPI发布(v0.5.2),提供完整的「轨迹→原子任务→技能聚类→技能生成→灰度验证」流水线
  • 技术可行性已验证:xSkill使用dulwich纯Python实现git版本管理,每个Skill独立仓库,支持baby/main/staging三态分支
  • 用户需求明确:用户希望拥有「越用越聪明」的AI助理,与平台的SaaS+PaaS定位高度契合
  • 与现有平台无缝衔接:自进化引擎在后台默默运行,无需另设AI聊天窗口,前端仅需增加进化驾驶舱看板

3.3 技术依托

  • xSkill开源框架:核心流水线引擎,负责对话轨迹分析、原子任务拆分、技能聚类、技能生成、灰度验证
  • xSkill核心架构:
    • XSkill 顶层门面:持 config + registry + skill_repo,提供 search/serve/score_trajectory_ux
    • DirectoryWatcher 流水线监听器:discovered → splitting → split_done → indexed → clustering → done
    • TaskAgent:从轨迹拆分AtomTask(用户意图最小单元)
    • TaskClusterAgent:将AtomTask智能聚类到已存在或新Skill
    • SkillEditAgent:基于candidates buffer生成/更新SKILL.md
    • AtomCanary:灰度系统,A/B测试新Skill版本,按UX评分优胜劣汰
    • SkillRepo:每个Skill独立git仓库(baby→main→staging分支)管理版本

4. 目标与关键成果(Objective & Key Results)

4.1 产品目标

为Qihu-AIFlow平台每个用户提供专属的AI自进化引擎,AI在对话过程中自动学习、提炼技能、持续进化,最终形成用户独一无二的AI能力体系。前端通过「AI进化驾驶舱」直观展示进化过程和成果。

4.2 关键成果(OKR)

编号 关键结果 衡量标准
KR1 xSkill引擎成功整合至平台后端 对话轨迹可自动进入xSkill流水线处理
KR2 每个用户拥有独立进化空间 技能仓库、向量索引、对话轨迹按user_id完全隔离
KR3 AI进化驾驶舱看板上线 技能图谱/进化时间线/使用统计/能力画像四个面板可用
KR4 进化引擎持续运行 用户注册后自动启动,全程无感持续进化
KR5 技能可手动管理 用户可查看、编辑、删除、冻结已生成的Skill

5. 市场细分(Market Segments)

5.1 目标用户场景

用户类型 进化需求 典型场景
职场个人用户 AI越用越懂自己的工作流 逐步习得用户的报告风格、数据处理习惯、邮件模板偏好
副业创收个人 AI掌握自媒体运营技能 积累不同类型内容的创作SOP、平台发布规则、SEO技巧
小微企业商家 AI理解企业的业务流程 学习内部审批流、客户沟通风格、行业术语库
AI深度使用者 培养专属AI能力体系 持续优化AI在特定领域(编程/写作/设计)的输出质量

5.2 用户约束

  • 进化过程应对用户透明,不干扰正常对话
  • 用户应能随时查看进化成果,但不能感到被「监控」
  • 技能数据完全私有,不能跨用户共享或泄露
  • 系统默认持续进化,用户无需任何操作即可享受AI成长

6. 价值主张(Value Propositions)

6.1 核心价值

用户需求 平台方案
希望AI能记住并复用成功经验 xSkill自动分析对话,提取成功模式固化为Skill
希望直观看到AI的成长 AI进化驾驶舱:技能树/时间线/统计/能力画像
不希望额外操作 后台全自动运行,系统默认持续进化,用户无需任何设置
需要控制权 技能管理(查看/编辑/删除/冻结),系统自动进化无需手动干预
数据安全不容妥协 每个用户独立xSkill实例和向量空间,完全物理隔离

6.2 差异化竞争优势

  • 「养龙虾」独特体验:行业首创的AI进化可视化看板,让用户直观感受AI成长
  • xSkill成熟引擎背书:基于开源xSkill框架,流水线架构经过验证,非从零研发
  • 全自动零打扰:后台默默运行,用户只需聊天,AI自动进化
  • 灰度验证机制:新Skill经过A/B测试才能合入主干,确保进化质量
  • 个人专属AI画像:每位用户拥有独特的技能图谱和能力标签

7. 解决方案(Solution)

7.1 系统架构图

┌─────────────────────────────────────────────────────────────────────┐
│                        前台 - 用户侧                                  │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌─────────────────────┐  │
│  │ AI聊天    │  │ 频道     │  │ 知识库   │  │ AI进化驾驶舱 🆕     │  │
│  │          │  │          │  │          │  │                     │  │
│  │ 对话产生 │  │          │  │          │  │ · 技能图谱/树       │  │
│  │ 轨迹数据 │  │          │  │          │  │ · 进化时间线        │  │
│  │    ↓     │  │          │  │          │  │ · 技能使用统计      │  │
│  │ 自动进化 │  │          │  │          │  │ · AI能力画像         │  │
│  │ 持续运行 │  │          │  │          │  │ · 技能库管理        │  │
│  └──────────┘  └──────────┘  └──────────┘  └─────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│                      后端 - xSkill进化引擎                           │
│                                                                     │
│  用户对话 ──→ Trajectory(轨迹).md 文件                              │
│       │                                                             │
│       ▼                                                             │
│  TaskAgent ──→ AtomTask(原子任务)拆分                              │
│       │                                                             │
│       ▼                                                             │
│  Embedding + 向量索引 ──→ index.pkl                                 │
│       │                                                             │
│       ▼                                                             │
│  TaskClusterAgent ──→ 归类到已有Skill / 新建Skill                    │
│       │                                                             │
│       ▼                                                             │
│  Candidates Buffer ──→ weightscore ≥ 10 触发                        │
│       │                                                             │
│       ▼                                                             │
│  SkillEditAgent ──→ 生成/更新 SKILL.md + scripts/references         │
│       │                                                             │
│       ▼                                                             │
│  Git版本管理 baby → main → staging                                  │
│       │                                                             │
│       ▼                                                             │
│  AtomCanary ──→ A/B灰度验证 → promote/reject/timeout_discard        │
│                                                                     │
│  每个用户独立的xSkill实例 + 独立skill仓库 + 独立向量空间              │
└─────────────────────────────────────────────────────────────────────┘

7.2 核心功能详细说明


功能一:默认全局持续进化

功能点 详细描述
设计理念 系统默认全局开启自进化,用户注册后立即启动,无需手动操作。进化引擎在后台持续运行,用户AI越用越聪明
启动时机 用户完成注册后,进化引擎自动初始化(创建独立skill仓库、初始化xSkill watcher线程),全程无需用户干预
持续运行 用户的每次AI对话结束时,对话记录自动提交至本用户的xSkill流水线进行分析,7x24持续进化
隐私保障 AI进化驾驶舱首页展示:「进化数据仅属于你,完全私有,不会与任何人分享」。所有进化数据物理隔离存储
不可关闭 进化是平台核心能力,不可手动关闭。用户可在驾驶舱中管理(查看/编辑/删除/冻结)已生成的技能,但不能停止进化引擎本身

功能二:对话自动分析(xSkill流水线整合)

功能点 详细描述
触发时机 每次AI对话会话结束时自动触发;或当对话累计达到一定轮数(如10轮)时增量触发
轨迹标准化 将平台AI聊天记录标准化为xSkill兼容的.md轨迹格式,包含## User/## Assistant轮次标记
流水线处理 轨迹进入xSkill DirectoryWatcher流水线:discovered → splitting → split_done → indexed → clustering → done
原子任务拆分 TaskAgent按用户意图切换点将对话拆分为多个AtomTask(每个AtomTask包含1-10轮对话)
向量索引 对每个AtomTask的summary/intent做embedding,存入用户独立的index.pkl向量索引
技能聚类 TaskClusterAgent遍历新AtomTask,通过向量相似度搜索定位已有Skill,将原子任务归类到最匹配的Skill的候选缓冲区(candidates buffer)
资源控制 每个用户的xSkill watcher线程独立运行,使用用户专属的LLM API密钥进行分析调用
失败重试 单次原子任务聚类失败不阻塞整条轨迹,失败原子任务在下一轮watcher扫描时自动重试(最多3次)

功能三:技能库管理

功能点 详细描述
技能列表 在AI进化驾驶舱中展示用户所有已生成的Skill列表,支持按名称/标签/创建时间搜索和排序
技能详情 点击Skill名称查看完整SKILL.md内容,包括:名称、描述、使用触发条件、执行步骤、版本号、来源对话追溯
手动编辑 用户可直接编辑SKILL.md正文(包含frontmatter和body),保存后进入git版本管理
技能删除 用户可删除不需要的Skill。删除后对应git仓库标记为删除,可在一定时间内恢复
技能冻结/解冻 用户可冻结某个Skill(设置为只读),冻结后xSkill不会再更新该Skill。解冻后恢复自动进化
技能回滚 用户可查看Skill的git版本历史(SKILL.md的diff),并回滚到任意历史版本
对话溯源 每个Skill展示"来源对话"列表,点击可跳转到原始对话记录(如有保存)

功能四:AI进化驾驶舱(核心前端看板)

这是用户与AI自进化功能交互的核心界面,包含4个子面板:

面板A:技能图谱/技能树
功能点 详细描述
技能树展示 以树形/网状图谱展示用户已掌握的所有AI技能,按技能分类自动分组
技能状态标识 用不同颜色/图标标识技能状态:baby(萌芽中,粉色)、main(已成熟,绿色)、staging(灰度测试中,橙色)、frozen(已冻结,灰色)
技能节点信息 鼠标悬停显示:技能名称、简短描述、使用次数、最后更新时间
交互操作 点击节点进入技能详情页
增长动画 新技能生成时,技能树上有「萌芽」动画效果(符合「养龙虾」理念)
面板B:进化时间线
功能点 详细描述
时间线展示 以时间轴形式展示AI的技能进化历程,按时间倒序排列
里程碑事件 记录关键进化节点:新技能诞生、技能重大更新(权重分≥8)、灰度验证通过/拒绝、技能冻结等
事件卡片 每个里程碑显示:时间、事件类型(图标)、技能名称、简短描述(从哪些对话中学到了什么)
筛选能力 支持按时间范围、事件类型、技能分类筛选时间线
导出能力 支持将进化时间线导出为图片或PDF分享
面板C:技能使用统计
功能点 详细描述
Top技能排行 按使用频率展示TOP N技能,显示每个技能的使用次数和最近一次触发时间
技能调用趋势 折线图展示每日/每周技能调用总量变化趋势
技能贡献分布 饼图展示不同类别技能的使用占比
最活跃技能 标出最近7天内最频繁被调用的前3个技能
零使用技能提醒 自动标识超过30天未使用的技能,建议用户审视或清理
交互联动 点击统计图表中的任意项可跳转到对应技能详情
面板D:用户专属AI能力画像
功能点 详细描述
能力雷达图 以六维/八维雷达图展示用户AI的能力分布(如:文字创作、数据分析、代码能力、知识问答、流程自动化、创意生成等维度)
能力标签 基于已生成Skill自动打标,展示用户AI的能力关键词标签云
进化等级 根据技能数量、使用频率、技能成熟度等指标计算「AI进化等级」(如Lv.1 ~ Lv.10),直观展示成长阶段
成长建议 基于当前技能缺口,智能推荐「使用这些对话场景来培养新技能」
画像分享 支持将AI能力画像(不含私密数据)生成为分享卡片,可在社交媒体展示

功能五:与现有AI聊天模块的无缝衔接

功能点 详细描述
静默运行 xSkill进化引擎在后台独立运行,完全不改变/不影响现有的AI聊天交互体验
不另设聊天窗口 自进化功能复用现有的AI聊天模块,不需要额外的聊天界面
Skill加载提示 当某次对话中AI调用了自进化生成的Skill时,在消息下方显示小标签:「🚀 使用了你的专属技能:XXX」
对话结束钩子 每次对话会话正常结束或用户切换话题时,将完整对话轨迹异步提交至进化引擎
批量处理 支持在低负载时段(如凌晨)批量处理白天的对话轨迹,避免影响高峰体验

功能六:数据隔离(用户级别)

功能点 详细描述
Skill仓库隔离 每个用户在服务器上有独立的skill根目录:{data_dir}/users/{user_id}/skills/,不同用户仓库物理隔离
向量空间隔离 每个用户拥有独立的向量索引文件:{data_dir}/users/{user_id}/index.pkl,完全独立embedding
对话轨迹隔离 每个用户的对话轨迹存储在独立目录:{data_dir}/users/{user_id}/trajectories/
xSkill实例隔离 每个用户拥有独立的XSkill实例(独立config + registry + skill_repo),后端按user_id路由
Watcher线程隔离 每个用户拥有独立的DirectoryWatcher线程,注册后自动启动,处理各自目录的轨迹
权限验证 所有xSkill API调用前验证user_id,确保A用户无法访问B用户的Skill/trajectory/atom数据

7.3 数据库设计概要

7.3.1 新增关系型数据库表

用户进化配置表:

表名 说明 核心字段
user_evolution_config 用户进化配置表 id, user_id, skill_dir_path, trajectory_dir_path, watcher_status(运行中/已停止/错误), created_at, updated_at

技能管理表(MySQL中记录Skill元数据):

表名 说明 核心字段
user_skills 用户技能表 id, user_id, skill_name, description, tags(json), state(baby/main/staging/frozen), use_count, version, git_commit_sha, skill_md_path, created_at, updated_at
skill_evolution_events 技能进化事件表 id, user_id, skill_name, event_type(created/promoted/rejected/frozen/unfrozen/edited/deleted), description, version_before, version_after, created_at
skill_trajectory_links 技能-轨迹关联表 id, skill_name, user_id, trajectory_id, atom_id, weightscore, created_at

对话轨迹表:

表名 说明 核心字段
evolution_trajectories 进化轨迹表 id, user_id, conversation_id, file_path, status(discovered/splitting/split_done/indexed/clustering/done/error/filtered), atom_count, token_used, created_at, processed_at

7.3.2 文件系统存储(每用户独立)

{data_dir}/users/{user_id}/
├── config.yaml                  # xSkill配置文件(用户专属LLM配置等)
├── skills/                      # Skill git仓库根目录
│   ├── fix_python_bug/          # 示例Skill:修复Python bug
│   │   ├── .git/                # 独立git仓库
│   │   ├── SKILL.md             # 技能定义文件
│   │   ├── .candidates.yml      # 候选原子任务缓冲区
│   │   ├── .ux_scores.jsonl     # UX评分记录
│   │   ├── scripts/             # 可执行脚本
│   │   └── references/          # 参考资料
│   └── write_blog_post/         # 示例Skill:写博客文章
│       └── ...
├── trajectories/                # 对话轨迹文件
│   ├── traj_0001/
│   │   ├── traj_0001.md         # 标准化轨迹文件
│   │   └── tasks/               # 原子任务文件
│   │       ├── atom_traj_0001_0001.json
│   │       └── atom_traj_0001_0002.json
│   ├── index.pkl                # 向量索引文件
│   └── evolve.db                # xSkill SQLite状态数据库
└── evolution.log                # 进化引擎日志

7.4 xSkill整合方案

7.4.1 整合策略

采用封装模式整合xSkill开源框架——将xSkill作为后端Python库引用,通过用户级别的wrapper封装为平台服务:

平台后端服务(FastAPI)
    └── EvolutionService(进化服务层)
        ├── 用户级别的 xSkill 实例管理
        │   └── dict[user_id, XSkill]  + dict[user_id, DirectoryWatcher]
        ├── 对话轨迹提交API
        │   └── POST /app/evolution/trajectory/submit
        ├── 技能查询API
        │   └── GET /app/evolution/skills
        │   └── GET /app/evolution/skills/{name}
        │   └── PUT /app/evolution/skills/{name}
        │   └── DELETE /app/evolution/skills/{name}
        ├── 驾驶舱数据API
        │   └── GET /app/evolution/dashboard/skill-tree
        │   └── GET /app/evolution/dashboard/timeline
        │   └── GET /app/evolution/dashboard/statistics
        │   └── GET /app/evolution/dashboard/profile
        └── 进化事件API
            └── GET /app/evolution/events

7.4.2 关键API接口

接口 方法 说明
/app/evolution/trajectory/submit POST 提交对话轨迹到进化流水线
/app/evolution/skills GET 获取用户所有技能列表
/app/evolution/skills/{name} GET/PUT/DELETE 技能详情/编辑/删除
/app/evolution/skills/{name}/freeze POST 冻结技能
/app/evolution/skills/{name}/unfreeze POST 解冻技能
/app/evolution/skills/{name}/rollback/{version} POST 回滚到指定版本
/app/evolution/skills/{name}/history GET 技能版本历史(git log)
/app/evolution/skills/{name}/trajectories GET 技能来源轨迹列表
/app/evolution/dashboard/skill-tree GET 技能图谱数据
/app/evolution/dashboard/timeline GET 进化时间线数据
/app/evolution/dashboard/statistics GET 技能使用统计
/app/evolution/dashboard/profile GET AI能力画像数据
/app/evolution/events GET 进化事件列表

7.4.3 用户级别xSkill实例管理

# 伪代码示意
class EvolutionService:
    _instances: dict[str, XSkillInstance] = {}

    def get_or_create_instance(user_id: str) -> XSkillInstance:
        """获取或创建用户专属的xSkill实例"""
        if user_id not in self._instances:
            config = self._load_user_config(user_id)
            instance = XSkillInstance(
                xskill=XSkill(config_path=config.config_path),
                watcher=DirectoryWatcher(...),
                user_id=user_id,
            )
            instance.watcher.start()  # 注册即启动,默认持续进化
            self._instances[user_id] = instance
        return self._instances[user_id]

7.5 关键假设与约束

编号 假设/约束 风险等级
A1 xSkill v0.5.2框架可通过pip安装并稳定运行 低
A2 每个用户独立运行xSkill watcher不会导致服务器资源耗尽 中
A3 对话轨迹标准化格式与xSkill兼容 低
A4 用户对「后台分析对话」接受度良好 低
C1 进化引擎不得修改现有AI聊天模块的行为 强约束
C2 每个用户的数据完全物理隔离 强约束
C3 进化引擎持续运行,不可手动停止 强约束
C4 xSkill使用用户LLM调用额度进行技能分析(不额外收费) 设计决策
C5 前端驾驶舱通过API获取数据,不做实时WebSocket推送 设计决策

8. 版本规划

8.1 当前版本交付范围

一次性交付全部功能:

交付物 内容说明
默认全局持续进化 注册即启动进化引擎,全程无需用户干预
对话自动分析 xSkill流水线整合:轨迹标准化 → AtomTask拆分 → 向量索引 → 聚类 → Skill生成/更新
技能库管理 技能列表、详情、编辑、删除、冻结/解冻、回滚、对话溯源
AI进化驾驶舱 4个子面板:技能图谱、进化时间线、技能使用统计、AI能力画像
数据隔离 每用户独立xSkill实例、独立skill仓库、独立向量空间、独立轨迹目录
与AI聊天衔接 对话结束钩子、Skill加载提示标签、静默运行不干扰

8.2 后续迭代方向

方向 说明
技能发现与共享 用户可选择将优秀Skill匿名贡献到平台Skill集市(需用户主动操作,非自动)
团队进化空间 团队共享技能进化(与预留的「AI团队协作空间」联动)
进化加速 用户可消耗更多Token加速进化(如:更频繁的流水线扫描间隔)
多模型进化 支持不同模型独立进化不同技能体系

附录A:xSkill核心流水线详解

流水线状态转换

discovered ──→ splitting ──→ split_done ──→ indexed ──→ clustering ──→ done
                                    ↑                         │
                                    └── error ←── retry ──────┘

Skill三级分支状态机

baby ──→ main ──→ staging ──→ (promoted → 合并到main)
                  │
                  └── (rejected → 丢弃staging)
                  │
                  └── (timeout → 14天未验证 → 丢弃staging)

AtomTask UX评分分档表

分数 含义
10 一次到位:用户提需求 → agent一步给出正确产出 → 用户接受无澄清
9 接近一次到位:仅一处细节澄清
8 正确完成但绕了1个小弯
7 正确完成,2-3次澄清/修正;无明显不耐烦
6 完成度边界("这就行吧")
5 核心需求达成但遗漏明显细节
4 多次错误后才接近正确,用户≥2次否定词
3 任务勉强完成但用户明显失望
2 任务未完成 / 反复blocker / 用户放弃
1 完全失败或副作用

附录B:功能需求清单

前台功能清单(共5大功能模块,25个功能点)

序号 模块 功能点
1 技能库管理 技能列表展示(搜索/排序/筛选)
2 技能库管理 技能详情查看(SKILL.md完整内容)
3 技能库管理 手动编辑Skill
4 技能库管理 删除Skill
5 技能库管理 冻结/解冻Skill
6 技能库管理 版本历史查看(git log)
7 技能库管理 回滚到历史版本
8 技能库管理 来源对话追溯
9 进化驾驶舱-A 技能图谱/技能树展示
10 进化驾驶舱-A 技能状态标识(baby/main/staging/frozen)
11 进化驾驶舱-A 新技能萌芽动画
12 进化驾驶舱-B 进化时间线展示
13 进化驾驶舱-B 里程碑事件卡片
14 进化驾驶舱-B 时间线与事件筛选
15 进化驾驶舱-B 进化时间线导出
16 进化驾驶舱-C 技能使用排行
17 进化驾驶舱-C 技能调用趋势图
18 进化驾驶舱-C 技能贡献分布图
19 进化驾驶舱-C 零使用技能提醒
20 进化驾驶舱-D 能力雷达图
21 进化驾驶舱-D 能力标签云
22 进化驾驶舱-D AI进化等级
23 进化驾驶舱-D 成长建议
24 进化驾驶舱-D 画像分享卡片
25 聊天衔接 Skill加载提示标签

后端功能清单(共5大功能模块,17个功能点)

序号 模块 功能点
1 xSkill引擎整合 用户级别xSkill实例管理
2 xSkill引擎整合 DirectoryWatcher线程管理
3 xSkill引擎整合 对话轨迹标准化转换
4 xSkill引擎整合 AtomTask拆分与存储
5 xSkill引擎整合 向量索引构建
6 xSkill引擎整合 Skill聚类与生成
7 xSkill引擎整合 灰度A/B测试
8 xSkill引擎整合 git版本管理
9 xSkill引擎整合 用户Skill仓库初始化
10 技能管理API 技能CRUD
11 技能管理API 版本回滚
12 驾驶舱数据API 技能树/时间线/统计/画像数据
13 数据隔离 每用户独立skill_dir
14 数据隔离 每用户独立trajectory_dir
15 数据隔离 每用户独立向量索引
16 数据隔离 API调用user_id强制验证
17 对话轨迹钩子 对话结束自动提交轨迹

文档状态:已定稿
创建日期:2026-05-26
文档版本:v1.0
基于框架:xSkill v0.5.2 (https://github.com/SkillNerds/xskill)