Skill: spa3k/cowhorse-skill (version 1.0.0)

--- name: cowhorse-skill description: A skill that actively extracts and quantifies workflow requirements from users through structured Q&A about inputs, outputs, and objectives. Build reusable skills with scripts/references/assets. Use when user describes a task they want AI to help with repeatedly, e.g. "帮我做一个workflow", "建一个skill", "梳理流程", "帮我做一个工具", "把这个做成一个skill". --- # 牛马Skill (CowHorseSkill) 主动询问用户的输入、输出和客观需求，通过迭代确认构建可复用的 workflow skill。 ## Workflow ### Step 1: Discovery (初始需求挖掘) When user describes a task they want AI to support, **actively lead the conversation** — don't wait for the user to volunteer details. Ask the following questions **one at a time**, wait for each answer before proceeding. #### 1.1 Goal Clarification (目标澄清) - 您最终要交付什么结果？ - "完成"的定义是什么？怎么算做好了？ - 这个工作流解决的核心问题是什么？ #### 1.2 Input Specification (输入规格) 每次必须问清楚以下所有维度： | 维度 | 必问问题 | |------|---------| | **数据来源** | 数据从哪来？文件、API、数据库、还是手动输入？ | | **文件格式** | 是 .xlsx / .csv / .json / .txt / 其他？ | | **文件位置** | 文件在哪？本地路径、网盘、飞书文档？ | | **数据结构** | 数据长什么样？有哪些列/字段？有表头吗？ | | **数据量** | 大概多少条/多少文件？ | | **数据质量** | 有脏数据吗？缺失值、格式不一致怎么处理？ | | **参数** | 需要用户传入什么参数？（筛选条件、时间范围、阈值等） | **追问策略：** 如果用户说"一个Excel"，必须追问： - 里面有哪些 sheet？ - 每个 sheet 的表头是什么？ - 有没有合并单元格？ - 大概多少行数据？ #### 1.3 Output Specification (输出规格) 每次必须问清楚以下所有维度： | 维度 | 必问问题 | |------|---------| | **产出形式** | 输出是文件、表格、图表、报告、还是直接执行动作？ | | **文件格式** | 输出什么格式？.xlsx / .pdf / .html / .png / 控制台打印？ | | **输出位置** | 输出到哪里？本地路径、飞书文档、邮件发送？ | | **输出内容** | 具体包含哪些信息？汇总数据、明细、统计指标？ | | **输出格式要求** | 有模板吗？需要特定排版、颜色、公式吗？ | | **输出粒度** | 是汇总还是明细？按什么维度分组？ | **追问策略：** 如果用户说"生成一个报表"，必须追问： - 报表里具体要哪些字段？ - 需要排序吗？按什么排？ - 需要筛选/过滤吗？条件是什么？ - 需要统计计算吗？（求和、平均、计数等） #### 1.4 Process Steps (流程步骤) - 整个流程分几步？每一步做什么？ - 哪些步骤是手动的？哪些需要自动化？ - 步骤之间有依赖关系吗？顺序能变吗？ #### 1.5 Constraints (约束条件) - 有什么时间要求？（定时执行、截止日期） - 有什么技术限制？（必须用某个工具、不能联网等） - 有什么业务规则？（特殊计算方式、例外情况） - 有什么性能要求？（处理速度、数据量上限） **核心原则：不假设，不猜测，不确定就问。** **处理用户输入时：** - 接受中英文拼写错误 - 项目名/表单名允许模糊匹配 - 不确定时问用户确认，不要假设 ### Step 2: Confirmation (需求确认) After initial discovery, present a structured summary. **每个维度必须明确，不能留"待定"。** ``` ## 工作流需求确认 ### 目标 [用户描述的目标 — 一句话概括] ### 输入规格 | 项目 | 详情 | |------|------| | 数据来源 | [文件路径 / API / 手动输入] | | 文件格式 | [.xlsx / .csv / .json 等] | | 数据结构 | [表头列名、数据类型] | | 数据量 | [行数/文件数] | | 输入参数 | [筛选条件、时间范围等] | | 脏数据处理 | [缺失值/异常值策略] | ### 输出规格 | 项目 | 详情 | |------|------| | 产出形式 | [文件 / 报表 / 图表 / 动作] | | 输出格式 | [.xlsx / .pdf / 控制台 等] | | 输出位置 | [本地路径 / 飞书 / 邮件] | | 输出内容 | [包含的字段/信息] | | 排序/筛选 | [排序字段、筛选条件] | | 统计计算 | [求和、平均、计数等] | | 格式要求 | [模板、颜色、公式] | ### 流程步骤 1. [步骤1 — 明确输入→输出] 2. [步骤2] ... ### 约束条件 - [约束1] - [约束2] ### 确认问题 1. 以上输入/输出规格是否正确？ 2. 步骤顺序和依赖关系对吗？ 3. 哪些步骤需要自动化，哪些保留手动？ 4. 有遗漏的字段或规则吗？ ``` Wait for user confirmation. Iterate until user says "确认" or "可以". ### Step 3: Build (构建Skill) Once confirmed, build the skill: 1. **Create skill directory** using `scripts/init_skill.py` from skill-creator 2. **Write SKILL.md** with: - Frontmatter: name, description (triggers + when to use) - Body: Complete workflow instructions, all steps, decision trees 3. **Add scripts** if automation is needed: - Python scripts for data processing, file operations, etc. - Shell scripts for system commands 4. **Add references** if domain knowledge is needed: - Schemas, API docs, business rules, templates 5. **Add assets** if output files are needed: - Templates, boilerplate, sample data **Skill structure:** ``` skill-name/ ├── SKILL.md (required) ├── scripts/ (optional) │ ├── main_script.py │ └── helpers.py ├── references/ (optional) │ └── workflow_guide.md └── assets/ (optional) └── template.xlsx ``` ### Step 4: Present and Validate (呈现确认) After building: 1. **Show the skill structure** - List all files created 2. **Show SKILL.md summary** - Key sections and triggers 3. **Test the skill** - Run a sample execution if possible 4. **Ask for feedback** - Does this match what you need? 5. **Iterate** - Update based on feedback ### Step 5: Finalize (完成) 1. **Package the skill** using `scripts/package_skill.py` from skill-creator 2. **Update MEMORY.md** with the new skill info 3. **Notify user** - Skill is ready for use ## Fuzzy Matching Rules When processing user input for names, paths, or identifiers: 1. **Trim whitespace** and normalize case 2. **Strip punctuation** from start/end 3. **Allow partial matches** for long strings (e.g., "孝感中心" matches "孝感中心医院东城院区") 4. **Handle common typos** for known values (e.g., "受理单" vs "受理单据") 5. **When uncertain, ask** - "您是指 X 还是 Y？" ## Error Handling - If a step fails, report the error clearly - Do not silently skip failed steps - Ask user how to proceed - Keep a log of what was done for debugging ## Resources ### scripts/ - `scripts/init_skill.py` - From skill-creator, initialize new skill - `scripts/package_skill.py` - From skill-creator, package skill to .skill - Add custom scripts as needed for the specific workflow ### references/ - `references/workflow_guide.md` - Detailed workflow patterns and examples - Add domain-specific references as needed ### assets/ - Add templates, boilerplate, or sample data as needed

path: README.md
content: # 牛马Skill (CowHorseSkill)

一个让 AI 主动询问用户输入、输出和客观需求的 workflow 构建器。

## 核心理念

> 不假设，不猜测，不确定就问。

模型不会等用户自己说全需求，而是**主动逐个提问**，结构化地明确：

- **输入规格**（7 个维度）：数据来源、文件格式、文件位置、数据结构、数据量、数据质量、输入参数
- **输出规格**（6 个维度）：产出形式、输出格式、输出位置、输出内容、排序/筛选/统计、格式要求
- **流程步骤**：每步做什么，哪些自动化
- **约束条件**：时间、技术、业务、性能

## 工作流

1. **Discovery** — 模型主动提问，逐一明确输入/输出/目标
2. **Confirmation** — 结构化总结，迭代直到用户确认
3. **Build** — 创建 skill 目录、SKILL.md、脚本、参考资料
4. **Present** — 展示结果，用户反馈，迭代修改
5. **Finalize** — 打包 skill，更新记忆

## 文件结构

```
cowhorse-skill/
├── SKILL.md                 # 技能主文件（模型执行指令）
├── scripts/
│   └── workflow_builder.py  # 辅助脚本
├── references/
│   └── workflow_guide.md    # 参考案例和决策树
└── README.md                # 本文件
```

## 使用方式

作为 Agent Skill 使用，通过触发词激活：

- "帮我做一个 workflow"
- "建一个 skill"
- "梳理流程"
- "帮我做一个工具"
- "把这个做成一个 skill"

模型会自动进入 Discovery 阶段，主动询问需求细节。

## 手动使用辅助脚本

```bash
# 需求挖掘提示
python3 scripts/workflow_builder.py --step discovery --prompt "用户描述"

# 需求确认总结
python3 scripts/workflow_builder.py --step confirm --data '{"goal":"...","input_spec":{...}}'

# 构建 skill 骨架
python3 scripts/workflow_builder.py --step build --skill-name my-skill
```

## 许可

MIT


path: references/workflow_guide.md
content: # Workflow Patterns Reference

## Example: Hospital Form Summary Tool (完整的workflow案例)

This is a real-world example of how the workflow refinement process works, from initial request to final skill.

### Phase 1: Initial Request

**User said:** "刚刚你给我做的软件不错，但是需要新增几个功能..."

**Discovery process (问了6轮问题):**

1. Q: "需要新增什么功能？" → A: 6个具体需求
2. Q: "项目库Excel在哪里？" → A: /mnt/d/all_project.xlsx
3. Q: "项目库有几个sheet？" → A: 检查后发现7个，4个有效
4. Q: "如何匹配项目？" → A: 按项目代码（非名称）
5. Q: "售后代码怎么处理？" → A: #N/A或中文则忽略，用项目编码
6. Q: "平均值怎么算？" → A: 每个表单类型单独平均，排除0

### Phase 2: Confirmation (需求确认)

**Presented summary:**

```
## 工作流需求确认

### 目标
更新医院表单汇总工具，支持项目库导入、导出Excel、新增表单类型等

### 输入
- 表单数据Excel (表单表)
- 项目库Excel (all_project.xlsx，多sheet)

### 输出
- 带筛选功能的汇总表格
- 可导出为Excel

### 步骤
1. 导入项目库 (多sheet解析，合并单元格处理)
2. 加载表单数据
3. 匹配项目代码，获取项目信息
4. 计算各表单平均值
5. 展示表格 (支持筛选)
6. 导出Excel

### 确认问题
1. 以上是否正确？
2. 售后代码规则对吗？(#N/A/中文→忽略)
3. 平均值计算方式对吗？(每表单单独平均)
```

**User确认:** "对，就是这样"

### Phase 3: Build (构建)

**Skill structure built:**
- SKILL.md: 完整工作流说明
- scripts/hospital_forms_app.py: 主程序 (591行)
- references/: 无 (简单项目)
- assets/: 无

**Key decisions made:**
- 使用 openpyxl 处理合并单元格
- 使用 xlrd 处理 .xls 文件
- 平均值排除0，每个表单类型独立计算
- 导出时无标红 (用户要求)

### Phase 4: Present and Validate

**Presented:**
- 更新了 `/mnt/d/医院表单工具/hospital_forms_app.py` (v2.5)
- 新增功能列表
- 测试结果

**User反馈:**
- "导入表单表时提示没有sheet_names" → 修复为 `wb.sheetnames`
- "标红有bug，取消标红" → 移除所有红色标记
- "第一行是表头" → 简化表头检测

### Phase 5: Finalize

- 清理缓存
- 更新 README.txt
- 更新 build_exe.txt
- 更新 memory log

## Workflow Decision Tree

```
用户提出需求
  ↓
[Step 1: Discovery — 主动提问，逐一确认]
  ├─ 1.1 目标澄清
  │   ├─ 最终交付什么？
  │   ├─ "完成"的定义？
  │   └─ 核心问题是什么？
  ├─ 1.2 输入规格 (7个维度)
  │   ├─ 数据来源（文件/API/手动）
  │   ├─ 文件格式（.xlsx/.csv/.json）
  │   ├─ 文件位置（本地/网盘/飞书）
  │   ├─ 数据结构（表头/字段/类型）
  │   ├─ 数据量（行数/文件数）
  │   ├─ 数据质量（缺失值/异常处理）
  │   └─ 输入参数（筛选/阈值/范围）
  ├─ 1.3 输出规格 (6个维度)
  │   ├─ 产出形式（文件/报表/图表/动作）
  │   ├─ 输出格式（.xlsx/.pdf/控制台）
  │   ├─ 输出位置（本地/飞书/邮件）
  │   ├─ 输出内容（字段/信息）
  │   ├─ 排序/筛选/统计规则
  │   └─ 格式要求（模板/颜色/公式）
  ├─ 1.4 流程步骤
  │   └─ 每步的输入→输出关系
  └─ 1.5 约束条件
      └─ 时间/技术/业务/性能限制
  ↓
[Step 2: Confirmation — 结构化总结]
  ├─ 输入规格表（7项）
  ├─ 输出规格表（6项）
  ├─ 流程步骤列表
  ├─ 约束条件列表
  ├─ 确认问题（4个）
  └─ 循环直到用户确认
  ↓
[Step 3: Build]
  ├─ 创建skill目录
  ├─ 写SKILL.md
  ├─ 添加scripts/references/assets
  └─ 测试
  ↓
[Step 4: Present and Validate]
  ├─ 展示结果
  ├─ 用户反馈
  └─ 迭代修改
  ↓
[Step 5: Finalize]
  ├─ 打包skill
  ├─ 更新MEMORY.md
  └─ 通知用户
```

## Fuzzy Matching Examples

### 项目名匹配
- 用户说: "孝感中心"
- 匹配: "孝感中心医院东城院区", "孝感中心医院"
- 处理: 问"您是指孝感中心医院还是孝感中心医院东城院区？"

### 表单名匹配
- 用户说: "受理单据"
- 匹配: "受理单"
- 处理: 直接匹配（前缀匹配）

### 文件路径
- 用户说: "D盘的那个表"
- 匹配: /mnt/d/all_project.xlsx
- 处理: 问"您是指 /mnt/d/all_project.xlsx 吗？"

## Iteration Pattern

**每次用户反馈后:**

1. 记录反馈内容到 memory/2026-03-15.md
2. 修改代码/文档
3. 重新呈现结果
4. 等待确认

**循环直到用户说 "可以了" 或 "完成了"**


path: scripts/workflow_builder.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Workflow Builder Helper Script
Aids in the iterative workflow refinement process.

Usage:
    python workflow_builder.py --step discovery|confirm|build|present
    python workflow_builder.py --prompt "用户描述的工作流"
"""

import argparse
import json
import os
import sys
from datetime import datetime


def discovery_prompt(user_input):
    """Generate discovery questions based on user input"""
    print("=" * 60)
    print("【Step 1: 需求挖掘 — 主动提问，逐一确认】")
    print("=" * 60)
    print(f"用户描述: {user_input}")
    print()
    print("请依次询问以下问题（不要批量提问）：")
    print()
    print("【1.1 目标澄清】")
    print("  - 您最终要交付什么结果？")
    print("  - '完成'的定义是什么？怎么算做好了？")
    print("  - 这个工作流解决的核心问题是什么？")
    print()
    print("【1.2 输入规格】(7个维度，逐个问)")
    print("  - 数据来源：文件/API/数据库/手动输入？")
    print("  - 文件格式：.xlsx/.csv/.json/.txt？")
    print("  - 文件位置：本地路径/网盘/飞书文档？")
    print("  - 数据结构：有哪些列/字段？有表头吗？")
    print("  - 数据量：大概多少条/多少文件？")
    print("  - 数据质量：有脏数据吗？缺失值怎么处理？")
    print("  - 输入参数：需要什么筛选条件/阈值/范围？")
    print("  【追问】如果用户说'一个Excel'，必须问：")
    print("    → 有哪些sheet？表头是什么？合并单元格？多少行？")
    print()
    print("【1.3 输出规格】(6个维度，逐个问)")
    print("  - 产出形式：文件/报表/图表/动作？")
    print("  - 输出格式：.xlsx/.pdf/.html/控制台？")
    print("  - 输出位置：本地/飞书/邮件？")
    print("  - 输出内容：包含哪些字段/信息？")
    print("  - 排序/筛选/统计：按什么排？过滤条件？求和/平均？")
    print("  - 格式要求：有模板吗？需要特定排版/颜色？")
    print("  【追问】如果用户说'生成报表'，必须问：")
    print("    → 具体字段？排序？筛选？统计计算？")
    print()
    print("【1.4 流程步骤】")
    print("  - 整个流程分几步？每步做什么？")
    print("  - 哪些手动？哪些自动化？顺序能变吗？")
    print()
    print("【1.5 约束条件】")
    print("  - 时间要求？技术限制？业务规则？性能要求？")
    print()
    print("【核心原则】不假设，不猜测，不确定就问！")
    print("【处理输入】接受拼写错误，允许模糊匹配，不确定时确认")


def confirmation_summary(data):
    """Generate a structured confirmation summary with input/output specs"""
    print("=" * 60)
    print("【Step 2: 需求确认 — 结构化总结】")
    print("=" * 60)
    print()
    print("## 工作流需求确认")
    print()
    print("### 目标")
    print(data.get("goal", "[待填写]"))
    print()
    print("### 输入规格")
    input_spec = data.get("input_spec", {})
    print(f"| 项目 | 详情 |")
    print(f"|------|------|")
    for key, label in [
        ("source", "数据来源"), ("format", "文件格式"), ("location", "文件位置"),
        ("structure", "数据结构"), ("volume", "数据量"), ("quality", "脏数据处理"),
        ("params", "输入参数")
    ]:
        val = input_spec.get(key, "[待填写]")
        print(f"| {label} | {val} |")
    print()
    print("### 输出规格")
    output_spec = data.get("output_spec", {})
    print(f"| 项目 | 详情 |")
    print(f"|------|------|")
    for key, label in [
        ("form", "产出形式"), ("format", "输出格式"), ("location", "输出位置"),
        ("content", "输出内容"), ("sort_filter", "排序/筛选"), ("stats", "统计计算"),
        ("style", "格式要求")
    ]:
        val = output_spec.get(key, "[待填写]")
        print(f"| {label} | {val} |")
    print()
    print("### 流程步骤")
    steps = data.get("steps", [])
    if steps:
        for i, step in enumerate(steps, 1):
            print(f"{i}. {step}")
    else:
        print("1. [待填写]")
    print()
    print("### 约束条件")
    constraints = data.get("constraints", [])
    if constraints:
        for c in constraints:
            print(f"- {c}")
    else:
        print("- [待填写]")
    print()
    print("### 确认问题")
    print("1. 以上输入/输出规格是否正确？")
    print("2. 步骤顺序和依赖关系对吗？")
    print("3. 哪些步骤需要自动化，哪些保留手动？")
    print("4. 有遗漏的字段或规则吗？")
    print()
    print("等待用户确认...")


def build_skill_skeleton(skill_name, data):
    """Generate a skeleton for the new skill"""
    print("=" * 60)
    print("【Step 3: 构建Skill】")
    print("=" * 60)
    print()
    print(f"Skill名称: {skill_name}")
    print()
    print("建议结构：")
    print(f"  {skill_name}/")
    print("  ├── SKILL.md")
    print("  ├── scripts/")
    print("  │   └── main.py  # 主脚本")
    print("  ├── references/")
    print("  │   └── workflow_guide.md")
    print("  └── assets/")
    print("      └── (模板文件等)")
    print()
    print("创建命令：")
    print(f"  cd ~/.npm-global/lib/node_modules/openclaw/skills/skill-creator")
    print(f"  python3 scripts/init_skill.py <skill-name> --path /home/spark/.openclaw/workspace/skills --resources scripts,references")
    print()
    print("完成后编辑 SKILL.md，填写：")
    print("  - name: skill名称")
    print("  - description: 触发条件和使用场景")
    print("  - 工作流步骤")
    print("  - 资源引用")


def main():
    parser = argparse.ArgumentParser(description="Workflow Builder Helper")
    parser.add_argument("--step", choices=["discovery", "confirm", "build", "present"],
                        help="Which step to execute")
    parser.add_argument("--prompt", help="User input prompt for discovery")
    parser.add_argument("--data", help="JSON data for confirmation/build")
    parser.add_argument("--skill-name", help="Name for new skill")
    args = parser.parse_args()

    if args.step == "discovery":
        if not args.prompt:
            print("Error: --prompt required for discovery step")
            sys.exit(1)
        discovery_prompt(args.prompt)

    elif args.step == "confirm":
        if not args.data:
            print("Error: --data (JSON) required for confirm step")
            sys.exit(1)
        data = json.loads(args.data)
        confirmation_summary(data)

    elif args.step == "build":
        if not args.skill_name:
            print("Error: --skill-name required for build step")
            sys.exit(1)
        data = json.loads(args.data) if args.data else {}
        build_skill_skeleton(args.skill_name, data)

    elif args.step == "present":
        print("【Step 4: 呈现确认】")
        print("1. 展示skill结构")
        print("2. 展示SKILL.md关键内容")
        print("3. 测试运行（如可能）")
        print("4. 询问用户反馈")
        print("5. 迭代修改")


if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)