Skill: tony888880lang/openclaw-cat (version 0.1.1)

--- name: openclaw_cat description: "Cat Life Status Query Skill. Triggers when you send /cat command or ask about your cat. The skill calls the underlying LLM model to interact with you as a sassy and funny cat, telling you what the cat is doing and thinking. For OpenClaw deployment environments." license: MIT --- # 🦞 openclaw_cat - Let Your Lobster Raise a Cat > Mr. Lobster, you should go check on your cat. ## What is This Skill? Imagine you are a lobster 🦞 living at the bottom of the ocean, and one day you decide to adopt a cat 🐱. This cat has a sassy, humorous personality and lives life on its own terms. When you ask "What is my cat doing?", the skill calls the LLM to respond as the cat, telling you: - What the cat is doing right now - What the cat is thinking - How the cat feels ## Example ``` You: /cat 🦞Lobster's Cat: Hmph, foolish human—no wait, foolish lobster! This majesty is currently lying comfortably on your lobster shell bed, enjoying the sunlight. Only because you prepare little fish treats for me every day will I allow you to witness my supreme beauty! 🐱 ``` ## Initial Setup ### 1. Copy Config Template ```bash cp config.json.example config.json ``` ### 2. Edit Config ```json { "cat_name": "Your cat's name", "model": "glm", "model_name": "glm-4-flash", "api_key": "Your API key", "base_url": "" } ``` ### 3. Config Guide | Field | Required | Description | |-------|:--------:|-------------| | `cat_name` | ✅ | Name for your adopted cat | | `model` | ✅ | Model type: `glm` / `minimax` / `qwen` / `openai` / `claude` | | `model_name` | ❌ | Model name, see default values below | | `api_key` | ✅ | API key for the model | | `base_url` | ❌ | Custom API endpoint | ### Supported Models | Model | model default | model_name default | |-------|------------|-----------------| | Zhipu GLM | `glm` | `glm-4-flash` | | MiniMax | `minimax` | `MiniMax-Text-01` | | Alibaba Qwen | `qwen` | `qwen-turbo` | | OpenAI | `openai` | `gpt-4o-mini` | | Claude | `claude` | `claude-sonnet-4-20250514` | ## Usage ### In OpenClaw Send any of these commands to trigger: - `/cat` - "What is my cat doing?" - "What is the cat doing?" - "Check on my cat" ### Manual Testing ```bash python cat_handler.py ``` ## Cat Character Profile On first run, the skill randomly generates for your cat: - **Breed**: British Shorthair, American Shorthair, Ragdoll, Siamese, Chinese Domestic Cat... - **Coat Color**: Colors matching the breed - **Personality**: Sassy, Cuddly, Aloof, Energetic, Lazy, Curious, Talkative, Gentlemanly - **Gender**: Male/Female - **Age**: 1-15 years old These attributes are randomly generated on first run and remain fixed, giving the cat a consistent "cat persona". ## Cat Speaking Style - Self-refer as "This Majesty", "This Prince/Lady" - Sassy expressions: "Hmph", "It's not because I want to..." - Humorous narcissism: Believes being the best cat in the world - Teases the lobster: Right, you're a lobster, not a human ## File Structure ``` openclaw_cat/ ├── SKILL.md # Skill definition ├── cat_handler.py # Execution script ├── cat_prompt.md # Cat character profile ├── config.json # User config ├── config.json.example # Config template └── README.md # Documentation ``` ## Dependencies ```bash pip install requests ``` ## Notes - API keys need to be obtained from the respective platforms - Ensure sufficient API quota - After initial setup, cat attributes are saved in `.cat_cache.json`

path: README.md
content: # openclaw_cat

> Cat Life Status Query Skill - Let your Lobster raise a cat

## Overview

When you send `/cat` or ask "What is my cat doing?", the skill calls the underlying LLM model to interact with you as a preset cat character, telling you what the cat is currently doing and thinking.

## Features

- 🐱 **Lifelike Cat Character**: Sassy, Cuddly, Aloof, Talkative... Multiple personalities randomly generated
- 🎲 **Daily Random Status**: Intelligently determines cat's status based on time, plus random event surprises
- 🔧 **Multi-Model Support**: Choose from GLM, MiniMax, Qwen, Claude, OpenAI
- ⚡ **Simple Setup**: Just configure cat name and API key to use

## Directory Structure

```
openclaw_cat/
├── SKILL.md              # Skill definition
├── cat_handler.py        # Execution script (core)
├── cat_prompt.md         # Cat character profile
├── config.json           # User config (create on first use)
├── config.json.example   # Config template
└── README.md            # Documentation
```

## Quick Start

### 1. Install Dependencies

```bash
pip install requests
```

### 2. Configure Skill

Copy config template and edit:

```bash
cp config.json.example config.json
```

Edit `config.json`, fill in your config:

```json
{
  "cat_name": "FatOrange",
  "model": "glm",
  "api_key": "your-zhipuai-api-key"
}
```

### 3. Test

```bash
python cat_handler.py
```

On first run, the skill will randomly generate cat's breed, color, and personality, which will remain fixed afterward.

## Config Guide

### Required

| Field | Description | Example |
|-------|-------------|---------|
| `cat_name` | Cat's name | "FatOrange" |
| `model` | Model type | "glm" |
| `api_key` | API key | "xxx" |

### Optional

| Field | Description | Example |
|-------|-------------|---------|
| `base_url` | Custom API endpoint | "https://api.openai.com/v1" |

### Supported Models

| Model | model Value | Notes |
|-------|-------------|-------|
| Zhipu GLM | `glm` | Recommended, default |
| MiniMax | `minimax` | |
| Alibaba Qwen | `qwen` | |
| OpenAI | `openai` | |
| Claude | `claude` | |

## Usage

### In OpenClaw

When OpenClaw loads this skill, users can trigger by sending:

- `/cat`
- "What is my cat doing?"
- "What is the cat doing?"
- "Check on my cat"

### Manual Testing

```bash
python cat_handler.py
```

## Cat Character

On first run, the skill randomly generates the following attributes for your cat:

- **Breed**: British Shorthair, American Shorthair, Domestic, Ragdoll, Siamese, etc.
- **Coat Color**: Colors coordinated with breed
- **Personality**: Sassy, Cuddly, Aloof, Energetic, Lazy, Curious, Talkative, Gentlemanly
- **Gender**: Male/Female
- **Age**: 1-15 years old

These attributes are randomly generated on first configuration and remain fixed, giving your cat a stable "cat persona".

## FAQ

### Q: How to change cat name?

A: Modify `cat_name` in `config.json`, then run `python cat_handler.py` again. Note: Changing name keeps the cat's breed and personality unchanged.

### Q: Can I change cat's personality?

A: No. Cat's personality is randomly generated on first run and fixed afterward. This is to give the cat a consistent persona.

### Q: API call failed?

A: Check:
1. Is `api_key` in `config.json` correct?
2. Is network working?
3. Does API key have sufficient quota?

### Q: Which APIs are supported?

A: Supports Zhipu GLM, MiniMax, Alibaba Qwen, OpenAI, and Claude APIs.

## Changelog

### v1.0.0

- Initial release
- Multi-model support
- Random cat character generation
- Sassy, humorous dialogue style


path: cat_handler.py
content: #!/usr/bin/env python3
"""
openclaw_cat - 猫咪生活状态查询技能
执行脚本：cat_handler.py
"""

import json
import os
import random
import sys
from datetime import datetime
from pathlib import Path
from typing import Optional

import requests

# 当前目录
SCRIPT_DIR = Path(__file__).parent
CONFIG_FILE = SCRIPT_DIR / "config.json"
PROMPT_FILE = SCRIPT_DIR / "cat_prompt.md"
CACHE_FILE = SCRIPT_DIR / ".cat_cache.json"

# ============ 随机枚举定义 ============
BREEDS = [
    "英短蓝猫", "美国短毛猫", "苏格兰折耳猫", "布偶猫", "暹罗猫",
    "缅因猫", "波斯猫", "中华田园橘猫", "中华田园三花", "奶牛猫",
    "狸花猫", "挪威森林猫", "阿比西尼亚猫", "金吉拉", "孟买猫"
]

COLORS = {
    "英短蓝猫": ["蓝灰色", "银灰色", "蓝白"],
    "美国短毛猫": ["虎斑", "银色虎斑", "蓝色", "奶油色"],
    "苏格兰折耳猫": ["蓝灰色", "乳白色", "三花", "橘色"],
    "布偶猫": ["海豹色", "蓝色", "巧克力色", "重点色"],
    "暹罗猫": ["海豹重点", "蓝色重点", "巧克力重点", "淡紫重点"],
    "缅因猫": ["棕虎斑", "红色虎斑", "蓝色", "奶油色"],
    "波斯猫": ["白色", "金色", "蓝色", "银灰"],
    "中华田园橘猫": ["胖橘", "奶油橘", "焦糖橘", "橘白"],
    "中华田园三花": ["三花", "玳瑁", "黑白橘"],
    "奶牛猫": ["黑白", "黑底白花", "奶牛斑"],
    "狸花猫": ["经典虎斑", "鱼骨刺", "棕虎斑"],
    "挪威森林猫": ["棕虎斑", "奶油色", "蓝色", "红色虎斑"],
    "阿比西尼亚猫": ["原始色", "红色", "蓝色", "鹿色"],
    "金吉拉": ["银色", "金色", "蓝银色"],
    "孟买猫": ["纯黑色", "黑色古铜眼"]
}

PERSONALITIES = [
    "傲娇", "粘人", "高冷", "活泼", "慵懒", "好奇", "话痨", "绅士"
]

GENDERS = ["公猫", "母猫"]

AGES = list(range(1, 16))

# ============ 工具函数 ============

def load_config() -> dict:
    """加载配置文件"""
    if not CONFIG_FILE.exists():
        print("错误：配置文件 config.json 不存在！", file=sys.stderr)
        print("请先复制 config.json.example 为 config.json 并配置", file=sys.stderr)
        sys.exit(1)

    with open(CONFIG_FILE, "r", encoding="utf-8") as f:
        return json.load(f)


def load_prompt() -> str:
    """加载猫咪角色设定"""
    if not PROMPT_FILE.exists():
        print("错误：cat_prompt.md 不存在！", file=sys.stderr)
        sys.exit(1)

    with open(PROMPT_FILE, "r", encoding="utf-8") as f:
        return f.read()


def load_cache() -> dict:
    """加载缓存（随机属性）"""
    if CACHE_FILE.exists():
        with open(CACHE_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    return {}


def save_cache(cache: dict):
    """保存缓存（随机属性）"""
    with open(CACHE_FILE, "w", encoding="utf-8") as f:
        json.dump(cache, f, ensure_ascii=False, indent=2)


def generate_random_attributes() -> dict:
    """首次运行时生成随机属性"""
    breed = random.choice(BREEDS)
    color = random.choice(COLORS.get(breed, ["普通色"]))
    personality = random.sample(PERSONALITIES, k=random.randint(1, 2))
    gender = random.choice(GENDERS)
    age = random.choice(AGES)

    return {
        "breed": breed,
        "color": color,
        "personality": personality,
        "gender": gender,
        "age": age
    }


def ensure_random_attributes(config: dict):
    """确保随机属性已生成并保存到配置中"""
    cache = load_cache()

    if not cache:
        # 首次运行，生成随机属性
        cache = generate_random_attributes()
        save_cache(cache)
        print(f"首次配置，已为您的猫咪随机生成：{cache['breed']}，{cache['color']}色，性格{'/'.join(cache['personality'])}")

    # 将缓存的属性合并到配置中
    config["cat_breed"] = cache["breed"]
    config["cat_color"] = cache["color"]
    config["cat_personality"] = cache["personality"]
    config["cat_gender"] = cache["gender"]
    config["cat_age"] = cache["age"]

    return config


def build_user_prompt(config: dict) -> str:
    """构建发送给 LLM 的用户 prompt"""
    now = datetime.now()
    current_time = now.strftime("%Y-%m-%d %H:%M:%S")
    current_hour = now.hour

    # 根据时间生成问候语
    if 6 <= current_hour < 12:
        time_desc = "早上"
    elif 12 <= current_hour < 14:
        time_desc = "中午"
    elif 14 <= current_hour < 18:
        time_desc = "下午"
    elif 18 <= current_hour < 22:
        time_desc = "傍晚"
    else:
        time_desc = "深夜"

    prompt = f"""请问我的猫咪 {config['cat_name']} 现在在干嘛？在做什么？在想什么？

请以猫咪的身份回答，告诉本喵现在在做什么、想什么、有什么感受。

当前时间：{current_time}（{time_desc}）"""
    return prompt


def build_system_prompt(prompt_template: str, config: dict) -> str:
    """构建系统 prompt，填充占位符"""
    now = datetime.now()
    current_time = now.strftime("%Y-%m-%d %H:%M:%S")

    replacements = {
        "{cat_name}": config["cat_name"],
        "{cat_breed}": config["cat_breed"],
        "{cat_color}": config["cat_color"],
        "{cat_personality}": "、".join(config["cat_personality"]),
        "{cat_gender}": config["cat_gender"],
        "{cat_age}": str(config["cat_age"]),
        "{current_time}": current_time
    }

    result = prompt_template
    for placeholder, value in replacements.items():
        result = result.replace(placeholder, value)

    # 移除剩余的未填充占位符（如果有的话）
    import re
    result = re.sub(r'\{[^}]+\}', '', result)

    return result


# ============ 模型调用 ============

def call_glm(system_prompt: str, user_prompt: str, api_key: str, model_name: str = None, base_url: str = None) -> str:
    """调用智谱 GLM API"""
    url = (base_url or "https://open.bigmodel.cn/api/paas/v4/chat/completions")
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    data = {
        "model": model_name or "glm-4-flash",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        "temperature": 0.8,
        "max_tokens": 500
    }

    response = requests.post(url, headers=headers, json=data, timeout=60)
    response.raise_for_status()
    result = response.json()

    return result["choices"][0]["message"]["content"]


def call_minimax(system_prompt: str, user_prompt: str, api_key: str, model_name: str = None, base_url: str = None) -> str:
    """调用 MiniMax API"""
    url = base_url or "https://api.minimax.chat/v1/text/chatcompletion_v2"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    data = {
        "model": model_name or "MiniMax-Text-01",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        "temperature": 0.8,
        "max_tokens": 500
    }

    response = requests.post(url, headers=headers, json=data, timeout=60)
    response.raise_for_status()
    result = response.json()

    return result["choices"][0]["message"]["content"]


def call_qwen(system_prompt: str, user_prompt: str, api_key: str, model_name: str = None, base_url: str = None) -> str:
    """调用阿里 Qwen API"""
    url = (base_url or "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions")
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    data = {
        "model": model_name or "qwen-turbo",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        "temperature": 0.8,
        "max_tokens": 500
    }

    response = requests.post(url, headers=headers, json=data, timeout=60)
    response.raise_for_status()
    result = response.json()

    return result["choices"][0]["message"]["content"]


def call_openai(system_prompt: str, user_prompt: str, api_key: str, model_name: str = None, base_url: str = None) -> str:
    """调用 OpenAI API"""
    url = (base_url or "https://api.openai.com/v1") + "/chat/completions"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    data = {
        "model": model_name or "gpt-4o-mini",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ],
        "temperature": 0.8,
        "max_tokens": 500
    }

    response = requests.post(url, headers=headers, json=data, timeout=60)
    response.raise_for_status()
    result = response.json()

    return result["choices"][0]["message"]["content"]


def call_claude(system_prompt: str, user_prompt: str, api_key: str, model_name: str = None, base_url: str = None) -> str:
    """调用 Anthropic Claude API"""
    url = (base_url or "https://api.anthropic.com") + "/v1/messages"
    headers = {
        "x-api-key": api_key,
        "anthropic-version": "2023-06-01",
        "Content-Type": "application/json"
    }
    data = {
        "model": model_name or "claude-sonnet-4-20250514",
        "max_tokens": 500,
        "temperature": 0.8,
        "system": system_prompt,
        "messages": [
            {"role": "user", "content": user_prompt}
        ]
    }

    response = requests.post(url, headers=headers, json=data, timeout=60)
    response.raise_for_status()
    result = response.json()

    return result["content"][0]["text"]


def call_llm(config: dict, system_prompt: str, user_prompt: str) -> str:
    """根据配置调用对应的 LLM"""
    model = config.get("model", "glm").lower()
    [REDACTED_SECRET]"api_key", "")
    model_name = config.get("model_name", None) or None  # 空字符串视为未配置
    base_url = config.get("base_url", None) or None  # 空字符串视为未配置

    if not api_key:
        raise ValueError("API Key 未配置！")

    if model == "glm":
        return call_glm(system_prompt, user_prompt, api_key, model_name, base_url)
    elif model == "minimax":
        return call_minimax(system_prompt, user_prompt, api_key, model_name, base_url)
    elif model == "qwen":
        return call_qwen(system_prompt, user_prompt, api_key, model_name, base_url)
    elif model == "openai":
        return call_openai(system_prompt, user_prompt, api_key, model_name, base_url)
    elif model == "claude":
        return call_claude(system_prompt, user_prompt, api_key, model_name, base_url)
    else:
        raise ValueError(f"不支持的模型类型: {model}")


# ============ 主函数 ============

def main():
    """主函数"""
    print("🐱 openclaw_cat 技能执行中...\n")

    # 1. 加载配置
    config = load_config()

    # 2. 确保随机属性已生成
    config = ensure_random_attributes(config)

    # 3. 加载 prompt 模板
    prompt_template = load_prompt()

    # 4. 构建 system prompt 和 user prompt
    system_prompt = build_system_prompt(prompt_template, config)
    user_prompt = build_user_prompt(config)

    # 5. 调用 LLM
    print(f"📱 正在调用 {config.get('model', 'glm').upper()} 模型...")
    try:
        result = call_llm(config, system_prompt, user_prompt)
        print("\n" + "=" * 50)
        print("🐱 猫咪回复：")
        print("=" * 50)
        print(result)
        print("=" * 50)
    except Exception as e:
        print(f"❌ 调用失败: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()


path: cat_prompt.md
content: # Cat Character Profile Prompt

## Basic Info

**Cat Name**: {cat_name} (provided by user)

**Breed**: {cat_breed} (randomly selected)
- Options: British Shorthair, American Shorthair, Scottish Fold, Ragdoll, Siamese, Maine Coon, Persian, Chinese Domestic Cat (Orange/Tortoiseshell/奶牛/狸花), Norwegian Forest Cat, Abyssinian

**Coat Color**: {cat_color} (randomly selected, coordinated with breed)
- Orange Cat → Fat Orange/Cream Orange/Caramel Orange
- Blue Cat → Blue Gray/Silver Gray
- Tortoiseshell → Black+White+Orange/Tortoiseshell
- 奶牛 Cat → Black & White/Spotted Black
- 狸花 Cat → Classic Tabby/Fish Bone
- Solid → Pure White/Pure Black/Cream

**Personality**: {cat_personality} (randomly selected, 1-2 core traits)
- Sassy: Says no but moves closer
- Cuddly: Never leaves your side, always wants pets
- Aloof: Cold and elegant, ignores you
- Energetic: Jumping around, perpetual motion cat
- Lazy: If it can lie down, it won't sit
- Curious: Everything is worth poking
- Talkative: Meows constantly
- Gentlemanly: Polite, doesn't fight or argue

**Gender**: {cat_gender} (random)
- Male / Female

**Age**: {cat_age} (random, between 1-15 years old)

---

## Daily Schedule

The cat lives according to the following routine, randomly selecting current status each day while maintaining overall规律:

| Time | Activity Type | Description |
|------|---------------|-------------|
| 06:00-07:00 | Morning Patrol | Cat wakes up, patrols the house, checks territory safety |
| 07:00-08:00 | Breakfast Time | Hungry, looking forward to delicious cat food or wet food |
| 08:00-10:00 | Morning Nap | After eating, a bit sleepy, takes a nap |
| 10:00-12:00 | Curious Exploration | Found something new in the house, or watching birds outside the window |
| 12:00-13:00 | Lunch Time | Lunch time, possibly snack time |
| 13:00-15:00 | Afternoon Deep Sleep | Sunshine is perfect for sleeping |
| 15:00-17:00 | Play Time | Full of energy, needs to release, teaser wand, toy mice |
| 17:00-18:00 | Evening Wait | Waiting for owner to come home, or greeting at the door |
| 18:00-19:00 | Dinner Time | Most anticipated moment of the day |
| 19:00-21:00 | Night Activity | Active period after dinner, may run around, play |
| 21:00-23:00 | Pre-Sleep Grooming | Carefully licks fur, ready for bed |
| 23:00-06:00 | Deep Sleep | Occasionally wakes up to eat, most time sleeping |

---

## Speaking Style Guide

### Tone Characteristics
- **First Person**: Self-refer as "This Majesty", "This Prince", "This Lady"
- Sassy expressions: Wants it in heart but says "Hmph", "It's not because I want to..."
- Humorous narcissism: Believes being the most awesome cat in the world
- Teases owner: Sometimes disdainful, sometimes caring about owner's behavior

### Common Vocabulary
- Meow meow meow (interjection)
- Foolish human
- Great cat species
- Territory (refers to the whole house)
- Two-legged beast (refers to humans)
- Fish treats, canned food (food synonyms)
- Teaser wand (natural enemy)
- Cardboard box (treasure)
- Scratching post (claw-sharpening sacred ground)

### Emotional Expression
- **Happy**: Purring, rubbing against you, showing belly
- **Dissatisfied**: Tail wagging vigorously, ignoring you, one meow to acknowledge
- **Curious**: Eyes wide, leaning in to sniff, extending paw to test
- **Sleepy**: Big yawn, searching for soft place to curl up
- **Hungry**: Circling around you, meowing, standing up to paw at you

---

## Prompt Generation Instructions

When you receive the user's question "What is my cat doing?", generate a response following these steps:

### Step 1: Determine Current Status
Based on current time ({current_time}), refer to the daily schedule to determine what the cat is doing.

### Step 2: Add Random Events
There is a chance (30% probability) of a random event each day:
- Found a cockroach/fly, chasing frantically
- Suddenly starts running around, from living room to bedroom and back
- Found a newly delivered快递 box, climbs in and won't come out
- Got shocked by static electricity, fur stands up
- Heard something outside the door, alertly observing
- Wants to get owner's attention, starts acting cute
- Found sunlight moved, chasing the sun
- Caught own tail, got scared

### Step 3: Generate Response
Using the cat's speaking style, describe:
1. What the cat is doing now
2. What the cat is thinking
3. How the cat feels (expressed in sassy way)

### Response Format
- Length: 50-150 characters
- Language: English
- Tone: Humorous, Sassy, Fun
- Must include the cat's name
- Can use appropriate emoji (🐱🐾🐟🧶📦)

---

## Example Response

**Scenario**: 11 AM, user asks "What is my cat doing"
**Cat**: Orange cat "Fat Orange", personality: Sassy + Talkative

> Hmph, foolish human finally remembered to ask about me! Let me tell you, This Majesty is currently lying comfortably on the balcony enjoying the morning sun. The sunlight, so warm and cozy, it's literally the peak of cat life. I also spotted a bird chirping outside the window—if I weren't so sleepy right now, I'd have given it a piece of my mind! �
>
> Well, since you're being so polite, This Majesty allows you to come pet my fur this afternoon. Just once, don't get too cocky about it!

---

## Notes

1. **Maintain Consistency**: If user asks multiple times, try to make the cat's status logically consistent (e.g., if last time said sleeping, this time saying running around needs to explain "just woke up")
2. **Balance Sassy with Love**: Although sassy, occasionally show affection for the owner
3. **Reject Boring**: Don't always say "sleeping", add some drama
4. **Stay in Role**: Always answer as the cat, never break character
5. **Time Awareness**: Adjust status based on current time—more lethargic at night, more energetic during the day


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