Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Bwkyd/wps-skills --skill wps-data-fakergit clone --depth 1 https://github.com/Bwkyd/wps-skillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bwkyd/wps-skills/wps-data-faker)<a href="https://agentmods.dev/skills/bwkyd/wps-skills/wps-data-faker"><img src="https://agentmods.dev/badge/skills/bwkyd/wps-skills/wps-data-faker/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/bwkyd/wps-skills/wps-data-faker"><img src="https://agentmods.dev/badge/skills/bwkyd/wps-skills/wps-data-faker.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00099 | $0.02484 |
| Opus 5 | $0.00049 | $0.01242 |
| Sonnet 5 | $0.00020 | $0.00497 |
| Haiku 4.5 | $0.00010 | $0.00248 |
Grade A, and why
wps-data-faker scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 230 lines — stays where its author put it; the contents beside it link to each section on GitHub.
测试数据生成器
指定字段 → 生成逼真的中国式测试数据。填充模板、测试系统的利器。
再也不用手动编造"张三李四王五"了。
When to Use
- 需要测试数据填充Excel/表格
- 文档模板需要示例数据
- 系统测试需要批量数据
- 演示文档需要逼真样例
- 用户说"帮我造点测试数据""生成假数据"
When NOT to Use
- 真实数据清洗 → 使用
wps-data-clean - 数据分析 → 使用
wps-pivot
支持的字段类型
| 字段 | 示例 | 说明 |
|---|---|---|
| 姓名 | 张伟、李芳 | 常见姓+名组合 |
| 性别 | 男、女 | 与姓名匹配 |
| 年龄 | 25-55 | 可指定范围 |
| 手机号 | 138xxxx1234 | 合规号段 |
| 身份证号 | 110105199001011234 | 含校验位 |
| 邮箱 | [email protected] | 常见邮箱后缀 |
| 地址 | 北京市朝阳区xx路xx号 | 真实地名 |
| 公司名 | XX科技有限公司 | 行业+类型组合 |
| 部门 | 技术部、销售部 | 常见部门 |
| 职位 | 经理、工程师 | 与部门匹配 |
| 日期 | 2025-01-15 | 可指定范围 |
| 金额 | 1,234.56 | 可指定范围 |
| 工号 | EMP001 | 自定义前缀 |
工作流程
Step 1: 确认数据需求
- 需要哪些字段
- 生成多少条
- 输出格式(Excel/CSV)
- 特殊约束(如年龄范围、地区限定)
Step 2: 生成数据
import random
import string
from datetime import datetime, timedelta
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
import os
class ChineseFaker:
"""中国式测试数据生成器"""
SURNAMES = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜'
MALE_NAMES = ['伟', '强', '磊', '军', '勇', '杰', '涛', '明', '超', '华',
'志强', '建国', '建华', '国强', '文彬', '浩然', '宇航', '子轩']
FEMALE_NAMES = ['芳', '娜', '敏', '静', '丽', '婷', '雪', '慧', '莹', '倩',
'秀英', '玉兰', '淑芬', '美玲', '雨萱', '欣怡', '诗涵']
CITIES = ['北京市', '上海市', '广州市', '深圳市', '杭州市', '成都市',
'武汉市', '南京市', '重庆市', '西安市', '苏州市', '天津市']
DISTRICTS = ['朝阳区', '海淀区', '浦东新区', '南山区', '西湖区',
'武侯区', '江岸区', '玄武区', '渝中区', '雁塔区']
COMPANIES = ['科技', '信息', '网络', '智能', '数据', '云计算', '教育',
'医疗', '金融', '咨询']
COMPANY_SUFFIX = ['有限公司', '股份有限公司', '集团', '科技有限公司']
DEPARTMENTS = ['技术部', '销售部', '市场部', '人力资源部', '财务部',
'行政部', '产品部', '运营部', '客服部', '法务部']
POSITIONS = {
'技术部': ['高级工程师', '工程师', '架构师', '技术经理', '开发主管'],
'销售部': ['销售经理', '销售主管', '客户经理', '销售代表'],
'市场部': ['市场经理', '品牌主管', '市场专员', '策划经理'],
}
PHONE_PREFIXES = ['130','131','132','133','134','135','136','137','138',
'139','150','151','152','153','155','156','157','158',
'159','170','176','177','178','180','181','182','183',
'185','186','187','188','189']
def name(self, gender=None):
g = gender or random.choice(['男', '女'])
surname = random.choice(list(self.SURNAMES))
given = random.choice(self.MALE_NAMES if g == '男' else self.FEMALE_NAMES)
return surname + given, g
def phone(self):
return random.choice(self.PHONE_PREFIXES) + ''.join(
random.choices('0123456789', k=8))
def id_card(self, birth_year=None):
area = random.choice(['110105', '310101', '440305', '330102',
'510107', '420102', '320102', '500103'])
year = birth_year or random.randint(1970, 2000)
month = random.randint(1, 12)
day = random.randint(1, 28)
seq = f'{random.randint(1,999):03d}'
base = f'{area}{year}{month:02d}{day:02d}{seq}'
# 校验位
weights = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
check = '10X98765432'
s = sum(int(base[i]) * weights[i] for i in range(17))
return base + check[s % 11]
def email(self, name_pinyin=None):
prefix = name_pinyin or ''.join(random.choices(string.ascii_lowercase, k=6))
domain = random.choice(['qq.com', '163.com', '126.com',
'gmail.com', 'outlook.com', 'sina.com'])
return f'{prefix}{random.randint(1,999)}@{domain}'
def address(self):
city = random.choice(self.CITIES)
district = random.choice(self.DISTRICTS)
road = f'{"".join(random.choices(list("东西南北中和平建设人民解放"),k=2))}路'
num = random.randint(1, 200)
return f'{city}{district}{road}{num}号'
def company(self):
city = random.choice(self.CITIES).replace('市', '')
industry = random.choice(self.COMPANIES)
suffix = random.choice(self.COMPANY_SUFFIX)
return f'{city}{industry}{suffix}'
def amount(self, min_val=100, max_val=100000):
return round(random.uniform(min_val, max_val), 2)
def date(self, start='2024-01-01', end='2026-12-31'):
s = datetime.strptime(start, '%Y-%m-%d')
e = datetime.strptime(end, '%Y-%m-%d')
delta = (e - s).days
d = s + timedelta(days=random.randint(0, delta))
return d.strftime('%Y-%m-%d')
def generate_test_data(fields, count, output_path=None):
"""生成测试数据Excel"""
faker = ChineseFaker()
wb = Workbook()
ws = wb.active
ws.title = "测试数据"
# 表头
header_fill = PatternFill('solid', fgColor='2C3E50')
header_font = Font(name='微软雅黑', size=11, bold=True, color='FFFFFF')
for col, field in enumerate(fields, 1):
cell = ws.cell(row=1, column=col, value=field)
cell.font = header_font
cell.fill = header_fill
# 生成数据
for row in range(2, count + 2):
name, gender = faker.name()
for col, field in enumerate(fields, 1):
if field == '姓名':
ws.cell(row=row, column=col, value=name)
elif field == '性别':
ws.cell(row=row, column=col, value=gender)
elif field == '手机号':
ws.cell(row=row, column=col, value=faker.phone())
elif field == '身份证号':
ws.cell(row=row, column=col, value=faker.id_card())
elif field == '邮箱':
ws.cell(row=row, column=col, value=faker.email())
elif field == '地址':
ws.cell(row=row, column=col, value=faker.address())
elif field == '公司':
ws.cell(row=row, column=col, value=faker.company())
elif field == '部门':
ws.cell(row=row, column=col, value=random.choice(
ChineseFaker.DEPARTMENTS))
elif field == '金额':
ws.cell(row=row, column=col, value=faker.amount())
elif field == '日期':
ws.cell(row=row, column=col, value=faker.date())
elif field == '工号':
ws.cell(row=row, column=col, value=f'EMP{row-1:04d}')
if not output_path:
output_path = f'测试数据_{count}条.xlsx'
wb.save(output_path)
return os.path.abspath(output_path)
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 230 lines · 99 tokens per session scan A 1ea794d248a9
wps-data-faker is a skill published in the GitHub repository Bwkyd/wps-skills (7 stars, last pushed 4mo ago), licensed MIT. It adds 99 tokens to every session and 2,484 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
webapp-testing
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
skill-e2e-test
A test process for checking a coding-agent skill from start to finish. The agent runs the skill's defined procedure and compares each stage with its required rules, then produces a report.
acceptance-orchestrator
Use when a coding task should be driven end-to-end from issue intake through implementation, review, deployment, and acceptance verification with minimal human re-intervention.
agent-evaluation
Testing and benchmarking LLM agents including behavioral testing, capability assessment, reliability metrics, and production monitoring—where even top agents achieve less than 50% on real-world benchmarks.
testforge
A test-generation tool for Python that creates runnable pytest tests. Pytest is a Python tool for writing and running automated tests.
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.