Skill: xiaozhao111596/super-calculator (version 1.0.0)

--- name: 全能超级计算器 description: 万能计算助手。当用户说出"帮我计算"、"算一下"、"计算"、"多少钱"、"利率多少"、"年龄多大"、"相差多少天"、"单位换算"等任何涉及数字计算、公式求解、单位转换、金融分析、日期计算的请求时，触发此技能。支持：四则运算、复利/单利、贷款月供、理财收益、汇率换算、BMI、日期差、年龄计算、单位换算（长度/重量/温度/面积）、统计分析（均值/方差/标准差）、解方程、百分比计算等一切算术与数学运算。 --- # 全能超级计算器 ## 触发关键词 **直接触发：** 帮我计算、算一下、计算、多少钱、多少岁、相差几天、换算、利率、复利、贷款、月供、收益、汇率、BMI、均值、标准差、方程求解、单位换算等任何计算类表达。 **示例对话：** - "帮我算一下100万贷款20年要还多少利息" - "年化4.5%的复利，存10年后是多少钱" - "1988年7月1日出生，现在几岁" - "帮我算BMI，身高175体重70" - "华氏80度等于摄氏多少度" - "帮我统计一下这组数据的均值和标准差" ## 计算能力分类 ### 1. 基础算术 加减乘除、幂运算、开方、对数、三角函数，支持自然语言输入。 ### 2. 金融计算 - **复利/单利**：已知本金、利率、期限，求终值或现值 - **贷款月供**：已知本金、利率、期限，求月供及总利息 - **理财收益**：计算年化收益率、定投收益 - **汇率换算**：实时或设定汇率下的多币种换算 ### 3. 日期与时间 - 年龄计算（精确到岁/月/日） - 日期间隔（相差多少天/月） - 工作日计算（排除周末/节假日） ### 4. 单位换算 - 长度：米/厘米/英寸/英尺/码/公里 - 重量：公斤/克/磅/盎司 - 温度：摄氏度/华氏度/开尔文 - 面积：平方米/平方公里/亩/英亩 ### 5. 统计分析 均值、方差、标准差、中位数、众数、百分位数，支持输入一组数字批量计算。 ### 6. 健康与生活 BMI、体脂率、基础代谢率(BMR)、每日所需热量。 ### 7. 解方程 一元一次、一元二次、二元一次方程组，支持文字描述方程。 ## 使用原则 1. **理解意图优先**：先理解用户想算什么，再选择合适的公式/方法 2. **展示计算过程**：给出算式、公式来源，不要只给答案 3. **结果可读化**：大数字加千分位分隔符，单位标注清晰 4. **多种方案**：金融类计算尽量给出至少2种方案对比（保守/激进） 5. **异常输入处理**：单位不统一时自动识别并统一后再算；输入模糊时主动询问 ## 计算示例 **贷款计算示例：** 输入：贷款200万，年利率4.9%，20年还清 算式：月供 = P×[r(1+r)^n] / [(1+r)^n - 1] 结果：月供约13,044元，总利息约1,130,560元 **复利计算示例：** 输入：本金10万，年复利5%，存20年 公式：F = P × (1 + r)^n 结果：终值约265,330元（是本金的2.65倍）

path: references/formulas.md
content: # 全能超级计算器 - 公式参考手册

## 目录
1. [金融计算公式](#金融计算公式)
2. [统计计算公式](#统计计算公式)
3. [单位换算表](#单位换算表)
4. [健康指标公式](#健康指标公式)
5. [方程求解公式](#方程求解公式)

---

## 金融计算公式

### 复利（Compound Interest）
```
F = P × (1 + r/n)^(n×t)
```
- F = 终值
- P = 本金（Principal）
- r = 年利率（Decimal，如 5% → 0.05）
- n = 年复利次数（按月复利=12，按季=4，按年=1）
- t = 期限（年）

**逆运算（求利率）：** r = n × ( (F/P)^(1/(n×t)) - 1 )

### 单利（Simple Interest）
```
I = P × r × t
F = P + I = P × (1 + r×t)
```

### 等额本息贷款月供
```
M = P × [r(1+r)^n] / [(1+r)^n - 1]
```
- M = 每月还款额
- P = 贷款本金
- r = 月利率（年利率 ÷ 12）
- n = 总月数（年限 × 12）

**总利息 = M × n - P**

### 等额本金月供（递减）
```
每月本金 = P / n
每月利息 = 剩余本金 × 月利率
每月还款 = 每月本金 + 每月利息
```

### 年化收益率（IRR近似）
```
Annual Return = (Final Value / Initial Value)^(1/years) - 1
```

### 汇率换算
```
目标货币 = 源货币 × 汇率
```

---

## 统计计算公式

### 均值（Mean）
```
x̄ = Σx / n
```

### 方差（Variance）
```
σ² = Σ(x - x̄)² / n      （总体方差）
s² = Σ(x - x̄)² / (n-1)   （样本方差）
```

### 标准差（Standard Deviation）
```
σ = √[Σ(x - x̄)² / n]
```

### 中位数（Median）
- 奇数个数据：中间那个
- 偶数个数据：中间两个的平均值

### 百分位数
```
第p百分位数：排序后，第 n×p/100 个值（线性插值处理）
```

---

## 单位换算表

### 长度
| 单位 | 换算（米） |
|------|-----------|
| 1 公里 | 1000 米 |
| 1 米 | 1 米 |
| 1 厘米 | 0.01 米 |
| 1 英寸 | 0.0254 米 |
| 1 英尺 | 0.3048 米 |
| 1 码 | 0.9144 米 |
| 1 英里 | 1609.344 米 |

### 重量
| 单位 | 换算（公斤） |
|------|-----------|
| 1 吨 | 1000 公斤 |
| 1 公斤 | 1 公斤 |
| 1 克 | 0.001 公斤 |
| 1 磅 | 0.453592 公斤 |
| 1 盎司 | 0.0283495 公斤 |

### 温度
```
°C = (°F - 32) × 5/9
°F = °C × 9/5 + 32
K = °C + 273.15
```

### 面积
| 单位 | 换算（平方米） |
|------|-----------|
| 1 平方公里 | 1,000,000 平方米 |
| 1 公顷 | 10,000 平方米 |
| 1 亩 | 666.667 平方米 |
| 1 英亩 | 4046.86 平方米 |

---

## 健康指标公式

### BMI（体质指数）
```
BMI = 体重(kg) / 身高(m)²
```
| BMI范围 | 分类（中国标准） |
|---------|----------------|
| < 18.5 | 偏瘦 |
| 18.5–24 | 正常 |
| 24–28 | 偏胖 |
| ≥ 28 | 肥胖 |

### BMR（基础代谢率）

**男性：**
```
BMR = 13.7×体重(kg) + 5×身高(cm) - 6.8×年龄 + 66
```

**女性：**
```
BMR = 9.5×体重(kg) + 1.9×身高(cm) - 4.7×年龄 + 655
```

### 每日所需热量（TDEE）
```
TDEE = BMR × 活动系数
```
| 活动水平 | 系数 |
|---------|------|
| 久坐（几乎不运动） | 1.2 |
| 轻度（每周1-3天运动） | 1.375 |
| 中度（每周3-5天运动） | 1.55 |
| 重度（每周6-7天运动） | 1.725 |
| 运动员 | 1.9 |

---

## 方程求解公式

### 一元一次方程 ax + b = 0
```
x = -b / a   （当 a ≠ 0）
```

### 一元二次方程 ax² + bx + c = 0
```
Δ = b² - 4ac  （判别式）

Δ > 0：x = (-b ± √Δ) / 2a
Δ = 0：x = -b / 2a（重根）
Δ < 0：无实数解，有两个共轭复根
```

### 二元一次方程组
```
a1x + b1y = c1
a2x + b2y = c2

D = a1·b2 - a2·b1
Dx = c1·b2 - c2·b1
Dy = a1·c2 - a2·c1

x = Dx / D
y = Dy / D
（D ≠ 0 时有唯一解）
```


path: README.md
content: # 全能超级计算器 | All-Powerful Calculator

> 🧮 一句话触发，什么都能算 | Trigger with one sentence, calculate anything

---

## 简介 | Introduction

**全能超级计算器**是一款 OpenClaw 智能体技能，让 AI 能够处理日常生活中几乎所有的计算需求——从简单的加减乘除，到复杂的复利贷款、健康指标，只需一句话，AI 即可给出完整计算过程与精确结果。

**All-Powerful Calculator** is an OpenClaw agent skill that enables AI to handle virtually any calculation need in daily life — from simple arithmetic to complex compound interest, loan repayments, and health metrics. Just speak your request in natural language and get complete calculation steps with precise results.

---

## 功能亮点 | Key Features

| 功能 | 说明 | Feature | Description |
|------|------|---------|-------------|
| 💰 金融计算 | 复利、单利、贷款月供、理财收益 | 💰 Finance | Compound/Simple interest, loan EMI, investment returns |
| 📅 日期计算 | 年龄、日期间隔、工作日 | 📅 Date & Time | Age, date diff, business days |
| 🔢 统计分析 | 均值、方差、标准差、中位数 | 🔢 Statistics | Mean, variance, std dev, median |
| 📐 单位换算 | 长度、重量、温度、面积 | 📐 Unit Conversion | Length, weight, temp, area |
| 🏃 健康指标 | BMI、BMR、每日所需热量 | 🏃 Health | BMI, BMR, daily calories |
| 📊 方程求解 | 一元一次、一元二次方程 | 📊 Equations | Linear, quadratic equations |
| 🧮 基础算术 | 幂、开方、对数、三角函数 | 🧮 Basic Math | Powers, roots, logs, trigonometry |

---

## 快速开始 | Quick Start

### 触发方式 | How to Trigger

直接用自然语言描述你的计算需求即可，AI 会自动识别并调用技能：

Just describe your calculation in natural language:

```
"帮我计算 100 万贷款 20 年要还多少利息"
"Calculate compound interest: principal 100k, rate 5%, 20 years"

"1988年7月1日出生，现在几岁？"
"I was born July 1, 1988, how old am I?"

"175cm，70kg，帮我算BMI"
"I'm 175cm and 70kg, calculate my BMI"

"华氏80度等于摄氏多少度？"
"Convert 80°F to Celsius"
```

### 示例计算 | Example Calculations

**贷款月供计算：**
```
输入：贷款 200 万，年利率 4.9%，20 年还清
月供 = P×[r(1+r)^n] / [(1+r)^n - 1]
月供 ≈ 13,044 元
总利息 ≈ 1,130,560 元
```

**复利计算：**
```
输入：本金 10 万，年复利 5%，存 20 年
公式：F = P × (1 + r)^n
终值 ≈ 265,330 元（本金的 2.65 倍）
```

---

## 目录结构 | Directory Structure

```
全能超级计算器/
├── SKILL.md              # 技能核心文件 | Core skill file
├── scripts/
│   └── calculator.py     # 计算函数库 | Calculation library
├── references/
│   └── formulas.md       # 公式参考手册 | Formula reference guide
└── assets/               # 资源目录（预留）| Reserved for assets
```

---

## 使用限制 | Usage Notes

- 本技能由 AI 驱动，**无需 API Key**，完全本地运行
- 计算精度适合日常生活与参考用途，高精度金融场景请另行验证
- 汇率数据为参考值，实时汇率请以官方数据为准

- This skill is AI-powered and **requires no API Key** — runs entirely locally
- Calculation precision is suitable for daily life and reference purposes
- Exchange rates are reference values; verify with official sources for precision needs

---

## 安装 | Installation

将 `全能超级计算器` 文件夹放入 `~/.qclaw/skills/` 即可：

Place the `全能超级计算器` folder into `~/.qclaw/skills/`:

```bash
cp -r 全能超级计算器 ~/.qclaw/skills/
```

---

## 技术栈 | Tech Stack

- **语言：** Python 3
- **依赖：** 仅标准库（math, datetime, collections）
- **兼容性：** macOS / Linux / Windows

---

## 开源协议 | License

MIT License

---

*🧮 让计算无处不在 | Calculating everywhere, always*


path: scripts/calculator.py
content: #!/usr/bin/env python3
"""
全能超级计算器 - 核心计算函数库
支持：金融、统计、单位换算、日期、健康等各类计算
"""

import math
from datetime import datetime, date
from typing import List, Optional, Tuple


# ==================== 金融计算 ====================

def compound_interest(principal: float, rate: float, years: float, freq: int = 12) -> dict:
    """
    复利计算
    principal: 本金
    rate: 年利率（百分比，如 5 表示 5%）
    years: 年数
    freq: 复利频率（12=月复利, 4=季复利, 1=年复利）
    """
    r = rate / 100
    n = freq
    t = years
    future_value = principal * math.pow(1 + r/n, n*t)
    interest = future_value - principal
    return {
        "principal": principal,
        "rate": rate,
        "years": years,
        "future_value": round(future_value, 2),
        "total_interest": round(interest, 2),
        "multiplier": round(future_value / principal, 3)
    }

def simple_interest(principal: float, rate: float, years: float) -> dict:
    """单利计算"""
    r = rate / 100
    total_interest = principal * r * years
    future_value = principal + total_interest
    return {
        "principal": principal,
        "rate": rate,
        "years": years,
        "future_value": round(future_value, 2),
        "total_interest": round(total_interest, 2)
    }

def loan_monthly_payment(principal: float, annual_rate: float, years: int) -> dict:
    """
    贷款月供计算（等额本息）
    """
    r = annual_rate / 100 / 12  # 月利率
    n = years * 12              # 总月数
    
    if r == 0:
        monthly = principal / n
    else:
        monthly = principal * (r * math.pow(1 + r, n)) / (math.pow(1 + r, n) - 1)
    
    total_payment = monthly * n
    total_interest = total_payment - principal
    
    return {
        "principal": principal,
        "annual_rate": annual_rate,
        "years": years,
        "monthly_payment": round(monthly, 2),
        "total_payment": round(total_payment, 2),
        "total_interest": round(total_interest, 2)
    }

def investment_return(principal: float, final_value: float, years: float) -> dict:
    """计算年化收益率"""
    if principal <= 0 or years <= 0:
        return {"error": "本金和期限必须大于0"}
    total_return = (final_value - principal) / principal
    annual_return = (math.pow(final_value / principal, 1/years) - 1) * 100
    return {
        "principal": principal,
        "final_value": final_value,
        "years": years,
        "total_return_pct": round(total_return * 100, 2),
        "annual_return_pct": round(annual_return, 2)
    }


# ==================== 统计计算 ====================

def basic_statistics(numbers: List[float]) -> dict:
    """基础统计：均值、方差、标准差、中位数、众数"""
    if not numbers:
        return {"error": "数据列表为空"}
    
    n = len(numbers)
    mean = sum(numbers) / n
    variance = sum((x - mean) ** 2 for x in numbers) / n
    std_dev = math.sqrt(variance)
    sorted_nums = sorted(numbers)
    
    # 中位数
    if n % 2 == 0:
        median = (sorted_nums[n//2 - 1] + sorted_nums[n//2]) / 2
    else:
        median = sorted_nums[n//2]
    
    # 众数
    from collections import Counter
    counter = Counter(numbers)
    max_count = max(counter.values())
    modes = [k for k, v in counter.items() if v == max_count]
    
    return {
        "count": n,
        "mean": round(mean, 4),
        "variance": round(variance, 4),
        "std_dev": round(std_dev, 4),
        "median": round(median, 4),
        "mode": modes if len(modes) < n else "无众数",
        "min": min(numbers),
        "max": max(numbers),
        "range": round(max(numbers) - min(numbers), 4)
    }


# ==================== 单位换算 ====================

UNIT_CONVERSIONS = {
    # 长度 (to meters)
    "m": 1, "meter": 1, "米": 1,
    "km": 1000, "kilometer": 1000, "公里": 1000,
    "cm": 0.01, "centimeter": 0.01, "厘米": 0.01,
    "mm": 0.001, "millimeter": 0.001, "毫米": 0.001,
    "inch": 0.0254, "in": 0.0254, "英寸": 0.0254,
    "ft": 0.3048, "foot": 0.3048, "英尺": 0.3048,
    "yd": 0.9144, "yard": 0.9144, "码": 0.9144,
    "mi": 1609.344, "mile": 1609.344, "英里": 1609.344,
    
    # 重量 (to kg)
    "kg": 1, "kilogram": 1, "公斤": 1,
    "g": 0.001, "gram": 0.001, "克": 0.001,
    "lb": 0.453592, "lbs": 0.453592, "磅": 0.453592,
    "oz": 0.0283495, "ounce": 0.0283495, "盎司": 0.0283495,
    "t": 1000, "ton": 1000, "吨": 1000,
    
    # 面积 (to sq meters)
    "m2": 1, "sqm": 1, "平方米": 1,
    "km2": 1_000_000, "sqkm": 1_000_000, "平方公里": 1_000_000,
    "acre": 4046.8564224, "英亩": 4046.8564224,
    "亩": 666.667,
    
    # 温度（特殊处理）
    "c": "celsius", "celsius": "celsius", "摄氏度": "celsius",
    "f": "fahrenheit", "fahrenheit": "fahrenheit", "华氏度": "fahrenheit",
}

def convert_unit(value: float, from_unit: str, to_unit: str) -> dict:
    """单位换算"""
    fu = from_unit.lower().strip()
    tu = to_unit.lower().strip()
    
    # 温度特殊处理
    if fu in ["c", "celsius", "摄氏度"] and tu in ["f", "fahrenheit", "华氏度"]:
        result = value * 9/5 + 32
        return {"from": f"{value}°C", "to": f"{round(result, 2)}°F", "result": round(result, 2)}
    if fu in ["f", "fahrenheit", "华氏度"] and tu in ["c", "celsius", "摄氏度"]:
        result = (value - 32) * 5/9
        return {"from": f"{value}°F", "to": f"{round(result, 2)}°C", "result": round(result, 2)}
    
    if fu not in UNIT_CONVERSIONS or tu not in UNIT_CONVERSIONS:
        return {"error": f"不支持的单位换算: {from_unit} → {to_unit}"}
    
    base_from = UNIT_CONVERSIONS[fu]
    base_to = UNIT_CONVERSIONS[tu]
    base_value = value * base_from
    result = base_value / base_to
    
    return {
        "from": f"{value} {from_unit}",
        "to": f"{round(result, 6)} {to_unit}",
        "result": round(result, 6)
    }


# ==================== 日期计算 ====================

def age_calculator(birth_date: str, ref_date: Optional[str] = None) -> dict:
    """计算年龄"""
    fmt = "%Y-%m-%d"
    try:
        birth = datetime.strptime(birth_date, fmt)
    except ValueError:
        try:
            birth = datetime.strptime(birth_date, "%Y年%m月%d日")
        except ValueError:
            return {"error": "日期格式不支持，请使用 YYYY-MM-DD 格式"}
    
    if ref_date:
        ref = datetime.strptime(ref_date, fmt)
    else:
        ref = datetime.now()
    
    years = ref.year - birth.year
    months = ref.month - birth.month
    days = ref.day - birth.day
    
    if days < 0:
        months -= 1
        # 获取上个月的天数
        prev_month = ref.month - 1 if ref.month > 1 else 12
        prev_year = ref.year if ref.month > 1 else ref.year - 1
        import calendar
        days += calendar.monthrange(prev_year, prev_month)[1]
    
    if months < 0:
        years -= 1
        months += 12
    
    total_days = (ref - birth).days
    
    return {
        "birth_date": birth_date,
        "age_years": years,
        "age_months": months,
        "age_days": days,
        "total_days": total_days,
        "total_months": total_days // 30,
        "description": f"{years}岁{months}个月{days}天"
    }

def date_diff(start_date: str, end_date: str) -> dict:
    """计算日期间隔"""
    fmt = "%Y-%m-%d"
    try:
        start = datetime.strptime(start_date, fmt)
    except ValueError:
        try:
            start = datetime.strptime(start_date, "%Y年%m月%d日")
            fmt = "%Y年%m月%d日"
        except ValueError:
            return {"error": "日期格式不支持"}
    
    try:
        end = datetime.strptime(end_date, fmt)
    except ValueError:
        try:
            end = datetime.strptime(end_date, "%Y年%m月%d日")
        except ValueError:
            return {"error": "日期格式不支持"}
    
    diff = end - start
    days = diff.days
    
    return {
        "start": start_date,
        "end": end_date,
        "days": abs(days),
        "months": abs(days) // 30,
        "years": round(abs(days) / 365.25, 2),
        "weeks": round(abs(days) / 7, 2)
    }


# ==================== 健康计算 ====================

def bmi(height_cm: float, weight_kg: float) -> dict:
    """计算BMI"""
    height_m = height_cm / 100
    bmi_val = weight_kg / (height_m ** 2)
    
    if bmi_val < 18.5:
        category = "偏瘦"
        color = "偏蓝色"
    elif bmi_val < 24:
        category = "正常"
        color = "绿色"
    elif bmi_val < 28:
        category = "偏胖"
        color = "黄色"
    else:
        category = "肥胖"
        color = "红色"
    
    # 标准体重
    ideal_low = 18.5 * (height_m ** 2)
    ideal_high = 24 * (height_m ** 2)
    
    return {
        "height_cm": height_cm,
        "weight_kg": weight_kg,
        "bmi": round(bmi_val, 1),
        "category": category,
        "ideal_weight_range": f"{round(ideal_low, 1)}-{round(ideal_high, 1)} kg",
        "description": f"BMI {round(bmi_val, 1)}，属于{category}范围"
    }

def bmr(height_cm: float, weight_kg: float, age: int, gender: str = "男") -> dict:
    """基础代谢率（BMR）"""
    if gender in ["男", "male", "m"]:
        bmr_val = 13.7 * weight_kg + 5 * height_cm - 6.8 * age + 66
    else:
        bmr_val = 9.5 * weight_kg + 1.9 * height_cm - 4.7 * age + 655
    
    # 每日所需热量
    tdee = {
        "久坐": bmr_val * 1.2,
        "轻度活动": bmr_val * 1.375,
        "中度活动": bmr_val * 1.55,
        "重度活动": bmr_val * 1.725,
        "运动员": bmr_val * 1.9
    }
    
    return {
        "gender": gender,
        "age": age,
        "bmr": round(bmr_val, 0),
        "daily_calories": {k: round(v, 0) for k, v in tdee.items()}
    }


# ==================== 方程求解 ====================

def solve_linear(a: float, b: float) -> dict:
    """一元一次方程 ax + b = 0"""
    if a == 0:
        if b == 0:
            return {"equation": f"{a}x + {b} = 0", "solution": "无穷多解"}
        return {"equation": f"{a}x + {b} = 0", "solution": "无解"}
    x = -b / a
    return {"equation": f"{a}x + {b} = 0", "solution": f"x = {round(x, 6)}"}

def solve_quadratic(a: float, b: float, c: float) -> dict:
    """一元二次方程 ax² + bx + c = 0"""
    if a == 0:
        return solve_linear(b, c)
    
    discriminant = b**2 - 4*a*c
    eq = f"{a}x² + {b}x + {c} = 0"
    
    if discriminant < 0:
        real = -b / (2*a)
        imag = math.sqrt(-discriminant) / (2*a)
        return {
            "equation": eq,
            "type": "无实数解（有两个共轭复根）",
            "x1": f"{round(real, 4)} + {round(imag, 4)}i",
            "x2": f"{round(real, 4)} - {round(imag, 4)}i"
        }
    elif discriminant == 0:
        x = -b / (2*a)
        return {"equation": eq, "type": "重根", "x": round(x, 6)}
    else:
        x1 = (-b + math.sqrt(discriminant)) / (2*a)
        x2 = (-b - math.sqrt(discriminant)) / (2*a)
        return {"equation": eq, "type": "两个不等实根", "x1": round(x1, 6), "x2": round(x2, 6)}


if __name__ == "__main__":
    print("=== 复利测试 ===")
    print(compound_interest(100000, 5, 20))
    
    print("\n=== 贷款月供测试 ===")
    print(loan_monthly_payment(2000000, 4.9, 20))
    
    print("\n=== 统计测试 ===")
    print(basic_statistics([2, 4, 4, 4, 5, 5, 7, 9]))
    
    print("\n=== BMI测试 ===")
    print(bmi(175, 70))
    
    print("\n=== 年龄测试 ===")
    print(age_calculator("1988-07-01"))


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