[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CV95D76607A0DGTGTZ2MPF":3,"skill-same:01M6CV95D76607A0DGTGTZ2MPF":57},{"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":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":39,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6CV95D76607A0DGTGTZ2MPF","pr-writer",null,"Create pull requests following Sentry's engineering practices.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fpr-writer\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28],"pr","writer","pr writer","pull requests","create","engineering practices","pull","sentry","engineering","community","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## When to Use\n\n- You are ready to open a pull request and need a structured description based on the committed branch diff.\n- You want the PR body to capture what changed, why it changed, and any reviewer context.\n- You are using GitHub CLI and need a repeatable PR-writing workflow rather than writing the description ad hoc.\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## When to Use\n\n- You are ready to open a pull request and need a structured description based on the committed branch diff.\n- You want the PR body to capture what changed, why it changed, and any reviewer context.\n- You are using GitHub CLI and need a repeatable PR-writing workflow rather than writing the description ad hoc.\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":34,"source":28,"description":7},"unknown","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fpr-writer",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill pr-writer",{"tool":49,"command":50},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill pr-writer",{"tool":52,"command":53},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill pr-writer","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fpr-writer\u002FSKILL.md",true,[],[58,71,86,113,132,159],{"skillNo":59,"name":60,"nameZh":6,"description":6,"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":29},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[63],{"categoryNo":64,"categoryName":65,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[69,70],"Test Skill","test",{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":29},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[78,79,80,81,82,83,84,28,23,85],"zustand store ts","zustand","store","with","types","middleware","patterns","typescript",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":95,"publishedAt":29},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[92],{"categoryNo":93,"categoryName":94,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000023","Skill与智能体开发",[96,97,98,99,100,101,102,103,104,105,106,107,108,109,28,110,111,112],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management","tracking",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":120,"publishedAt":29},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[119],{"categoryNo":93,"categoryName":94,"taxonomyType":66,"taxonomyTypeDesc":67},[121,96,122,123,124,125,126,28,101,127,109,128,106,105,100,129,23,130,102,131],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":141,"publishedAt":29},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[138],{"categoryNo":139,"categoryName":140,"taxonomyType":66,"taxonomyTypeDesc":67},"01JBSEEDCAT000000000000009","前端开发",[142,143,144,145,146,85,147,148,149,150,151,152,81,153,154,155,156,28,157,158],"expert","zod","zod validation expert","validation","react","safe","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":166,"publishedAt":29},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[165],{"categoryNo":93,"categoryName":94,"taxonomyType":66,"taxonomyTypeDesc":67},[167,168,169,170,171,172,173,174,28,175,176,177,178,179,180,181,182,183,184,102],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]