@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,269 @@
|
|
|
1
|
+
# JavaScript / TypeScript Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Loose Equality Coercion
|
|
4
|
+
|
|
5
|
+
```javascript
|
|
6
|
+
// DANGEROUS: == coerces types unpredictably
|
|
7
|
+
"0" == false // true
|
|
8
|
+
"" == false // true
|
|
9
|
+
"" == 0 // true
|
|
10
|
+
[] == false // true
|
|
11
|
+
[] == ![] // true (wat)
|
|
12
|
+
null == undefined // true
|
|
13
|
+
|
|
14
|
+
// Security implications:
|
|
15
|
+
if (userRole == "admin") { // What if userRole is 0?
|
|
16
|
+
grantAdmin();
|
|
17
|
+
}
|
|
18
|
+
0 == "admin" // false, but...
|
|
19
|
+
0 == "" // true
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Fix**: Always use `===` for strict equality.
|
|
23
|
+
|
|
24
|
+
## Prototype Pollution
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
// DANGEROUS: Merging untrusted objects
|
|
28
|
+
function merge(target, source) {
|
|
29
|
+
for (let key in source) {
|
|
30
|
+
target[key] = source[key]; // Includes __proto__!
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Attacker sends: {"__proto__": {"isAdmin": true}}
|
|
35
|
+
merge({}, JSON.parse(userInput));
|
|
36
|
+
|
|
37
|
+
// Now ALL objects have isAdmin
|
|
38
|
+
({}).isAdmin // true
|
|
39
|
+
const user = {};
|
|
40
|
+
user.isAdmin // true - authentication bypassed!
|
|
41
|
+
|
|
42
|
+
// Also via constructor.prototype
|
|
43
|
+
// {"constructor": {"prototype": {"isAdmin": true}}}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Fix**:
|
|
47
|
+
```javascript
|
|
48
|
+
// Check for dangerous keys
|
|
49
|
+
const dangerous = ['__proto__', 'constructor', 'prototype'];
|
|
50
|
+
if (dangerous.includes(key)) continue;
|
|
51
|
+
|
|
52
|
+
// Or use Object.create(null) for dictionary objects
|
|
53
|
+
const dict = Object.create(null); // No prototype chain
|
|
54
|
+
|
|
55
|
+
// Or use Map instead of objects
|
|
56
|
+
const map = new Map();
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Regular Expression DoS (ReDoS)
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
// DANGEROUS: Catastrophic backtracking
|
|
63
|
+
const regex = /^(a+)+$/;
|
|
64
|
+
regex.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaa!");
|
|
65
|
+
// Exponential time - freezes the event loop
|
|
66
|
+
|
|
67
|
+
// Dangerous patterns:
|
|
68
|
+
// - Nested quantifiers: (a+)+, (a*)*
|
|
69
|
+
// - Overlapping alternatives: (a|a)+
|
|
70
|
+
// - Greedy quantifiers with overlap: .*.*
|
|
71
|
+
|
|
72
|
+
// Real example from ua-parser-js CVE:
|
|
73
|
+
/\s*(;|\s)\s*/ // Fine
|
|
74
|
+
/(a|aa)+/ // ReDoS!
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Detection**: Look for nested quantifiers or overlapping alternatives in regex.
|
|
78
|
+
|
|
79
|
+
## parseInt Without Radix
|
|
80
|
+
|
|
81
|
+
```javascript
|
|
82
|
+
// DANGEROUS: Behavior varies
|
|
83
|
+
parseInt("08"); // 8 (modern JS), was 0 in ES3 (octal)
|
|
84
|
+
parseInt("0x10"); // 16 - hex prefix always recognized
|
|
85
|
+
parseInt("10", 0); // 10 or error depending on engine
|
|
86
|
+
parseInt("10", 1); // NaN - radix 1 invalid
|
|
87
|
+
|
|
88
|
+
// DANGEROUS: Unexpected results
|
|
89
|
+
parseInt("123abc"); // 123 - stops at first non-digit
|
|
90
|
+
parseInt("abc123"); // NaN - starts with non-digit
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Fix**: Always specify radix: `parseInt("08", 10)`
|
|
94
|
+
|
|
95
|
+
## This Binding
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// DANGEROUS: 'this' depends on how function is called
|
|
99
|
+
const obj = {
|
|
100
|
+
value: 42,
|
|
101
|
+
getValue: function() { return this.value; }
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
obj.getValue(); // 42
|
|
105
|
+
const fn = obj.getValue;
|
|
106
|
+
fn(); // undefined - 'this' is global/undefined
|
|
107
|
+
|
|
108
|
+
// DANGEROUS: In callbacks
|
|
109
|
+
setTimeout(obj.getValue, 100); // 'this' is global/undefined
|
|
110
|
+
|
|
111
|
+
// DANGEROUS: In event handlers
|
|
112
|
+
button.addEventListener('click', obj.getValue); // 'this' is button
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Fix**: Use arrow functions or `.bind()`.
|
|
116
|
+
|
|
117
|
+
## Array Methods That Mutate
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
// These MUTATE the original array:
|
|
121
|
+
arr.push(x); // Adds to end
|
|
122
|
+
arr.pop(); // Removes from end
|
|
123
|
+
arr.shift(); // Removes from start
|
|
124
|
+
arr.unshift(x); // Adds to start
|
|
125
|
+
arr.splice(i, n); // Removes/inserts
|
|
126
|
+
arr.sort(); // Sorts IN PLACE
|
|
127
|
+
arr.reverse(); // Reverses IN PLACE
|
|
128
|
+
arr.fill(x); // Fills IN PLACE
|
|
129
|
+
|
|
130
|
+
// These return NEW arrays:
|
|
131
|
+
arr.slice();
|
|
132
|
+
arr.concat();
|
|
133
|
+
arr.map();
|
|
134
|
+
arr.filter();
|
|
135
|
+
|
|
136
|
+
// DANGEROUS: Sorting numbers
|
|
137
|
+
[1, 10, 2].sort(); // [1, 10, 2] - string comparison!
|
|
138
|
+
// Fix: [1, 10, 2].sort((a, b) => a - b); // [1, 2, 10]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Type Coercion in Operations
|
|
142
|
+
|
|
143
|
+
```javascript
|
|
144
|
+
// DANGEROUS: + is overloaded for concatenation
|
|
145
|
+
"5" + 3 // "53" (string)
|
|
146
|
+
5 + "3" // "53" (string)
|
|
147
|
+
5 - "3" // 2 (number)
|
|
148
|
+
"5" - 3 // 2 (number)
|
|
149
|
+
|
|
150
|
+
// DANGEROUS: Comparison with type coercion
|
|
151
|
+
"10" > "9" // false (string comparison: "1" < "9")
|
|
152
|
+
"10" > 9 // true (numeric comparison)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## eval and Dynamic Code
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
// DANGEROUS: eval executes arbitrary code
|
|
159
|
+
eval(userInput);
|
|
160
|
+
|
|
161
|
+
// DANGEROUS: Function constructor
|
|
162
|
+
new Function(userInput)();
|
|
163
|
+
|
|
164
|
+
// DANGEROUS: setTimeout/setInterval with string
|
|
165
|
+
setTimeout(userInput, 1000); // Executes as code!
|
|
166
|
+
|
|
167
|
+
// DANGEROUS: Template injection
|
|
168
|
+
const template = userInput; // "${process.exit()}"
|
|
169
|
+
eval(`\`${template}\``);
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Object Property Access
|
|
173
|
+
|
|
174
|
+
```javascript
|
|
175
|
+
// DANGEROUS: Bracket notation with user input
|
|
176
|
+
const obj = { admin: false };
|
|
177
|
+
const key = userInput; // Could be "__proto__", "constructor", etc.
|
|
178
|
+
obj[key] = true; // Prototype pollution!
|
|
179
|
+
|
|
180
|
+
// DANGEROUS: in operator checks prototype chain
|
|
181
|
+
"toString" in {} // true - inherited from Object.prototype
|
|
182
|
+
|
|
183
|
+
// Fix: Use hasOwnProperty
|
|
184
|
+
({}).hasOwnProperty("toString") // false
|
|
185
|
+
Object.hasOwn({}, "toString") // false (ES2022)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Async/Await Pitfalls
|
|
189
|
+
|
|
190
|
+
```javascript
|
|
191
|
+
// DANGEROUS: Unhandled promise rejection
|
|
192
|
+
async function riskyOperation() {
|
|
193
|
+
throw new Error("oops");
|
|
194
|
+
}
|
|
195
|
+
riskyOperation(); // Unhandled rejection - may crash Node.js
|
|
196
|
+
|
|
197
|
+
// DANGEROUS: Missing await
|
|
198
|
+
async function process() {
|
|
199
|
+
validateInput(); // Forgot await - validation not complete!
|
|
200
|
+
doSensitiveOperation();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// DANGEROUS: Sequential when parallel is possible
|
|
204
|
+
async function slow() {
|
|
205
|
+
const a = await fetchA(); // Waits
|
|
206
|
+
const b = await fetchB(); // Then waits
|
|
207
|
+
return a + b;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Better: parallel
|
|
211
|
+
async function fast() {
|
|
212
|
+
const [a, b] = await Promise.all([fetchA(), fetchB()]);
|
|
213
|
+
return a + b;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## JSON Parse Issues
|
|
218
|
+
|
|
219
|
+
```javascript
|
|
220
|
+
// DANGEROUS: __proto__ in JSON
|
|
221
|
+
JSON.parse('{"__proto__": {"isAdmin": true}}');
|
|
222
|
+
// Creates object with __proto__ key, but doesn't pollute
|
|
223
|
+
|
|
224
|
+
// However, if merged into another object:
|
|
225
|
+
Object.assign({}, JSON.parse(userInput));
|
|
226
|
+
// Can pollute if userInput has __proto__
|
|
227
|
+
|
|
228
|
+
// DANGEROUS: Large numbers lose precision
|
|
229
|
+
JSON.parse('{"id": 9007199254740993}');
|
|
230
|
+
// id becomes 9007199254740992 (precision loss)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## TypeScript-Specific
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
// DANGEROUS: Type assertions bypass checking
|
|
237
|
+
const user = userData as Admin; // No runtime check!
|
|
238
|
+
user.adminMethod(); // Runtime error if not actually Admin
|
|
239
|
+
|
|
240
|
+
// DANGEROUS: any escapes type system
|
|
241
|
+
function process(data: any) {
|
|
242
|
+
data.whatever(); // No type checking
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// DANGEROUS: Non-null assertion
|
|
246
|
+
function greet(name: string | null) {
|
|
247
|
+
console.log(name!.toUpperCase()); // Crash if null!
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// DANGEROUS: Type guards can lie
|
|
251
|
+
function isAdmin(user: User): user is Admin {
|
|
252
|
+
return true; // Wrong! TypeScript trusts this
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Detection Patterns
|
|
257
|
+
|
|
258
|
+
| Pattern | Risk |
|
|
259
|
+
|---------|------|
|
|
260
|
+
| `==` instead of `===` | Type coercion bugs |
|
|
261
|
+
| `obj[userInput]` | Prototype pollution |
|
|
262
|
+
| `/__proto__|constructor|prototype/` in merge | Pollution vectors |
|
|
263
|
+
| `(a+)+`, `(.*)+` in regex | ReDoS |
|
|
264
|
+
| `parseInt(x)` without radix | Parsing inconsistency |
|
|
265
|
+
| `eval(`, `Function(`, `setTimeout(string` | Code execution |
|
|
266
|
+
| `.sort()` on numbers without comparator | String sort |
|
|
267
|
+
| `as Type` assertions | Runtime type mismatch |
|
|
268
|
+
| `!` non-null assertion | Null pointer crash |
|
|
269
|
+
| Missing `await` before async call | Race condition |
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
# Kotlin Sharp Edges
|
|
2
|
+
|
|
3
|
+
## Platform Types from Java
|
|
4
|
+
|
|
5
|
+
```kotlin
|
|
6
|
+
// DANGEROUS: Java interop returns "platform types" (Type!)
|
|
7
|
+
val result = javaLibrary.getValue() // Type: String! (platform type)
|
|
8
|
+
result.length // NPE if Java returned null!
|
|
9
|
+
|
|
10
|
+
// Kotlin doesn't know if Java code can return null
|
|
11
|
+
// Platform types bypass null safety
|
|
12
|
+
|
|
13
|
+
// Even "safe" Java annotations may not be recognized:
|
|
14
|
+
// @NotNull in Java doesn't guarantee Kotlin sees it correctly
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**Fix**: Explicitly declare nullability when calling Java:
|
|
18
|
+
```kotlin
|
|
19
|
+
val result: String? = javaLibrary.getValue() // Treat as nullable
|
|
20
|
+
val result: String = javaLibrary.getValue() // Throws if null
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Not-Null Assertion (!!)
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// DANGEROUS: !! throws on null
|
|
27
|
+
val value = nullableValue!! // KotlinNullPointerException
|
|
28
|
+
|
|
29
|
+
// Common antipattern:
|
|
30
|
+
val user = findUser(id)!! // "I know it's not null"
|
|
31
|
+
// Famous last words
|
|
32
|
+
|
|
33
|
+
// DANGEROUS: Chained assertions
|
|
34
|
+
val name = user!!.profile!!.name!! // Triple jeopardy
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Fix**: Use safe calls and elvis operator:
|
|
38
|
+
```kotlin
|
|
39
|
+
val value = nullableValue ?: return
|
|
40
|
+
val value = nullableValue ?: throw IllegalStateException("...")
|
|
41
|
+
val name = user?.profile?.name ?: "default"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Lateinit
|
|
45
|
+
|
|
46
|
+
```kotlin
|
|
47
|
+
// DANGEROUS: Accessing before initialization
|
|
48
|
+
class MyClass {
|
|
49
|
+
lateinit var config: Config
|
|
50
|
+
|
|
51
|
+
fun process() {
|
|
52
|
+
config.value // UninitializedPropertyAccessException if not set
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Can check with ::property.isInitialized but often forgotten
|
|
57
|
+
if (::config.isInitialized) {
|
|
58
|
+
config.value
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Better alternatives**:
|
|
63
|
+
```kotlin
|
|
64
|
+
// Lazy initialization
|
|
65
|
+
val config: Config by lazy { loadConfig() }
|
|
66
|
+
|
|
67
|
+
// Nullable with check
|
|
68
|
+
var config: Config? = null
|
|
69
|
+
fun process() {
|
|
70
|
+
val c = config ?: throw IllegalStateException("Not configured")
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Data Class Copy Pitfalls
|
|
75
|
+
|
|
76
|
+
```kotlin
|
|
77
|
+
data class User(val name: String, val role: Role)
|
|
78
|
+
|
|
79
|
+
// DANGEROUS: copy() can bypass immutability intentions
|
|
80
|
+
val admin = User("Alice", Role.ADMIN)
|
|
81
|
+
val notAdmin = admin.copy(role = Role.USER) // Fine
|
|
82
|
+
|
|
83
|
+
// But if User validates in constructor:
|
|
84
|
+
data class User(val name: String, val role: Role) {
|
|
85
|
+
init {
|
|
86
|
+
require(name.isNotBlank()) { "Name required" }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// copy() BYPASSES the init block in some scenarios
|
|
91
|
+
// Validation may not run on copy
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Companion Object Initialization
|
|
95
|
+
|
|
96
|
+
```kotlin
|
|
97
|
+
// DANGEROUS: Companion objects initialize lazily on first access
|
|
98
|
+
class MyClass {
|
|
99
|
+
companion object {
|
|
100
|
+
val config = loadConfig() // When does this run?
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// First access triggers initialization
|
|
105
|
+
// Can cause unexpected delays or errors at runtime
|
|
106
|
+
// Order of initialization across classes is complex
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Coroutine Cancellation
|
|
110
|
+
|
|
111
|
+
```kotlin
|
|
112
|
+
// DANGEROUS: Not checking for cancellation
|
|
113
|
+
suspend fun longOperation() {
|
|
114
|
+
while (true) {
|
|
115
|
+
heavyComputation() // Doesn't check cancellation
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Cancel won't stop this coroutine!
|
|
120
|
+
val job = launch { longOperation() }
|
|
121
|
+
job.cancel() // Coroutine keeps running
|
|
122
|
+
|
|
123
|
+
// DANGEROUS: Swallowing CancellationException
|
|
124
|
+
suspend fun wrapped() {
|
|
125
|
+
try {
|
|
126
|
+
suspendingFunction()
|
|
127
|
+
} catch (e: Exception) {
|
|
128
|
+
// CancellationException caught! Breaks cancellation
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Fix**: Check for cancellation and rethrow CancellationException:
|
|
134
|
+
```kotlin
|
|
135
|
+
suspend fun longOperation() {
|
|
136
|
+
while (true) {
|
|
137
|
+
ensureActive() // or yield()
|
|
138
|
+
heavyComputation()
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
catch (e: Exception) {
|
|
143
|
+
if (e is CancellationException) throw e
|
|
144
|
+
// handle other exceptions
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Inline Class Boxing
|
|
149
|
+
|
|
150
|
+
```kotlin
|
|
151
|
+
@JvmInline
|
|
152
|
+
value class UserId(val id: Int)
|
|
153
|
+
|
|
154
|
+
// DANGEROUS: Boxing occurs in certain contexts
|
|
155
|
+
fun process(id: UserId?) { } // Nullable = boxed
|
|
156
|
+
fun process(id: Any) { } // Any = boxed
|
|
157
|
+
val list: List<UserId> // Generic = boxed
|
|
158
|
+
|
|
159
|
+
// Performance benefit lost, but worse:
|
|
160
|
+
// Two "equal" values may not be identical
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Scope Functions Confusion
|
|
164
|
+
|
|
165
|
+
```kotlin
|
|
166
|
+
// DANGEROUS: Wrong scope function leads to bugs
|
|
167
|
+
val user = User()
|
|
168
|
+
user.also {
|
|
169
|
+
it.name = "Alice"
|
|
170
|
+
}.let {
|
|
171
|
+
return it.name // 'it' is the user, 'this' is outer scope
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Easy to confuse:
|
|
175
|
+
// let: it = receiver, returns lambda result
|
|
176
|
+
// also: it = receiver, returns receiver
|
|
177
|
+
// apply: this = receiver, returns receiver
|
|
178
|
+
// run: this = receiver, returns lambda result
|
|
179
|
+
// with: this = receiver, returns lambda result
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Delegation Pitfalls
|
|
183
|
+
|
|
184
|
+
```kotlin
|
|
185
|
+
// DANGEROUS: Property delegation evaluated lazily
|
|
186
|
+
class Config {
|
|
187
|
+
val setting by lazy { loadExpensiveSetting() }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Thread safety depends on lazy mode:
|
|
191
|
+
by lazy { } // Synchronized (safe but slow)
|
|
192
|
+
by lazy(LazyThreadSafetyMode.NONE) { } // Not safe!
|
|
193
|
+
by lazy(LazyThreadSafetyMode.PUBLICATION) { } // Safe but may compute multiple times
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Reified Type Erasure
|
|
197
|
+
|
|
198
|
+
```kotlin
|
|
199
|
+
// DANGEROUS: Inline + reified still has limits
|
|
200
|
+
inline fun <reified T> parse(json: String): T {
|
|
201
|
+
return gson.fromJson(json, T::class.java)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Works for simple types, but:
|
|
205
|
+
parse<List<String>>(json) // T::class.java is just List, not List<String>
|
|
206
|
+
// Generic type arguments still erased
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Sequence vs Iterable
|
|
210
|
+
|
|
211
|
+
```kotlin
|
|
212
|
+
// DANGEROUS: Sequences are lazy, Iterables are eager
|
|
213
|
+
val list = listOf(1, 2, 3)
|
|
214
|
+
|
|
215
|
+
// Eager - filter runs on all elements immediately
|
|
216
|
+
list.filter { println("filter $it"); it > 1 }
|
|
217
|
+
.map { println("map $it"); it * 2 }
|
|
218
|
+
.first()
|
|
219
|
+
// Prints: filter 1, filter 2, filter 3, map 2, map 3
|
|
220
|
+
|
|
221
|
+
// Lazy - only processes needed elements
|
|
222
|
+
list.asSequence()
|
|
223
|
+
.filter { println("filter $it"); it > 1 }
|
|
224
|
+
.map { println("map $it"); it * 2 }
|
|
225
|
+
.first()
|
|
226
|
+
// Prints: filter 1, filter 2, map 2
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
But sequences can also surprise:
|
|
230
|
+
```kotlin
|
|
231
|
+
// DANGEROUS: Sequence operations return new sequences, not results
|
|
232
|
+
val seq = listOf(1, 2, 3).asSequence()
|
|
233
|
+
.filter { it > 1 }
|
|
234
|
+
.map { it * 2 }
|
|
235
|
+
// Nothing executed yet! Must terminate with toList(), first(), etc.
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Extension Function Shadowing
|
|
239
|
+
|
|
240
|
+
```kotlin
|
|
241
|
+
// DANGEROUS: Extension functions can shadow members
|
|
242
|
+
class MyClass {
|
|
243
|
+
fun process() = "member"
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
fun MyClass.process() = "extension" // Never called!
|
|
247
|
+
|
|
248
|
+
val obj = MyClass()
|
|
249
|
+
obj.process() // "member" - members always win
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Detection Patterns
|
|
253
|
+
|
|
254
|
+
| Pattern | Risk |
|
|
255
|
+
|---------|------|
|
|
256
|
+
| Java interop without explicit nullability | Platform type NPE |
|
|
257
|
+
| `!!` assertion | Null pointer exception |
|
|
258
|
+
| `lateinit` without isInitialized check | Uninitialized access |
|
|
259
|
+
| `data class` with validation in init | copy() bypasses validation |
|
|
260
|
+
| `suspend fun` without ensureActive/yield | Can't cancel |
|
|
261
|
+
| `catch (e: Exception)` in coroutines | Swallows cancellation |
|
|
262
|
+
| `@JvmInline` with nullable/generic | Unexpected boxing |
|
|
263
|
+
| `by lazy(LazyThreadSafetyMode.NONE)` | Thread safety |
|
|
264
|
+
| `asSequence()` without terminal op | Nothing executes |
|
|
265
|
+
| Extension function same name as member | Extension never called |
|