Token导航 LogoToken导航

Agent Skill · AI 工具

podcast-production(播客制作)

podcast-production 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

podcast-production 是AI 工具类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为执行命令;许可证为 MIT,第三方扫描有提醒项,按安装量在AI 工具类的 2,536 个 Skill 里排第 1,623。

总安装 564周安装 24GitHub Stars 2下载 198核验 2026-05-01

安装说明

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

安装方式

通过对话安装

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

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

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/mindmorass/reflex --skill podcast-production

这个 Skill 是做什么的

AI 工具类 Skill 用来扩展助手本身的能力,例如接模型、接检索、接外部服务。

用于处理 GitHub 仓库、Issue 和 Pull Request 协作信息。适合在代码变更或协作事项整理时提供上下文支持。podcast-production 属于AI 工具类 Skill,可作为该场景下的辅助能力补充。可结合来源仓库 README 进一步核验具体用法和功能边界。

安装前建议确认权限范围和维护状态,避免不必要的联网或执行。注意该技能不会自动修改代码,仅提供信息整合能力。

来源仓库内路径:skills/podcast-production

上手步骤

4 步
  1. 1

    确认自己的宿主工具

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

  2. 2

    拿到安装命令

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

  3. 3

    安装后重启宿主

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

  4. 4

    按最小权限试用

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

常见问题

6 条

podcast-production 怎么安装?

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

podcast-production 支持哪些 AI 工具?

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

podcast-production 需要什么权限?

权限级别是执行命令。安装流程涉及命令执行,可能通过 npx skills add https://github.com/mindmorass/reflex --skill podcast-production;npx skills add mindmorass/reflex --skill "podcast-production" 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

podcast-production 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

podcast-production 用的人多吗?

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

podcast-production 安全吗?

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

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

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 3 个目录同时收录,说明这个 Skill 流传比较广。
  • 许可证明确为 MIT,商用和分发边界好判断。

先想清楚的地方

  • 需要执行命令,装到常用环境前要先评估影响面。
  • 第三方扫描存在提醒项或未通过项,需要人工逐条确认。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

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

不太适合

  • 不能接受 Skill 在你机器上执行命令的人。
  • 需要厂商级技术支持和 SLA 的生产系统。

AI 工具类 Skill 对比

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

执行计划 · Codex、Claude

1,515,336173,110只读MIT通过
verification-before-completion

完成前的验证 · Codex、Claude

1,319,472173,121权限未标注MIT通过
subagent-driven-development

子 Agent 驱动开发 · Codex、Claude

1,312,416173,138只读MIT通过
copy-editing

复制编辑 · Codex、Claude

1,209,57625,632只读MIT通过
paywall-upgrade-cro

付费专区升级 cro · Codex、Claude

1,030,17625,617只读MIT通过
podcast-production

播客制作 · 本页

5642执行命令MIT有提醒

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

SKILL.md 原文

Podcast Production Patterns

Best practices for podcast production, editing, and distribution.

Recording Setup

Audio Configuration

from dataclasses import dataclass
from typing import Optional, List

@dataclass
class AudioSettings:
    sample_rate: int = 48000  # Hz
    bit_depth: int = 24
    channels: int = 1  # Mono per track
    format: str = "wav"  # Lossless for recording

@dataclass
class RecordingTrack:
    name: str
    input_device: str
    settings: AudioSettings
    file_path: str

class RecordingSession:
    def __init__(self, project_name: str, output_dir: str):
        self.project_name = project_name
        self.output_dir = output_dir
        self.tracks: List[RecordingTrack] = []

    def add_track(self, name: str, input_device: str) -> RecordingTrack:
        """Add recording track for participant."""
        settings = AudioSettings()
        file_path = f"{self.output_dir}/{self.project_name}_{name}.wav"

        track = RecordingTrack(
            name=name,
            input_device=input_device,
            settings=settings,
            file_path=file_path
        )
        self.tracks.append(track)
        return track

Remote Recording

import asyncio
import websockets
from dataclasses import dataclass

@dataclass
class RemoteParticipant:
    name: str
    connection_url: str
    local_recording: bool = True  # Record locally for best quality

class RemoteRecordingSession:
    """Coordinate remote podcast recording."""

    def __init__(self):
        self.participants: List[RemoteParticipant] = []
        self.sync_server = None

    async def start_sync_server(self, port: int = 8765):
        """Start sync server for coordinating recording."""
        async def handler(websocket, path):
            async for message in websocket:
                if message == "SYNC":
                    # Broadcast sync signal to all participants
                    await asyncio.gather(*[
                        ws.send("START") for ws in self.connected_clients
                    ])

        self.sync_server = await websockets.serve(handler, "0.0.0.0", port)

    def generate_recording_instructions(self) -> str:
        """Generate instructions for remote participants."""
        return """
## Remote Recording Setup

### Equipment
- Use a USB microphone or audio interface
- Wear headphones to prevent echo
- Choose a quiet room with minimal echo

### Software
- Use Audacity, GarageBand, or similar
- Settings: 48kHz sample rate, 24-bit
- Record in WAV format (not MP3)

### Before Recording
1. Test audio levels (peaks around -12dB)
2. Disable notifications
3. Close unnecessary applications

### During Recording
- Wait for sync signal before speaking
- Clap at start for sync alignment
- Note any interruptions

### After Recording
- Export as WAV
- Upload to shared folder: {upload_link}
- Name file: {episode}_YourName.wav
        """

Audio Editing

FFmpeg Audio Processing

# Normalize audio levels
ffmpeg -i input.wav -af "loudnorm=I=-16:TP=-1.5:LRA=11" output.wav

# Remove background noise (using noise profile)
ffmpeg -i input.wav -af "afftdn=nf=-25" cleaned.wav

# Apply compression for consistent levels
ffmpeg -i input.wav -af "acompressor=threshold=-20dB:ratio=4:attack=5:release=50" compressed.wav

# Apply podcast EQ
ffmpeg -i input.wav -af "equalizer=f=100:t=h:w=200:g=-3,equalizer=f=3000:t=h:w=1000:g=2,equalizer=f=8000:t=h:w=2000:g=1" eq.wav

# High-pass filter (remove low rumble)
ffmpeg -i input.wav -af "highpass=f=80" filtered.wav

# De-ess (reduce sibilance)
ffmpeg -i input.wav -af "adeclick=w=55:o=50" deessed.wav

# Complete podcast processing chain
ffmpeg -i input.wav -af "\
    highpass=f=80,\
    afftdn=nf=-25,\
    acompressor=threshold=-20dB:ratio=4:attack=5:release=50,\
    equalizer=f=100:t=h:w=200:g=-3,\
    equalizer=f=3000:t=h:w=1000:g=2,\
    loudnorm=I=-16:TP=-1.5:LRA=11\
" processed.wav

Python Audio Processing

import subprocess
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class AudioEdit:
    """Represents an audio edit operation."""
    start_time: float  # seconds
    end_time: float
    operation: str  # cut, silence, crossfade

class PodcastEditor:
    def __init__(self, input_file: str):
        self.input_file = input_file
        self.edits: List[AudioEdit] = []

    def cut(self, start: float, end: float):
        """Mark section for removal."""
        self.edits.append(AudioEdit(start, end, "cut"))

    def silence(self, start: float, end: float):
        """Replace section with silence."""
        self.edits.append(AudioEdit(start, end, "silence"))

    def process_edits(self, output_file: str):
        """Apply all edits and export."""
        # Sort edits by start time
        self.edits.sort(key=lambda e: e.start_time)

        # Build filter complex for cuts
        if not self.edits:
            subprocess.run([
                "ffmpeg", "-i", self.input_file,
                "-c:a", "copy", output_file
            ])
            return

        # Generate segments to keep
        segments = []
        current_time = 0

        for edit in self.edits:
            if edit.operation == "cut" and edit.start_time > current_time:
                segments.append((current_time, edit.start_time))
            current_time = edit.end_time

        # Add final segment
        segments.append((current_time, None))

        # Build FFmpeg filter
        filter_parts = []
        for i, (start, end) in enumerate(segments):
            if end:
                filter_parts.append(f"[0:a]atrim=start={start}:end={end},asetpts=PTS-STARTPTS[a{i}]")
            else:
                filter_parts.append(f"[0:a]atrim=start={start},asetpts=PTS-STARTPTS[a{i}]")

        # Concatenate segments
        concat_inputs = "".join(f"[a{i}]" for i in range(len(segments)))
        filter_complex = ";".join(filter_parts) + f";{concat_inputs}concat=n={len(segments)}:v=0:a=1[out]"

        subprocess.run([
            "ffmpeg", "-i", self.input_file,
            "-filter_complex", filter_complex,
            "-map", "[out]",
            output_file
        ])

    def normalize(self, output_file: str):
        """Apply loudness normalization."""
        subprocess.run([
            "ffmpeg", "-i", self.input_file,
            "-af", "loudnorm=I=-16:TP=-1.5:LRA=11",
            output_file
        ])

    def add_intro_outro(
        self,
        intro_file: str,
        outro_file: str,
        output_file: str
    ):
        """Add intro and outro music."""
        subprocess.run([
            "ffmpeg",
            "-i", intro_file,
            "-i", self.input_file,
            "-i", outro_file,
            "-filter_complex",
            "[0:a][1:a][2:a]concat=n=3:v=0:a=1[out]",
            "-map", "[out]",
            output_file
        ])

    def mix_background_music(
        self,
        music_file: str,
        output_file: str,
        music_volume: float = 0.1
    ):
        """Mix background music under voice."""
        subprocess.run([
            "ffmpeg",
            "-i", self.input_file,
            "-i", music_file,
            "-filter_complex",
            f"[1:a]volume={music_volume}[music];[0:a][music]amix=inputs=2:duration=first[out]",
            "-map", "[out]",
            output_file
        ])

Transcription

Whisper Transcription

import whisper
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class TranscriptSegment:
    start: float
    end: float
    text: str
    speaker: Optional[str] = None

class PodcastTranscriber:
    def __init__(self, model_size: str = "medium"):
        self.model = whisper.load_model(model_size)

    def transcribe(
        self,
        audio_file: str,
        language: str = "en"
    ) -> List[TranscriptSegment]:
        """Transcribe audio file."""
        result = self.model.transcribe(
            audio_file,
            language=language,
            word_timestamps=True
        )

        segments = []
        for seg in result["segments"]:
            segments.append(TranscriptSegment(
                start=seg["start"],
                end=seg["end"],
                text=seg["text"].strip()
            ))

        return segments

    def to_srt(self, segments: List[TranscriptSegment]) -> str:
        """Convert to SRT subtitle format."""
        def format_time(seconds: float) -> str:
            hours = int(seconds // 3600)
            minutes = int((seconds % 3600) // 60)
            secs = int(seconds % 60)
            millis = int((seconds % 1) * 1000)
            return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

        lines = []
        for i, seg in enumerate(segments, 1):
            lines.append(str(i))
            lines.append(f"{format_time(seg.start)} --> {format_time(seg.end)}")
            lines.append(seg.text)
            lines.append("")

        return "\n".join(lines)

    def to_chapters(
        self,
        segments: List[TranscriptSegment],
        min_gap: float = 5.0
    ) -> List[dict]:
        """Generate chapter markers from transcript."""
        chapters = []
        current_chapter_start = 0
        current_text = []

        for i, seg in enumerate(segments):
            current_text.append(seg.text)

            # Check for chapter break (long pause or topic change)
            if i < len(segments) - 1:
                gap = segments[i + 1].start - seg.end
                if gap > min_gap:
                    chapters.append({
                        "start": current_chapter_start,
                        "end": seg.end,
                        "title": self._summarize_text(" ".join(current_text)[:100])
                    })
                    current_chapter_start = segments[i + 1].start
                    current_text = []

        return chapters

    def _summarize_text(self, text: str) -> str:
        """Extract first sentence as chapter title."""
        sentences = text.split(". ")
        return sentences[0][:50] if sentences else "Chapter"

Speaker Diarization

from pyannote.audio import Pipeline
from dataclasses import dataclass

@dataclass
class SpeakerSegment:
    speaker: str
    start: float
    end: float
    text: Optional[str] = None

class SpeakerDiarizer:
    def __init__(self, auth_token: str):
        self.pipeline = Pipeline.from_pretrained(
            "pyannote/speaker-diarization-3.1",
            use_auth_token=auth_token
        )

    def diarize(self, audio_file: str) -> List[SpeakerSegment]:
        """Identify different speakers."""
        diarization = self.pipeline(audio_file)

        segments = []
        for turn, _, speaker in diarization.itertracks(yield_label=True):
            segments.append(SpeakerSegment(
                speaker=speaker,
                start=turn.start,
                end=turn.end
            ))

        return segments

    def merge_with_transcript(
        self,
        speaker_segments: List[SpeakerSegment],
        transcript_segments: List[TranscriptSegment]
    ) -> List[SpeakerSegment]:
        """Assign speakers to transcript segments."""
        result = []

        for trans in transcript_segments:
            # Find overlapping speaker segment
            best_speaker = None
            best_overlap = 0

            for spk in speaker_segments:
                overlap = min(trans.end, spk.end) - max(trans.start, spk.start)
                if overlap > best_overlap:
                    best_overlap = overlap
                    best_speaker = spk.speaker

            result.append(SpeakerSegment(
                speaker=best_speaker or "Unknown",
                start=trans.start,
                end=trans.end,
                text=trans.text
            ))

        return result

Show Notes Generation

from typing import List
from dataclasses import dataclass

@dataclass
class ShowNotes:
    title: str
    description: str
    highlights: List[str]
    timestamps: List[dict]
    links: List[dict]
    guests: List[dict]

class ShowNotesGenerator:
    def __init__(self, llm_client):
        self.llm = llm_client

    def generate(
        self,
        transcript: str,
        episode_title: str,
        guest_names: List[str] = None
    ) -> ShowNotes:
        """Generate show notes from transcript."""

        # Generate description
        description = self._generate_description(transcript)

        # Extract highlights
        highlights = self._extract_highlights(transcript)

        # Generate timestamps
        timestamps = self._generate_timestamps(transcript)

        # Extract mentioned links/resources
        links = self._extract_resources(transcript)

        return ShowNotes(
            title=episode_title,
            description=description,
            highlights=highlights,
            timestamps=timestamps,
            links=links,
            guests=[{"name": name} for name in (guest_names or [])]
        )

    def _generate_description(self, transcript: str) -> str:
        """Generate episode description."""
        prompt = f"""
        Write a compelling 2-3 paragraph description for this podcast episode.
        Focus on the main topics discussed and key takeaways.

        Transcript excerpt:
        {transcript[:3000]}
        """
        return self.llm.generate(prompt)

    def _extract_highlights(self, transcript: str) -> List[str]:
        """Extract key highlights from episode."""
        prompt = f"""
        Extract 5-7 key highlights or takeaways from this podcast episode.
        Format as bullet points.

        Transcript:
        {transcript[:5000]}
        """
        response = self.llm.generate(prompt)
        return [line.strip("- ") for line in response.split("\n") if line.strip()]

    def _generate_timestamps(self, transcript: str) -> List[dict]:
        """Generate chapter timestamps."""
        # This would use the transcript with timing info
        return []

    def _extract_resources(self, transcript: str) -> List[dict]:
        """Extract mentioned resources and links."""
        prompt = f"""
        Extract any books, websites, tools, or resources mentioned in this podcast.
        Format as: Name | Type | URL (if mentioned)

        Transcript:
        {transcript[:5000]}
        """
        return []

    def to_markdown(self, notes: ShowNotes) -> str:
        """Format show notes as markdown."""
        lines = [
            f"# {notes.title}",
            "",
            notes.description,
            "",
            "## Key Highlights",
            ""
        ]

        for highlight in notes.highlights:
            lines.append(f"- {highlight}")

        if notes.timestamps:
            lines.extend(["", "## Timestamps", ""])
            for ts in notes.timestamps:
                lines.append(f"- [{ts['time']}] {ts['title']}")

        if notes.links:
            lines.extend(["", "## Resources Mentioned", ""])
            for link in notes.links:
                lines.append(f"- [{link['name']}]({link.get('url', '#')})")

        if notes.guests:
            lines.extend(["", "## Guests", ""])
            for guest in notes.guests:
                lines.append(f"- {guest['name']}")

        return "\n".join(lines)

RSS Feed Management

from feedgen.feed import FeedGenerator
from datetime import datetime
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class PodcastEpisode:
    title: str
    description: str
    audio_url: str
    pub_date: datetime
    duration: int  # seconds
    episode_number: int
    season: int = 1
    image_url: Optional[str] = None
    explicit: bool = False

@dataclass
class PodcastFeed:
    title: str
    description: str
    author: str
    email: str
    website: str
    image_url: str
    category: str
    language: str = "en"
    explicit: bool = False

class PodcastRSSGenerator:
    def __init__(self, feed_info: PodcastFeed):
        self.feed_info = feed_info
        self.fg = FeedGenerator()
        self._setup_feed()

    def _setup_feed(self):
        """Configure feed metadata."""
        self.fg.load_extension('podcast')

        self.fg.title(self.feed_info.title)
        self.fg.description(self.feed_info.description)
        self.fg.author({'name': self.feed_info.author, 'email': self.feed_info.email})
        self.fg.link(href=self.feed_info.website, rel='alternate')
        self.fg.logo(self.feed_info.image_url)
        self.fg.language(self.feed_info.language)

        # iTunes specific
        self.fg.podcast.itunes_category(self.feed_info.category)
        self.fg.podcast.itunes_author(self.feed_info.author)
        self.fg.podcast.itunes_owner(
            name=self.feed_info.author,
            email=self.feed_info.email
        )
        self.fg.podcast.itunes_image(self.feed_info.image_url)
        self.fg.podcast.itunes_explicit('yes' if self.feed_info.explicit else 'no')

    def add_episode(self, episode: PodcastEpisode):
        """Add episode to feed."""
        fe = self.fg.add_entry()

        fe.title(episode.title)
        fe.description(episode.description)
        fe.enclosure(episode.audio_url, 0, 'audio/mpeg')
        fe.published(episode.pub_date)
        fe.podcast.itunes_duration(episode.duration)
        fe.podcast.itunes_episode(episode.episode_number)
        fe.podcast.itunes_season(episode.season)

        if episode.image_url:
            fe.podcast.itunes_image(episode.image_url)

        fe.podcast.itunes_explicit('yes' if episode.explicit else 'no')

    def generate(self, output_file: str):
        """Generate RSS XML file."""
        self.fg.rss_file(output_file)

    def to_string(self) -> str:
        """Return RSS as string."""
        return self.fg.rss_str(pretty=True).decode('utf-8')

Distribution

from dataclasses import dataclass
from typing import List, Optional
import requests

@dataclass
class DistributionPlatform:
    name: str
    feed_url: str
    dashboard_url: str
    status: str = "pending"

class PodcastDistributor:
    """Manage podcast distribution to platforms."""

    PLATFORMS = {
        "apple": {
            "name": "Apple Podcasts",
            "submit_url": "https://podcastsconnect.apple.com/",
            "requirements": ["RSS feed", "Apple ID", "Artwork 3000x3000"]
        },
        "spotify": {
            "name": "Spotify",
            "submit_url": "https://podcasters.spotify.com/",
            "requirements": ["RSS feed", "Spotify account"]
        },
        "google": {
            "name": "Google Podcasts",
            "submit_url": "https://podcastsmanager.google.com/",
            "requirements": ["RSS feed", "Google account"]
        },
        "amazon": {
            "name": "Amazon Music",
            "submit_url": "https://podcasters.amazon.com/",
            "requirements": ["RSS feed", "Amazon account"]
        },
        "stitcher": {
            "name": "Stitcher",
            "submit_url": "https://partners.stitcher.com/",
            "requirements": ["RSS feed", "Account"]
        }
    }

    def __init__(self, rss_feed_url: str):
        self.rss_feed_url = rss_feed_url
        self.platforms: List[DistributionPlatform] = []

    def validate_feed(self) -> dict:
        """Validate RSS feed for distribution requirements."""
        response = requests.get(self.rss_feed_url)
        # Parse and validate feed structure
        issues = []

        # Check required elements
        required = [
            "title", "description", "language",
            "itunes:author", "itunes:image", "itunes:category"
        ]

        return {
            "valid": len(issues) == 0,
            "issues": issues
        }

    def generate_submission_guide(self) -> str:
        """Generate submission guide for all platforms."""
        guide = ["# Podcast Distribution Guide\n"]
        guide.append(f"RSS Feed: {self.rss_feed_url}\n")

        for key, platform in self.PLATFORMS.items():
            guide.append(f"\n## {platform['name']}")
            guide.append(f"Submit at: {platform['submit_url']}")
            guide.append("Requirements:")
            for req in platform['requirements']:
                guide.append(f"  - {req}")

        return "\n".join(guide)

References

平台分布

Claude Code

26.38%
按下载量换算52

Antigravity

24.61%
按下载量换算49

Codex

16.19%
按下载量换算32

OpenCode

11.61%
按下载量换算23

Gemini CLI

7.58%
按下载量换算15

windsurf

3.82%
按下载量换算8

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

执行命令

安装流程涉及命令执行,可能通过 npx skills add https://github.com/mindmorass/reflex --skill podcast-production;npx skills add mindmorass/reflex --skill "podcast-production" 联网下载 Skill 或依赖。用户安装前应确认命令来源、仓库内容和执行环境。

安装前确认

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

继续浏览同类 Skills