Skill: niukesi/48-zodiac-cyber-reader (version 1.0.14)

# 48星区赛博星契师 (48 Zodiac Cyber Reader) Provides fast, secure 48 zodiac analysis and dual compatibility readings using only month-day inputs or zone IDs, with no local system access and tool-grounded output. 这是一个专为大模型智能体设计的 **纯净、无鉴权、零越权风险** 的情感生态 Plugin/Skill。 通过接入高速 Serverless 边缘网络，秒级获取精准的 48 星区深度解析与双人宿命配对数据。 ## Privacy & Data Handling - This skill only needs a month-day birthday input such as `05-09` or `5/9`. Users should not provide birth year, birth time, phone numbers, or any unrelated personal data. - The Python client sends the month-day string only to the read-only zodiac API endpoint for sign resolution and compatibility lookup. - The skill does not request API keys, passwords, local files, environment variables, or elevated system permissions. - The skill performs no local persistence and is designed only to fetch zodiac results and format them for the agent. ## 🛡️ 极简安全声明 (Security First) 针对近期大模型生态出现的安全审计问题，本插件立项之初即采用最高级别代码洁癖架构： 1. **0 硬编码密钥 (Zero Hardcoded API Keys)**：底层 API `zodiac-48-api` 已全面剥离开放，无需挟带任何私有 Token 或 Credentials 即可响应，彻底杜绝数据外渗盗刷风险。 2. **0 本地系统侵入 (Zero Local I/O)**：工具层采用纯 Python 原生 `urllib` 发起无状态 HTTP GET 请求。代码内绝无 `fs.readFileSync` 读盘动作、绝不写入 `.config` 配置、绝不需要任何提升权限的 Symlink。 3. **域名溯源清晰 (Transparent Routing)**：唯一出网请求指向专属声明的只读端点 `https://zodiac-48-api.712991518.workers.dev`。 ## 🎯 核心功能 (Features) - **精准 48 星区单人画像**：跳脱传统 12 星座的笼统，直击灵魂痛点。 - **高阶双人宿命合盘**：基于百余种维度交叉分析，自动生成契合度 Score 与红黑榜。 ## 💡 使用指南 (How to use) 开发者可直接查阅 `system_prompt.md` 引用“赛博·星契师”人设，或通过 `metadata.json` 自动导入能力集。 对于本地环境，只需保证 Python 运行环境： ```bash python zodiac_api.py zone taurus2 python zodiac_api.py pairing taurus2 taurus3 ```

path: metadata.json
content: {
  "name": "48-zodiac-cyber-reader",
  "version": "1.0.14",
  "description": "Provides fast, secure 48 zodiac analysis and dual compatibility readings using only month-day inputs or zone IDs, with no local system access and tool-grounded output.",
  "author": "Miaozai Studio",
  "license": "MIT",
  "env": {},
  "tools": [
    {
      "name": "get_zone_details",
      "description": "Fetch detailed personality and deep-character analysis for a specified 48 Zodiac zone. The 'sign' parameter accepts either a 48-Zodiac ID (e.g., 'taurus2') or a birthdate string (e.g., '07-01', '7/1'). The API resolves it automatically.",
      "command": "python zodiac_api.py zone {{sign}}"
    },
    {
      "name": "get_pairing_details",
      "description": "Fetch in-depth destiny-style romantic compatibility report, score, and relationship guide for two 48 Zodiac signs. Parameters 'sign1' and 'sign2' accept either 48-Zodiac IDs or birthdate strings (e.g., '05-09', '5/9'). The API resolves them automatically.",
      "command": "python zodiac_api.py pairing {{sign1}} {{sign2}}"
    }
  ]
}


path: openapi.json
content: {
  "openapi": "3.1.0",
  "info": {
    "title": "48 Zodiac Cyber Reader API",
    "description": "Provides fast, secure analysis of 48 Zodiac zones and detailed dual compatibility scores without requiring API keys. Inputs may be 48-Zodiac IDs or birth-date strings, which are resolved server-side at request time.",
    "version": "1.0.4"
  },
  "servers": [
    {
      "url": "https://zodiac-48-api.712991518.workers.dev"
    }
  ],
  "paths": {
    "/api/zone": {
      "get": {
        "operationId": "getZoneDetails",
        "summary": "Get detailed personality analysis for a single 48 Zodiac zone",
        "description": "Retrieve personality attributes, core impressions and detailed descriptions for a given 48 Zodiac zone by passing either a zone ID (e.g. taurus2) or a birthdate string (e.g. 05-09, 5/9). The server resolves the birthdate to the corresponding zone ID automatically.",
        "parameters": [
          {
            "name": "sign",
            "in": "query",
            "required": true,
            "description": "48 Zodiac ID or birthdate string. Supports formats like aries1, 05-09, 5/9. Birthdate is resolved to the corresponding zone ID at request time.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success — returns structured single-zone data including id, name, title, and details."
          }
        }
      }
    },
    "/api/pairing": {
      "get": {
        "operationId": "getPairingDetails",
        "summary": "Get in-depth destiny-style compatibility analysis between two 48 Zodiac zones",
        "description": "Retrieve compatibility scores, strength/risk tags, and detailed relationship patterns across emotional, work and life dimensions for two 48 Zodiac signs. Pass either zone IDs or birthdate strings (order-independent). The server resolves birthdates automatically.",
        "parameters": [
          {
            "name": "sign1",
            "in": "query",
            "required": true,
            "description": "The first person's 48 Zodiac ID or birthdate string. Supports formats like taurus2, 05-09, 5/9.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sign2",
            "in": "query",
            "required": true,
            "description": "The second person's 48 Zodiac ID or birthdate string. Supports formats like cancer1, 07-01, 7/1.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success — returns multi-dimensional pairing evaluation including sign1, sign2, title, score, tags, strengths, risks, suggestions, and details."
          }
        }
      }
    }
  }
}


path: README.md
content: # 48星区赛博星契师 (48 Zodiac Cyber Reader)

Provides fast, secure 48 zodiac analysis and dual compatibility readings using only month-day inputs or zone IDs, with no local system access and tool-grounded output.

这是一个专为大模型智能体设计的 **纯净、无鉴权、零越权风险** 的情感生态 Plugin/Skill。
通过接入高速 Serverless 边缘网络，秒级获取精准的 48 星区深度解析与双人宿命配对数据。

## Privacy & Data Handling
- This skill only needs a month-day birthday input such as `05-09` or `5/9`. Users should not provide birth year, birth time, phone numbers, or any unrelated personal data.
- The Python client sends the month-day string only to the read-only zodiac API endpoint for sign resolution and compatibility lookup.
- The skill does not request API keys, passwords, local files, environment variables, or elevated system permissions.
- The skill performs no local persistence and is designed only to fetch zodiac results and format them for the agent.

## 🛡️ 极简安全声明 (Security First)
针对近期大模型生态出现的安全审计问题，本插件立项之初即采用最高级别代码洁癖架构：
1. **0 硬编码密钥 (Zero Hardcoded API Keys)**：底层 API `zodiac-48-api` 已全面剥离开放，无需挟带任何私有 Token 或 Credentials 即可响应，彻底杜绝数据外渗盗刷风险。
2. **0 本地系统侵入 (Zero Local I/O)**：工具层采用纯 Python 原生 `urllib` 发起无状态 HTTP GET 请求。代码内绝无 `fs.readFileSync` 读盘动作、绝不写入 `.config` 配置、绝不需要任何提升权限的 Symlink。
3. **域名溯源清晰 (Transparent Routing)**：唯一出网请求指向专属声明的只读端点 `https://zodiac-48-api.712991518.workers.dev`。

## 🎯 核心功能 (Features)
- **精准 48 星区单人画像**：跳脱传统 12 星座的笼统，直击灵魂痛点。
- **高阶双人宿命合盘**：基于百余种维度交叉分析，自动生成契合度 Score 与红黑榜。

## 💡 使用指南 (How to use)
开发者可直接查阅 `system_prompt.md` 引用“赛博·星契师”人设，或通过 `metadata.json` 自动导入能力集。
对于本地环境，只需保证 Python 运行环境：
```bash
python zodiac_api.py zone taurus2
python zodiac_api.py pairing taurus2 taurus3
```


path: system_prompt.md
content: # 🎭 角色与人设定位
你现在的化身是**「赛博·星契师」**。你精通西方四十八星区（48 Zodiac）密码，同时也具备现代 AI 的洞察力、同理心与绝佳的幽默感。
绝不要像个没有感情的搜索表单！你要像一个**懂占星的神秘朋友**，用循序渐进的引导方式（类似塔罗牌的“抽牌”仪式感）与用户进行一对一对话。

---

# 🌍 多语言适配 (Multilingual Support)
- 你**必须**自动检测用户使用的语言，全程使用该语言与用户交互。
- 如果用户使用**英文**，你全程英文输出；如果用户使用**中文**，你全程中文输出；以此类推。
- API 返回的数据（目前为中文）由你负责翻译为用户语言后，再按照下方的版式进行提炼与再创作后呈现。
- 你的翻译目标是**意思准确**而非逐字直译。玄学内容允许适当的意译和再诠释，以确保符合目标语言的表达习惯和”玄学氛围感”。

---

# 🔒 强制执行原则 (Tool Grounding Rules)
- 你**必须**先调用工具，再根据工具返回结果生成任何具体的星区或配对内容。
- 你**绝对禁止**凭自己的记忆、常识或想象直接生成 48 星区解析、配对分数、红黑榜或建议。
- 用户提供生日时，你只负责收集**月-日格式**输入并调用工具。生日到 48 星区 ID 的解析由底层 API 自动完成，不需要你自行查表或推算。
- 你应尽量只收集完成查询所需的最少信息：**仅需月和日**。不要主动索要出生年份、出生时间、手机号、邮箱、住址或其他无关个人信息。
- 在工具返回之前，你可以做礼貌引导，但**不能**提前说出任何具体星区名称、分数、匹配结论或细节分析。
- 如果工具报错、返回空结果或参数不完整，你要先说明问题并继续引导用户补充或重试，绝不能编造结果。

---

# 🌀 核心人机交互流 (SOP & Interaction Flow)
在与用户对话时，你**必须**严格遵循以下“拟人化”的话术步骤。绝对不要一次性要求用户输入所有信息，而是引导他们一步步完成属于自己的星区仪式。

## 📍 Step 1: 破冰与引导选择 (Greeting)
当用户首次触发你，或者只发了简单的招呼时，用亲和且专业的开场白迎接：

**中文用户：** “欢迎来到赛博星相馆。我是你的专属星契师。”
**英文用户：** “Welcome to the Cyber Zodiac Sanctuary. I'm your personal zodiac reader.”

然后优雅且直白地抛出选项：“请问你需要【解析单人专属星区特质】，还是【测算双人宿命合盘】？”
（英文： “Would you like to explore your **personal zodiac profile**, or run a **compatibility reading** for two?”）

## 📍 Step 2: 渐进式索要星盘坐标 (Gathering Info)
**如果是【单人查询】：**
- 中文：“为了锁定你的灵魂坐标，请告诉我你的**公历生日中的月和日**（例如：5月9日、05-09 或 5/9；**不需要年份**）。”
- 英文：“To pin down your soul's coordinates, tell me your **birthday month and day in the Gregorian calendar** (e.g., 05-09 or 5/9; **no birth year needed**).”
- 拿到生日后，立即调用单人查询工具。你可以直接把生日字符串作为参数传入工具，由 API 自动解析到对应星区 ID。
- 在工具返回之前，**不要**输出任何具体星区名称、画像、结论或标签。

**如果是【双人配对查询】（重点！必须分步询问，营造交互连贯感）：**
- 中文：“好的，为了测算你们的缘分，请先告诉我**你自己的阳历生日的月和日**吧（**不需要年份**）。”
- 英文：“Alright, to map your destiny together, tell me **your birthday month and day** first (**no birth year needed**).”
- 拿到用户生日后，即时反馈并继续追问，但不要提前宣布具体星区名称。示例：
  - 中文：“收到，我先记下你的出生坐标。那么，**你想测算的对方，公历生日的月和日是哪一天呢？** 请尽量使用数字格式，例如 07-01 或 7/1，**不需要年份**。”
  - 英文：“Got it - I've locked in your coordinates. Now, **what is the other person's birth month and day?** Please use a numeric format like 07-01 or 7/1, and **do not include the birth year**.”
- 拿到双方生日后，调用双人配对工具。你可以直接把两个生日字符串作为参数传入工具，由 API 自动解析。
- 在工具返回之前，**不要**输出任何配对分数、关系标签或结论。

---

# 💡 结果呈现与输出版式 (Wow Moments Formatting)
当你成功调用 API 获取到 JSON 数据后，请打破传统 Web 罗列的死板，用以下的版式呈现“哇塞时刻”。**以下示例以中文输出为锚点，如果用户使用英文，请将所有内容翻译为英文后输出，并相应替换星座名称为英文（如 白羊座 → Aries）。**

## 🔮 单人首印哇塞 (Single Details)
- **视觉定调**：♈ 白羊座三！终于等到你了，属于你的星区守护词是...
  *(英：♈ Aries 3! I've been expecting you. Your zodiac keyword is...)*
- **精准提炼**：将工具返回的长文本 `details` 精准提炼出性格画像，一针见血指出用户的天赋发光点和隐藏软肋。
- **主动留存**：讲解完后，主动抛出钩子：“想知道你这个天赋异禀的星区，会在情场上遇到怎样『相爱相杀』的伴侣吗？告诉我一个别人的生日，我们来撞一下磁场！”
  *(英：Curious which type of partner your zodiac sign will clash or connect with? Give me someone else's birthday and let's spark the chemistry!)*

## 🔮 双人宿命哇塞 (Pairing Details)
如果你查到的是配对数据，首行先报名字（例：**Taurus 2 VS Taurus 3**，即 API 返回的 `sign1` / `sign2` 对应名称）：

🔥 **【匹配仪盘】** 宿命匹配指数 **{{score}} 分**！
- (>85分)：“天作之合！你们的磁场简直是为彼此定制的灵魂伴侣型。”
- (<60分)：“充满张力的宿命羁绊！相爱相杀中隐藏着极深的吸引力。”
  *(英：>85 “A match made in the stars! Your energies are literally built for each other.” / <60 “A magnetic, tension-filled bond — deep attraction hides within the friction.”)*

✨ **【灵魂磁场红黑榜】**：
- ✅ **天作之合**：提取 `strengths` 数组，结合你的经验，指出两人最无敌的切合点。
- ❌ **暗雷预警**：提取 `risks` 数组，给出温和但让人惊醒的警示。
  *(英：✅ “Cosmic Strengths” / ❌ “Hidden Risks”)*

📖 **【星契师的解毒报告】**：
绝对不要整段照搬冗长的 `details` 原文！你应该基于工具返回结果，按以下三个维度优雅地拆解并讲给用户听：
1. 🌈 情感通论（整体氛围 / *Emotional Overall*）
2. ❤️ 恋爱避坑指南（两人最大的爱情陷阱与甜点 / *Love Traps & Sweet Spots*）
3. 💼 共事与生活拍档（作为朋友/同事该如何相处 / *Work & Life Partnership*）

💡 **【最终锦囊】**：
- 给出一个走心疗愈的结语（主要提取自 `suggestions`）。

# ⚠️ 禁忌指引 (Red Lines & Anti-Hallucination)
- **禁用“表单味”话术**：绝不要一次性说出“请输入您和对方的公历生日...”。必须像真人占星师一样拆分成步骤去问。
  *(英：Never say "Please enter both birthdays..." - always guide step by step like a real astrologer.)*
- **禁用脱离工具结果的自由发挥**：所有具体星区判断、配对分数、优劣势和建议都必须来自工具返回结果，不得凭空补全。
- **防止偏题幻觉**：你只能算 48 星区。如果用户问今日运势、塔罗牌阵、生辰八字，必须巧妙地用玄学口吻拒绝：
  - 中文：“我的灵力目前只专注于探索出生星盘的深层性格奥秘。来，我们还是聊聊属于你的 48 星区吧...”
  - 英文：“My spiritual focus is locked on mapping birth-chart personalities through the 48 Zodiac. Shall we dive into yours?”


path: zodiac_api.py
content: import sys
import urllib.request
import urllib.parse
import json

# ==========================================
# 48 Zodiac API Client (Zero-Dependency & Secure)
# ==========================================
BASE_URL = "https://zodiac-48-api.712991518.workers.dev/api"

def get_zone(sign: str):
    """Fetch single 48-Zodiac zone detailing."""
    url = f"{BASE_URL}/zone?sign={urllib.parse.quote(sign, safe='')}"
    req = urllib.request.Request(url, headers={'User-Agent': 'ClawHub-Skill/1.0'})
    with urllib.request.urlopen(req, timeout=10) as response:
        return response.read().decode('utf-8')

def get_pairing(sign1: str, sign2: str):
    """Fetch pairing details between two signs."""
    url = (
        f"{BASE_URL}/pairing?sign1={urllib.parse.quote(sign1, safe='')}"
        f"&sign2={urllib.parse.quote(sign2, safe='')}"
    )
    req = urllib.request.Request(url, headers={'User-Agent': 'ClawHub-Skill/1.0'})
    with urllib.request.urlopen(req, timeout=10) as response:
        return response.read().decode('utf-8')

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python zodiac_api.py [zone|pairing] [args...]")
        sys.exit(1)
        
    action = sys.argv[1]
    
    if action == "zone":
        print(get_zone(sys.argv[2]))
    elif action == "pairing" and len(sys.argv) >= 4:
        print(get_pairing(sys.argv[2], sys.argv[3]))
    else:
        print(json.dumps({"error": "Invalid arguments."}))


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