[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M714AD3PRTK8BNRQ9WS6WX1T":3,"skill-same:01M714AD3PRTK8BNRQ9WS6WX1T":56},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":14,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":41,"install":42,"resources":55},"01M714AD3PRTK8BNRQ9WS6WX1T","pr-writer",null,"Create pull requests following Sentry's engineering practices.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fpr-writer\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"pr","writer","pr writer","pull requests","create","engineering practices","pull","sentry","engineering","community","requests","unknown","2026-11-10 10:12:30",false,"---\nname: pr-writer\ndescription: \"Create pull requests following Sentry's engineering practices.\"\nrisk: unknown\nsource: community\n---\n\n# PR Writer\n\nCreate pull requests following Sentry's engineering practices.\n\n**Requires**: GitHub CLI (`gh`) authenticated and available.\n\n## Prerequisites\n\nBefore creating a PR, ensure all changes are committed. If there are uncommitted changes, run the `sentry-skills:commit` skill first to commit them properly.\n\n```bash\n# Check for uncommitted changes\ngit status --porcelain\n```\n\nIf the output shows any uncommitted changes (modified, added, or untracked files that should be included), invoke the `sentry-skills:commit` skill before proceeding.\n\n## Process\n\n### Step 1: Verify Branch State\n\n```bash\n# Detect the default branch — note the output for use in subsequent commands\ngh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'\n```\n\n```bash\n# Check current branch and status (substitute the detected branch name above for BASE)\ngit status\ngit log BASE..HEAD --oneline\n```\n\nEnsure:\n- All changes are committed\n- Branch is up to date with remote\n- Changes are rebased on the base branch if needed\n\n### Step 2: Analyze Changes\n\nReview what will be included in the PR:\n\n```bash\n# See all commits that will be in the PR (substitute detected branch name for BASE)\ngit log BASE..HEAD\n\n# See the full diff\ngit diff BASE...HEAD\n```\n\nUnderstand the scope and purpose of all changes before writing the description.\n\n### Step 3: Write the PR Description\n\nUse this structure for PR descriptions (ignoring any repository PR templates):\n\n```markdown\n\u003Cbrief description of what the PR does>\n\n\u003Cwhy these changes are being made - the motivation>\n\n\u003Calternative approaches considered, if any>\n\n\u003Cany additional context reviewers need>\n```\n\n**Do NOT include:**\n- \"Test plan\" sections\n- Checkbox lists of testing steps\n- Redundant summaries of the diff\n\n**Do include:**\n- Clear explanation of what and why\n- Links to relevant issues or tickets\n- Context that isn't obvious from the code\n- Notes on specific areas that need careful review\n\n### Step 4: Create the PR\n\n```bash\ngh pr create --draft --title \"\u003Ctype>(\u003Cscope>): \u003Cdescription>\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cdescription body here>\nEOF\n)\"\n```\n\n**Title format** follows commit conventions:\n- `feat(scope): Add new feature`\n- `fix(scope): Fix the bug`\n- `ref: Refactor something`\n\n## PR Description Examples\n\n### Feature PR\n\n```markdown\nAdd Slack thread replies for alert notifications\n\nWhen an alert is updated or resolved, we now post a reply to the original\nSlack thread instead of creating a new message. This keeps related\nnotifications grouped and reduces channel noise.\n\nPreviously considered posting edits to the original message, but threading\nbetter preserves the timeline of events and works when the original message\nis older than Slack's edit window.\n\nRefs SENTRY-1234\n```\n\n### Bug Fix PR\n\n```markdown\nHandle null response in user API endpoint\n\nThe user endpoint could return null for soft-deleted accounts, causing\ndashboard crashes when accessing user properties. This adds a null check\nand returns a proper 404 response.\n\nFound while investigating SENTRY-5678.\n\nFixes SENTRY-5678\n```\n\n### Refactor PR\n\n```markdown\nExtract validation logic to shared module\n\nMoves duplicate validation code from the alerts, issues, and projects\nendpoints into a shared validator class. No behavior change.\n\nThis prepares for adding new validation rules in SENTRY-9999 without\nduplicating logic across endpoints.\n```\n\n## Issue References\n\nReference issues in the PR body:\n\n| Syntax | Effect |\n|--------|--------|\n| `Fixes #1234` | Closes GitHub issue on merge |\n| `Fixes SENTRY-1234` | Closes Sentry issue |\n| `Refs GH-1234` | Links without closing |\n| `Refs LINEAR-ABC-123` | Links Linear issue |\n\n## Guidelines\n\n- **One PR per feature\u002Ffix** - Don't bundle unrelated changes\n- **Keep PRs reviewable** - Smaller PRs get faster, better reviews\n- **Explain the why** - Code shows what; description explains why\n- **Mark WIP early** - Use draft PRs for early feedback\n\n## Editing Existing PRs\n\nIf you need to update a PR after creation, use `gh api` instead of `gh pr edit`:\n\n```bash\n# Update PR description\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER -f body=\"$(cat \u003C\u003C'EOF'\nUpdated description here\nEOF\n)\"\n\n# Update PR title\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER -f title='new: Title here'\n\n# Update both\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER \\\n  -f title='new: Title' \\\n  -f body='New description'\n```\n\nNote: `gh pr edit` is currently broken due to GitHub's Projects (classic) deprecation.\n\n## References\n\n- [Sentry Code Review Guidelines](https:\u002F\u002Fdevelop.sentry.dev\u002Fengineering-practices\u002Fcode-review\u002F)\n- [Sentry Commit Messages](https:\u002F\u002Fdevelop.sentry.dev\u002Fengineering-practices\u002Fcommit-messages\u002F)\n","# PR Writer\n\nCreate pull requests following Sentry's engineering practices.\n\n**Requires**: GitHub CLI (`gh`) authenticated and available.\n\n## Prerequisites\n\nBefore creating a PR, ensure all changes are committed. If there are uncommitted changes, run the `sentry-skills:commit` skill first to commit them properly.\n\n```bash\n# Check for uncommitted changes\ngit status --porcelain\n```\n\nIf the output shows any uncommitted changes (modified, added, or untracked files that should be included), invoke the `sentry-skills:commit` skill before proceeding.\n\n## Process\n\n### Step 1: Verify Branch State\n\n```bash\n# Detect the default branch — note the output for use in subsequent commands\ngh repo view --json defaultBranchRef --jq '.defaultBranchRef.name'\n```\n\n```bash\n# Check current branch and status (substitute the detected branch name above for BASE)\ngit status\ngit log BASE..HEAD --oneline\n```\n\nEnsure:\n- All changes are committed\n- Branch is up to date with remote\n- Changes are rebased on the base branch if needed\n\n### Step 2: Analyze Changes\n\nReview what will be included in the PR:\n\n```bash\n# See all commits that will be in the PR (substitute detected branch name for BASE)\ngit log BASE..HEAD\n\n# See the full diff\ngit diff BASE...HEAD\n```\n\nUnderstand the scope and purpose of all changes before writing the description.\n\n### Step 3: Write the PR Description\n\nUse this structure for PR descriptions (ignoring any repository PR templates):\n\n```markdown\n\u003Cbrief description of what the PR does>\n\n\u003Cwhy these changes are being made - the motivation>\n\n\u003Calternative approaches considered, if any>\n\n\u003Cany additional context reviewers need>\n```\n\n**Do NOT include:**\n- \"Test plan\" sections\n- Checkbox lists of testing steps\n- Redundant summaries of the diff\n\n**Do include:**\n- Clear explanation of what and why\n- Links to relevant issues or tickets\n- Context that isn't obvious from the code\n- Notes on specific areas that need careful review\n\n### Step 4: Create the PR\n\n```bash\ngh pr create --draft --title \"\u003Ctype>(\u003Cscope>): \u003Cdescription>\" --body \"$(cat \u003C\u003C'EOF'\n\u003Cdescription body here>\nEOF\n)\"\n```\n\n**Title format** follows commit conventions:\n- `feat(scope): Add new feature`\n- `fix(scope): Fix the bug`\n- `ref: Refactor something`\n\n## PR Description Examples\n\n### Feature PR\n\n```markdown\nAdd Slack thread replies for alert notifications\n\nWhen an alert is updated or resolved, we now post a reply to the original\nSlack thread instead of creating a new message. This keeps related\nnotifications grouped and reduces channel noise.\n\nPreviously considered posting edits to the original message, but threading\nbetter preserves the timeline of events and works when the original message\nis older than Slack's edit window.\n\nRefs SENTRY-1234\n```\n\n### Bug Fix PR\n\n```markdown\nHandle null response in user API endpoint\n\nThe user endpoint could return null for soft-deleted accounts, causing\ndashboard crashes when accessing user properties. This adds a null check\nand returns a proper 404 response.\n\nFound while investigating SENTRY-5678.\n\nFixes SENTRY-5678\n```\n\n### Refactor PR\n\n```markdown\nExtract validation logic to shared module\n\nMoves duplicate validation code from the alerts, issues, and projects\nendpoints into a shared validator class. No behavior change.\n\nThis prepares for adding new validation rules in SENTRY-9999 without\nduplicating logic across endpoints.\n```\n\n## Issue References\n\nReference issues in the PR body:\n\n| Syntax | Effect |\n|--------|--------|\n| `Fixes #1234` | Closes GitHub issue on merge |\n| `Fixes SENTRY-1234` | Closes Sentry issue |\n| `Refs GH-1234` | Links without closing |\n| `Refs LINEAR-ABC-123` | Links Linear issue |\n\n## Guidelines\n\n- **One PR per feature\u002Ffix** - Don't bundle unrelated changes\n- **Keep PRs reviewable** - Smaller PRs get faster, better reviews\n- **Explain the why** - Code shows what; description explains why\n- **Mark WIP early** - Use draft PRs for early feedback\n\n## Editing Existing PRs\n\nIf you need to update a PR after creation, use `gh api` instead of `gh pr edit`:\n\n```bash\n# Update PR description\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER -f body=\"$(cat \u003C\u003C'EOF'\nUpdated description here\nEOF\n)\"\n\n# Update PR title\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER -f title='new: Title here'\n\n# Update both\ngh api -X PATCH repos\u002F{owner}\u002F{repo}\u002Fpulls\u002FPR_NUMBER \\\n  -f title='new: Title' \\\n  -f body='New description'\n```\n\nNote: `gh pr edit` is currently broken due to GitHub's Projects (classic) deprecation.\n\n## References\n\n- [Sentry Code Review Guidelines](https:\u002F\u002Fdevelop.sentry.dev\u002Fengineering-practices\u002Fcode-review\u002F)\n- [Sentry Commit Messages](https:\u002F\u002Fdevelop.sentry.dev\u002Fengineering-practices\u002Fcommit-messages\u002F)\n",{"name":5,"risk":30,"source":28,"description":7},"main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fcopilot\u002Fpr-writer","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill pr-writer",{"tool":48,"command":49},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill pr-writer",{"tool":51,"command":52},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill pr-writer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fcopilot\u002Fpr-writer\u002FSKILL.md",true,[],[57,81,107,117,130,149],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":68,"publishedAt":31},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[63],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[69,70,71,72,73,74,75,76,77,78,79,80],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":31},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[88,89,90,91,92,93,71,94,95,96,97,98,99,100,101,102,103,104,105,106],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":31},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[114,115,88,99,100,101,102,92,71,104,116,105,106,98,96,95,94,103,93,91],"trend radar","radar","pulse",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":31},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[124,125,126,127,128,129],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":141,"publishedAt":31},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[136],{"categoryNo":137,"categoryName":138,"taxonomyType":139,"taxonomyTypeDesc":140},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[132,77,142,143,144,80,99,145,146,147,90,148,103],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":31},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[151,156,157,158,103,159,146,160,161,162,163,164],"status","play","go","latest","github","discover","control","cmd","volume"]