[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-trail-of-bits-semgrep-rule-variant-creator":3,"mdc--uqtihq-key":38,"related-repo-trail-of-bits-semgrep-rule-variant-creator":1347,"related-org-trail-of-bits-semgrep-rule-variant-creator":1445},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":33,"sourceUrl":36,"mdContent":37},"semgrep-rule-variant-creator","create Semgrep rule variants for languages","Creates language variants of existing Semgrep rules. Use when porting a Semgrep rule to specified target languages. Takes an existing rule and target languages as input, produces independent rule+test directories for each language.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"trail-of-bits","Trail of Bits","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Ftrail-of-bits.png","trailofbits",[13,17,20,23],{"name":14,"slug":15,"type":16},"Security","security","tag",{"name":18,"slug":19,"type":16},"Static Analysis","static-analysis",{"name":21,"slug":22,"type":16},"Semgrep","semgrep",{"name":24,"slug":25,"type":16},"Code Analysis","code-analysis",6139,"https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills","2026-07-17T06:05:34.275876",null,541,[32],"agent-skills",{"repoUrl":27,"stars":26,"forks":30,"topics":34,"description":35},[32],"Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows","https:\u002F\u002Fgithub.com\u002Ftrailofbits\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fsemgrep-rule-variant-creator\u002Fskills\u002Fsemgrep-rule-variant-creator","---\nname: semgrep-rule-variant-creator\ndescription: Creates language variants of existing Semgrep rules. Use when porting a Semgrep rule to specified target languages. Takes an existing rule and target languages as input, produces independent rule+test directories for each language.\nallowed-tools: Bash Read Write Edit Glob Grep WebFetch\n---\n\n# Semgrep Rule Variant Creator\n\nPort existing Semgrep rules to new target languages with proper applicability analysis and test-driven validation.\n\n## When to Use\n\n**Ideal scenarios:**\n- Porting an existing Semgrep rule to one or more target languages\n- Creating language-specific variants of a universal vulnerability pattern\n- Expanding rule coverage across a polyglot codebase\n- Translating rules between languages with equivalent constructs\n\n## When NOT to Use\n\nDo NOT use this skill for:\n- Creating a new Semgrep rule from scratch (use `semgrep-rule-creator` instead)\n- Running existing rules against code\n- Languages where the vulnerability pattern fundamentally doesn't apply\n- Minor syntax variations within the same language\n\n## Input Specification\n\nThis skill requires:\n1. **Existing Semgrep rule** - YAML file path or YAML rule content\n2. **Target languages** - One or more languages to port to (e.g., \"Golang and Java\")\n\n## Output Specification\n\nFor each applicable target language, produces:\n```\n\u003Coriginal-rule-id>-\u003Clanguage>\u002F\n├── \u003Coriginal-rule-id>-\u003Clanguage>.yaml     # Ported Semgrep rule\n└── \u003Coriginal-rule-id>-\u003Clanguage>.\u003Cext>    # Test file with annotations\n```\n\nExample output for porting `sql-injection` to Go and Java:\n```\nsql-injection-golang\u002F\n├── sql-injection-golang.yaml\n└── sql-injection-golang.go\n\nsql-injection-java\u002F\n├── sql-injection-java.yaml\n└── sql-injection-java.java\n```\n\n## Rationalizations to Reject\n\nWhen porting Semgrep rules, reject these common shortcuts:\n\n| Rationalization | Why It Fails | Correct Approach |\n|-----------------|--------------|------------------|\n| \"Pattern structure is identical\" | Different ASTs across languages | Always dump AST for target language |\n| \"Same vulnerability, same detection\" | Data flow differs between languages | Analyze target language idioms |\n| \"Rule doesn't need tests since original worked\" | Language edge cases differ | Write NEW test cases for target |\n| \"Skip applicability - it obviously applies\" | Some patterns are language-specific | Complete applicability analysis first |\n| \"I'll create all variants then test\" | Errors compound, hard to debug | Complete full cycle per language |\n| \"Library equivalent is close enough\" | Surface similarity hides differences | Verify API semantics match |\n| \"Just translate the syntax 1:1\" | Languages have different idioms | Research target language patterns |\n\n## Strictness Level\n\nThis workflow is **strict** - do not skip steps:\n- **Applicability analysis is mandatory**: Don't assume patterns translate\n- **Each language is independent**: Complete full cycle before moving to next\n- **Test-first for each variant**: Never write a rule without test cases\n- **100% test pass required**: \"Most tests pass\" is not acceptable\n\n## Overview\n\nThis skill guides the creation of language-specific variants of existing Semgrep rules. Each target language goes through an independent 4-phase cycle:\n\n```\nFOR EACH target language:\n  Phase 1: Applicability Analysis → Verdict\n  Phase 2: Test Creation (Test-First)\n  Phase 3: Rule Creation\n  Phase 4: Validation\n  (Complete full cycle before moving to next language)\n```\n\n## Foundational Knowledge\n\n**The `semgrep-rule-creator` skill is the authoritative reference for Semgrep rule creation fundamentals.** While this skill focuses on porting existing rules to new languages, the core principles of writing quality rules remain the same.\n\nConsult `semgrep-rule-creator` for guidance on:\n- **When to use taint mode vs pattern matching** - Choosing the right approach for the vulnerability type\n- **Test-first methodology** - Why tests come before rules and how to write effective test cases\n- **Anti-patterns to avoid** - Common mistakes like overly broad or overly specific patterns\n- **Iterating until tests pass** - The validation loop and debugging techniques\n- **Rule optimization** - Removing redundant patterns after tests pass\n\nWhen porting a rule, you're applying these same principles in a new language context. If uncertain about rule structure or approach, refer to `semgrep-rule-creator` first.\n\n## Four-Phase Workflow\n\n### Phase 1: Applicability Analysis\n\nBefore porting, determine if the pattern applies to the target language.\n\n**Analysis criteria:**\n1. Does the vulnerability class exist in the target language?\n2. Does an equivalent construct exist (function, pattern, library)?\n3. Are the semantics similar enough for meaningful detection?\n\n**Verdict options:**\n- `APPLICABLE` → Proceed with variant creation\n- `APPLICABLE_WITH_ADAPTATION` → Proceed but significant changes needed\n- `NOT_APPLICABLE` → Skip this language, document why\n\nSee [applicability-analysis.md]({baseDir}\u002Freferences\u002Fapplicability-analysis.md) for detailed guidance.\n\n### Phase 2: Test Creation (Test-First)\n\n**Always write tests before the rule.**\n\nCreate test file with target language idioms:\n- Minimum 2 vulnerable cases (`ruleid:`)\n- Minimum 2 safe cases (`ok:`)\n- Include language-specific edge cases\n\n```go\n\u002F\u002F ruleid: sql-injection-golang\ndb.Query(\"SELECT * FROM users WHERE id = \" + userInput)\n\n\u002F\u002F ok: sql-injection-golang\ndb.Query(\"SELECT * FROM users WHERE id = ?\", userInput)\n```\n\n### Phase 3: Rule Creation\n\n1. **Analyze AST**: `semgrep --dump-ast -l \u003Clang> test-file`\n2. **Translate patterns** to target language syntax\n3. **Update metadata**: language key, message, rule ID\n4. **Adapt for idioms**: Handle language-specific constructs\n\nSee [language-syntax-guide.md]({baseDir}\u002Freferences\u002Flanguage-syntax-guide.md) for translation guidance.\n\n### Phase 4: Validation\n\n```bash\n# Validate YAML\nsemgrep --validate --config rule.yaml\n\n# Run tests\nsemgrep --test --config rule.yaml test-file\n```\n\n**Checkpoint**: Output MUST show `All tests passed`.\n\nFor taint rule debugging:\n```bash\nsemgrep --dataflow-traces -f rule.yaml test-file\n```\n\nSee [workflow.md]({baseDir}\u002Freferences\u002Fworkflow.md) for detailed workflow and troubleshooting.\n\n## Quick Reference\n\n| Task | Command |\n|------|---------|\n| Run tests | `semgrep --test --config rule.yaml test-file` |\n| Validate YAML | `semgrep --validate --config rule.yaml` |\n| Dump AST | `semgrep --dump-ast -l \u003Clang> \u003Cfile>` |\n| Debug taint flow | `semgrep --dataflow-traces -f rule.yaml file` |\n\n\n## Key Differences from Rule Creation\n\n| Aspect | semgrep-rule-creator | This skill |\n|--------|---------------------|------------|\n| Input | Bug pattern description | Existing rule + target languages |\n| Output | Single rule+test | Multiple rule+test directories |\n| Workflow | Single creation cycle | Independent cycle per language |\n| Phase 1 | Problem analysis | Applicability analysis per language |\n| Library research | Always relevant | Optional (when original uses libraries) |\n\n## Documentation\n\n**REQUIRED**: Before porting rules, read relevant Semgrep documentation:\n\n- [Rule Syntax](https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Frule-syntax) - YAML structure and operators\n- [Pattern Syntax](https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Fpattern-syntax) - Pattern matching and metavariables\n- [Pattern Examples](https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Fpattern-examples) - Per-language pattern references\n- [Testing Rules](https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Ftesting-rules) - Testing annotations\n- [Trail of Bits Testing Handbook](https:\u002F\u002Fappsec.guide\u002Fdocs\u002Fstatic-analysis\u002Fsemgrep\u002Fadvanced\u002F) - Advanced patterns\n\n## Next Steps\n\n- For applicability analysis guidance, see [applicability-analysis.md]({baseDir}\u002Freferences\u002Fapplicability-analysis.md)\n- For language translation guidance, see [language-syntax-guide.md]({baseDir}\u002Freferences\u002Flanguage-syntax-guide.md)\n- For detailed workflow and examples, see [workflow.md]({baseDir}\u002Freferences\u002Fworkflow.md)\n",{"data":39,"body":41},{"name":4,"description":6,"allowed-tools":40},"Bash Read Write Edit Glob Grep WebFetch",{"type":42,"children":43},"root",[44,52,58,65,74,99,105,110,142,148,153,177,183,188,200,213,222,228,233,392,398,410,453,459,464,473,479,496,508,561,573,579,586,591,599,617,625,661,675,681,689,694,727,784,790,839,851,857,940,958,963,995,1007,1013,1103,1109,1225,1231,1241,1305,1311,1341],{"type":45,"tag":46,"props":47,"children":48},"element","h1",{"id":4},[49],{"type":50,"value":51},"text","Semgrep Rule Variant Creator",{"type":45,"tag":53,"props":54,"children":55},"p",{},[56],{"type":50,"value":57},"Port existing Semgrep rules to new target languages with proper applicability analysis and test-driven validation.",{"type":45,"tag":59,"props":60,"children":62},"h2",{"id":61},"when-to-use",[63],{"type":50,"value":64},"When to Use",{"type":45,"tag":53,"props":66,"children":67},{},[68],{"type":45,"tag":69,"props":70,"children":71},"strong",{},[72],{"type":50,"value":73},"Ideal scenarios:",{"type":45,"tag":75,"props":76,"children":77},"ul",{},[78,84,89,94],{"type":45,"tag":79,"props":80,"children":81},"li",{},[82],{"type":50,"value":83},"Porting an existing Semgrep rule to one or more target languages",{"type":45,"tag":79,"props":85,"children":86},{},[87],{"type":50,"value":88},"Creating language-specific variants of a universal vulnerability pattern",{"type":45,"tag":79,"props":90,"children":91},{},[92],{"type":50,"value":93},"Expanding rule coverage across a polyglot codebase",{"type":45,"tag":79,"props":95,"children":96},{},[97],{"type":50,"value":98},"Translating rules between languages with equivalent constructs",{"type":45,"tag":59,"props":100,"children":102},{"id":101},"when-not-to-use",[103],{"type":50,"value":104},"When NOT to Use",{"type":45,"tag":53,"props":106,"children":107},{},[108],{"type":50,"value":109},"Do NOT use this skill for:",{"type":45,"tag":75,"props":111,"children":112},{},[113,127,132,137],{"type":45,"tag":79,"props":114,"children":115},{},[116,118,125],{"type":50,"value":117},"Creating a new Semgrep rule from scratch (use ",{"type":45,"tag":119,"props":120,"children":122},"code",{"className":121},[],[123],{"type":50,"value":124},"semgrep-rule-creator",{"type":50,"value":126}," instead)",{"type":45,"tag":79,"props":128,"children":129},{},[130],{"type":50,"value":131},"Running existing rules against code",{"type":45,"tag":79,"props":133,"children":134},{},[135],{"type":50,"value":136},"Languages where the vulnerability pattern fundamentally doesn't apply",{"type":45,"tag":79,"props":138,"children":139},{},[140],{"type":50,"value":141},"Minor syntax variations within the same language",{"type":45,"tag":59,"props":143,"children":145},{"id":144},"input-specification",[146],{"type":50,"value":147},"Input Specification",{"type":45,"tag":53,"props":149,"children":150},{},[151],{"type":50,"value":152},"This skill requires:",{"type":45,"tag":154,"props":155,"children":156},"ol",{},[157,167],{"type":45,"tag":79,"props":158,"children":159},{},[160,165],{"type":45,"tag":69,"props":161,"children":162},{},[163],{"type":50,"value":164},"Existing Semgrep rule",{"type":50,"value":166}," - YAML file path or YAML rule content",{"type":45,"tag":79,"props":168,"children":169},{},[170,175],{"type":45,"tag":69,"props":171,"children":172},{},[173],{"type":50,"value":174},"Target languages",{"type":50,"value":176}," - One or more languages to port to (e.g., \"Golang and Java\")",{"type":45,"tag":59,"props":178,"children":180},{"id":179},"output-specification",[181],{"type":50,"value":182},"Output Specification",{"type":45,"tag":53,"props":184,"children":185},{},[186],{"type":50,"value":187},"For each applicable target language, produces:",{"type":45,"tag":189,"props":190,"children":194},"pre",{"className":191,"code":193,"language":50},[192],"language-text","\u003Coriginal-rule-id>-\u003Clanguage>\u002F\n├── \u003Coriginal-rule-id>-\u003Clanguage>.yaml     # Ported Semgrep rule\n└── \u003Coriginal-rule-id>-\u003Clanguage>.\u003Cext>    # Test file with annotations\n",[195],{"type":45,"tag":119,"props":196,"children":198},{"__ignoreMap":197},"",[199],{"type":50,"value":193},{"type":45,"tag":53,"props":201,"children":202},{},[203,205,211],{"type":50,"value":204},"Example output for porting ",{"type":45,"tag":119,"props":206,"children":208},{"className":207},[],[209],{"type":50,"value":210},"sql-injection",{"type":50,"value":212}," to Go and Java:",{"type":45,"tag":189,"props":214,"children":217},{"className":215,"code":216,"language":50},[192],"sql-injection-golang\u002F\n├── sql-injection-golang.yaml\n└── sql-injection-golang.go\n\nsql-injection-java\u002F\n├── sql-injection-java.yaml\n└── sql-injection-java.java\n",[218],{"type":45,"tag":119,"props":219,"children":220},{"__ignoreMap":197},[221],{"type":50,"value":216},{"type":45,"tag":59,"props":223,"children":225},{"id":224},"rationalizations-to-reject",[226],{"type":50,"value":227},"Rationalizations to Reject",{"type":45,"tag":53,"props":229,"children":230},{},[231],{"type":50,"value":232},"When porting Semgrep rules, reject these common shortcuts:",{"type":45,"tag":234,"props":235,"children":236},"table",{},[237,261],{"type":45,"tag":238,"props":239,"children":240},"thead",{},[241],{"type":45,"tag":242,"props":243,"children":244},"tr",{},[245,251,256],{"type":45,"tag":246,"props":247,"children":248},"th",{},[249],{"type":50,"value":250},"Rationalization",{"type":45,"tag":246,"props":252,"children":253},{},[254],{"type":50,"value":255},"Why It Fails",{"type":45,"tag":246,"props":257,"children":258},{},[259],{"type":50,"value":260},"Correct Approach",{"type":45,"tag":262,"props":263,"children":264},"tbody",{},[265,284,302,320,338,356,374],{"type":45,"tag":242,"props":266,"children":267},{},[268,274,279],{"type":45,"tag":269,"props":270,"children":271},"td",{},[272],{"type":50,"value":273},"\"Pattern structure is identical\"",{"type":45,"tag":269,"props":275,"children":276},{},[277],{"type":50,"value":278},"Different ASTs across languages",{"type":45,"tag":269,"props":280,"children":281},{},[282],{"type":50,"value":283},"Always dump AST for target language",{"type":45,"tag":242,"props":285,"children":286},{},[287,292,297],{"type":45,"tag":269,"props":288,"children":289},{},[290],{"type":50,"value":291},"\"Same vulnerability, same detection\"",{"type":45,"tag":269,"props":293,"children":294},{},[295],{"type":50,"value":296},"Data flow differs between languages",{"type":45,"tag":269,"props":298,"children":299},{},[300],{"type":50,"value":301},"Analyze target language idioms",{"type":45,"tag":242,"props":303,"children":304},{},[305,310,315],{"type":45,"tag":269,"props":306,"children":307},{},[308],{"type":50,"value":309},"\"Rule doesn't need tests since original worked\"",{"type":45,"tag":269,"props":311,"children":312},{},[313],{"type":50,"value":314},"Language edge cases differ",{"type":45,"tag":269,"props":316,"children":317},{},[318],{"type":50,"value":319},"Write NEW test cases for target",{"type":45,"tag":242,"props":321,"children":322},{},[323,328,333],{"type":45,"tag":269,"props":324,"children":325},{},[326],{"type":50,"value":327},"\"Skip applicability - it obviously applies\"",{"type":45,"tag":269,"props":329,"children":330},{},[331],{"type":50,"value":332},"Some patterns are language-specific",{"type":45,"tag":269,"props":334,"children":335},{},[336],{"type":50,"value":337},"Complete applicability analysis first",{"type":45,"tag":242,"props":339,"children":340},{},[341,346,351],{"type":45,"tag":269,"props":342,"children":343},{},[344],{"type":50,"value":345},"\"I'll create all variants then test\"",{"type":45,"tag":269,"props":347,"children":348},{},[349],{"type":50,"value":350},"Errors compound, hard to debug",{"type":45,"tag":269,"props":352,"children":353},{},[354],{"type":50,"value":355},"Complete full cycle per language",{"type":45,"tag":242,"props":357,"children":358},{},[359,364,369],{"type":45,"tag":269,"props":360,"children":361},{},[362],{"type":50,"value":363},"\"Library equivalent is close enough\"",{"type":45,"tag":269,"props":365,"children":366},{},[367],{"type":50,"value":368},"Surface similarity hides differences",{"type":45,"tag":269,"props":370,"children":371},{},[372],{"type":50,"value":373},"Verify API semantics match",{"type":45,"tag":242,"props":375,"children":376},{},[377,382,387],{"type":45,"tag":269,"props":378,"children":379},{},[380],{"type":50,"value":381},"\"Just translate the syntax 1:1\"",{"type":45,"tag":269,"props":383,"children":384},{},[385],{"type":50,"value":386},"Languages have different idioms",{"type":45,"tag":269,"props":388,"children":389},{},[390],{"type":50,"value":391},"Research target language patterns",{"type":45,"tag":59,"props":393,"children":395},{"id":394},"strictness-level",[396],{"type":50,"value":397},"Strictness Level",{"type":45,"tag":53,"props":399,"children":400},{},[401,403,408],{"type":50,"value":402},"This workflow is ",{"type":45,"tag":69,"props":404,"children":405},{},[406],{"type":50,"value":407},"strict",{"type":50,"value":409}," - do not skip steps:",{"type":45,"tag":75,"props":411,"children":412},{},[413,423,433,443],{"type":45,"tag":79,"props":414,"children":415},{},[416,421],{"type":45,"tag":69,"props":417,"children":418},{},[419],{"type":50,"value":420},"Applicability analysis is mandatory",{"type":50,"value":422},": Don't assume patterns translate",{"type":45,"tag":79,"props":424,"children":425},{},[426,431],{"type":45,"tag":69,"props":427,"children":428},{},[429],{"type":50,"value":430},"Each language is independent",{"type":50,"value":432},": Complete full cycle before moving to next",{"type":45,"tag":79,"props":434,"children":435},{},[436,441],{"type":45,"tag":69,"props":437,"children":438},{},[439],{"type":50,"value":440},"Test-first for each variant",{"type":50,"value":442},": Never write a rule without test cases",{"type":45,"tag":79,"props":444,"children":445},{},[446,451],{"type":45,"tag":69,"props":447,"children":448},{},[449],{"type":50,"value":450},"100% test pass required",{"type":50,"value":452},": \"Most tests pass\" is not acceptable",{"type":45,"tag":59,"props":454,"children":456},{"id":455},"overview",[457],{"type":50,"value":458},"Overview",{"type":45,"tag":53,"props":460,"children":461},{},[462],{"type":50,"value":463},"This skill guides the creation of language-specific variants of existing Semgrep rules. Each target language goes through an independent 4-phase cycle:",{"type":45,"tag":189,"props":465,"children":468},{"className":466,"code":467,"language":50},[192],"FOR EACH target language:\n  Phase 1: Applicability Analysis → Verdict\n  Phase 2: Test Creation (Test-First)\n  Phase 3: Rule Creation\n  Phase 4: Validation\n  (Complete full cycle before moving to next language)\n",[469],{"type":45,"tag":119,"props":470,"children":471},{"__ignoreMap":197},[472],{"type":50,"value":467},{"type":45,"tag":59,"props":474,"children":476},{"id":475},"foundational-knowledge",[477],{"type":50,"value":478},"Foundational Knowledge",{"type":45,"tag":53,"props":480,"children":481},{},[482,494],{"type":45,"tag":69,"props":483,"children":484},{},[485,487,492],{"type":50,"value":486},"The ",{"type":45,"tag":119,"props":488,"children":490},{"className":489},[],[491],{"type":50,"value":124},{"type":50,"value":493}," skill is the authoritative reference for Semgrep rule creation fundamentals.",{"type":50,"value":495}," While this skill focuses on porting existing rules to new languages, the core principles of writing quality rules remain the same.",{"type":45,"tag":53,"props":497,"children":498},{},[499,501,506],{"type":50,"value":500},"Consult ",{"type":45,"tag":119,"props":502,"children":504},{"className":503},[],[505],{"type":50,"value":124},{"type":50,"value":507}," for guidance on:",{"type":45,"tag":75,"props":509,"children":510},{},[511,521,531,541,551],{"type":45,"tag":79,"props":512,"children":513},{},[514,519],{"type":45,"tag":69,"props":515,"children":516},{},[517],{"type":50,"value":518},"When to use taint mode vs pattern matching",{"type":50,"value":520}," - Choosing the right approach for the vulnerability type",{"type":45,"tag":79,"props":522,"children":523},{},[524,529],{"type":45,"tag":69,"props":525,"children":526},{},[527],{"type":50,"value":528},"Test-first methodology",{"type":50,"value":530}," - Why tests come before rules and how to write effective test cases",{"type":45,"tag":79,"props":532,"children":533},{},[534,539],{"type":45,"tag":69,"props":535,"children":536},{},[537],{"type":50,"value":538},"Anti-patterns to avoid",{"type":50,"value":540}," - Common mistakes like overly broad or overly specific patterns",{"type":45,"tag":79,"props":542,"children":543},{},[544,549],{"type":45,"tag":69,"props":545,"children":546},{},[547],{"type":50,"value":548},"Iterating until tests pass",{"type":50,"value":550}," - The validation loop and debugging techniques",{"type":45,"tag":79,"props":552,"children":553},{},[554,559],{"type":45,"tag":69,"props":555,"children":556},{},[557],{"type":50,"value":558},"Rule optimization",{"type":50,"value":560}," - Removing redundant patterns after tests pass",{"type":45,"tag":53,"props":562,"children":563},{},[564,566,571],{"type":50,"value":565},"When porting a rule, you're applying these same principles in a new language context. If uncertain about rule structure or approach, refer to ",{"type":45,"tag":119,"props":567,"children":569},{"className":568},[],[570],{"type":50,"value":124},{"type":50,"value":572}," first.",{"type":45,"tag":59,"props":574,"children":576},{"id":575},"four-phase-workflow",[577],{"type":50,"value":578},"Four-Phase Workflow",{"type":45,"tag":580,"props":581,"children":583},"h3",{"id":582},"phase-1-applicability-analysis",[584],{"type":50,"value":585},"Phase 1: Applicability Analysis",{"type":45,"tag":53,"props":587,"children":588},{},[589],{"type":50,"value":590},"Before porting, determine if the pattern applies to the target language.",{"type":45,"tag":53,"props":592,"children":593},{},[594],{"type":45,"tag":69,"props":595,"children":596},{},[597],{"type":50,"value":598},"Analysis criteria:",{"type":45,"tag":154,"props":600,"children":601},{},[602,607,612],{"type":45,"tag":79,"props":603,"children":604},{},[605],{"type":50,"value":606},"Does the vulnerability class exist in the target language?",{"type":45,"tag":79,"props":608,"children":609},{},[610],{"type":50,"value":611},"Does an equivalent construct exist (function, pattern, library)?",{"type":45,"tag":79,"props":613,"children":614},{},[615],{"type":50,"value":616},"Are the semantics similar enough for meaningful detection?",{"type":45,"tag":53,"props":618,"children":619},{},[620],{"type":45,"tag":69,"props":621,"children":622},{},[623],{"type":50,"value":624},"Verdict options:",{"type":45,"tag":75,"props":626,"children":627},{},[628,639,650],{"type":45,"tag":79,"props":629,"children":630},{},[631,637],{"type":45,"tag":119,"props":632,"children":634},{"className":633},[],[635],{"type":50,"value":636},"APPLICABLE",{"type":50,"value":638}," → Proceed with variant creation",{"type":45,"tag":79,"props":640,"children":641},{},[642,648],{"type":45,"tag":119,"props":643,"children":645},{"className":644},[],[646],{"type":50,"value":647},"APPLICABLE_WITH_ADAPTATION",{"type":50,"value":649}," → Proceed but significant changes needed",{"type":45,"tag":79,"props":651,"children":652},{},[653,659],{"type":45,"tag":119,"props":654,"children":656},{"className":655},[],[657],{"type":50,"value":658},"NOT_APPLICABLE",{"type":50,"value":660}," → Skip this language, document why",{"type":45,"tag":53,"props":662,"children":663},{},[664,666,673],{"type":50,"value":665},"See ",{"type":45,"tag":667,"props":668,"children":670},"a",{"href":669},"%7BbaseDir%7D\u002Freferences\u002Fapplicability-analysis.md",[671],{"type":50,"value":672},"applicability-analysis.md",{"type":50,"value":674}," for detailed guidance.",{"type":45,"tag":580,"props":676,"children":678},{"id":677},"phase-2-test-creation-test-first",[679],{"type":50,"value":680},"Phase 2: Test Creation (Test-First)",{"type":45,"tag":53,"props":682,"children":683},{},[684],{"type":45,"tag":69,"props":685,"children":686},{},[687],{"type":50,"value":688},"Always write tests before the rule.",{"type":45,"tag":53,"props":690,"children":691},{},[692],{"type":50,"value":693},"Create test file with target language idioms:",{"type":45,"tag":75,"props":695,"children":696},{},[697,710,722],{"type":45,"tag":79,"props":698,"children":699},{},[700,702,708],{"type":50,"value":701},"Minimum 2 vulnerable cases (",{"type":45,"tag":119,"props":703,"children":705},{"className":704},[],[706],{"type":50,"value":707},"ruleid:",{"type":50,"value":709},")",{"type":45,"tag":79,"props":711,"children":712},{},[713,715,721],{"type":50,"value":714},"Minimum 2 safe cases (",{"type":45,"tag":119,"props":716,"children":718},{"className":717},[],[719],{"type":50,"value":720},"ok:",{"type":50,"value":709},{"type":45,"tag":79,"props":723,"children":724},{},[725],{"type":50,"value":726},"Include language-specific edge cases",{"type":45,"tag":189,"props":728,"children":732},{"className":729,"code":730,"language":731,"meta":197,"style":197},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ruleid: sql-injection-golang\ndb.Query(\"SELECT * FROM users WHERE id = \" + userInput)\n\n\u002F\u002F ok: sql-injection-golang\ndb.Query(\"SELECT * FROM users WHERE id = ?\", userInput)\n","go",[733],{"type":45,"tag":119,"props":734,"children":735},{"__ignoreMap":197},[736,747,756,766,775],{"type":45,"tag":737,"props":738,"children":741},"span",{"class":739,"line":740},"line",1,[742],{"type":45,"tag":737,"props":743,"children":744},{},[745],{"type":50,"value":746},"\u002F\u002F ruleid: sql-injection-golang\n",{"type":45,"tag":737,"props":748,"children":750},{"class":739,"line":749},2,[751],{"type":45,"tag":737,"props":752,"children":753},{},[754],{"type":50,"value":755},"db.Query(\"SELECT * FROM users WHERE id = \" + userInput)\n",{"type":45,"tag":737,"props":757,"children":759},{"class":739,"line":758},3,[760],{"type":45,"tag":737,"props":761,"children":763},{"emptyLinePlaceholder":762},true,[764],{"type":50,"value":765},"\n",{"type":45,"tag":737,"props":767,"children":769},{"class":739,"line":768},4,[770],{"type":45,"tag":737,"props":771,"children":772},{},[773],{"type":50,"value":774},"\u002F\u002F ok: sql-injection-golang\n",{"type":45,"tag":737,"props":776,"children":778},{"class":739,"line":777},5,[779],{"type":45,"tag":737,"props":780,"children":781},{},[782],{"type":50,"value":783},"db.Query(\"SELECT * FROM users WHERE id = ?\", userInput)\n",{"type":45,"tag":580,"props":785,"children":787},{"id":786},"phase-3-rule-creation",[788],{"type":50,"value":789},"Phase 3: Rule Creation",{"type":45,"tag":154,"props":791,"children":792},{},[793,809,819,829],{"type":45,"tag":79,"props":794,"children":795},{},[796,801,803],{"type":45,"tag":69,"props":797,"children":798},{},[799],{"type":50,"value":800},"Analyze AST",{"type":50,"value":802},": ",{"type":45,"tag":119,"props":804,"children":806},{"className":805},[],[807],{"type":50,"value":808},"semgrep --dump-ast -l \u003Clang> test-file",{"type":45,"tag":79,"props":810,"children":811},{},[812,817],{"type":45,"tag":69,"props":813,"children":814},{},[815],{"type":50,"value":816},"Translate patterns",{"type":50,"value":818}," to target language syntax",{"type":45,"tag":79,"props":820,"children":821},{},[822,827],{"type":45,"tag":69,"props":823,"children":824},{},[825],{"type":50,"value":826},"Update metadata",{"type":50,"value":828},": language key, message, rule ID",{"type":45,"tag":79,"props":830,"children":831},{},[832,837],{"type":45,"tag":69,"props":833,"children":834},{},[835],{"type":50,"value":836},"Adapt for idioms",{"type":50,"value":838},": Handle language-specific constructs",{"type":45,"tag":53,"props":840,"children":841},{},[842,843,849],{"type":50,"value":665},{"type":45,"tag":667,"props":844,"children":846},{"href":845},"%7BbaseDir%7D\u002Freferences\u002Flanguage-syntax-guide.md",[847],{"type":50,"value":848},"language-syntax-guide.md",{"type":50,"value":850}," for translation guidance.",{"type":45,"tag":580,"props":852,"children":854},{"id":853},"phase-4-validation",[855],{"type":50,"value":856},"Phase 4: Validation",{"type":45,"tag":189,"props":858,"children":862},{"className":859,"code":860,"language":861,"meta":197,"style":197},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Validate YAML\nsemgrep --validate --config rule.yaml\n\n# Run tests\nsemgrep --test --config rule.yaml test-file\n","bash",[863],{"type":45,"tag":119,"props":864,"children":865},{"__ignoreMap":197},[866,875,899,906,914],{"type":45,"tag":737,"props":867,"children":868},{"class":739,"line":740},[869],{"type":45,"tag":737,"props":870,"children":872},{"style":871},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[873],{"type":50,"value":874},"# Validate YAML\n",{"type":45,"tag":737,"props":876,"children":877},{"class":739,"line":749},[878,883,889,894],{"type":45,"tag":737,"props":879,"children":881},{"style":880},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[882],{"type":50,"value":22},{"type":45,"tag":737,"props":884,"children":886},{"style":885},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[887],{"type":50,"value":888}," --validate",{"type":45,"tag":737,"props":890,"children":891},{"style":885},[892],{"type":50,"value":893}," --config",{"type":45,"tag":737,"props":895,"children":896},{"style":885},[897],{"type":50,"value":898}," rule.yaml\n",{"type":45,"tag":737,"props":900,"children":901},{"class":739,"line":758},[902],{"type":45,"tag":737,"props":903,"children":904},{"emptyLinePlaceholder":762},[905],{"type":50,"value":765},{"type":45,"tag":737,"props":907,"children":908},{"class":739,"line":768},[909],{"type":45,"tag":737,"props":910,"children":911},{"style":871},[912],{"type":50,"value":913},"# Run tests\n",{"type":45,"tag":737,"props":915,"children":916},{"class":739,"line":777},[917,921,926,930,935],{"type":45,"tag":737,"props":918,"children":919},{"style":880},[920],{"type":50,"value":22},{"type":45,"tag":737,"props":922,"children":923},{"style":885},[924],{"type":50,"value":925}," --test",{"type":45,"tag":737,"props":927,"children":928},{"style":885},[929],{"type":50,"value":893},{"type":45,"tag":737,"props":931,"children":932},{"style":885},[933],{"type":50,"value":934}," rule.yaml",{"type":45,"tag":737,"props":936,"children":937},{"style":885},[938],{"type":50,"value":939}," test-file\n",{"type":45,"tag":53,"props":941,"children":942},{},[943,948,950,956],{"type":45,"tag":69,"props":944,"children":945},{},[946],{"type":50,"value":947},"Checkpoint",{"type":50,"value":949},": Output MUST show ",{"type":45,"tag":119,"props":951,"children":953},{"className":952},[],[954],{"type":50,"value":955},"All tests passed",{"type":50,"value":957},".",{"type":45,"tag":53,"props":959,"children":960},{},[961],{"type":50,"value":962},"For taint rule debugging:",{"type":45,"tag":189,"props":964,"children":966},{"className":859,"code":965,"language":861,"meta":197,"style":197},"semgrep --dataflow-traces -f rule.yaml test-file\n",[967],{"type":45,"tag":119,"props":968,"children":969},{"__ignoreMap":197},[970],{"type":45,"tag":737,"props":971,"children":972},{"class":739,"line":740},[973,977,982,987,991],{"type":45,"tag":737,"props":974,"children":975},{"style":880},[976],{"type":50,"value":22},{"type":45,"tag":737,"props":978,"children":979},{"style":885},[980],{"type":50,"value":981}," --dataflow-traces",{"type":45,"tag":737,"props":983,"children":984},{"style":885},[985],{"type":50,"value":986}," -f",{"type":45,"tag":737,"props":988,"children":989},{"style":885},[990],{"type":50,"value":934},{"type":45,"tag":737,"props":992,"children":993},{"style":885},[994],{"type":50,"value":939},{"type":45,"tag":53,"props":996,"children":997},{},[998,999,1005],{"type":50,"value":665},{"type":45,"tag":667,"props":1000,"children":1002},{"href":1001},"%7BbaseDir%7D\u002Freferences\u002Fworkflow.md",[1003],{"type":50,"value":1004},"workflow.md",{"type":50,"value":1006}," for detailed workflow and troubleshooting.",{"type":45,"tag":59,"props":1008,"children":1010},{"id":1009},"quick-reference",[1011],{"type":50,"value":1012},"Quick Reference",{"type":45,"tag":234,"props":1014,"children":1015},{},[1016,1032],{"type":45,"tag":238,"props":1017,"children":1018},{},[1019],{"type":45,"tag":242,"props":1020,"children":1021},{},[1022,1027],{"type":45,"tag":246,"props":1023,"children":1024},{},[1025],{"type":50,"value":1026},"Task",{"type":45,"tag":246,"props":1028,"children":1029},{},[1030],{"type":50,"value":1031},"Command",{"type":45,"tag":262,"props":1033,"children":1034},{},[1035,1052,1069,1086],{"type":45,"tag":242,"props":1036,"children":1037},{},[1038,1043],{"type":45,"tag":269,"props":1039,"children":1040},{},[1041],{"type":50,"value":1042},"Run tests",{"type":45,"tag":269,"props":1044,"children":1045},{},[1046],{"type":45,"tag":119,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":50,"value":1051},"semgrep --test --config rule.yaml test-file",{"type":45,"tag":242,"props":1053,"children":1054},{},[1055,1060],{"type":45,"tag":269,"props":1056,"children":1057},{},[1058],{"type":50,"value":1059},"Validate YAML",{"type":45,"tag":269,"props":1061,"children":1062},{},[1063],{"type":45,"tag":119,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":50,"value":1068},"semgrep --validate --config rule.yaml",{"type":45,"tag":242,"props":1070,"children":1071},{},[1072,1077],{"type":45,"tag":269,"props":1073,"children":1074},{},[1075],{"type":50,"value":1076},"Dump AST",{"type":45,"tag":269,"props":1078,"children":1079},{},[1080],{"type":45,"tag":119,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":50,"value":1085},"semgrep --dump-ast -l \u003Clang> \u003Cfile>",{"type":45,"tag":242,"props":1087,"children":1088},{},[1089,1094],{"type":45,"tag":269,"props":1090,"children":1091},{},[1092],{"type":50,"value":1093},"Debug taint flow",{"type":45,"tag":269,"props":1095,"children":1096},{},[1097],{"type":45,"tag":119,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":50,"value":1102},"semgrep --dataflow-traces -f rule.yaml file",{"type":45,"tag":59,"props":1104,"children":1106},{"id":1105},"key-differences-from-rule-creation",[1107],{"type":50,"value":1108},"Key Differences from Rule Creation",{"type":45,"tag":234,"props":1110,"children":1111},{},[1112,1132],{"type":45,"tag":238,"props":1113,"children":1114},{},[1115],{"type":45,"tag":242,"props":1116,"children":1117},{},[1118,1123,1127],{"type":45,"tag":246,"props":1119,"children":1120},{},[1121],{"type":50,"value":1122},"Aspect",{"type":45,"tag":246,"props":1124,"children":1125},{},[1126],{"type":50,"value":124},{"type":45,"tag":246,"props":1128,"children":1129},{},[1130],{"type":50,"value":1131},"This skill",{"type":45,"tag":262,"props":1133,"children":1134},{},[1135,1153,1171,1189,1207],{"type":45,"tag":242,"props":1136,"children":1137},{},[1138,1143,1148],{"type":45,"tag":269,"props":1139,"children":1140},{},[1141],{"type":50,"value":1142},"Input",{"type":45,"tag":269,"props":1144,"children":1145},{},[1146],{"type":50,"value":1147},"Bug pattern description",{"type":45,"tag":269,"props":1149,"children":1150},{},[1151],{"type":50,"value":1152},"Existing rule + target languages",{"type":45,"tag":242,"props":1154,"children":1155},{},[1156,1161,1166],{"type":45,"tag":269,"props":1157,"children":1158},{},[1159],{"type":50,"value":1160},"Output",{"type":45,"tag":269,"props":1162,"children":1163},{},[1164],{"type":50,"value":1165},"Single rule+test",{"type":45,"tag":269,"props":1167,"children":1168},{},[1169],{"type":50,"value":1170},"Multiple rule+test directories",{"type":45,"tag":242,"props":1172,"children":1173},{},[1174,1179,1184],{"type":45,"tag":269,"props":1175,"children":1176},{},[1177],{"type":50,"value":1178},"Workflow",{"type":45,"tag":269,"props":1180,"children":1181},{},[1182],{"type":50,"value":1183},"Single creation cycle",{"type":45,"tag":269,"props":1185,"children":1186},{},[1187],{"type":50,"value":1188},"Independent cycle per language",{"type":45,"tag":242,"props":1190,"children":1191},{},[1192,1197,1202],{"type":45,"tag":269,"props":1193,"children":1194},{},[1195],{"type":50,"value":1196},"Phase 1",{"type":45,"tag":269,"props":1198,"children":1199},{},[1200],{"type":50,"value":1201},"Problem analysis",{"type":45,"tag":269,"props":1203,"children":1204},{},[1205],{"type":50,"value":1206},"Applicability analysis per language",{"type":45,"tag":242,"props":1208,"children":1209},{},[1210,1215,1220],{"type":45,"tag":269,"props":1211,"children":1212},{},[1213],{"type":50,"value":1214},"Library research",{"type":45,"tag":269,"props":1216,"children":1217},{},[1218],{"type":50,"value":1219},"Always relevant",{"type":45,"tag":269,"props":1221,"children":1222},{},[1223],{"type":50,"value":1224},"Optional (when original uses libraries)",{"type":45,"tag":59,"props":1226,"children":1228},{"id":1227},"documentation",[1229],{"type":50,"value":1230},"Documentation",{"type":45,"tag":53,"props":1232,"children":1233},{},[1234,1239],{"type":45,"tag":69,"props":1235,"children":1236},{},[1237],{"type":50,"value":1238},"REQUIRED",{"type":50,"value":1240},": Before porting rules, read relevant Semgrep documentation:",{"type":45,"tag":75,"props":1242,"children":1243},{},[1244,1257,1269,1281,1293],{"type":45,"tag":79,"props":1245,"children":1246},{},[1247,1255],{"type":45,"tag":667,"props":1248,"children":1252},{"href":1249,"rel":1250},"https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Frule-syntax",[1251],"nofollow",[1253],{"type":50,"value":1254},"Rule Syntax",{"type":50,"value":1256}," - YAML structure and operators",{"type":45,"tag":79,"props":1258,"children":1259},{},[1260,1267],{"type":45,"tag":667,"props":1261,"children":1264},{"href":1262,"rel":1263},"https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Fpattern-syntax",[1251],[1265],{"type":50,"value":1266},"Pattern Syntax",{"type":50,"value":1268}," - Pattern matching and metavariables",{"type":45,"tag":79,"props":1270,"children":1271},{},[1272,1279],{"type":45,"tag":667,"props":1273,"children":1276},{"href":1274,"rel":1275},"https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Fpattern-examples",[1251],[1277],{"type":50,"value":1278},"Pattern Examples",{"type":50,"value":1280}," - Per-language pattern references",{"type":45,"tag":79,"props":1282,"children":1283},{},[1284,1291],{"type":45,"tag":667,"props":1285,"children":1288},{"href":1286,"rel":1287},"https:\u002F\u002Fsemgrep.dev\u002Fdocs\u002Fwriting-rules\u002Ftesting-rules",[1251],[1289],{"type":50,"value":1290},"Testing Rules",{"type":50,"value":1292}," - Testing annotations",{"type":45,"tag":79,"props":1294,"children":1295},{},[1296,1303],{"type":45,"tag":667,"props":1297,"children":1300},{"href":1298,"rel":1299},"https:\u002F\u002Fappsec.guide\u002Fdocs\u002Fstatic-analysis\u002Fsemgrep\u002Fadvanced\u002F",[1251],[1301],{"type":50,"value":1302},"Trail of Bits Testing Handbook",{"type":50,"value":1304}," - Advanced patterns",{"type":45,"tag":59,"props":1306,"children":1308},{"id":1307},"next-steps",[1309],{"type":50,"value":1310},"Next Steps",{"type":45,"tag":75,"props":1312,"children":1313},{},[1314,1323,1332],{"type":45,"tag":79,"props":1315,"children":1316},{},[1317,1319],{"type":50,"value":1318},"For applicability analysis guidance, see ",{"type":45,"tag":667,"props":1320,"children":1321},{"href":669},[1322],{"type":50,"value":672},{"type":45,"tag":79,"props":1324,"children":1325},{},[1326,1328],{"type":50,"value":1327},"For language translation guidance, see ",{"type":45,"tag":667,"props":1329,"children":1330},{"href":845},[1331],{"type":50,"value":848},{"type":45,"tag":79,"props":1333,"children":1334},{},[1335,1337],{"type":50,"value":1336},"For detailed workflow and examples, see ",{"type":45,"tag":667,"props":1338,"children":1339},{"href":1001},[1340],{"type":50,"value":1004},{"type":45,"tag":1342,"props":1343,"children":1344},"style",{},[1345],{"type":50,"value":1346},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1348,"total":1444},[1349,1366,1376,1394,1409,1422,1434],{"slug":1350,"name":1350,"fn":1351,"description":1352,"org":1353,"tags":1354,"stars":26,"repoUrl":27,"updatedAt":1365},"address-sanitizer","detect memory errors during fuzzing","AddressSanitizer detects memory errors during fuzzing. Use when fuzzing C\u002FC++ code to find buffer overflows and use-after-free bugs.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1355,1358,1361,1362],{"name":1356,"slug":1357,"type":16},"C#","c",{"name":1359,"slug":1360,"type":16},"Debugging","debugging",{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},"Testing","testing","2026-07-17T06:05:14.925095",{"slug":1367,"name":1367,"fn":1368,"description":1369,"org":1370,"tags":1371,"stars":26,"repoUrl":27,"updatedAt":1375},"aflpp","perform multi-core fuzzing of C\u002FC++ projects","AFL++ is a fork of AFL with better fuzzing performance and advanced features. Use for multi-core fuzzing of C\u002FC++ projects.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1372,1373,1374],{"name":1356,"slug":1357,"type":16},{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},"2026-07-17T06:05:12.433192",{"slug":1377,"name":1377,"fn":1378,"description":1379,"org":1380,"tags":1381,"stars":26,"repoUrl":27,"updatedAt":1393},"agentic-actions-auditor","audit GitHub Actions for security vulnerabilities","Audits GitHub Actions workflows for security vulnerabilities in AI agent integrations including Claude Code Action, Gemini CLI, OpenAI Codex, and GitHub AI Inference. Detects attack vectors where attacker-controlled input reaches AI agents running in CI\u002FCD pipelines, including env var intermediary patterns, direct expression injection, dangerous sandbox configurations, and wildcard user allowlists. Use when reviewing workflow files that invoke AI coding agents, auditing CI\u002FCD pipeline security for prompt injection risks, or evaluating agentic action configurations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1382,1385,1388,1389,1392],{"name":1383,"slug":1384,"type":16},"Agents","agents",{"name":1386,"slug":1387,"type":16},"CI\u002FCD","ci-cd",{"name":24,"slug":25,"type":16},{"name":1390,"slug":1391,"type":16},"GitHub Actions","github-actions",{"name":14,"slug":15,"type":16},"2026-07-18T05:47:48.564744",{"slug":1395,"name":1395,"fn":1396,"description":1397,"org":1398,"tags":1399,"stars":26,"repoUrl":27,"updatedAt":1408},"algorand-vulnerability-scanner","scan Algorand smart contracts for vulnerabilities","Scans Algorand smart contracts for 11 common vulnerabilities including rekeying attacks, unchecked transaction fees, missing field validations, and access control issues. Use when auditing Algorand projects (TEAL\u002FPyTeal).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1400,1403,1404,1405],{"name":1401,"slug":1402,"type":16},"Audit","audit",{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":1406,"slug":1407,"type":16},"Smart Contracts","smart-contracts","2026-07-18T05:47:43.989063",{"slug":1410,"name":1410,"fn":1411,"description":1412,"org":1413,"tags":1414,"stars":26,"repoUrl":27,"updatedAt":1421},"ask-questions-if-underspecified","clarify requirements before implementation","Clarify requirements before implementing. Use when serious doubts arise.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1415,1418],{"name":1416,"slug":1417,"type":16},"Engineering","engineering",{"name":1419,"slug":1420,"type":16},"Productivity","productivity","2026-07-17T06:05:33.543262",{"slug":1423,"name":1423,"fn":1424,"description":1425,"org":1426,"tags":1427,"stars":26,"repoUrl":27,"updatedAt":1433},"atheris","fuzz Python code with Atheris","Atheris is a coverage-guided Python fuzzer based on libFuzzer. Use for fuzzing pure Python code and Python C extensions.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1428,1431,1432],{"name":1429,"slug":1430,"type":16},"Python","python",{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},"2026-07-17T06:05:14.575191",{"slug":1435,"name":1435,"fn":1436,"description":1437,"org":1438,"tags":1439,"stars":26,"repoUrl":27,"updatedAt":1443},"audit-augmentation","augment code graphs with audit findings","Augments Trailmark code graphs with external audit findings from SARIF static analysis results, weAudit annotation files, and version-gated Trailmark 0.4.x binary-analysis graph exports. Maps findings to graph nodes by file and line overlap, creates severity-based subgraphs, and enables cross-referencing findings with pre-analysis data (blast radius, taint, etc.). Use when projecting SARIF results onto a code graph, overlaying weAudit annotations, importing binary graph findings, cross-referencing Semgrep, CodeQL, or binary-analysis findings with call graph data, or visualizing audit findings in the context of code structure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1440,1441,1442],{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},"2026-08-01T05:44:54.920542",77,{"items":1446,"total":1550},[1447,1454,1460,1468,1475,1480,1486,1492,1505,1516,1528,1539],{"slug":1350,"name":1350,"fn":1351,"description":1352,"org":1448,"tags":1449,"stars":26,"repoUrl":27,"updatedAt":1365},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1450,1451,1452,1453],{"name":1356,"slug":1357,"type":16},{"name":1359,"slug":1360,"type":16},{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},{"slug":1367,"name":1367,"fn":1368,"description":1369,"org":1455,"tags":1456,"stars":26,"repoUrl":27,"updatedAt":1375},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1457,1458,1459],{"name":1356,"slug":1357,"type":16},{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},{"slug":1377,"name":1377,"fn":1378,"description":1379,"org":1461,"tags":1462,"stars":26,"repoUrl":27,"updatedAt":1393},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1463,1464,1465,1466,1467],{"name":1383,"slug":1384,"type":16},{"name":1386,"slug":1387,"type":16},{"name":24,"slug":25,"type":16},{"name":1390,"slug":1391,"type":16},{"name":14,"slug":15,"type":16},{"slug":1395,"name":1395,"fn":1396,"description":1397,"org":1469,"tags":1470,"stars":26,"repoUrl":27,"updatedAt":1408},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1471,1472,1473,1474],{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":1406,"slug":1407,"type":16},{"slug":1410,"name":1410,"fn":1411,"description":1412,"org":1476,"tags":1477,"stars":26,"repoUrl":27,"updatedAt":1421},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1478,1479],{"name":1416,"slug":1417,"type":16},{"name":1419,"slug":1420,"type":16},{"slug":1423,"name":1423,"fn":1424,"description":1425,"org":1481,"tags":1482,"stars":26,"repoUrl":27,"updatedAt":1433},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1483,1484,1485],{"name":1429,"slug":1430,"type":16},{"name":14,"slug":15,"type":16},{"name":1363,"slug":1364,"type":16},{"slug":1435,"name":1435,"fn":1436,"description":1437,"org":1487,"tags":1488,"stars":26,"repoUrl":27,"updatedAt":1443},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1489,1490,1491],{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"slug":1493,"name":1493,"fn":1494,"description":1495,"org":1496,"tags":1497,"stars":26,"repoUrl":27,"updatedAt":1504},"audit-context-building","build architectural context for code analysis","Enables ultra-granular, line-by-line code analysis to build deep architectural context before vulnerability or bug finding.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1498,1501,1502,1503],{"name":1499,"slug":1500,"type":16},"Architecture","architecture",{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":1416,"slug":1417,"type":16},"2026-07-18T05:47:40.122449",{"slug":1506,"name":1506,"fn":1507,"description":1508,"org":1509,"tags":1510,"stars":26,"repoUrl":27,"updatedAt":1515},"audit-prep-assistant","prepare codebases for security audits","Prepares codebases for security review using Trail of Bits' checklist. Helps set review goals, runs static analysis tools, increases test coverage, removes dead code, ensures accessibility, and generates documentation (flowcharts, user stories, inline comments).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1511,1512,1513,1514],{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":1416,"slug":1417,"type":16},{"name":14,"slug":15,"type":16},"2026-07-18T05:47:39.210985",{"slug":1517,"name":1517,"fn":1518,"description":1519,"org":1520,"tags":1521,"stars":26,"repoUrl":27,"updatedAt":1527},"burpsuite-project-parser","parse Burp Suite project files","Searches and explores Burp Suite project files (.burp) from the command line. Use when searching response headers or bodies with regex patterns, extracting security audit findings, dumping proxy history or site map data, or analyzing HTTP traffic captured in a Burp project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1522,1523,1526],{"name":1401,"slug":1402,"type":16},{"name":1524,"slug":1525,"type":16},"CLI","cli",{"name":14,"slug":15,"type":16},"2026-07-17T06:05:33.198077",{"slug":1529,"name":1529,"fn":1530,"description":1531,"org":1532,"tags":1533,"stars":26,"repoUrl":27,"updatedAt":1538},"c-review","audit C and C++ code","Performs comprehensive C\u002FC++ security review for memory corruption, integer overflows, race conditions, and platform-specific vulnerabilities. Use when auditing native C\u002FC++ applications, reviewing daemons or services for memory safety, or hunting integer overflow \u002F use-after-free \u002F race conditions in userspace code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1534,1535,1536,1537],{"name":1401,"slug":1402,"type":16},{"name":1356,"slug":1357,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},"2026-07-17T06:05:11.333374",{"slug":1540,"name":1540,"fn":1541,"description":1542,"org":1543,"tags":1544,"stars":26,"repoUrl":27,"updatedAt":1549},"cairo-vulnerability-scanner","scan Cairo and StarkNet contracts for vulnerabilities","Scans Cairo\u002FStarkNet smart contracts for 6 critical vulnerabilities including felt252 arithmetic overflow, L1-L2 messaging issues, address conversion problems, and signature replay. Use when auditing StarkNet projects.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1545,1546,1547,1548],{"name":1401,"slug":1402,"type":16},{"name":24,"slug":25,"type":16},{"name":14,"slug":15,"type":16},{"name":1406,"slug":1407,"type":16},"2026-07-18T05:47:42.84568",111]