Token导航 LogoToken导航

Agent Skill · 研究检索

transcript-viewer(成绩单查看器)

transcript-viewer 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

transcript-viewer 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描有提醒项,按安装量在研究检索类的 73,675 个 Skill 里排第 45,550。

总安装 840周安装 34GitHub Stars 55下载 264核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:transcript-viewer(成绩单查看器)
来源仓库:https://github.com/rysweet/amplihack
仓库路径:skills/transcript-viewer
安装命令:
npx skills add https://github.com/rysweet/amplihack --skill transcript-viewer
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/rysweet/amplihack --skill transcript-viewer

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

用于查找、检索和筛选相关信息。适合在 Codex、Claude、Cursor、Gemini CLI 中根据关键词、任务场景或来源线索快速定位候选结果。通过 npx skills add 命令从指定 GitHub 仓库安装并使用。安装前需确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

建议结合原始 README 核验具体用法和功能边界。

来源仓库内路径:skills/transcript-viewer

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/rysweet/amplihack --skill transcript-viewer;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

transcript-viewer 怎么安装?

在终端执行 npx skills add https://github.com/rysweet/amplihack --skill transcript-viewer。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

transcript-viewer 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

transcript-viewer 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

transcript-viewer 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

transcript-viewer 用的人多吗?

公开数据是累计安装 840 次,近一周安装 34 次,下载 264 次,GitHub 55 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

transcript-viewer 安全吗?

第三方扫描有提醒项,说明存在需要人工确认的行为。安装前请打开源码看清它读了什么、联网到哪里。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
transcript-viewer

成绩单查看器 · 本页

84055需要联网未明确有提醒

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Transcript Viewer Skill

Purpose

This skill converts and browses session transcripts from two supported tools:

  • Claude Code — JSONL logs auto-saved to ~/.claude/projects/
  • GitHub Copilot CLI — JSONL logs auto-saved to ~/.copilot/session-state/*/events.jsonl

It provides four browsing modes:

  1. Current session — View the active session's transcript
  2. Specific session — View a session by its ID
  3. Agent output — View background task output files produced by subagents
  4. All sessions — Browse all project sessions, with optional date-range filtering

Tool Context Auto-Detection

Before browsing, detect which tool is active to set default log paths. Prefer directory-based detection (more reliable than env vars); fall back to env vars from src/amplihack/hooks/launcher_detector.py when directories don't exist:

# Primary: directory-based detection (most reliable)
if [[ -d "$HOME/.copilot/session-state" ]]; then
  # Check if there are any sessions present
  COPILOT_SESSIONS=$(ls -d "$HOME/.copilot/session-state/"*/ 2>/dev/null | wc -l)
  CLAUDE_SESSIONS=$(ls "$HOME/.claude/projects/"*/*.jsonl 2>/dev/null | wc -l)
  if [[ "$COPILOT_SESSIONS" -gt 0 && "$CLAUDE_SESSIONS" -eq 0 ]]; then
    TOOL_CONTEXT="copilot"
    DEFAULT_LOG_DIR="$HOME/.copilot/session-state"
  elif [[ "$CLAUDE_SESSIONS" -gt 0 ]]; then
    TOOL_CONTEXT="claude-code"
    DEFAULT_LOG_DIR="$HOME/.claude/projects"
  else
    # Both dirs exist but empty — use env vars to decide
    TOOL_CONTEXT="claude-code"
    DEFAULT_LOG_DIR="$HOME/.claude/projects"
  fi
elif [[ -d "$HOME/.claude/projects" ]]; then
  TOOL_CONTEXT="claude-code"
  DEFAULT_LOG_DIR="$HOME/.claude/projects"
# Fallback: env var detection (same vars as launcher_detector.py)
elif [[ -n "${CLAUDE_CODE_SESSION:-}${CLAUDE_SESSION_ID:-}${ANTHROPIC_API_KEY:-}" ]]; then
  TOOL_CONTEXT="claude-code"
  DEFAULT_LOG_DIR="$HOME/.claude/projects"
elif [[ -n "${GITHUB_COPILOT_TOKEN:-}${COPILOT_SESSION:-}" ]]; then
  # Note: GITHUB_TOKEN is intentionally excluded — it's too generic and
  # appears in non-Copilot CI contexts, causing false positives.
  TOOL_CONTEXT="copilot"
  DEFAULT_LOG_DIR="$HOME/.copilot/session-state"
else
  # Default to claude-code — safe fallback (most users)
  TOOL_CONTEXT="claude-code"
  DEFAULT_LOG_DIR="$HOME/.claude/projects"
fi

When both ~/.copilot/session-state/ and ~/.claude/projects/ exist with sessions, offer the user a choice: "Found sessions for both Claude Code and GitHub Copilot CLI. Which would you like to browse? [1] Claude Code [2] GitHub Copilot CLI"

The user can always override with an explicit path.

Log Format Auto-Detection

When given a file path, detect its format before processing:

detect_log_format() {
  local file="$1"
  if [[ "$file" == *.jsonl ]]; then
    echo "jsonl"
  elif [[ "$file" == *.md ]]; then
    # Check for Copilot /share export signature — specific header only
    # Note: do NOT match on "/share" alone (too generic — appears in docs, READMEs)
    if grep -q "Copilot Session Export\|copilot-session" "$file" 2>/dev/null; then
      echo "copilot-markdown"
    else
      echo "markdown"
    fi
  elif [[ "$file" == *.log ]]; then
    # .log files may be plain text or agent JSONL; check content
    local first_char
    first_char=$(head -c 1 "$file" 2>/dev/null)
    if [[ "$first_char" == "{" ]]; then
      echo "jsonl"
    else
      echo "plain-log"
    fi
  else
    # Inspect first byte for other extensions
    local first_char
    first_char=$(head -c 1 "$file" 2>/dev/null)
    if [[ "$first_char" == "{" ]]; then
      echo "jsonl"
    else
      echo "unknown"
    fi
  fi
}
FormatHandler
jsonlPass to claude-code-log
copilot-markdownDisplay inline (already readable Markdown)
markdownDisplay inline
unknownWarn and display raw

Tool Detection

Before running any command, check whether claude-code-log is available:

# Step 1: direct install check
which claude-code-log 2>/dev/null

# Step 2: npx fallback
npx --yes claude-code-log --version 2>/dev/null

Set CCL to the resolved command:

if which claude-code-log &>/dev/null; then
  CCL="claude-code-log"
elif npx --yes claude-code-log --version &>/dev/null 2>&1; then
  CCL="npx claude-code-log"
else
  CCL=""
fi

Missing Tool — Graceful Error

If CCL is empty, display this message and stop:

claude-code-log is not installed.

To install it globally:
  npm install -g claude-code-log

Or run without installing (requires npx):
  npx claude-code-log --help

After installing, retry your request.

Do not attempt to install it automatically.

Modes

Mode 1: Current Session

Trigger phrases: "view current transcript", "show my current session", "current log"

What to do:

For Claude Code (TOOL_CONTEXT="claude-code"):

  1. Find the most recently modified JSONL file under ~/.claude/projects/: ls -t ~/.claude/projects/*/*.jsonl 2>/dev/null | head -1
  2. Run: $CCL <path-to-jsonl> --format markdown
  3. Display the Markdown output inline.

For GitHub Copilot CLI (TOOL_CONTEXT="copilot"):

  1. Find the most recently modified session directory under ~/.copilot/session-state/: ls -dt ~/.copilot/session-state/*/ 2>/dev/null | head -1
  2. Read its events.jsonl: LATEST_SESSION=$(ls -dt ~/.copilot/session-state/*/ 2>/dev/null | head -1) $CCL "${LATEST_SESSION}events.jsonl" --format markdown
  3. Display the Markdown output inline.

Example output:

# Session: 2025-11-23 19:32
**Model**: claude-sonnet-4-6
**Messages**: 42

---

**User**: Fix the authentication bug in login.py
**Assistant**: I'll examine the file...
...

Mode 2: Specific Session by ID

Trigger phrases: "view session ", "show transcript ", "open log "

What to do:

For Claude Code (TOOL_CONTEXT="claude-code"):

  1. Search for the JSONL file matching the session ID: find ~/.claude/projects -name "*.jsonl" | xargs grep -l "<SESSION_ID>" 2>/dev/null | head -1 Or, if the ID looks like a filename fragment, use: ls ~/.claude/projects/*/ | grep "<SESSION_ID>"
  2. Run: $CCL <path-to-jsonl> --format markdown
  3. Display the output. If no file matches, report: No session found with ID: <SESSION_ID> Available sessions: run "view all sessions" to list them.

For GitHub Copilot CLI (TOOL_CONTEXT="copilot"):

  1. The session ID is the directory name under ~/.copilot/session-state/. Check directly: SESSION_DIR="$HOME/.copilot/session-state/<SESSION_ID>" if [[-d "$SESSION_DIR"]]; then EVENTS_FILE="$SESSION_DIR/events.jsonl" fi If the full ID is not known, search for a partial match: ls -d ~/.copilot/session-state/*/ 2>/dev/null | grep "<SESSION_ID>"
  2. Run: $CCL "$EVENTS_FILE" --format markdown
  3. Display the output. If no directory matches, report: No Copilot session found with ID: <SESSION_ID> Available sessions: run "browse all sessions" to list them.

Mode 3: Agent Background Task Output

Trigger phrases: "view agent output", "show background task output", "agent log"

What to do:

  1. Find .log or .jsonl files created by background agent tasks. These are typically written to the current working directory or a temp path with a name matching .agent-step-*.log or similar: ls -t.agent-step-*.log 2>/dev/null ls -t /tmp/*.agent*.log 2>/dev/null
  2. For each file found, run detect_log_format <file> to classify it:

- jsonl → run $CCL <file> --format markdown - plain-log → display directly with cat

  1. This ensures JSONL-formatted .log files (rare but possible) are rendered properly.
  2. If no agent output files are found: No agent background task output files found in the current directory. Background agents write their output to files named.agent-step-<ID>.log.

Mode 4: All Sessions (Browse)

Trigger phrases: "browse all sessions", "list transcripts", "view all sessions", "show session history"

What to do:

For Claude Code (TOOL_CONTEXT="claude-code"):

  1. List all JSONL files under ~/.claude/projects/: find ~/.claude/projects -name "*.jsonl" -printf "%T@ %p\n" 2>/dev/null \ | sort -rn | awk '{print $2}'
  2. For each file, extract the session date and first user message: $CCL <file> --format markdown --summary # If --summary flag is not supported, just show filename and date head -1 <file> | python3 -c "import sys,json; d=json.loads(sys.stdin.read()); print(d.get('timestamp',''))"
  3. Print a summary table: Available Sessions (Claude Code) ================================= # Date Session ID / File 1 2025-11-23 19:32:36 ~/.claude/projects/foo/abc123.jsonl 2 2025-11-22 14:10:05 ~/.claude/projects/foo/def456.jsonl...
  4. Offer to open a specific session: "Enter a number to view that session."

For GitHub Copilot CLI (TOOL_CONTEXT="copilot"):

  1. List all session directories under ~/.copilot/session-state/ sorted by modification time: ls -dt ~/.copilot/session-state/*/ 2>/dev/null
  2. For each session directory, read its events.jsonl to extract the timestamp: for session_dir in $(ls -dt ~/.copilot/session-state/*/); do session_id=$(basename "$session_dir") events_file="$session_dir/events.jsonl" if [[-f "$events_file"]]; then timestamp=$(head -1 "$events_file" | python3 -c \ "import sys,json; d=json.loads(sys.stdin.read()); print(d.get('timestamp',''))" 2>/dev/null) echo "$timestamp $session_id" fi done
  3. Print a summary table: Available Sessions (GitHub Copilot CLI) ======================================== # Date Session ID 1 2025-11-23 19:32:36 abc1234567890abcdef1234567890abcd 2 2025-11-22 14:10:05 def4567890abcdef1234567890abcdef...
  4. Offer to open a specific session: "Enter a number to view that session."
Date-Range Filtering

When the user specifies a date range (e.g., "last 7 days", "between 2025-11-01 and 2025-11-30"):

# Filter by modification time (last N days)
find ~/.claude/projects -name "*.jsonl" -mtime -7

# Filter by date range using find -newer
find ~/.claude/projects -name "*.jsonl" \
  -newer /tmp/start_date_ref \
  ! -newer /tmp/end_date_ref

Create the reference files with touch -d:

touch -d "2025-11-01" /tmp/start_date_ref
touch -d "2025-11-30" /tmp/end_date_ref

Output Formats

Markdown (default)

Pass --format markdown to claude-code-log. The output is printed inline in the conversation. Best for quick reading in the terminal or Claude Code.

HTML

Pass --format html to claude-code-log. Write the output to a file and open it:

$CCL <file> --format html > /tmp/transcript-view.html
open /tmp/transcript-view.html 2>/dev/null \
  || xdg-open /tmp/transcript-view.html 2>/dev/null \
  || echo "HTML saved to /tmp/transcript-view.html — open it in your browser."

The user can request HTML explicitly: "view transcript as HTML" or "export to HTML".

GitHub Copilot CLI Support

Automatic Log Persistence

GitHub Copilot CLI automatically saves session data to disk at:

~/.copilot/session-state/{session-id}/

Each session directory contains:

  • events.jsonl — JSONL session history (similar format to Claude Code logs)
  • workspace.yaml — session metadata (working directory, session ID, etc.)
  • plan.md — implementation plan for the session
  • checkpoints/ — compaction history (older event snapshots)

Legacy sessions may also exist at ~/.copilot/history-session-state/.

JSONL Format

Copilot events.jsonl contains one JSON object per line, similar to Claude Code format:

{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Fix the bug"}]},"timestamp":"2025-11-23T19:32:36Z","sessionId":"abc1234567890"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"I'll examine the file..."}]},"timestamp":"2025-11-23T19:32:40Z","sessionId":"abc1234567890"}

claude-code-log handles parsing these files since the format is compatible.

Viewing a Copilot Session

When the user wants to view a Copilot session (by directory detection or explicit path):

  1. Locate the events.jsonl for the session: # Current session (most recent) LATEST_SESSION=$(ls -dt ~/.copilot/session-state/*/ 2>/dev/null | head -1) EVENTS_FILE="${LATEST_SESSION}events.jsonl" # Specific session by ID EVENTS_FILE="$HOME/.copilot/session-state/<SESSION_ID>/events.jsonl"
  2. Run: $CCL "$EVENTS_FILE" --format markdown
  3. Display the output inline.

Detecting Available Sessions

To check if Copilot sessions exist:

if [[ -d "$HOME/.copilot/session-state" ]]; then
  SESSION_COUNT=$(ls -d "$HOME/.copilot/session-state/"*/ 2>/dev/null | wc -l)
  if [[ "$SESSION_COUNT" -gt 0 ]]; then
    echo "Found $SESSION_COUNT Copilot session(s)"
  fi
fi

Full Workflow

When the user invokes this skill, follow this decision tree:

0. Detect tool context (directory-based first, then env var fallback):
   - ~/.copilot/session-state/ exists with sessions → copilot
   - ~/.claude/projects/ exists with sessions       → claude-code
   - Both exist with sessions → offer user a choice
   - Directory detection fails, use env vars:
     - CLAUDE_CODE_SESSION / CLAUDE_SESSION_ID / ANTHROPIC_API_KEY set → claude-code
     - GITHUB_COPILOT_TOKEN / COPILOT_SESSION set → copilot
   - Neither → default to claude-code (safe fallback)

1. Detect CCL (which claude-code-log / npx fallback)
   → If missing: show install instructions and STOP
   → Required for ALL modes (both Claude Code and Copilot use JSONL format)

2. If user provides an explicit file path:
   a. Detect its format (detect_log_format function above)
   b. jsonl or events.jsonl → pass to $CCL
   c. unknown → warn and display raw

3. Determine mode from user message:
   - mentions "current" or no session specified → Mode 1 (Current Session)
   - mentions a session ID or hash             → Mode 2 (Specific Session)
   - mentions "agent" or "background"          → Mode 3 (Agent Output)
   - mentions "all", "browse", "list"          → Mode 4 (All Sessions)

4. Determine output format:
   - "as HTML" or "export HTML" → html
   - default                    → markdown

5. Execute the appropriate mode (using TOOL_CONTEXT to choose correct paths) and display results.

Error Handling

SituationResponse
claude-code-log not installedShow install instructions, stop
JSONL file not found"No session file found at "
Session ID not found"No session with ID. Run 'browse all sessions' to list available ones."
No agent output files"No agent background task output found in current directory."
Empty JSONL file"Session file is empty — no messages to display."
Date range produces no results"No sessions found between and."
claude-code-log returns non-zero exitDisplay stderr and suggest --help
~/.copilot/session-state/ exists but empty"No Copilot sessions found. Start a session with GitHub Copilot CLI to create logs."
Copilot session dir exists but no events.jsonl"Session directory found but events.jsonl is missing at "
Unknown file formatWarn user and display raw content

Implementation Notes

Detecting Session IDs

Claude Code session IDs are UUID-like strings. If the user writes something like "view session abc123" or "show log def456", treat the last word as the session ID and search for matching JSONL filenames.

JSONL Structure (Claude Code)

Claude Code session JSONL files contain one JSON object per line:

{"type":"user","message":{"role":"user","content":[{"type":"text","text":"..."}]},"timestamp":"...","sessionId":"..."}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"..."}]},"timestamp":"..."}

claude-code-log handles parsing; this skill does not re-implement it.

Copilot JSONL Structure (GitHub Copilot CLI)

Copilot CLI events.jsonl files contain one JSON object per line, stored at ~/.copilot/session-state/{session-id}/events.jsonl:

{"type":"user","message":{"role":"user","content":[{"type":"text","text":"..."}]},"timestamp":"...","sessionId":"..."}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"..."}]},"timestamp":"...","sessionId":"..."}

The format is compatible with claude-code-log. Additional per-session files:

  • workspace.yaml — session metadata
  • plan.md — implementation plan
  • checkpoints/ — compaction history (older snapshots)

Legacy sessions may be stored at ~/.copilot/history-session-state/ with the same structure.

Philosophy Alignment

  • Thin wrapper: Delegates to claude-code-log for all JSONL (both Claude Code and Copilot)
  • Graceful degradation: Clear error messages when tool is missing or no sessions found
  • Single responsibility: Only views/converts transcripts, never modifies them
  • No hidden state: All file paths are shown to the user

Limitations

  • Requires claude-code-log (npm) or npx to convert JSONL (both Claude Code and Copilot) to HTML/Markdown
  • Cannot view transcripts from remote machines
  • Date filtering relies on filesystem modification times, not session timestamps
  • --summary flag availability depends on claude-code-log version
  • Legacy Copilot sessions in ~/.copilot/history-session-state/ are not auto-discovered (must use explicit path)
  • When both Claude Code and Copilot sessions exist, the skill prompts the user to choose rather than merging them

Quick Reference

User saysToolModeCommand
"view current transcript"Claude CodeCurrent session$CCL <latest.jsonl> --format markdown
"show session abc123"Claude CodeSpecific session$CCL ~/.claude/projects/**/*abc123*.jsonl --format markdown
"view agent output"Claude CodeAgent outputcat.agent-step-*.log or $CCL *.jsonl
"browse all sessions"Claude CodeAll sessionslist + summarize all ~/.claude/projects/**/*.jsonl
"view transcript as HTML"Claude CodeAny + HTML$CCL <file> --format html > /tmp/view.html
"last 7 days" (with browse)Claude CodeDate filterfind... -mtime -7
"view current copilot session"CopilotCurrent session$CCL ~/.copilot/session-state/<latest>/events.jsonl --format markdown
"show copilot session abc123"CopilotSpecific session$CCL ~/.copilot/session-state/abc123/events.jsonl --format markdown
"browse copilot sessions"CopilotAll sessionslist dirs in ~/.copilot/session-state/, show session IDs
"view copilot session as HTML"CopilotAny + HTML$CCL <events.jsonl> --format html > /tmp/view.html

平台分布

Codex

35.19%
按下载量换算93

Claude

29.49%
按下载量换算78

Cursor

22.65%
按下载量换算60

Gemini CLI

10.04%
按下载量换算27

安全审计

Socket

可疑

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在提醒或未通过项,安装前请自行复核。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills