@elizaos/skills 2.0.0-alpha.10

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.
Files changed (291) hide show
  1. package/README.md +126 -0
  2. package/dist/formatter.d.ts +44 -0
  3. package/dist/formatter.d.ts.map +1 -0
  4. package/dist/formatter.js +182 -0
  5. package/dist/frontmatter.d.ts +39 -0
  6. package/dist/frontmatter.d.ts.map +1 -0
  7. package/dist/frontmatter.js +105 -0
  8. package/dist/index.d.ts +29 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +31 -0
  11. package/dist/loader.d.ts +33 -0
  12. package/dist/loader.d.ts.map +1 -0
  13. package/dist/loader.js +362 -0
  14. package/dist/resolver.d.ts +18 -0
  15. package/dist/resolver.d.ts.map +1 -0
  16. package/dist/resolver.js +90 -0
  17. package/dist/types.d.ts +201 -0
  18. package/dist/types.d.ts.map +1 -0
  19. package/dist/types.js +1 -0
  20. package/package.json +57 -0
  21. package/skills/1password/SKILL.md +70 -0
  22. package/skills/1password/references/cli-examples.md +29 -0
  23. package/skills/1password/references/get-started.md +17 -0
  24. package/skills/apple-notes/SKILL.md +77 -0
  25. package/skills/apple-reminders/SKILL.md +96 -0
  26. package/skills/bear-notes/SKILL.md +107 -0
  27. package/skills/bird/SKILL.md +224 -0
  28. package/skills/blogwatcher/SKILL.md +69 -0
  29. package/skills/blucli/SKILL.md +47 -0
  30. package/skills/bluebubbles/SKILL.md +131 -0
  31. package/skills/camsnap/SKILL.md +45 -0
  32. package/skills/canvas/SKILL.md +203 -0
  33. package/skills/clawhub/SKILL.md +77 -0
  34. package/skills/coding-agent/SKILL.md +284 -0
  35. package/skills/discord/SKILL.md +578 -0
  36. package/skills/eightctl/SKILL.md +50 -0
  37. package/skills/food-order/SKILL.md +48 -0
  38. package/skills/gemini/SKILL.md +43 -0
  39. package/skills/gifgrep/SKILL.md +79 -0
  40. package/skills/github/SKILL.md +77 -0
  41. package/skills/gog/SKILL.md +116 -0
  42. package/skills/goplaces/SKILL.md +52 -0
  43. package/skills/healthcheck/SKILL.md +245 -0
  44. package/skills/himalaya/SKILL.md +257 -0
  45. package/skills/himalaya/references/configuration.md +184 -0
  46. package/skills/himalaya/references/message-composition.md +199 -0
  47. package/skills/imsg/SKILL.md +74 -0
  48. package/skills/local-places/SERVER_README.md +101 -0
  49. package/skills/local-places/SKILL.md +102 -0
  50. package/skills/local-places/pyproject.toml +21 -0
  51. package/skills/local-places/src/local_places/__init__.py +2 -0
  52. package/skills/local-places/src/local_places/google_places.py +314 -0
  53. package/skills/local-places/src/local_places/main.py +65 -0
  54. package/skills/local-places/src/local_places/schemas.py +107 -0
  55. package/skills/mcporter/SKILL.md +61 -0
  56. package/skills/model-usage/SKILL.md +69 -0
  57. package/skills/model-usage/references/codexbar-cli.md +33 -0
  58. package/skills/model-usage/scripts/model_usage.py +310 -0
  59. package/skills/nano-banana-pro/SKILL.md +58 -0
  60. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  61. package/skills/nano-pdf/SKILL.md +38 -0
  62. package/skills/notion/SKILL.md +172 -0
  63. package/skills/obsidian/SKILL.md +81 -0
  64. package/skills/openai-image-gen/SKILL.md +89 -0
  65. package/skills/openai-image-gen/scripts/gen.py +240 -0
  66. package/skills/openai-whisper/SKILL.md +38 -0
  67. package/skills/openai-whisper-api/SKILL.md +52 -0
  68. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  69. package/skills/openhue/SKILL.md +51 -0
  70. package/skills/oracle/SKILL.md +125 -0
  71. package/skills/ordercli/SKILL.md +78 -0
  72. package/skills/peekaboo/SKILL.md +190 -0
  73. package/skills/sag/SKILL.md +87 -0
  74. package/skills/security-ask-questions-if-underspecified/.claude-plugin/plugin.json +10 -0
  75. package/skills/security-ask-questions-if-underspecified/README.md +24 -0
  76. package/skills/security-ask-questions-if-underspecified/SKILL.md +85 -0
  77. package/skills/security-ask-questions-if-underspecified/skills/ask-questions-if-underspecified/SKILL.md +85 -0
  78. package/skills/security-audit-context-building/.claude-plugin/plugin.json +10 -0
  79. package/skills/security-audit-context-building/README.md +58 -0
  80. package/skills/security-audit-context-building/SKILL.md +297 -0
  81. package/skills/security-audit-context-building/commands/audit-context.md +21 -0
  82. package/skills/security-audit-context-building/skills/audit-context-building/SKILL.md +297 -0
  83. package/skills/security-audit-context-building/skills/audit-context-building/resources/COMPLETENESS_CHECKLIST.md +47 -0
  84. package/skills/security-audit-context-building/skills/audit-context-building/resources/FUNCTION_MICRO_ANALYSIS_EXAMPLE.md +355 -0
  85. package/skills/security-audit-context-building/skills/audit-context-building/resources/OUTPUT_REQUIREMENTS.md +71 -0
  86. package/skills/security-building-secure-contracts/.claude-plugin/plugin.json +10 -0
  87. package/skills/security-building-secure-contracts/README.md +241 -0
  88. package/skills/security-building-secure-contracts/SKILL.md +67 -0
  89. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/SKILL.md +284 -0
  90. package/skills/security-building-secure-contracts/skills/algorand-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +405 -0
  91. package/skills/security-building-secure-contracts/skills/audit-prep-assistant/SKILL.md +409 -0
  92. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/SKILL.md +329 -0
  93. package/skills/security-building-secure-contracts/skills/cairo-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +722 -0
  94. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/SKILL.md +218 -0
  95. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/ASSESSMENT_CRITERIA.md +355 -0
  96. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/EXAMPLE_REPORT.md +248 -0
  97. package/skills/security-building-secure-contracts/skills/code-maturity-assessor/resources/REPORT_FORMAT.md +33 -0
  98. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/SKILL.md +334 -0
  99. package/skills/security-building-secure-contracts/skills/cosmos-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +740 -0
  100. package/skills/security-building-secure-contracts/skills/guidelines-advisor/SKILL.md +252 -0
  101. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/ASSESSMENT_AREAS.md +329 -0
  102. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/DELIVERABLES.md +118 -0
  103. package/skills/security-building-secure-contracts/skills/guidelines-advisor/resources/EXAMPLE_REPORT.md +298 -0
  104. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/SKILL.md +161 -0
  105. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/EXAMPLE_REPORT.md +279 -0
  106. package/skills/security-building-secure-contracts/skills/secure-workflow-guide/resources/WORKFLOW_STEPS.md +132 -0
  107. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/SKILL.md +389 -0
  108. package/skills/security-building-secure-contracts/skills/solana-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +669 -0
  109. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/SKILL.md +298 -0
  110. package/skills/security-building-secure-contracts/skills/substrate-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +791 -0
  111. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/SKILL.md +362 -0
  112. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/ASSESSMENT_CATEGORIES.md +571 -0
  113. package/skills/security-building-secure-contracts/skills/token-integration-analyzer/resources/REPORT_TEMPLATES.md +141 -0
  114. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/SKILL.md +388 -0
  115. package/skills/security-building-secure-contracts/skills/ton-vulnerability-scanner/resources/VULNERABILITY_PATTERNS.md +595 -0
  116. package/skills/security-differential-review/.claude-plugin/plugin.json +10 -0
  117. package/skills/security-differential-review/README.md +109 -0
  118. package/skills/security-differential-review/SKILL.md +220 -0
  119. package/skills/security-differential-review/commands/diff-review.md +21 -0
  120. package/skills/security-differential-review/skills/differential-review/SKILL.md +220 -0
  121. package/skills/security-differential-review/skills/differential-review/adversarial.md +203 -0
  122. package/skills/security-differential-review/skills/differential-review/methodology.md +234 -0
  123. package/skills/security-differential-review/skills/differential-review/patterns.md +300 -0
  124. package/skills/security-differential-review/skills/differential-review/reporting.md +369 -0
  125. package/skills/security-entry-point-analyzer/.claude-plugin/plugin.json +10 -0
  126. package/skills/security-entry-point-analyzer/README.md +74 -0
  127. package/skills/security-entry-point-analyzer/SKILL.md +251 -0
  128. package/skills/security-entry-point-analyzer/commands/entry-points.md +18 -0
  129. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/SKILL.md +251 -0
  130. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/cosmwasm.md +182 -0
  131. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-aptos.md +107 -0
  132. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/move-sui.md +87 -0
  133. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solana.md +155 -0
  134. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/solidity.md +135 -0
  135. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/ton.md +185 -0
  136. package/skills/security-entry-point-analyzer/skills/entry-point-analyzer/references/vyper.md +141 -0
  137. package/skills/security-fix-review/.claude-plugin/plugin.json +13 -0
  138. package/skills/security-fix-review/README.md +118 -0
  139. package/skills/security-fix-review/SKILL.md +264 -0
  140. package/skills/security-fix-review/commands/fix-review.md +24 -0
  141. package/skills/security-fix-review/skills/fix-review/SKILL.md +264 -0
  142. package/skills/security-fix-review/skills/fix-review/references/bug-detection.md +408 -0
  143. package/skills/security-fix-review/skills/fix-review/references/finding-matching.md +298 -0
  144. package/skills/security-fix-review/skills/fix-review/references/report-parsing.md +398 -0
  145. package/skills/security-insecure-defaults/.claude-plugin/plugin.json +10 -0
  146. package/skills/security-insecure-defaults/README.md +45 -0
  147. package/skills/security-insecure-defaults/SKILL.md +117 -0
  148. package/skills/security-insecure-defaults/skills/insecure-defaults/SKILL.md +117 -0
  149. package/skills/security-insecure-defaults/skills/insecure-defaults/references/examples.md +409 -0
  150. package/skills/security-modern-python/.claude-plugin/plugin.json +10 -0
  151. package/skills/security-modern-python/README.md +58 -0
  152. package/skills/security-modern-python/SKILL.md +333 -0
  153. package/skills/security-modern-python/hooks/hooks.json +16 -0
  154. package/skills/security-modern-python/hooks/intercept-legacy-python.bats +388 -0
  155. package/skills/security-modern-python/hooks/intercept-legacy-python.sh +109 -0
  156. package/skills/security-modern-python/hooks/test_helper.bash +75 -0
  157. package/skills/security-modern-python/skills/modern-python/SKILL.md +333 -0
  158. package/skills/security-modern-python/skills/modern-python/references/dependabot.md +43 -0
  159. package/skills/security-modern-python/skills/modern-python/references/migration-checklist.md +141 -0
  160. package/skills/security-modern-python/skills/modern-python/references/pep723-scripts.md +259 -0
  161. package/skills/security-modern-python/skills/modern-python/references/prek.md +211 -0
  162. package/skills/security-modern-python/skills/modern-python/references/pyproject.md +254 -0
  163. package/skills/security-modern-python/skills/modern-python/references/ruff-config.md +240 -0
  164. package/skills/security-modern-python/skills/modern-python/references/security-setup.md +255 -0
  165. package/skills/security-modern-python/skills/modern-python/references/testing.md +284 -0
  166. package/skills/security-modern-python/skills/modern-python/references/uv-commands.md +200 -0
  167. package/skills/security-modern-python/skills/modern-python/templates/dependabot.yml +36 -0
  168. package/skills/security-modern-python/skills/modern-python/templates/pre-commit-config.yaml +66 -0
  169. package/skills/security-property-based-testing/.claude-plugin/plugin.json +9 -0
  170. package/skills/security-property-based-testing/README.md +47 -0
  171. package/skills/security-property-based-testing/SKILL.md +109 -0
  172. package/skills/security-property-based-testing/skills/property-based-testing/README.md +88 -0
  173. package/skills/security-property-based-testing/skills/property-based-testing/SKILL.md +109 -0
  174. package/skills/security-property-based-testing/skills/property-based-testing/references/design.md +191 -0
  175. package/skills/security-property-based-testing/skills/property-based-testing/references/generating.md +200 -0
  176. package/skills/security-property-based-testing/skills/property-based-testing/references/libraries.md +130 -0
  177. package/skills/security-property-based-testing/skills/property-based-testing/references/refactoring.md +181 -0
  178. package/skills/security-property-based-testing/skills/property-based-testing/references/reviewing.md +209 -0
  179. package/skills/security-property-based-testing/skills/property-based-testing/references/strategies.md +124 -0
  180. package/skills/semgrep-rule-creator/.claude-plugin/plugin.json +8 -0
  181. package/skills/semgrep-rule-creator/README.md +43 -0
  182. package/skills/semgrep-rule-creator/SKILL.md +168 -0
  183. package/skills/semgrep-rule-creator/commands/semgrep-rule.md +26 -0
  184. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/SKILL.md +168 -0
  185. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/quick-reference.md +203 -0
  186. package/skills/semgrep-rule-creator/skills/semgrep-rule-creator/references/workflow.md +240 -0
  187. package/skills/session-logs/SKILL.md +115 -0
  188. package/skills/sharp-edges/.claude-plugin/plugin.json +10 -0
  189. package/skills/sharp-edges/README.md +48 -0
  190. package/skills/sharp-edges/SKILL.md +292 -0
  191. package/skills/sharp-edges/skills/sharp-edges/SKILL.md +292 -0
  192. package/skills/sharp-edges/skills/sharp-edges/references/auth-patterns.md +252 -0
  193. package/skills/sharp-edges/skills/sharp-edges/references/case-studies.md +274 -0
  194. package/skills/sharp-edges/skills/sharp-edges/references/config-patterns.md +333 -0
  195. package/skills/sharp-edges/skills/sharp-edges/references/crypto-apis.md +190 -0
  196. package/skills/sharp-edges/skills/sharp-edges/references/lang-c.md +205 -0
  197. package/skills/sharp-edges/skills/sharp-edges/references/lang-csharp.md +285 -0
  198. package/skills/sharp-edges/skills/sharp-edges/references/lang-go.md +270 -0
  199. package/skills/sharp-edges/skills/sharp-edges/references/lang-java.md +263 -0
  200. package/skills/sharp-edges/skills/sharp-edges/references/lang-javascript.md +269 -0
  201. package/skills/sharp-edges/skills/sharp-edges/references/lang-kotlin.md +265 -0
  202. package/skills/sharp-edges/skills/sharp-edges/references/lang-php.md +245 -0
  203. package/skills/sharp-edges/skills/sharp-edges/references/lang-python.md +274 -0
  204. package/skills/sharp-edges/skills/sharp-edges/references/lang-ruby.md +273 -0
  205. package/skills/sharp-edges/skills/sharp-edges/references/lang-rust.md +272 -0
  206. package/skills/sharp-edges/skills/sharp-edges/references/lang-swift.md +287 -0
  207. package/skills/sharp-edges/skills/sharp-edges/references/language-specific.md +588 -0
  208. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  209. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  210. package/skills/skill-creator/SKILL.md +370 -0
  211. package/skills/skill-creator/license.txt +202 -0
  212. package/skills/skill-creator/scripts/init_skill.py +378 -0
  213. package/skills/skill-creator/scripts/package_skill.py +111 -0
  214. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  215. package/skills/slack/SKILL.md +144 -0
  216. package/skills/songsee/SKILL.md +49 -0
  217. package/skills/sonoscli/SKILL.md +46 -0
  218. package/skills/spec-to-code-compliance/.claude-plugin/plugin.json +10 -0
  219. package/skills/spec-to-code-compliance/README.md +67 -0
  220. package/skills/spec-to-code-compliance/SKILL.md +349 -0
  221. package/skills/spec-to-code-compliance/commands/spec-compliance.md +22 -0
  222. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/SKILL.md +349 -0
  223. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/COMPLETENESS_CHECKLIST.md +69 -0
  224. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/IR_EXAMPLES.md +417 -0
  225. package/skills/spec-to-code-compliance/skills/spec-to-code-compliance/resources/OUTPUT_REQUIREMENTS.md +105 -0
  226. package/skills/spotify-player/SKILL.md +64 -0
  227. package/skills/static-analysis/.claude-plugin/plugin.json +8 -0
  228. package/skills/static-analysis/README.md +59 -0
  229. package/skills/static-analysis/SKILL.md +91 -0
  230. package/skills/static-analysis/skills/codeql/SKILL.md +315 -0
  231. package/skills/static-analysis/skills/sarif-parsing/SKILL.md +479 -0
  232. package/skills/static-analysis/skills/sarif-parsing/resources/jq-queries.md +162 -0
  233. package/skills/static-analysis/skills/sarif-parsing/resources/sarif_helpers.py +331 -0
  234. package/skills/static-analysis/skills/semgrep/SKILL.md +337 -0
  235. package/skills/summarize/SKILL.md +87 -0
  236. package/skills/testing-handbook-skills/.claude-plugin/plugin.json +8 -0
  237. package/skills/testing-handbook-skills/README.md +241 -0
  238. package/skills/testing-handbook-skills/SKILL.md +104 -0
  239. package/skills/testing-handbook-skills/scripts/pyproject.toml +8 -0
  240. package/skills/testing-handbook-skills/scripts/validate-skills.py +657 -0
  241. package/skills/testing-handbook-skills/skills/address-sanitizer/SKILL.md +341 -0
  242. package/skills/testing-handbook-skills/skills/aflpp/SKILL.md +640 -0
  243. package/skills/testing-handbook-skills/skills/atheris/SKILL.md +515 -0
  244. package/skills/testing-handbook-skills/skills/cargo-fuzz/SKILL.md +454 -0
  245. package/skills/testing-handbook-skills/skills/codeql/SKILL.md +549 -0
  246. package/skills/testing-handbook-skills/skills/constant-time-testing/SKILL.md +507 -0
  247. package/skills/testing-handbook-skills/skills/coverage-analysis/SKILL.md +607 -0
  248. package/skills/testing-handbook-skills/skills/fuzzing-dictionary/SKILL.md +297 -0
  249. package/skills/testing-handbook-skills/skills/fuzzing-obstacles/SKILL.md +426 -0
  250. package/skills/testing-handbook-skills/skills/harness-writing/SKILL.md +614 -0
  251. package/skills/testing-handbook-skills/skills/libafl/SKILL.md +625 -0
  252. package/skills/testing-handbook-skills/skills/libfuzzer/SKILL.md +795 -0
  253. package/skills/testing-handbook-skills/skills/ossfuzz/SKILL.md +426 -0
  254. package/skills/testing-handbook-skills/skills/ruzzy/SKILL.md +443 -0
  255. package/skills/testing-handbook-skills/skills/semgrep/SKILL.md +601 -0
  256. package/skills/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md +372 -0
  257. package/skills/testing-handbook-skills/skills/testing-handbook-generator/agent-prompt.md +280 -0
  258. package/skills/testing-handbook-skills/skills/testing-handbook-generator/discovery.md +452 -0
  259. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/domain-skill.md +504 -0
  260. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/fuzzer-skill.md +454 -0
  261. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/technique-skill.md +527 -0
  262. package/skills/testing-handbook-skills/skills/testing-handbook-generator/templates/tool-skill.md +366 -0
  263. package/skills/testing-handbook-skills/skills/testing-handbook-generator/testing.md +482 -0
  264. package/skills/testing-handbook-skills/skills/wycheproof/SKILL.md +533 -0
  265. package/skills/things-mac/SKILL.md +86 -0
  266. package/skills/tmux/SKILL.md +135 -0
  267. package/skills/tmux/scripts/find-sessions.sh +112 -0
  268. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  269. package/skills/trello/SKILL.md +95 -0
  270. package/skills/variant-analysis/.claude-plugin/plugin.json +8 -0
  271. package/skills/variant-analysis/README.md +41 -0
  272. package/skills/variant-analysis/SKILL.md +142 -0
  273. package/skills/variant-analysis/commands/variants.md +23 -0
  274. package/skills/variant-analysis/skills/variant-analysis/METHODOLOGY.md +327 -0
  275. package/skills/variant-analysis/skills/variant-analysis/SKILL.md +142 -0
  276. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/cpp.ql +119 -0
  277. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/go.ql +69 -0
  278. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/java.ql +71 -0
  279. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/javascript.ql +63 -0
  280. package/skills/variant-analysis/skills/variant-analysis/resources/codeql/python.ql +80 -0
  281. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/cpp.yaml +98 -0
  282. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/go.yaml +63 -0
  283. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/java.yaml +61 -0
  284. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/javascript.yaml +60 -0
  285. package/skills/variant-analysis/skills/variant-analysis/resources/semgrep/python.yaml +72 -0
  286. package/skills/variant-analysis/skills/variant-analysis/resources/variant-report-template.md +75 -0
  287. package/skills/video-frames/SKILL.md +46 -0
  288. package/skills/video-frames/scripts/frame.sh +81 -0
  289. package/skills/voice-call/SKILL.md +45 -0
  290. package/skills/wacli/SKILL.md +72 -0
  291. package/skills/weather/SKILL.md +54 -0
@@ -0,0 +1,595 @@
1
+ ## 6. Vulnerability Checklist (3 Patterns)
2
+
3
+ ### 6.1 INTEGER AS BOOLEAN ⚠️ HIGH
4
+
5
+ **Description**: FunC uses integers for boolean values (0 = false, -1 = true). The bitwise NOT operator `~` on non-standard boolean values (positive integers) produces unexpected results, causing logic errors.
6
+
7
+ **Background**:
8
+ - FunC `true` = -1 (all bits set: `0xFFFFFFFF...`)
9
+ - FunC `false` = 0 (all bits clear: `0x00000000...`)
10
+ - `~` is bitwise NOT: `~0 = -1`, `~(-1) = 0`
11
+ - But `~1 = -2` (not 0!), `~2 = -3` (not 0!)
12
+
13
+ **Detection Patterns**:
14
+ ```func
15
+ ;; VULNERABLE: Using positive integers as booleans
16
+ int is_active = 1; ;; WRONG: Should be -1 for true, 0 for false
17
+
18
+ if (is_active) {
19
+ ;; This works - 1 is truthy
20
+ }
21
+
22
+ if (~ is_active) {
23
+ ;; PROBLEM: ~1 = -2, which is still truthy!
24
+ ;; This branch will ALWAYS execute, not just when is_active is false
25
+ }
26
+
27
+ ;; VULNERABLE: Returning positive integers as booleans
28
+ int is_valid(int value) {
29
+ if (value > 100) {
30
+ return 1; ;; WRONG: Should return -1
31
+ }
32
+ return 0; ;; Correct for false
33
+ }
34
+
35
+ int valid = is_valid(150); ;; Returns 1
36
+ if (~ valid) {
37
+ ;; PROBLEM: ~1 = -2 (truthy), this executes when it shouldn't!
38
+ }
39
+
40
+ ;; VULNERABLE: Boolean arithmetic
41
+ int flag1 = 1; ;; Wrong true value
42
+ int flag2 = 1; ;; Wrong true value
43
+ int both_true = flag1 & flag2; ;; 1 & 1 = 1 (works)
44
+ int neither_true = (~ flag1) & (~ flag2); ;; ~1 & ~1 = -2 & -2 = -2 (WRONG!)
45
+ ;; Expected 0 (false), got -2 (truthy)
46
+ ```
47
+
48
+ **What to Check**:
49
+ - [ ] All boolean values use 0 (false) or -1 (true)
50
+ - [ ] NO positive integers (1, 2, etc.) used as booleans
51
+ - [ ] Functions returning booleans return -1 (not 1) for true
52
+ - [ ] Boolean logic with `~`, `&`, `|` uses correct values
53
+ - [ ] Conditions test against 0 explicitly where needed
54
+
55
+ **Mitigation**:
56
+ ```func
57
+ ;; SECURE: Use correct boolean values
58
+ const int TRUE = -1; ;; All bits set
59
+ const int FALSE = 0; ;; All bits clear
60
+
61
+ int is_active = TRUE; ;; Correct
62
+
63
+ if (is_active) {
64
+ ;; Works correctly
65
+ }
66
+
67
+ if (~ is_active) {
68
+ ;; Works correctly: ~(-1) = 0 (falsy)
69
+ }
70
+
71
+ ;; SECURE: Return correct boolean values
72
+ int is_valid(int value) method_id {
73
+ if (value > 100) {
74
+ return TRUE; ;; -1 for true
75
+ }
76
+ return FALSE; ;; 0 for false
77
+ }
78
+
79
+ int valid = is_valid(150);
80
+ if (~ valid) {
81
+ ;; Correct: ~(-1) = 0 (falsy), this doesn't execute
82
+ }
83
+
84
+ ;; SECURE: Boolean operations with correct values
85
+ int flag1 = TRUE; ;; -1
86
+ int flag2 = TRUE; ;; -1
87
+ int both_true = flag1 & flag2; ;; -1 & -1 = -1 (TRUE)
88
+ int neither_true = (~ flag1) & (~ flag2); ;; 0 & 0 = 0 (FALSE)
89
+
90
+ ;; SECURE: Explicit comparisons when needed
91
+ int status_code = get_status(); ;; Returns 0, 1, 2, etc.
92
+
93
+ ;; Instead of treating as boolean:
94
+ if (status_code) { } ;; Ambiguous!
95
+
96
+ ;; Explicitly compare:
97
+ if (status_code != 0) { } ;; Clear intent
98
+ if (status_code == 1) { } ;; Even better
99
+ ```
100
+
101
+ **Common Mistake Patterns**:
102
+ ```func
103
+ ;; MISTAKE 1: Loading boolean from storage/message
104
+ slice cs = get_data().begin_parse();
105
+ int flag = cs~load_uint(1); ;; Returns 0 or 1, not 0 or -1!
106
+
107
+ ;; FIX: Convert to proper boolean
108
+ int flag_bool = flag ? TRUE : FALSE;
109
+
110
+ ;; MISTAKE 2: Comparing with 1 instead of TRUE
111
+ int is_owner = sender == owner_address; ;; Returns 0 or -1 (correct)
112
+
113
+ if (is_owner == 1) { ;; WRONG: will never match
114
+ ;; This never executes!
115
+ }
116
+
117
+ ;; FIX: Compare with TRUE or just use directly
118
+ if (is_owner == TRUE) { } ;; Correct
119
+ if (is_owner) { } ;; Also correct
120
+
121
+ ;; MISTAKE 3: Returning count as boolean
122
+ int count_items() {
123
+ return items.length; ;; Returns 0, 1, 2, 3... (not boolean!)
124
+ }
125
+
126
+ int has_items = count_items();
127
+ if (~ has_items) {
128
+ ;; WRONG: ~1 = -2 (truthy), ~2 = -3 (truthy), etc.
129
+ }
130
+
131
+ ;; FIX: Return proper boolean or use explicit comparison
132
+ int has_items() {
133
+ return items.length > 0 ? TRUE : FALSE;
134
+ }
135
+ ;; OR
136
+ int count = count_items();
137
+ if (count == 0) { } ;; Explicit comparison
138
+ ```
139
+
140
+ **Testing**:
141
+ ```func
142
+ ;; Test boolean logic
143
+ int test_boolean_logic() {
144
+ int t = TRUE;
145
+ int f = FALSE;
146
+
147
+ ;; Basic logic
148
+ throw_unless(100, t == -1);
149
+ throw_unless(101, f == 0);
150
+
151
+ ;; Negation
152
+ throw_unless(102, ~t == f);
153
+ throw_unless(103, ~f == t);
154
+
155
+ ;; AND logic
156
+ throw_unless(104, t & t == t);
157
+ throw_unless(105, t & f == f);
158
+ throw_unless(106, f & f == f);
159
+
160
+ ;; OR logic
161
+ throw_unless(107, t | t == t);
162
+ throw_unless(108, t | f == t);
163
+ throw_unless(109, f | f == f);
164
+
165
+ return TRUE;
166
+ }
167
+ ```
168
+
169
+ **References**: building-secure-contracts/not-so-smart-contracts/ton/integer_as_boolean
170
+
171
+ ---
172
+
173
+ ### 4.2 FAKE JETTON CONTRACT ⚠️ CRITICAL
174
+
175
+ **Description**: The `transfer_notification` operation can be sent by any contract. Without sender validation, attackers can send fake transfer notifications claiming to have transferred tokens that were never sent.
176
+
177
+ **Background**:
178
+ - Jetton (TON's token standard) uses `transfer_notification` to notify recipients
179
+ - Real flow: User → Jetton Wallet → Receiver (with notification)
180
+ - Attack: Attacker → Receiver (fake notification, no Jetton Wallet involved)
181
+
182
+ **Detection Patterns**:
183
+ ```func
184
+ ;; VULNERABLE: No sender validation in transfer_notification
185
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
186
+ slice cs = in_msg_full.begin_parse();
187
+ int flags = cs~load_uint(4);
188
+ slice sender_address = cs~load_msg_addr();
189
+
190
+ int op = in_msg_body~load_uint(32);
191
+
192
+ if (op == op::transfer_notification) {
193
+ ;; WRONG: No validation of sender_address!
194
+ int jetton_amount = in_msg_body~load_coins();
195
+ slice from_user = in_msg_body~load_msg_addr();
196
+ slice forward_payload = in_msg_body;
197
+
198
+ ;; Process as if jettons were received
199
+ ;; Attacker can claim any jetton_amount without actually sending tokens!
200
+ credit_user(from_user, jetton_amount);
201
+ }
202
+ }
203
+
204
+ ;; VULNERABLE: Validating user address but not Jetton wallet
205
+ if (op == op::transfer_notification) {
206
+ int jetton_amount = in_msg_body~load_coins();
207
+ slice from_user = in_msg_body~load_msg_addr();
208
+
209
+ ;; Validates from_user but not sender!
210
+ throw_unless(error::unauthorized, equal_slices(from_user, authorized_user));
211
+
212
+ ;; WRONG: Anyone can send this message claiming to be from authorized_user
213
+ credit_user(from_user, jetton_amount);
214
+ }
215
+
216
+ ;; VULNERABLE: Trusting forward_payload data
217
+ if (op == op::transfer_notification) {
218
+ int jetton_amount = in_msg_body~load_coins();
219
+ slice from_user = in_msg_body~load_msg_addr();
220
+ slice forward_payload = in_msg_body;
221
+
222
+ ;; Parse data from forward_payload
223
+ int token_id = forward_payload~load_uint(32);
224
+
225
+ ;; WRONG: Attacker controls all this data!
226
+ ;; Can claim any token_id, any jetton_amount
227
+ }
228
+ ```
229
+
230
+ **What to Check**:
231
+ - [ ] `transfer_notification` handler validates sender address
232
+ - [ ] Sender must be expected Jetton wallet address
233
+ - [ ] Jetton wallet addresses stored during initialization
234
+ - [ ] Cannot trust forward_payload without sender validation
235
+ - [ ] User address in notification is NOT sufficient validation
236
+
237
+ **Mitigation**:
238
+ ```func
239
+ ;; SECURE: Store expected Jetton wallet address at initialization
240
+ global slice jetton_wallet_address;
241
+
242
+ () load_data() impure {
243
+ slice ds = get_data().begin_parse();
244
+ jetton_wallet_address = ds~load_msg_addr();
245
+ ;; Load other data
246
+ }
247
+
248
+ () save_data() impure {
249
+ set_data(begin_cell()
250
+ .store_slice(jetton_wallet_address)
251
+ ;; Store other data
252
+ .end_cell());
253
+ }
254
+
255
+ ;; Initialize with Jetton wallet address
256
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
257
+ load_data();
258
+
259
+ slice cs = in_msg_full.begin_parse();
260
+ int flags = cs~load_uint(4);
261
+ slice sender_address = cs~load_msg_addr();
262
+
263
+ int op = in_msg_body~load_uint(32);
264
+
265
+ if (op == op::transfer_notification) {
266
+ ;; CRITICAL: Validate sender is expected Jetton wallet
267
+ throw_unless(error::wrong_jetton_wallet,
268
+ equal_slices(sender_address, jetton_wallet_address));
269
+
270
+ ;; Now safe to trust the notification
271
+ int jetton_amount = in_msg_body~load_coins();
272
+ slice from_user = in_msg_body~load_msg_addr();
273
+ slice forward_payload = in_msg_body;
274
+
275
+ ;; Can safely credit user
276
+ credit_user(from_user, jetton_amount);
277
+
278
+ ;; Can safely parse forward_payload
279
+ if (~ forward_payload.slice_empty?()) {
280
+ int token_id = forward_payload~load_uint(32);
281
+ ;; Use token_id
282
+ }
283
+ }
284
+ }
285
+
286
+ ;; SECURE: Multiple Jetton support with dictionary
287
+ global cell jetton_wallets; ;; Dictionary: jetton_type -> wallet_address
288
+
289
+ () load_data() impure {
290
+ slice ds = get_data().begin_parse();
291
+ jetton_wallets = ds~load_dict();
292
+ }
293
+
294
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
295
+ load_data();
296
+
297
+ slice cs = in_msg_full.begin_parse();
298
+ int flags = cs~load_uint(4);
299
+ slice sender_address = cs~load_msg_addr();
300
+
301
+ int op = in_msg_body~load_uint(32);
302
+
303
+ if (op == op::transfer_notification) {
304
+ int jetton_amount = in_msg_body~load_coins();
305
+ slice from_user = in_msg_body~load_msg_addr();
306
+ slice forward_payload = in_msg_body;
307
+
308
+ ;; Parse jetton type from forward_payload
309
+ int jetton_type = forward_payload~load_uint(8);
310
+
311
+ ;; Look up expected wallet address for this jetton type
312
+ (slice expected_wallet, int found) = jetton_wallets.udict_get?(256, jetton_type);
313
+
314
+ ;; Validate sender matches expected wallet
315
+ throw_unless(error::unauthorized_jetton,
316
+ found & equal_slices(sender_address, expected_wallet));
317
+
318
+ ;; Safe to process
319
+ credit_user_jetton(from_user, jetton_type, jetton_amount);
320
+ }
321
+ }
322
+ ```
323
+
324
+ **Admin Function to Set Jetton Wallet**:
325
+ ```func
326
+ ;; Only owner can set/update Jetton wallet address
327
+ if (op == op::set_jetton_wallet) {
328
+ throw_unless(error::unauthorized, equal_slices(sender_address, owner_address));
329
+
330
+ slice new_jetton_wallet = in_msg_body~load_msg_addr();
331
+ jetton_wallet_address = new_jetton_wallet;
332
+
333
+ save_data();
334
+ return ();
335
+ }
336
+ ```
337
+
338
+ **Testing**:
339
+ ```typescript
340
+ // Test fake transfer notification is rejected
341
+ it("should reject fake transfer notification", async () => {
342
+ const attacker = await blockchain.treasury("attacker");
343
+
344
+ // Attacker sends fake transfer_notification directly
345
+ const result = await contract.sendInternalMessage(attacker.getSender(), {
346
+ op: OP_CODES.TRANSFER_NOTIFICATION,
347
+ jettonAmount: toNano("1000"),
348
+ fromUser: user.address,
349
+ });
350
+
351
+ expect(result.transactions).toHaveTransaction({
352
+ from: attacker.address,
353
+ to: contract.address,
354
+ success: false, // Should be rejected
355
+ exitCode: ERROR_CODES.WRONG_JETTON_WALLET,
356
+ });
357
+ });
358
+
359
+ // Test real Jetton wallet notification is accepted
360
+ it("should accept real jetton transfer", async () => {
361
+ // Send from actual Jetton wallet
362
+ const result = await contract.sendInternalMessage(jettonWallet.address, {
363
+ op: OP_CODES.TRANSFER_NOTIFICATION,
364
+ jettonAmount: toNano("100"),
365
+ fromUser: user.address,
366
+ });
367
+
368
+ expect(result.transactions).toHaveTransaction({
369
+ from: jettonWallet.address,
370
+ to: contract.address,
371
+ success: true,
372
+ });
373
+ });
374
+ ```
375
+
376
+ **References**: building-secure-contracts/not-so-smart-contracts/ton/fake_jetton_contract
377
+
378
+ ---
379
+
380
+ ### 4.3 FORWARD TON WITHOUT GAS CHECK ⚠️ HIGH
381
+
382
+ **Description**: Allowing users to specify `forward_ton_amount` in outgoing messages without validating sufficient gas can drain the contract's TON balance. User pays small gas but specifies large forward amount from contract balance.
383
+
384
+ **Detection Patterns**:
385
+ ```func
386
+ ;; VULNERABLE: User-specified forward_ton_amount without validation
387
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
388
+ int op = in_msg_body~load_uint(32);
389
+
390
+ if (op == op::transfer) {
391
+ slice to_address = in_msg_body~load_msg_addr();
392
+ int amount = in_msg_body~load_coins();
393
+ int forward_ton_amount = in_msg_body~load_coins(); ;; USER CONTROLLED!
394
+
395
+ ;; WRONG: No check that msg_value covers forward_ton_amount
396
+ ;; Contract pays from its own balance!
397
+
398
+ var msg = begin_cell()
399
+ .store_uint(0x18, 6)
400
+ .store_slice(to_address)
401
+ .store_coins(forward_ton_amount) ;; Drains contract balance!
402
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
403
+ .end_cell();
404
+
405
+ send_raw_message(msg, 1);
406
+ }
407
+ }
408
+
409
+ ;; VULNERABLE: No gas validation for operations
410
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
411
+ int op = in_msg_body~load_uint(32);
412
+
413
+ if (op == op::claim_reward) {
414
+ slice user = in_msg_body~load_msg_addr();
415
+ int forward_amount = in_msg_body~load_coins();
416
+
417
+ ;; Calculate reward
418
+ int reward = calculate_reward(user);
419
+
420
+ ;; WRONG: Sends user-specified forward_amount
421
+ ;; No validation that msg_value >= tx_fee + forward_amount
422
+ var msg = begin_cell()
423
+ .store_uint(0x18, 6)
424
+ .store_slice(user)
425
+ .store_coins(forward_amount + reward)
426
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
427
+ .end_cell();
428
+
429
+ send_raw_message(msg, 1); ;; Contract pays gas!
430
+ }
431
+ }
432
+ ```
433
+
434
+ **What to Check**:
435
+ - [ ] User cannot specify arbitrary forward TON amounts
436
+ - [ ] IF forward amount is user-specified: validate `msg_value >= tx_fee + forward_ton_amount`
437
+ - [ ] Prefer fixed/bounded forward amounts
438
+ - [ ] Contract balance protected from drainage
439
+ - [ ] Gas costs accounted for in all operations
440
+
441
+ **Mitigation**:
442
+ ```func
443
+ ;; SECURE: Fixed forward amounts (PREFERRED)
444
+ const int FORWARD_TON_AMOUNT = 50000000; ;; 0.05 TON (fixed)
445
+ const int TX_FEE = 10000000; ;; 0.01 TON estimated fee
446
+
447
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
448
+ int op = in_msg_body~load_uint(32);
449
+
450
+ if (op == op::transfer) {
451
+ slice to_address = in_msg_body~load_msg_addr();
452
+ int amount = in_msg_body~load_coins();
453
+
454
+ ;; Use fixed forward amount
455
+ ;; No user control, no drainage risk
456
+
457
+ var msg = begin_cell()
458
+ .store_uint(0x18, 6)
459
+ .store_slice(to_address)
460
+ .store_coins(FORWARD_TON_AMOUNT) ;; Fixed amount
461
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
462
+ ;; Store message body
463
+ .end_cell();
464
+
465
+ send_raw_message(msg, 1);
466
+ }
467
+ }
468
+
469
+ ;; SECURE: Validate msg_value covers all costs (if user-specified)
470
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
471
+ int op = in_msg_body~load_uint(32);
472
+
473
+ if (op == op::transfer_with_forward) {
474
+ slice to_address = in_msg_body~load_msg_addr();
475
+ int amount = in_msg_body~load_coins();
476
+ int forward_ton_amount = in_msg_body~load_coins();
477
+
478
+ ;; CRITICAL: Validate msg_value covers tx fee + forward amount
479
+ throw_unless(error::insufficient_gas,
480
+ msg_value >= TX_FEE + forward_ton_amount);
481
+
482
+ var msg = begin_cell()
483
+ .store_uint(0x18, 6)
484
+ .store_slice(to_address)
485
+ .store_coins(forward_ton_amount)
486
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
487
+ .end_cell();
488
+
489
+ ;; Safe: user provided sufficient gas
490
+ send_raw_message(msg, 1);
491
+ }
492
+ }
493
+
494
+ ;; SECURE: Bounded forward amounts
495
+ const int MAX_FORWARD_TON = 100000000; ;; 0.1 TON maximum
496
+
497
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
498
+ int op = in_msg_body~load_uint(32);
499
+
500
+ if (op == op::claim_with_notification) {
501
+ slice user = in_msg_body~load_msg_addr();
502
+ int forward_ton_amount = in_msg_body~load_coins();
503
+
504
+ ;; Enforce maximum forward amount
505
+ throw_unless(error::forward_amount_too_high,
506
+ forward_ton_amount <= MAX_FORWARD_TON);
507
+
508
+ ;; Validate msg_value covers costs
509
+ throw_unless(error::insufficient_gas,
510
+ msg_value >= TX_FEE + forward_ton_amount);
511
+
512
+ ;; Calculate reward from contract logic
513
+ int reward = calculate_reward(user);
514
+
515
+ var msg = begin_cell()
516
+ .store_uint(0x18, 6)
517
+ .store_slice(user)
518
+ .store_coins(reward) ;; Reward from contract
519
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
520
+ ;; Message body
521
+ .end_cell();
522
+
523
+ ;; Send with user's gas
524
+ send_raw_message(msg, 64); ;; Flag 64: use all remaining gas from incoming message
525
+ }
526
+ }
527
+
528
+ ;; SECURE: Don't allow user to specify forward amount at all
529
+ () recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
530
+ int op = in_msg_body~load_uint(32);
531
+
532
+ if (op == op::withdraw) {
533
+ slice user = in_msg_body~load_msg_addr();
534
+
535
+ ;; No forward_ton_amount parameter
536
+ ;; Use contract's calculated amount only
537
+
538
+ int withdrawal_amount = calculate_withdrawal(user);
539
+
540
+ var msg = begin_cell()
541
+ .store_uint(0x18, 6)
542
+ .store_slice(user)
543
+ .store_coins(withdrawal_amount) ;; Contract controlled
544
+ .store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
545
+ .end_cell();
546
+
547
+ send_raw_message(msg, 1);
548
+ }
549
+ }
550
+ ```
551
+
552
+ **Send Message Flags Reference**:
553
+ ```func
554
+ ;; send_raw_message flag values:
555
+ ;; 0 - Normal send, pay fees from message value
556
+ ;; 1 - Pay fees separately from contract balance
557
+ ;; 64 - Return remaining value from incoming message
558
+ ;; 128 - Carry all remaining balance
559
+
560
+ ;; Safe patterns:
561
+ send_raw_message(msg, 64); ;; Use incoming msg_value for fees
562
+ send_raw_message(msg, 0); ;; Fees from message value itself
563
+
564
+ ;; Dangerous with user input:
565
+ send_raw_message(msg, 1); ;; Fees from contract - validate msg_value!
566
+ send_raw_message(msg, 128); ;; Never use with user-controlled amounts!
567
+ ```
568
+
569
+ **Testing**:
570
+ ```typescript
571
+ // Test cannot drain contract with large forward amount
572
+ it("should reject large forward amount without sufficient gas", async () => {
573
+ const result = await contract.sendInternalMessage(user.getSender(), {
574
+ value: toNano("0.01"), // Only 0.01 TON provided
575
+ body: {
576
+ op: OP_CODES.TRANSFER,
577
+ toAddress: recipient.address,
578
+ amount: toNano("100"),
579
+ forwardTonAmount: toNano("10"), // Trying to forward 10 TON!
580
+ },
581
+ });
582
+
583
+ expect(result.transactions).toHaveTransaction({
584
+ success: false,
585
+ exitCode: ERROR_CODES.INSUFFICIENT_GAS,
586
+ });
587
+
588
+ // Contract balance should not decrease
589
+ expect(await contract.getBalance()).toEqual(initialBalance);
590
+ });
591
+ ```
592
+
593
+ **References**: building-secure-contracts/not-so-smart-contracts/ton/forward_value_without_check
594
+
595
+ ---
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "differential-review",
3
+ "version": "1.0.0",
4
+ "description": "Security-focused differential review of code changes with git history analysis and blast radius estimation",
5
+ "author": {
6
+ "name": "Omar Inuwa",
7
+ "email": "opensource@trailofbits.com",
8
+ "url": "https://github.com/trailofbits"
9
+ }
10
+ }
@@ -0,0 +1,109 @@
1
+ # Differential Review
2
+
3
+ Security-focused differential review of code changes with git history analysis and blast radius estimation.
4
+
5
+ **Author:** Omar Inuwa
6
+
7
+ ## When to Use
8
+
9
+ Use this skill when you need to:
10
+ - Review PRs, commits, or diffs for security vulnerabilities
11
+ - Detect security regressions (re-introduced vulnerabilities)
12
+ - Analyze the blast radius of code changes
13
+ - Check test coverage gaps for modified code
14
+
15
+ ## What It Does
16
+
17
+ This skill performs comprehensive security review of code changes:
18
+
19
+ - **Risk-First Analysis** - Prioritizes auth, crypto, value transfer, external calls
20
+ - **Git History Analysis** - Uses blame to understand why code existed and detect regressions
21
+ - **Blast Radius Calculation** - Quantifies impact by counting callers
22
+ - **Test Coverage Gaps** - Identifies untested changes
23
+ - **Adaptive Depth** - Scales analysis based on codebase size (small/medium/large)
24
+
25
+ ## Installation
26
+
27
+ ```
28
+ /plugin install trailofbits/skills/plugins/differential-review
29
+ ```
30
+
31
+ ## Documentation Structure
32
+
33
+ This skill uses a **modular documentation architecture** for token efficiency and progressive disclosure:
34
+
35
+ ### Core Entry Point
36
+ - **[SKILL.md](skills/differential-review/SKILL.md)** - Main entry point (217 lines)
37
+ - Quick reference tables for triage
38
+ - Decision tree routing to detailed docs
39
+ - Quality checklist and red flags
40
+ - Integration with other skills
41
+
42
+ ### Supporting Documentation
43
+ - **[methodology.md](skills/differential-review/methodology.md)** - Detailed phase-by-phase workflow (~200 lines)
44
+ - Pre-Analysis: Baseline context building
45
+ - Phase 0: Intake & Triage
46
+ - Phase 1: Changed Code Analysis
47
+ - Phase 2: Test Coverage Analysis
48
+ - Phase 3: Blast Radius Analysis
49
+ - Phase 4: Deep Context Analysis
50
+
51
+ - **[adversarial.md](skills/differential-review/adversarial.md)** - Attacker modeling and exploit scenarios (~150 lines)
52
+ - Phase 5: Adversarial Vulnerability Analysis
53
+ - Attacker model definition (WHO/ACCESS/INTERFACE)
54
+ - Exploitability rating framework
55
+ - Complete exploit scenario templates
56
+
57
+ - **[reporting.md](skills/differential-review/reporting.md)** - Report structure and formatting (~120 lines)
58
+ - Phase 6: Report Generation
59
+ - 9-section report template
60
+ - Formatting guidelines and conventions
61
+ - File naming and notification templates
62
+
63
+ - **[patterns.md](skills/differential-review/patterns.md)** - Common vulnerability patterns (~80 lines)
64
+ - Security regressions detection
65
+ - Reentrancy, access control, overflow patterns
66
+ - Quick detection bash commands
67
+
68
+ ### Benefits of This Structure
69
+ - **Token Efficient** - Load only the documentation you need
70
+ - **Progressive Disclosure** - Quick reference for triage, detailed docs for deep analysis
71
+ - **Maintainable** - Each concern separated into its own file
72
+ - **Navigable** - Decision tree routes you to the right document
73
+
74
+ ## Workflow
75
+
76
+ The complete workflow spans Pre-Analysis + Phases 0-6:
77
+
78
+ 1. **Pre-Analysis** - Build baseline context with `audit-context-building` skill (if available)
79
+ 2. **Phase 0: Intake** - Extract changes, assess size, risk-score files
80
+ 3. **Phase 1: Changed Code** - Analyze diffs, git blame, check for regressions
81
+ 4. **Phase 2: Test Coverage** - Identify coverage gaps
82
+ 5. **Phase 3: Blast Radius** - Calculate impact of changes
83
+ 6. **Phase 4: Deep Context** - Five Whys root cause analysis
84
+ 7. **Phase 5: Adversarial Analysis** - Hunt vulnerabilities with attacker model
85
+ 8. **Phase 6: Report** - Generate comprehensive markdown report
86
+
87
+ **Navigation:** Use the decision tree in SKILL.md to jump directly to the phase you need.
88
+
89
+ ## Output
90
+
91
+ Generates a markdown report with:
92
+ - Executive summary with severity distribution
93
+ - Critical findings with attack scenarios and PoCs
94
+ - Test coverage analysis
95
+ - Blast radius analysis
96
+ - Historical context and regression risks
97
+ - Actionable recommendations
98
+
99
+ ## Example Usage
100
+
101
+ ```
102
+ Review the security implications of this PR:
103
+ git diff main..feature/auth-changes
104
+ ```
105
+
106
+ ## Related Skills
107
+
108
+ - `context-building` - Used for baseline context analysis
109
+ - `issue-writer` - Transform findings into formal audit reports