[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6D0ZT0BWA68KED5ZM5705KS":3,"skill-same:01M6D0ZT0BWA68KED5ZM5705KS":126},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":30,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6D0ZT0BWA68KED5ZM5705KS","doc-writing-best-practices",null,"中文技术文档的写作规范。涵盖中西文混排的空格与标点、标题层级与代码块标注、表格与列表的取舍、以及\"写清为什么\"和\"示例可直接抄用\"的内容要求。在编写或修改 README、设计文档、运维手册、变更说明、注释块等任何面向人阅读的中文技术文档时使用——尤其是产出 Markdown 文件、写提交说明、或整理已有文档时。","JinsYin\u002Fskills","JinsYin","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F12714609?v=4","01M6D0YYKCF1MT47KYYZSXWE30","01M6D0YYQ1F5AG45M6ATPECCAW",1,"MIT","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002FSKILL.md",[17,22,25],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":26,"categoryName":27,"taxonomyType":28,"taxonomyTypeDesc":29},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[31,32,33,34,35,36,37,38,39,40,41,42,43,44],"writing","best practices","doc","doc writing best practices","writing best practices","design","markdown","文档","中文","表格","README","运维","文件","整理","2026-11-10 10:12:30",false,"---\nname: servarr-health-check\ndescription: Use when checking servarr stability, Plex\u002Frclone FUSE hangs, kernel panics, D-state probes, Arr queues, Kometa sync state, recent imports, or whether media automation is healthy.\n---\n\n# Servarr Health Check\n\n## Overview\n\nPerform a read-only operational health check of `servarr` focused on the known Plex\u002FSonarr\u002FRadarr ↔ rclone FUSE failure mode, Kometa tag-sync debounce, and media import flow.\n\n**Core principle:** verify before reassurance. Do not say “stable”, “no panics”, or “working” until boot continuity, kernel logs, D-state processes, queues, and Kometa state have been checked.\n\n## Mandatory First Steps\n\n1. Activate\u002Fcheck Serena project onboarding if not already done.\n2. Use read-only SSH commands only.\n3. Do **not** read\u002Fprobe media file contents through `\u002Fmedia\u002FmRemote`, `\u002Fmedia\u002FmRemote\u002Fmounts\u002Fnzbdav`, or nzbdav `.ids` paths.\n4. Do not print Plex tokens, Arr API keys, Discord webhooks, or full secrets.\n\n## Standard Check\n\nRun a compact snapshot:\n\n```bash\nssh servarr 'printf \"=== uptime \u002F boots ===\\n\"; date; uptime; journalctl --list-boots | tail -5; printf \"=== dstate\u002Fprobes ===\\n\"; ps -eo pid,ppid,stat,comm,args | awk '\\''$3 ~ \u002FD\u002F || \u002FPlex Media Scan|ffprobe|ffmpeg|Sonarr|Radarr|rclone\u002F {print}'\\'' | head -80; printf \"=== kernel hung\u002Fpanic current boot ===\\n\"; journalctl -k -b 0 --no-pager | grep -Ei '\\''hung_task|blocked for more than|kernel panic|not syncing|I\u002FO error|fuse.*error|rclone'\\'' | tail -80 || true; printf \"=== arr queues ===\\n\"; for app_port in radarr:7878 sonarr:8989; do app=${app_port%:*}; port=${app_port#*:}; key=$(grep -oPm1 \"(?\u003C=\u003CApiKey>)[^\u003C]+\" \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002F$app\u002Fconfig.xml); echo ---$app---; curl -fsS -H \"X-Api-Key: $key\" \"http:\u002F\u002Flocalhost:$port\u002Fapi\u002Fv3\u002Fqueue?page=1&pageSize=200\" | jq -r '\\''\"queue_records=\" + (.records|length|tostring) + \" states=\" + ([.records[]?.trackedDownloadState] | group_by(.) | map((.[0]\u002F\u002F\"null\")+\":\"+(length|tostring)) | join(\",\"))'\\''; done; printf \"=== kometa\u002Fhung monitor ===\\n\"; find \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002Fkometa\u002Fconfig\u002Fsync-state -maxdepth 3 -type f -printf '\\''%TY-%Tm-%Td %TH:%TM:%TS %p size=%s\\n'\\'' 2>\u002Fdev\u002Fnull | sort || true; tail -20 \u002Fvar\u002Flog\u002Fhung-task-monitor.log 2>\u002Fdev\u002Fnull || true'\n```\n\nIf context-mode local storage errors, use direct SSH only if the harness allows read-only bash. Never “fix” by probing media files.\n\n## Interpret Results\n\n| Signal | Meaning | Response |\n|---|---|---|\n| Current boot unchanged, high uptime | Good | Mention uptime and no new boot |\n| Kernel log empty for hung\u002Fpanic terms | Good | “No current-boot hung-task\u002Fpanic evidence” |\n| D-state `Plex Media Scan`, `ffprobe`, or `ffmpeg` appears | Yellow\u002Fred | Poll briefly; if persistent near hung-task timeout, warn |\n| D-state clears within a few polls | Usually OK | Note it cleared and identify item if known |\n| Radarr\u002FSonarr queue > 0 | Not automatically bad | Report states; distinguish downloading\u002FimportPending\u002Fstuck |\n| Kometa `dirty\u002F\u003Ccollection>` marker recent | Expected debounce | Do not call stuck unless older than health threshold |\n| Kometa processing\u002Fdrain running | Expected | Report in progress |\n| Hung-task monitor shows only old 11:18 panic | Historical | Say no new monitor entries |\n\n## Recent Media Flow Check\n\nUse when asked whether automation is working or media was added:\n\n```bash\nssh servarr 'bash -s' \u003C\u003C'REMOTE'\nset -euo pipefail\nsince=\"REPLACE_WITH_UTC_ISO\"\nfor app_port in radarr:7878 sonarr:8989; do\n  app=${app_port%:*}; port=${app_port#*:}; key=$(grep -oPm1 \"(?\u003C=\u003CApiKey>)[^\u003C]+\" \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002F$app\u002Fconfig.xml)\n  echo \"=== $app history since $since ===\"\n  curl -fsS -H \"X-Api-Key: $key\" \"http:\u002F\u002Flocalhost:$port\u002Fapi\u002Fv3\u002Fhistory?page=1&pageSize=100&sortKey=date&sortDirection=descending\" \\\n  | jq -r --arg since \"$since\" '.records[]? | select(.date >= $since) | [.date,.eventType,(.movie.title\u002F\u002F.series.title\u002F\u002F\"\"),(.episode.title\u002F\u002F\"\"),(.sourceTitle\u002F\u002F\"\"),(.data.importedPath\u002F\u002F\"\"),(.data.reason\u002F\u002F\"\")] | @tsv'\ndone\nREMOTE\n```\n\nFor Plex recently-added checks, query Plex API metadata only. Do not stat\u002Fread media contents beyond directory\u002Fsymlink metadata.\n\n## Known Context\n\n- Root issue was Plex\u002FSonarr `ffprobe`\u002Fscanner hangs opening rclone FUSE nzbdav symlink targets.\n- Bad historical file: Parks and Recreation S04E21 “Bus Tour”; avoid restoring\u002Fimporting through rclone FUSE without a safer plan.\n- `hung_task_panic` normally resets to `1` after reboot.\n- Arr Plex `updateLibrary` is intentionally enabled again for Radarr\u002FSonarr\u002FLidarr so Plex sees new imports before Kometa labels them.\n- Kometa custom script uses dirty markers under `\u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002Fkometa\u002Fconfig\u002Fsync-state\u002F` and a 120s debounce.\n\n## Response Format\n\nKeep the answer concise:\n\n- **Green:** no reboot, no current D-state probes, no kernel hung-task\u002Fpanic, queues OK.\n- **Yellow:** transient analyzer, active Kometa debounce, queue activity, or non-fatal Plex warnings.\n- **Red:** new boot, current-boot hung-task\u002Fpanic, persistent D-state probe, importPending with D-state `ffprobe`.\n\nAlways include the timestamp and strongest evidence, e.g. uptime, boot start, queue counts, and whether D-state\u002Fkernel checks were clean.\n\n## Common Mistakes\n\n- Calling Kometa “stuck” while dirty marker mtime is still changing within debounce.\n- Declaring stability from uptime alone without checking D-state and kernel logs.\n- Touching media contents with `ffprobe`, `dd`, `mediainfo`, `cat`, or thumbnail generation.\n- Printing secrets from config\u002Flogs.\n- Treating Plex `Unknown metadata type: folder` warnings as the FUSE panic pattern.\n","# Servarr Health Check\n\n## Overview\n\nPerform a read-only operational health check of `servarr` focused on the known Plex\u002FSonarr\u002FRadarr ↔ rclone FUSE failure mode, Kometa tag-sync debounce, and media import flow.\n\n**Core principle:** verify before reassurance. Do not say “stable”, “no panics”, or “working” until boot continuity, kernel logs, D-state processes, queues, and Kometa state have been checked.\n\n## Mandatory First Steps\n\n1. Activate\u002Fcheck Serena project onboarding if not already done.\n2. Use read-only SSH commands only.\n3. Do **not** read\u002Fprobe media file contents through `\u002Fmedia\u002FmRemote`, `\u002Fmedia\u002FmRemote\u002Fmounts\u002Fnzbdav`, or nzbdav `.ids` paths.\n4. Do not print Plex tokens, Arr API keys, Discord webhooks, or full secrets.\n\n## Standard Check\n\nRun a compact snapshot:\n\n```bash\nssh servarr 'printf \"=== uptime \u002F boots ===\\n\"; date; uptime; journalctl --list-boots | tail -5; printf \"=== dstate\u002Fprobes ===\\n\"; ps -eo pid,ppid,stat,comm,args | awk '\\''$3 ~ \u002FD\u002F || \u002FPlex Media Scan|ffprobe|ffmpeg|Sonarr|Radarr|rclone\u002F {print}'\\'' | head -80; printf \"=== kernel hung\u002Fpanic current boot ===\\n\"; journalctl -k -b 0 --no-pager | grep -Ei '\\''hung_task|blocked for more than|kernel panic|not syncing|I\u002FO error|fuse.*error|rclone'\\'' | tail -80 || true; printf \"=== arr queues ===\\n\"; for app_port in radarr:7878 sonarr:8989; do app=${app_port%:*}; port=${app_port#*:}; key=$(grep -oPm1 \"(?\u003C=\u003CApiKey>)[^\u003C]+\" \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002F$app\u002Fconfig.xml); echo ---$app---; curl -fsS -H \"X-Api-Key: $key\" \"http:\u002F\u002Flocalhost:$port\u002Fapi\u002Fv3\u002Fqueue?page=1&pageSize=200\" | jq -r '\\''\"queue_records=\" + (.records|length|tostring) + \" states=\" + ([.records[]?.trackedDownloadState] | group_by(.) | map((.[0]\u002F\u002F\"null\")+\":\"+(length|tostring)) | join(\",\"))'\\''; done; printf \"=== kometa\u002Fhung monitor ===\\n\"; find \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002Fkometa\u002Fconfig\u002Fsync-state -maxdepth 3 -type f -printf '\\''%TY-%Tm-%Td %TH:%TM:%TS %p size=%s\\n'\\'' 2>\u002Fdev\u002Fnull | sort || true; tail -20 \u002Fvar\u002Flog\u002Fhung-task-monitor.log 2>\u002Fdev\u002Fnull || true'\n```\n\nIf context-mode local storage errors, use direct SSH only if the harness allows read-only bash. Never “fix” by probing media files.\n\n## Interpret Results\n\n| Signal | Meaning | Response |\n|---|---|---|\n| Current boot unchanged, high uptime | Good | Mention uptime and no new boot |\n| Kernel log empty for hung\u002Fpanic terms | Good | “No current-boot hung-task\u002Fpanic evidence” |\n| D-state `Plex Media Scan`, `ffprobe`, or `ffmpeg` appears | Yellow\u002Fred | Poll briefly; if persistent near hung-task timeout, warn |\n| D-state clears within a few polls | Usually OK | Note it cleared and identify item if known |\n| Radarr\u002FSonarr queue > 0 | Not automatically bad | Report states; distinguish downloading\u002FimportPending\u002Fstuck |\n| Kometa `dirty\u002F\u003Ccollection>` marker recent | Expected debounce | Do not call stuck unless older than health threshold |\n| Kometa processing\u002Fdrain running | Expected | Report in progress |\n| Hung-task monitor shows only old 11:18 panic | Historical | Say no new monitor entries |\n\n## Recent Media Flow Check\n\nUse when asked whether automation is working or media was added:\n\n```bash\nssh servarr 'bash -s' \u003C\u003C'REMOTE'\nset -euo pipefail\nsince=\"REPLACE_WITH_UTC_ISO\"\nfor app_port in radarr:7878 sonarr:8989; do\n  app=${app_port%:*}; port=${app_port#*:}; key=$(grep -oPm1 \"(?\u003C=\u003CApiKey>)[^\u003C]+\" \u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002F$app\u002Fconfig.xml)\n  echo \"=== $app history since $since ===\"\n  curl -fsS -H \"X-Api-Key: $key\" \"http:\u002F\u002Flocalhost:$port\u002Fapi\u002Fv3\u002Fhistory?page=1&pageSize=100&sortKey=date&sortDirection=descending\" \\\n  | jq -r --arg since \"$since\" '.records[]? | select(.date >= $since) | [.date,.eventType,(.movie.title\u002F\u002F.series.title\u002F\u002F\"\"),(.episode.title\u002F\u002F\"\"),(.sourceTitle\u002F\u002F\"\"),(.data.importedPath\u002F\u002F\"\"),(.data.reason\u002F\u002F\"\")] | @tsv'\ndone\nREMOTE\n```\n\nFor Plex recently-added checks, query Plex API metadata only. Do not stat\u002Fread media contents beyond directory\u002Fsymlink metadata.\n\n## Known Context\n\n- Root issue was Plex\u002FSonarr `ffprobe`\u002Fscanner hangs opening rclone FUSE nzbdav symlink targets.\n- Bad historical file: Parks and Recreation S04E21 “Bus Tour”; avoid restoring\u002Fimporting through rclone FUSE without a safer plan.\n- `hung_task_panic` normally resets to `1` after reboot.\n- Arr Plex `updateLibrary` is intentionally enabled again for Radarr\u002FSonarr\u002FLidarr so Plex sees new imports before Kometa labels them.\n- Kometa custom script uses dirty markers under `\u002Fhome\u002Fxbxd\u002Fdocker\u002Fdata\u002Fkometa\u002Fconfig\u002Fsync-state\u002F` and a 120s debounce.\n\n## Response Format\n\nKeep the answer concise:\n\n- **Green:** no reboot, no current D-state probes, no kernel hung-task\u002Fpanic, queues OK.\n- **Yellow:** transient analyzer, active Kometa debounce, queue activity, or non-fatal Plex warnings.\n- **Red:** new boot, current-boot hung-task\u002Fpanic, persistent D-state probe, importPending with D-state `ffprobe`.\n\nAlways include the timestamp and strongest evidence, e.g. uptime, boot start, queue counts, and whether D-state\u002Fkernel checks were clean.\n\n## Common Mistakes\n\n- Calling Kometa “stuck” while dirty marker mtime is still changing within debounce.\n- Declaring stability from uptime alone without checking D-state and kernel logs.\n- Touching media contents with `ffprobe`, `dd`, `mediainfo`, `cat`, or thumbnail generation.\n- Printing secrets from config\u002Flogs.\n- Treating Plex `Unknown metadata type: folder` warnings as the FUSE panic pattern.\n",{"name":50,"description":51},"servarr-health-check","Use when checking servarr stability, Plex\u002Frclone FUSE hangs, kernel panics, D-state probes, Arr queues, Kometa sync state, recent imports, or whether media automation is healthy.","main","38248e428f013b1dc844e2de8de379113913a71b","skills\u002Fdoc-writing-best-practices",0,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills","https:\u002F\u002Fgithub.com\u002FJinsYin","Bigdata Architect. Do more things!","2026-11-09 10:40:45",{"source":8,"skillName":50,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add JinsYin\u002Fskills --skill servarr-health-check",{"tool":66,"command":67},"bunx","bunx skills add JinsYin\u002Fskills --skill servarr-health-check",{"tool":69,"command":70},"pnpm","pnpm dlx skills add JinsYin\u002Fskills --skill servarr-health-check","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002FSKILL.md",true,[74,80,84,88,92,96,100,104,108,112,116,120],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"AGENTS.md","REFERENCE","参考文档",8105,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002FAGENTS.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"rules\u002F_sections.md",1128,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002F_sections.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"rules\u002Fcjk-latin-spacing.md",817,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fcjk-latin-spacing.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"rules\u002Fcjk-number-spacing.md",761,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fcjk-number-spacing.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"rules\u002Fcjk-punctuation.md",894,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fcjk-punctuation.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"rules\u002Fcontent-example-copy-ready.md",1093,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fcontent-example-copy-ready.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"rules\u002Fcontent-why-not-just-what.md",1227,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fcontent-why-not-just-what.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"rules\u002Fstruct-code-fence-language.md",929,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fstruct-code-fence-language.md",{"path":109,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":110,"sourceHtmlUrl":111},"rules\u002Fstruct-heading-no-skip.md",946,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fstruct-heading-no-skip.md",{"path":113,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":114,"sourceHtmlUrl":115},"rules\u002Fstruct-reference-links.md",1599,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fstruct-reference-links.md",{"path":117,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":118,"sourceHtmlUrl":119},"rules\u002Fstruct-table-vs-list.md",949,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Frules\u002Fstruct-table-vs-list.md",{"path":121,"resourceType":122,"resourceTypeDesc":123,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002Fbuild.sh","SCRIPT","脚本",1522,"https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdoc-writing-best-practices\u002Fscripts\u002Fbuild.sh",[127,159,180,204,232,259],{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":45},"01M6D11YS49YDGXSBJ1YJ0FAD3","write-great-skill","Workflow and quality bar for agent skills: draft, polish, compress, verify, ship. Use whenever creating or editing a skill (`SKILL.md`, `references\u002F`, `rules\u002F`), or when project conventions route root `CLAUDE.md`\u002F`AGENTS.md` edits here, even if the user only says “改一下这个 skill”.","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fwrite-great-skill\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],"write","write great skill","draft","route","references","project conventions","verify","project","editing","polish","only","conventions","use","Rules","ship","workflow","quality","compress","user","for","when","bar",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":45},"01M6D11PP5HJ8142DKTSRJV73A","write-fspec","Derive the 功能规格说明书 (functional spec) from the product prototype and keep it versioned under products\u002Ffspec\u002F: Flyway-style V files plus a merged CURRENT.md. Use when a prototype is finalized, changed or backfilled, when a draft V is confirmed or CURRENT.md lags, or when the user mentions 功能规格, 功能规格说明书 or fspec. Not for the feature spec (.scratch\u002F*\u002Fspec.md) or DESIGN.md.","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fwrite-fspec\u002FSKILL.md",[],[137,166,139,167,168,169,170,171,172,173,36,174,149,175,155,156,176,157,177,178,179],"write fspec","prototype","feature","product","read","spec","edit","grep","files","Bash","scratch","keep","functional","style",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":186,"publishedAt":45},"01M6D11JXM378SWT0VYVCPGN0Y","version-release","Cut a SemVer release — bump every module's version in lockstep, promote CHANGELOG.md, commit, tag, push to origin. Args `major|minor|patch|\u003Cx.y.z>`; none → level inferred from `[Unreleased]`, confirmed with user. Invoke only on explicit request: the user, another skill, or a project convention asking for a release.","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fversion-release\u002FSKILL.md",[],[187,188,189,190,191,192,144,193,194,147,195,196,197,155,198,156,199,200,201,202,203],"release","version release","version","promote","push","changelog","another skill","bump","semver","patch","commit","with","request","cut","module","invoke","origin",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":216,"publishedAt":45},"01M6D11AR4DYNS4JM0QWQGAYS6","ui-ux-best-practices","UI\u002FUX rules for Chinese-language React\u002FVue admin consoles and their product\u002Fdesign specs. Use when designing, building, reviewing, or refactoring forms, lists, modals\u002Fdrawers, destructive actions, copy, formats, or console layout.","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fui-ux-best-practices\u002FSKILL.md",[210,213],{"categoryNo":211,"categoryName":212,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":214,"categoryName":215,"taxonomyType":28,"taxonomyTypeDesc":29},"01JBSEEDCAT000000000000032","设计师",[217,218,219,32,220,221,222,169,223,224,225,226,227,36,149,150,228,229,230,156,157,231],"ux","ui ux best practices","ui","ui ux","admin","chinese","layout","refactoring","actions","forms","console","vue","language","react","formats",{"skillNo":233,"name":234,"nameZh":6,"description":235,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":236,"categories":237,"keywords":241,"publishedAt":45},"01M6D111ECN97WMTB68PSQTGRV","spring-boot-best-practices","Spring Boot 3 + Java 21 + MyBatis Plus 项目的编码规范与架构纪律。涵盖分层依赖、国密 SM2\u002FSM3\u002FSM4、MyBatis Plus 实体与主键策略、多方言数据库迁移、R\u002FRList\u002FRPage 响应包装、DTO 职责边界、鉴权框架选型（Spring Security \u002F Sa-Token）与声明式权限校验、命名约定、模块 README 文档要求。在编写、审查或重构 Spring Boot 后端代码时使用——尤其是新增 Controller\u002FService\u002FMapper、定义 Entity 或 DTO、写数据库迁移、处理加解密与签名、设计 API 契约、或接入鉴权与权限校验时。","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fspring-boot-best-practices\u002FSKILL.md",[238],{"categoryNo":239,"categoryName":240,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",[242,243,244,245,32,246,41,247,248,36,38,249,250,251,252,253,254,255,256,257,258],"spring boot best practices","spring boot","spring","boot","controller","校验","token","service","security","java","api","spring boot 3","dto","mybatis","spring security","后端","数据",{"skillNo":260,"name":261,"nameZh":6,"description":262,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":263,"categories":264,"keywords":266,"publishedAt":45},"01M6D10Q5V8BG1YRW3AV89VVA3","setup-rules","Conduct an interactive interview, then install selected agent conventions, adapters, `skillsw`, and sensitive-file read restrictions into a project; `update` refreshes installed items without prompting. Use when the user asks to set up agent rules, or run `update` after `setup-rules` conventions change (e.g. Skill Workflow sync). Not for reviewing or hand-editing `CLAUDE.local.md`.","https:\u002F\u002Fgithub.com\u002FJinsYin\u002Fskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsetup-rules\u002FSKILL.md",[265],{"categoryNo":134,"categoryName":135,"taxonomyType":20,"taxonomyTypeDesc":21},[267,150,268,269,270,271,144,272,145,273,170,274,275,276,277,148,149,152,278,279,280,156,157,281,282,283],"setup rules","setup","SET","interview","change","run","update","up","sync","local","install","Adapters","agent rules","conduct","file","interactive","hand"]