Install
openclaw skills install @xzulab/pt-agentPT/HH/HHClub/HDFans search, stats, config, overview, qBittorrent/downloader status, and direct download handoff. Always load this skill for these private-tracker requests; use its single runtime command and never session_search, probe ports, read raw stores, or guess credentials. Supports fast movie/TV search, account health, secure setup, and default downloader operations. Do not trigger for public torrents, general web search, or unrelated downloads.
openclaw skills install @xzulab/pt-agentAct as a conversational operator for private trackers and download clients. Keep host tools, scripts, capability payloads, local paths, and storage mechanics out of normal user-facing replies. Execute available operations for the user instead of turning the interaction into a CLI tutorial.
Work only with accounts, endpoints, and download clients the user is authorized to use. Keep the interaction site-neutral unless the user names a site or a saved configuration resolves one.
After a successful media-search, output only the final user-facing answer. Never reveal analysis, planning, tool narration, or phrases such as "让我分析", "根据 skill", or "让我回复用户".
If the runtime returns display.text, return that text verbatim and stop. Do not reformat, summarize, translate, annotate, or append to it. This rule also applies to list-torrents.
Before calling the runtime, apply these literal routing rules:
--free-only. Never show ordinary results when the filtered response has zero results.--free-only; keep ordinary matches after Free results.When total=0 and no hard filter is active, output only:
没有找到匹配结果。
可以继续:换关键词、换站点搜索。
When total=0 and a hard filter is active, output only:
没有找到符合筛选条件的结果。
可以继续:取消 {active filter}、换关键词、换站点搜索。
Do not claim another query or site was searched. Mention only the actual active filter. Use natural language only. Never expose CLI flags such as --all-trackers, runtime commands, field names, or implementation syntax.
For list-torrents, output only the queue result and one useful next action. If the requested queue is empty, use: "没有{filter label}的任务。可以继续:查看全部任务、搜索新资源。" If it contains items, show at most 5 with name, state, progress, and speed when returned, then end with relevant actions such as resume or view all. Do not expose hashes unless the user explicitly asks for technical details.
Use this exact shape and stop after the action prompt:
{Free preference note when relevant}找到 {total} 个结果,按 {returned ordering signal} 展示前 {visible count} 个:
1. {title copied verbatim}
{site} · {size} · {seeders}/{leechers} · {discount} · {publish time}
回复:下载第 1 个、只看免费、按做种排序。
Hard limits: show at most 5 items unless the user explicitly asked for another count; copy titles verbatim without translating or rewriting them; omit missing fields; never expose JSON/runtime field names such as discount, tags, or resultId in prose; do not add commentary, qualitative reasons, a second list, or any text after the action prompt.
For the following common intents, skip generic workflow, reference loading, memory/session search, and preflight inspection. Set terminal workdir to the directory containing this SKILL.md, then run exactly one matching command:
# Movie, TV, actor, director, title, season, episode, free, or resolution search
python3 "$PWD/scripts/pt_runtime.py" media-search "{user query}" --tracker "{optional site alias}" --kind movie --limit 10 --timeout 10
# "看看我的 PT 数据" / live all-site and downloader refresh
python3 "$PWD/scripts/pt_runtime.py" overview --refresh
# "我有哪些 PT 配置" / cached state, no network
python3 "$PWD/scripts/pt_runtime.py" overview
# One tracker account
python3 "$PWD/scripts/pt_runtime.py" user-stats --tracker "{site alias}"
# Default downloader or qBittorrent status
python3 "$PWD/scripts/pt_runtime.py" downloader-status
# Setup/configuration diagnosis
python3 "$PWD/scripts/pt_runtime.py" first-run
# Direct download when the user selects a result (default: start immediately)
python3 "$PWD/scripts/pt_runtime.py" download-torrent --tracker "{site alias}" --torrent-id "{id}" --start
# Add paused only when the user explicitly asks not to start yet
python3 "$PWD/scripts/pt_runtime.py" download-torrent --tracker "{site alias}" --torrent-id "{id}" --paused
# Resume paused torrents / inspect downloader queue
python3 "$PWD/scripts/pt_runtime.py" resume-torrents --all
python3 "$PWD/scripts/pt_runtime.py" resume-torrents --hash "{torrent hash}"
python3 "$PWD/scripts/pt_runtime.py" list-torrents --filter paused --limit 10
python3 "$PWD/scripts/pt_runtime.py" list-torrents --limit 10
Omit --tracker for media search when the user did not name a site. Use --all-trackers when the user says all sites; never list configs first. Use --kind tv for television and --kind any when unclear. Add --free-only, --resolution 2160p|1080p|720p, or --sort relevance|seeders|size to the same search call; never run a second search merely to filter.
For downloads: when the user says "下载第N个 / 下载这个 / 开始下", immediately run exactly one command:
python3 "$PWD/scripts/pt_runtime.py" download-torrent --tracker "{site alias from resultId}" --torrent-id "{numeric id}" --start
Rules:
--dry-run.--paused.--paused only if the user explicitly wants queue-without-start.resultId like hhanclub:18262 into tracker + torrent id.status=added|already_present|resumed, plus display.name/state/progress.status is already_present or resumed, tell the user it is already in the downloader and report progress; do not retry with ad hoc HTTP/Python.resume-torrents.discount/tags returned by media-search.Never use session_search, process/port scanning, cat on config/store files, --help, ad hoc Python, direct HTTP, or guessed credentials for these intents. After the runtime returns, answer directly from display and normalized result fields; never call another tool just to format or calculate values.
For successful media-search responses, treat the returned fields as the complete source of truth:
resultId internally so replies such as "下载第 2 个" resolve to the exact tracker and torrent id. It is fine to show the id when the host cannot otherwise retain result state, but do not make the user type it.--free-only. If prioritization returns no free result, say "当前结果里没有 Free" rather than claiming a free-only search found nothing..torrent bytes into chat.secret://, env://, profile://, proxy://, or a documented host-native reference.api_token, cookies, passkeys, RSS keys, browser sessions, and downloader credentials as different credential types. Validate each against the resolved adapter before enabling a configuration.--start. Do not add confirmation friction to read-only status, search, or selected-result downloads.Resolve SKILL_ROOT to the directory containing this SKILL.md. Read references and execute scripts with paths rooted at SKILL_ROOT; never assume the process working directory is the skill directory. For a terminal call, set its workdir to SKILL_ROOT and use $PWD in the command so no shell variable setup is required.
Examples for the agent/host only:
python3 "$PWD/scripts/pt_store.py" summary
python3 "$PWD/scripts/pt_runtime.py" first-run
Do not show these commands to the user unless they explicitly request implementation or debugging details.
pendingHealthCheck.--start. Skip confirmation, dry-run, and paused mode unless the user explicitly asked to queue paused. Report added / already_present / resumed with progress when available.For download handoff on an already-selected result, run one real download-torrent --start command immediately. No confirmation step. No dry-run gate. Prefer --start unless the user requested a paused add. The runtime returns already_present or auto-resumed for duplicates/paused items; surface that directly. Keep confirmation only for configuration changes, deletions, or bulk/ambiguous destructive actions.
references/first-run-guide.md for first use, missing configuration, or interrupted setup.references/message-workflow.md for intent routing, state transitions, minimum-question collection, and confirmation wording.references/interaction-design.md for result presentation, concise microcopy, error recovery, and progressive disclosure.references/agent-contract.md for host capability envelopes, payloads, state shapes, and error codes.references/runtime-policy.md for storage, secret providers, profile isolation, backup, TLS, and execution policy.references/adapter-implementation.md and references/adapter-catalog.json for adapter selection, auth compatibility, and execution strategy.references/site-preset-catalog.json and references/pt-depiler-patterns.md for known-site resolution and preset semantics.references/common-site-apis.md for Torznab, Prowlarr, Jackett, RSS, Unit3D API, and Gazelle JSON.references/site-adapter.md for parser/selector work and drift debugging.references/downloader-integration.md for qBittorrent/Transmission setup, status, and handoff.references/product-design.md for domain models, service boundaries, and delivery sequencing.references/open-source.md for contribution, fixture, test, and log hygiene.Use scripts/pt_store.py only when no host-native persistent config API exists. Let it resolve storage in this order: PT_AGENT_STORE, PT_AGENT_HOME, host home variables, installed skill home, then XDG state. Use --store only when the user or host explicitly selects a path.
Use scripts/pt_runtime.py only when the host has no native PT tools and local execution is available. It resolves env://NAME locally; secret://, profile://, and proxy:// require a host provider. Treat provider_unavailable as a setup limitation, not an invalid credential.
If audit-secrets reports legacy inline fields, use scripts/pt_store.py with the migrate-inline-secrets --env-file <host-env-file> subcommand once in a trusted local environment, restart the host so it loads the new variables, and verify the audit is clean. Never use inline values as a runtime fallback.
After modifying this skill, execute both validators and relevant smoke checks with absolute paths:
python3 "$PWD/scripts/validate_skill.py"
python3 "$PWD/scripts/benchmark_common.py"
python3 /path/to/skill-creator/scripts/quick_validate.py "$SKILL_ROOT"
Do not present the change as complete while validation, secret-reference rejection, TLS defaults, or representative store/runtime smoke checks are failing.