@elizaos/skills 2.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -0
- package/package.json +53 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +96 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/bird/SKILL.md +224 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +203 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +284 -0
- package/skills/discord/SKILL.md +578 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/food-order/SKILL.md +48 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +77 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +74 -0
- package/skills/local-places/SERVER_README.md +101 -0
- package/skills/local-places/SKILL.md +102 -0
- package/skills/local-places/pyproject.toml +21 -0
- package/skills/local-places/src/local_places/__init__.py +2 -0
- package/skills/local-places/src/local_places/google_places.py +314 -0
- package/skills/local-places/src/local_places/main.py +65 -0
- package/skills/local-places/src/local_places/schemas.py +107 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +310 -0
- package/skills/nano-banana-pro/SKILL.md +58 -0
- package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/notion/SKILL.md +172 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +89 -0
- package/skills/openai-image-gen/scripts/gen.py +240 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +51 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
- package/skills/security-ask-questions-if-underspecified/README.md +24 -0
- package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
- package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
- package/skills/security-audit-context-building/README.md +58 -0
- package/skills/security-audit-context-building/commands/audit-context.md +21 -0
- package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
- package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
- package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
- package/skills/security-building-secure-contracts/README.md +241 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
- package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
- package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
- package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
- package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
- package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
- package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
- package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
- package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
- package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
- package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
- package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
- package/skills/security-burpsuite-project-parser/.claude-plugin/plugin.json +10 -0
- package/skills/security-burpsuite-project-parser/README.md +103 -0
- package/skills/security-burpsuite-project-parser/commands/burp-search.md +18 -0
- package/skills/security-burpsuite-project-parser/skills/SKILL.md +358 -0
- package/skills/security-burpsuite-project-parser/skills/scripts/burp-search.sh +99 -0
- package/skills/security-claude-in-chrome-troubleshooting/.claude-plugin/plugin.json +8 -0
- package/skills/security-claude-in-chrome-troubleshooting/README.md +31 -0
- package/skills/security-claude-in-chrome-troubleshooting/skills/claude-in-chrome-troubleshooting/SKILL.md +251 -0
- package/skills/security-constant-time-analysis/.claude-plugin/plugin.json +9 -0
- package/skills/security-constant-time-analysis/README.md +381 -0
- package/skills/security-constant-time-analysis/commands/ct-check.md +20 -0
- package/skills/security-constant-time-analysis/ct_analyzer/__init__.py +49 -0
- package/skills/security-constant-time-analysis/ct_analyzer/analyzer.py +1284 -0
- package/skills/security-constant-time-analysis/ct_analyzer/script_analyzers.py +3081 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/__init__.py +1 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_analyzer.py +1397 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/bn_excerpt.js +205 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_constant_time.c +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.c +74 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.go +78 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/decompose_vulnerable.rs +92 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.cs +174 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.java +161 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.kt +181 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.php +140 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.py +252 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.rb +188 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.swift +199 -0
- package/skills/security-constant-time-analysis/ct_analyzer/tests/test_samples/vulnerable.ts +154 -0
- package/skills/security-constant-time-analysis/pyproject.toml +52 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/README.md +90 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/SKILL.md +219 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/compiled.md +129 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/javascript.md +136 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/kotlin.md +252 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/php.md +172 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/python.md +179 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/ruby.md +198 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/swift.md +288 -0
- package/skills/security-constant-time-analysis/skills/constant-time-analysis/references/vm-compiled.md +354 -0
- package/skills/security-constant-time-analysis/uv.lock +8 -0
- package/skills/security-culture-index/.claude-plugin/plugin.json +8 -0
- package/skills/security-culture-index/README.md +79 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/SKILL.md +293 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/anti-patterns.md +255 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/conversation-starters.md +408 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/interview-trait-signals.md +253 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/motivators.md +158 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/patterns-archetypes.md +147 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/primary-traits.md +307 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/secondary-traits.md +228 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/references/team-composition.md +148 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/check_deps.py +108 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/__init__.py +20 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/constants.py +122 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/extract.py +187 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/models.py +16 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/culture_index/opencv_extractor.py +520 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/extract_pdf.py +237 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/scripts/pyproject.toml +18 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/burnout-report.md +113 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/comparison-report.md +103 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/hiring-profile.md +127 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/individual-report.md +85 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/predicted-profile.md +165 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/templates/team-report.md +109 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/analyze-team.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/coach-manager.md +267 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/compare-profiles.md +188 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/define-hiring-profile.md +220 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/detect-burnout.md +206 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/extract-from-pdf.md +121 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interpret-individual.md +183 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/interview-debrief.md +234 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/mediate-conflict.md +306 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/plan-onboarding.md +322 -0
- package/skills/security-culture-index/skills/interpreting-culture-index/workflows/predict-from-interview.md +250 -0
- package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
- package/skills/security-differential-review/README.md +109 -0
- package/skills/security-differential-review/commands/diff-review.md +21 -0
- package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
- package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
- package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
- package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
- package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
- package/skills/security-dwarf-expert/.claude-plugin/plugin.json +10 -0
- package/skills/security-dwarf-expert/README.md +38 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/SKILL.md +93 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/coding.md +31 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/dwarfdump.md +50 -0
- package/skills/security-dwarf-expert/skills/dwarf-expert/reference/readelf.md +8 -0
- package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
- package/skills/security-entry-point-analyzer/README.md +74 -0
- package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
- package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
- package/skills/security-firebase-apk-scanner/.claude-plugin/plugin.json +10 -0
- package/skills/security-firebase-apk-scanner/README.md +85 -0
- package/skills/security-firebase-apk-scanner/commands/scan-apk.md +18 -0
- package/skills/security-firebase-apk-scanner/scanner.sh +1408 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/SKILL.md +197 -0
- package/skills/security-firebase-apk-scanner/skills/firebase-apk-scanner/references/vulnerabilities.md +803 -0
- package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
- package/skills/security-fix-review/README.md +118 -0
- package/skills/security-fix-review/commands/fix-review.md +24 -0
- package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
- package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
- package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
- package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
- package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
- package/skills/security-insecure-defaults/README.md +45 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
- package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
- package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
- package/skills/security-modern-python/README.md +58 -0
- package/skills/security-modern-python/hooks/hooks.json +16 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
- package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
- package/skills/security-modern-python/hooks/test_helper.bash +75 -0
- package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
- package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
- package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
- package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
- package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
- package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
- package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
- package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
- package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
- package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
- package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
- package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
- package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
- package/skills/security-property-based-testing/README.md +47 -0
- package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
- package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
- package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
- package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
- package/skills/semgrep-rule-creator/README.md +43 -0
- package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
- package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
- package/skills/semgrep-rule-variant-creator/.claude-plugin/plugin.json +9 -0
- package/skills/semgrep-rule-variant-creator/README.md +86 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/SKILL.md +205 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/applicability-analysis.md +250 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/language-syntax-guide.md +324 -0
- package/skills/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator/references/workflow.md +518 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
- package/skills/sharp-edges/README.md +48 -0
- package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
- package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
- package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
- package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
- package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
- package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +370 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +111 -0
- package/skills/skill-creator/scripts/quick_validate.py +101 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +46 -0
- package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
- package/skills/spec-to-code-compliance/README.md +67 -0
- package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
- package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/static-analysis/README.md +59 -0
- package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
- package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
- package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
- package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
- package/skills/testing-handbook-skills/README.md +241 -0
- package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
- package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
- package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
- package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
- package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
- package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
- package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
- package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
- package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
- package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
- package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
- package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
- package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
- package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
- package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
- package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
- package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
- package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +135 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
- package/skills/variant-analysis/README.md +41 -0
- package/skills/variant-analysis/commands/variants.md +23 -0
- package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
- package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
- package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +54 -0
- package/skills/yara-authoring/.claude-plugin/plugin.json +9 -0
- package/skills/yara-authoring/README.md +131 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/SKILL.md +645 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Mac_ProtonRAT_Jan25.yar +99 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_NPM_SupplyChain_Jan25.yar +170 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/MAL_Win_Remcos_Jan25.yar +103 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_CRX_SuspiciousPermissions.yar +134 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/examples/SUSP_JS_Obfuscation_Jan25.yar +185 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/crx-module.md +214 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/dex-module.md +383 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/performance.md +333 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/strings.md +433 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/style-guide.md +257 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/references/testing.md +399 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/atom_analyzer.py +526 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/pyproject.toml +25 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/scripts/yara_lint.py +631 -0
- package/skills/yara-authoring/skills/yara-rule-authoring/workflows/rule-development.md +493 -0
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
# Detailed Variant Creation Workflow
|
|
2
|
+
|
|
3
|
+
Complete step-by-step workflow for porting Semgrep rules to new languages.
|
|
4
|
+
|
|
5
|
+
## Core Principle: Independent Cycles
|
|
6
|
+
|
|
7
|
+
Each target language goes through the complete 4-phase cycle independently:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
FOR EACH target language:
|
|
11
|
+
┌─────────────────────────────────────────────────────────┐
|
|
12
|
+
│ Phase 1: Applicability Analysis │
|
|
13
|
+
│ └─→ APPLICABLE? Continue │
|
|
14
|
+
│ └─→ NOT_APPLICABLE? Skip to next language │
|
|
15
|
+
│ │
|
|
16
|
+
│ Phase 2: Test Creation (Test-First) │
|
|
17
|
+
│ └─→ Create test file with ruleid/ok annotations │
|
|
18
|
+
│ │
|
|
19
|
+
│ Phase 3: Rule Creation │
|
|
20
|
+
│ └─→ Analyze AST, write rule, update metadata │
|
|
21
|
+
│ │
|
|
22
|
+
│ Phase 4: Validation │
|
|
23
|
+
│ └─→ Tests pass? Complete, proceed to next language │
|
|
24
|
+
│ └─→ Tests fail? Iterate phases 2-4 │
|
|
25
|
+
└─────────────────────────────────────────────────────────┘
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Do NOT batch**: Complete all phases for one language before starting the next.
|
|
29
|
+
|
|
30
|
+
## Phase 1: Applicability Analysis
|
|
31
|
+
|
|
32
|
+
### Step 1.1: Parse the Original Rule
|
|
33
|
+
|
|
34
|
+
Extract key components:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
# Example original rule
|
|
38
|
+
rules:
|
|
39
|
+
- id: python-sql-injection
|
|
40
|
+
mode: taint
|
|
41
|
+
languages: [python]
|
|
42
|
+
severity: ERROR
|
|
43
|
+
message: SQL injection vulnerability
|
|
44
|
+
pattern-sources:
|
|
45
|
+
- pattern: request.args.get(...)
|
|
46
|
+
pattern-sinks:
|
|
47
|
+
- pattern: cursor.execute($QUERY, ...)
|
|
48
|
+
pattern-sanitizers:
|
|
49
|
+
- pattern: sanitize(...)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Document:
|
|
53
|
+
- **Rule ID**: python-sql-injection
|
|
54
|
+
- **Mode**: taint (optional, if taint mode used via `mode: taint`)
|
|
55
|
+
- **Sources**: request.args.get(...) (via `pattern-sources` - if taint analysis mode used)
|
|
56
|
+
- **Sinks**: cursor.execute($QUERY, ...) (via `pattern-sinks` - if taint analysis mode used)
|
|
57
|
+
- **Sanitizers**: sanitize(...) (via `pattern-sanitizers` - optional, if taint analysis used)
|
|
58
|
+
|
|
59
|
+
### Step 1.2: Analyze for Target Language
|
|
60
|
+
|
|
61
|
+
For each target language, determine applicability.
|
|
62
|
+
|
|
63
|
+
See [applicability-analysis.md]({baseDir}/references/applicability-analysis.md) for detailed guidance.
|
|
64
|
+
|
|
65
|
+
### Step 1.3: Document Verdict
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
TARGET: golang
|
|
69
|
+
VERDICT: APPLICABLE
|
|
70
|
+
REASONING: SQL injection applies to Go. database/sql package provides
|
|
71
|
+
Query/Exec functions that can be vulnerable to injection when string
|
|
72
|
+
concatenation is used instead of parameterized queries.
|
|
73
|
+
EQUIVALENT_CONSTRUCTS:
|
|
74
|
+
- Source: request.args.get → r.URL.Query().Get(), r.FormValue()
|
|
75
|
+
- Sink: cursor.execute → db.Query(), db.Exec()
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
If `NOT_APPLICABLE`, document why and proceed to next target language.
|
|
79
|
+
|
|
80
|
+
## Phase 2: Test Creation
|
|
81
|
+
|
|
82
|
+
### Step 2.1: Create Directory Structure
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
mkdir <original-rule-id>-<language>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
```bash
|
|
90
|
+
mkdir python-sql-injection-golang
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Step 2.2: Write Test File
|
|
94
|
+
|
|
95
|
+
Create test file with target language extension:
|
|
96
|
+
|
|
97
|
+
```go
|
|
98
|
+
// python-sql-injection-golang.go
|
|
99
|
+
package main
|
|
100
|
+
|
|
101
|
+
import (
|
|
102
|
+
"database/sql"
|
|
103
|
+
"net/http"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
// Vulnerable cases - MUST be flagged
|
|
107
|
+
func vulnerable1(db *sql.DB, r *http.Request) {
|
|
108
|
+
userID := r.URL.Query().Get("id")
|
|
109
|
+
// ruleid: python-sql-injection-golang
|
|
110
|
+
db.Query("SELECT * FROM users WHERE id = " + userID)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
func vulnerable2(db *sql.DB, r *http.Request) {
|
|
114
|
+
name := r.FormValue("name")
|
|
115
|
+
// ruleid: python-sql-injection-golang
|
|
116
|
+
db.Exec("DELETE FROM users WHERE name = '" + name + "'")
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Safe cases - must NOT be flagged
|
|
120
|
+
func safeParameterized(db *sql.DB, r *http.Request) {
|
|
121
|
+
userID := r.URL.Query().Get("id")
|
|
122
|
+
// ok: python-sql-injection-golang
|
|
123
|
+
db.Query("SELECT * FROM users WHERE id = ?", userID)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
func safeHardcoded(db *sql.DB) {
|
|
127
|
+
// ok: python-sql-injection-golang
|
|
128
|
+
db.Query("SELECT * FROM users WHERE id = 1")
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Step 2.3: Test Case Requirements
|
|
133
|
+
|
|
134
|
+
**Minimum cases:**
|
|
135
|
+
- 2+ vulnerable cases (`ruleid:`)
|
|
136
|
+
- 2+ safe cases (`ok:`)
|
|
137
|
+
|
|
138
|
+
**Include variations:**
|
|
139
|
+
- Different sink functions (Query, Exec, QueryRow)
|
|
140
|
+
- Different source patterns (URL params, form values)
|
|
141
|
+
- Different string construction (concatenation, fmt.Sprintf)
|
|
142
|
+
- Safe patterns (parameterized queries, hardcoded values)
|
|
143
|
+
|
|
144
|
+
### Step 2.4: Annotation Placement
|
|
145
|
+
|
|
146
|
+
**CRITICAL**: The annotation comment must be on the line IMMEDIATELY BEFORE the code:
|
|
147
|
+
|
|
148
|
+
```go
|
|
149
|
+
// ruleid: my-rule
|
|
150
|
+
vulnerableCode() // This line gets flagged
|
|
151
|
+
|
|
152
|
+
// ok: my-rule
|
|
153
|
+
safeCode() // This line must NOT be flagged
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Phase 3: Rule Creation
|
|
157
|
+
|
|
158
|
+
### Step 3.1: Analyze AST
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
semgrep --dump-ast -l go python-sql-injection-golang.go
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Study the AST structure for:
|
|
165
|
+
- How function calls are represented
|
|
166
|
+
- How string concatenation appears
|
|
167
|
+
- How method calls are structured
|
|
168
|
+
|
|
169
|
+
### Step 3.2: Write the Rule
|
|
170
|
+
|
|
171
|
+
Create rule file with adapted patterns:
|
|
172
|
+
|
|
173
|
+
```yaml
|
|
174
|
+
# python-sql-injection-golang.yaml
|
|
175
|
+
rules:
|
|
176
|
+
- id: python-sql-injection-golang
|
|
177
|
+
mode: taint
|
|
178
|
+
languages: [go]
|
|
179
|
+
severity: ERROR
|
|
180
|
+
message: >-
|
|
181
|
+
SQL injection vulnerability. User input from $SOURCE flows to
|
|
182
|
+
database query without sanitization.
|
|
183
|
+
metadata:
|
|
184
|
+
original-rule: python-sql-injection
|
|
185
|
+
ported-from: python
|
|
186
|
+
pattern-sources:
|
|
187
|
+
- patterns:
|
|
188
|
+
- pattern: $R.URL.Query().Get(...)
|
|
189
|
+
- patterns:
|
|
190
|
+
- pattern: $R.FormValue(...)
|
|
191
|
+
pattern-sinks:
|
|
192
|
+
- patterns:
|
|
193
|
+
- pattern: $DB.Query($QUERY, ...)
|
|
194
|
+
- focus-metavariable: $QUERY
|
|
195
|
+
- patterns:
|
|
196
|
+
- pattern: $DB.Exec($QUERY, ...)
|
|
197
|
+
- focus-metavariable: $QUERY
|
|
198
|
+
- patterns:
|
|
199
|
+
- pattern: $DB.QueryRow($QUERY, ...)
|
|
200
|
+
- focus-metavariable: $QUERY
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Step 3.3: Update Metadata
|
|
204
|
+
|
|
205
|
+
For each ported rule:
|
|
206
|
+
- **id**: Append `-<language>` to original ID
|
|
207
|
+
- **languages**: Change to target language
|
|
208
|
+
- **message**: Adapt if needed for language context
|
|
209
|
+
- **metadata**: Add `original-rule` and `ported-from` fields
|
|
210
|
+
|
|
211
|
+
### Step 3.4: Adapt Pattern Syntax
|
|
212
|
+
|
|
213
|
+
See [language-syntax-guide.md]({baseDir}/references/language-syntax-guide.md) for translation guidance.
|
|
214
|
+
|
|
215
|
+
## Phase 4: Validation
|
|
216
|
+
|
|
217
|
+
### Step 4.1: Validate YAML
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
semgrep --validate --config python-sql-injection-golang.yaml
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Fix any syntax errors before proceeding.
|
|
224
|
+
|
|
225
|
+
### Step 4.2: Run Tests
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
semgrep --test --config python-sql-injection-golang.yaml python-sql-injection-golang.go
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Step 4.3: Check Results
|
|
232
|
+
|
|
233
|
+
**Success:**
|
|
234
|
+
```
|
|
235
|
+
1/1: ✓ All tests passed
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Failure - missed lines:**
|
|
239
|
+
```
|
|
240
|
+
✗ python-sql-injection-golang
|
|
241
|
+
missed lines: [15, 22]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Rule didn't match when it should. Check:
|
|
245
|
+
- Pattern too specific
|
|
246
|
+
- Missing pattern variant
|
|
247
|
+
- AST structure mismatch
|
|
248
|
+
|
|
249
|
+
**Failure - incorrect lines:**
|
|
250
|
+
```
|
|
251
|
+
✗ python-sql-injection-golang
|
|
252
|
+
incorrect lines: [30, 35]
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Rule matched when it shouldn't. Check:
|
|
256
|
+
- Pattern too broad
|
|
257
|
+
- Need pattern-not exclusion
|
|
258
|
+
- Sanitizer pattern missing
|
|
259
|
+
|
|
260
|
+
### Step 4.4: Debug Taint Rules
|
|
261
|
+
|
|
262
|
+
If using taint mode and having issues:
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
semgrep --dataflow-traces -f python-sql-injection-golang.yaml python-sql-injection-golang.go
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Shows:
|
|
269
|
+
- Where taint originates
|
|
270
|
+
- How taint propagates
|
|
271
|
+
- Where taint reaches sinks
|
|
272
|
+
- Why taint might not flow (sanitizers, breaks in flow)
|
|
273
|
+
|
|
274
|
+
### Step 4.5: Iterate Until Pass
|
|
275
|
+
|
|
276
|
+
Repeat phases 2-4 as needed:
|
|
277
|
+
1. Add test cases to cover edge cases
|
|
278
|
+
2. Adjust patterns to match/exclude correctly
|
|
279
|
+
3. Re-run tests
|
|
280
|
+
4. Continue until "All tests passed"
|
|
281
|
+
|
|
282
|
+
## Phase 5: Proceed to Next Language
|
|
283
|
+
|
|
284
|
+
Only after all tests pass for one language:
|
|
285
|
+
1. Document completion
|
|
286
|
+
2. Move to next target language
|
|
287
|
+
3. Start fresh at Phase 1
|
|
288
|
+
|
|
289
|
+
## Output Structure
|
|
290
|
+
|
|
291
|
+
After completing all target languages:
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
python-sql-injection-golang/
|
|
295
|
+
├── python-sql-injection-golang.yaml
|
|
296
|
+
└── python-sql-injection-golang.go
|
|
297
|
+
|
|
298
|
+
python-sql-injection-java/
|
|
299
|
+
├── python-sql-injection-java.yaml
|
|
300
|
+
└── python-sql-injection-java.java
|
|
301
|
+
|
|
302
|
+
# If a language was NOT_APPLICABLE, no directory is created
|
|
303
|
+
# Document the reason in your response
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Troubleshooting
|
|
307
|
+
|
|
308
|
+
### Pattern Not Matching
|
|
309
|
+
|
|
310
|
+
1. **Dump AST**: `semgrep --dump-ast -l <lang> file`
|
|
311
|
+
2. **Compare structure**: Your pattern vs actual AST
|
|
312
|
+
3. **Check metavariables**: Correct binding?
|
|
313
|
+
4. **Try broader pattern**: Then narrow down
|
|
314
|
+
|
|
315
|
+
### Taint Not Propagating
|
|
316
|
+
|
|
317
|
+
1. **Use --dataflow-traces**: See where taint stops
|
|
318
|
+
2. **Check sanitizers**: Too broad?
|
|
319
|
+
3. **Verify sources**: Pattern actually matching?
|
|
320
|
+
4. **Check focus-metavariable**: On correct part of sink?
|
|
321
|
+
|
|
322
|
+
### Too Many False Positives
|
|
323
|
+
|
|
324
|
+
1. **Add pattern-not**: Exclude safe patterns
|
|
325
|
+
2. **Add sanitizers**: Validation functions
|
|
326
|
+
3. **Use pattern-inside**: Limit scope
|
|
327
|
+
4. **Check safe test cases**: Are they actually safe?
|
|
328
|
+
|
|
329
|
+
### YAML Syntax Errors
|
|
330
|
+
|
|
331
|
+
1. **Run --validate**: Get specific error
|
|
332
|
+
2. **Check indentation**: YAML is whitespace-sensitive
|
|
333
|
+
3. **Quote strings**: If they contain special characters
|
|
334
|
+
4. **Use multiline**: For complex patterns (`|` or `>-`)
|
|
335
|
+
|
|
336
|
+
## Example: Complete Workflow
|
|
337
|
+
|
|
338
|
+
### Original Rule
|
|
339
|
+
|
|
340
|
+
```yaml
|
|
341
|
+
# python-command-injection.yaml
|
|
342
|
+
rules:
|
|
343
|
+
- id: python-command-injection
|
|
344
|
+
mode: taint
|
|
345
|
+
languages: [python]
|
|
346
|
+
severity: ERROR
|
|
347
|
+
message: Command injection vulnerability
|
|
348
|
+
pattern-sources:
|
|
349
|
+
- pattern: request.args.get(...)
|
|
350
|
+
pattern-sinks:
|
|
351
|
+
- pattern: os.system(...)
|
|
352
|
+
- pattern: subprocess.call($CMD, shell=True, ...)
|
|
353
|
+
pattern-sanitizers:
|
|
354
|
+
- pattern: shlex.quote(...)
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Target Languages: Go and Java
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
### Go Variant
|
|
362
|
+
|
|
363
|
+
**Phase 1: Applicability**
|
|
364
|
+
```
|
|
365
|
+
TARGET: Go
|
|
366
|
+
VERDICT: APPLICABLE
|
|
367
|
+
REASONING: Command injection applies. Go's os/exec package can execute
|
|
368
|
+
commands. When user input is passed to exec.Command or wrapped in shell
|
|
369
|
+
execution, it's vulnerable.
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**Phase 2: Test File** (`python-command-injection-golang.go`)
|
|
373
|
+
```go
|
|
374
|
+
package main
|
|
375
|
+
|
|
376
|
+
import (
|
|
377
|
+
"net/http"
|
|
378
|
+
"os/exec"
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
func vulnerable1(r *http.Request) {
|
|
382
|
+
cmd := r.URL.Query().Get("cmd")
|
|
383
|
+
// ruleid: python-command-injection-golang
|
|
384
|
+
exec.Command("bash", "-c", cmd).Run()
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
func vulnerable2(r *http.Request) {
|
|
388
|
+
input := r.FormValue("input")
|
|
389
|
+
// ruleid: python-command-injection-golang
|
|
390
|
+
exec.Command("sh", "-c", input).Run()
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
func safeNoShell(r *http.Request) {
|
|
394
|
+
arg := r.URL.Query().Get("arg")
|
|
395
|
+
// ok: python-command-injection-golang
|
|
396
|
+
exec.Command("echo", arg).Run()
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
func safeHardcoded() {
|
|
400
|
+
// ok: python-command-injection-golang
|
|
401
|
+
exec.Command("ls", "-la").Run()
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**Phase 3: Rule** (`python-command-injection-golang.yaml`)
|
|
406
|
+
```yaml
|
|
407
|
+
rules:
|
|
408
|
+
- id: python-command-injection-golang
|
|
409
|
+
mode: taint
|
|
410
|
+
languages: [go]
|
|
411
|
+
severity: ERROR
|
|
412
|
+
message: Command injection via shell execution
|
|
413
|
+
metadata:
|
|
414
|
+
original-rule: python-command-injection
|
|
415
|
+
ported-from: python
|
|
416
|
+
pattern-sources:
|
|
417
|
+
- pattern: $R.URL.Query().Get(...)
|
|
418
|
+
- pattern: $R.FormValue(...)
|
|
419
|
+
pattern-sinks:
|
|
420
|
+
- patterns:
|
|
421
|
+
- pattern: exec.Command("bash", "-c", $CMD, ...)
|
|
422
|
+
- focus-metavariable: $CMD
|
|
423
|
+
- patterns:
|
|
424
|
+
- pattern: exec.Command("sh", "-c", $CMD, ...)
|
|
425
|
+
- focus-metavariable: $CMD
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**Phase 4: Validate**
|
|
429
|
+
```bash
|
|
430
|
+
semgrep --validate --config python-command-injection-golang.yaml
|
|
431
|
+
semgrep --test --config python-command-injection-golang.yaml python-command-injection-golang.go
|
|
432
|
+
# Output: ✓ All tests passed
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
### Java Variant
|
|
438
|
+
|
|
439
|
+
**Phase 1: Applicability**
|
|
440
|
+
```
|
|
441
|
+
TARGET: Java
|
|
442
|
+
VERDICT: APPLICABLE
|
|
443
|
+
REASONING: Command injection applies. Java's Runtime.exec() and
|
|
444
|
+
ProcessBuilder can execute commands. User input passed directly is vulnerable.
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**Phase 2: Test File** (`python-command-injection-java.java`)
|
|
448
|
+
```java
|
|
449
|
+
import javax.servlet.http.*;
|
|
450
|
+
import java.io.*;
|
|
451
|
+
|
|
452
|
+
public class CommandTest {
|
|
453
|
+
// ruleid: python-command-injection-java
|
|
454
|
+
public void vulnerable1(HttpServletRequest request) throws Exception {
|
|
455
|
+
String cmd = request.getParameter("cmd");
|
|
456
|
+
Runtime.getRuntime().exec(cmd);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// ruleid: python-command-injection-java
|
|
460
|
+
public void vulnerable2(HttpServletRequest request) throws Exception {
|
|
461
|
+
String cmd = request.getParameter("cmd");
|
|
462
|
+
new ProcessBuilder(cmd).start();
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// ok: python-command-injection-java
|
|
466
|
+
public void safeHardcoded() throws Exception {
|
|
467
|
+
Runtime.getRuntime().exec("ls -la");
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// ok: python-command-injection-java
|
|
471
|
+
public void safeArray(HttpServletRequest request) throws Exception {
|
|
472
|
+
String arg = request.getParameter("arg");
|
|
473
|
+
Runtime.getRuntime().exec(new String[]{"echo", arg});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**Phase 3: Rule** (`python-command-injection-java.yaml`)
|
|
479
|
+
```yaml
|
|
480
|
+
rules:
|
|
481
|
+
- id: python-command-injection-java
|
|
482
|
+
mode: taint
|
|
483
|
+
languages: [java]
|
|
484
|
+
severity: ERROR
|
|
485
|
+
message: Command injection vulnerability
|
|
486
|
+
metadata:
|
|
487
|
+
original-rule: python-command-injection
|
|
488
|
+
ported-from: python
|
|
489
|
+
pattern-sources:
|
|
490
|
+
- pattern: (HttpServletRequest $REQ).getParameter(...)
|
|
491
|
+
pattern-sinks:
|
|
492
|
+
- pattern: Runtime.getRuntime().exec($CMD)
|
|
493
|
+
focus-metavariable: $CMD
|
|
494
|
+
- patterns:
|
|
495
|
+
- pattern: new ProcessBuilder($CMD, ...).start()
|
|
496
|
+
- focus-metavariable: $CMD
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
**Phase 4: Validate**
|
|
500
|
+
```bash
|
|
501
|
+
semgrep --validate --config python-command-injection-java.yaml
|
|
502
|
+
semgrep --test --config python-command-injection-java.yaml python-command-injection-java.java
|
|
503
|
+
# Output: ✓ All tests passed
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
### Final Output
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
python-command-injection-golang/
|
|
512
|
+
├── python-command-injection-golang.yaml
|
|
513
|
+
└── python-command-injection-golang.go
|
|
514
|
+
|
|
515
|
+
python-command-injection-java/
|
|
516
|
+
├── python-command-injection-java.yaml
|
|
517
|
+
└── python-command-injection-java.java
|
|
518
|
+
```
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: session-logs
|
|
3
|
+
description: Search and analyze your own session logs (older/parent conversations) using jq.
|
|
4
|
+
metadata: { "otto": { "emoji": "📜", "requires": { "bins": ["jq", "rg"] } } }
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# session-logs
|
|
8
|
+
|
|
9
|
+
Search your complete conversation history stored in session JSONL files. Use this when a user references older/parent conversations or asks what was said before.
|
|
10
|
+
|
|
11
|
+
## Trigger
|
|
12
|
+
|
|
13
|
+
Use this skill when the user asks about prior chats, parent conversations, or historical context that isn't in memory files.
|
|
14
|
+
|
|
15
|
+
## Location
|
|
16
|
+
|
|
17
|
+
Session logs live at: `~/.otto/agents/<agentId>/sessions/` (use the `agent=<id>` value from the system prompt Runtime line).
|
|
18
|
+
|
|
19
|
+
- **`sessions.json`** - Index mapping session keys to session IDs
|
|
20
|
+
- **`<session-id>.jsonl`** - Full conversation transcript per session
|
|
21
|
+
|
|
22
|
+
## Structure
|
|
23
|
+
|
|
24
|
+
Each `.jsonl` file contains messages with:
|
|
25
|
+
|
|
26
|
+
- `type`: "session" (metadata) or "message"
|
|
27
|
+
- `timestamp`: ISO timestamp
|
|
28
|
+
- `message.role`: "user", "assistant", or "toolResult"
|
|
29
|
+
- `message.content[]`: Text, thinking, or tool calls (filter `type=="text"` for human-readable content)
|
|
30
|
+
- `message.usage.cost.total`: Cost per response
|
|
31
|
+
|
|
32
|
+
## Common Queries
|
|
33
|
+
|
|
34
|
+
### List all sessions by date and size
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
|
|
38
|
+
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
|
|
39
|
+
size=$(ls -lh "$f" | awk '{print $5}')
|
|
40
|
+
echo "$date $size $(basename $f)"
|
|
41
|
+
done | sort -r
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Find sessions from a specific day
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
|
|
48
|
+
head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
|
|
49
|
+
done
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Extract user messages from a session
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Search for keyword in assistant responses
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Get total cost for a session
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Daily cost summary
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
|
|
74
|
+
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
|
|
75
|
+
cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f")
|
|
76
|
+
echo "$date $cost"
|
|
77
|
+
done | awk '{a[$1]+=$2} END {for(d in a) print d, "$"a[d]}' | sort -r
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Count messages and tokens in a session
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
jq -s '{
|
|
84
|
+
messages: length,
|
|
85
|
+
user: [.[] | select(.message.role == "user")] | length,
|
|
86
|
+
assistant: [.[] | select(.message.role == "assistant")] | length,
|
|
87
|
+
first: .[0].timestamp,
|
|
88
|
+
last: .[-1].timestamp
|
|
89
|
+
}' <session>.jsonl
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Tool usage breakdown
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Search across ALL sessions for a phrase
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
rg -l "phrase" ~/.otto/agents/<agentId>/sessions/*.jsonl
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Tips
|
|
105
|
+
|
|
106
|
+
- Sessions are append-only JSONL (one JSON object per line)
|
|
107
|
+
- Large sessions can be several MB - use `head`/`tail` for sampling
|
|
108
|
+
- The `sessions.json` index maps chat providers (discord, whatsapp, etc.) to session IDs
|
|
109
|
+
- Deleted sessions have `.deleted.<timestamp>` suffix
|
|
110
|
+
|
|
111
|
+
## Fast text-only hint (low noise)
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.otto/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'
|
|
115
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sharp-edges",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Identify error-prone APIs, dangerous configurations, and footgun designs that enable security mistakes",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Trail of Bits",
|
|
7
|
+
"email": "opensource@trailofbits.com",
|
|
8
|
+
"url": "https://github.com/trailofbits"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Sharp Edges
|
|
2
|
+
|
|
3
|
+
Identifies error-prone APIs, dangerous configurations, and footgun designs that enable security mistakes through developer confusion, laziness, or malice.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
- Reviewing API designs for security-relevant interfaces
|
|
8
|
+
- Auditing configuration schemas that expose security choices
|
|
9
|
+
- Evaluating cryptographic library ergonomics
|
|
10
|
+
- Assessing authentication/authorization APIs
|
|
11
|
+
- Any code review where developers make security-critical decisions
|
|
12
|
+
|
|
13
|
+
## What It Does
|
|
14
|
+
|
|
15
|
+
Analyzes code and designs through the lens of three adversaries:
|
|
16
|
+
|
|
17
|
+
1. **The Scoundrel**: Can a malicious developer or attacker disable security via configuration?
|
|
18
|
+
2. **The Lazy Developer**: Will copy-pasting the first example lead to insecure code?
|
|
19
|
+
3. **The Confused Developer**: Can parameters be swapped without type errors?
|
|
20
|
+
|
|
21
|
+
## Core Principle
|
|
22
|
+
|
|
23
|
+
**The pit of success**: Secure usage should be the path of least resistance. If developers must read documentation carefully or remember special rules to avoid vulnerabilities, the API has failed.
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
/plugin install trailofbits/skills/plugins/sharp-edges
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Sharp Edge Categories
|
|
32
|
+
|
|
33
|
+
The skill identifies six categories of misuse-prone designs:
|
|
34
|
+
|
|
35
|
+
| Category | Example |
|
|
36
|
+
|----------|---------|
|
|
37
|
+
| Algorithm Selection | JWT `alg: none` attack; PHP `hash("crc32", $password)` |
|
|
38
|
+
| Dangerous Defaults | `session_timeout: 0` meaning infinite; empty password accepted |
|
|
39
|
+
| Primitive vs. Semantic APIs | `encrypt(msg, bytes, bytes)` where key/nonce can be swapped |
|
|
40
|
+
| Configuration Cliffs | `verify_ssl: false` disables all certificate validation |
|
|
41
|
+
| Silent Failures | Verification returns `False` instead of throwing; ignored return values |
|
|
42
|
+
| Stringly-Typed Security | Permissions as comma-separated strings; SQL from concatenation |
|
|
43
|
+
|
|
44
|
+
## Related Skills
|
|
45
|
+
|
|
46
|
+
- [constant-time-analysis](../constant-time-analysis) - Detect timing side-channels in cryptographic code
|
|
47
|
+
- [differential-review](../differential-review) - Security-focused code change review
|
|
48
|
+
- [audit-context-building](../audit-context-building) - Deep architectural analysis before auditing
|